reactive-ruby 0.7.22 → 0.7.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +102 -21
- data/README.md +5 -0
- data/Rakefile +18 -0
- data/lib/generators/reactive_ruby/test_app/templates/application.rb +11 -0
- data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/application.rb +2 -0
- data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb +3 -0
- data/lib/generators/reactive_ruby/test_app/templates/boot.rb +6 -0
- data/lib/generators/reactive_ruby/test_app/templates/script/rails +5 -0
- data/lib/generators/reactive_ruby/test_app/test_app_generator.rb +101 -0
- data/lib/rails-helpers/react_component.rb +4 -3
- data/lib/reactive-ruby.rb +1 -1
- data/lib/reactive-ruby/component.rb +1 -1
- data/lib/reactive-ruby/state.rb +11 -7
- data/lib/reactive-ruby/version.rb +1 -1
- data/{spec → opal-spec}/callbacks_spec.rb +0 -0
- data/{spec → opal-spec}/component_spec.rb +0 -0
- data/{spec → opal-spec}/element_spec.rb +0 -0
- data/{spec → opal-spec}/event_spec.rb +0 -0
- data/{spec → opal-spec}/react_spec.rb +0 -0
- data/{spec → opal-spec}/reactjs/index.html.erb +1 -1
- data/opal-spec/spec_helper.rb +29 -0
- data/{spec → opal-spec}/tutorial/tutorial_spec.rb +0 -0
- data/{spec → opal-spec}/validator_spec.rb +0 -0
- data/reactive-ruby.gemspec +9 -4
- data/spec/controller_helper_spec.rb +20 -0
- data/spec/react/rails/view_helper_spec.rb +53 -0
- data/spec/spec_helper.rb +22 -22
- metadata +81 -25
- data/vendor/active_support/core_ext/array/extract_options.rb +0 -29
- data/vendor/active_support/core_ext/class/attribute.rb +0 -127
- data/vendor/active_support/core_ext/kernel/singleton_class.rb +0 -13
- data/vendor/active_support/core_ext/module/remove_method.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07287ee1cef383b6be9138dddaf7241b7c5f13ca
|
4
|
+
data.tar.gz: 8d71d2136f76dc0a7b51069c568715da6d1b4640
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 630e32da18390106e2aa6e9b17a86c5ffdde5f20fa1c6a0401c12255845c11ee0f014ab81aa4ef4d0e392ea2c2cc71a0f7e82ccbcc11ec15c497fd2b72a98da2
|
7
|
+
data.tar.gz: ee3293d87ef084eda0e9a31518a804d9fd0cbdeaf4bd3436edc808c3ecc96a376dde584bcf390e3afb746c568e48a84ccc65f54ca94691cedc6206c48a2a487b
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,47 +1,84 @@
|
|
1
|
+
GIT
|
2
|
+
remote: git://github.com/catprintlabs/react-rails.git
|
3
|
+
revision: 98a8d903a51065c8e3ffedeb094d72a2e9883176
|
4
|
+
branch: isomorphic-methods-support
|
5
|
+
specs:
|
6
|
+
react-rails (1.0.0)
|
7
|
+
coffee-script-source (~> 1.8)
|
8
|
+
connection_pool
|
9
|
+
execjs
|
10
|
+
rails (>= 3.2)
|
11
|
+
tilt
|
12
|
+
|
1
13
|
PATH
|
2
14
|
remote: .
|
3
15
|
specs:
|
4
|
-
reactive-ruby (0.7.
|
5
|
-
jquery-rails
|
16
|
+
reactive-ruby (0.7.21)
|
6
17
|
opal
|
7
|
-
opal-activesupport
|
18
|
+
opal-activesupport (>= 0.2.0)
|
8
19
|
opal-browser
|
9
20
|
|
10
21
|
GEM
|
11
22
|
remote: https://rubygems.org/
|
12
23
|
specs:
|
13
|
-
|
14
|
-
|
15
|
-
|
24
|
+
actionmailer (4.2.4)
|
25
|
+
actionpack (= 4.2.4)
|
26
|
+
actionview (= 4.2.4)
|
27
|
+
activejob (= 4.2.4)
|
28
|
+
mail (~> 2.5, >= 2.5.4)
|
29
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
30
|
+
actionpack (4.2.4)
|
31
|
+
actionview (= 4.2.4)
|
32
|
+
activesupport (= 4.2.4)
|
16
33
|
rack (~> 1.6)
|
17
34
|
rack-test (~> 0.6.2)
|
18
35
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
19
36
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
20
|
-
actionview (4.2.
|
21
|
-
activesupport (= 4.2.
|
37
|
+
actionview (4.2.4)
|
38
|
+
activesupport (= 4.2.4)
|
22
39
|
builder (~> 3.1)
|
23
40
|
erubis (~> 2.7.0)
|
24
41
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
25
42
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
26
|
-
|
43
|
+
activejob (4.2.4)
|
44
|
+
activesupport (= 4.2.4)
|
45
|
+
globalid (>= 0.3.0)
|
46
|
+
activemodel (4.2.4)
|
47
|
+
activesupport (= 4.2.4)
|
48
|
+
builder (~> 3.1)
|
49
|
+
activerecord (4.2.4)
|
50
|
+
activemodel (= 4.2.4)
|
51
|
+
activesupport (= 4.2.4)
|
52
|
+
arel (~> 6.0)
|
53
|
+
activesupport (4.2.4)
|
27
54
|
i18n (~> 0.7)
|
28
55
|
json (~> 1.7, >= 1.7.7)
|
29
56
|
minitest (~> 5.1)
|
30
57
|
thread_safe (~> 0.3, >= 0.3.4)
|
31
58
|
tzinfo (~> 1.1)
|
59
|
+
arel (6.0.3)
|
32
60
|
builder (3.2.2)
|
61
|
+
coffee-script-source (1.9.1.1)
|
62
|
+
connection_pool (2.2.0)
|
63
|
+
diff-lcs (1.2.5)
|
33
64
|
erubis (2.7.0)
|
65
|
+
execjs (2.6.0)
|
66
|
+
globalid (0.3.6)
|
67
|
+
activesupport (>= 4.1.0)
|
34
68
|
hike (1.2.3)
|
35
69
|
i18n (0.7.0)
|
36
|
-
jquery-rails (4.0.
|
70
|
+
jquery-rails (4.0.5)
|
37
71
|
rails-dom-testing (~> 1.0)
|
38
72
|
railties (>= 4.2.0)
|
39
73
|
thor (>= 0.14, < 2.0)
|
40
74
|
json (1.8.3)
|
41
75
|
loofah (2.0.3)
|
42
76
|
nokogiri (>= 1.5.9)
|
77
|
+
mail (2.6.3)
|
78
|
+
mime-types (>= 1.16, < 3)
|
79
|
+
mime-types (2.6.2)
|
43
80
|
mini_portile (0.6.2)
|
44
|
-
minitest (5.8.
|
81
|
+
minitest (5.8.1)
|
45
82
|
nokogiri (1.6.6.2)
|
46
83
|
mini_portile (~> 0.6.0)
|
47
84
|
opal (0.8.0)
|
@@ -49,19 +86,39 @@ GEM
|
|
49
86
|
sourcemap (~> 0.1.0)
|
50
87
|
sprockets (~> 3.1)
|
51
88
|
tilt (>= 1.4)
|
52
|
-
opal-activesupport (0.
|
89
|
+
opal-activesupport (0.2.0)
|
53
90
|
opal (>= 0.5.0, < 1.0.0)
|
54
91
|
opal-browser (0.2.0)
|
55
92
|
opal
|
56
93
|
paggio
|
94
|
+
opal-jquery (0.4.0)
|
95
|
+
opal (>= 0.7.0, < 0.9.0)
|
96
|
+
opal-rails (0.8.0)
|
97
|
+
jquery-rails
|
98
|
+
opal (~> 0.8.0)
|
99
|
+
opal-activesupport (>= 0.0.5)
|
100
|
+
opal-jquery (~> 0.4.0)
|
101
|
+
opal-rspec (~> 0.4.3)
|
102
|
+
rails (>= 3.2, < 5.0)
|
57
103
|
opal-rspec (0.4.3)
|
58
104
|
opal (>= 0.7.0, < 0.9)
|
59
|
-
paggio (0.2.
|
105
|
+
paggio (0.2.5)
|
60
106
|
rack (1.6.4)
|
61
107
|
rack-protection (1.5.3)
|
62
108
|
rack
|
63
109
|
rack-test (0.6.3)
|
64
110
|
rack (>= 1.0)
|
111
|
+
rails (4.2.4)
|
112
|
+
actionmailer (= 4.2.4)
|
113
|
+
actionpack (= 4.2.4)
|
114
|
+
actionview (= 4.2.4)
|
115
|
+
activejob (= 4.2.4)
|
116
|
+
activemodel (= 4.2.4)
|
117
|
+
activerecord (= 4.2.4)
|
118
|
+
activesupport (= 4.2.4)
|
119
|
+
bundler (>= 1.3.0, < 2.0)
|
120
|
+
railties (= 4.2.4)
|
121
|
+
sprockets-rails
|
65
122
|
rails-deprecated_sanitizer (1.0.3)
|
66
123
|
activesupport (>= 4.2.0.alpha)
|
67
124
|
rails-dom-testing (1.0.7)
|
@@ -70,19 +127,41 @@ GEM
|
|
70
127
|
rails-deprecated_sanitizer (>= 1.0.1)
|
71
128
|
rails-html-sanitizer (1.0.2)
|
72
129
|
loofah (~> 2.0)
|
73
|
-
railties (4.2.
|
74
|
-
actionpack (= 4.2.
|
75
|
-
activesupport (= 4.2.
|
130
|
+
railties (4.2.4)
|
131
|
+
actionpack (= 4.2.4)
|
132
|
+
activesupport (= 4.2.4)
|
76
133
|
rake (>= 0.8.7)
|
77
134
|
thor (>= 0.18.1, < 2.0)
|
78
135
|
rake (10.4.2)
|
136
|
+
rspec-core (3.3.2)
|
137
|
+
rspec-support (~> 3.3.0)
|
138
|
+
rspec-expectations (3.3.1)
|
139
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
140
|
+
rspec-support (~> 3.3.0)
|
141
|
+
rspec-mocks (3.3.2)
|
142
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
143
|
+
rspec-support (~> 3.3.0)
|
144
|
+
rspec-rails (3.3.3)
|
145
|
+
actionpack (>= 3.0, < 4.3)
|
146
|
+
activesupport (>= 3.0, < 4.3)
|
147
|
+
railties (>= 3.0, < 4.3)
|
148
|
+
rspec-core (~> 3.3.0)
|
149
|
+
rspec-expectations (~> 3.3.0)
|
150
|
+
rspec-mocks (~> 3.3.0)
|
151
|
+
rspec-support (~> 3.3.0)
|
152
|
+
rspec-support (3.3.0)
|
79
153
|
sinatra (1.4.6)
|
80
154
|
rack (~> 1.4)
|
81
155
|
rack-protection (~> 1.4)
|
82
156
|
tilt (>= 1.3, < 3)
|
83
157
|
sourcemap (0.1.1)
|
84
|
-
sprockets (3.
|
85
|
-
rack (
|
158
|
+
sprockets (3.4.0)
|
159
|
+
rack (> 1, < 3)
|
160
|
+
sprockets-rails (2.3.3)
|
161
|
+
actionpack (>= 3.0)
|
162
|
+
activesupport (>= 3.0)
|
163
|
+
sprockets (>= 2.8, < 4.0)
|
164
|
+
sqlite3 (1.3.10)
|
86
165
|
thor (0.19.1)
|
87
166
|
thread_safe (0.3.5)
|
88
167
|
tilt (2.0.1)
|
@@ -93,9 +172,11 @@ PLATFORMS
|
|
93
172
|
ruby
|
94
173
|
|
95
174
|
DEPENDENCIES
|
175
|
+
opal-rails
|
96
176
|
opal-rspec
|
177
|
+
rake
|
178
|
+
react-rails!
|
97
179
|
reactive-ruby!
|
180
|
+
rspec-rails
|
98
181
|
sinatra
|
99
|
-
|
100
|
-
BUNDLED WITH
|
101
|
-
1.10.6
|
182
|
+
sqlite3
|
data/README.md
CHANGED
@@ -156,6 +156,11 @@ To run the above examples project yourself:
|
|
156
156
|
3. `bundle exec rackup`
|
157
157
|
4. Open `http://localhost`
|
158
158
|
|
159
|
+
## Testing
|
160
|
+
|
161
|
+
1. Run `bundle exec rake test_app` to generate a dummy test app.
|
162
|
+
2. `bundle exec rspec`
|
163
|
+
|
159
164
|
## Contributions
|
160
165
|
|
161
166
|
This project is still in early stage, so discussion, bug report and PR are really welcome :wink:.
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler.require
|
3
|
+
Bundler::GemHelper.install_tasks
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
|
+
task default: :spec
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'generators/reactive_ruby/test_app/test_app_generator'
|
13
|
+
desc "Generates a dummy app for testing"
|
14
|
+
task :test_app do
|
15
|
+
ReactiveRuby::TestAppGenerator.start
|
16
|
+
puts "Setting up test app database..."
|
17
|
+
system("bundle exec rake db:drop db:create db:migrate > #{File::NULL}")
|
18
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails/all'
|
4
|
+
|
5
|
+
# Require the gems listed in Gemfile, including any gems
|
6
|
+
# you've limited to :test, :development, or :production.
|
7
|
+
Bundler.require(*Rails.groups(assets: %w(development test)))
|
8
|
+
|
9
|
+
require 'reactive-ruby'
|
10
|
+
|
11
|
+
<%= application_definition %>
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'rails/generators/rails/app/app_generator'
|
2
|
+
|
3
|
+
module ReactiveRuby
|
4
|
+
class TestAppGenerator < Rails::Generators::Base
|
5
|
+
def self.source_paths
|
6
|
+
paths = self.superclass.source_paths
|
7
|
+
paths << File.expand_path('../templates', __FILE__)
|
8
|
+
paths.flatten
|
9
|
+
end
|
10
|
+
|
11
|
+
def remove_existing_app
|
12
|
+
remove_dir(test_app_path) if File.directory?(test_app_path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate_test_app
|
16
|
+
opts = options.dup
|
17
|
+
opts[:database] = 'sqlite3' if opts[:database].blank?
|
18
|
+
opts[:force] = true
|
19
|
+
opts[:skip_bundle] = true
|
20
|
+
|
21
|
+
puts "Generating Test Rails Application..."
|
22
|
+
invoke Rails::Generators::AppGenerator,
|
23
|
+
[ File.expand_path(test_app_path, destination_root) ], opts
|
24
|
+
end
|
25
|
+
|
26
|
+
def configure_test_app
|
27
|
+
template 'boot.rb', "#{test_app_path}/config/boot.rb", force: true
|
28
|
+
template 'application.rb', "#{test_app_path}/config/application.rb", force: true
|
29
|
+
template 'assets/javascripts/application.rb',
|
30
|
+
"#{test_app_path}/app/assets/javascripts/application.rb", force: true
|
31
|
+
template 'assets/javascripts/components.rb',
|
32
|
+
"#{test_app_path}/app/views/components.rb", force: true
|
33
|
+
end
|
34
|
+
|
35
|
+
def clean_superfluous_files
|
36
|
+
inside test_app_path do
|
37
|
+
remove_file '.gitignore'
|
38
|
+
remove_file 'doc'
|
39
|
+
remove_file 'Gemfile'
|
40
|
+
remove_file 'lib/tasks'
|
41
|
+
remove_file 'app/assets/images/rails.png'
|
42
|
+
remove_file 'app/assets/javascripts/application.js'
|
43
|
+
remove_file 'public/index.html'
|
44
|
+
remove_file 'public/robots.txt'
|
45
|
+
remove_file 'README.rdoc'
|
46
|
+
remove_file 'test'
|
47
|
+
remove_file 'vendor'
|
48
|
+
remove_file 'spec'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def configure_opal_rspec
|
53
|
+
inject_into_file "#{test_app_path}/config/application.rb",
|
54
|
+
after: /class Application < Rails::Application/, verbose: true do
|
55
|
+
%Q[
|
56
|
+
config.opal.method_missing = true
|
57
|
+
config.opal.optimized_operators = true
|
58
|
+
config.opal.arity_check = false
|
59
|
+
config.opal.const_missing = true
|
60
|
+
config.opal.dynamic_require_severity = :ignore
|
61
|
+
config.opal.enable_specs = true
|
62
|
+
config.opal.spec_location = 'spec-opal'
|
63
|
+
]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
protected
|
68
|
+
|
69
|
+
def application_definition
|
70
|
+
@application_definition ||= begin
|
71
|
+
test_application_contents
|
72
|
+
end
|
73
|
+
end
|
74
|
+
alias :store_application_definition! :application_definition
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def test_app_path
|
79
|
+
'spec/test_app'
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_application_path
|
83
|
+
File.expand_path("#{test_app_path}/config/application.rb",
|
84
|
+
destination_root)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_application_contents
|
88
|
+
return unless File.exists?(test_application_path) && !options[:pretend]
|
89
|
+
contents = File.read(test_application_path)
|
90
|
+
contents[(contents.index("module #{module_name}"))..-1]
|
91
|
+
end
|
92
|
+
|
93
|
+
def module_name
|
94
|
+
'TestApp'
|
95
|
+
end
|
96
|
+
|
97
|
+
def gemfile_path
|
98
|
+
'../../../../Gemfile'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
begin
|
2
2
|
|
3
|
+
require 'action_controller'
|
3
4
|
require 'react-rails'
|
4
5
|
require 'reactive-ruby'
|
5
6
|
|
@@ -16,9 +17,9 @@ begin
|
|
16
17
|
module React
|
17
18
|
|
18
19
|
class Railtie < ::Rails::Railtie
|
19
|
-
config.before_configuration do
|
20
|
-
config.assets.enabled = true
|
21
|
-
config.assets.paths << ::Rails.root.join('app', 'views').to_s
|
20
|
+
config.before_configuration do |app|
|
21
|
+
app.config.assets.enabled = true
|
22
|
+
app.config.assets.paths << ::Rails.root.join('app', 'views').to_s
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
data/lib/reactive-ruby.rb
CHANGED
@@ -15,6 +15,7 @@ if RUBY_ENGINE == 'opal'
|
|
15
15
|
|
16
16
|
else
|
17
17
|
require "opal"
|
18
|
+
require "opal-rails"
|
18
19
|
require "opal-browser"
|
19
20
|
require "reactive-ruby/version"
|
20
21
|
require "opal-activesupport"
|
@@ -23,5 +24,4 @@ else
|
|
23
24
|
require "reactive-ruby/serializers"
|
24
25
|
|
25
26
|
Opal.append_path File.expand_path('../', __FILE__).untaint
|
26
|
-
Opal.append_path File.expand_path('../../vendor', __FILE__).untaint
|
27
27
|
end
|
data/lib/reactive-ruby/state.rb
CHANGED
@@ -22,14 +22,18 @@ module React
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
def set_state(object, name, value)
|
25
|
+
def set_state(object, name, value, delay=nil)
|
26
26
|
states[object][name] = value
|
27
|
-
if
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
if delay
|
28
|
+
@delayed_updates ||= []
|
29
|
+
@delayed_updates << [object, name, value]
|
30
|
+
@delayed_updater ||= after(0.001) do
|
31
|
+
delayed_updates = @delayed_updates
|
32
|
+
@delayed_updates = []
|
33
|
+
@delayed_updater = nil
|
34
|
+
delayed_updates.each do |object, name, value|
|
35
|
+
set_state2(object, name, value)
|
36
|
+
end
|
33
37
|
end
|
34
38
|
else
|
35
39
|
set_state2(object, name, value)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'react'
|
2
|
+
|
3
|
+
module ReactTestHelpers
|
4
|
+
`var ReactTestUtils = React.addons.TestUtils`
|
5
|
+
|
6
|
+
def renderToDocument(type, options = {})
|
7
|
+
element = React.create_element(type, options)
|
8
|
+
return renderElementToDocument(element)
|
9
|
+
end
|
10
|
+
|
11
|
+
def renderElementToDocument(element)
|
12
|
+
instance = Native(`ReactTestUtils.renderIntoDocument(#{element.to_n})`)
|
13
|
+
instance.class.include(React::Component::API)
|
14
|
+
return instance
|
15
|
+
end
|
16
|
+
|
17
|
+
def simulateEvent(event, element, params = {})
|
18
|
+
simulator = Native(`ReactTestUtils.Simulate`)
|
19
|
+
simulator[event.to_s].call(`#{element.to_n}.getDOMNode()`, params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def isElementOfType(element, type)
|
23
|
+
`React.addons.TestUtils.isElementOfType(#{element.to_n}, #{type.cached_component_class})`
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
RSpec.configure do |config|
|
28
|
+
config.include ReactTestHelpers
|
29
|
+
end
|
File without changes
|
File without changes
|
data/reactive-ruby.gemspec
CHANGED
@@ -16,11 +16,16 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.files = `git ls-files`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
-
s.require_paths = ['lib'
|
19
|
+
s.require_paths = ['lib']
|
20
20
|
|
21
|
-
|
22
|
-
s.
|
23
|
-
s.
|
21
|
+
|
22
|
+
s.add_dependency 'opal'
|
23
|
+
s.add_dependency 'opal-activesupport', '>= 0.2.0'
|
24
|
+
s.add_dependency 'opal-browser'
|
25
|
+
s.add_development_dependency 'opal-rails'
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'rspec-rails'
|
24
28
|
s.add_development_dependency 'opal-rspec'
|
25
29
|
s.add_development_dependency 'sinatra'
|
30
|
+
s.add_development_dependency 'sqlite3' # For Test Rails App
|
26
31
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class TestController < ActionController::Base; end
|
4
|
+
|
5
|
+
RSpec.describe TestController, type: :controller do
|
6
|
+
render_views
|
7
|
+
|
8
|
+
describe '#render_component' do
|
9
|
+
controller do
|
10
|
+
def index
|
11
|
+
render_component
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'renders the application layout' do
|
16
|
+
get :index, no_prerender: true
|
17
|
+
expect(response).to render_template(layout: :application)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe React::Rails::ViewHelper, type: :helper do
|
4
|
+
describe '#react_component' do
|
5
|
+
it 'renders a div' do
|
6
|
+
html = helper.react_component('Components::HelloWorld')
|
7
|
+
expect(html).to match(/<div.*><\/div>/)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'sets data-react-class to React.TopLevelRailsComponent' do
|
11
|
+
html = helper.react_component('Components::HelloWorld')
|
12
|
+
top_level_class = 'React.TopLevelRailsComponent'
|
13
|
+
expect(attr_value(html, 'data-react-class')).to eq(top_level_class)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'sets component_name in data-react-props hash' do
|
17
|
+
html = helper.react_component('Components::HelloWorld')
|
18
|
+
props = react_props_for(html)
|
19
|
+
|
20
|
+
expect(props['component_name']).to eq('Components::HelloWorld')
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'sets render_params in data-react-props hash' do
|
24
|
+
html = helper.react_component('Components::HelloWorld', {'foo' => 'bar'})
|
25
|
+
props = react_props_for(html)
|
26
|
+
|
27
|
+
expect(props['render_params']).to include({ 'foo' => 'bar' })
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'sets controller in data-react-props hash' do
|
31
|
+
html = helper.react_component('Components::HelloWorld')
|
32
|
+
props = react_props_for(html)
|
33
|
+
|
34
|
+
expect(props['controller']).to eq('ActionView::TestCase::TestController')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'passes additional options through as html attributes' do
|
38
|
+
html = helper.react_component('Components::HelloWorld', {},
|
39
|
+
{ 'foo-bar' => 'biz-baz' })
|
40
|
+
|
41
|
+
expect(attr_value(html, 'foo-bar')).to eq('biz-baz')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def attr_value(html, attr)
|
46
|
+
matches = html.match(/#{attr}=["']((?:.(?!["']\s+(?:\S+)=|[>"']))+.)["']?/)
|
47
|
+
matches.captures.first
|
48
|
+
end
|
49
|
+
|
50
|
+
def react_props_for(html)
|
51
|
+
JSON.parse(CGI.unescapeHTML("#{attr_value(html, 'data-react-props')}"))
|
52
|
+
end
|
53
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
|
1
|
+
ENV["RAILS_ENV"] ||= 'test'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
begin
|
4
|
+
require File.expand_path('../test_app/config/environment', __FILE__)
|
5
|
+
rescue LoadError
|
6
|
+
puts 'Could not load test application. Please ensure you have run `bundle exec rake test_app`'
|
7
|
+
end
|
5
8
|
|
6
|
-
|
7
|
-
element = React.create_element(type, options)
|
8
|
-
return renderElementToDocument(element)
|
9
|
-
end
|
9
|
+
require 'rspec/rails'
|
10
10
|
|
11
|
-
|
12
|
-
instance = Native(`ReactTestUtils.renderIntoDocument(#{element.to_n})`)
|
13
|
-
instance.class.include(React::Component::API)
|
14
|
-
return instance
|
15
|
-
end
|
11
|
+
Dir["./spec/support/**/*.rb"].sort.each { |f| require f }
|
16
12
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.color = true
|
15
|
+
config.fail_fast = ENV['FAIL_FAST'] || false
|
16
|
+
config.fixture_path = File.join(File.expand_path(File.dirname(__FILE__)), "fixtures")
|
17
|
+
config.infer_spec_type_from_file_location!
|
18
|
+
config.mock_with :rspec
|
19
|
+
config.raise_errors_for_deprecations!
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
22
|
+
# examples within a transaction, comment the following line or assign false
|
23
|
+
# instead of true.
|
24
|
+
config.use_transactional_fixtures = true
|
26
25
|
|
27
|
-
|
28
|
-
|
26
|
+
config.before :each do
|
27
|
+
Rails.cache.clear
|
28
|
+
end
|
29
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reactive-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Chang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opal
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.2.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.2.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: opal-browser
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,48 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: opal-rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec-rails
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
98
|
name: opal-rspec
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +122,20 @@ dependencies:
|
|
80
122
|
- - ">="
|
81
123
|
- !ruby/object:Gem::Version
|
82
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: sqlite3
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
83
139
|
description: Write reactive UI component with Ruby's elegancy and compiled to run
|
84
140
|
in Javascript.
|
85
141
|
email: zeta11235813@gmail.com
|
@@ -88,10 +144,12 @@ extensions: []
|
|
88
144
|
extra_rdoc_files: []
|
89
145
|
files:
|
90
146
|
- ".gitignore"
|
147
|
+
- ".travis.yml"
|
91
148
|
- Gemfile
|
92
149
|
- Gemfile.lock
|
93
150
|
- LICENSE
|
94
151
|
- README.md
|
152
|
+
- Rakefile
|
95
153
|
- config.ru
|
96
154
|
- example/examples/Gemfile
|
97
155
|
- example/examples/Gemfile.lock
|
@@ -188,6 +246,12 @@ files:
|
|
188
246
|
- example/todos/vendor/base.css
|
189
247
|
- example/todos/vendor/bg.png
|
190
248
|
- example/todos/vendor/jquery.js
|
249
|
+
- lib/generators/reactive_ruby/test_app/templates/application.rb
|
250
|
+
- lib/generators/reactive_ruby/test_app/templates/assets/javascripts/application.rb
|
251
|
+
- lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb
|
252
|
+
- lib/generators/reactive_ruby/test_app/templates/boot.rb
|
253
|
+
- lib/generators/reactive_ruby/test_app/templates/script/rails
|
254
|
+
- lib/generators/reactive_ruby/test_app/test_app_generator.rb
|
191
255
|
- lib/rails-helpers/react_component.rb
|
192
256
|
- lib/rails-helpers/top_level_rails_component.rb
|
193
257
|
- lib/reactive-ruby.rb
|
@@ -212,20 +276,19 @@ files:
|
|
212
276
|
- logo2.png
|
213
277
|
- logo3.png
|
214
278
|
- old-readme
|
279
|
+
- opal-spec/callbacks_spec.rb
|
280
|
+
- opal-spec/component_spec.rb
|
281
|
+
- opal-spec/element_spec.rb
|
282
|
+
- opal-spec/event_spec.rb
|
283
|
+
- opal-spec/react_spec.rb
|
284
|
+
- opal-spec/reactjs/index.html.erb
|
285
|
+
- opal-spec/spec_helper.rb
|
286
|
+
- opal-spec/tutorial/tutorial_spec.rb
|
287
|
+
- opal-spec/validator_spec.rb
|
215
288
|
- reactive-ruby.gemspec
|
216
|
-
- spec/
|
217
|
-
- spec/
|
218
|
-
- spec/element_spec.rb
|
219
|
-
- spec/event_spec.rb
|
220
|
-
- spec/react_spec.rb
|
221
|
-
- spec/reactjs/index.html.erb
|
289
|
+
- spec/controller_helper_spec.rb
|
290
|
+
- spec/react/rails/view_helper_spec.rb
|
222
291
|
- spec/spec_helper.rb
|
223
|
-
- spec/tutorial/tutorial_spec.rb
|
224
|
-
- spec/validator_spec.rb
|
225
|
-
- vendor/active_support/core_ext/array/extract_options.rb
|
226
|
-
- vendor/active_support/core_ext/class/attribute.rb
|
227
|
-
- vendor/active_support/core_ext/kernel/singleton_class.rb
|
228
|
-
- vendor/active_support/core_ext/module/remove_method.rb
|
229
292
|
homepage: https://github.com/zetachang/react.rb
|
230
293
|
licenses:
|
231
294
|
- MIT
|
@@ -234,7 +297,6 @@ post_install_message:
|
|
234
297
|
rdoc_options: []
|
235
298
|
require_paths:
|
236
299
|
- lib
|
237
|
-
- vendor
|
238
300
|
required_ruby_version: !ruby/object:Gem::Requirement
|
239
301
|
requirements:
|
240
302
|
- - ">="
|
@@ -252,12 +314,6 @@ signing_key:
|
|
252
314
|
specification_version: 4
|
253
315
|
summary: Opal Ruby wrapper of React.js library.
|
254
316
|
test_files:
|
255
|
-
- spec/
|
256
|
-
- spec/
|
257
|
-
- spec/element_spec.rb
|
258
|
-
- spec/event_spec.rb
|
259
|
-
- spec/react_spec.rb
|
260
|
-
- spec/reactjs/index.html.erb
|
317
|
+
- spec/controller_helper_spec.rb
|
318
|
+
- spec/react/rails/view_helper_spec.rb
|
261
319
|
- spec/spec_helper.rb
|
262
|
-
- spec/tutorial/tutorial_spec.rb
|
263
|
-
- spec/validator_spec.rb
|
@@ -1,29 +0,0 @@
|
|
1
|
-
class Hash
|
2
|
-
# By default, only instances of Hash itself are extractable.
|
3
|
-
# Subclasses of Hash may implement this method and return
|
4
|
-
# true to declare themselves as extractable. If a Hash
|
5
|
-
# is extractable, Array#extract_options! pops it from
|
6
|
-
# the Array when it is the last element of the Array.
|
7
|
-
def extractable_options?
|
8
|
-
instance_of?(Hash)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class Array
|
13
|
-
# Extracts options from a set of arguments. Removes and returns the last
|
14
|
-
# element in the array if it's a hash, otherwise returns a blank hash.
|
15
|
-
#
|
16
|
-
# def options(*args)
|
17
|
-
# args.extract_options!
|
18
|
-
# end
|
19
|
-
#
|
20
|
-
# options(1, 2) # => {}
|
21
|
-
# options(1, 2, :a => :b) # => {:a=>:b}
|
22
|
-
def extract_options!
|
23
|
-
if last.is_a?(Hash) && last.extractable_options?
|
24
|
-
pop
|
25
|
-
else
|
26
|
-
{}
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,127 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/kernel/singleton_class'
|
2
|
-
require 'active_support/core_ext/module/remove_method'
|
3
|
-
require 'active_support/core_ext/array/extract_options'
|
4
|
-
|
5
|
-
class Class
|
6
|
-
# Declare a class-level attribute whose value is inheritable by subclasses.
|
7
|
-
# Subclasses can change their own value and it will not impact parent class.
|
8
|
-
#
|
9
|
-
# class Base
|
10
|
-
# class_attribute :setting
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
# class Subclass < Base
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# Base.setting = true
|
17
|
-
# Subclass.setting # => true
|
18
|
-
# Subclass.setting = false
|
19
|
-
# Subclass.setting # => false
|
20
|
-
# Base.setting # => true
|
21
|
-
#
|
22
|
-
# In the above case as long as Subclass does not assign a value to setting
|
23
|
-
# by performing <tt>Subclass.setting = _something_ </tt>, <tt>Subclass.setting</tt>
|
24
|
-
# would read value assigned to parent class. Once Subclass assigns a value then
|
25
|
-
# the value assigned by Subclass would be returned.
|
26
|
-
#
|
27
|
-
# This matches normal Ruby method inheritance: think of writing an attribute
|
28
|
-
# on a subclass as overriding the reader method. However, you need to be aware
|
29
|
-
# when using +class_attribute+ with mutable structures as +Array+ or +Hash+.
|
30
|
-
# In such cases, you don't want to do changes in places but use setters:
|
31
|
-
#
|
32
|
-
# Base.setting = []
|
33
|
-
# Base.setting # => []
|
34
|
-
# Subclass.setting # => []
|
35
|
-
#
|
36
|
-
# # Appending in child changes both parent and child because it is the same object:
|
37
|
-
# Subclass.setting << :foo
|
38
|
-
# Base.setting # => [:foo]
|
39
|
-
# Subclass.setting # => [:foo]
|
40
|
-
#
|
41
|
-
# # Use setters to not propagate changes:
|
42
|
-
# Base.setting = []
|
43
|
-
# Subclass.setting += [:foo]
|
44
|
-
# Base.setting # => []
|
45
|
-
# Subclass.setting # => [:foo]
|
46
|
-
#
|
47
|
-
# For convenience, an instance predicate method is defined as well.
|
48
|
-
# To skip it, pass <tt>instance_predicate: false</tt>.
|
49
|
-
#
|
50
|
-
# Subclass.setting? # => false
|
51
|
-
#
|
52
|
-
# Instances may overwrite the class value in the same way:
|
53
|
-
#
|
54
|
-
# Base.setting = true
|
55
|
-
# object = Base.new
|
56
|
-
# object.setting # => true
|
57
|
-
# object.setting = false
|
58
|
-
# object.setting # => false
|
59
|
-
# Base.setting # => true
|
60
|
-
#
|
61
|
-
# To opt out of the instance reader method, pass <tt>instance_reader: false</tt>.
|
62
|
-
#
|
63
|
-
# object.setting # => NoMethodError
|
64
|
-
# object.setting? # => NoMethodError
|
65
|
-
#
|
66
|
-
# To opt out of the instance writer method, pass <tt>instance_writer: false</tt>.
|
67
|
-
#
|
68
|
-
# object.setting = false # => NoMethodError
|
69
|
-
#
|
70
|
-
# To opt out of both instance methods, pass <tt>instance_accessor: false</tt>.
|
71
|
-
def class_attribute(*attrs)
|
72
|
-
options = attrs.extract_options!
|
73
|
-
instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
|
74
|
-
instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
|
75
|
-
instance_predicate = options.fetch(:instance_predicate, true)
|
76
|
-
|
77
|
-
attrs.each do |name|
|
78
|
-
define_singleton_method(name) { nil }
|
79
|
-
define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
|
80
|
-
|
81
|
-
ivar = "@#{name}"
|
82
|
-
|
83
|
-
define_singleton_method("#{name}=") do |val|
|
84
|
-
singleton_class.class_eval do
|
85
|
-
remove_possible_method(name)
|
86
|
-
define_method(name) { val }
|
87
|
-
end
|
88
|
-
|
89
|
-
if singleton_class?
|
90
|
-
class_eval do
|
91
|
-
remove_possible_method(name)
|
92
|
-
define_method(name) do
|
93
|
-
if instance_variable_defined? ivar
|
94
|
-
instance_variable_get ivar
|
95
|
-
else
|
96
|
-
singleton_class.send name
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
val
|
102
|
-
end
|
103
|
-
|
104
|
-
if instance_reader
|
105
|
-
remove_possible_method name
|
106
|
-
define_method(name) do
|
107
|
-
if instance_variable_defined?(ivar)
|
108
|
-
instance_variable_get ivar
|
109
|
-
else
|
110
|
-
self.class.public_send name
|
111
|
-
end
|
112
|
-
end
|
113
|
-
define_method("#{name}?") { !!public_send(name) } if instance_predicate
|
114
|
-
end
|
115
|
-
|
116
|
-
attr_writer name if instance_writer
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
private
|
121
|
-
|
122
|
-
unless respond_to?(:singleton_class?)
|
123
|
-
def singleton_class?
|
124
|
-
ancestors.first != self
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Kernel
|
2
|
-
# Returns the object's singleton class.
|
3
|
-
def singleton_class
|
4
|
-
class << self
|
5
|
-
self
|
6
|
-
end
|
7
|
-
end unless respond_to?(:singleton_class) # exists in 1.9.2
|
8
|
-
|
9
|
-
# class_eval on an object acts like singleton_class.class_eval.
|
10
|
-
def class_eval(*args, &block)
|
11
|
-
singleton_class.class_eval(*args, &block)
|
12
|
-
end
|
13
|
-
end
|