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

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: 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