spade 0.1.0 → 0.1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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();