spade 0.1.0 → 0.1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. data/.gitignore +0 -11
  2. data/.gitmodules +3 -6
  3. data/Gemfile +10 -0
  4. data/bin/spade +3 -1
  5. data/lib/spade.rb +70 -0
  6. data/lib/spade/bundle.rb +180 -0
  7. data/lib/spade/cli.rb +1 -17
  8. data/lib/spade/cli/base.rb +182 -0
  9. data/lib/spade/console.rb +39 -0
  10. data/lib/spade/context.rb +107 -0
  11. data/lib/spade/evaluator.rb +34 -0
  12. data/lib/spade/exports.rb +70 -0
  13. data/lib/spade/loader.rb +208 -0
  14. data/lib/spade/package/.gitignore +1 -0
  15. data/lib/spade/package/Gemfile +15 -0
  16. data/lib/spade/package/lib/spade.js +1283 -0
  17. data/lib/spade/package/lib/wrapper.js +15 -0
  18. data/lib/spade/package/package.json +17 -0
  19. data/lib/spade/package/spec/javascript/async-test.js +123 -0
  20. data/lib/spade/package/spec/javascript/compiler/javascript.js +13 -0
  21. data/lib/spade/package/spec/javascript/compiler/ruby.js +14 -0
  22. data/lib/spade/package/spec/javascript/loader-test.js +64 -0
  23. data/lib/spade/package/spec/javascript/normalize-test.js +73 -0
  24. data/lib/spade/package/spec/javascript/packages-test.js +50 -0
  25. data/lib/spade/package/spec/javascript/relative-require-test.js +72 -0
  26. data/lib/spade/package/spec/javascript/require-test.js +117 -0
  27. data/lib/spade/package/spec/javascript/sandbox/creation.js +44 -0
  28. data/lib/spade/package/spec/javascript/sandbox/evaluate.js +37 -0
  29. data/lib/spade/package/spec/javascript/sandbox/format.js +79 -0
  30. data/lib/spade/package/spec/javascript/sandbox/misc.js +58 -0
  31. data/lib/spade/package/spec/javascript/sandbox/preprocessor.js +81 -0
  32. data/lib/spade/package/spec/javascript/sandbox/require.js +48 -0
  33. data/lib/spade/package/spec/javascript/sandbox/run-command.js +21 -0
  34. data/lib/spade/package/spec/javascript/spade/externs.js +14 -0
  35. data/lib/spade/package/spec/javascript/spade/load-factory.js +15 -0
  36. data/lib/spade/package/spec/javascript/spade/misc.js +23 -0
  37. data/lib/spade/package/spec/javascript/spade/ready.js +12 -0
  38. data/lib/spade/package/spec/javascript/spade/register.js +13 -0
  39. data/lib/spade/package/spec/javascript_spec.rb +7 -0
  40. data/lib/spade/package/spec/spec_helper.rb +3 -0
  41. data/lib/spade/package/spec/support/core_test.rb +67 -0
  42. data/lib/spade/reactor.rb +159 -0
  43. data/lib/spade/server.rb +66 -0
  44. data/lib/spade/shell.rb +85 -0
  45. data/lib/spade/version.rb +1 -1
  46. data/spade.gemspec +15 -4
  47. data/spec/cli/update_spec.rb +65 -0
  48. data/spec/spec_helper.rb +22 -0
  49. data/spec/support/cli.rb +103 -0
  50. data/spec/support/matchers.rb +12 -0
  51. data/spec/support/path.rb +66 -0
  52. metadata +146 -78
  53. data/.rspec +0 -1
  54. data/Buildfile +0 -18
  55. data/README.md +0 -152
  56. data/Rakefile +0 -9
  57. data/examples/format-app/lib/hello.coffee +0 -1
  58. data/examples/format-app/lib/main.js +0 -6
  59. data/examples/format-app/package.json +0 -10
  60. data/examples/format-app/resources/README.txt +0 -1
  61. data/examples/format-app/resources/config.json +0 -3
  62. data/examples/path-test/lib/hello.js +0 -1
  63. data/examples/path-test/lib/main.js +0 -1
  64. data/examples/path-test/package.json +0 -5
  65. data/examples/sc-app/index.html +0 -13
  66. data/examples/sc-app/lib/main.js +0 -24
  67. data/examples/sc-app/package.json +0 -8
  68. data/examples/single-file.js +0 -22
  69. data/examples/todos/index.html +0 -11
  70. data/examples/todos/lib/main.js +0 -11
  71. data/examples/todos/lib/todos.js +0 -93
  72. data/examples/todos/package.json +0 -10
  73. data/examples/todos/resources/stylesheets/todos.css +0 -162
  74. data/examples/todos/resources/templates/todos.handlebars +0 -31
  75. data/examples/web-app/README.md +0 -83
  76. data/examples/web-app/index.html +0 -12
  77. data/examples/web-app/lib/main.js +0 -3
  78. data/examples/web-app/package.json +0 -6
  79. data/examples/web-app/tests.html +0 -12
  80. data/examples/web-app/tests/ct-example-test.js +0 -39
  81. data/examples/web-app/tests/qunit-test.js +0 -23
@@ -0,0 +1,15 @@
1
+ exports.compileWrapper = function(code, spade, filename, pkg, id) {
2
+ var ret = ''
3
+
4
+ // Register package, probably a better way to do this
5
+ if (id.match(/^[^\/]+\/main$/)) {
6
+ ret += 'spade.register("'+pkg.name+'", '+JSON.stringify(pkg)+');\n\n';
7
+ }
8
+
9
+ // TODO: This probably isn't quite right
10
+ // TOOD: We can also pass a string here, maybe we should instead
11
+ ret += 'spade.register("'+id+'", function(){\n'+code+'\n});';
12
+
13
+ return ret;
14
+ };
15
+
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "spade",
3
+ "version": "0.1.1",
4
+
5
+ "description": "Dependency Management Library for JavaScript",
6
+ "author": "Charles Jolley",
7
+ "homepage": "http://github.com/sproutcore/spade",
8
+
9
+ "directories": {
10
+ "lib": "./lib",
11
+ "tests": "./tests"
12
+ },
13
+
14
+ "main": "./lib/spade",
15
+
16
+ "plugin:wrapper": "spade/wrapper"
17
+ }
@@ -0,0 +1,123 @@
1
+ // ==========================================================================
2
+ // Project: Spade - CommonJS Runtime
3
+ // Copyright: ©2010 Strobe Inc. All rights reserved.
4
+ // License: Licened under MIT license (see __preamble__.js)
5
+ // ==========================================================================
6
+ /*globals Ct */
7
+
8
+ require('core-test');
9
+
10
+ var Spade = require('spade').Spade;
11
+
12
+ // ..........................................................
13
+ // BASIC REQUIRE
14
+ //
15
+
16
+ Ct.module('spade: async require');
17
+
18
+ Ct.setup(function(t, done) {
19
+ t.spade = new Spade();
20
+
21
+ // preload a module
22
+ t.spade.register('foo/baz', function(require,e) {
23
+ e.id = 'foo/baz';
24
+ e.async = require.async; // export for testing
25
+ });
26
+
27
+ // dummy loader loads only foo/bar on demand after delay
28
+ t.spade.loader = {
29
+
30
+ requests: 0,
31
+
32
+ loadFactory: function(spade, id, formats, done) {
33
+ this.requests++;
34
+ if (id === 'foo/bar') {
35
+ setTimeout(function() {
36
+ spade.register(id, function(r,e) { e.id='foo/bar'; });
37
+ done();
38
+ }, 10);
39
+
40
+ } else {
41
+ done('Not Found'); // immediately
42
+ }
43
+ }
44
+ };
45
+
46
+ done();
47
+ });
48
+
49
+ Ct.teardown(function(t, done) {
50
+ delete t.spade;
51
+ done();
52
+ });
53
+
54
+ Ct.test('should not talk to loader if registered', function(t, done) {
55
+ var spade = t.spade;
56
+
57
+ t.timeout(1000);
58
+
59
+ spade.async('foo/baz', function(err) {
60
+ t.equal(err, null);
61
+ t.equal(spade.loader.requests, 0, 'loader should not have been called');
62
+ t.equal(spade.require('foo/baz').id, 'foo/baz', 'should find foo');
63
+ done();
64
+ });
65
+
66
+ });
67
+
68
+ Ct.test('should let loader register', function(t, done) {
69
+ var spade = t.spade;
70
+ t.timeout(1000);
71
+ spade.async('foo/bar', function(err) {
72
+ t.equal(err, null);
73
+ t.equal(spade.loader.requests, 1, 'loader should have been called');
74
+ t.equal(spade.require('foo/bar').id, 'foo/bar', 'should find foo');
75
+ done();
76
+ });
77
+ });
78
+
79
+
80
+ Ct.test('should normalize id', function(t, done) {
81
+ var spade = t.spade;
82
+ t.timeout(1000);
83
+ spade.async('/./foo/baz/../bar', function(err) {
84
+ t.equal(err, null);
85
+ t.equal(spade.loader.requests, 1, 'loader should have been called');
86
+ t.equal(spade.require('foo/bar').id, 'foo/bar', 'should find foo');
87
+ done();
88
+ });
89
+ });
90
+
91
+
92
+ Ct.test('should expose async inside of module', function(t, done) {
93
+ var spade = t.spade;
94
+ t.timeout(1000);
95
+
96
+ var async = spade.require('foo/baz').async;
97
+ t.ok(async, 'should have an async function');
98
+
99
+ // normalize relative to async
100
+ async('./bar', function(err) {
101
+ t.equal(err, null);
102
+ t.equal(spade.loader.requests, 1, 'loader should have been called');
103
+ t.equal(spade.require('foo/bar').id, 'foo/bar', 'should find foo');
104
+ done();
105
+ });
106
+ });
107
+
108
+
109
+ Ct.test('should return err if loader does not register', function(t, done) {
110
+ var spade = t.spade;
111
+ t.timeout(1000);
112
+ spade.async('imaginary/bar', function(err) {
113
+ t.equal(err, 'Not Found');
114
+ t.equal(spade.loader.requests, 1, 'loader should have been called');
115
+
116
+ t.throws(function() {
117
+ spade.require('imaginary/bar');
118
+ });
119
+ done();
120
+ });
121
+
122
+ });
123
+
@@ -0,0 +1,13 @@
1
+ // ==========================================================================
2
+ // Project: Spade - CommonJS Runtime
3
+ // Copyright: ©2011 Strobe Inc. All rights reserved.
4
+ // License: Licened under MIT license (see __preamble__.js)
5
+ // ==========================================================================
6
+ //
7
+
8
+ var Ct = require('core-test/sync');
9
+
10
+ Ct.module('spade: Compiler JavaScript');
11
+
12
+ Ct.test('works');
13
+
@@ -0,0 +1,14 @@
1
+ // ==========================================================================
2
+ // Project: Spade - CommonJS Runtime
3
+ // Copyright: ©2011 Strobe Inc. All rights reserved.
4
+ // License: Licened under MIT license (see __preamble__.js)
5
+ // ==========================================================================
6
+ //
7
+
8
+ var Ct = require('core-test/sync');
9
+
10
+ Ct.module('spade: Compiler Ruby');
11
+
12
+ Ct.test('works');
13
+
14
+
@@ -0,0 +1,64 @@
1
+ // ==========================================================================
2
+ // Project: Spade - CommonJS Runtime
3
+ // Copyright: ©2010 Strobe Inc. All rights reserved.
4
+ // License: Licened under MIT license (see __preamble__.js)
5
+ // ==========================================================================
6
+
7
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade;
9
+
10
+ // ..........................................................
11
+ // BASIC REQUIRE
12
+ //
13
+
14
+ Ct.module('spade: basic require');
15
+
16
+ Ct.setup(function(t) {
17
+ t.spade = new Spade();
18
+
19
+ // preload a module
20
+ t.spade.register('foo/main', function(r, e) { e.id = 'foo'; });
21
+
22
+ // dummy loader loads only foo/bar on demand
23
+ t.spade.loader = {
24
+
25
+ requests: 0,
26
+
27
+ loadFactory: function(spade, id, formats, done) {
28
+ this.requests++;
29
+ if (id === 'foo/bar') {
30
+ spade.register(id, function(r,e) { e.id='foo/bar'; });
31
+ }
32
+ if (done) throw "should not be passed done"
33
+ }
34
+ };
35
+
36
+ });
37
+
38
+ Ct.teardown(function(t) {
39
+ delete t.spade;
40
+ });
41
+
42
+ Ct.test('should not talk to loader if module is registered', function(t) {
43
+ var spade = t.spade;
44
+ t.equal(spade.require('foo').id, 'foo', 'should find foo');
45
+ t.equal(spade.loader.requests, 0, 'loader should not have been called');
46
+ });
47
+
48
+ Ct.test('should let loader register', function(t) {
49
+ var spade = t.spade;
50
+ t.equal(spade.require('foo/bar').id, 'foo/bar', 'should find foo');
51
+ t.equal(spade.loader.requests, 1, 'loader should have been called');
52
+ });
53
+
54
+ Ct.test('should throw if loader does not register', function(t) {
55
+ var spade = t.spade;
56
+ t.throws(function() {
57
+ spade.require('imaginary/bar');
58
+ });
59
+ t.equal(spade.loader.requests, 1, 'loader should have been called');
60
+ });
61
+
62
+
63
+
64
+ Ct.run();
@@ -0,0 +1,73 @@
1
+ // ==========================================================================
2
+ // Project: Spade - CommonJS Runtime
3
+ // Copyright: ©2010 Strobe Inc. All rights reserved.
4
+ // License: Licened under MIT license (see __preamble__.js)
5
+ // ==========================================================================
6
+
7
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade;
9
+
10
+ // ..........................................................
11
+ // BASIC REQUIRE
12
+ //
13
+
14
+ Ct.module('spade: normalize');
15
+
16
+ Ct.setup(function(t) {
17
+ t.spade = new Spade();
18
+ });
19
+
20
+ Ct.teardown(function(t) {
21
+ delete t.spade;
22
+ });
23
+
24
+ Ct.test('normalize', function(t) {
25
+ var spade = t.spade;
26
+ t.equal(spade.normalize('foo/bar'), 'foo/bar');
27
+ t.equal(spade.normalize('./foo', 'bar/baz'), 'bar/foo');
28
+ t.equal(spade.normalize('../foo', 'bar/baz'), 'foo/main');
29
+ t.equal(spade.normalize('foo/../bar//foo/./baz', 'bar/baz'), 'bar/foo/baz');
30
+
31
+ t.equal(spade.normalize('/foo/./bar'), 'foo/bar');
32
+ t.equal(spade.normalize('foo/../bar/'), 'bar/main');
33
+ t.equal(spade.normalize('/foo/../bar/'), 'bar/main');
34
+
35
+ t.equal(spade.normalize('/foo/bar'), 'foo/bar');
36
+ t.equal(spade.normalize('foo/bar/'), 'foo/bar');
37
+ t.equal(spade.normalize('/foo/bar/'), 'foo/bar');
38
+
39
+ t.equal(spade.normalize('PKG/foo/bar'), 'PKG/foo/bar');
40
+ t.equal(spade.normalize('BAR/foo', 'PKG/bar/baz'), 'BAR/foo');
41
+ t.equal(spade.normalize('./foo', 'PKG/bar/baz'), 'PKG/bar/foo');
42
+ t.equal(spade.normalize('../foo', 'PKG/bar/baz'), 'PKG/foo');
43
+ t.equal(spade.normalize('./foo/../../bar//foo/./baz', 'PKG/bar/baz'), 'PKG/bar/foo/baz');
44
+
45
+ });
46
+
47
+ Ct.test('normalize package', function(t) {
48
+ var spade = t.spade;
49
+ spade.register('sproutcore', {}); // register as a package
50
+ t.equal(spade.normalize('sproutcore'), 'sproutcore/main');
51
+ t.equal(spade.normalize('foo/sproutcore'), 'foo/sproutcore');
52
+ });
53
+
54
+ Ct.test('normalize relative require from main', function(t) {
55
+ // I think this is a valid test, but not certain
56
+ var spade = t.spade, mainRequire, otherRequire;
57
+ spade.register('foo', { main: './lib/foo', directories: { lib: './lib/foo' } });
58
+ spade.register('foo/main', 'return require;');
59
+ spade.register('foo/other/main', 'return require;');
60
+ mainRequire = spade.require('foo/main');
61
+ otherRequire = spade.require('foo/other/main');
62
+ t.equal(mainRequire.normalize('./foo/adfadf'), 'foo/adfadf', 'works for real main');
63
+ t.equal(otherRequire.normalize('./foo/core'), 'foo/other/foo/core', "no difference for fake main");
64
+ });
65
+
66
+ Ct.test('normalize tilde paths with lib', function(t){
67
+ var spade = t.spade, fooRequire;
68
+ spade.register('foo', { directories: { lib: './lib' }}); // register as a package
69
+ spade.register('foo/main', 'return require;');
70
+ fooRequire = spade.require('foo');
71
+ t.equal(fooRequire.normalize('foo/~lib/main'), 'foo/main');
72
+ t.equal(fooRequire.normalize('foo/~lib/core'), 'foo/core');
73
+ });
@@ -0,0 +1,50 @@
1
+ // ==========================================================================
2
+ // Project: Spade - CommonJS Runtime
3
+ // Copyright: ©2010 Strobe Inc. All rights reserved.
4
+ // License: Licened under MIT license (see __preamble__.js)
5
+ // ==========================================================================
6
+
7
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade;
9
+
10
+ Ct.module('spade: packages');
11
+
12
+ Ct.setup(function(t) {
13
+ t.spade = new Spade();
14
+ });
15
+
16
+ Ct.teardown(function(t) {
17
+ delete t.spade;
18
+ });
19
+
20
+ Ct.test('should find registered package', function(t) {
21
+
22
+ var spade = t.spade;
23
+ spade.register('PKG', { name: 'PKG' });
24
+
25
+ t.equal(spade.package('PKG').name, 'PKG');
26
+ t.equal(spade.package('PKG/foo/bar').name, 'PKG');
27
+
28
+ });
29
+
30
+ Ct.test('should respect mappings', function(t) {
31
+
32
+ var spade = t.spade;
33
+ spade.register('PKG', { mappings: { foo: 'FOO' } });
34
+
35
+ spade.register('PKG/bar', function(require, exports) {
36
+ exports.id = require('foo/foo').id;
37
+ });
38
+
39
+ spade.register('FOO/foo', function(r, e) { e.id = 'FOO'; });
40
+
41
+ t.equal(spade.require('PKG/bar').id, 'FOO'); // should remap pkg name
42
+
43
+ });
44
+
45
+ Ct.test('should set default directories', function(t){
46
+ var spade = t.spade;
47
+ spade.register('PKG', { name: 'PKG' });
48
+
49
+ t.deepEqual(spade.package('PKG').directories, { 'lib': ['lib'] });
50
+ });
@@ -0,0 +1,72 @@
1
+ // ==========================================================================
2
+ // Project: Spade - CommonJS Runtime
3
+ // Copyright: ©2010 Strobe Inc. All rights reserved.
4
+ // License: Licened under MIT license (see __preamble__.js)
5
+ // ==========================================================================
6
+
7
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade;
9
+
10
+ // ..........................................................
11
+ // BASIC REQUIRE
12
+ //
13
+
14
+ Ct.module('spade: relative require');
15
+
16
+ Ct.setup(function(t) {
17
+ t.spade = new Spade();
18
+
19
+ ['foo', 'bar'].forEach(function(id) {
20
+ t.spade.register(id, { "name": id });
21
+ });
22
+
23
+ // register some dummy modules. These will just set an 'id' prop on exports
24
+ ['foo/bar', 'bar/main', 'foo/bar/baz'].forEach(function(id) {
25
+ t.spade.register(id, function(r, e) { e.id = id; });
26
+ });
27
+
28
+ });
29
+
30
+ Ct.teardown(function(t) {
31
+ delete t.spade;
32
+ });
33
+
34
+ Ct.test('require absolute', function(t) {
35
+ var spade = t.spade;
36
+
37
+ spade.register('blah/main', function(require, e) {
38
+ e.found = require('foo/bar').id;
39
+ });
40
+
41
+ t.equal(spade.require('blah').found, 'foo/bar');
42
+ });
43
+
44
+ Ct.test('require relative top level', function(t) {
45
+ var spade = t.spade;
46
+ spade.register('blah/main', function(require, e) {
47
+ e.found = require('../bar').id;
48
+ });
49
+
50
+ t.equal(spade.require('blah').found, 'bar/main');
51
+ });
52
+
53
+ Ct.test('require relative nested', function(t) {
54
+ var spade = t.spade;
55
+ spade.register('foo/blah', function(require, e) {
56
+ e.found = require('./bar').id;
57
+ });
58
+
59
+ t.equal(spade.require('foo/blah').found, 'foo/bar');
60
+ });
61
+
62
+ Ct.test('require relative up nested', function(t) {
63
+ var spade = t.spade;
64
+ spade.register('bar/blah', function(require, e) {
65
+ e.found = require('../foo/bar/baz').id;
66
+ });
67
+
68
+ t.equal(spade.require('bar/blah').found, 'foo/bar/baz');
69
+ });
70
+
71
+
72
+ Ct.run();