spade-runtime 0.1.0.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.
- data/.gitignore +2 -0
- data/bin/spaderun +9 -0
- data/lib/spade-runtime.rb +1 -0
- data/lib/spade/runtime.rb +20 -0
- data/lib/spade/runtime/bundle.rb +173 -0
- data/lib/spade/runtime/cli.rb +7 -0
- data/lib/spade/runtime/cli/base.rb +181 -0
- data/lib/spade/runtime/compiler.rb +34 -0
- data/lib/spade/runtime/console.rb +39 -0
- data/lib/spade/runtime/context.rb +114 -0
- data/lib/spade/runtime/exports.rb +86 -0
- data/lib/spade/runtime/loader.rb +209 -0
- data/lib/spade/runtime/reactor.rb +159 -0
- data/lib/spade/runtime/server.rb +66 -0
- data/lib/spade/runtime/shell.rb +36 -0
- data/lib/spade/runtime/version.rb +5 -0
- data/spade-runtime.gemspec +36 -0
- data/spec/cli/update_spec.rb +64 -0
- data/spec/javascript/async-test.js +123 -0
- data/spec/javascript/compiler/javascript.js +13 -0
- data/spec/javascript/compiler/ruby.js +14 -0
- data/spec/javascript/loader-test.js +64 -0
- data/spec/javascript/normalize-test.js +73 -0
- data/spec/javascript/packages-test.js +44 -0
- data/spec/javascript/relative-require-test.js +72 -0
- data/spec/javascript/require-test.js +117 -0
- data/spec/javascript/sandbox/compile.js +37 -0
- data/spec/javascript/sandbox/creation.js +44 -0
- data/spec/javascript/sandbox/format.js +79 -0
- data/spec/javascript/sandbox/misc.js +57 -0
- data/spec/javascript/sandbox/preprocessor.js +81 -0
- data/spec/javascript/sandbox/require.js +48 -0
- data/spec/javascript/sandbox/run-command.js +21 -0
- data/spec/javascript/spade/externs.js +14 -0
- data/spec/javascript/spade/load-factory.js +15 -0
- data/spec/javascript/spade/misc.js +23 -0
- data/spec/javascript/spade/ready.js +12 -0
- data/spec/javascript/spade/register.js +13 -0
- data/spec/javascript_spec.rb +7 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/support/cli.rb +109 -0
- data/spec/support/core_test.rb +61 -0
- data/spec/support/matchers.rb +12 -0
- data/spec/support/path.rb +62 -0
- metadata +218 -0
@@ -0,0 +1,44 @@
|
|
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
|
+
|
@@ -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();
|
@@ -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,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 compilation');
|
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._compilerInited, undefined);
|
23
|
+
t.equal(t.sandbox.compile('2 * 2'), 4);
|
24
|
+
t.equal(t.sandbox._compilerInited, true);
|
25
|
+
});
|
26
|
+
|
27
|
+
Ct.test('already initialized', function(t){
|
28
|
+
// Initialize
|
29
|
+
t.sandbox.compile('');
|
30
|
+
// Test
|
31
|
+
t.equal(t.sandbox.compile('3 * 3'), 9);
|
32
|
+
});
|
33
|
+
|
34
|
+
Ct.test('destroyed', function(t){
|
35
|
+
t.sandbox.destroy();
|
36
|
+
t.throws(function(){ t.sandbox.compile('4 * 4'); }, Error, "Sandbox destroyed");
|
37
|
+
});
|
@@ -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,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,57 @@
|
|
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
|
+
});
|
42
|
+
});
|
43
|
+
|
44
|
+
Ct.test("url", function(t){
|
45
|
+
t.sandbox.spade.register('no-root', { name: 'no-root' });
|
46
|
+
t.sandbox.spade.register('with-root', { name: 'with-root', root: 'root/url' });
|
47
|
+
|
48
|
+
t.throws(function(){ t.sandbox.url('missing') }, "Can't get url for non-existent package missing/main");
|
49
|
+
t.throws(function(){ t.sandbox.url('no-root') }, "Package for no-root/main does not support urls");
|
50
|
+
t.equal(t.sandbox.url('with-root'), 'root/url/main');
|
51
|
+
});
|
52
|
+
|
53
|
+
Ct.test("destroy", function(t){
|
54
|
+
t.equal(t.sandbox.isDestroyed, false);
|
55
|
+
t.sandbox.destroy();
|
56
|
+
t.equal(t.sandbox.isDestroyed, true);
|
57
|
+
});
|