isomorfeus-redux 4.0.21 → 4.0.22

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19bbbb5e2f13c5e706f5d47d12e848f5734b7f83345a72c1c756608566c12101
4
- data.tar.gz: c93fc41b2e042af1da72e4ee2990f7055586e515cc6eaa8816a5a96062e8ce0c
3
+ metadata.gz: ac66bd2fa78a0d3dde62ea27ad5d465d0f6298936ebe4d720288b609db23d2e9
4
+ data.tar.gz: 2577dcb6a4dec4ec430b4a8efb615edb6aa36db290d1c2219a3e9be37296260f
5
5
  SHA512:
6
- metadata.gz: b412b3d03d000c9015cee26818b5873cfa7655438fbd63339ae8b2e40d9437991ee18844f1978f1bb7ab06d37ef851c658f4189bd09c2ab7b6a7a13d12afec39
7
- data.tar.gz: dbd289172c68b7f5dd5136bea2a5499bbf20d0140db0ae509194d66dbc8f6f846b56329b690741282438be56179698b047b4fc5605f6bf4c5d338bba5f78bcff
6
+ metadata.gz: 71ad82d18c7f94dce61887613574403d0bb08499d61b24d4bcce818a335aab72c927d880052d66fda709043f3887cab443bd40a316ebfd9c74f32d3a20a5585c
7
+ data.tar.gz: c939dd916b7870d091047f4a4b777a9c2eaf9c5986972eccd950344c2adb7fd3914237338144b5115aa3a0bbe91b875f15d4c9f5f285399e3f5bbfe35ce7fdcc
data/README.md CHANGED
@@ -34,11 +34,117 @@ For full functionality the following are required:
34
34
  For the Gemfile:
35
35
  ```ruby
36
36
  gem 'opal', github: 'janbiedermann/opal', branch: 'es6_modules_1_1'
37
- gem 'opal-webpack-loader', '~> 0.9.1'
38
- gem 'opal-autoloader', '~> 0.0.3'
37
+ gem 'opal-webpack-loader', '~> 0.9.10'
39
38
  ```
40
39
 
41
- ## Usage
40
+ ## Usage within Isomorfeus
41
+
42
+ Lucid Components have store access integrated, see the isomorfeus-react documentation.
43
+
44
+ The following stores are available:
45
+ - AppStore - reactive store managed by redux
46
+ - LocalStore - convenient access to the Browsers localStorage, changes from within ruby can be subscribed to
47
+ - SessionStore - convenient access to the Browsers sessionStorage, changes from within ruby can be subscribed to
48
+
49
+ ### AppStore
50
+ All keys must be Strings or Symbols! All values must be serializable, simple types preferred!
51
+
52
+ Example Usage:
53
+ ```ruby
54
+ # setting a value:
55
+ AppStore.some_key = 10
56
+ AppStore[:some_key] = 10
57
+ AppStore.set(:some_key, 10)
58
+ AppStore.promise_set(:some_key, 10)
59
+
60
+ # getting a value:
61
+ val = AppStore.some_key
62
+ val = AppStore[:some_key]
63
+ val = AppStore.get(:some_key)
64
+ AppStore.promise_get(:some_key).then do |val|
65
+ # do something
66
+ end
67
+
68
+ # subscribing to changes
69
+ unsub = AppStore.subscribe do
70
+ @val = AppStore.some_key
71
+ end
72
+
73
+ # MUST be unsibscribed if changes are no longer wanted
74
+ AppStore.unsubscribe(unsub)
75
+ ```
76
+
77
+ ### LocalStore
78
+ All keys and values must be Strings or Symbols!
79
+
80
+ ```ruby
81
+ # setting a value:
82
+ LocalStore.some_key = 10
83
+ LocalStore[:some_key] = 10
84
+ LocalStore.set(:some_key, 10)
85
+ LocalStore.promise_set(:some_key, 10)
86
+
87
+ # getting a value:
88
+ val = LocalStore.some_key
89
+ val = LocalStore[:some_key]
90
+ val = LocalStore.get(:some_key)
91
+ LocalStore.promise_get(:some_key).then do |val|
92
+ # do something
93
+ end
94
+
95
+ # deleting a value
96
+ LocalStore.delete(:some_key)
97
+ LocalStore.promise_delete(:some_key)
98
+
99
+ # clearing the store
100
+ LocalStore.clear
101
+ LocalStore.promise_clear
102
+
103
+ # subscribing to changes
104
+ unsub = LocalStore.subscribe do
105
+ @val = LocalStore.some_key
106
+ end
107
+
108
+ # MUST be unsibscribed if changes are no longer wanted
109
+ LocalStore.unsubscribe(unsub)
110
+ ```
111
+
112
+ ### SessionStore
113
+ All keys and values must be Strings or Symbols!
114
+
115
+ ```ruby
116
+ # setting a value:
117
+ SessionStore.some_key = 10
118
+ SessionStore[:some_key] = 10
119
+ SessionStore.set(:some_key, 10)
120
+ SessionStore.promise_set(:some_key, 10)
121
+
122
+ # getting a value:
123
+ val = SessionStore.some_key
124
+ val = SessionStore[:some_key]
125
+ val = SessionStore.get(:some_key)
126
+ SessionStore.promise_get(:some_key).then do |val|
127
+ # do something
128
+ end
129
+
130
+ # deleting a value
131
+ SessionStore.delete(:some_key)
132
+ SessionStore.promise_delete(:some_key)
133
+
134
+ # clearing the store
135
+ SessionStore.clear
136
+ SessionStore.promise_clear
137
+
138
+ # subscribing to changes
139
+ unsub = SessionStore.subscribe do
140
+ @val = SessionStore.some_key
141
+ end
142
+
143
+ # MUST be unsibscribed if changes are no longer wanted
144
+ LocalStore.unsubscribe(unsub)
145
+ ```
146
+
147
+ ## Advanced Usage
42
148
  Because isomorfeus-redux follows closely the Redux principles/implementation/API and Documentation, most things of the official Redux documentation
43
149
  apply, but in the Ruby way, see:
44
150
  - https://redux.js.org
@@ -102,6 +208,7 @@ Isomorfeus.store.subscribe do
102
208
  # something useful here
103
209
  end
104
210
  ```
211
+
105
212
  ### Setup
106
213
  If isomorfeus-redux is used in isolation, these methods can be used:
107
214
  ```ruby
@@ -111,3 +218,6 @@ Redux::Store.init! # initializes the global store
111
218
 
112
219
  ### Development Tools
113
220
  The Redux Development Tools allow for detailed debugging of store/state changes: https://github.com/zalmoxisus/redux-devtools-extension
221
+
222
+ ### Specs
223
+ Specs for the stores are in isomorfeus-react.
data/lib/app_store.rb ADDED
@@ -0,0 +1,42 @@
1
+ class AppStore
2
+ class << self
3
+ def method_missing(key, *args, &block)
4
+ if `args.length > 0`
5
+ # set class state, simply a dispatch
6
+ action = { type: 'APPLICATION_STATE', name: (`key.endsWith('=')` ? key.chop : key), value: args[0] }
7
+ Isomorfeus.store.collect_and_defer_dispatch(action)
8
+ else
9
+ # check store for value
10
+ a_state = Isomorfeus.store.get_state
11
+ if a_state.key?(:application_state) && a_state[:application_state].key?(key)
12
+ return a_state[:application_state][key]
13
+ end
14
+
15
+ # otherwise return nil
16
+ return nil
17
+ end
18
+ end
19
+
20
+ alias [] method_missing
21
+ alias []= method_missing
22
+
23
+ alias get method_missing
24
+ alias set method_missing
25
+
26
+ def promise_get(key)
27
+ Promise.new.resolve(get(key))
28
+ end
29
+
30
+ def promise_set(key, value)
31
+ Promise.new.resolve(set(key, value))
32
+ end
33
+
34
+ def subscribe(&block)
35
+ Isomorfeus.store.subscribe(&block)
36
+ end
37
+
38
+ def unsubscribe(unsubscriber)
39
+ `unsubscriber()`
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,43 @@
1
+ module Isomorfeus
2
+ module BrowserStoreApi
3
+ def promise_get(key)
4
+ Promise.new.resolve(get(key))
5
+ end
6
+
7
+ def promise_set(key, value)
8
+ Promise.new.resolve(set(key, value))
9
+ end
10
+
11
+ def promise_delete(key)
12
+ Promise.new.resolve(delete(key))
13
+ end
14
+
15
+ def promise_clear
16
+ Promise.new.resolve(clear)
17
+ end
18
+
19
+ def subscribe(&block)
20
+ key = SecureRandom.uuid
21
+ subscribers[key] = block
22
+ key
23
+ end
24
+
25
+ def unsubscribe(key)
26
+ subscribers.delete(key)
27
+ nil
28
+ end
29
+
30
+ def notify_subscribers
31
+ return if subscribers.empty?
32
+ after 0 do
33
+ subscribers.each_value do |block|
34
+ block.call
35
+ end
36
+ end
37
+ end
38
+
39
+ def subscribers
40
+ @subscribers ||= {}
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,30 @@
1
+ module Kernel
2
+ def promise_after(time_ms)
3
+ p = Promise.new
4
+ after(time_ms) { p.resolve(true) }
5
+ p
6
+ end
7
+
8
+ def on_browser?; Isomorfeus.on_browser?; end
9
+ def on_ssr?; Isomorfeus.on_ssr?; end
10
+ def on_server?; Isomorfeus.on_server?; end
11
+ def on_desktop?; Isomorfeus.on_desktop?; end
12
+ def on_ios?; Isomorfeus.on_ios?; end
13
+ def on_android?; Isomorfeus.on_android?; end
14
+ def on_mobile?; Isomorfeus.on_mobile?; end
15
+ def on_database?; Isomorfeus.on_database?; end
16
+ def on_tvos?; Isomorfeus.on_tvos?; end
17
+ def on_androidtv?; Isomorfeus.on_androidtv?; end
18
+ def on_tv?; Isomorfeus.on_tv?; end
19
+
20
+ if RUBY_ENGINE == 'opal'
21
+ def after(time_ms, &block)
22
+ `setTimeout(#{block.to_n}, time_ms);`
23
+ end
24
+ else
25
+ def after(time_ms, &block)
26
+ sleep time_ms/1000
27
+ block.call
28
+ end
29
+ end
30
+ end
@@ -9,6 +9,9 @@ module Isomorfeus
9
9
  attr_accessor :on_android
10
10
  attr_accessor :on_mobile
11
11
  attr_accessor :on_database
12
+ attr_accessor :on_tvos
13
+ attr_accessor :on_androidtv
14
+ attr_accessor :on_tv
12
15
 
13
16
  def on_browser?
14
17
  # true if running on browser
@@ -49,25 +52,46 @@ module Isomorfeus
49
52
  # true if running in database context
50
53
  @on_database
51
54
  end
55
+
56
+ def on_tvos?
57
+ # true if running in react-native on tvOS
58
+ @on_tvos
59
+ end
60
+
61
+ def on_androidtv?
62
+ # true if running in react-native on androidtv
63
+ @on_androidtv
64
+ end
65
+
66
+ def on_tv?
67
+ # true if running in react-native on a tv
68
+ @on_tv
69
+ end
52
70
  end
53
71
 
54
- self.on_ssr = `(typeof process === 'object' && typeof process.release === 'object' && typeof process.release.name === 'string' && process.release.name === 'node') ? true : false`
55
- self.on_desktop = `(typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1) ? true : false`
56
- self.on_ios = `(typeof Platform === 'object' && typeof Platform.OS === 'string' && Platform.OS.toLowerCase().includes('ios')) ? true : false`
57
- self.on_android = `(typeof Platform === 'object' && typeof Platform.OS === 'string' && Platform.OS.toLowerCase().includes('android')) ? true : false`
58
- self.on_mobile = self.on_ios? || self.on_android?
59
- self.on_database = false
60
- self.on_browser = !self.on_ssr? && !self.on_desktop? && !self.on_mobile? && !self.on_database?
61
- self.on_server = false
72
+ self.on_ssr = `(typeof process === 'object' && typeof process.release === 'object' && typeof process.release.name === 'string' && process.release.name === 'node') ? true : false`
73
+ self.on_desktop = `(typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1) ? true : false`
74
+ self.on_ios = `(typeof Platform === 'object' && typeof Platform.OS === 'string' && Platform.OS.toLowerCase().includes('ios')) ? true : false`
75
+ self.on_android = `(typeof Platform === 'object' && typeof Platform.OS === 'string' && Platform.OS.toLowerCase().includes('android')) ? true : false`
76
+ self.on_mobile = self.on_ios? || self.on_android?
77
+ self.on_database = false
78
+ self.on_browser = !self.on_ssr? && !self.on_desktop? && !self.on_mobile? && !self.on_database?
79
+ self.on_server = false
80
+ self.on_tvos = false
81
+ self.on_androidtv = false
82
+ self.on_tv = false
62
83
  else
63
84
  class << self
64
- def on_ssr?; false; end
65
- def on_desktop?; false; end
66
- def on_ios?; false; end
67
- def on_android?; false; end
68
- def on_mobile?; false; end
69
- def on_database?; false; end
70
- def on_browser?; false; end
85
+ def on_ssr?; false; end
86
+ def on_desktop?; false; end
87
+ def on_ios?; false; end
88
+ def on_android?; false; end
89
+ def on_mobile?; false; end
90
+ def on_database?; false; end
91
+ def on_browser?; false; end
92
+ def on_tvos?; false; end
93
+ def on_androidtv?; false; end
94
+ def on_tv?; false; end
71
95
 
72
96
  def on_server?
73
97
  true # so true ...
@@ -1,14 +1,20 @@
1
1
  require 'opal'
2
+ require 'isomorfeus/execution_environment'
3
+ require 'isomorfeus/core_ext/kernel'
4
+
2
5
  if RUBY_ENGINE == 'opal'
3
6
  require 'native'
4
7
  require 'promise'
8
+ require 'securerandom'
5
9
  require 'isomorfeus/core_ext/hash/deep_merge'
6
- require 'isomorfeus/execution_environment'
7
- require 'isomorfeus/execution_environment_helpers'
8
10
  require 'redux'
9
11
  require 'redux/store'
10
12
  require 'redux/reducers'
11
13
  require 'isomorfeus/redux_config'
14
+ require 'isomorfeus/browser_store_api'
15
+ require 'local_store'
16
+ require 'session_store'
17
+ require 'app_store'
12
18
 
13
19
  Redux::Reducers::add_application_reducers_to_store
14
20
  Isomorfeus.init_store
@@ -17,8 +23,6 @@ else
17
23
  promise_path = File.join(opal_path, 'stdlib', 'promise.rb')
18
24
  require promise_path
19
25
  require 'redux/version'
20
- require 'isomorfeus/execution_environment'
21
- require 'isomorfeus/execution_environment_helpers'
22
26
 
23
27
  Opal.append_path(__dir__.untaint)
24
28
 
@@ -0,0 +1,41 @@
1
+ class LocalStore
2
+ extend Isomorfeus::BrowserStoreApi
3
+
4
+ class << self
5
+ def method_missing(key, *args, &block)
6
+ if Isomorfeus.on_browser?
7
+ if `args.length > 0`
8
+ key = `key.endsWith('=')` ? key.chop : key
9
+ value = args[0]
10
+ `Opal.global.localStorage.setItem(key, value)`
11
+ notify_subscribers
12
+ value
13
+ else
14
+ # check store for value
15
+ value = `Opal.global.localStorage.getItem(key)`
16
+ return value if value
17
+ end
18
+ end
19
+ # otherwise return nil
20
+ return nil
21
+ end
22
+
23
+ alias [] method_missing
24
+ alias []= method_missing
25
+
26
+ alias get method_missing
27
+ alias set method_missing
28
+
29
+ def delete(key)
30
+ `Opal.global.localStorage.removeItem(key)`
31
+ notify_subscribers
32
+ nil
33
+ end
34
+
35
+ def clear
36
+ `Opal.global.localStorage.clear()`
37
+ notify_subscribers
38
+ nil
39
+ end
40
+ end
41
+ end
@@ -10,7 +10,13 @@ module Redux
10
10
  action[:set_state]
11
11
  else
12
12
  new_state = {}.merge!(prev_state) # make a copy of state
13
- new_state.merge!(action[:name] => action[:value])
13
+ if action.key?(:collected)
14
+ action[:collected].each do |act|
15
+ new_state.merge!(act[:name] => act[:value])
16
+ end
17
+ else
18
+ new_state.merge!(action[:name] => action[:value])
19
+ end
14
20
  new_state
15
21
  end
16
22
  else
@@ -18,8 +24,53 @@ module Redux
18
24
  end
19
25
  end
20
26
 
21
- Redux::Store.preloaded_state_merge!(application_state: {})
22
- Redux::Store.add_reducers(application_state: app_reducer)
27
+ instance_reducer = Redux.create_reducer do |prev_state, action|
28
+ case action[:type]
29
+ when 'INSTANCE_STATE'
30
+ if action.key?(:set_state)
31
+ action[:set_state]
32
+ else
33
+ new_state = {}.merge!(prev_state) # make a copy of state
34
+ if action.key?(:collected)
35
+ action[:collected].each do |act|
36
+ new_state[act[:object_id]] = {} unless new_state.key?(act[:object_id])
37
+ new_state[act[:object_id]].merge!(act[:name] => act[:value])
38
+ end
39
+ else
40
+ new_state[action[:object_id]] = {} unless new_state.key?(action[:object_id])
41
+ new_state[action[:object_id]].merge!(action[:name] => action[:value])
42
+ end
43
+ new_state
44
+ end
45
+ else
46
+ prev_state
47
+ end
48
+ end
49
+
50
+ class_reducer = Redux.create_reducer do |prev_state, action|
51
+ case action[:type]
52
+ when 'CLASS_STATE'
53
+ if action.key?(:set_state)
54
+ action[:set_state]
55
+ else
56
+ new_state = {}.merge!(prev_state) # make a copy of state
57
+ if action.key?(:collected)
58
+ action[:collected].each do |act|
59
+ new_state[act[:class]] = {} unless new_state.key?(act[:class])
60
+ new_state[act[:class]].merge!(act[:name] => act[:value])
61
+ end
62
+ else
63
+ new_state[action[:class]] = {} unless new_state.key?(action[:class])
64
+ new_state[action[:class]].merge!(action[:name] => action[:value])
65
+ end
66
+ new_state
67
+ end
68
+ else
69
+ prev_state
70
+ end
71
+ end
72
+ Redux::Store.preloaded_state_merge!(application_state: {}, instance_state: {}, class_state: {})
73
+ Redux::Store.add_reducers(application_state: app_reducer, instance_state: instance_reducer, class_state: class_reducer)
23
74
  end
24
75
  end
25
76
  end
data/lib/redux/store.rb CHANGED
@@ -125,16 +125,18 @@ module Redux
125
125
  Hash.new(`this.native.getState()`)
126
126
  end
127
127
 
128
- def merge_and_defer_dispatch(action)
129
- if Isomorfeus.on_browser?
128
+ def collect_and_defer_dispatch(action)
129
+ if !Isomorfeus.on_ssr?
130
130
  type = action.delete(:type)
131
- @deferred_actions[type] = {} unless @deferred_actions.key?(type)
132
- @deferred_actions[type].deep_merge!(action)
133
- @last_dispatch_time = `new Date()`
134
- create_deferred_dispatcher(`new Date()`) unless @deferred_dispatcher
131
+ @deferred_actions[type] = [] unless @deferred_actions.key?(type)
132
+ @deferred_actions[type].push(action)
133
+ @last_dispatch_time = `Date.now()`
134
+ `console.log(#@last_dispatch_time)`
135
+ deferred_dispatcher(`Date.now()`) unless @deferred_dispatcher
135
136
  else
136
137
  dispatch(action)
137
138
  end
139
+ nil
138
140
  end
139
141
 
140
142
  def replace_reducer(next_reducer)
@@ -143,35 +145,39 @@ module Redux
143
145
 
144
146
  # returns function needed to unsubscribe the listener
145
147
  def subscribe(&listener)
146
- `this.native.subscribe(function() { return listener$.call(); })`
148
+ `this.native.subscribe(function() { return listener.$call(); })`
147
149
  end
148
150
 
149
151
  private
150
152
 
151
- def create_deferred_dispatcher(first)
153
+ def deferred_dispatcher(first)
152
154
  @deferred_dispatcher = true
153
155
  %x{
154
156
  setTimeout(function() {
155
- if (#{wait_longer?(first)}) { #{create_deferred_dispatcher(first)} }
157
+ if (#{wait_longer?(first)}) { #{deferred_dispatcher(first)} }
156
158
  else { #{dispatch_deferred_dispatches} }
157
- }, 25)
159
+ }, 10)
158
160
  }
159
161
  end
160
162
 
161
163
  def dispatch_deferred_dispatches
164
+ `console.log(Date.now())`
162
165
  @deferred_dispatcher = false
163
166
  actions = @deferred_actions
164
167
  @deferred_actions = {}
165
168
  actions.each do |type, data|
166
- dispatch({type: type}.merge(data))
169
+ dispatch(type: type, collected: data)
167
170
  end
168
171
  end
169
172
 
170
173
  def wait_longer?(first)
171
- t = `new Date()`
172
- return false if (`t - first`) > 50 # ms
173
- return false if (`t - #@last_dispatch_time`) > 10 # ms
174
+ t = `Date.now()`
175
+ time_since_first = `t - first`
176
+ `console.log('delta', time_since_first)`
177
+ return true if `typeof Opal.React !== 'undefined' && typeof Opal.React.render_buffer !== 'undefined' && Opal.React.render_buffer.length > 0 && time_since_first < 1000`
178
+ return false if time_since_first > 100 # ms
179
+ return false if (`t - #@last_dispatch_time`) > 9 # ms
174
180
  return true
175
181
  end
176
182
  end
177
- end
183
+ end
data/lib/redux/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Redux
2
- VERSION = '4.0.21'
2
+ VERSION = '4.0.22'
3
3
  end
@@ -0,0 +1,41 @@
1
+ class SessionStore
2
+ extend Isomorfeus::BrowserStoreApi
3
+
4
+ class << self
5
+ def method_missing(key, *args, &block)
6
+ if Isomorfeus.on_browser?
7
+ if `args.length > 0`
8
+ key = `key.endsWith('=')` ? key.chop : key
9
+ value = args[0]
10
+ `Opal.global.sessionStorage.setItem(key, value)`
11
+ notify_subscribers
12
+ value
13
+ else
14
+ # check store for value
15
+ value = `Opal.global.sessionStorage.getItem(key)`
16
+ return value if value
17
+ end
18
+ end
19
+ # otherwise return nil
20
+ return nil
21
+ end
22
+
23
+ alias [] method_missing
24
+ alias []= method_missing
25
+
26
+ alias get method_missing
27
+ alias set method_missing
28
+
29
+ def delete(key)
30
+ `Opal.global.sessionStorage.removeItem(key)`
31
+ notify_subscribers
32
+ nil
33
+ end
34
+
35
+ def clear
36
+ `Opal.global.sessionStorage.clear()`
37
+ notify_subscribers
38
+ nil
39
+ end
40
+ end
41
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-redux
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.21
4
+ version: 4.0.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-22 00:00:00.000000000 Z
11
+ date: 2020-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opal
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: Use a global store and write reducers for it in Opal Ruby.
41
+ description: Use different stores within Isomorfeus and write reducers for redux.
42
42
  email:
43
43
  - jan@kursator.com
44
44
  executables: []
@@ -46,16 +46,19 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - README.md
49
+ - lib/app_store.rb
49
50
  - lib/isomorfeus-redux.rb
51
+ - lib/isomorfeus/browser_store_api.rb
50
52
  - lib/isomorfeus/core_ext/hash/deep_merge.rb
53
+ - lib/isomorfeus/core_ext/kernel.rb
51
54
  - lib/isomorfeus/execution_environment.rb
52
- - lib/isomorfeus/execution_environment_helpers.rb
53
- - lib/isomorfeus/promise.rb
54
55
  - lib/isomorfeus/redux_config.rb
56
+ - lib/local_store.rb
55
57
  - lib/redux.rb
56
58
  - lib/redux/reducers.rb
57
59
  - lib/redux/store.rb
58
60
  - lib/redux/version.rb
61
+ - lib/session_store.rb
59
62
  homepage: http://isomorfeus.com
60
63
  licenses:
61
64
  - MIT
@@ -79,5 +82,5 @@ requirements: []
79
82
  rubygems_version: 3.0.6
80
83
  signing_key:
81
84
  specification_version: 4
82
- summary: Redux for Opal Ruby.
85
+ summary: Redux and Stores for Isomorfeus.
83
86
  test_files: []
@@ -1,12 +0,0 @@
1
- module Isomorfeus
2
- module ExecutionEnvironmentHelpers
3
- def on_browser?; Isomorfeus.on_browser?; end
4
- def on_ssr?; Isomorfeus.on_ssr?; end
5
- def on_desktop?; Isomorfeus.on_desktop?; end
6
- def on_ios?; Isomorfeus.on_ios?; end
7
- def on_android?; Isomorfeus.on_android?; end
8
- def on_mobile?; Isomorfeus.on_mobile?; end
9
- def on_database?; Isomorfeus.on_database?; end
10
- def on_server?; Isomorfeus.on_server?; end
11
- end
12
- end
@@ -1,3 +0,0 @@
1
- opal_path = Gem::Specification.find_by_name('opal').full_gem_path
2
- promise_path = File.join(opal_path, 'stdlib', 'promise.rb')
3
- require promise_path