Skip to content

Commit 97abffe

Browse files
authored
Merge pull request #131 from adaptlearning/develop
Develop
2 parents cf9f891 + f373d87 commit 97abffe

File tree

5 files changed

+128
-13
lines changed

5 files changed

+128
-13
lines changed

lib/Constants.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ var bower = require('bower'),
55
module.exports = {
66
ManifestFilename: 'adapt.json',
77
FrameworkFilename: 'package.json',
8-
DefaultProjectManifestPath : './'+this.ManifestFilename,
9-
DefaultProjectFrameworkPath: './'+this.FrameworkFilename,
8+
DefaultProjectManifestPath: './adapt.json',
9+
DefaultProjectFrameworkPath: './package.json',
1010
DefaultCreateType : 'course',
1111
DefaultTypeNames : {
1212
'course':'my-adapt-course',
1313
'component':'my-adapt-component'
1414
},
15+
DefaultUserAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36',
16+
DefaultGitHubOrg: 'adaptlearning',
1517
FrameworkRepository : process.env.ADAPT_FRAMEWORK || 'https://github.com/adaptlearning/adapt_framework',
1618
FrameworkRepositoryName : 'adapt_framework',
1719
ComponentRepository : process.env.ADAPT_COMPONENT || 'https://github.com/adaptlearning/adapt-component',

lib/commands/create.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var bower = require('bower'),
66
Constants = require('../Constants'),
77
Plugin = require('../Plugin'),
88
create = require('./create/index'),
9+
highest = require('../promise/highest'),
910
_ = require('lodash');
1011

1112
module.exports = {
@@ -14,12 +15,14 @@ module.exports = {
1415
localDir = arguments.length >= 4 ? arguments[2] : undefined,
1516
branch = arguments.length >= 5 ? arguments[3] : Constants.DefaultBranch,
1617
done = arguments[arguments.length-1];
17-
18-
confirm({
19-
type: type,
20-
localDir: localDir,
21-
branch: branch,
22-
renderer: renderer
18+
highest()
19+
.then(function (tag) {
20+
return confirm({
21+
type: type,
22+
localDir: localDir,
23+
branch: tag,
24+
renderer: renderer
25+
});
2326
})
2427
.then(function (properties) {
2528
var action = create[properties.type];

lib/promise/highest.js

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
var async = require('async');
2+
var Q = require('q');
3+
var request = require('request');
4+
var semver = require('semver');
5+
var Constants = require('../Constants');
6+
var _ = require('lodash');
7+
8+
module.exports = function () {
9+
var deferred = Q.defer();
10+
11+
checkLatestAdaptRepoVersion(function (error, latestFrameworkTag) {
12+
if (error) {
13+
deferred.reject(error);
14+
} else {
15+
deferred.resolve(latestFrameworkTag);
16+
}
17+
});
18+
19+
return deferred.promise;
20+
}
21+
22+
function checkLatestAdaptRepoVersion(versionLimit, callback) {
23+
if (typeof versionLimit === 'function') {
24+
callback = versionLimit;
25+
versionLimit = undefined;
26+
}
27+
// used in pagination
28+
var nextPage = `https://api.github.com/repos/${Constants.DefaultGitHubOrg}/${Constants.FrameworkRepositoryName}/releases`;
29+
30+
var _getReleases = function (done) {
31+
request({
32+
headers: {
33+
'User-Agent': Constants.DefaultUserAgent
34+
},
35+
uri: nextPage,
36+
method: 'GET'
37+
}, done);
38+
};
39+
var _requestHandler = function (error, response, body) {
40+
if (response) {
41+
// we've exceeded the API limit
42+
if (response.statusCode === 403 && response.headers['x-ratelimit-remaining'] === '0') {
43+
var reqsReset = new Date(response.headers['x-ratelimit-reset'] * 1000);
44+
error = `You have exceeded GitHub's request limit of ${response.headers['x-ratelimit-limit']} requests per hour. Please wait until at least ${reqsReset.toTimeString()} before trying again.`;
45+
}
46+
else if (response.statusCode !== 200) {
47+
error = 'GitubAPI did not respond with a 200 status code.';
48+
}
49+
}
50+
if (error) {
51+
return callback(new Error(`Couldn't check latest version of ${Constants.FrameworkRepositoryName}. ${error}`));
52+
}
53+
nextPage = parseLinkHeader(response.headers.link).next;
54+
try {
55+
// parse and sort releases (newest first)
56+
var releases = JSON.parse(body).sort((a, b) => {
57+
if (semver.lt(a.tag_name, b.tag_name)) return 1;
58+
if (semver.gt(a.tag_name, b.tag_name)) return -1;
59+
return 0;
60+
});
61+
} catch (e) {
62+
return callback(new Error(`Failed to parse GitHub release data\n${e}`));
63+
}
64+
var compatibleRelease;
65+
async.someSeries(releases, function (release, cb) {
66+
var isFullRelease = !release.draft && !release.prerelease;
67+
var satisfiesVersion = !versionLimit || semver.satisfies(release.tag_name, versionLimit);
68+
69+
if (!isFullRelease || !satisfiesVersion) {
70+
return cb(null, false);
71+
}
72+
73+
compatibleRelease = release;
74+
return cb(null, true);
75+
}, function (error, satisfied) {
76+
if (!satisfied) {
77+
if (nextPage) {
78+
return _getReleases(_requestHandler);
79+
}
80+
error = new Error(`Couldn't find any releases compatible with specified framework version (${versionLimit}), please check that it is a valid version.`);
81+
}
82+
if (error) {
83+
return callback(error);
84+
}
85+
callback(error, compatibleRelease.tag_name);
86+
});
87+
};
88+
// start recursion
89+
_getReleases(_requestHandler);
90+
}
91+
92+
// taken from https://gist.github.com/niallo/3109252
93+
function parseLinkHeader(header) {
94+
if (!header || header.length === 0) {
95+
return [];
96+
}
97+
var links = {};
98+
// Parse each part into a named link
99+
_.each(header.split(','), function (p) {
100+
var section = p.split(';');
101+
if (section.length !== 2) {
102+
throw new Error("section could not be split on ';'");
103+
}
104+
var url = section[0].replace(/<(.*)>/, '$1').trim();
105+
var name = section[1].replace(/rel="(.*)"/, '$1').trim();
106+
links[name] = url;
107+
});
108+
return links;
109+
}

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
{
22
"name": "adapt-cli",
3-
"version": "2.1.10",
3+
"version": "2.1.11",
44
"description": "Command line tools for Adapt",
55
"main": "./lib/cli.js",
66
"directories": {
77
"test": "test"
88
},
99
"dependencies": {
10+
"async": "^3.1.0",
1011
"bower": "^1.8.4",
1112
"bower-endpoint-parser": "^0.2.2",
1213
"chalk": "^2.4.1",

0 commit comments

Comments
 (0)