reactive-ruby 0.7.27 → 0.7.28
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/Gemfile +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +2 -0
- data/example/examples/Gemfile.lock +5 -5
- data/example/examples/app/nodes.rb +61 -0
- data/example/examples/app/react_api_demo.rb +29 -0
- data/example/examples/app/show.rb +6 -0
- data/example/rails-tutorial/Gemfile.lock +1 -1
- data/example/rails-tutorial/app/controllers/home_controller.rb +1 -1
- data/example/rails-tutorial/app/views/components/home/show.rb +12 -13
- data/lib/reactive-ruby/component.rb +18 -5
- data/lib/reactive-ruby/version.rb +1 -1
- data/reactive-ruby.gemspec +2 -1
- data/spec/controller_helper_spec.rb +2 -0
- data/spec/reactive-ruby/component_loader_spec.rb +2 -0
- data/spec/reactive-ruby/rails/component_mount_spec.rb +4 -5
- data/spec/reactive-ruby/server_rendering/contextual_renderer_spec.rb +8 -6
- data/spec/spec_helper.rb +1 -0
- metadata +4 -24
- data/lib/generators/reactive_ruby/test_app/templates/application.rb +0 -11
- data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/application.rb +0 -2
- data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb +0 -3
- data/lib/generators/reactive_ruby/test_app/templates/boot.rb +0 -6
- data/lib/generators/reactive_ruby/test_app/templates/script/rails +0 -5
- data/lib/generators/reactive_ruby/test_app/templates/views/components/hello_world.rb +0 -11
- data/lib/generators/reactive_ruby/test_app/templates/views/components/todo.rb +0 -14
- data/lib/generators/reactive_ruby/test_app/test_app_generator.rb +0 -105
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b3ccefdd8c89194824329a42a3f700461a3349c
|
4
|
+
data.tar.gz: 8f93442f60fa15f99bc7545e125f11ac9fc5b11e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f49d3a2e156abbf32602e494a0c7fb356f090526ea8a19a3fc53d65e4d02be16dc84b79119cefcbc46ba25f280fe8f57085491a5780084db8453acce12b3da78
|
7
|
+
data.tar.gz: 7828530b6d13396f33d8a91bd1fd6c02b80d8ccb3a1209af0dc5001b49b43fc8668b77a5c8a5f8b2802d4fff05e13354a583ea5766285a1843422a7a6d94578a
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Reactive-Ruby
|
2
2
|
|
3
|
+
[](https://travis-ci.org/zetachang/react.rb)
|
4
|
+
|
3
5
|
**Reactive-Ruby is an [Opal Ruby](http://opalrb.org) wrapper of [React.js library](http://facebook.github.io/react/)**.
|
4
6
|
|
5
7
|
It lets you write reactive UI components, with Ruby's elegance using the tried and true React.js engine. :heart:
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../..
|
3
3
|
specs:
|
4
|
-
reactive-ruby (0.7.
|
4
|
+
reactive-ruby (0.7.27)
|
5
5
|
opal
|
6
6
|
opal-activesupport (>= 0.2.0)
|
7
7
|
opal-browser
|
@@ -65,7 +65,7 @@ GEM
|
|
65
65
|
minitest (5.8.1)
|
66
66
|
nokogiri (1.6.6.2)
|
67
67
|
mini_portile (~> 0.6.0)
|
68
|
-
opal (0.8.
|
68
|
+
opal (0.8.1)
|
69
69
|
hike (~> 1.2)
|
70
70
|
sourcemap (~> 0.1.0)
|
71
71
|
sprockets (~> 3.1)
|
@@ -117,15 +117,15 @@ GEM
|
|
117
117
|
rake (>= 0.8.7)
|
118
118
|
thor (>= 0.18.1, < 2.0)
|
119
119
|
rake (10.4.2)
|
120
|
-
reactive-router (0.7.
|
120
|
+
reactive-router (0.7.11)
|
121
121
|
reactive-ruby
|
122
122
|
sinatra (1.4.6)
|
123
123
|
rack (~> 1.4)
|
124
124
|
rack-protection (~> 1.4)
|
125
125
|
tilt (>= 1.3, < 3)
|
126
126
|
sourcemap (0.1.1)
|
127
|
-
sprockets (3.
|
128
|
-
rack (
|
127
|
+
sprockets (3.4.0)
|
128
|
+
rack (> 1, < 3)
|
129
129
|
sprockets-rails (2.3.3)
|
130
130
|
actionpack (>= 3.0)
|
131
131
|
activesupport (>= 3.0)
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# This example shows how to save a node, instead of rendering it.
|
2
|
+
|
3
|
+
# Normally the DSL "emits" nodes into the rendering buffer as they are generated
|
4
|
+
# similar to a put statement.
|
5
|
+
|
6
|
+
# But what if you want to create some nodes and then use them later.
|
7
|
+
|
8
|
+
# The following example shows how to do this. The key is the "as_node" method
|
9
|
+
# which "pulls" the rendered node back out of the rendering buffer and returns it.
|
10
|
+
# You may store it in some structure, or pass it as a parameter to another component.
|
11
|
+
|
12
|
+
# When it is time to render the component use the .render method, which pushes the
|
13
|
+
# node into the render buffer.
|
14
|
+
|
15
|
+
# The example is also good to understand the difference between generating a node, and
|
16
|
+
# rendering it. You can see from the time stamps, that creating the node, does not
|
17
|
+
# render it. That happens only when react generates the rendered virtual DOM. Cool huh?
|
18
|
+
|
19
|
+
# This is slightly different and MORE typing than react, which is contrary to the goals
|
20
|
+
# of reactive-ruby, so some explanation is in order.
|
21
|
+
|
22
|
+
# In order to keep the DSL as short and sweet as possible, reactive-ruby assumes that
|
23
|
+
# normally when you generate a node, you will want it pushed into the render buffer
|
24
|
+
# (again just like a put statement.)
|
25
|
+
|
26
|
+
# So when you DONT want this behavior you do have to do some extra typing, i.e. you have
|
27
|
+
# explicitly use the .to_node and .render methods, to circumvent the rendering process.
|
28
|
+
|
29
|
+
# Note that under the hood there is nothing going on different than in straight react.
|
30
|
+
|
31
|
+
class NodeChildren
|
32
|
+
|
33
|
+
include React::Component
|
34
|
+
|
35
|
+
required_param :name
|
36
|
+
|
37
|
+
def render
|
38
|
+
tr { td {name}; td { '%.04f' % Time.now.to_f } }
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
class Nodes
|
44
|
+
|
45
|
+
include React::Component
|
46
|
+
|
47
|
+
def render
|
48
|
+
start_time = Time.now
|
49
|
+
nodes = (0..10).collect { |i| NodeChildren(name: "I am node #{i}!").as_node }
|
50
|
+
div {
|
51
|
+
table {
|
52
|
+
tbody {
|
53
|
+
tr { th {"Node"}; th {"rendered at"} }
|
54
|
+
tr { td {"table (parent)"}; td {'%.04f' % Time.now.to_f}}
|
55
|
+
nodes.each &:render
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class ReactAPIDemo
|
2
|
+
|
3
|
+
include React::Component
|
4
|
+
|
5
|
+
before_mount do
|
6
|
+
@click_count = 0 # normally we would just use a state variable, but we want to demo using force_update!
|
7
|
+
end
|
8
|
+
|
9
|
+
after_mount do
|
10
|
+
# to demonstrate the use of dom_node we will attach a click handler AFTER rendering is complete
|
11
|
+
Element[dom_node].on(:click) do
|
12
|
+
alert("I got attached using some low level stuff... now watch and you will see I will force a rerender") if @click_count == 0
|
13
|
+
@click_count += 1
|
14
|
+
force_update!
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def render
|
19
|
+
# Normally you would just attach the handler directly to the node like this:
|
20
|
+
# "Click Me Please".on(:click) { alert 'I was attached during rendering' }
|
21
|
+
if mounted?
|
22
|
+
"I was already mounted, and you have clicked me #{@click_count} time#{'s' if @click_count > 1}, but you can click me again!" #.on(:click) { alert("I was attached the normal way")}
|
23
|
+
else
|
24
|
+
"This is the first render. click me to rerender!"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -10,6 +10,8 @@ require 'basics'
|
|
10
10
|
require 'reuse'
|
11
11
|
require 'items'
|
12
12
|
require 'rerendering'
|
13
|
+
require 'nodes'
|
14
|
+
require 'react_api_demo'
|
13
15
|
|
14
16
|
|
15
17
|
class Show
|
@@ -22,6 +24,8 @@ class Show
|
|
22
24
|
route(path: "basics", name: "basics", handler: Basics)
|
23
25
|
route(path: "reuse", name: "reuse", handler: Reuse)
|
24
26
|
route(path: "rerendering", name: "rerendering", handler: Rerendering)
|
27
|
+
route(path: "nodes", name: "nodes", handler: Nodes)
|
28
|
+
route(path: "api_demo", name: "api_demo", handler: ReactAPIDemo)
|
25
29
|
redirect(from: "/", to: "basics")
|
26
30
|
end
|
27
31
|
|
@@ -32,6 +36,8 @@ class Show
|
|
32
36
|
link(to: "basics") { "Basics" }; br
|
33
37
|
link(to: "reuse") { "Reusable Components" }; br
|
34
38
|
link(to: "rerendering") { "Rerendering Test" }; br
|
39
|
+
link(to: "nodes") { "Saving and using rendered nodes" }; br
|
40
|
+
link(to: "api_demo") { "Low Level React API" }; br
|
35
41
|
end
|
36
42
|
route_handler
|
37
43
|
end
|
@@ -1,33 +1,33 @@
|
|
1
1
|
# app/views/components/home/show.rb
|
2
2
|
|
3
3
|
module Components
|
4
|
-
|
4
|
+
|
5
5
|
module Home
|
6
|
-
|
6
|
+
|
7
7
|
class Show
|
8
8
|
|
9
9
|
include React::Component # will create a new component named Show
|
10
|
-
|
10
|
+
|
11
11
|
optional_param :say_hello_to
|
12
12
|
backtrace :on
|
13
|
-
def render
|
13
|
+
def render
|
14
14
|
puts "Rendering my first component!"
|
15
15
|
List(first_element: div { "bhwahaha" }) do
|
16
16
|
"hello #{'there '+say_hello_to if say_hello_to}".span # render "hello" with optional 'there ...'
|
17
|
-
"goodby".span
|
17
|
+
"goodby".span
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
class List
|
24
|
-
|
25
|
-
include React::Component
|
26
|
-
|
24
|
+
|
25
|
+
include React::Component
|
26
|
+
|
27
27
|
required_param :first_element #, type: React::Element
|
28
|
-
|
28
|
+
|
29
29
|
backtrace :on
|
30
|
-
|
30
|
+
|
31
31
|
def render
|
32
32
|
ul do
|
33
33
|
li do
|
@@ -43,6 +43,5 @@ module Components
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
47
|
-
end
|
48
46
|
|
47
|
+
end
|
@@ -311,9 +311,10 @@ module React
|
|
311
311
|
if param_type == React::Observable
|
312
312
|
(@two_way_params ||= []) << name
|
313
313
|
define_method("#{name}") do
|
314
|
-
params[name].instance_variable_get("@value")
|
314
|
+
params[name].instance_variable_get("@value") if params[name]
|
315
315
|
end
|
316
316
|
define_method("#{name}!") do |*args|
|
317
|
+
return unless params[name]
|
317
318
|
if args.count > 0
|
318
319
|
current_value = params[name].instance_variable_get("@value")
|
319
320
|
params[name].call args[0]
|
@@ -326,7 +327,7 @@ module React
|
|
326
327
|
end
|
327
328
|
elsif param_type == Proc
|
328
329
|
define_method("#{name}") do |*args, &block|
|
329
|
-
params[name].call
|
330
|
+
params[name].call(*args, &block) if params[name]
|
330
331
|
end
|
331
332
|
else
|
332
333
|
define_method("#{name}") do
|
@@ -444,9 +445,21 @@ module React
|
|
444
445
|
module API
|
445
446
|
#include Native
|
446
447
|
|
447
|
-
|
448
|
-
|
449
|
-
|
448
|
+
def dom_node
|
449
|
+
if `typeof React.findDOMNode === 'undefined'`
|
450
|
+
`#{self}.native.getDOMNode` # v0.12.0
|
451
|
+
else
|
452
|
+
`React.findDOMNode(#{self}.native)` # v0.13.0
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
def mounted?
|
457
|
+
`#{self}.native.isMounted()`
|
458
|
+
end
|
459
|
+
|
460
|
+
def force_update!
|
461
|
+
`#{self}.native.forceUpdate()`
|
462
|
+
end
|
450
463
|
|
451
464
|
def set_props(prop, &block)
|
452
465
|
raise "No native ReactComponent associated" unless @native
|
data/reactive-ruby.gemspec
CHANGED
@@ -6,6 +6,7 @@ require 'reactive-ruby/version'
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = 'reactive-ruby'
|
8
8
|
s.version = React::VERSION
|
9
|
+
|
9
10
|
s.author = 'David Chang'
|
10
11
|
s.email = 'zeta11235813@gmail.com'
|
11
12
|
s.homepage = 'https://github.com/zetachang/react.rb'
|
@@ -19,10 +20,10 @@ Gem::Specification.new do |s|
|
|
19
20
|
s.require_paths = ['lib']
|
20
21
|
|
21
22
|
|
23
|
+
|
22
24
|
s.add_dependency 'opal'
|
23
25
|
s.add_dependency 'opal-activesupport', '>= 0.2.0'
|
24
26
|
s.add_dependency 'opal-browser'
|
25
|
-
s.add_development_dependency 'opal-rails'
|
26
27
|
s.add_development_dependency 'rake'
|
27
28
|
s.add_development_dependency 'rspec-rails'
|
28
29
|
s.add_development_dependency 'timecop'
|
@@ -1,13 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
if ruby?
|
3
4
|
RSpec.describe ReactiveRuby::Rails::ComponentMount do
|
4
5
|
let(:helper) { described_class.new }
|
5
6
|
|
6
7
|
before do
|
7
|
-
|
8
|
-
allow(env).to receive(:request).and_return(
|
9
|
-
{ 'controller' => ActionView::TestCase::TestController.new })
|
10
|
-
helper.setup(env)
|
8
|
+
helper.setup(ActionView::TestCase::TestController.new)
|
11
9
|
end
|
12
10
|
|
13
11
|
describe '#react_component' do
|
@@ -45,7 +43,7 @@ RSpec.describe ReactiveRuby::Rails::ComponentMount do
|
|
45
43
|
html = helper.react_component('Components::HelloWorld')
|
46
44
|
props = react_props_for(html)
|
47
45
|
|
48
|
-
expect(props['controller']).to eq('ActionView::TestCase::
|
46
|
+
expect(props['controller']).to eq('ActionView::TestCase::Test')
|
49
47
|
end
|
50
48
|
|
51
49
|
it 'passes additional options through as html attributes' do
|
@@ -65,3 +63,4 @@ RSpec.describe ReactiveRuby::Rails::ComponentMount do
|
|
65
63
|
JSON.parse(CGI.unescapeHTML("#{attr_value(html, 'data-react-props')}"))
|
66
64
|
end
|
67
65
|
end
|
66
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
if ruby?
|
3
4
|
RSpec.describe ReactiveRuby::ServerRendering::ContextualRenderer do
|
4
5
|
let(:renderer) { described_class.new({}) }
|
5
6
|
let(:init) { Proc.new {} }
|
@@ -8,26 +9,27 @@ RSpec.describe ReactiveRuby::ServerRendering::ContextualRenderer do
|
|
8
9
|
describe '#render' do
|
9
10
|
it 'pre-renders HTML' do
|
10
11
|
result = renderer.render('Components.Todo',
|
11
|
-
|
12
|
-
|
12
|
+
{ todo: 'finish reactive-ruby' },
|
13
|
+
options)
|
13
14
|
expect(result).to match(/<li.*>finish reactive-ruby<\/li>/)
|
14
15
|
expect(result).to match(/data-react-checksum/)
|
15
16
|
end
|
16
17
|
|
17
18
|
it 'accepts props as a string' do
|
18
19
|
result = renderer.render('Components.Todo',
|
19
|
-
|
20
|
-
|
20
|
+
{ todo: 'finish reactive-ruby' }.to_json,
|
21
|
+
options)
|
21
22
|
expect(result).to match(/<li.*>finish reactive-ruby<\/li>/)
|
22
23
|
expect(result).to match(/data-react-checksum/)
|
23
24
|
end
|
24
25
|
|
25
26
|
it 'pre-renders static content' do
|
26
27
|
result = renderer.render('Components.Todo',
|
27
|
-
|
28
|
-
|
28
|
+
{ todo: 'finish reactive-ruby' },
|
29
|
+
:static)
|
29
30
|
expect(result).to match(/<li.*>finish reactive-ruby<\/li>/)
|
30
31
|
expect(result).to_not match(/data-react-checksum/)
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
35
|
+
end
|
data/spec/spec_helper.rb
CHANGED
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.28
|
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-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opal
|
@@ -52,20 +52,6 @@ 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
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: rake
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,7 +156,9 @@ files:
|
|
170
156
|
- example/examples/app/basics.js.rb
|
171
157
|
- example/examples/app/items.rb
|
172
158
|
- example/examples/app/jquery.js
|
159
|
+
- example/examples/app/nodes.rb
|
173
160
|
- example/examples/app/react-router.js
|
161
|
+
- example/examples/app/react_api_demo.rb
|
174
162
|
- example/examples/app/rerendering.rb
|
175
163
|
- example/examples/app/reuse.rb
|
176
164
|
- example/examples/app/show.rb
|
@@ -260,14 +248,6 @@ files:
|
|
260
248
|
- example/todos/vendor/base.css
|
261
249
|
- example/todos/vendor/bg.png
|
262
250
|
- example/todos/vendor/jquery.js
|
263
|
-
- lib/generators/reactive_ruby/test_app/templates/application.rb
|
264
|
-
- lib/generators/reactive_ruby/test_app/templates/assets/javascripts/application.rb
|
265
|
-
- lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb
|
266
|
-
- lib/generators/reactive_ruby/test_app/templates/boot.rb
|
267
|
-
- lib/generators/reactive_ruby/test_app/templates/script/rails
|
268
|
-
- lib/generators/reactive_ruby/test_app/templates/views/components/hello_world.rb
|
269
|
-
- lib/generators/reactive_ruby/test_app/templates/views/components/todo.rb
|
270
|
-
- lib/generators/reactive_ruby/test_app/test_app_generator.rb
|
271
251
|
- lib/rails-helpers/top_level_rails_component.rb
|
272
252
|
- lib/reactive-ruby.rb
|
273
253
|
- lib/reactive-ruby/api.rb
|
@@ -1,11 +0,0 @@
|
|
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 %>
|
@@ -1,105 +0,0 @@
|
|
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
|
-
template 'views/components/hello_world.rb',
|
34
|
-
"#{test_app_path}/app/views/components/hello_world.rb", force: true
|
35
|
-
template 'views/components/todo.rb',
|
36
|
-
"#{test_app_path}/app/views/components/todo.rb", force: true
|
37
|
-
end
|
38
|
-
|
39
|
-
def clean_superfluous_files
|
40
|
-
inside test_app_path do
|
41
|
-
remove_file '.gitignore'
|
42
|
-
remove_file 'doc'
|
43
|
-
remove_file 'Gemfile'
|
44
|
-
remove_file 'lib/tasks'
|
45
|
-
remove_file 'app/assets/images/rails.png'
|
46
|
-
remove_file 'app/assets/javascripts/application.js'
|
47
|
-
remove_file 'public/index.html'
|
48
|
-
remove_file 'public/robots.txt'
|
49
|
-
remove_file 'README.rdoc'
|
50
|
-
remove_file 'test'
|
51
|
-
remove_file 'vendor'
|
52
|
-
remove_file 'spec'
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def configure_opal_rspec
|
57
|
-
inject_into_file "#{test_app_path}/config/application.rb",
|
58
|
-
after: /class Application < Rails::Application/, verbose: true do
|
59
|
-
%Q[
|
60
|
-
config.opal.method_missing = true
|
61
|
-
config.opal.optimized_operators = true
|
62
|
-
config.opal.arity_check = false
|
63
|
-
config.opal.const_missing = true
|
64
|
-
config.opal.dynamic_require_severity = :ignore
|
65
|
-
config.opal.enable_specs = true
|
66
|
-
config.opal.spec_location = 'spec-opal'
|
67
|
-
]
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
protected
|
72
|
-
|
73
|
-
def application_definition
|
74
|
-
@application_definition ||= begin
|
75
|
-
test_application_contents
|
76
|
-
end
|
77
|
-
end
|
78
|
-
alias :store_application_definition! :application_definition
|
79
|
-
|
80
|
-
private
|
81
|
-
|
82
|
-
def test_app_path
|
83
|
-
'spec/test_app'
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_application_path
|
87
|
-
File.expand_path("#{test_app_path}/config/application.rb",
|
88
|
-
destination_root)
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_application_contents
|
92
|
-
return unless File.exists?(test_application_path) && !options[:pretend]
|
93
|
-
contents = File.read(test_application_path)
|
94
|
-
contents[(contents.index("module #{module_name}"))..-1]
|
95
|
-
end
|
96
|
-
|
97
|
-
def module_name
|
98
|
-
'TestApp'
|
99
|
-
end
|
100
|
-
|
101
|
-
def gemfile_path
|
102
|
-
'../../../../Gemfile'
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|