spade-runtime 0.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.gitignore +2 -0
  2. data/bin/spaderun +9 -0
  3. data/lib/spade-runtime.rb +1 -0
  4. data/lib/spade/runtime.rb +20 -0
  5. data/lib/spade/runtime/bundle.rb +173 -0
  6. data/lib/spade/runtime/cli.rb +7 -0
  7. data/lib/spade/runtime/cli/base.rb +181 -0
  8. data/lib/spade/runtime/compiler.rb +34 -0
  9. data/lib/spade/runtime/console.rb +39 -0
  10. data/lib/spade/runtime/context.rb +114 -0
  11. data/lib/spade/runtime/exports.rb +86 -0
  12. data/lib/spade/runtime/loader.rb +209 -0
  13. data/lib/spade/runtime/reactor.rb +159 -0
  14. data/lib/spade/runtime/server.rb +66 -0
  15. data/lib/spade/runtime/shell.rb +36 -0
  16. data/lib/spade/runtime/version.rb +5 -0
  17. data/spade-runtime.gemspec +36 -0
  18. data/spec/cli/update_spec.rb +64 -0
  19. data/spec/javascript/async-test.js +123 -0
  20. data/spec/javascript/compiler/javascript.js +13 -0
  21. data/spec/javascript/compiler/ruby.js +14 -0
  22. data/spec/javascript/loader-test.js +64 -0
  23. data/spec/javascript/normalize-test.js +73 -0
  24. data/spec/javascript/packages-test.js +44 -0
  25. data/spec/javascript/relative-require-test.js +72 -0
  26. data/spec/javascript/require-test.js +117 -0
  27. data/spec/javascript/sandbox/compile.js +37 -0
  28. data/spec/javascript/sandbox/creation.js +44 -0
  29. data/spec/javascript/sandbox/format.js +79 -0
  30. data/spec/javascript/sandbox/misc.js +57 -0
  31. data/spec/javascript/sandbox/preprocessor.js +81 -0
  32. data/spec/javascript/sandbox/require.js +48 -0
  33. data/spec/javascript/sandbox/run-command.js +21 -0
  34. data/spec/javascript/spade/externs.js +14 -0
  35. data/spec/javascript/spade/load-factory.js +15 -0
  36. data/spec/javascript/spade/misc.js +23 -0
  37. data/spec/javascript/spade/ready.js +12 -0
  38. data/spec/javascript/spade/register.js +13 -0
  39. data/spec/javascript_spec.rb +7 -0
  40. data/spec/spec_helper.rb +23 -0
  41. data/spec/support/cli.rb +109 -0
  42. data/spec/support/core_test.rb +61 -0
  43. data/spec/support/matchers.rb +12 -0
  44. data/spec/support/path.rb +62 -0
  45. metadata +218 -0
@@ -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
+
@@ -0,0 +1,21 @@
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 runCommand');
12
+
13
+ // TODO: Add the next 3 tests when adding Ruby and node.js support
14
+ Ct.test('success');
15
+
16
+ Ct.test('failure');
17
+
18
+ Ct.test('not supported');
19
+
20
+ // Not really sure how to test this, other than a bunch of stubbing
21
+ Ct.test('browser');
@@ -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: Spade externs');
11
+
12
+ Ct.test('works');
13
+
14
+
@@ -0,0 +1,15 @@
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: Spade loadFactory');
11
+
12
+ Ct.test('works');
13
+
14
+
15
+
@@ -0,0 +1,23 @@
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: Spade miscellaneous');
11
+
12
+ Ct.test('globalize works');
13
+
14
+ Ct.test('noConflict works');
15
+
16
+ Ct.test('sandbox works');
17
+
18
+ Ct.test('factoryExists works');
19
+
20
+ Ct.test('package works');
21
+
22
+
23
+
@@ -0,0 +1,12 @@
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: Spade ready');
11
+
12
+ Ct.test('works');
@@ -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: Spade miscellaneous');
11
+
12
+ Ct.test('register works');
13
+
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe "Javascript Tests" do
4
+ Dir["#{File.dirname(__FILE__)}/javascript/**/*.js"].each do |path|
5
+ run_core_tests(path)
6
+ end
7
+ end
@@ -0,0 +1,23 @@
1
+ Bundler.require :default, :development
2
+
3
+ require 'support/cli'
4
+ require 'support/core_test'
5
+ require 'support/path'
6
+ require 'support/matchers'
7
+
8
+ RSpec.configure do |config|
9
+ working_dir = Dir.pwd
10
+
11
+ config.include SpecHelpers
12
+
13
+ config.around do |blk|
14
+ reset!
15
+
16
+ blk.call
17
+
18
+ kill!
19
+ Dir.chdir working_dir if Dir.pwd != working_dir
20
+ end
21
+ end
22
+
23
+
@@ -0,0 +1,109 @@
1
+ require 'spade/runtime'
2
+ require 'thor'
3
+
4
+ module SpecHelpers
5
+ attr_reader :stdin, :stdout, :stderr
6
+
7
+ # Dummy wrapper for testing
8
+ class CLI < Thor
9
+ desc "runtime", "Runtime commands"
10
+ subcommand "runtime", Spade::Runtime::CLI::Base
11
+ end
12
+
13
+ def env
14
+ @env ||= {}
15
+ end
16
+
17
+ def unthreaded_spade(*argv)
18
+ opts = Hash === argv.last ? argv.pop : {}
19
+ CLI.start(argv)
20
+ end
21
+
22
+ def spade(*argv)
23
+ opts = Hash === argv.last ? argv.pop : {}
24
+
25
+ kill!
26
+ create_pipes
27
+
28
+ @pid = Process.fork do
29
+ Dir.chdir opts[:chdir] if opts[:chdir]
30
+
31
+ @stdout.close
32
+ STDOUT.reopen @stdout_child
33
+
34
+ @stdin.close
35
+ STDIN.reopen @stdin_child
36
+
37
+ if opts[:track_stderr]
38
+ @stderr.close
39
+ STDERR.reopen @stderr_child
40
+ end
41
+
42
+ env.each do |key, val|
43
+ ENV[key] = val
44
+ end
45
+
46
+ CLI.start(argv)
47
+ end
48
+
49
+ @stdout_child.close
50
+ @stdin_child.close
51
+ @stderr_child.close
52
+ @pid
53
+ end
54
+
55
+ def out_until_block(io = stdout)
56
+ # read 1 first so we wait until the process is done processing the last write
57
+ chars = io.read(1)
58
+
59
+ loop do
60
+ chars << io.read_nonblock(1000)
61
+ sleep 0.05
62
+ end
63
+ rescue Errno::EAGAIN, EOFError
64
+ chars
65
+ end
66
+
67
+ def input(line, opts = {})
68
+ if on = opts[:on]
69
+ should_block_on on
70
+ end
71
+ stdin << "#{line}\n"
72
+ end
73
+
74
+ def wait
75
+ return unless @pid
76
+
77
+ pid, status = Process.wait2(@pid, 0)
78
+
79
+ @exit_status = status
80
+ @pid = nil
81
+ end
82
+
83
+ def exit_status
84
+ wait
85
+ @exit_status
86
+ end
87
+
88
+ def kill!
89
+ Process.kill(9, @pid) if @pid
90
+ end
91
+
92
+ def create_pipes
93
+ @stdout, @stdout_child = IO.pipe
94
+ @stdin_child, @stdin = IO.pipe
95
+ @stderr, @stderr_child = IO.pipe
96
+ end
97
+
98
+ def write_api_key(api_key)
99
+ write_creds("user@example.com", api_key)
100
+ end
101
+
102
+ def write_creds(email, api_key)
103
+ FileUtils.mkdir_p(spade_dir)
104
+ File.open(spade_dir("credentials"), "w") do |file|
105
+ file.write YAML.dump(:spade_api_key => api_key, :spade_email => email)
106
+ end
107
+ end
108
+ end
109
+
@@ -0,0 +1,61 @@
1
+ require 'spade/runtime/context'
2
+
3
+ RSpec::Matchers.define :be_ct_success do
4
+ match do |actual|
5
+ actual.first == 'passed'
6
+ end
7
+
8
+ failure_message_for_should do |actual|
9
+ actual.last
10
+ end
11
+
12
+ failure_message_for_should_not do |actual|
13
+ "expected not to be a success"
14
+ end
15
+
16
+ description do
17
+ "be a success"
18
+ end
19
+ end
20
+
21
+ module RSpecCoreTest
22
+ def run_core_tests(path, &block)
23
+ describe "#{path}" do
24
+ rootdir = File.expand_path(File.join(__FILE__, '/../../../'));
25
+ context = Spade::Runtime::MainContext.new(:rootdir => rootdir) do |ctx|
26
+ ctx['checkRSpec'] = lambda do |status, test_info, message|
27
+ it "#{test_info.module.name}: #{test_info.name}" do
28
+ if status == 'warnings' && message == "Not Yet Implemented"
29
+ pending
30
+ else
31
+ [status.to_s, message.to_s].should be_ct_success
32
+ end
33
+ end
34
+ end
35
+
36
+ ctx.eval <<END
37
+ var Ct;
38
+ try {
39
+ Ct = require('core-test');
40
+ } catch (e) { }
41
+
42
+ if (Ct) {
43
+ RubyLogger = require('core-test/utils').extend(Ct.DefaultLogger, {
44
+ add: function(status, testInfo, message){
45
+ checkRSpec(status, testInfo, message);
46
+ }
47
+ });
48
+ Ct.defaultLogger = new RubyLogger('ruby');
49
+
50
+ require('file:#{path}');
51
+
52
+ Ct.run();
53
+ } else {
54
+ console.log("CoreTest is not installed. Use `spade install core-test`.");
55
+ }
56
+ END
57
+ end
58
+ end
59
+ end
60
+ end
61
+ RSpec::Core::ExampleGroup.extend(RSpecCoreTest)