commonjs 0.0.1 → 0.1.0
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/.gitmodules +3 -0
- data/Rakefile +5 -0
- data/commonjs.gemspec +4 -0
- data/lib/commonjs.rb +2 -1
- data/lib/commonjs/environment.rb +53 -0
- data/lib/commonjs/module.rb +47 -0
- data/lib/commonjs/version.rb +1 -1
- data/spec/commonjs/environment_spec.rb +36 -0
- data/spec/spec_helper.rb +3 -0
- metadata +63 -44
data/.gitmodules
ADDED
data/Rakefile
CHANGED
data/commonjs.gemspec
CHANGED
@@ -14,4 +14,8 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.name = "commonjs"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = CommonJS::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency "rake"
|
19
|
+
gem.add_development_dependency "rspec"
|
20
|
+
gem.add_development_dependency "therubyracer", ">= 0.10.0beta1"
|
17
21
|
end
|
data/lib/commonjs.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
module CommonJS
|
3
|
+
class Environment
|
4
|
+
|
5
|
+
attr_reader :runtime
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@runtime = choose
|
9
|
+
@path = Pathname(options[:path])
|
10
|
+
@modules = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def require(module_id)
|
14
|
+
unless mod = @modules[module_id]
|
15
|
+
filepath = find(module_id) or fail LoadError, "no such module '#{module_id}'"
|
16
|
+
load = @runtime.eval("(function(require, exports) {#{File.read(filepath)}})", filepath.expand_path)
|
17
|
+
@modules[module_id] = mod = Module.new(module_id, self)
|
18
|
+
load.call(mod.require_function, mod.exports)
|
19
|
+
end
|
20
|
+
return mod.exports
|
21
|
+
end
|
22
|
+
|
23
|
+
def native(module_id, impl)
|
24
|
+
@modules[module_id] = Module::Native.new(impl)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def choose
|
30
|
+
RubyRacerRuntime.new
|
31
|
+
end
|
32
|
+
|
33
|
+
def find(module_id)
|
34
|
+
filepath = @path.join("#{module_id}.js")
|
35
|
+
filepath if filepath.exist?
|
36
|
+
end
|
37
|
+
|
38
|
+
class RubyRacerRuntime
|
39
|
+
def initialize
|
40
|
+
require 'v8'
|
41
|
+
@context = V8::Context.new
|
42
|
+
end
|
43
|
+
|
44
|
+
def new_object
|
45
|
+
@context['Object'].new
|
46
|
+
end
|
47
|
+
|
48
|
+
def eval(source, path)
|
49
|
+
@context.eval(source, path)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
module CommonJS
|
3
|
+
class Module
|
4
|
+
|
5
|
+
attr_reader :exports
|
6
|
+
|
7
|
+
def initialize(id, env)
|
8
|
+
@id = id
|
9
|
+
@env = env
|
10
|
+
@exports = env.runtime.new_object
|
11
|
+
@segments = id.split('/')
|
12
|
+
end
|
13
|
+
|
14
|
+
def require_function
|
15
|
+
@require_function ||= lambda do |this, module_id|
|
16
|
+
@env.require(expand(module_id))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def expand(module_id)
|
23
|
+
return module_id unless module_id =~ /(\.|\..)/
|
24
|
+
module_id.split('/').inject(@segments[0..-2]) do |path, element|
|
25
|
+
path.tap do
|
26
|
+
if element == '.'
|
27
|
+
#do nothing
|
28
|
+
elsif element == '..'
|
29
|
+
path.pop
|
30
|
+
else
|
31
|
+
path.push element
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end.join('/')
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
class Native
|
39
|
+
|
40
|
+
attr_reader :exports
|
41
|
+
|
42
|
+
def initialize(impl)
|
43
|
+
@exports = impl
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/commonjs/version.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CommonJS::Environment do
|
4
|
+
|
5
|
+
describe "modules 1.0" do
|
6
|
+
|
7
|
+
def self.make_before(path)
|
8
|
+
proc do
|
9
|
+
@env = CommonJS::Environment.new(:path => path)
|
10
|
+
@env.native('system', QuietSystem.new)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
tests = Pathname(__FILE__).dirname.join('../ext/commonjs/tests/modules/1.0')
|
15
|
+
tests.entries.each do |path|
|
16
|
+
next if ['.','..'].include?(path.to_s)
|
17
|
+
|
18
|
+
describe path do
|
19
|
+
before(&make_before(tests.join(path)))
|
20
|
+
|
21
|
+
it "...yup." do
|
22
|
+
@env.require('program')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class QuietSystem
|
29
|
+
def stdio
|
30
|
+
self
|
31
|
+
end
|
32
|
+
def print(*args)
|
33
|
+
# puts args.join('')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,74 +1,93 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: commonjs
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Charles Lowell
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
date: 2011-10-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &2152591120 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2152591120
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &2152590620 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2152590620
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: therubyracer
|
38
|
+
requirement: &2152590020 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.10.0beta1
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2152590020
|
22
47
|
description: Host CommonJS JavaScript environments in Ruby
|
23
|
-
email:
|
48
|
+
email:
|
24
49
|
- cowboyd@thefrontside.net
|
25
50
|
executables: []
|
26
|
-
|
27
51
|
extensions: []
|
28
|
-
|
29
52
|
extra_rdoc_files: []
|
30
|
-
|
31
|
-
files:
|
53
|
+
files:
|
32
54
|
- .gitignore
|
55
|
+
- .gitmodules
|
33
56
|
- Gemfile
|
34
57
|
- README.md
|
35
58
|
- Rakefile
|
36
59
|
- commonjs.gemspec
|
37
60
|
- lib/commonjs.rb
|
61
|
+
- lib/commonjs/environment.rb
|
62
|
+
- lib/commonjs/module.rb
|
38
63
|
- lib/commonjs/version.rb
|
39
|
-
|
64
|
+
- spec/commonjs/environment_spec.rb
|
65
|
+
- spec/spec_helper.rb
|
40
66
|
homepage: http://github.com/cowboyd/commonjs
|
41
67
|
licenses: []
|
42
|
-
|
43
68
|
post_install_message:
|
44
69
|
rdoc_options: []
|
45
|
-
|
46
|
-
require_paths:
|
70
|
+
require_paths:
|
47
71
|
- lib
|
48
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
73
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
54
|
-
|
55
|
-
- 0
|
56
|
-
version: "0"
|
57
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
79
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
|
63
|
-
segments:
|
64
|
-
- 0
|
65
|
-
version: "0"
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
66
84
|
requirements: []
|
67
|
-
|
68
85
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.
|
86
|
+
rubygems_version: 1.8.10
|
70
87
|
signing_key:
|
71
88
|
specification_version: 3
|
72
|
-
summary: Provide access to your Ruby and Operating System runtime via the commonjs
|
73
|
-
|
74
|
-
|
89
|
+
summary: Provide access to your Ruby and Operating System runtime via the commonjs
|
90
|
+
API
|
91
|
+
test_files:
|
92
|
+
- spec/commonjs/environment_spec.rb
|
93
|
+
- spec/spec_helper.rb
|