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,117 @@
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
+
20
+ Ct.teardown(function(t) {
21
+ delete t.spade;
22
+ });
23
+
24
+
25
+ Ct.test('register then require a module', function(t) {
26
+ var spade = t.spade;
27
+
28
+ spade.register('foo/bar', function(require, exports) {
29
+ exports.foo = 'bar';
30
+ });
31
+
32
+ var exp = spade.require('foo/bar');
33
+ t.equal(exp.foo, 'bar', 'exports.foo == bar - means require succeeded');
34
+ });
35
+
36
+ Ct.test('register a string factory then require', function(t) {
37
+ var spade = t.spade;
38
+
39
+ spade.register('foo/bar', "exports.foo = 'bar';");
40
+
41
+ var exp = spade.require('foo/bar');
42
+ t.equal(exp.foo, 'bar', 'exports.foo == bar - means require succeeded');
43
+ });
44
+
45
+ Ct.test('require a non-existant module will throw an exception', function(t) {
46
+ var spade = t.spade;
47
+ t.throws(function() {
48
+ spade.require('imaginary/foo');
49
+ }, 'Module imaginary/foo not found');
50
+ });
51
+
52
+ Ct.test('require a module that was just registered symbolically. This is for compatibility with non-module items', function(t) {
53
+ var spade = t.spade;
54
+ spade.register('not/a-module');
55
+ t.ok(spade.require('not/a-module'));
56
+ });
57
+
58
+ Ct.test('require system installed packages');
59
+
60
+
61
+ // ..........................................................
62
+ // BASIC REQUIRE
63
+ //
64
+
65
+ Ct.module('spade: extension require');
66
+
67
+ Ct.setup(function(t) {
68
+ t.spade = new Spade();
69
+
70
+ t.spade.register('foo', {
71
+ 'plugin:formats': {
72
+ 'css': 'foo/format',
73
+ 'txt': 'foo/format'
74
+ }
75
+ });
76
+ t.spade.register('foo/format', "exports.compileFormat = function(code){ return code; };");
77
+ t.spade.register('foo/bar', "exports.foo = 'bar.js';", { format: 'js' });
78
+ t.spade.register('foo/bar', "exports.foo = 'bar.css';", { format: 'css' });
79
+ });
80
+
81
+ Ct.teardown(function(t) {
82
+ delete t.spade;
83
+ });
84
+
85
+
86
+ Ct.test('valid extension', function(t) {
87
+ var exp = t.spade.require('foo/bar.js');
88
+ t.equal(exp.foo, 'bar.js', 'exports.foo == bar.js - means require succeeded');
89
+ });
90
+
91
+ Ct.test('same name different extensions', function(t){
92
+ var spade = t.spade,
93
+ jsExp = spade.require('foo/bar.js'),
94
+ cssExp = spade.require('foo/bar.css');
95
+
96
+ t.equal(jsExp.foo, 'bar.js', 'exports.foo == bar.js - means require succeeded');
97
+ t.equal(cssExp.foo, 'bar.css', 'exports.foo == bar.css - means require succeeded');
98
+ });
99
+
100
+ Ct.test("don't load file for different extension", function(t){
101
+ t.throws(function(){ t.spade.require('foo/bar.txt'); }, Error, 'adfaff');
102
+ });
103
+
104
+ Ct.test("defaults to js", function(t){
105
+ var exp = t.spade.require('foo/bar');
106
+ t.equal(exp.foo, 'bar.js', 'exports.foo == bar.js - means required js as default');
107
+ });
108
+
109
+ Ct.test("defaults to first registered if no js", function(t){
110
+ var spade = t.spade;
111
+
112
+ spade.register('foo/baz', "exports.foo = 'baz.css';", { format: 'css' });
113
+ spade.register('foo/baz', "exports.foo = 'baz.txt';", { format: 'txt' });
114
+
115
+ var exp = spade.require('foo/baz');
116
+ t.equal(exp.foo, 'baz.css', 'exports.foo == baz.css - means required last registered');
117
+ });
@@ -0,0 +1,44 @@
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
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade,
9
+ Sandbox = require('spade').Sandbox;
10
+
11
+
12
+ Ct.module('spade: Sandbox Creation');
13
+
14
+ Ct.setup(function(t) {
15
+ t.spade = new Spade();
16
+ });
17
+
18
+ Ct.teardown(function(t) {
19
+ delete t.spade;
20
+ });
21
+
22
+ Ct.test('basic sandbox', function(t) {
23
+ var spade = t.spade,
24
+ sandbox = new Sandbox(spade);
25
+
26
+ t.equal(sandbox.spade, spade);
27
+ t.equal(sandbox.name, '(anonymous)');
28
+ t.equal(sandbox.isIsolated, false);
29
+ });
30
+
31
+ Ct.test('named sandbox', function(t) {
32
+ var sandbox = new Sandbox(t.spade, 'Test Sandbox');
33
+
34
+ t.equal(sandbox.name, 'Test Sandbox');
35
+ });
36
+
37
+ Ct.test('isolated sandbox', function(t) {
38
+ var sandbox = new Sandbox(t.spade, 'Test Sandbox', true),
39
+ sandbox2 = new Sandbox(t.spade, true);
40
+
41
+ t.equal(sandbox.isIsolated, true);
42
+ t.equal(sandbox2.isIsolated, true);
43
+ });
44
+
@@ -0,0 +1,37 @@
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
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade,
9
+ Sandbox = require('spade').Sandbox;
10
+
11
+ Ct.module('spade: Sandbox evaluation');
12
+
13
+ Ct.setup(function(t) {
14
+ t.sandbox = new Sandbox(new Spade());
15
+ });
16
+
17
+ Ct.teardown(function(t) {
18
+ delete t.sandbox;
19
+ });
20
+
21
+ Ct.test('normal', function(t){
22
+ t.equal(t.sandbox._evaluatorInited, undefined);
23
+ t.equal(t.sandbox.evaluate('2 * 2'), 4);
24
+ t.equal(t.sandbox._evaluatorInited, true);
25
+ });
26
+
27
+ Ct.test('already initialized', function(t){
28
+ // Initialize
29
+ t.sandbox.evaluate('');
30
+ // Test
31
+ t.equal(t.sandbox.evaluate('3 * 3'), 9);
32
+ });
33
+
34
+ Ct.test('destroyed', function(t){
35
+ t.sandbox.destroy();
36
+ t.throws(function(){ t.sandbox.evaluate('4 * 4'); }, Error, "Sandbox destroyed");
37
+ });
@@ -0,0 +1,79 @@
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
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade,
9
+ Sandbox = require('spade').Sandbox;
10
+
11
+ Ct.module('spade: Sandbox format compilation');
12
+
13
+ Ct.setup(function(t) {
14
+ t.sandbox = new Sandbox(new Spade());
15
+
16
+ t.sandbox.spade.register('text', {
17
+ 'name': 'text',
18
+ 'plugin:formats': {
19
+ 'txt': 'text/format'
20
+ }
21
+ });
22
+ t.sandbox.spade.register('text/format',
23
+ "exports.compileFormat = function(code, _, filename){ "+
24
+ "return '// From '+filename+'\\nreturn \"'+code+'\";'; "+
25
+ "};");
26
+ });
27
+
28
+ Ct.teardown(function(t) {
29
+ delete t.sandbox;
30
+ });
31
+
32
+ Ct.test('normal', function(t){
33
+ var sandbox = t.sandbox,
34
+ pkg = sandbox.spade.package('text');
35
+
36
+ t.equal(sandbox.compileFormat('Testing', 'test_file.txt', 'txt', pkg), '// From test_file.txt\nreturn "Testing";');
37
+ });
38
+
39
+ Ct.test("checks dependencies", function(t){
40
+ t.sandbox.spade.register('test', {
41
+ 'name': 'test',
42
+ 'dependencies': { 'text': '1.0' }
43
+ });
44
+
45
+ var pkg = t.sandbox.spade.package('test');
46
+
47
+ t.equal(t.sandbox.compileFormat('Testing', 'test_file.txt', 'txt', pkg), '// From test_file.txt\nreturn "Testing";');
48
+ });
49
+
50
+ Ct.test("only checks immediate dependencies", function(t){
51
+ t.sandbox.spade.register('intermediate', {
52
+ 'name': 'intermediate',
53
+ 'dependencies': { 'text': '1.0' }
54
+ });
55
+ t.sandbox.spade.register('test', {
56
+ 'name': 'test',
57
+ 'dependencies': { 'intermediate': '1.0' }
58
+ });
59
+
60
+ var pkg = t.sandbox.spade.package('test');
61
+
62
+ t.equal(t.sandbox.compileFormat('Testing', 'test_file.txt', 'txt', pkg), 'Testing');
63
+ });
64
+
65
+ Ct.test("self takes priority", function(t){
66
+ t.sandbox.spade.register('test', {
67
+ 'name': 'test',
68
+ 'dependencies': { 'text': '1.0' },
69
+ 'plugin:formats': { 'txt': 'test/text-format' }
70
+ });
71
+ t.sandbox.spade.register('test/text-format',
72
+ "exports.compileFormat = function(code){ "+
73
+ "return '// Test Formatter\\nreturn \"'+code+'\";'; "+
74
+ "};");
75
+
76
+ var pkg = t.sandbox.spade.package('test');
77
+
78
+ t.equal(t.sandbox.compileFormat('Testing', 'test_file.txt', 'txt', pkg), '// Test Formatter\nreturn "Testing";');
79
+ });
@@ -0,0 +1,58 @@
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
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade,
9
+ Sandbox = require('spade').Sandbox;
10
+
11
+ Ct.module('spade: Sandbox Miscellaneous');
12
+
13
+ Ct.setup(function(t){
14
+ t.sandbox = new Sandbox(new Spade(), 'Test Sandbox');
15
+ });
16
+
17
+ Ct.teardown(function(t){
18
+ delete t.sandbox;
19
+ });
20
+
21
+ Ct.test('toString', function(t){
22
+ t.equal(t.sandbox.toString(), '[Sandbox Test Sandbox]');
23
+ });
24
+
25
+ Ct.test("exists", function(t){
26
+ t.sandbox.spade.register('test', { name: 'test' });
27
+ t.sandbox.spade.register('test/main', '');
28
+
29
+ t.ok(t.sandbox.exists('test'), "test should exist");
30
+ t.ok(!t.sandbox.exists('missing'), "missing should not exist");
31
+ });
32
+
33
+ Ct.test("async", function(t){
34
+ t.sandbox.spade.register('test', { name: 'test' });
35
+ t.sandbox.spade.register('test/main', 'exports.hello = "hi";');
36
+
37
+ t.deepEqual(t.sandbox.async('test'), {
38
+ "data": "exports.hello = \"hi\";",
39
+ "filename": "test/main",
40
+ "format": "js",
41
+ "skipPreprocess": false
42
+ });
43
+ });
44
+
45
+ Ct.test("url", function(t){
46
+ t.sandbox.spade.register('no-root', { name: 'no-root' });
47
+ t.sandbox.spade.register('with-root', { name: 'with-root', root: 'root/url' });
48
+
49
+ t.throws(function(){ t.sandbox.url('missing') }, "Can't get url for non-existent package missing/main");
50
+ t.throws(function(){ t.sandbox.url('no-root') }, "Package for no-root/main does not support urls");
51
+ t.equal(t.sandbox.url('with-root'), 'root/url/main');
52
+ });
53
+
54
+ Ct.test("destroy", function(t){
55
+ t.equal(t.sandbox.isDestroyed, false);
56
+ t.sandbox.destroy();
57
+ t.equal(t.sandbox.isDestroyed, true);
58
+ });
@@ -0,0 +1,81 @@
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
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade,
9
+ Sandbox = require('spade').Sandbox;
10
+
11
+ Ct.module('spade: Sandbox preprocessor compilation');
12
+
13
+ Ct.setup(function(t) {
14
+ t.sandbox = new Sandbox(new Spade());
15
+
16
+ t.sandbox.spade.register('commenter', {
17
+ 'name': 'commenter',
18
+ 'plugin:preprocessors': ['commenter/preprocessor']
19
+ });
20
+ t.sandbox.spade.register('commenter/preprocessor',
21
+ "exports.compilePreprocessor = function(code, _, filename){ "+
22
+ "return '// From '+filename+'\\n'+code; "+
23
+ "};");
24
+ });
25
+
26
+ Ct.teardown(function(t) {
27
+ delete t.sandbox;
28
+ });
29
+
30
+ Ct.test('normal', function(t){
31
+ var pkg = t.sandbox.spade.package('commenter');
32
+
33
+ t.equal(t.sandbox.compilePreprocessors('var hello = "hi";', 'test_file.js', pkg), '// From test_file.js\nvar hello = "hi";');
34
+ });
35
+
36
+ Ct.test('multiple', function(t){
37
+ t.sandbox.spade.register('functionizer', {
38
+ 'name': 'functionizer',
39
+ 'dependencies': { 'commenter': '1.0' },
40
+ 'plugin:preprocessors': ['functionizer/preprocessor', 'commenter/preprocessor']
41
+ });
42
+ t.sandbox.spade.register('functionizer/preprocessor',
43
+ "exports.compilePreprocessor = function(code){ "+
44
+ "return 'function(){ '+code+' };'; "+
45
+ "};");
46
+
47
+ var pkg = t.sandbox.spade.package('functionizer');
48
+
49
+ t.equal(t.sandbox.compilePreprocessors('var hello = "hi";', 'test_file.js', pkg), '// From test_file.js\nfunction(){ var hello = "hi"; };');
50
+ });
51
+
52
+ Ct.test("checks dependencies", function(t){
53
+ t.sandbox.spade.register('test', {
54
+ 'name': 'test',
55
+ 'dependencies': { 'commenter': '1.0' }
56
+ });
57
+
58
+ var pkg = t.sandbox.spade.package('test');
59
+
60
+ t.equal(t.sandbox.compilePreprocessors('var hello = "hi";', 'test_file.js', pkg), '// From test_file.js\nvar hello = "hi";');
61
+ });
62
+
63
+ Ct.test("only checks immediate dependencies", function(t){
64
+ t.sandbox.spade.register('intermediate', {
65
+ 'name': 'intermediate',
66
+ 'dependencies': { 'commenter': '1.0' }
67
+ });
68
+ t.sandbox.spade.register('test', {
69
+ 'name': 'test',
70
+ 'dependencies': { 'intermediate': '1.0' }
71
+ });
72
+
73
+ var pkg = t.sandbox.spade.package('test');
74
+
75
+ t.equal(t.sandbox.compilePreprocessors('var hello = "hi";', 'test_file.js', pkg), 'var hello = "hi";');
76
+ });
77
+
78
+ Ct.test("handles preprocessor loop");
79
+
80
+ Ct.test("proper order?");
81
+
@@ -0,0 +1,48 @@
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
+ var Ct = require('core-test/sync'),
8
+ Spade = require('spade').Spade,
9
+ Sandbox = require('spade').Sandbox;
10
+
11
+ Ct.module('spade: Sandbox require');
12
+
13
+ Ct.setup(function(t) {
14
+ t.sandbox = new Sandbox(new Spade());
15
+ t.sandbox.spade.register('testing', { name: 'testing' });
16
+ t.sandbox.spade.register('testing/main', "exports.hello = 'hi';");
17
+ });
18
+
19
+ Ct.teardown(function(t) {
20
+ delete t.sandbox;
21
+ });
22
+
23
+ Ct.test("require new", function(t){
24
+ t.equal(t.sandbox.require('testing').hello, 'hi');
25
+ });
26
+
27
+ // NOTE: This test doesn't necessarily tell us that anything special is happening, just that it works
28
+ Ct.test("require existing", function(t){
29
+ // Cache it
30
+ t.sandbox.require('testing');
31
+ // Now require again
32
+ t.equal(t.sandbox.require('testing').hello, 'hi');
33
+ });
34
+
35
+ // TODO: I'm not actually sure how this should work - PW
36
+ Ct.test("require circular");
37
+ /*
38
+ Ct.test("require circular", function(t){
39
+ t.sandbox.spade.register('testing/file1', "exports.value = require('testing/file2').value * 2;");
40
+ t.sandbox.spade.register('testing/file2', "exports.value = require('testing/file1').value * 2;");
41
+ t.equal(t.sandbox.require('testing/file1').value, 4);
42
+ });
43
+ */
44
+
45
+ Ct.test("throw if doesn't exist", function(t){
46
+ t.throws(function(){ t.sandbox.require('missing'); }, "Module missing not found");
47
+ });
48
+