reactrb-router 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 560f5e4ceb0cf919265e4be43f4835b9d52040a9
4
+ data.tar.gz: 18412d2c5caa9760f48a683d7faff813c2600a1d
5
+ SHA512:
6
+ metadata.gz: d060b980b6d63dd302eaa7e05677893dac2e94da3b948aef5a7f57971ee82e60279c9b6a43e16332288bde2cfb86607b946a08bc489ea34e25f10884507a4caa
7
+ data.tar.gz: a81767b732acf324860098494e1b326960c7b7ed8f3374f2bec9843a28b95c72f7e86450f422703ed883fd85cabb6f65e7a2b8de2ed63572253ab8bb868150b9
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 catprintlabs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,185 @@
1
+ ## Reactrb Router
2
+
3
+ Reactrb Router allows you write and use the React Router in Ruby through Opal.
4
+
5
+ ### Note
6
+
7
+ This gem is in the process of being re-written. It will be based on latest react-router which is way better. Please see the [v2-4-0 branch](https://github.com/reactrb/reactrb-router/tree/v2-4-0).
8
+ If you you want to use this branch with `reactrb-rails-generator`, be sure to remove `require 'react_router` from `components.rb`. And to use the new Router syntax as per the docs.
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'reactrb-router'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install reactor-router
25
+
26
+ ## Usage
27
+
28
+ The router is a React component that loads other components depending on the current URL.
29
+
30
+ Unlike other components there can only be one router on a page.
31
+
32
+ To get you started here is a sample router.
33
+
34
+ ```ruby
35
+ module Components
36
+ module Accounts
37
+
38
+ class Show
39
+
40
+ include React::Router # instead of React::Component, you use React::Router
41
+
42
+ # the routes macro creates the mapping between URLs and components to display
43
+
44
+ routes(path: '/account/:user_id') do # i.e. we expect to see something like /account/12345
45
+ # routes can be nested the dashboard will be at /account/12345/dashboard
46
+ # the DashboardRoute component will be mounted
47
+ route(name: 'Dashboard', path: 'dashboard', handler: Components::Accounts::DashboardRoute)
48
+ route(path: 'orders', name: 'Orders', handler: Components::Accounts::OrdersRoute)
49
+ # when displaying an order we need the order order as well as the user_id
50
+ route(path: 'orders/:order_id', name: 'Order', handler: Components::Accounts::OrderRoute)
51
+ route(path: 'statement', name: 'Statement', handler: Components::Accounts::StatementRoute)
52
+ # the special redirect route
53
+ redirect(from: '/account/:user_id', to: 'Dashboard')
54
+ end
55
+
56
+ # you grab the url params and preprocess them using the router_param macro.
57
+ # when Router is mounted it will receive the :user_id from the url. In this case we grab
58
+ # the corresponding active_record model.
59
+
60
+ router_param :user_id do |id|
61
+ User.find(id)
62
+ end
63
+
64
+ # like any component routers can have params that are passed in when the router is mounted
65
+
66
+ param :user_param, type: User
67
+ param :user_orders_param, type: [Order]
68
+ param :production_center_address_param, type: Address
69
+ param :open_invoices_param
70
+ param :user_profiles_param, type: [PaymentProfile]
71
+ param :user_addresses_param, type: [Address]
72
+
73
+ # because the underlying javascript router has no provisions to pass params we
74
+ # will export states and copy the params to the states so the lower components can read them
75
+ # expect this get fixed in the near future
76
+
77
+ export_state :user
78
+ export_state :production_center_address
79
+ export_state :open_invoices
80
+ export_state :payment_profiles
81
+ export_state :addresses
82
+
83
+ # the router also makes a good place for other top level states to be housed (i.e. the flux architecture)
84
+ export_state :order_count
85
+
86
+ before_mount do
87
+ # before mounting the router we copy the incoming params that the lower level components will need
88
+ user! user_param
89
+ production_center_address! production_center_address_param
90
+ open_invoices! open_invoices_param
91
+ payment_profiles! user_profiles_param
92
+ addresses! user_addresses_param
93
+
94
+ order_count! user.orders.count # grab our top level state info and save it away
95
+
96
+ end
97
+
98
+ # For routers you define a show method instead of a render method
99
+ def show
100
+ div do
101
+ div.account_nav do
102
+
103
+ # link is a special router component that generates an on page link, that will maintain history etc.
104
+ # basically an intelligent anchor tag. When a user clicks a link, it will rerender the router, update
105
+ # the history etc.
106
+ # So for example when 'My Statement' is clicked. The route changes to /account/:id/statement
107
+
108
+ link(to: 'Dashboard', class: 'no-underline btn btn-default', params: { user_id: user.id }) { 'Account Dashboard' }
109
+ link(to: 'Orders', class: 'no-underline btn btn-default', params: { user_id: user.id }) { 'My Quotes & Orders' }
110
+ link(to: 'Statement', class: 'no-underline btn btn-default', params: { user_id: user.id }) { 'My Statement' }
111
+
112
+ end
113
+ # someplace in the router show method you will have route_handler component which mounts and renders the component
114
+ # indicated by the current route.
115
+ route_handler
116
+ end
117
+ end
118
+ end
119
+
120
+ # We can't pass parameters to the routed components, so we set up these mini components
121
+ # which grab the state from router and send it along to the actual component
122
+
123
+ class DashboardRoute
124
+
125
+ include React::Component
126
+
127
+ def render
128
+ AccountDashboard user: Show.user, addresses: Show.addresses, payment_profiles: Show.payment_profiles
129
+ end
130
+
131
+ end
132
+
133
+ class StatementRoute
134
+
135
+ include React::Component
136
+
137
+ def render
138
+ Statement production_center_address: Show.production_center_address,
139
+ open_invoices: Show.open_invoices, current_invoices: Show.open_invoices[:invoices],
140
+ mailing_address: Show.open_invoices[:mailing_address]
141
+ end
142
+
143
+ end
144
+
145
+ class OrdersRoute
146
+
147
+ include React::Component
148
+
149
+ def render
150
+ AccountOrders user: Show.user #, orders: Show.orders
151
+ end
152
+
153
+ end
154
+
155
+ class OrderRoute
156
+
157
+ include React::Component
158
+
159
+ router_param :order_id do |id|
160
+ Order.find(id)
161
+ end
162
+
163
+ def render
164
+ OrderShow(order: order_id, referrer: 'account')
165
+ end
166
+
167
+ end
168
+
169
+ end
170
+ end
171
+ ```
172
+
173
+ ## Development
174
+
175
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
176
+
177
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
178
+
179
+ ## Contributing
180
+
181
+ 1. Fork it ( https://github.com/reactrb/reactrb-router/fork )
182
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
183
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
184
+ 4. Push to the branch (`git push origin my-new-feature`)
185
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,15 @@
1
+ module React
2
+ module Component
3
+ module ClassMethods
4
+ end
5
+
6
+ def route_handler(*args)
7
+ Router::RR::RouteHandler(*args)
8
+ end
9
+
10
+ def link(opts = {}, &block)
11
+ opts[:params] = opts[:params].to_n if opts[:params]
12
+ Router::RR::Link(opts, &block)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,153 @@
1
+ class History
2
+ class << self
3
+ def setup_handler
4
+ unless @handlers_setup
5
+ handler = lambda { |event| window_history_pop_handler(event) }
6
+ %x{
7
+ if (window.addEventListener) {
8
+ window.addEventListener('popstate', handler, false);
9
+ } else {
10
+ window.attachEvent('onpopstate', handler);
11
+ }
12
+ }
13
+ end
14
+ @handlers_setup = true
15
+ end
16
+
17
+ def current_path
18
+ @current_path ||= `decodeURI(window.location.pathname + window.location.search)`
19
+ end
20
+
21
+ attr_accessor :history
22
+
23
+ def [](name)
24
+ (@histories ||= {})[name]
25
+ end
26
+
27
+ def []=(name, value)
28
+ (@histories ||= {})[name] = value
29
+ end
30
+
31
+ def window_history_pop_handler(event)
32
+ return if `event.state === undefined`
33
+ if `event.state == null` # happens when popping off outer dialog
34
+ puts "pop handler pops off last value"
35
+ old_history = @history
36
+ @saved_history = @history # for safari's sake
37
+ @saved_path = @current_path
38
+ @saved_history_length = `ReactRouter.History.length`
39
+ @current_path = ""
40
+ @history = nil
41
+ `ReactRouter.History.length = 0`
42
+ old_history.on_state_change.call(:inactive) if old_history.on_state_change
43
+ else
44
+ puts "pop handler #{`event.state.history_id`}, #{`ReactRouter.History.length`} -> #{`event.state.history_length`}, #{`event.state.path`}"
45
+ old_history = @history
46
+ old_history_length = `ReactRouter.History.length`
47
+ @current_path = `event.state.path`
48
+ @history= History[`event.state.history_id`]
49
+ `ReactRouter.History.length = event.state.history_length`
50
+ if old_history != @history
51
+ if `ReactRouter.History.length` > old_history_length
52
+ puts "activating "
53
+ @history.on_state_change.call(:active) if @history.on_state_change
54
+ else
55
+ puts "deactivating"
56
+ old_history.on_state_change.call(:inactive) if old_history.on_state_change
57
+ end
58
+ end
59
+ @history.notify_listeners(:pop)
60
+ end
61
+ end
62
+
63
+ def push_path(path)
64
+ puts "pushing path #{path}"
65
+ unless @history # needed because safari strangly pops off outer most history on initialization
66
+ @history = @saved_history
67
+ @current_path = @saved_path
68
+ `ReactRouter.History.length = #{@saved_history_length}`
69
+ @history.on_state_change.call(:active) if @history.on_state_change
70
+ end
71
+ `window.history.pushState({ path: path, history_id: #{@history.name}, history_length: (ReactRouter.History.length += 1)}, '', path);`
72
+ @current_path = path
73
+ @history.notify_listeners(:push)
74
+ end
75
+
76
+ def replace_path(path)
77
+ puts "replacing path #{path}"
78
+ unless @history # needed because safari strangly pops off outer most history on initialization
79
+ @history = @saved_history
80
+ @current_path = @saved_path
81
+ `ReactRouter.History.length = #{@saved_history_length}`
82
+ @history.on_state_change.call(:active) if @history.on_state_change
83
+ end
84
+ `window.history.replaceState({ path: path, history_id: #{@history.name}, history_length: ReactRouter.History.length}, '', path);`
85
+ @current_path = path
86
+ @history.notify_listeners(:replace)
87
+ end
88
+
89
+ def pop_path
90
+ `window.history.go(-1)`
91
+ end
92
+ end
93
+
94
+ attr_reader :location
95
+ attr_reader :on_state_change
96
+ attr_reader :name
97
+
98
+ def to_s
99
+ "History<#{@name}>"
100
+ end
101
+
102
+ def initialize(name, preactivate_path = nil, &on_state_change)
103
+ @name = name
104
+ if History[@name]
105
+ raise "a history location named #{@name} already exists"
106
+ else
107
+ History[@name] = self
108
+ end
109
+ @on_state_change = on_state_change
110
+ @initial_path = @preactivate_path = preactivate_path
111
+ self.class.setup_handler
112
+ @listeners = []
113
+ @location = {
114
+ addChangeListener: lambda { |listener| @listeners << listener unless @listeners.include? listener} ,
115
+ removeChangeListener: lambda { |listener| @listeners.delete(listener) },
116
+ push: lambda { |path| self.class.push_path(path) },
117
+ pop: lambda { self.class.pop_path },
118
+ replace: lambda { |path| self.class.replace_path path },
119
+ getCurrentPath: lambda { (@preactivate_path || self.class.current_path)},
120
+ toString: lambda { '<HistoryLocation>'}
121
+ }.to_n
122
+ end
123
+
124
+ def activate(initial_path = nil)
125
+ puts "activating #{self}"
126
+ @preactivate_path = nil
127
+ initial_path ||= @initial_path || self.class.current_path
128
+ current_history = self.class.history
129
+ self.class.history = self
130
+ @starting_history_length = `ReactRouter.History.length` if current_history != self
131
+ if @name == "MainApp"
132
+ self.class.replace_path initial_path
133
+ else
134
+ self.class.push_path initial_path
135
+ end
136
+ @on_state_change.call(:active) if @on_state_change and current_history != self
137
+ self
138
+ end
139
+
140
+ def deactivate
141
+ puts "deactivate go(#{@starting_history_length-`ReactRouter.History.length`})"
142
+ `window.history.go(#{@starting_history_length}-ReactRouter.History.length)`
143
+ self
144
+ end
145
+
146
+ def notify_listeners(type)
147
+ puts "!! #{self}.notify_listeners(#{type}) listeners_count: #{@listeners.count}, path: #{self.class.current_path}"
148
+ @listeners.each { |listener| `listener.call(#{@location}, {path: #{self.class.current_path}, type: type})` }
149
+ rescue Exception => e
150
+ `debugger`
151
+ nil
152
+ end
153
+ end
@@ -0,0 +1,228 @@
1
+ module React
2
+ module Router
3
+ class AbortTransition < Exception
4
+ end
5
+
6
+ class RR < React::NativeLibrary
7
+ imports ReactRouter
8
+ end
9
+
10
+ def self.included(base)
11
+ base.class_eval do
12
+
13
+ include React::Component
14
+ include React::IsomorphicHelpers
15
+
16
+ native_mixin `ReactRouter.Navigation`
17
+ native_mixin `ReactRouter.State`
18
+
19
+ class << self
20
+
21
+ attr_accessor :router_context
22
+
23
+ def get_path
24
+ path = `#{@router_component}.native.getPath()`
25
+ path = nil if `typeof path === 'undefined'`
26
+ path
27
+ end
28
+
29
+ def replace_with(route_or_path, params = nil, query = nil)
30
+ `#{@router_component}.native.replaceWith.apply(self.native, #{[route_or_path, params, query].compact})`
31
+ end
32
+
33
+ def transition_to(route_or_path, params = {}, query = {})
34
+ params = @router_component.params[:router_state][:params].merge params
35
+ query = @router_component.params[:router_state][:query].merge query
36
+ `#{@router_component}.native.transitionTo.apply(self.native, #{[route_or_path, params.to_n, query.to_n]})`
37
+ end
38
+
39
+ def link(opts={}, &block)
40
+ params = opts.delete(:params) || {}
41
+ query = opts.delete(:query) || {}
42
+ to = opts.delete(:to)
43
+ React::RenderingContext.render("a", opts, &block).on(:click) { transition_to(to, params, query) }
44
+ end
45
+
46
+ def url_param_methods
47
+ @url_param_methods ||= []
48
+ end
49
+
50
+ attr_accessor :evaluated_url_params
51
+ attr_accessor :current_url_params
52
+
53
+ def router_param(name, opts = {}, &block)
54
+
55
+ # create a method visible both the instance and the class
56
+ # that gets passed the named router parameter (typically a db :id) and returns a
57
+ # meaningful value (typically a database record)
58
+
59
+ method_name = opts[:as] || name
60
+
61
+ class << self
62
+ define_method method_name do
63
+ if @router_component
64
+ block.call @router_component.url_params[name]
65
+ else
66
+ raise "Call to #{self.name}.#{method_name} when #{self.name} is not mounted"
67
+ end
68
+ end
69
+ end
70
+
71
+ define_method method_name do
72
+ self.class.send method_name
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
79
+ static_call_back "willTransitionTo" do |transition, params, query, callback|
80
+ params = Hash.new(params)
81
+ query = Hash.new(query)
82
+ transition = `transition.path`
83
+ puts "willTransitionTo(#{transition}, #{params}, #{query}) for router #{self.object_id}, router_component = #{@router_component.object_id}"
84
+ begin
85
+ if self.respond_to? :will_transition_to
86
+ result = will_transition_to transition, params, query if self.respond_to? :will_transition_to
87
+ if result.is_a? Promise
88
+ result.then { |r| callback(r) }
89
+ else
90
+ callback.call()
91
+ end
92
+ else
93
+ callback.call()
94
+ end
95
+ rescue AbortTransition
96
+ raise "transition aborted"
97
+ end
98
+ end
99
+
100
+ before_first_mount do |context|
101
+
102
+ @evaluated_url_params = {}
103
+ @current_url_params = {}
104
+ if !self.instance_methods.include?(:show) # if there is no show method this is NOT a top level router so we assume routing will begin elsewhere
105
+ @routing = true
106
+ elsif `typeof ReactRouter === 'undefined'`
107
+ if on_opal_client?
108
+ message = "ReactRouter not defined in browser assets - you must manually include it in your assets"
109
+ else
110
+ message = "ReactRouter not defined in components.js.rb assets manifest - you must manually include it in your assets"
111
+ end
112
+ `console.error(message)`
113
+ @routing = true
114
+ else
115
+ @routing = false
116
+ end
117
+ end
118
+
119
+ export_component
120
+
121
+ param :router_state # optional because it is not initially passed in but we add it when running the router
122
+ param :query
123
+ param :params
124
+
125
+ def url_params(params = params)
126
+ (params && (params[:params] || (params[:router_state] && params[:router_state][:params]))) || {}
127
+ end
128
+
129
+ def render
130
+ if self.class.routing?
131
+ if self.class.router_context
132
+ `self.native.context.router = #{self.class.router_context}`
133
+ else
134
+ self.class.router_context = `self.native.context.router`
135
+ end
136
+ self.class.instance_variable_set(:@router_component, self) # this was done after mount, but I think it works here
137
+ show
138
+ elsif on_opal_server?
139
+ self.class.routing!
140
+ routes = self.class.build_routes(true)
141
+ %x{
142
+ ReactRouter.run(#{routes}, window.reactrb_router_static_location, function(root, state) {
143
+ self.native.props.router_state = state
144
+ self.root = React.createElement(root, self.native.props);
145
+ });
146
+ }
147
+ React::Element.new(@root, 'Root', {}, nil)
148
+ end
149
+ end
150
+
151
+ def self.routing?
152
+ @routing
153
+ end
154
+
155
+ def self.routing!
156
+ was_routing = @routing
157
+ @routing = true
158
+ was_routing
159
+ end
160
+
161
+ # override self.location to provide application specific location handlers
162
+
163
+ def location
164
+ (@location ||= History.new("MainApp")).activate.location # must be called MainApp for now to avoid doing an extra state push (ugh)
165
+ end
166
+
167
+ after_mount do
168
+ if !self.class.routing!
169
+ puts "after mount outside of ruby router #{self.object_id}, my class router is #{self.class.object_id}"
170
+ dom_node = if `typeof React.findDOMNode === 'undefined'`
171
+ `#{self}.native.getDOMNode` # v0.12.0
172
+ else
173
+ `React.findDOMNode(#{self}.native)` # v0.13.0
174
+ end
175
+ routes = self.class.build_routes(true)
176
+ %x{
177
+ ReactRouter.run(#{routes}, #{location}, function(root, state) {
178
+ self.native.props.router_state = state
179
+ React.render(React.createElement(root, self.native.props), #{dom_node});
180
+ });
181
+ }
182
+ elsif respond_to? :show
183
+ puts "after mount inside of ruby router #{self.object_id}, my class router is #{self.class.object_id}"
184
+ #self.class.instance_variable_set(:@router_component, self) # this was done here but was moved to the first render
185
+ end
186
+ end
187
+
188
+ def self.routes(opts = {}, &block)
189
+ @routes_opts = opts
190
+ @routes_block = block
191
+ end
192
+
193
+ def self.routes_block
194
+ @routes_block
195
+ end
196
+
197
+ def self.build_routes(generate_node = nil)
198
+ #raise "You must define a routes block in a router component" unless @routes_block
199
+ routes_opts = @routes_opts.dup
200
+ routes_opts[:handler] ||= self
201
+ route(routes_opts, generate_node, &@routes_block)
202
+ end
203
+
204
+ def self.route(opts = {}, generate_node = nil, &block)
205
+ block ||= opts[:handler].routes_block if opts[:handler].respond_to? :routes_block
206
+ opts = opts.dup
207
+ opts[:handler] = React::API.create_native_react_class(opts[:handler])
208
+ (generate_node ? RR::Route_as_node(opts, &block) : RR::Route(opts, &block))
209
+ rescue Exception => e
210
+ React::IsomorphicHelpers.log("Could not define route #{opts}: #{e}", :error)
211
+ end
212
+
213
+ def self.default_route(ops = {}, &block)
214
+ RR::DefaultRoute(opts, &block)
215
+ end
216
+
217
+ def self.redirect(opts = {}, &block)
218
+ RR::Redirect(opts, &block)
219
+ end
220
+
221
+ def self.not_found(opts={}, &block)
222
+ opts[:handler] = React::API.create_native_react_class(opts[:handler])
223
+ RR::NotFoundRoute(opts, &block)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,3 @@
1
+ module ReactrbRouter
2
+ VERSION = '0.8.1'
3
+ end
@@ -0,0 +1,11 @@
1
+ module React
2
+ module Router
3
+ class WindowLocation
4
+ include React::IsomorphicHelpers
5
+
6
+ before_first_mount do |context|
7
+ context.eval("window.reactrb_router_static_location = '#{context.controller.request.path}?#{context.controller.request.query_string}'")
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ if RUBY_ENGINE == 'opal'
2
+ require 'reactrb'
3
+ require 'reactrb-router/component'
4
+ require 'reactrb-router/history'
5
+ require 'reactrb-router/router'
6
+ require 'reactrb-router/version'
7
+ else
8
+ require 'opal'
9
+ require 'reactrb'
10
+ require 'reactrb-router/window_location'
11
+ require 'reactrb-router/version'
12
+
13
+ Opal.append_path File.expand_path('../', __FILE__).untaint
14
+ Opal.append_path File.expand_path('../../vendor', __FILE__).untaint
15
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reactrb-router
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam George
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: reactrb
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Adds the ability to write and use the react-router in Ruby through Opal
56
+ email:
57
+ - adamgeorge.31@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - LICENSE
63
+ - README.md
64
+ - Rakefile
65
+ - lib/reactrb-router.rb
66
+ - lib/reactrb-router/component.rb
67
+ - lib/reactrb-router/history.rb
68
+ - lib/reactrb-router/router.rb
69
+ - lib/reactrb-router/version.rb
70
+ - lib/reactrb-router/window_location.rb
71
+ homepage:
72
+ licenses: []
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.5.1
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: react-router for Opal, part of the reactrb gem family
94
+ test_files: []