added build command invoking changes to app data via config.xml specs. also 
added plugin removal and specs


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/commit/6203358f
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/tree/6203358f
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/diff/6203358f

Branch: refs/heads/cordova-client
Commit: 6203358fd19f4e3ef046983c227ffc0c9efab5bc
Parents: 1bc7040
Author: Fil Maj <maj....@gmail.com>
Authored: Sun Sep 23 17:54:43 2012 -0700
Committer: Fil Maj <maj....@gmail.com>
Committed: Sun Sep 23 17:54:43 2012 -0700

----------------------------------------------------------------------
 spec/build.spec.js  |   77 +++++++++++++++++++++++++++++++---------------
 spec/plugin.spec.js |   71 ++++++++++++++++++++++++++++++++++++++++++
 src/plugin.js       |   50 ++++++++++++++++++++++++++++--
 3 files changed, 170 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6203358f/spec/build.spec.js
----------------------------------------------------------------------
diff --git a/spec/build.spec.js b/spec/build.spec.js
index 49b4bac..067c267 100644
--- a/spec/build.spec.js
+++ b/spec/build.spec.js
@@ -1,5 +1,6 @@
 var cordova = require('../cordova'),
     wrench = require('wrench'),
+    et = require('elementtree'),
     mkdirp = wrench.mkdirSyncRecursive,
     path = require('path'),
     rmrf = wrench.rmdirSyncRecursive,
@@ -114,7 +115,6 @@ describe('build command', function() {
         beforeEach(function() {
             cordova.create(tempDir);
             process.chdir(tempDir);
-            cfg = config_parser(path.join(tempDir, 'www', 'config.xml'));
         });
 
         afterEach(function() {
@@ -122,32 +122,59 @@ describe('build command', function() {
         });
 
         describe('into Android builds', function() {
-          it('should interpolate app name', function () {
-              /*
-              var buildcb = jasmine.createSpy();
-              var cb = jasmine.createSpy();
-              var newName = "devil ether";
-
-              runs(function() {
-                  cordova.platform('add', 'android', cb);
-              });
-              waitsFor(function() { return cb.wasCalled; }, 'platform add 
android callback');
-
-              runs(function() {
-                  cfg.name(newName); // set a new name in the config.xml
-                  cordova.build(buildcb);
-              });
-              waitsFor(function() { return buildcb.wasCalled; }, 'build call', 
20000);
-              runs(function() {
-                  // TODO
-              });
-              */
-          });
-          it('should interpolate package name');
+            it('should interpolate app name', function () {
+                var buildcb = jasmine.createSpy();
+                var cb = jasmine.createSpy();
+                var newName = "devil ether", s;
+
+                runs(function() {
+                    cordova.platform('add', 'android', cb);
+                });
+                waitsFor(function() { return cb.wasCalled; }, 'platform add 
android callback');
+
+                runs(function() {
+                    // intercept call to ./cordova/debug to speed things up
+                    s = spyOn(require('shelljs'), 'exec').andReturn({code:0});
+                    cfg = new config_parser(path.join(tempDir, 'www', 
'config.xml'));
+                    cfg.name(newName); // set a new name in the config.xml
+                    cordova.build(buildcb);
+                });
+                waitsFor(function() { return buildcb.wasCalled; }, 'build 
call', 20000);
+
+                runs(function() {
+                    var strings = path.join(tempDir, 'platforms', 'android', 
'res', 'values', 'strings.xml');
+                    var doc = new 
et.ElementTree(et.XML(fs.readFileSync(strings, 'utf-8')));
+                    
expect(doc.find('string[@name="app_name"]').text).toBe('devil ether');
+                });
+            });
+            it('should interpolate package name');
         });
         describe('into iOS builds', function() {
-          it('should interpolate app name');
-          it('should interpolate package name');
+            it('should interpolate app name', function() {
+                var buildcb = jasmine.createSpy();
+                var cb = jasmine.createSpy();
+                var newName = "i keep getting older, they stay the same age", 
s;
+
+                runs(function() {
+                    cordova.platform('add', 'ios', cb);
+                });
+                waitsFor(function() { return cb.wasCalled; }, 'platform add 
ios callback');
+
+                runs(function() {
+                    // intercept call to ./cordova/debug to speed things up
+                    s = spyOn(require('shelljs'), 'exec').andReturn({code:0});
+                    cfg = new config_parser(path.join(tempDir, 'www', 
'config.xml'));
+                    cfg.name(newName); // set a new name in the config.xml
+                    cordova.build(buildcb);
+                });
+                waitsFor(function() { return buildcb.wasCalled; }, 'build 
call', 20000);
+
+                runs(function() {
+                    var pbxproj = path.join(tempDir, 'platforms', 'ios', 
'Hello_Cordova.xcodeproj', 'project.pbxproj');
+                    expect(fs.readFileSync(pbxproj, 
'utf-8').match(/PRODUCT_NAME\s*=\s*"i keep getting older, they stay the same 
age"/)).not.toBeNull();
+                });
+            });
+            it('should interpolate package name');
         });
     });
 });

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6203358f/spec/plugin.spec.js
----------------------------------------------------------------------
diff --git a/spec/plugin.spec.js b/spec/plugin.spec.js
index b53cf89..2ba78a5 100644
--- a/spec/plugin.spec.js
+++ b/spec/plugin.spec.js
@@ -103,6 +103,8 @@ describe('plugin command', function() {
                     }).toThrow('Plugin "test" already added to project.');
                 });
             });
+            it('should throw if plugin www assets collide with existing 
project www assets', function() {
+            });
             it('should throw if plugin does not have a plugin.xml', function() 
{
                 var cb = jasmine.createSpy();
                 runs(function() {
@@ -156,6 +158,75 @@ describe('plugin command', function() {
     });
 
     describe('`remove`', function() {
+        beforeEach(function() {
+            cordova.create(tempDir);
+            process.chdir(tempDir);
+        });
+
+        afterEach(function() {
+            process.chdir(cwd);
+        });
+        describe('failure', function() {
+            it('should throw if your app has no platforms added', function() {
+                expect(function() {
+                    cordova.plugin('remove', testPlugin);
+                }).toThrow('You need at least one platform added to your app. 
Use `cordova platform add <platform>`.');
+            });
+            it('should throw if plugin is not added to project', function() {
+                var cb = jasmine.createSpy();
+                runs(function() {
+                    cordova.platform('add', 'ios', cb);
+                });
+                waitsFor(function() { return cb.wasCalled; }, 'ios platform 
add');
+                runs(function() {
+                    expect(function() {
+                        cordova.plugin('remove', 'test', function() {});
+                    }).toThrow('Plugin "test" not added to project.');
+                });
+            });
+        });
+        describe('success', function() {
+            it('should remove plugin www assets from project www folder', 
function() {
+                var cb = jasmine.createSpy();
+                var pluginCb = jasmine.createSpy();
+                var removeCb = jasmine.createSpy();
+                runs(function() {
+                    cordova.platform('add', 'ios', cb);
+                });
+                waitsFor(function() { return cb.wasCalled; }, 'ios platform 
add');
+                runs(function() {
+                    cordova.plugin('add', testPlugin, pluginCb);
+                });
+                waitsFor(function() { return pluginCb.wasCalled; }, 'test 
plugin add');
+                runs(function() {
+                    cordova.plugin('remove', 'test', removeCb);
+                });
+                waitsFor(function() { return removeCb.wasCalled; }, 'test 
plugin remove');
+                runs(function() {
+                    expect(fs.existsSync(path.join(tempDir, 'www', 
'test.js'))).toBe(false);
+                });
+            });
+            it('should remove the full plugin from the plugins directory', 
function() {
+                var cb = jasmine.createSpy();
+                var pluginCb = jasmine.createSpy();
+                var removeCb = jasmine.createSpy();
+                runs(function() {
+                    cordova.platform('add', 'ios', cb);
+                });
+                waitsFor(function() { return cb.wasCalled; }, 'ios platform 
add');
+                runs(function() {
+                    cordova.plugin('add', testPlugin, pluginCb);
+                });
+                waitsFor(function() { return pluginCb.wasCalled; }, 'test 
plugin add');
+                runs(function() {
+                    cordova.plugin('remove', 'test', removeCb);
+                });
+                waitsFor(function() { return removeCb.wasCalled; }, 'test 
plugin remove');
+                runs(function() {
+                    expect(fs.existsSync(path.join(tempDir, 'plugins', 
'test'))).toBe(false);
+                });
+            });
+        });
     });
 });
 

http://git-wip-us.apache.org/repos/asf/incubator-cordova-labs/blob/6203358f/src/plugin.js
----------------------------------------------------------------------
diff --git a/src/plugin.js b/src/plugin.js
index a5bdd4e..e5423d1 100644
--- a/src/plugin.js
+++ b/src/plugin.js
@@ -2,6 +2,7 @@ var cordova_util  = require('./util'),
     util          = require('util'),
     wrench        = require('wrench'),
     cpr           = wrench.copyDirSyncRecursive,
+    rmrf          = wrench.rmdirSyncRecursive,
     fs            = require('fs'),
     path          = require('path'),
     shell         = require('shelljs'),
@@ -101,9 +102,52 @@ module.exports = function plugin(command, target, 
callback) {
             if (callback) callback();
             break;
         case 'remove':
-            // TODO: remove plugin. requires pluginstall to
-            // support removal.
-            throw 'Plugin removal not supported yet! sadface';
+            if (platforms.length === 0) {
+                throw 'You need at least one platform added to your app. Use 
`cordova platform add <platform>`.';
+            }
+            // Check if we have the plugin.
+            if (plugins.indexOf(targetName) > -1) {
+                var pluginWww = path.join(pluginPath, target, 'www');
+                var wwwContents = ls(pluginWww);
+                var cli = path.join(__dirname, '..', 'node_modules', 
'pluginstall', 'cli.js');
+
+                // Check if there is at least one match between plugin
+                // supported platforms and app platforms
+                var pluginXml = new plugin_parser(path.join(pluginPath, 
target, 'plugin.xml'));
+                var intersection = pluginXml.platforms.filter(function(e) {
+                    if (platforms.indexOf(e) == -1) return false;
+                    else return true;
+                });
+
+                // Iterate over all matchin app-plugin platforms in the 
project and uninstall the
+                // plugin.
+                intersection.forEach(function(platform) {
+                    var cmd = util.format('%s -d %s "%s" "%s"', cli, platform, 
path.join(projectRoot, 'platforms', platform), path.join(pluginPath, target));
+                    var plugin_cli = shell.exec(cmd, {silent:true});
+                    if (plugin_cli.code > 0) throw 'An error occured during 
plugin uninstallation for ' + platform + '. ' + cli.output;
+                });
+                
+                // Remove the plugin web assets to the www folder as well
+                // TODO: assumption that web assets go under www folder
+                // inside plugin dir; instead should read plugin.xml
+                wwwContents.forEach(function(asset) {
+                    asset = path.resolve(path.join(projectWww, asset));
+                    var info = fs.lstatSync(asset);
+                    if (info.isDirectory()) {
+                        rmrf(asset);
+                    } else {
+                        fs.unlinkSync(asset);
+                    }
+                });
+
+                // Finally remove the plugin dir from plugins/
+                rmrf(path.join(pluginPath, target));
+
+                if (callback) callback();
+            } else {
+                throw 'Plugin "' + targetName + '" not added to project.';
+            }
+            break;
         default:
             throw 'Unrecognized command "' + command + '". Use either `add`, 
`remove`, or `ls`.';
     }

Reply via email to