You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2013/06/20 20:35:28 UTC
git commit: 2.8.25. Fixes [CB-3846]: make sure to lazy load libraries
whenever prepare is called,
as well as platform. Added a helper lazy_load.based_on_config method that
looks into .cordova/config.json and lazy loads appropriate stock or custom
librari
Updated Branches:
refs/heads/master2 09333582a -> 262a2f9c9
2.8.25. Fixes [CB-3846]: make sure to lazy load libraries whenever prepare is called, as well as platform. Added a helper lazy_load.based_on_config method that looks into .cordova/config.json and lazy loads appropriate stock or custom libraries.
Project: http://git-wip-us.apache.org/repos/asf/cordova-cli/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-cli/commit/262a2f9c
Tree: http://git-wip-us.apache.org/repos/asf/cordova-cli/tree/262a2f9c
Diff: http://git-wip-us.apache.org/repos/asf/cordova-cli/diff/262a2f9c
Branch: refs/heads/master2
Commit: 262a2f9c91e2baf3cc59fb1d26ad235d3cf4fa8c
Parents: 0933358
Author: Fil Maj <ma...@gmail.com>
Authored: Thu Jun 20 11:35:08 2013 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Thu Jun 20 11:35:08 2013 -0700
----------------------------------------------------------------------
package.json | 2 +-
spec/lazy_load.spec.js | 141 ++++++++++++++++++++++++++++++++++++++++++++
spec/platform.spec.js | 9 +--
spec/prepare.spec.js | 10 +++-
src/lazy_load.js | 15 ++++-
src/platform.js | 27 +++------
src/prepare.js | 51 +++++++++-------
7 files changed, 207 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/262a2f9c/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 40c3a89..6dbea91 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "cordova",
- "version": "2.8.24",
+ "version": "2.8.25",
"preferGlobal": "true",
"description": "Cordova command line interface tool",
"main": "cordova",
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/262a2f9c/spec/lazy_load.spec.js
----------------------------------------------------------------------
diff --git a/spec/lazy_load.spec.js b/spec/lazy_load.spec.js
new file mode 100644
index 0000000..95bab3f
--- /dev/null
+++ b/spec/lazy_load.spec.js
@@ -0,0 +1,141 @@
+var lazy_load = require('../src/lazy_load'),
+ config = require('../src/config'),
+ util = require('../src/util'),
+ shell = require('shelljs'),
+ path = require('path'),
+ hooker = require('../src/hooker'),
+ https = require('follow-redirects').https,
+ fs = require('fs'),
+ platforms = require('../platforms');
+
+describe('lazy_load module', function() {
+ var custom_path;
+ beforeEach(function() {
+ custom_path = spyOn(config, 'has_custom_path').andReturn(false);
+ });
+ describe('cordova method (loads stock cordova libs)', function() {
+ var custom;
+ beforeEach(function() {
+ custom = spyOn(lazy_load, 'custom');
+ });
+ it('should throw if platform is not a stock cordova platform', function() {
+ expect(function() {
+ lazy_load.cordova('atari');
+ }).toThrow('Cordova library "atari" not recognized.');
+ });
+ it('should invoke lazy_load.custom with appropriate url, platform, and version as specified in platforms manifest', function() {
+ lazy_load.cordova('android');
+ expect(custom).toHaveBeenCalledWith(platforms.android.url + ';a=snapshot;h=' + platforms.android.version + ';sf=tgz', 'cordova', 'android', platforms.android.version, jasmine.any(Function));
+ });
+ });
+
+ describe('custom method (loads custom cordova libs)', function() {
+ var mkdir, exists, fire, rm, sym;
+ beforeEach(function() {
+ mkdir = spyOn(shell, 'mkdir');
+ rm = spyOn(shell, 'rm');
+ sym = spyOn(fs, 'symlinkSync');
+ exists = spyOn(fs, 'existsSync').andReturn(false);
+ fire = spyOn(hooker, 'fire').andCallFake(function(evt, data, cb) {
+ cb();
+ });
+ });
+
+ it('should callback with no errors and not fire event hooks if library already exists', function(done) {
+ exists.andReturn(true);
+ lazy_load.custom('some url', 'some id', 'platform X', 'three point five', function(err) {
+ expect(err).not.toBeDefined();
+ expect(fire).not.toHaveBeenCalled()
+ done();
+ });
+ });
+ it('should fire a before_library_download event before it starts downloading a library', function() {
+ lazy_load.custom('some url', 'some id', 'platform X', 'three point five');
+ expect(fire).toHaveBeenCalledWith('before_library_download', {platform:'platform X', url:'some url', id:'some id', version:'three point five'}, jasmine.any(Function));
+ });
+
+ describe('remove URLs for libraries', function() {
+ var req, write_stream, http_on;
+ beforeEach(function() {
+ write_spy = jasmine.createSpy('write stream write');
+ write_stream = spyOn(fs, 'createWriteStream').andReturn({
+ write:write_spy
+ });
+ http_on = jasmine.createSpy('https result on');
+ // TODO: jasmien does not support chaning both andCallFake + andReturn...
+ req = spyOn(https, 'request').andCallFake(function(opts, cb) {
+ cb({
+ on:http_on
+ });
+ }).andReturn({
+ on:function(){},
+ end:function(){}
+ });
+ });
+
+ it('should call into https request with appopriate url params', function() {
+ lazy_load.custom('https://github.com/apache/someplugin', 'random', 'android', '1.0');
+ expect(req).toHaveBeenCalledWith({
+ hostname:'github.com',
+ path:'/apache/someplugin'
+ }, jasmine.any(Function));
+ });
+ // TODO: jasmine does not support chaning andCallFake andReturn. Cannot test the below.
+ xit('should fire download events as the https request receives data events, and write to a file stream', function() {
+ http_on.andCallFake(function(evt, cb) {
+ console.log(evt);
+ if (evt == 'data') {
+ cb('chunk');
+ }
+ });
+ lazy_load.custom('https://github.com/apache/someplugin', 'random', 'android', '1.0');
+ expect(fire).toHaveBeenCalledWith('library_download', {
+ platform:'android',
+ url:'https://github.com/apache/someplugin',
+ id:'random',
+ version:'1.0',
+ chunk:'chunk'
+ });
+ expect(write_spy).toHaveBeenCalledWith('chunk', 'binary');
+ });
+ });
+
+ describe('local paths for libraries', function() {
+ it('should symlink to local path', function() {
+ lazy_load.custom('/some/random/lib', 'id', 'X', 'three point five')
+ expect(sym).toHaveBeenCalledWith('/some/random/lib', path.join(util.libDirectory, 'X', 'id', 'three point five'), 'dir');
+ });
+ it('should fire after hook once done', function() {
+ lazy_load.custom('/some/random/lib', 'id', 'X', 'three point five')
+ expect(fire).toHaveBeenCalledWith('after_library_download', {platform:'X',url:'/some/random/lib',id:'id',version:'three point five',path:path.join(util.libDirectory, 'X', 'id', 'three point five')}, jasmine.any(Function));
+ });
+ });
+ });
+
+ describe('based_on_config method', function() {
+ var cordova, custom;
+ beforeEach(function() {
+ cordova = spyOn(lazy_load, 'cordova');
+ custom = spyOn(lazy_load, 'custom');
+ });
+ it('should invoke custom if a custom lib is specified', function() {
+ var read = spyOn(config, 'read').andReturn({
+ lib:{
+ maybe:{
+ uri:'you or eye?',
+ id:'eye dee',
+ version:'four point twenty'
+ }
+ }
+ });
+ var p = '/some/random/custom/path';
+ custom_path.andReturn(p);
+ lazy_load.based_on_config('yup', 'maybe');
+ expect(custom).toHaveBeenCalledWith('you or eye?', 'eye dee', 'maybe', 'four point twenty', undefined);
+ });
+ it('should invoke cordova if no custom lib is specified', function() {
+ lazy_load.based_on_config('yup', 'ios');
+ expect(cordova).toHaveBeenCalledWith('ios', undefined);
+ });
+ });
+});
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/262a2f9c/spec/platform.spec.js
----------------------------------------------------------------------
diff --git a/spec/platform.spec.js b/spec/platform.spec.js
index a74e2fb..48bec1b 100644
--- a/spec/platform.spec.js
+++ b/spec/platform.spec.js
@@ -33,7 +33,7 @@ var supported_platforms = Object.keys(platforms).filter(function(p) { return p !
var project_dir = '/some/path';
describe('platform command', function() {
- var is_cordova, list_platforms, fire, config_parser, find_plugins, config_read, load_custom, load_cordova, rm, mkdir, existsSync, supports, pkg, name, exec, prep_spy, plugman_install, parsers = {};
+ var is_cordova, list_platforms, fire, config_parser, find_plugins, config_read, load, load_custom, rm, mkdir, existsSync, supports, pkg, name, exec, prep_spy, plugman_install, parsers = {};
beforeEach(function() {
supported_platforms.forEach(function(p) {
parsers[p] = spyOn(platforms[p], 'parser').andReturn({
@@ -54,10 +54,10 @@ describe('platform command', function() {
find_plugins = spyOn(util, 'findPlugins').andReturn([]);
list_platforms = spyOn(util, 'listPlatforms').andReturn(supported_platforms);
config_read = spyOn(config, 'read').andReturn({});
- load_custom = spyOn(lazy_load, 'custom').andCallFake(function(uri, id, platform, version, cb) {
+ load = spyOn(lazy_load, 'based_on_config').andCallFake(function(root, platform, cb) {
cb();
});
- load_cordova = spyOn(lazy_load, 'cordova').andCallFake(function(platform, cb) {
+ load_custom = spyOn(lazy_load, 'custom').andCallFake(function(url, id, p, v, cb) {
cb();
});
rm = spyOn(shell, 'rm');
@@ -131,7 +131,8 @@ describe('platform command', function() {
expect(exec.mostRecentCall.args[0]).toMatch(/lib.wp8.cordova.2.8.0.bin.create/gi);
expect(exec.mostRecentCall.args[0]).toContain(project_dir);
});
- it('should support using custom versions of libraries by calling into lazy_load.custom', function() {
+ it('should call into lazy_load.custom if there is a user-specified configruation for consuming custom libraries', function() {
+ load.andCallThrough();
config_read.andReturn({
lib:{
'wp7':{
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/262a2f9c/spec/prepare.spec.js
----------------------------------------------------------------------
diff --git a/spec/prepare.spec.js b/spec/prepare.spec.js
index 2f3921c..fba7cb6 100644
--- a/spec/prepare.spec.js
+++ b/spec/prepare.spec.js
@@ -22,6 +22,7 @@ var cordova = require('../cordova'),
path = require('path'),
fs = require('fs'),
util = require('../src/util'),
+ lazy_load = require('../src/lazy_load'),
platforms = require('../platforms'),
hooker = require('../src/hooker'),
fixtures = path.join(__dirname, 'fixtures'),
@@ -32,7 +33,7 @@ var supported_platforms = Object.keys(platforms).filter(function(p) { return p !
var supported_platforms_paths = supported_platforms.map(function(p) { return path.join(project_dir, 'platforms', p, 'www'); });
describe('prepare command', function() {
- var is_cordova, list_platforms, fire, config_parser, parsers = {}, plugman_prepare, find_plugins, plugman_get_json;
+ var is_cordova, list_platforms, fire, config_parser, parsers = {}, plugman_prepare, find_plugins, plugman_get_json, load;
beforeEach(function() {
is_cordova = spyOn(util, 'isCordova').andReturn(project_dir);
list_platforms = spyOn(util, 'listPlatforms').andReturn(supported_platforms);
@@ -52,6 +53,7 @@ describe('prepare command', function() {
plugman_prepare = spyOn(plugman, 'prepare');
find_plugins = spyOn(util, 'findPlugins').andReturn([]);
plugman_get_json = spyOn(plugman.config_changes, 'get_platform_json').andReturn({});
+ load = spyOn(lazy_load, 'based_on_config').andCallFake(function(root, platform, cb) { cb(); });
});
describe('failure', function() {
@@ -85,6 +87,12 @@ describe('prepare command', function() {
expect(parsers[p]).toHaveBeenCalled();
});
});
+ it('should invoke lazy_load for each platform to make sure platform libraries are loaded', function() {
+ cordova.prepare();
+ supported_platforms.forEach(function(p) {
+ expect(load).toHaveBeenCalledWith(project_dir, p, jasmine.any(Function));
+ });
+ });
describe('plugman integration', function() {
it('should invoke plugman.prepare after update_project', function() {
cordova.prepare();
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/262a2f9c/src/lazy_load.js
----------------------------------------------------------------------
diff --git a/src/lazy_load.js b/src/lazy_load.js
index 6ffcb29..d49cef0 100644
--- a/src/lazy_load.js
+++ b/src/lazy_load.js
@@ -21,6 +21,7 @@ var path = require('path'),
shell = require('shelljs'),
platforms = require('../platforms'),
events = require('./events'),
+ config = require('./config'),
hooker = require('./hooker'),
https = require('follow-redirects').https,
zlib = require('zlib'),
@@ -51,9 +52,8 @@ module.exports = {
shell.mkdir('-p', id_dir);
var download_dir = path.join(id_dir, version);
if (fs.existsSync(download_dir)) {
- events.emit('log', 'Platform library for "' + platform + '" already exists. No need to download. Continuing.');
- if (callback) callback();
- return;
+ events.emit('log', id + ' library for "' + platform + '" already exists. No need to download. Continuing.');
+ if (callback) return callback();
}
hooker.fire('before_library_download', {
platform:platform,
@@ -151,5 +151,14 @@ module.exports = {
});
}
});
+ },
+ based_on_config:function(project_root, platform, callback) {
+ var custom_path = config.has_custom_path(project_root, platform);
+ if (custom_path) {
+ var dot_file = config.read(project_root);
+ module.exports.custom(dot_file.lib[platform].uri, dot_file.lib[platform].id, platform, dot_file.lib[platform].version, callback);
+ } else {
+ module.exports.cordova(platform, callback);
+ }
}
};
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/262a2f9c/src/platform.js
----------------------------------------------------------------------
diff --git a/src/platform.js b/src/platform.js
index 7694b13..2057a77 100644
--- a/src/platform.js
+++ b/src/platform.js
@@ -96,34 +96,25 @@ module.exports = function platform(command, targets, callback) {
}
});
});
- var config_json = config.read(projectRoot);
hooks.fire('before_platform_add', opts, function(err) {
if (err) {
if (callback) callback(err);
else throw err;
} else {
+ var config_json = config.read(projectRoot);
targets.forEach(function(t) {
- if (config_json.lib && config_json.lib[t]) {
- events.emit('log', 'Using custom cordova platform library for "' + t + '".');
- lazy_load.custom(config_json.lib[t].uri, config_json.lib[t].id, t, config_json.lib[t].version, function(err) {
- if (err) {
- if (callback) callback(err);
- else throw err;
- } else {
+ lazy_load.based_on_config(projectRoot, t, function(err) {
+ if (err) {
+ if (callback) callback(err);
+ else throw err;
+ } else {
+ if (config_json.lib && config_json.lib[t]) {
call_into_create(t, projectRoot, cfg, config_json.lib[t].id, config_json.lib[t].version, callback, end);
- }
- });
- } else {
- events.emit('log', 'Using stock cordova platform library for "' + t + '".');
- lazy_load.cordova(t, function(err) {
- if (err) {
- if (callback) callback(err);
- else throw err;
} else {
call_into_create(t, projectRoot, cfg, 'cordova', platforms[t].version, callback, end);
}
- });
- }
+ }
+ });
});
}
});
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/262a2f9c/src/prepare.js
----------------------------------------------------------------------
diff --git a/src/prepare.js b/src/prepare.js
index f7c9d11..fd134a9 100644
--- a/src/prepare.js
+++ b/src/prepare.js
@@ -24,6 +24,8 @@ var cordova_util = require('./util'),
shell = require('shelljs'),
et = require('elementtree'),
hooker = require('./hooker'),
+ lazy_load = require('./lazy_load'),
+ config = require('./config'),
events = require('./events'),
n = require('ncallbacks'),
prompt = require('prompt'),
@@ -86,27 +88,34 @@ module.exports = function prepare(platformList, callback) {
// Iterate over each added platform
platformList.forEach(function(platform) {
- var platformPath = path.join(projectRoot, 'platforms', platform);
- var parser = new platforms[platform].parser(platformPath);
- parser.update_project(cfg, function() {
- // Call plugman --prepare for this platform. sets up js-modules appropriately.
- var plugins_dir = path.join(projectRoot, 'plugins');
- events.emit('log', 'Calling plugman.prepare for platform "' + platform + '"');
- plugman.prepare(platformPath, (platform=='blackberry'?'blackberry10':platform), plugins_dir);
- // Make sure that config changes for each existing plugin is in place
- var plugins = cordova_util.findPlugins(plugins_dir);
- var platform_json = plugman.config_changes.get_platform_json(plugins_dir, (platform=='blackberry'?'blackberry10':platform));
- plugins && plugins.forEach(function(plugin_id) {
- if (platform_json.installed_plugins[plugin_id]) {
- events.emit('log', 'Ensuring plugin "' + plugin_id + '" is installed correctly...');
- plugman.config_changes.add_plugin_changes((platform=='blackberry'?'blackberry10':platform), platformPath, plugins_dir, plugin_id, /* variables for plugin */ platform_json.installed_plugins[plugin_id], /* top level plugin? */ true, /* should increment config munge? cordova-cli never should, only plugman */ false);
- } else if (platform_json.dependent_plugins[plugin_id]) {
- events.emit('log', 'Ensuring plugin "' + plugin_id + '" is installed correctly...');
- plugman.config_changes.add_plugin_changes((platform=='blackberry'?'blackberry10':platform), platformPath, plugins_dir, plugin_id, /* variables for plugin */ platform_json.dependent_plugins[plugin_id], /* top level plugin? */ false, /* should increment config munge? cordova-cli never should, only plugman */ false);
- }
- events.emit('log', 'Plugin "' + plugin_id + '" is good to go.');
- });
- end();
+ lazy_load.based_on_config(projectRoot, platform, function(err) {
+ if (err) {
+ if (callback) callback(err);
+ else throw err;
+ } else {
+ var platformPath = path.join(projectRoot, 'platforms', platform);
+ var parser = new platforms[platform].parser(platformPath);
+ parser.update_project(cfg, function() {
+ // Call plugman --prepare for this platform. sets up js-modules appropriately.
+ var plugins_dir = path.join(projectRoot, 'plugins');
+ events.emit('log', 'Calling plugman.prepare for platform "' + platform + '"');
+ plugman.prepare(platformPath, (platform=='blackberry'?'blackberry10':platform), plugins_dir);
+ // Make sure that config changes for each existing plugin is in place
+ var plugins = cordova_util.findPlugins(plugins_dir);
+ var platform_json = plugman.config_changes.get_platform_json(plugins_dir, (platform=='blackberry'?'blackberry10':platform));
+ plugins && plugins.forEach(function(plugin_id) {
+ if (platform_json.installed_plugins[plugin_id]) {
+ events.emit('log', 'Ensuring plugin "' + plugin_id + '" is installed correctly...');
+ plugman.config_changes.add_plugin_changes((platform=='blackberry'?'blackberry10':platform), platformPath, plugins_dir, plugin_id, /* variables for plugin */ platform_json.installed_plugins[plugin_id], /* top level plugin? */ true, /* should increment config munge? cordova-cli never should, only plugman */ false);
+ } else if (platform_json.dependent_plugins[plugin_id]) {
+ events.emit('log', 'Ensuring plugin "' + plugin_id + '" is installed correctly...');
+ plugman.config_changes.add_plugin_changes((platform=='blackberry'?'blackberry10':platform), platformPath, plugins_dir, plugin_id, /* variables for plugin */ platform_json.dependent_plugins[plugin_id], /* top level plugin? */ false, /* should increment config munge? cordova-cli never should, only plugman */ false);
+ }
+ events.emit('log', 'Plugin "' + plugin_id + '" is good to go.');
+ });
+ end();
+ });
+ }
});
});
}