render_execjs 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,4 +2,5 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
- .idea
5
+ .idea
6
+ tmp*
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise "rails31" do
2
+ gem "rails", "3.1.3"
3
+ end
4
+
5
+ appraise "rails32" do
6
+ gem "rails", "3.2.1"
7
+ end
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # render_execjs #
2
+
3
+ Render executable JavaScript within Rails.
4
+
5
+ ## Installation ##
6
+
7
+ Add `render_execjs` to your `Gemfile`
8
+
9
+ gem 'render_execjs', '~> 0.0.1'
10
+ # gem 'coffee-script' # Uncomment this line if you'd like to render executable CoffeeScript
11
+
12
+ Run the `render_execjs:install` generator to create the optional configuration initializer file
13
+
14
+ rails generate render_execjs:install
15
+
16
+ ## Usage ##
17
+
18
+ In your controller:
19
+
20
+ render execjs: "return 'some JavaScript';"
21
+
22
+ It also supports CoffeeScript!
23
+
24
+ render execcs: "return 'some CoffeeScript'"
25
+
26
+ That's it!
27
+
28
+ Note that it will render whatever is returned from JavaScript.
29
+
30
+ ## Why would I want to render JavaScript from Rails? ##
31
+
32
+ Make sure that you're logged into your Twitter, now click on this link: [http://twitter.com/tazsingh](http://twitter.com/tazsingh)
33
+ Notice how it loads your Twitter first, then the page that you've requested?
34
+
35
+ It has to initialize the JavaScript environment before it can render the page you've requested.
36
+ A solution to this, in Rails, is to use something like Mustache to render the same structure but with different logic;
37
+ thus giving the browser the page you've requested as the base to initialize from.
38
+ However this means duplication of logic.
39
+
40
+ Wouldn't it be nice to write logic and structure once, using a pretty templating system, that works on both client and server?
41
+
42
+ This is the problem that `render_execjs` is attempting to solve. Note that this is an experiment and suggestions are welcome!
43
+
44
+ ## Testing ##
45
+
46
+ `render_execjs` currently uses [Appraisal](https://github.com/thoughtbot/appraisal) to test against multiple versions of Rails.
47
+ Install it with: `rake appraisal:install`
48
+
49
+ Now you can run:
50
+
51
+ rake appraisal spec # To run specs against both Rails 3.1 and 3.2
52
+ rake appraisal:rails31 spec # To test against Rails 3.1
53
+ rake appraisal:rails32 spec # To test against Rails 3.2
54
+
55
+ Note that the testing system is currently undergoing an overhaul, so the above will change.
56
+
57
+ ## License ##
58
+
59
+ MIT
data/Rakefile CHANGED
@@ -1 +1,9 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
1
3
  require "bundler/gem_tasks"
4
+ require "appraisal"
5
+ require "rspec/core/rake_task"
6
+
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ t.ruby_opts = %w[-w]
9
+ end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rails", "3.1.3"
6
+
7
+ gemspec :path=>"../"
@@ -0,0 +1,124 @@
1
+ PATH
2
+ remote: /Users/tsingh/RubymineProjects/render_execjs
3
+ specs:
4
+ render_execjs (0.0.1)
5
+ execjs
6
+ rails (>= 3.1.3)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ actionmailer (3.1.3)
12
+ actionpack (= 3.1.3)
13
+ mail (~> 2.3.0)
14
+ actionpack (3.1.3)
15
+ activemodel (= 3.1.3)
16
+ activesupport (= 3.1.3)
17
+ builder (~> 3.0.0)
18
+ erubis (~> 2.7.0)
19
+ i18n (~> 0.6)
20
+ rack (~> 1.3.5)
21
+ rack-cache (~> 1.1)
22
+ rack-mount (~> 0.8.2)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.0.3)
25
+ activemodel (3.1.3)
26
+ activesupport (= 3.1.3)
27
+ builder (~> 3.0.0)
28
+ i18n (~> 0.6)
29
+ activerecord (3.1.3)
30
+ activemodel (= 3.1.3)
31
+ activesupport (= 3.1.3)
32
+ arel (~> 2.2.1)
33
+ tzinfo (~> 0.3.29)
34
+ activeresource (3.1.3)
35
+ activemodel (= 3.1.3)
36
+ activesupport (= 3.1.3)
37
+ activesupport (3.1.3)
38
+ multi_json (~> 1.0)
39
+ appraisal (0.4.0)
40
+ bundler
41
+ rake
42
+ arel (2.2.1)
43
+ builder (3.0.0)
44
+ coffee-script (2.2.0)
45
+ coffee-script-source
46
+ execjs
47
+ coffee-script-source (1.2.0)
48
+ diff-lcs (1.1.3)
49
+ erubis (2.7.0)
50
+ execjs (1.3.0)
51
+ multi_json (~> 1.0)
52
+ hike (1.2.1)
53
+ i18n (0.6.0)
54
+ json (1.6.5)
55
+ json (1.6.5-java)
56
+ mail (2.3.0)
57
+ i18n (>= 0.4.0)
58
+ mime-types (~> 1.16)
59
+ treetop (~> 1.4.8)
60
+ mime-types (1.17.2)
61
+ multi_json (1.0.4)
62
+ polyglot (0.3.3)
63
+ rack (1.3.6)
64
+ rack-cache (1.1)
65
+ rack (>= 0.4)
66
+ rack-mount (0.8.3)
67
+ rack (>= 1.0.0)
68
+ rack-ssl (1.3.2)
69
+ rack
70
+ rack-test (0.6.1)
71
+ rack (>= 1.0)
72
+ rails (3.1.3)
73
+ actionmailer (= 3.1.3)
74
+ actionpack (= 3.1.3)
75
+ activerecord (= 3.1.3)
76
+ activeresource (= 3.1.3)
77
+ activesupport (= 3.1.3)
78
+ bundler (~> 1.0)
79
+ railties (= 3.1.3)
80
+ railties (3.1.3)
81
+ actionpack (= 3.1.3)
82
+ activesupport (= 3.1.3)
83
+ rack-ssl (~> 1.3.2)
84
+ rake (>= 0.8.7)
85
+ rdoc (~> 3.4)
86
+ thor (~> 0.14.6)
87
+ rake (0.9.2.2)
88
+ rdoc (3.12)
89
+ json (~> 1.4)
90
+ rspec (2.8.0)
91
+ rspec-core (~> 2.8.0)
92
+ rspec-expectations (~> 2.8.0)
93
+ rspec-mocks (~> 2.8.0)
94
+ rspec-core (2.8.0)
95
+ rspec-expectations (2.8.0)
96
+ diff-lcs (~> 1.1.2)
97
+ rspec-mocks (2.8.0)
98
+ rspec-rails (2.8.1)
99
+ actionpack (>= 3.0)
100
+ activesupport (>= 3.0)
101
+ railties (>= 3.0)
102
+ rspec (~> 2.8.0)
103
+ sprockets (2.0.3)
104
+ hike (~> 1.2)
105
+ rack (~> 1.0)
106
+ tilt (~> 1.1, != 1.3.0)
107
+ thor (0.14.6)
108
+ tilt (1.3.3)
109
+ treetop (1.4.10)
110
+ polyglot
111
+ polyglot (>= 0.3.1)
112
+ tzinfo (0.3.31)
113
+
114
+ PLATFORMS
115
+ java
116
+ ruby
117
+
118
+ DEPENDENCIES
119
+ appraisal
120
+ coffee-script
121
+ rails (= 3.1.3)
122
+ render_execjs!
123
+ rspec
124
+ rspec-rails
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "rails", "3.2.1"
6
+
7
+ gemspec :path=>"../"
@@ -0,0 +1,122 @@
1
+ PATH
2
+ remote: /Users/tsingh/RubymineProjects/render_execjs
3
+ specs:
4
+ render_execjs (0.0.1)
5
+ execjs
6
+ rails (>= 3.1.3)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ actionmailer (3.2.1)
12
+ actionpack (= 3.2.1)
13
+ mail (~> 2.4.0)
14
+ actionpack (3.2.1)
15
+ activemodel (= 3.2.1)
16
+ activesupport (= 3.2.1)
17
+ builder (~> 3.0.0)
18
+ erubis (~> 2.7.0)
19
+ journey (~> 1.0.1)
20
+ rack (~> 1.4.0)
21
+ rack-cache (~> 1.1)
22
+ rack-test (~> 0.6.1)
23
+ sprockets (~> 2.1.2)
24
+ activemodel (3.2.1)
25
+ activesupport (= 3.2.1)
26
+ builder (~> 3.0.0)
27
+ activerecord (3.2.1)
28
+ activemodel (= 3.2.1)
29
+ activesupport (= 3.2.1)
30
+ arel (~> 3.0.0)
31
+ tzinfo (~> 0.3.29)
32
+ activeresource (3.2.1)
33
+ activemodel (= 3.2.1)
34
+ activesupport (= 3.2.1)
35
+ activesupport (3.2.1)
36
+ i18n (~> 0.6)
37
+ multi_json (~> 1.0)
38
+ appraisal (0.4.0)
39
+ bundler
40
+ rake
41
+ arel (3.0.0)
42
+ builder (3.0.0)
43
+ coffee-script (2.2.0)
44
+ coffee-script-source
45
+ execjs
46
+ coffee-script-source (1.2.0)
47
+ diff-lcs (1.1.3)
48
+ erubis (2.7.0)
49
+ execjs (1.3.0)
50
+ multi_json (~> 1.0)
51
+ hike (1.2.1)
52
+ i18n (0.6.0)
53
+ journey (1.0.1)
54
+ json (1.6.5)
55
+ json (1.6.5-java)
56
+ mail (2.4.1)
57
+ i18n (>= 0.4.0)
58
+ mime-types (~> 1.16)
59
+ treetop (~> 1.4.8)
60
+ mime-types (1.17.2)
61
+ multi_json (1.0.4)
62
+ polyglot (0.3.3)
63
+ rack (1.4.1)
64
+ rack-cache (1.1)
65
+ rack (>= 0.4)
66
+ rack-ssl (1.3.2)
67
+ rack
68
+ rack-test (0.6.1)
69
+ rack (>= 1.0)
70
+ rails (3.2.1)
71
+ actionmailer (= 3.2.1)
72
+ actionpack (= 3.2.1)
73
+ activerecord (= 3.2.1)
74
+ activeresource (= 3.2.1)
75
+ activesupport (= 3.2.1)
76
+ bundler (~> 1.0)
77
+ railties (= 3.2.1)
78
+ railties (3.2.1)
79
+ actionpack (= 3.2.1)
80
+ activesupport (= 3.2.1)
81
+ rack-ssl (~> 1.3.2)
82
+ rake (>= 0.8.7)
83
+ rdoc (~> 3.4)
84
+ thor (~> 0.14.6)
85
+ rake (0.9.2.2)
86
+ rdoc (3.12)
87
+ json (~> 1.4)
88
+ rspec (2.8.0)
89
+ rspec-core (~> 2.8.0)
90
+ rspec-expectations (~> 2.8.0)
91
+ rspec-mocks (~> 2.8.0)
92
+ rspec-core (2.8.0)
93
+ rspec-expectations (2.8.0)
94
+ diff-lcs (~> 1.1.2)
95
+ rspec-mocks (2.8.0)
96
+ rspec-rails (2.8.1)
97
+ actionpack (>= 3.0)
98
+ activesupport (>= 3.0)
99
+ railties (>= 3.0)
100
+ rspec (~> 2.8.0)
101
+ sprockets (2.1.2)
102
+ hike (~> 1.2)
103
+ rack (~> 1.0)
104
+ tilt (~> 1.1, != 1.3.0)
105
+ thor (0.14.6)
106
+ tilt (1.3.3)
107
+ treetop (1.4.10)
108
+ polyglot
109
+ polyglot (>= 0.3.1)
110
+ tzinfo (0.3.31)
111
+
112
+ PLATFORMS
113
+ java
114
+ ruby
115
+
116
+ DEPENDENCIES
117
+ appraisal
118
+ coffee-script
119
+ rails (= 3.2.1)
120
+ render_execjs!
121
+ rspec
122
+ rspec-rails
@@ -0,0 +1,12 @@
1
+ module RenderExecjs
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../../templates', __FILE__)
5
+
6
+ desc 'Installs RenderExecJS'
7
+ def copy_initializer
8
+ template "render_execjs.rb", "config/initializers/render_execjs.rb"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ RenderExecJS.configure do
2
+ # Add your RenderExecJS configuration here
3
+
4
+ # Execute JS within environment from Sprockets
5
+ # compile_with :sprockets_require_tag
6
+
7
+ # Execute JS within environment from File
8
+ # compile_with File.read("")
9
+
10
+ # Execute JS within environment from String
11
+ # compile_with <<-JS
12
+ # // do stuff
13
+ # JS
14
+ end
15
+
16
+ # Alternate setter syntax
17
+ # RenderExecJS.compile_with # value
18
+ # or
19
+ # RenderExecJS.compile_with = # value
20
+
21
+ # Alternate getter syntax
22
+ # RenderExecJS.compile_with # => value
@@ -0,0 +1,40 @@
1
+ module RenderExecJS
2
+ module Configuration
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ add_config :environment, :with => "RenderExecJS::Renderer.environment"
7
+ add_setter :coffeescript_environment, :with => "RenderExecJS::Renderer.coffeescript_environment"
8
+ end
9
+
10
+ module ClassMethods
11
+ def configure &block
12
+ instance_exec &block
13
+ end
14
+
15
+ private
16
+ def add_config name, options = {}
17
+ options[:with] ||= "@@#{name}"
18
+
19
+ class_eval <<-RUBY
20
+ class << self
21
+ def #{name} new_#{name} #{'= nil' unless options[:setter]}
22
+ #{options[:with]} = new_#{name} #{"unless new_#{name}.nil?" unless options[:setter]}
23
+ #{options[:with] unless options[:setter]}
24
+ end
25
+
26
+ def #{name}= new_#{name}
27
+ #{options[:with]} = new_#{name}
28
+ end
29
+ end
30
+ RUBY
31
+
32
+ send "#{name}=", nil
33
+ end
34
+
35
+ def add_setter name, options = {}
36
+ add_config name, {:setter => true}.merge(options)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ module RenderExecJS
2
+ class Railtie < ::Rails::Railtie
3
+ initializer "render_execjs.setup" do
4
+ ActionController::Renderers.add :execjs do |obj, options|
5
+ RenderExecJS::Renderer.exec obj
6
+ end
7
+
8
+ if defined? CoffeeScript
9
+ ActionController::Renderers.add :execcs do |obj, options|
10
+ RenderExecJS::Renderer.exec obj, :coffee_script => true
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ module RenderExecJS
2
+ class Renderer
3
+ class << self
4
+ def environment
5
+ @environment
6
+ end
7
+
8
+ def environment= new_environment
9
+ @context = nil
10
+ @environment = new_environment
11
+ end
12
+
13
+ def coffeescript_environment= new_environment
14
+ if defined? CoffeeScript
15
+ @context = nil
16
+ @environment = CoffeeScript.compile new_environment, :bare => true
17
+ elsif !new_environment.blank?
18
+ puts "Can't find CoffeeScript. Did you forget to add it to your Gemfile?"
19
+ end
20
+ end
21
+
22
+ def exec js, options = {}
23
+ if options[:coffee_script]
24
+ js = CoffeeScript.compile js, :bare => true
25
+ end
26
+
27
+ context.exec js
28
+ end
29
+
30
+ def call func, *args
31
+ context.call func, *args
32
+ end
33
+
34
+ private
35
+ def context
36
+ @context ||= ExecJS.compile environment
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module RenderExecJS
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/render_execjs.rb CHANGED
@@ -1,5 +1,12 @@
1
+ require "active_support/concern"
2
+
3
+ require "execjs"
4
+
5
+ require "render_execjs/configuration"
6
+ require "render_execjs/renderer"
7
+ require "render_execjs/railtie"
1
8
  require "render_execjs/version"
2
9
 
3
10
  module RenderExecJS
4
- # Your code goes here...
5
- end
11
+ include Configuration
12
+ end
@@ -18,8 +18,11 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency "rails", ">= 3.1.3"
22
- s.add_dependency "execjs"
21
+ s.add_runtime_dependency "rails", ">= 3.1.3"
22
+ s.add_runtime_dependency "execjs"
23
23
 
24
24
  s.add_development_dependency "rspec"
25
+ s.add_development_dependency "rspec-rails"
26
+ s.add_development_dependency "coffee-script"
27
+ s.add_development_dependency "appraisal"
25
28
  end
@@ -0,0 +1,94 @@
1
+ require 'helper'
2
+
3
+ module RenderExecJS
4
+ describe Configuration do
5
+ it "should support a configure block" do
6
+ expect do
7
+ RenderExecJS.configure do
8
+ end
9
+ end.should_not raise_error
10
+ end
11
+
12
+ it "should get and set the environment in the configure block" do
13
+ expect do
14
+ RenderExecJS.configure do
15
+ self.environment = "'the environment!'"
16
+ end
17
+ end.should_not raise_error
18
+
19
+ RenderExecJS.configure do
20
+ self.environment.should == "'the environment!'"
21
+ end
22
+ end
23
+
24
+ it "should allow no 'self.' or equal sign when setting the environment in a configure block" do
25
+ expect do
26
+ RenderExecJS.configure do
27
+ environment "'some environment'"
28
+ end
29
+ end.should_not raise_error
30
+
31
+ RenderExecJS.configure do
32
+ self.environment.should == "'some environment'"
33
+ end
34
+ end
35
+
36
+ it "should allow configuration of the environment outside of a configuration block" do
37
+ expect do
38
+ RenderExecJS.environment = "'a environment!'"
39
+ end.should_not raise_error
40
+
41
+ RenderExecJS.environment.should == "'a environment!'"
42
+
43
+ expect do
44
+ RenderExecJS.environment "'another environment!'"
45
+ end.should_not raise_error
46
+
47
+ RenderExecJS.environment.should == "'another environment!'"
48
+ end
49
+
50
+ it "should be a proxy to Renderer for the environment" do
51
+ RenderExecJS.environment = "'some env'"
52
+ RenderExecJS::Renderer.environment.should == "'some env'"
53
+
54
+ RenderExecJS.configure do
55
+ environment "'another env'"
56
+ end
57
+
58
+ RenderExecJS::Renderer.environment.should == "'another env'"
59
+ end
60
+
61
+ it "should only set coffeescript_environment" do
62
+ expect do
63
+ RenderExecJS.coffeescript_environment = '"#{"a"} coffee #{"environment"}"'
64
+ end.should_not raise_error
65
+
66
+ expect do
67
+ RenderExecJS.coffeescript_environment '"#{"a"} coffeescript #{"environment"}"'
68
+ end.should_not raise_error
69
+
70
+ expect do
71
+ RenderExecJS.configure do
72
+ coffeescript_environment '"#{"another"} coffee #{"environment"}"'
73
+ end
74
+ end.should_not raise_error
75
+
76
+ expect do
77
+ RenderExecJS.coffeescript_environment
78
+ end.should raise_error
79
+
80
+ expect do
81
+ RenderExecJS.configure do
82
+ self.coffeescript_environment
83
+ end
84
+ end.should raise_error
85
+ end
86
+
87
+ it "should proxy coffeescript_environment to Renderer" do
88
+ RenderExecJS::Renderer.environment = nil
89
+
90
+ RenderExecJS.coffeescript_environment = '"#{"some"} coffeescript #{"environment"}"'
91
+ RenderExecJS::Renderer.environment.should_not == nil
92
+ end
93
+ end
94
+ end
data/spec/helper.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'rails'
5
+ require 'render_execjs'
6
+ require 'coffee-script'
7
+
8
+ require 'tmpdir'
9
+ require 'fileutils'
10
+
11
+ $gem_options = {}
12
+ possible_dev_dependencies = %w[rails execjs coffeescript]
13
+ Bundler.load.specs.each do |s|
14
+ if possible_dev_dependencies.include? s.name
15
+ $gem_options[s.name] = {
16
+ :version => s.version.to_s
17
+ }.tap do |hash|
18
+ hash[:path] = s.full_gem_path if File.exists?("#{s.full_gem_path}/#{s.name}.gemspec")
19
+ end
20
+ end
21
+ end
22
+
23
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each do |f|
24
+ require f
25
+ end
26
+
27
+ RSpec.configure do |config|
28
+ config.include RenderExecJS::Helpers
29
+ end
@@ -0,0 +1,19 @@
1
+ require 'helper'
2
+
3
+ describe "Install Generator" do
4
+ before :all do
5
+ create_rails_project
6
+ end
7
+
8
+ after :all do
9
+ delete_rails_project
10
+ end
11
+
12
+ it "adds the configuration file" do
13
+ file = "#{rails_project_dir}/config/initializers/render_execjs.rb"
14
+
15
+ File.exists?(file).should == false
16
+ run_cmd "rails generate render_execjs:install"
17
+ File.exists?(file).should == true
18
+ end
19
+ end
@@ -0,0 +1,79 @@
1
+ require 'helper'
2
+
3
+ module RenderExecJS
4
+ describe Renderer do
5
+ it "should execute simple JavaScript" do
6
+ Renderer.exec("return 'hello!';").should == "hello!"
7
+ end
8
+
9
+ it "should execute JavaScript in the context of environment" do
10
+ RenderExecJS.environment = "var a = 'hi there';"
11
+
12
+ Renderer.exec("return a;").should == "hi there"
13
+ end
14
+
15
+ it "should render correctly when environment is changed" do
16
+ RenderExecJS.environment = "var a = 'hi there';"
17
+ Renderer.exec("return a;").should == "hi there"
18
+
19
+ RenderExecJS.environment = "var b = 'oh hai';"
20
+ Renderer.exec("return b;").should == "oh hai"
21
+ end
22
+
23
+ it "should call a function in the environment" do
24
+ RenderExecJS.environment = <<-JS
25
+ function add_three(first, second, third) {
26
+ return first + second + third;
27
+ }
28
+ JS
29
+
30
+ Renderer.call("add_three", 1, 2, 3).should == 6
31
+ Renderer.call("add_three", "lol", "cat", "!").should == "lolcat!"
32
+ Renderer.exec("return add_three(
33
+ add_three('l','o','l'),
34
+ add_three('c','a','t'),
35
+ add_three('!',1,'!'));").should == "lolcat!1!"
36
+ end
37
+
38
+ it "should raise an error when a function is not in the environment" do
39
+ RenderExecJS.environment = <<-JS
40
+ function add_three(first, second, third) {
41
+ return first + second + third;
42
+ }
43
+ JS
44
+
45
+ expect do
46
+ Renderer.call "add_four", 1, 2, 3, 4
47
+ end.to raise_error ExecJS::ProgramError
48
+ end
49
+
50
+ it "should raise an error when calling something that isn't a function" do
51
+ RenderExecJS.environment = <<-JS
52
+ var b = 'hai';
53
+ JS
54
+
55
+ expect do
56
+ Renderer.call "b", 1, 2, 3
57
+ end.to raise_error ExecJS::ProgramError
58
+ end
59
+
60
+ it "should compile and execute CoffeeScript" do
61
+ RenderExecJS.environment <<-JS
62
+ function hello() {
63
+ return 'hi';
64
+ }
65
+ JS
66
+
67
+ Renderer.exec("return hello() is hello() is hello()", :coffee_script => true).should == true
68
+ end
69
+
70
+ it "should compile and execute a CoffeeScript environment" do
71
+ RenderExecJS.coffeescript_environment <<-CS
72
+ hello = ->
73
+ 'hi'
74
+ CS
75
+
76
+ Renderer.call("hello").should == "hi"
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,82 @@
1
+ module RenderExecJS
2
+ module Helpers
3
+ class ExecutionError < StandardError
4
+ attr_accessor :output
5
+
6
+ def initialize message, output = nil
7
+ super message
8
+
9
+ self.output = output
10
+ end
11
+
12
+ def message
13
+ "#{super}\nOutput was:\n#{output}"
14
+ end
15
+ end
16
+
17
+ def base_dir
18
+ File.expand_path '../../..', __FILE__
19
+ end
20
+
21
+ def rails_project_dir
22
+ @@tmpdir ||= Dir.mktmpdir 'tmp', base_dir
23
+ end
24
+
25
+ def create_rails_project
26
+ Dir.chdir(rails_project_dir) do
27
+ run_cmd "rails new ."
28
+ File.delete "#{rails_project_dir}/public/index.html"
29
+
30
+ working_gems = {
31
+ "rails" => {
32
+ :version => "4.0.0.beta"
33
+ }
34
+ }.merge $gem_options
35
+
36
+ File.open "Gemfile", "w" do |f|
37
+ gemfile = <<-GEMFILE
38
+ source 'http://rubygems.org'
39
+
40
+ gem 'rails', '~> #{working_gems["rails"][:version]}'
41
+ gem 'sqlite3'
42
+ gem 'render_execjs', :path => '#{base_dir}'
43
+ GEMFILE
44
+
45
+ f.write(gemfile.tap do |g|
46
+ working_gems.delete "rails"
47
+ working_gems.each do |gem, options|
48
+ g << "gem '#{gem}', '~> #{options[:version]}'\n"
49
+ end
50
+ end)
51
+ end
52
+ end
53
+ end
54
+
55
+ def delete_rails_project
56
+ FileUtils.remove_entry_secure rails_project_dir
57
+ @@tmpdir = nil
58
+ end
59
+
60
+ def run_cmd cmd, working_directory = rails_project_dir, clean_env = false, gemfile = "Gemfile", env = {}
61
+ env["BUNDLE_GEMFILE"] = "#{working_directory}/#{gemfile}" if clean_env
62
+ todo = Proc.new do
63
+ r, w = IO.pipe
64
+ Kernel.spawn env, cmd, :out =>w , :err => w, :chdir => working_directory
65
+ w.close
66
+ Process.wait
67
+ output = r.read
68
+ r.close
69
+ unless $?.exitstatus == 0
70
+ raise ExecutionError, "Command failed with exit status #{$?.exitstatus}: #{cmd}", output
71
+ end
72
+ $last_ouput = output
73
+ end
74
+
75
+ if clean_env
76
+ Bundler.with_clean_env &todo
77
+ else
78
+ todo.call
79
+ end
80
+ end
81
+ end
82
+ end
metadata CHANGED
@@ -1,92 +1,144 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: render_execjs
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
4
5
  prerelease:
5
- version: 0.0.1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Tasveer Singh
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-01-30 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-02-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: rails
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70360431236400 !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
23
21
  version: 3.1.3
24
22
  type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: execjs
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70360431236400
25
+ - !ruby/object:Gem::Dependency
26
+ name: execjs
27
+ requirement: &70360431235300 !ruby/object:Gem::Requirement
30
28
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
35
33
  type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
34
+ prerelease: false
35
+ version_requirements: *70360431235300
36
+ - !ruby/object:Gem::Dependency
38
37
  name: rspec
38
+ requirement: &70360431234620 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
39
45
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
46
+ version_requirements: *70360431234620
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-rails
49
+ requirement: &70360431233340 !ruby/object:Gem::Requirement
41
50
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
46
55
  type: :development
47
- version_requirements: *id003
56
+ prerelease: false
57
+ version_requirements: *70360431233340
58
+ - !ruby/object:Gem::Dependency
59
+ name: coffee-script
60
+ requirement: &70360431232580 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70360431232580
69
+ - !ruby/object:Gem::Dependency
70
+ name: appraisal
71
+ requirement: &70360431248040 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70360431248040
48
80
  description: Execute server side JavaScript and render the result with Rails.
49
- email:
81
+ email:
50
82
  - taz@zenapsis.com
51
83
  executables: []
52
-
53
84
  extensions: []
54
-
55
85
  extra_rdoc_files: []
56
-
57
- files:
86
+ files:
58
87
  - .gitignore
88
+ - Appraisals
59
89
  - Gemfile
90
+ - README.md
60
91
  - Rakefile
92
+ - gemfiles/rails31.gemfile
93
+ - gemfiles/rails31.gemfile.lock
94
+ - gemfiles/rails32.gemfile
95
+ - gemfiles/rails32.gemfile.lock
96
+ - lib/generators/render_execjs/install_generator.rb
97
+ - lib/generators/templates/render_execjs.rb
61
98
  - lib/render_execjs.rb
99
+ - lib/render_execjs/configuration.rb
100
+ - lib/render_execjs/railtie.rb
101
+ - lib/render_execjs/renderer.rb
62
102
  - lib/render_execjs/version.rb
63
103
  - render_execjs.gemspec
64
- homepage: ""
104
+ - spec/configuration_spec.rb
105
+ - spec/helper.rb
106
+ - spec/install_spec.rb
107
+ - spec/renderer_spec.rb
108
+ - spec/support/helpers.rb
109
+ homepage: ''
65
110
  licenses: []
66
-
67
111
  post_install_message:
68
112
  rdoc_options: []
69
-
70
- require_paths:
113
+ require_paths:
71
114
  - lib
72
- required_ruby_version: !ruby/object:Gem::Requirement
115
+ required_ruby_version: !ruby/object:Gem::Requirement
73
116
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- version: "0"
78
- required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ segments:
122
+ - 0
123
+ hash: -461247744510695759
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
125
  none: false
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- version: "0"
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ segments:
131
+ - 0
132
+ hash: -461247744510695759
84
133
  requirements: []
85
-
86
134
  rubyforge_project: render_execjs
87
- rubygems_version: 1.8.11
135
+ rubygems_version: 1.8.15
88
136
  signing_key:
89
137
  specification_version: 3
90
138
  summary: Render JavaScript with Rails
91
- test_files: []
92
-
139
+ test_files:
140
+ - spec/configuration_spec.rb
141
+ - spec/helper.rb
142
+ - spec/install_spec.rb
143
+ - spec/renderer_spec.rb
144
+ - spec/support/helpers.rb