Return-Path: X-Original-To: apmail-cordova-commits-archive@www.apache.org Delivered-To: apmail-cordova-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E980810421 for ; Thu, 13 Jun 2013 07:53:59 +0000 (UTC) Received: (qmail 28003 invoked by uid 500); 13 Jun 2013 07:53:59 -0000 Delivered-To: apmail-cordova-commits-archive@cordova.apache.org Received: (qmail 27933 invoked by uid 500); 13 Jun 2013 07:53:57 -0000 Mailing-List: contact commits-help@cordova.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cordova.apache.org Delivered-To: mailing list commits@cordova.apache.org Received: (qmail 27926 invoked by uid 99); 13 Jun 2013 07:53:56 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 13 Jun 2013 07:53:56 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 293338A4942; Thu, 13 Jun 2013 07:53:56 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: filmaj@apache.org To: commits@cordova.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: git commit: cleaned up plugins and fixed specs Date: Thu, 13 Jun 2013 07:53:56 +0000 (UTC) Updated Branches: refs/heads/lazy b29e344f1 -> a5a861ebb cleaned up plugins and fixed specs Project: http://git-wip-us.apache.org/repos/asf/cordova-cli/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-cli/commit/a5a861eb Tree: http://git-wip-us.apache.org/repos/asf/cordova-cli/tree/a5a861eb Diff: http://git-wip-us.apache.org/repos/asf/cordova-cli/diff/a5a861eb Branch: refs/heads/lazy Commit: a5a861ebbd2a537df5f4aaa842f265195a604e62 Parents: b29e344 Author: Fil Maj Authored: Thu Jun 13 00:53:47 2013 -0700 Committer: Fil Maj Committed: Thu Jun 13 00:53:47 2013 -0700 ---------------------------------------------------------------------- spec/plugin.spec.js | 231 +++++++++++++++++++++++++++-------------------- src/plugin.js | 12 +-- src/util.js | 2 + 3 files changed, 136 insertions(+), 109 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/a5a861eb/spec/plugin.spec.js ---------------------------------------------------------------------- diff --git a/spec/plugin.spec.js b/spec/plugin.spec.js index d042841..737a846 100644 --- a/spec/plugin.spec.js +++ b/spec/plugin.spec.js @@ -16,131 +16,164 @@ specific language governing permissions and limitations under the License. */ -var cordova = require('../../cordova'), +var cordova = require('../cordova'), path = require('path'), shell = require('shelljs'), + plugman = require('plugman'), fs = require('fs'), - hooker = require('../../src/hooker'), - tempDir = path.join(__dirname, '..', '..', 'temp'), - fixturesDir = path.join(__dirname, '..', 'fixtures'), - testPlugin = path.join(fixturesDir, 'plugins', 'test'), - cordova_project = path.join(fixturesDir, 'projects', 'cordova'), - androidPlugin = path.join(fixturesDir, 'plugins', 'android'); + util = require('../src/util'), + config = require('../src/config'), + hooker = require('../src/hooker'), + platforms = require('../platforms'); var cwd = process.cwd(); +var supported_platforms = Object.keys(platforms).filter(function(p) { return p != 'www'; }); +var sample_plugins = ['one','two']; +var project_dir = path.join('some','path'); +var plugins_dir = path.join(project_dir, 'plugins'); describe('plugin command', function() { + var is_cordova, list_platforms, fire, find_plugins, rm, mkdir, existsSync, exec, prep_spy, plugman_install, plugman_fetch, parsers = {}, uninstall; beforeEach(function() { - // Make a temp directory - shell.rm('-rf', tempDir); - shell.mkdir('-p', tempDir); + is_cordova = spyOn(util, 'isCordova').andReturn(project_dir); + fire = spyOn(hooker.prototype, 'fire').andCallFake(function(e, opts, cb) { + if (cb === undefined) cb = opts; + cb(false); + }); + supported_platforms.forEach(function(p) { + parsers[p] = jasmine.createSpy(p + ' update_project').andCallFake(function(cfg, cb) { + cb(); + }); + spyOn(platforms[p], 'parser').andReturn({ + staging_dir:function(){return ''} + }); + }); + list_platforms = spyOn(util, 'listPlatforms').andReturn(supported_platforms); + find_plugins = spyOn(util, 'findPlugins').andReturn(sample_plugins); + rm = spyOn(shell, 'rm'); + mkdir = spyOn(shell, 'mkdir'); + existsSync = spyOn(fs, 'existsSync').andReturn(false); + exec = spyOn(shell, 'exec').andCallFake(function(cmd, opts, cb) { + cb(0, ''); + }); + prep_spy = spyOn(cordova, 'prepare').andCallFake(function(t, cb) { + cb(); + }); + plugman_install = spyOn(plugman, 'install'); + plugman_fetch = spyOn(plugman, 'fetch').andCallFake(function(target, plugins_dir, opts, cb) { cb(false, path.join(plugins_dir, target)); }); + uninstall = spyOn(plugman, 'uninstall'); }); - it('should run inside a Cordova-based project', function() { - this.after(function() { - process.chdir(cwd); + describe('failure', function() { + it('should not run outside of a Cordova-based project by calling util.isCordova', function() { + is_cordova.andReturn(false); + expect(function() { + cordova.plugin(); + expect(is_cordova).toHaveBeenCalled(); + }).toThrow('Current working directory is not a Cordova-based project.'); }); - - cordova.create(tempDir); - - process.chdir(tempDir); - - expect(function() { - cordova.plugin(); - }).not.toThrow(); }); - it('should not run outside of a Cordova-based project', function() { - this.after(function() { - process.chdir(cwd); - }); - - process.chdir(tempDir); - expect(function() { + describe('success', function() { + it('should run inside a Cordova-based project by calling util.isCordova', function() { cordova.plugin(); - }).toThrow(); - }); - - describe('edge cases', function() { - beforeEach(function() { - cordova.create(tempDir); - process.chdir(tempDir); - }); - - afterEach(function() { - process.chdir(cwd); - cordova.removeAllListeners('results'); - }); - - it('should not fail when the plugins directory is missing', function() { - fs.rmdirSync('plugins'); - - expect(function() { - cordova.plugin(); - }).not.toThrow(); - }); - - it('should ignore files, like .gitignore, in the plugins directory', function(done) { - var someFile = path.join(tempDir, 'plugins', '.gitignore'); - fs.writeFileSync(someFile, 'not a plugin'); - cordova.on('results', function(res) { - expect(res).toEqual('No plugins added. Use `cordova plugin add `.'); - done(); - }); + expect(is_cordova).toHaveBeenCalled(); + }); - cordova.plugin('list'); - }); - }); + describe('`ls`', function() { + afterEach(function() { + cordova.removeAllListeners('results'); + }); + it('should list out no plugins for a fresh project', function(done) { + find_plugins.andReturn([]); + cordova.on('results', function(res) { + expect(res).toEqual('No plugins added. Use `cordova plugin add `.'); + done(); + }); + cordova.plugin('list'); + }); - describe('`ls`', function() { - beforeEach(function() { - cordova.create(tempDir); - process.chdir(tempDir); + it('should list out added plugins in a project', function(done) { + cordova.on('results', function(res) { + expect(res).toEqual(sample_plugins); + done(); + }); + cordova.plugin('list'); + }); }); - - afterEach(function() { - process.chdir(cwd); - cordova.removeAllListeners('results'); + describe('`add`', function() { + it('should call plugman.fetch for each plugin', function() { + cordova.plugin('add', sample_plugins); + sample_plugins.forEach(function(p) { + expect(plugman_fetch).toHaveBeenCalledWith(p, plugins_dir, {}, jasmine.any(Function)); + }); + }); + it('should call plugman.install, for each plugin, for every platform', function() { + cordova.plugin('add', sample_plugins); + sample_plugins.forEach(function(plug) { + supported_platforms.forEach(function(plat) { + expect(plugman_install).toHaveBeenCalledWith((plat=='blackberry'?'blackberry10':plat), path.join(project_dir, 'platforms', plat), plug, plugins_dir, jasmine.any(Object)); + }); + }); + }); }); + describe('`remove`',function() { + var plugin_parser; + var subset = ['android', 'wp7']; + beforeEach(function() { + plugin_parser = spyOn(util, 'plugin_parser').andReturn({ + platforms:subset + }); + }); + it('should throw if plugin is not installed', function() { + expect(function() { + cordova.plugin('rm', 'somethingrandom'); + }).toThrow('Plugin "somethingrandom" not added to project.'); + }); - it('should list out no plugins for a fresh project', function(done) { - cordova.on('results', function(res) { - expect(res).toEqual('No plugins added. Use `cordova plugin add `.'); - done(); + it('should call plugman.uninstall for every matching installedplugin-supportedplatform pair', function() { + cordova.plugin('rm', sample_plugins); + sample_plugins.forEach(function(plug) { + subset.forEach(function(plat) { + expect(uninstall).toHaveBeenCalledWith(plat, path.join(project_dir, 'platforms', plat), plug, plugins_dir, jasmine.any(Object)); + }); + }); }); - cordova.plugin('list'); - }); - it('should list out any added plugins in a project', function(done) { - var random_plug = 'randomplug'; - shell.mkdir('-p', path.join(tempDir, 'plugins', random_plug)); - cordova.on('results', function(res) { - expect(res).toEqual([random_plug]); - done(); - }); - cordova.plugin('list'); }); }); - - describe('`add`', function() { + describe('hooks', function() { + var plugin_parser; beforeEach(function() { - cordova.create(tempDir); - process.chdir(tempDir); + plugin_parser = spyOn(util, 'plugin_parser').andReturn({ + platforms:supported_platforms + }); }); - - afterEach(function() { - process.chdir(cwd); + describe('list (ls) hooks', function() { + it('should fire before hooks through the hooker module', function() { + cordova.plugin(); + expect(fire).toHaveBeenCalledWith('before_plugin_ls', jasmine.any(Function)); + }); + it('should fire after hooks through the hooker module', function() { + cordova.plugin(); + expect(fire).toHaveBeenCalledWith('after_plugin_ls', jasmine.any(Function)); + }); }); - describe('failure', function() { - it('should throw if plugin does not have a plugin.xml', function() { - process.chdir(cordova_project); - this.after(function() { - process.chdir(cwd); - }); - expect(function() { - cordova.plugin('add', fixturesDir); - }).toThrow(); + describe('remove (rm) hooks', function() { + it('should fire before hooks through the hooker module', function() { + cordova.plugin('rm', 'two'); + expect(fire).toHaveBeenCalledWith('before_plugin_rm', {plugins:['two']}, jasmine.any(Function)); + }); + it('should fire after hooks through the hooker module', function() { + cordova.plugin('rm', 'one'); + expect(fire).toHaveBeenCalledWith('after_plugin_rm', {plugins:['one']}, jasmine.any(Function)); + }); + }); + describe('add hooks', function() { + it('should fire before and after hooks through the hooker module', function() { + cordova.plugin('add', 'android'); + expect(fire).toHaveBeenCalledWith('before_plugin_add', {plugins:['android']}, jasmine.any(Function)); + expect(fire).toHaveBeenCalledWith('after_plugin_add', {plugins:['android']}, jasmine.any(Function)); }); }); }); }); - http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/a5a861eb/src/plugin.js ---------------------------------------------------------------------- diff --git a/src/plugin.js b/src/plugin.js index 8fbe355..38e0359 100644 --- a/src/plugin.js +++ b/src/plugin.js @@ -19,16 +19,12 @@ var cordova_util = require('./util'), util = require('util'), fs = require('fs'), - shell = require('shelljs'), path = require('path'), shell = require('shelljs'), platforms = require('../platforms'), - config_parser = require('./config_parser'), n = require('ncallbacks'), hooker = require('./hooker'), events = require('./events'), - plugin_parser = require('./plugin_parser'), - ls = fs.readdirSync, plugman = require('plugman'); module.exports = function plugin(command, targets, callback) { @@ -43,10 +39,6 @@ module.exports = function plugin(command, targets, callback) { if (arguments.length === 0) command = 'ls'; var hooks = new hooker(projectRoot); - - // Grab config info for the project - var xml = cordova_util.projectConfig(projectRoot); - var cfg = new config_parser(xml); var platformList = cordova_util.listPlatforms(projectRoot); // Massage plugin name(s) / path(s) @@ -148,7 +140,7 @@ module.exports = function plugin(command, targets, callback) { var targetPath = path.join(pluginPath, target); // Check if there is at least one match between plugin // supported platforms and app platforms - var pluginXml = new plugin_parser(path.join(targetPath, 'plugin.xml')); + var pluginXml = new cordova_util.plugin_parser(path.join(targetPath, 'plugin.xml')); var intersection = pluginXml.platforms.filter(function(e) { if (platformList.indexOf(e) == -1) return false; else return true; @@ -162,7 +154,7 @@ module.exports = function plugin(command, targets, callback) { var platformRoot = path.join(projectRoot, 'platforms', platform); var parser = new platforms[platform].parser(platformRoot); events.emit('log', 'Calling plugman.uninstall on plugin "' + target + '" for platform "' + platform + '"'); - plugman.uninstall(platform, platformRoot, target, path.join(projectRoot, 'plugins'), { www_dir: parser.staging_dir() }); + plugman.uninstall((platform=='blackberry'?'blackberry10':platform), platformRoot, target, path.join(projectRoot, 'plugins'), { www_dir: parser.staging_dir() }); }); end(); } else { http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/a5a861eb/src/util.js ---------------------------------------------------------------------- diff --git a/src/util.js b/src/util.js index 6749c8f..47fcbed 100644 --- a/src/util.js +++ b/src/util.js @@ -19,6 +19,7 @@ var fs = require('fs'), path = require('path'), config_parser = require('./config_parser'), + plugin_parser = require('./plugin_parser'), shell = require('shelljs'); // Global configuration paths @@ -54,6 +55,7 @@ module.exports = { } else return false; }, config_parser:config_parser, + plugin_parser:plugin_parser, // Recursively deletes .svn folders from a target path deleteSvnFolders:function(dir) { var contents = fs.readdirSync(dir);