commonjs-rhino 1.0.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.
- checksums.yaml +7 -0
- data/Gemfile +16 -0
- data/History.txt +3 -0
- data/README.md +64 -0
- data/Rakefile +19 -0
- data/commonjs-rhino.gemspec +19 -0
- data/lib/commonjs-rhino.rb +72 -0
- data/lib/commonjs-rhino/version.rb +5 -0
- data/spec/commonjs-rhino_spec.rb +17 -0
- data/spec/context_spec.rb +48 -0
- data/spec/fixtures/test_module.js +6 -0
- data/spec/fixtures/test_script.js +1 -0
- data/spec/spec_helper.rb +10 -0
- metadata +56 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c4f7640189ccde5551d0a7f169a3110c31277a7d
|
4
|
+
data.tar.gz: 064cf4210d30d3a30327eec3cb0fae93d46e983b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6e03cf89bc2ad65228b490a5030ac90924383d9417001f8a960ca90331862089b0c4424411c115d262578a1398b950cffb75aa33376aec63b5dd9cb104bc5867
|
7
|
+
data.tar.gz: efcced0cee70429a5057d0cf21f33395e7b15a5c9318278758a55ffea7b25f653986658510f49f8059144ff4aaafaf098260d03c3051a69bea8e2ac738db1e10
|
data/Gemfile
ADDED
data/History.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
commonjs-rhino
|
2
|
+
==============
|
3
|
+
|
4
|
+
CommonJs support for Rhino, in Ruby (JRuby specifically). commonjs-rhino allows you to create JavaScript contexts that contain a `require` method you can use to load CommonJs modules.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
`gem install commonjs-rhino`
|
9
|
+
|
10
|
+
Then, require it somewhere in your code:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
require 'commonjs-rhino'
|
14
|
+
```
|
15
|
+
|
16
|
+
Please be aware this gem requires Mozilla's Rhino JavaScript environment, which means Rhino will need to be somewhere in your Java classpath. commonjs-rhino was developed using [jbundler](https://github.com/mkristian/jbundler), which I recommend for Java dependency management. It's pretty easy to set up, here's a quick guide: Run `gem install jbundler`, then add `require 'jbundler'` in your project before any `java_import` statements are executed. In other words, your project should contain these lines in this order:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
require 'jbundler'
|
20
|
+
require 'commonjs-rhino'
|
21
|
+
# require other jbundler-compatible gems
|
22
|
+
```
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
Let's say you have this nice little CommonJs JavaScript module you'd like to use in Rhino. The module exists on disk at `/path/to/camertron/teapot.js`:
|
27
|
+
|
28
|
+
```javascript
|
29
|
+
(function() {
|
30
|
+
module.exports.strVariable = 'foobarbaz';
|
31
|
+
module.exports.func = function() {
|
32
|
+
return "I'm a little teapot";
|
33
|
+
};
|
34
|
+
}).call();
|
35
|
+
```
|
36
|
+
|
37
|
+
Create a commonjs-rhino context, point it at your modules, and require away:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
context = CommonjsRhino.create_context(['/path/to/camertron'])
|
41
|
+
context.eval('var hello = require("camertron/teapot")')
|
42
|
+
context.eval('hello.strVariable') # => 'foobarbaz'
|
43
|
+
```
|
44
|
+
|
45
|
+
It's that easy!
|
46
|
+
|
47
|
+
You can also evaluate files with the handy `eval_file` method:
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
context.eval_file('/path/to/file.js')
|
51
|
+
```
|
52
|
+
|
53
|
+
## Requirements
|
54
|
+
|
55
|
+
1. [JRuby](http://jruby.org/)
|
56
|
+
2. [Rhino](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino) in your classpath (see above).
|
57
|
+
|
58
|
+
## Running Tests
|
59
|
+
|
60
|
+
`bundle exec rspec` should do the trick :)
|
61
|
+
|
62
|
+
## Authors
|
63
|
+
|
64
|
+
* Cameron C. Dutro: http://github.com/camertron
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
4
|
+
|
5
|
+
require 'bundler'
|
6
|
+
require 'jbundler'
|
7
|
+
require 'rspec/core/rake_task'
|
8
|
+
require 'rubygems/package_task'
|
9
|
+
|
10
|
+
require './lib/commonjs-rhino'
|
11
|
+
|
12
|
+
Bundler::GemHelper.install_tasks
|
13
|
+
|
14
|
+
task :default => :spec
|
15
|
+
|
16
|
+
desc 'Run specs'
|
17
|
+
RSpec::Core::RakeTask.new do |t|
|
18
|
+
t.pattern = './spec/**/*_spec.rb'
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), 'lib')
|
2
|
+
require 'commonjs-rhino/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "commonjs-rhino"
|
6
|
+
s.version = ::CommonjsRhino::VERSION
|
7
|
+
s.authors = ["Cameron Dutro"]
|
8
|
+
s.email = ["camertron@gmail.com"]
|
9
|
+
s.homepage = "http://github.com/camertron"
|
10
|
+
|
11
|
+
s.description = s.summary = "CommonJS support for Rhino, in Ruby."
|
12
|
+
s.requirements << "jar 'org.mozilla:rhino', '1.7R4'"
|
13
|
+
|
14
|
+
s.platform = Gem::Platform::RUBY
|
15
|
+
s.has_rdoc = true
|
16
|
+
|
17
|
+
s.require_path = 'lib'
|
18
|
+
s.files = Dir["{lib,spec}/**/*", "Gemfile", "History.txt", "README.md", "Rakefile", "commonjs-rhino.gemspec"]
|
19
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'java'
|
4
|
+
|
5
|
+
java_import 'java.io.FileReader'
|
6
|
+
java_import 'org.mozilla.javascript.commonjs.module.ModuleScriptProvider'
|
7
|
+
java_import 'org.mozilla.javascript.commonjs.module.provider.ModuleSourceProvider'
|
8
|
+
java_import 'org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider'
|
9
|
+
java_import 'org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider'
|
10
|
+
java_import 'org.mozilla.javascript.commonjs.module.Require'
|
11
|
+
java_import 'org.mozilla.javascript.commonjs.module.RequireBuilder'
|
12
|
+
|
13
|
+
# http://stackoverflow.com/questions/11074836/resolving-modules-using-require-js-and-java-rhino
|
14
|
+
module CommonjsRhino
|
15
|
+
class Context
|
16
|
+
attr_reader :rhino_context, :shared_scope, :require_base_paths
|
17
|
+
|
18
|
+
def initialize(shared_scope, require_base_paths)
|
19
|
+
@shared_scope = shared_scope
|
20
|
+
@require_base_paths = require_base_paths
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def eval_file(file)
|
25
|
+
with_context do |context|
|
26
|
+
context.evaluateReader(
|
27
|
+
shared_scope, FileReader.new(file), nil, 1, nil
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def eval(str)
|
33
|
+
with_context do |context|
|
34
|
+
context.evaluateString(shared_scope, str, nil, 1, nil)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def with_context
|
41
|
+
context = Java::OrgMozillaJavascript::Context.enter
|
42
|
+
yield context
|
43
|
+
ensure
|
44
|
+
context.java_send(:exit)
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.create_context(require_base_paths = [Dir.getwd])
|
50
|
+
require_base_paths = Array(require_base_paths)
|
51
|
+
|
52
|
+
source_provider = UrlModuleSourceProvider.new(
|
53
|
+
require_base_paths.map do |base_path|
|
54
|
+
Java::JavaNet::URI.new("file://#{base_path}")
|
55
|
+
end, nil
|
56
|
+
)
|
57
|
+
|
58
|
+
script_provider = SoftCachingModuleScriptProvider.new(source_provider)
|
59
|
+
|
60
|
+
builder = RequireBuilder.new
|
61
|
+
.setModuleScriptProvider(script_provider)
|
62
|
+
.setSandboxed(false)
|
63
|
+
|
64
|
+
context = Java::OrgMozillaJavascript::Context.enter
|
65
|
+
top_level_scope = context.initStandardObjects()
|
66
|
+
req = builder.createRequire(context, top_level_scope)
|
67
|
+
req.install(top_level_scope)
|
68
|
+
context.java_send(:exit)
|
69
|
+
|
70
|
+
CommonjsRhino::Context.new(top_level_scope, require_base_paths)
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe CommonjsRhino do
|
6
|
+
let(:rhino) { CommonjsRhino }
|
7
|
+
let(:privileged_uris) { [File.expand_path('../', __FILE__)] }
|
8
|
+
|
9
|
+
describe '#create_context' do
|
10
|
+
it 'returns a context object' do
|
11
|
+
rhino.create_context(privileged_uris).tap do |context|
|
12
|
+
expect(context).to respond_to(:eval)
|
13
|
+
expect(context).to respond_to(:eval_file)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe CommonjsRhino::Context do
|
6
|
+
let(:rhino) { CommonjsRhino }
|
7
|
+
|
8
|
+
# Privileged URIs are like a load path, except that the last
|
9
|
+
# part of the path must also be used when requiring the module.
|
10
|
+
let(:privileged_uris) { [File.expand_path('../fixtures', __FILE__)] }
|
11
|
+
|
12
|
+
# Notice the module here has to include a prefix of 'fixtures/'
|
13
|
+
# even though the path we added above ends with the same.
|
14
|
+
let(:test_module) { 'fixtures/test_module' }
|
15
|
+
|
16
|
+
# Any scripts you load from disk should be referenced via paths,
|
17
|
+
# not via module syntax (i.e. include file extensions, etc)
|
18
|
+
let(:test_script) { File.expand_path('../fixtures/test_script.js', __FILE__) }
|
19
|
+
|
20
|
+
before(:each) do
|
21
|
+
@context = rhino.create_context(privileged_uris)
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#eval' do
|
25
|
+
it 'evaluates javascript code' do
|
26
|
+
expect(@context.eval('1 + 2 + 3')).to eq(6)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'supports loading modules' do
|
30
|
+
@context.eval("var foo = require('#{test_module}');")
|
31
|
+
expect(@context.eval('foo.strVariable;')).to eq('foobarbaz')
|
32
|
+
expect(@context.eval('foo.func();')).to eq("I'm a little teapot")
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'does not allow modules to be loaded from non-privileged uris' do
|
36
|
+
expect(
|
37
|
+
lambda { @context.eval("var foo = require('non/existent');") }
|
38
|
+
).to raise_error(Java::OrgMozillaJavascript::JavaScriptException)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#eval_file' do
|
43
|
+
it 'loads and interprets a file' do
|
44
|
+
@context.eval_file(test_script)
|
45
|
+
expect(@context.eval('hello')).to eq('world')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
var hello = 'world';
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: commonjs-rhino
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cameron Dutro
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-04 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: CommonJS support for Rhino, in Ruby.
|
14
|
+
email:
|
15
|
+
- camertron@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- Gemfile
|
21
|
+
- History.txt
|
22
|
+
- README.md
|
23
|
+
- Rakefile
|
24
|
+
- commonjs-rhino.gemspec
|
25
|
+
- lib/commonjs-rhino.rb
|
26
|
+
- lib/commonjs-rhino/version.rb
|
27
|
+
- spec/commonjs-rhino_spec.rb
|
28
|
+
- spec/context_spec.rb
|
29
|
+
- spec/fixtures/test_module.js
|
30
|
+
- spec/fixtures/test_script.js
|
31
|
+
- spec/spec_helper.rb
|
32
|
+
homepage: http://github.com/camertron
|
33
|
+
licenses: []
|
34
|
+
metadata: {}
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options: []
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
requirements:
|
50
|
+
- jar 'org.mozilla:rhino', '1.7R4'
|
51
|
+
rubyforge_project:
|
52
|
+
rubygems_version: 2.2.2
|
53
|
+
signing_key:
|
54
|
+
specification_version: 4
|
55
|
+
summary: CommonJS support for Rhino, in Ruby.
|
56
|
+
test_files: []
|