reactive-ruby 0.7.22 → 0.7.23
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 +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
|