hyper-state 1.0.alpha1.3 → 1.0.alpha1.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b2e57db899fdc1cf26978b2a1bc65abe6e9e9394594be644163de6070c2376d
4
- data.tar.gz: 014705ce36d24c695f5d104004dc70be1a2d8f9039d879ab36887bebfdd14c88
3
+ metadata.gz: 8c41d6f6cf503727dc54d96011ffb061b738f2dc3e8b49788c37bd8763b94e16
4
+ data.tar.gz: f4df7162bdfdf5a6cb8e7c8447614377d3c593ef2a314608da4ff45fe330790d
5
5
  SHA512:
6
- metadata.gz: bbc9b8724cb6cf3b0c82c081270d2bdba0cf1378261ce2abfcb62629a24af6e8a128e2a3cfe9ce7a71a293c0463e9c5e627602ddf092b9cc7c91088a8633b0e5
7
- data.tar.gz: cb72f01f5629cff13064a0b125eb3a618bdef737f6413c9778ca4a6297b1ce4d30d176588d185cc8547ada050b620db45a217c919e620c34e8674ef5d15e443b
6
+ metadata.gz: 78b10172dff1829f4266edfbecf06d1f24a26969b3c65f5beba0bcb3892342015331027f00d8f10d57386c4b77e277e7332a0b65cf42f45b7c877ce10c016673
7
+ data.tar.gz: afbfcfcec93a744b21c950095d015c7c73b052a8b14382e18d2a46b1fee2967c6158b1ace4ce4e3bd91b5e98bba1b6c6ebb68c88a8390296d8bf44b56010c290
data/.gitignore CHANGED
@@ -11,7 +11,6 @@ capybara-*.html
11
11
  **.orig
12
12
  rerun.txt
13
13
  pickle-email-*.html
14
- Gemfile.lock
15
14
 
16
15
  # TODO Comment out these rules if you are OK with secrets being uploaded to the repo
17
16
  config/initializers/secret_token.rb
@@ -51,3 +50,7 @@ bower.json
51
50
 
52
51
  # ignore IDE files
53
52
  .idea
53
+
54
+ # ignore Gemfile.locks https://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/
55
+ /spec/test_app/Gemfile.lock
56
+ /Gemfile.lock
data/hyper-state.gemspec CHANGED
@@ -9,39 +9,33 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ['Mitch VanDuyn', 'Adam Creekroad', 'Jan Biedermann']
10
10
  spec.email = ['mitch@catprint.com', 'jan@kursator.com']
11
11
  spec.summary = 'Flux Stores and more for Hyperloop'
12
- spec.homepage = 'https://ruby-hyperloop.org'
12
+ spec.homepage = 'https://hyperstack.org'
13
13
  spec.license = 'MIT'
14
- # spec.metadata = {
15
- # "homepage_uri" => 'http://ruby-hyperloop.org',
16
- # "source_code_uri" => 'https://github.com/ruby-hyperloop/hyper-component'
17
- # }
18
-
19
14
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(gemfiles|spec)/}) }
20
15
  spec.bindir = 'exe'
21
16
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
17
  spec.require_paths = ['lib']
23
18
 
24
19
  spec.add_dependency 'hyperstack-config', Hyperstack::State::VERSION
25
- spec.add_dependency 'opal', '>= 0.11.0', '< 0.12.0'
26
- spec.add_development_dependency 'bundler', ['>= 1.17.3', '< 2.1']
20
+
21
+ spec.add_development_dependency 'bundler'
27
22
  spec.add_development_dependency 'chromedriver-helper'
28
23
  spec.add_development_dependency 'hyper-component', Hyperstack::State::VERSION
29
24
  spec.add_development_dependency 'hyper-spec', Hyperstack::State::VERSION
30
25
  spec.add_development_dependency 'listen'
31
- spec.add_development_dependency 'mini_racer', '~> 0.2.4'
26
+ # spec.add_development_dependency 'mini_racer', '~> 0.2.4'
32
27
  spec.add_development_dependency 'opal-browser', '~> 0.2.0'
33
- spec.add_development_dependency 'opal-rails', '~> 0.9.4'
34
- spec.add_development_dependency 'pry-byebug'
28
+ spec.add_development_dependency 'opal-rails', '>= 0.9.4', '< 2.0'
35
29
  spec.add_development_dependency 'pry-rescue'
30
+ spec.add_development_dependency 'pry-stack_explorer'
36
31
  spec.add_development_dependency 'puma'
37
- spec.add_development_dependency 'rails', '>= 4.0.0'
32
+ spec.add_development_dependency 'rails', ENV['RAILS_VERSION'] || '>= 5.0.0', '< 7.0'
38
33
  spec.add_development_dependency 'rake'
39
34
  spec.add_development_dependency 'react-rails', '>= 2.4.0', '< 2.5.0'
40
35
  spec.add_development_dependency 'rspec', '~> 3.7.0'
41
36
  spec.add_development_dependency 'rspec-rails'
42
37
  spec.add_development_dependency 'rspec-steps', '~> 2.1.1'
43
- spec.add_development_dependency 'rubocop', '~> 0.51.0'
44
- spec.add_development_dependency 'sqlite3'
38
+ spec.add_development_dependency 'rubocop' #, '~> 0.51.0'
39
+ spec.add_development_dependency 'sqlite3', '~> 1.4.2' # see https://github.com/rails/rails/issues/35153
45
40
  spec.add_development_dependency 'timecop', '~> 0.8.1'
46
-
47
41
  end
@@ -0,0 +1,25 @@
1
+ module ObjectSpace
2
+ def self.each_object(target_klass, &block)
3
+ klasses = [Object]
4
+ i = 0
5
+ loop do
6
+ klass = klasses[i]
7
+ yield klass
8
+ names = `klass.$$const` && `Object.keys(klass.$$const)`
9
+ names.each do |name|
10
+ begin
11
+ k = klass.const_get(name) rescue nil
12
+ next unless `k.$$const`
13
+ next unless k.respond_to?(:is_a?)
14
+ next if klasses.include?(k)
15
+
16
+ klasses << k if k.is_a? target_klass
17
+ rescue Exception => e
18
+ next
19
+ end
20
+ end if names
21
+ i += 1
22
+ break if i >= klasses.length
23
+ end
24
+ end
25
+ end
data/lib/hyper-state.rb CHANGED
@@ -12,7 +12,9 @@ require 'hyperstack/state/observable'
12
12
  require 'hyperstack/state/observer'
13
13
  require 'hyperstack/state/version'
14
14
 
15
- if RUBY_ENGINE != 'opal'
15
+ if RUBY_ENGINE == 'opal'
16
+ require 'ext/object_space'
17
+ else
16
18
  require 'opal'
17
19
  Opal.append_path(File.expand_path('../', __FILE__).untaint)
18
20
  end
@@ -12,29 +12,30 @@ module Hyperstack
12
12
 
13
13
  def run_callback(name, *args)
14
14
  self.class.callbacks_for(name).flatten.each do |callback|
15
- result = if callback.is_a?(Proc)
16
- instance_exec(*args, &callback)
17
- else
18
- send(callback, *args)
19
- end
20
- args = yield(result) if block_given?
15
+ callback = method(callback) unless callback.is_a? Proc
16
+ args = self.class.send("_#{name}_before_call_hook", name, self, callback, *args)
21
17
  end
22
18
  args
23
19
  end
24
20
 
25
21
  module ClassMethods
26
- def define_callback(callback_name, &after_define_hook)
22
+ def define_callback(callback_name, before_call_hook: nil, after_define_hook: nil)
27
23
  wrapper_name = "_#{callback_name}_callbacks"
28
24
  define_singleton_method(wrapper_name) do
29
25
  Context.set_var(self, "@#{wrapper_name}", force: true) { [] }
30
26
  end
27
+ before_call_hook ||= lambda do |_name, sself, proc, *args|
28
+ sself.instance_exec(*args, &proc)
29
+ args
30
+ end
31
+ define_singleton_method("_#{callback_name}_before_call_hook", &before_call_hook)
31
32
  define_singleton_method(callback_name) do |*args, &block|
32
33
  args << block if block_given?
33
34
  send(wrapper_name).push args
34
35
  Hotloader.when_file_updates do
35
36
  send(wrapper_name).delete_if { |item| item.equal? args }
36
37
  end
37
- after_define_hook.call(*args, &block) if after_define_hook
38
+ after_define_hook.call(self) if after_define_hook
38
39
  end
39
40
  end
40
41
 
@@ -102,6 +102,18 @@ module Hyperstack
102
102
  @bulk_update_flag = saved_bulk_update_flag
103
103
  end
104
104
 
105
+ # React already will batch together updates inside of event handlers
106
+ # so we don't have to, and having Hyperstack batch them outside of the
107
+ # event handler causes INPUT/TEXT/SELECT s not to work properly.
108
+ # This method is called by the Component event wrapper.
109
+ def ignore_bulk_updates(*args)
110
+ saved_ignore_bulk_update_flag = @ignore_bulk_update_flag
111
+ @ignore_bulk_update_flag = true
112
+ yield(*args)
113
+ ensure
114
+ @ignore_bulk_update_flag = saved_ignore_bulk_update_flag
115
+ end
116
+
105
117
  def ignore_mutations
106
118
  saved_ignore_mutations_flag = @ignore_mutations
107
119
  @ignore_mutations = true
@@ -207,9 +219,10 @@ module Hyperstack
207
219
  # case that the object being updated is themselves.
208
220
 
209
221
  def delay_updates?(object)
210
- @bulk_update_flag ||
211
- (Hyperstack.on_client? &&
212
- (@immediate_update != @current_observer || @current_observer != object))
222
+ return false if @ignore_bulk_update_flag
223
+ return true if @bulk_update_flag
224
+ return false unless Hyperstack.on_client?
225
+ (@immediate_update != @current_observer || @current_observer != object)
213
226
  end
214
227
 
215
228
  # schedule_delayed_updater adds a new set to the
@@ -13,7 +13,9 @@ module Hyperstack
13
13
  map_object[0]
14
14
  end
15
15
 
16
- def set(obj, name, value)
16
+ def set(obj, name, value, _x = nil)
17
+ # _x is some legacy function, which I think queued up state changes to the end
18
+ # which is perhaps now the default.
17
19
  map_object = legacy_map[obj][name]
18
20
  map_object[0] = value
19
21
  Hyperstack::Internal::State::Mapper.mutated!(map_object.object_id)
@@ -12,13 +12,13 @@ module Hyperstack
12
12
  Internal::Receiver.mount(self, *args, &block)
13
13
  end
14
14
  base.send(:"define_#{kind}", :observe) do |*args, &block|
15
- result = block && block.call || args.last
15
+ result = block ? block.call : args.last
16
16
  Internal::State::Mapper.observed! self
17
17
  result
18
18
  end
19
19
  base.send(:"define_#{kind}", :mutate) do |*args, &block|
20
20
  # any args will be ignored thus allowing us to say `mutate @foo = 123, @bar[:x] = 7` etc
21
- result = block && block.call || args.last
21
+ result = block ? block.call : args.last
22
22
  Internal::State::Mapper.mutated! self
23
23
  result
24
24
  end
@@ -97,6 +97,28 @@ module Hyperstack
97
97
  state_writer(*names)
98
98
  end
99
99
  end
100
+ # receives is defined at the class an instance level above, but for
101
+ # convenience we also define it as singleton_method on the singleton class allowing this:
102
+ # class Foo
103
+ # class << self
104
+ # receives ...
105
+ # end
106
+ # end
107
+ base.singleton_class.define_singleton_method(:receives) do |*args, &block|
108
+ Internal::Receiver.mount(base, *args, &block)
109
+ end
110
+
111
+ unless base.respond_to? :__hyperstack_state_observer_included
112
+ base.receives Hyperstack::Application::Boot do
113
+ ObjectSpace.each_object(Class) do |klass|
114
+ next unless klass <= base
115
+ next unless klass.respond_to?(:initialize)
116
+ next unless klass.method(:initialize).arity.zero?
117
+ klass.initialize
118
+ end
119
+ end
120
+ base.singleton_class.attr_reader :__hyperstack_state_observer_included
121
+ end
100
122
  end
101
123
  end
102
124
  end
@@ -1,5 +1,5 @@
1
1
  module Hyperstack
2
2
  module State
3
- VERSION = '1.0.alpha1.3'
3
+ VERSION = '1.0.alpha1.8'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper-state
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.alpha1.3
4
+ version: 1.0.alpha1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitch VanDuyn
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-01-17 00:00:00.000000000 Z
13
+ date: 2021-04-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hyperstack-config
@@ -18,54 +18,28 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.alpha1.3
21
+ version: 1.0.alpha1.8
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 1.0.alpha1.3
29
- - !ruby/object:Gem::Dependency
30
- name: opal
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: 0.11.0
36
- - - "<"
37
- - !ruby/object:Gem::Version
38
- version: 0.12.0
39
- type: :runtime
40
- prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: 0.11.0
46
- - - "<"
47
- - !ruby/object:Gem::Version
48
- version: 0.12.0
28
+ version: 1.0.alpha1.8
49
29
  - !ruby/object:Gem::Dependency
50
30
  name: bundler
51
31
  requirement: !ruby/object:Gem::Requirement
52
32
  requirements:
53
33
  - - ">="
54
34
  - !ruby/object:Gem::Version
55
- version: 1.17.3
56
- - - "<"
57
- - !ruby/object:Gem::Version
58
- version: '2.1'
35
+ version: '0'
59
36
  type: :development
60
37
  prerelease: false
61
38
  version_requirements: !ruby/object:Gem::Requirement
62
39
  requirements:
63
40
  - - ">="
64
41
  - !ruby/object:Gem::Version
65
- version: 1.17.3
66
- - - "<"
67
- - !ruby/object:Gem::Version
68
- version: '2.1'
42
+ version: '0'
69
43
  - !ruby/object:Gem::Dependency
70
44
  name: chromedriver-helper
71
45
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +60,28 @@ dependencies:
86
60
  requirements:
87
61
  - - '='
88
62
  - !ruby/object:Gem::Version
89
- version: 1.0.alpha1.3
63
+ version: 1.0.alpha1.8
90
64
  type: :development
91
65
  prerelease: false
92
66
  version_requirements: !ruby/object:Gem::Requirement
93
67
  requirements:
94
68
  - - '='
95
69
  - !ruby/object:Gem::Version
96
- version: 1.0.alpha1.3
70
+ version: 1.0.alpha1.8
97
71
  - !ruby/object:Gem::Dependency
98
72
  name: hyper-spec
99
73
  requirement: !ruby/object:Gem::Requirement
100
74
  requirements:
101
75
  - - '='
102
76
  - !ruby/object:Gem::Version
103
- version: 1.0.alpha1.3
77
+ version: 1.0.alpha1.8
104
78
  type: :development
105
79
  prerelease: false
106
80
  version_requirements: !ruby/object:Gem::Requirement
107
81
  requirements:
108
82
  - - '='
109
83
  - !ruby/object:Gem::Version
110
- version: 1.0.alpha1.3
84
+ version: 1.0.alpha1.8
111
85
  - !ruby/object:Gem::Dependency
112
86
  name: listen
113
87
  requirement: !ruby/object:Gem::Requirement
@@ -122,20 +96,6 @@ dependencies:
122
96
  - - ">="
123
97
  - !ruby/object:Gem::Version
124
98
  version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: mini_racer
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: 0.2.4
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: 0.2.4
139
99
  - !ruby/object:Gem::Dependency
140
100
  name: opal-browser
141
101
  requirement: !ruby/object:Gem::Requirement
@@ -154,18 +114,24 @@ dependencies:
154
114
  name: opal-rails
155
115
  requirement: !ruby/object:Gem::Requirement
156
116
  requirements:
157
- - - "~>"
117
+ - - ">="
158
118
  - !ruby/object:Gem::Version
159
119
  version: 0.9.4
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '2.0'
160
123
  type: :development
161
124
  prerelease: false
162
125
  version_requirements: !ruby/object:Gem::Requirement
163
126
  requirements:
164
- - - "~>"
127
+ - - ">="
165
128
  - !ruby/object:Gem::Version
166
129
  version: 0.9.4
130
+ - - "<"
131
+ - !ruby/object:Gem::Version
132
+ version: '2.0'
167
133
  - !ruby/object:Gem::Dependency
168
- name: pry-byebug
134
+ name: pry-rescue
169
135
  requirement: !ruby/object:Gem::Requirement
170
136
  requirements:
171
137
  - - ">="
@@ -179,7 +145,7 @@ dependencies:
179
145
  - !ruby/object:Gem::Version
180
146
  version: '0'
181
147
  - !ruby/object:Gem::Dependency
182
- name: pry-rescue
148
+ name: pry-stack_explorer
183
149
  requirement: !ruby/object:Gem::Requirement
184
150
  requirements:
185
151
  - - ">="
@@ -212,14 +178,20 @@ dependencies:
212
178
  requirements:
213
179
  - - ">="
214
180
  - !ruby/object:Gem::Version
215
- version: 4.0.0
181
+ version: 5.0.0
182
+ - - "<"
183
+ - !ruby/object:Gem::Version
184
+ version: '7.0'
216
185
  type: :development
217
186
  prerelease: false
218
187
  version_requirements: !ruby/object:Gem::Requirement
219
188
  requirements:
220
189
  - - ">="
221
190
  - !ruby/object:Gem::Version
222
- version: 4.0.0
191
+ version: 5.0.0
192
+ - - "<"
193
+ - !ruby/object:Gem::Version
194
+ version: '7.0'
223
195
  - !ruby/object:Gem::Dependency
224
196
  name: rake
225
197
  requirement: !ruby/object:Gem::Requirement
@@ -300,30 +272,30 @@ dependencies:
300
272
  name: rubocop
301
273
  requirement: !ruby/object:Gem::Requirement
302
274
  requirements:
303
- - - "~>"
275
+ - - ">="
304
276
  - !ruby/object:Gem::Version
305
- version: 0.51.0
277
+ version: '0'
306
278
  type: :development
307
279
  prerelease: false
308
280
  version_requirements: !ruby/object:Gem::Requirement
309
281
  requirements:
310
- - - "~>"
282
+ - - ">="
311
283
  - !ruby/object:Gem::Version
312
- version: 0.51.0
284
+ version: '0'
313
285
  - !ruby/object:Gem::Dependency
314
286
  name: sqlite3
315
287
  requirement: !ruby/object:Gem::Requirement
316
288
  requirements:
317
- - - ">="
289
+ - - "~>"
318
290
  - !ruby/object:Gem::Version
319
- version: '0'
291
+ version: 1.4.2
320
292
  type: :development
321
293
  prerelease: false
322
294
  version_requirements: !ruby/object:Gem::Requirement
323
295
  requirements:
324
- - - ">="
296
+ - - "~>"
325
297
  - !ruby/object:Gem::Version
326
- version: '0'
298
+ version: 1.4.2
327
299
  - !ruby/object:Gem::Dependency
328
300
  name: timecop
329
301
  requirement: !ruby/object:Gem::Requirement
@@ -353,6 +325,7 @@ files:
353
325
  - README.md
354
326
  - Rakefile
355
327
  - hyper-state.gemspec
328
+ - lib/ext/object_space.rb
356
329
  - lib/hyper-state.rb
357
330
  - lib/hyperstack/internal/auto_unmount.rb
358
331
  - lib/hyperstack/internal/callbacks.rb
@@ -363,7 +336,7 @@ files:
363
336
  - lib/hyperstack/state/observer.rb
364
337
  - lib/hyperstack/state/version.rb
365
338
  - notes.md
366
- homepage: https://ruby-hyperloop.org
339
+ homepage: https://hyperstack.org
367
340
  licenses:
368
341
  - MIT
369
342
  metadata: {}
@@ -382,7 +355,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
382
355
  - !ruby/object:Gem::Version
383
356
  version: 1.3.1
384
357
  requirements: []
385
- rubygems_version: 3.0.2
358
+ rubygems_version: 3.0.8
386
359
  signing_key:
387
360
  specification_version: 4
388
361
  summary: Flux Stores and more for Hyperloop