opal-rails 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,8 +4,8 @@ source :rubygems
4
4
  gemspec
5
5
 
6
6
 
7
- gem 'opal-jquery', :git => 'git://github.com/adambeynon/opal-jquery.git', :require => false
8
- gem 'opal-spec', :git => 'git://github.com/adambeynon/opal-spec.git', :require => false
7
+ gem 'opal-jquery', :git => 'git://github.com/opal/opal-jquery.git', :require => false
8
+ gem 'opal-spec', :git => 'git://github.com/opal/opal-spec.git', :require => false
9
9
 
10
10
 
11
11
  # Test app stuff
data/README.md CHANGED
@@ -1,8 +1,12 @@
1
1
  # Opal Rails
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/elia/opal-rails.png)](http://travis-ci.org/elia/opal-rails)
4
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/elia/opal-rails)
5
+
3
6
  _Rails (3.2+) bindings for [Opal JS](http://opalrb.org) engine._
4
7
 
5
8
 
9
+
6
10
  ## Installation
7
11
 
8
12
  In your `Gemfile`
@@ -12,8 +16,10 @@ gem 'opal-rails'
12
16
  ```
13
17
 
14
18
 
19
+
15
20
  ## Usage
16
21
 
22
+
17
23
  ### Asset Pipeline
18
24
 
19
25
  ``` js
@@ -32,19 +38,33 @@ and then just use the `.rb` or `.opal` extensions:
32
38
  ```ruby
33
39
  # app/assets/javascripts/hi-world.js.rb
34
40
 
35
- puts "G'day world!"
41
+ puts "G'day world!" # check the console
36
42
  ```
37
43
 
38
44
 
39
45
 
46
+
40
47
  ### As a template
41
48
 
42
- You can use it for your dynamic templates too (Probably in conjunction with ERB to pass dynamic state)
49
+ You can use it for your views too, it even inherits instance and local variables from actions:
50
+
51
+ ```ruby
52
+ # app/controllers/posts_controller.rb
53
+
54
+ def create
55
+ @post = Post.create!(params[:post])
56
+ render type: :js, locals: {comments_html: render_to_string(@post.comments)}
57
+ end
58
+ ```
59
+
60
+ Each assign is filtered through JSON so it's reduced to basic types:
43
61
 
44
62
  ```ruby
45
- # app/views/posts/show.js.opal.erb
63
+ # app/views/posts/cerate.js.opal
46
64
 
47
- Element.id('<%= dom_id @post %>').show
65
+ Document['.post .title'].html = @post[:title]
66
+ Document['.post .body'].html = @post[:body]
67
+ Document['.post .comments'].html = comments_html
48
68
  ```
49
69
 
50
70
 
@@ -55,7 +75,9 @@ Of course you need to require `haml-rails` separately since its presence is not
55
75
  ```haml
56
76
  -# app/views/posts/show.html.haml
57
77
 
58
- %article= post.body
78
+ %article.post
79
+ %h1.title= post.title
80
+ .body= post.body
59
81
 
60
82
  %a#show-comments Display Comments!
61
83
 
@@ -65,9 +87,9 @@ Of course you need to require `haml-rails` separately since its presence is not
65
87
 
66
88
  :opal
67
89
  Document.ready? do
68
- Element.id('show-comments').on :click do
69
- Element.find('.comments').first.show
70
- false # aka preventDefault
90
+ Document['#show-comments'].on :click do
91
+ Document['.comments'].first.show
92
+ false
71
93
  end
72
94
  end
73
95
  ```
@@ -102,22 +124,22 @@ Then visit `/opal_spec` from your app and **reload at will**.
102
124
 
103
125
  ## License
104
126
 
105
- Copyright © 2012 by Elia Schito
106
-
107
- Permission is hereby granted, free of charge, to any person obtaining a copy
108
- of this software and associated documentation files (the "Software"), to deal
109
- in the Software without restriction, including without limitation the rights
110
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
111
- copies of the Software, and to permit persons to whom the Software is
112
- furnished to do so, subject to the following conditions:
113
-
114
- The above copyright notice and this permission notice shall be included in
115
- all copies or substantial portions of the Software.
116
-
117
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
118
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
119
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
120
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
121
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
122
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
123
- THE SOFTWARE.
127
+ © 2012 Elia Schito
128
+
129
+ Permission is hereby granted, free of charge, to any person obtaining a copy
130
+ of this software and associated documentation files (the "Software"), to deal
131
+ in the Software without restriction, including without limitation the rights
132
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
133
+ copies of the Software, and to permit persons to whom the Software is
134
+ furnished to do so, subject to the following conditions:
135
+
136
+ The above copyright notice and this permission notice shall be included in
137
+ all copies or substantial portions of the Software.
138
+
139
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
140
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
141
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
142
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
143
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
144
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
145
+ THE SOFTWARE.
@@ -1,10 +1,30 @@
1
1
  module Opal
2
2
  module Rails
3
3
  class TemplateHandler
4
+
4
5
  def self.call(template)
6
+ new.call(template)
7
+ end
8
+
9
+
10
+ def call(template)
5
11
  escaped = template.source.gsub(':', '\:')
6
- string = '%q:' + escaped + ':;'
7
- "Opal.parse(#{string})"
12
+ string = '%q:' + escaped + ':'
13
+ "Opal.parse('Object.new.instance_eval {' << #{assigns} << #{local_assigns} << #{string} << '}')"
14
+ end
15
+
16
+ private
17
+
18
+ def local_assigns
19
+ <<-'RUBY'.strip
20
+ JSON.parse(local_assigns.to_json).map { |key, val| "#{key} = #{val.inspect};" }.join
21
+ RUBY
22
+ end
23
+
24
+ def assigns
25
+ <<-'RUBY'.strip
26
+ JSON.parse(@_assigns.to_json).map { |key, val| "@#{key} = #{val.inspect};" }.join
27
+ RUBY
8
28
  end
9
29
  end
10
30
  end
@@ -1,6 +1,6 @@
1
1
  module Opal
2
2
  module Rails
3
- VERSION = '0.2.0'
3
+ VERSION = '0.2.1'
4
4
  OPAL_VERSION = '0.3.22'
5
5
  end
6
6
  end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require "execjs"
3
+
4
+ describe 'controller assignments' do
5
+ it 'are in the template' do
6
+ source = get_source_of '/application/with_assignments.js'
7
+ source.gsub!(/;\s*\Z/,'') # execjs eval doesn't like the trailing semicolon
8
+ assignments = opal_eval(source)
9
+
10
+ {
11
+ :number_var => 1234,
12
+ :string_var => 'hello',
13
+ :array_var => [1,'a'],
14
+ :hash_var => {:a => 1, :b => 2}.stringify_keys,
15
+ :object_var => {:contents => 'json representation'}.stringify_keys,
16
+ :local_var => 'i am local',
17
+ }.each_pair do |ivar, assignment|
18
+ assignments[ivar.to_s].should eq(assignment)
19
+ end
20
+ end
21
+
22
+ def get_source_of path
23
+ get path
24
+ response.should be_success
25
+ source = response.body
26
+ end
27
+
28
+ def opal_eval source
29
+ opal_source = get_source_of '/assets/opal.js'
30
+ context = ExecJS.compile opal_source
31
+ context.eval source
32
+ end
33
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe '/opal_spec' do
3
+ describe 'In-browser specs runner' do
4
4
  it 'runs all specs', :js do
5
5
  visit '/opal_spec'
6
6
  page.should have_content('Running: spec')
@@ -1,3 +1,18 @@
1
1
  class ApplicationController < ActionController::Base
2
2
  protect_from_forgery
3
+
4
+ def with_assignments
5
+ object = Object.new
6
+ def object.as_json options = {}
7
+ {:contents => 'json representation'}
8
+ end
9
+
10
+ @number_var = 1234
11
+ @string_var = 'hello'
12
+ @array_var = [1,'a']
13
+ @hash_var = {:a => 1, :b => 2}
14
+ @object_var = object
15
+
16
+ render :type => :js, :locals => { :local_var => 'i am local' }
17
+ end
3
18
  end
@@ -0,0 +1,31 @@
1
+ # Fix to native which is broken on some basic types
2
+ class Hash
3
+ def to_native
4
+ %x{
5
+ var result = {}, map = #{self}.map, bucket, value;
6
+
7
+ for (var assoc in map) {
8
+ bucket = map[assoc];
9
+ value = bucket[1];
10
+
11
+ if (value.$to_native) {
12
+ result[assoc] = #{ `value`.to_native };
13
+ }
14
+ else {
15
+ result[assoc] = value;
16
+ }
17
+ }
18
+
19
+ return result;
20
+ }
21
+ end
22
+ end
23
+
24
+ return {
25
+ number_var: @number_var,
26
+ string_var: @string_var,
27
+ array_var: @array_var,
28
+ hash_var: @hash_var,
29
+ object_var: @object_var,
30
+ local_var: local_var
31
+ }.to_native
@@ -1,4 +1,6 @@
1
1
  TestApp::Application.routes.draw do
2
+ get 'application/with_assignments' => 'application#with_assignments'
3
+
2
4
  # The priority is based upon order of creation:
3
5
  # first created -> highest priority.
4
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-07 00:00:00.000000000 Z
12
+ date: 2012-09-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: opal
16
- requirement: &70314270486520 !ruby/object:Gem::Requirement
16
+ requirement: &70118596042580 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.3.22
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70314270486520
24
+ version_requirements: *70118596042580
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rails
27
- requirement: &70314270486060 !ruby/object:Gem::Requirement
27
+ requirement: &70118596041060 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.2.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70314270486060
35
+ version_requirements: *70118596041060
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70314270485560 !ruby/object:Gem::Requirement
38
+ requirement: &70118596039100 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '2.4'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70314270485560
46
+ version_requirements: *70118596039100
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec-rails
49
- requirement: &70314270485100 !ruby/object:Gem::Requirement
49
+ requirement: &70118596037020 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '2.4'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70314270485100
57
+ version_requirements: *70118596037020
58
58
  description: Rails bindings for opal JS engine
59
59
  email:
60
60
  - elia@schito.me
@@ -87,7 +87,8 @@ files:
87
87
  - lib/tasks/opal-rails_tasks.rake
88
88
  - opal-rails.gemspec
89
89
  - script/rails
90
- - spec/integration/opal_spec.rb
90
+ - spec/integration/assigns_spec.rb
91
+ - spec/integration/in_browser_specs_spec.rb
91
92
  - spec/opal/rails/processor_spec.rb
92
93
  - spec/spec_helper.rb
93
94
  - test_app/.gitignore
@@ -98,6 +99,7 @@ files:
98
99
  - test_app/app/assets/javascripts/spec/example_spec.js.rb
99
100
  - test_app/app/assets/stylesheets/application.css
100
101
  - test_app/app/controllers/application_controller.rb
102
+ - test_app/app/views/application/with_assignments.js.opal
101
103
  - test_app/app/views/layouts/application.html.erb
102
104
  - test_app/config.ru
103
105
  - test_app/config/application.rb
@@ -138,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
140
  version: '0'
139
141
  segments:
140
142
  - 0
141
- hash: -3556514632691640513
143
+ hash: 934058803805341785
142
144
  required_rubygems_version: !ruby/object:Gem::Requirement
143
145
  none: false
144
146
  requirements:
@@ -147,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
149
  version: '0'
148
150
  segments:
149
151
  - 0
150
- hash: -3556514632691640513
152
+ hash: 934058803805341785
151
153
  requirements: []
152
154
  rubyforge_project: opal-rails
153
155
  rubygems_version: 1.8.17
@@ -155,6 +157,7 @@ signing_key:
155
157
  specification_version: 3
156
158
  summary: Rails bindings for opal JS engine
157
159
  test_files:
158
- - spec/integration/opal_spec.rb
160
+ - spec/integration/assigns_spec.rb
161
+ - spec/integration/in_browser_specs_spec.rb
159
162
  - spec/opal/rails/processor_spec.rb
160
163
  - spec/spec_helper.rb