Skip to content

Commit

Permalink
Handle /release requests (#209)
Browse files Browse the repository at this point in the history
* move sorted project versions to project model

* add handling for current version param

* use 'release' instead of 'current' for displaying latest version

* make sure that links on /release also link to /release

* add suport for LTS version

* make version sorting work for ember data as well

* add acceptance test for /lts and /release

* add ember-router-service

* add short circuit to env variable to lts version
  • Loading branch information
MartinMalinda authored and toddjordan committed May 20, 2017
1 parent 5a26538 commit ffd2eb5
Show file tree
Hide file tree
Showing 15 changed files with 162 additions and 46 deletions.
18 changes: 2 additions & 16 deletions app/controllers/project-version.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import Ember from 'ember';
import _ from 'lodash';
import semverCompare from 'npm:semver-compare';
import getMinorVersion from "../utils/get-minor-version";
import FilterParams from '../mixins/filter-params';

const { Controller, computed, A, inject: {service} } = Ember;
Expand Down Expand Up @@ -53,6 +50,8 @@ export default Controller.extend(FilterParams, {
return A(sorted).toArray().map(id => id.split('-').pop());
},

projectVersions: computed.alias('model.project.sortedProjectVersions'),

shownClassesIDs: computed('showPrivateClasses', 'classesIDs', 'publicClassesIDs', function() {
return this.get('showPrivateClasses') ? this.get('classesIDs') : this.get('publicClassesIDs');
}),
Expand All @@ -65,19 +64,6 @@ export default Controller.extend(FilterParams, {
return this.get('showPrivateClasses') ? this.get('namespaceIDs') : this.get('publicNamespaceIDs');
}),

projectVersions: computed('metaStore.availableProjectVersions', 'model.project.id', function() {
const projectVersions = this.get('metaStore.availableProjectVersions')[this.get('model.project.id')];
let versions = projectVersions.sort((a, b) => semverCompare(b, a));

versions = versions.map((version) => {
const minorVersion = getMinorVersion(version);
return { id: version, minorVersion };
});
let groupedVersions = _.groupBy(versions, version => version.minorVersion);

return _.values(groupedVersions).map(groupedVersion => groupedVersion[0]);
}),

selectedProjectVersion:computed('projectVersions.[]', 'model.version', function() {
return this.get('projectVersions').filter(pV => pV.id === this.get('model.version'))[0];
}),
Expand Down
1 change: 0 additions & 1 deletion app/controllers/project-version/class.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const { Controller } = Ember;

export default Controller.extend(ParentNameMixin, {
filterData: Ember.inject.service(),

actions: {
updateFilter(filter) {
this.toggleProperty(`filterData.${filter}`);
Expand Down
12 changes: 12 additions & 0 deletions app/helpers/url-param.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import Ember from 'ember';

const { inject } = Ember;

export default Ember.Helper.extend({

router: inject.service(),

compute([modelName, paramName]) {
return this.get(`router.router.state.params.${modelName}.${paramName}`);
}
});
36 changes: 35 additions & 1 deletion app/models/project.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,43 @@
import DS from 'ember-data';
import Ember from 'ember';
import semverCompare from 'npm:semver-compare';
import getMinorVersion from "../utils/get-minor-version";
import _ from 'lodash';
import config from 'ember-api-docs/config/environment';


const {Model, attr, hasMany} = DS;
const {computed,A} = Ember;

export default Model.extend({
name: attr(),
githubUrl: attr(),
projectVersions: hasMany('project-version', {async: true})
projectVersions: hasMany('project-version', {async: true}),

latestProjectVersion: computed.alias('sortedProjectVersions.firstObject'),
sortedProjectVersions: computed(function() {
let projectVersions = this.hasMany('projectVersions').ids().map(id => {
return id.replace(this.id, '').split('-')[1];
});
let sortedVersions = projectVersions.sort((a, b) => semverCompare(b, a));
sortedVersions = sortedVersions.map((version) => {
const minorVersion = getMinorVersion(version);
return { id: version, minorVersion };
});

let groupedVersions = _.groupBy(sortedVersions, version => version.minorVersion);

return A(_.values(groupedVersions).map(groupedVersion => groupedVersion[0]));
}),

getProjectVersion(version) {
if (version === 'release') {
return this.get('latestProjectVersion.id');
}
if (version === 'lts') {
return config.ltsVersion;
}
return version;
}

});
8 changes: 5 additions & 3 deletions app/routes/project-version.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ export default Ember.Route.extend({
},

model(params) {
const id = `${params.project}-${params.project_version}`;
this.get('projectService').setVersion(params.project_version);
return this.store.findRecord('project', params.project).then(() => {

return this.store.findRecord('project', params.project).then(project => {
this.get('projectService').setVersion(params.project_version);
const version = project.getProjectVersion(params.project_version);
const id = `${params.project}-${version}`;
return this.store.findRecord('project-version', id, { includes: 'project' });
});
},
Expand Down
3 changes: 2 additions & 1 deletion app/routes/project-version/class.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ export default Ember.Route.extend({
},

getModel(typeName, params, transition) {
const projectModel = this.modelFor('project-version').get('project.content');
const projectID = transition.params['project-version'].project;
const version = transition.params['project-version'].project_version;
const version = projectModel.getProjectVersion(transition.params['project-version'].project_version);
const klass = params[typeName];
return this.find(typeName, `${projectID}-${version}-${klass}`);
},
Expand Down
3 changes: 2 additions & 1 deletion app/routes/project-version/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ export default ClassRoute.extend({
},

getModel(typeName, params, transition) {
const projectModel = this.modelFor('project-version').get('project.content');
const projectID = transition.params['project-version'].project;
const version = transition.params['project-version'].project_version;
const version = projectModel.getProjectVersion(transition.params['project-version'].project_version);
let klass = params[typeName];
if (!~klass.indexOf(projectID)) {
klass = `${projectID}-${klass}`;
Expand Down
3 changes: 2 additions & 1 deletion app/templates/class-index.hbs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

{{#api-index-filter model=model filterData=filterData as |filteredModel|}}
{{#api-index itemData=filteredModel classNames="api__index__content" as |sectionData|}}
{{#each sectionData.sections as |section|}}
Expand All @@ -8,7 +9,7 @@
<li>
{{#link-to (concat parentName section.routeSuffix)
model.project.id
model.projectVersion.version
(url-param "project-version" "project_version")
model.name
item.name
(query-params anchor=item.name)}}
Expand Down
6 changes: 3 additions & 3 deletions app/templates/components/table-of-contents.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@
<a {{action 'toggle' 'modules'}} href="#">Modules</a>
<ol class="toc-level-1 modules" style="display: block">
{{#each moduleIDs as |moduleID|}}
<li class="toc-level-1">{{#link-to 'project-version.module' version moduleID}}{{moduleID}}{{/link-to}}</li>
<li class="toc-level-1">{{#link-to 'project-version.module' (url-param "project-version" "project_version") moduleID}}{{moduleID}}{{/link-to}}</li>
{{/each}}
</ol>
</li>
<li class="toc-level-0">
<a {{action 'toggle' 'namespaces'}} href="#">Namespaces</a>
<ol class="toc-level-1 namespaces" style="display: block">
{{#each namespaceIDs as |namespaceID|}}
<li class="toc-level-1">{{#link-to 'project-version.namespace' version namespaceID}}{{namespaceID}}{{/link-to}}</li>
<li class="toc-level-1">{{#link-to 'project-version.namespace' (url-param "project-version" "project_version") namespaceID}}{{namespaceID}}{{/link-to}}</li>
{{/each}}
</ol>
</li>
<li class="toc-level-0">
<a {{action 'toggle' 'classes'}} href="#">Classes</a>
<ol class="toc-level-1 classes" style="display: block">
{{#each classesIDs as |classID|}}
<li class="toc-level-1">{{#link-to 'project-version.class' version classID}}{{classID}}{{/link-to}}</li>
<li class="toc-level-1">{{#link-to 'project-version.class' (url-param "project-version" "project_version") classID}}{{classID}}{{/link-to}}</li>
{{/each}}
</ol>
</li>
Expand Down
16 changes: 8 additions & 8 deletions app/templates/project-version/class.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
{{#if model.extends}}
<div class="attribute">
<span class="attribute-label">Extends:</span>
<span class="attribute-value">{{#link-to 'project-version.class' model.projectVersion.version model.extends}}{{model.extends}}{{/link-to}}</span>
<span class="attribute-value">{{#link-to 'project-version.class' (url-param "project-version" "project_version") model.extends}}{{model.extends}}{{/link-to}}</span>
</div>
{{/if}}
{{#if model.uses}}
Expand All @@ -17,7 +17,7 @@
<span class="attribute-value">
{{#each model.uses as |parentClass idx|}}
{{#unless (eq idx 0)}}<span class="comma">,</span>{{/unless}}
{{#link-to 'project-version.class' model.projectVersion.version parentClass}}{{parentClass}}{{/link-to}}
{{#link-to 'project-version.class' (url-param "project-version" "project_version") parentClass}}{{parentClass}}{{/link-to}}
{{/each}}
</span>
</div>
Expand All @@ -26,14 +26,14 @@
<div class="attribute">
<span class="attribute-label">Defined in:</span>
<span class="attribute-value">
<a href="{{github-link model.project.id model.projectVersion.version model.file model.line}}" target="_blank" rel="noopener">{{model.file}}:{{model.line}}</a>
<a href="{{github-link model.project.id (url-param "project-version" "project_version") model.file model.line}}" target="_blank" rel="noopener">{{model.file}}:{{model.line}}</a>
</span>
</div>
{{/if}}
{{#if model.module}}
<div class="attribute">
<span class="attribute-label">Module:</span>
<span class="attribute-value">{{#link-to 'project-version.module' model.projectVersion.version model.module}}{{model.module}}{{/link-to}}</span>
<span class="attribute-value">{{#link-to 'project-version.module' (url-param "project-version" "project_version") model.module}}{{model.module}}{{/link-to}}</span>
</div>
{{/if}}
</div>
Expand All @@ -45,7 +45,7 @@
<ul class="tabbed-layout__menu">
{{#link-to (concat parentName ".index")
model.project.id
model.projectVersion.version
(url-param "project-version" "project_version")
model.name
(query-params anchor="")
tagName="li"
Expand All @@ -58,7 +58,7 @@
{{#if model.methods}}
{{#link-to (concat parentName ".methods")
model.project.id
model.projectVersion.version
(url-param "project-version" "project_version")
model.name
(query-params anchor="")
tagName="li"
Expand All @@ -72,7 +72,7 @@
{{#if model.properties}}
{{#link-to (concat parentName ".properties")
model.project.id
model.projectVersion.version
(url-param "project-version" "project_version")
model.name
(query-params anchor="")
tagName="li"
Expand All @@ -86,7 +86,7 @@
{{#if model.events}}
{{#link-to (concat parentName ".events")
model.project.id
model.projectVersion.version
(url-param "project-version" "project_version")
model.name
(query-params anchor="")
tagName="li"
Expand Down
2 changes: 1 addition & 1 deletion app/templates/project-version/module.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
{{#if model.parent}}
<div class="attribute">
<span class="attribute-label">Parent:</span>
<span class="attribute-value">{{#link-to 'project-version.module' model.projectVersion.version model.parent}}{{model.parent}}{{/link-to}}</span>
<span class="attribute-value">{{#link-to 'project-version.module' (url-param "project-version" "project_version") model.parent}}{{model.parent}}{{/link-to}}</span>
</div>
{{/if}}
</p>
Expand Down
1 change: 1 addition & 0 deletions config/environment.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

module.exports = function(environment) {
var ENV = {
ltsVersion: process.env.LTS_VERSION || '2.8.3',
modulePrefix: 'ember-api-docs',
environment: environment,
rootURL: '/',
Expand Down
9 changes: 5 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,6 @@
"ember-cli-qunit": "^3.1.2",
"ember-cli-release": "^1.0.0-beta.2",
"ember-cli-sass": "^6.1.2",
"ember-service-worker": "0.6.2",
"ember-service-worker-asset-cache": "0.6.0",
"ember-service-worker-cache-fallback": "0.6.0",
"ember-service-worker-index": "0.6.1",
"ember-cli-shims": "^1.0.2",
"ember-cli-template-lint": "^0.5.2",
"ember-cli-test-loader": "^1.1.1",
Expand All @@ -78,6 +74,11 @@
"ember-power-select": "^1.6.1",
"ember-resolver": "^3.0.0",
"ember-route-action-helper": "^2.0.2",
"ember-router-service": "^1.0.2",
"ember-service-worker": "0.6.2",
"ember-service-worker-asset-cache": "0.6.0",
"ember-service-worker-cache-fallback": "0.6.0",
"ember-service-worker-index": "0.6.1",
"ember-source": "~2.12.0",
"ember-tether": "0.4.1",
"ember-truth-helpers": "^1.3.0",
Expand Down
78 changes: 78 additions & 0 deletions tests/acceptance/release-lts-project-versions-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { test } from 'qunit';
import moduleForAcceptance from 'ember-api-docs/tests/helpers/module-for-acceptance';
import { click } from 'ember-native-dom-helpers';
import Ember from 'ember';

const {$} = Ember;

moduleForAcceptance('Acceptance | release lts project versions');

test('release url param', function(assert) {
visit('/ember/release/namespaces/Ember');

let checkLinks = (label, selector, versionString) => {
return $('.attributes a').toArray().forEach(el => {
let href = el.attributes.href.value;
if (href[0] === '/') {

assert.ok(href.indexOf(versionString) > -1, `${label} link contains ${versionString} - ${href}`);
}
});
};

let checkSidebarLinks = versionString => {
return checkLinks('side',
'.toc-level-1.modules li:first-child a, .toc-level-1.namespaces li:first-child a, .toc-level-1.classes li:first-child a',
versionString);
};

let checkAttributeLinks = versionString => {
return checkLinks('attributes', '.attributes a', versionString);
};

let checkIndexListLinks = versionString => {
return checkLinks('index-list', '.api-index-filter a', versionString);
};

let checkActiveClass = versionString => {
return assert.ok($('.tabbed-layout__menu li:first-child').hasClass('tabbed-layout__menu__item_selected'), `active class works with ${versionString}`)
};

andThen(function() {
assert.equal(currentURL(), '/ember/release/namespaces/Ember');

checkSidebarLinks('release');
checkActiveClass('release');
checkIndexListLinks('release');
checkAttributeLinks('release');

return click('.tabbed-layout__menu__item:nth-child(2)'); //clicking methods
});

andThen(() => {
assert.equal(currentURL(), '/ember/release/namespaces/Ember/methods?anchor=');
return visit('/ember-data/release/namespaces/DS');
});

andThen(() => {
assert.equal(currentURL(), '/ember-data/release/namespaces/DS');

checkSidebarLinks('release');
checkActiveClass('release');
checkIndexListLinks('release');
checkAttributeLinks('release');

return visit('/ember/lts/namespaces/Ember');
});

return andThen(() => {
assert.equal(currentURL(), '/ember/lts/namespaces/Ember');

checkSidebarLinks('lts');
checkActiveClass('lts');
checkIndexListLinks('lts');
checkAttributeLinks('lts');

return this;
});
});
Loading

0 comments on commit ffd2eb5

Please sign in to comment.