hyper-state 1.0.alpha1.5 → 1.0.pre.alpha1

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: bbfec87cc6da586fe45f940f9d45f0cd75c4fd1c310fbff4369a122d2227f5c8
4
- data.tar.gz: 67b6304b162a71b483791b94552d349ed7156c40c102423cabbd6f439570d1ce
3
+ metadata.gz: ba8256138d1f2055844b402e5a17a8b0331d1b2f14e28c176bf497d45f2e7b77
4
+ data.tar.gz: 1dc6ebdacba52e9c202425e184d60716deb3b6060ae6c77de56ae7c6e11f525c
5
5
  SHA512:
6
- metadata.gz: 7c4931c8b4020f833b41389669d7a57e4790a1a6dc7149d1403bc71cc73b1c7624611cb4a0663a7aa71a5c35123c365ebd1ee348c78abf1e236a3dc3aabb63ff
7
- data.tar.gz: 290f3579a58e7549759fe4a4692548e9686dc1ea724df2dd9fd0b015dda7dc611a4c0e5981f49cf0fb0939a867750205c68e18086f13ed0e416699fd401f2525
6
+ metadata.gz: 00b0c167d148cedbbeee3986f18e98900d38ca12f1b7866c23f2564c9e393709f62fce429e56f493a0bc07969dd24850a6f0eadb0f24bc27b398badd5799af00
7
+ data.tar.gz: af662d79a2cab41dc405480588f29a902a87b82ec117e9c70917bbf27ca557873f315f1302ab9a6aadb32e25135d466071944d63c4316646817af6fe162df303
data/.gitignore CHANGED
@@ -11,6 +11,7 @@ capybara-*.html
11
11
  **.orig
12
12
  rerun.txt
13
13
  pickle-email-*.html
14
+ Gemfile.lock
14
15
 
15
16
  # TODO Comment out these rules if you are OK with secrets being uploaded to the repo
16
17
  config/initializers/secret_token.rb
@@ -50,7 +51,3 @@ bower.json
50
51
 
51
52
  # ignore IDE files
52
53
  .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
@@ -23,12 +23,12 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_dependency 'hyperstack-config', Hyperstack::State::VERSION
25
25
  spec.add_dependency 'opal', '>= 0.11.0', '< 0.12.0'
26
- spec.add_development_dependency 'bundler', ['>= 1.17.3', '< 2.1']
26
+ spec.add_development_dependency 'bundler'
27
27
  spec.add_development_dependency 'chromedriver-helper'
28
28
  spec.add_development_dependency 'hyper-component', Hyperstack::State::VERSION
29
29
  spec.add_development_dependency 'hyper-spec', Hyperstack::State::VERSION
30
30
  spec.add_development_dependency 'listen'
31
- spec.add_development_dependency 'mini_racer', '~> 0.2.4'
31
+ spec.add_development_dependency 'mini_racer', '~> 0.1.15'
32
32
  spec.add_development_dependency 'opal-browser', '~> 0.2.0'
33
33
  spec.add_development_dependency 'opal-rails', '~> 0.9.4'
34
34
  spec.add_development_dependency 'pry-byebug'
@@ -41,7 +41,7 @@ Gem::Specification.new do |spec|
41
41
  spec.add_development_dependency 'rspec-rails'
42
42
  spec.add_development_dependency 'rspec-steps', '~> 2.1.1'
43
43
  spec.add_development_dependency 'rubocop', '~> 0.51.0'
44
- spec.add_development_dependency 'sqlite3', '~> 1.3.6' # see https://github.com/rails/rails/issues/35153
44
+ spec.add_development_dependency 'sqlite3'
45
45
  spec.add_development_dependency 'timecop', '~> 0.8.1'
46
46
 
47
47
  end
@@ -5,7 +5,6 @@ require 'hyperstack/internal/callbacks'
5
5
  require 'hyperstack/internal/auto_unmount'
6
6
 
7
7
  require 'hyperstack/internal/state/mapper'
8
- require 'hyperstack/internal/state/variable'
9
8
  require 'hyperstack/internal/auto_unmount'
10
9
  require 'hyperstack/internal/receiver'
11
10
  require 'hyperstack/state/observable'
@@ -3,7 +3,7 @@ module Hyperstack
3
3
  module Callbacks
4
4
  if RUBY_ENGINE != 'opal'
5
5
  class Hyperstack::Hotloader
6
- def self.when_file_updates(&block); end
6
+ def self.record(*args); end
7
7
  end
8
8
  end
9
9
  def self.included(base)
@@ -11,15 +11,13 @@ module Hyperstack
11
11
  end
12
12
 
13
13
  def run_callback(name, *args)
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?
14
+ self.class.callbacks_for(name).each do |callback|
15
+ if callback.is_a?(Proc)
16
+ instance_exec(*args, &callback)
17
+ else
18
+ send(callback, *args)
19
+ end
21
20
  end
22
- args
23
21
  end
24
22
 
25
23
  module ClassMethods
@@ -29,11 +27,9 @@ module Hyperstack
29
27
  Context.set_var(self, "@#{wrapper_name}", force: true) { [] }
30
28
  end
31
29
  define_singleton_method(callback_name) do |*args, &block|
32
- args << block if block_given?
33
- send(wrapper_name).push args
34
- Hotloader.when_file_updates do
35
- send(wrapper_name).delete_if { |item| item.equal? args }
36
- end
30
+ send(wrapper_name).concat(args)
31
+ send(wrapper_name).push(block) if block_given?
32
+ Hotloader.record(self, "@#{wrapper_name}", 4, *args, block)
37
33
  after_define_hook.call(*args, &block) if after_define_hook
38
34
  end
39
35
  end
@@ -46,10 +42,6 @@ module Hyperstack
46
42
  []
47
43
  end + send(wrapper_name)
48
44
  end
49
-
50
- def callbacks?(name)
51
- callbacks_for(name).any?
52
- end
53
45
  end
54
46
  end
55
47
  end
@@ -102,18 +102,6 @@ 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
-
117
105
  def ignore_mutations
118
106
  saved_ignore_mutations_flag = @ignore_mutations
119
107
  @ignore_mutations = true
@@ -219,10 +207,9 @@ module Hyperstack
219
207
  # case that the object being updated is themselves.
220
208
 
221
209
  def delay_updates?(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)
210
+ @bulk_update_flag ||
211
+ (Hyperstack.on_client? &&
212
+ (@immediate_update != @current_observer || @current_observer != object))
226
213
  end
227
214
 
228
215
  # schedule_delayed_updater adds a new set to the
@@ -11,21 +11,14 @@ module Hyperstack
11
11
  base.send(:"define_#{kind}", :receives) do |*args, &block|
12
12
  Internal::Receiver.mount(self, *args, &block)
13
13
  end
14
- base.send(:"define_#{kind}", :observe) do |*args, &block|
15
- result = block && block.call || args.last
14
+ base.send(:"define_#{kind}", :observe) do |&block|
15
+ result = block.call if block
16
16
  Internal::State::Mapper.observed! self
17
17
  result
18
18
  end
19
- base.send(:"define_#{kind}", :mutate) do |*args, &block|
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
22
- Internal::State::Mapper.mutated! self
23
- result
24
- end
25
- base.send(:"define_#{kind}", :toggle) do |var|
26
- # @var = !@var
27
- var = "@#{var}"
28
- result = instance_variable_set(var, !instance_variable_get(var))
21
+ result = block.call if block
29
22
  Internal::State::Mapper.mutated! self
30
23
  result
31
24
  end
@@ -1,5 +1,5 @@
1
1
  module Hyperstack
2
2
  module State
3
- VERSION = '1.0.alpha1.5'
3
+ VERSION = '1.0-alpha1'
4
4
  end
5
5
  end
data/notes.md CHANGED
@@ -1,6 +1,6 @@
1
1
  typically we see this:
2
2
 
3
- `State::Variable.get(obj_or_class, key)` and `State::Variable.set(obj_or_class, key, val)`
3
+ `State.get_state(obj_or_class, key)` and `State.set_state(obj_or_class, key, val)`
4
4
 
5
5
  we would like to see this:
6
6
 
@@ -66,11 +66,11 @@ internally without reaction
66
66
  so one approach would be to just provide two methods: `observed!` and `mutated!`
67
67
  ```ruby
68
68
  def observed!
69
- State::Variable.get(self, self)
69
+ State.get_state(self, self)
70
70
  end
71
71
 
72
72
  def mutated!
73
- State::Variable.set(self, self, self)
73
+ State.set_state(self, self, self)
74
74
  end
75
75
  ```
76
76
 
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.5
4
+ version: 1.0.pre.alpha1
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-06-19 00:00:00.000000000 Z
13
+ date: 2018-11-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hyperstack-config
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.alpha1.5
21
+ version: 1.0.pre.alpha1
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.5
28
+ version: 1.0.pre.alpha1
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: opal
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +52,14 @@ dependencies:
52
52
  requirements:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
- version: 1.17.3
56
- - - "<"
57
- - !ruby/object:Gem::Version
58
- version: '2.1'
55
+ version: '0'
59
56
  type: :development
60
57
  prerelease: false
61
58
  version_requirements: !ruby/object:Gem::Requirement
62
59
  requirements:
63
60
  - - ">="
64
61
  - !ruby/object:Gem::Version
65
- version: 1.17.3
66
- - - "<"
67
- - !ruby/object:Gem::Version
68
- version: '2.1'
62
+ version: '0'
69
63
  - !ruby/object:Gem::Dependency
70
64
  name: chromedriver-helper
71
65
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +80,28 @@ dependencies:
86
80
  requirements:
87
81
  - - '='
88
82
  - !ruby/object:Gem::Version
89
- version: 1.0.alpha1.5
83
+ version: 1.0.pre.alpha1
90
84
  type: :development
91
85
  prerelease: false
92
86
  version_requirements: !ruby/object:Gem::Requirement
93
87
  requirements:
94
88
  - - '='
95
89
  - !ruby/object:Gem::Version
96
- version: 1.0.alpha1.5
90
+ version: 1.0.pre.alpha1
97
91
  - !ruby/object:Gem::Dependency
98
92
  name: hyper-spec
99
93
  requirement: !ruby/object:Gem::Requirement
100
94
  requirements:
101
95
  - - '='
102
96
  - !ruby/object:Gem::Version
103
- version: 1.0.alpha1.5
97
+ version: 1.0.pre.alpha1
104
98
  type: :development
105
99
  prerelease: false
106
100
  version_requirements: !ruby/object:Gem::Requirement
107
101
  requirements:
108
102
  - - '='
109
103
  - !ruby/object:Gem::Version
110
- version: 1.0.alpha1.5
104
+ version: 1.0.pre.alpha1
111
105
  - !ruby/object:Gem::Dependency
112
106
  name: listen
113
107
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +122,14 @@ dependencies:
128
122
  requirements:
129
123
  - - "~>"
130
124
  - !ruby/object:Gem::Version
131
- version: 0.2.4
125
+ version: 0.1.15
132
126
  type: :development
133
127
  prerelease: false
134
128
  version_requirements: !ruby/object:Gem::Requirement
135
129
  requirements:
136
130
  - - "~>"
137
131
  - !ruby/object:Gem::Version
138
- version: 0.2.4
132
+ version: 0.1.15
139
133
  - !ruby/object:Gem::Dependency
140
134
  name: opal-browser
141
135
  requirement: !ruby/object:Gem::Requirement
@@ -314,16 +308,16 @@ dependencies:
314
308
  name: sqlite3
315
309
  requirement: !ruby/object:Gem::Requirement
316
310
  requirements:
317
- - - "~>"
311
+ - - ">="
318
312
  - !ruby/object:Gem::Version
319
- version: 1.3.6
313
+ version: '0'
320
314
  type: :development
321
315
  prerelease: false
322
316
  version_requirements: !ruby/object:Gem::Requirement
323
317
  requirements:
324
- - - "~>"
318
+ - - ">="
325
319
  - !ruby/object:Gem::Version
326
- version: 1.3.6
320
+ version: '0'
327
321
  - !ruby/object:Gem::Dependency
328
322
  name: timecop
329
323
  requirement: !ruby/object:Gem::Requirement
@@ -358,7 +352,6 @@ files:
358
352
  - lib/hyperstack/internal/callbacks.rb
359
353
  - lib/hyperstack/internal/receiver.rb
360
354
  - lib/hyperstack/internal/state/mapper.rb
361
- - lib/hyperstack/internal/state/variable.rb
362
355
  - lib/hyperstack/state/observable.rb
363
356
  - lib/hyperstack/state/observer.rb
364
357
  - lib/hyperstack/state/version.rb
@@ -382,7 +375,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
382
375
  - !ruby/object:Gem::Version
383
376
  version: 1.3.1
384
377
  requirements: []
385
- rubygems_version: 3.0.4
378
+ rubyforge_project:
379
+ rubygems_version: 2.7.8
386
380
  signing_key:
387
381
  specification_version: 4
388
382
  summary: Flux Stores and more for Hyperloop
@@ -1,174 +0,0 @@
1
- module Hyperstack
2
- module Internal
3
- module State
4
- module Variable
5
- class << self
6
- def legacy_map
7
- @legacy_map ||= Hash.new { |h, k| h[k] = Hash.new { |h2, k2| h2[k2] = Array.new }}
8
- end
9
-
10
- def get(obj, name)
11
- map_object = legacy_map[obj][name]
12
- Hyperstack::Internal::State::Mapper.observed!(map_object.object_id)
13
- map_object[0]
14
- end
15
-
16
- def set(obj, name, value)
17
- map_object = legacy_map[obj][name]
18
- map_object[0] = value
19
- Hyperstack::Internal::State::Mapper.mutated!(map_object.object_id)
20
- value
21
- end
22
-
23
- def observed?(obj, name)
24
- map_object = legacy_map[obj][name]
25
- Hyperstack::Internal::State::Mapper.observed?(map_object.object_id)
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
32
-
33
- # ALWAYS_UPDATE_STATE_AFTER_RENDER = Hyperstack.on_client? # if on server then we don't wait to update the state
34
- # @rendering_level = 0
35
- #
36
- # class << self
37
- # attr_reader :current_observer
38
- #
39
- # def has_observers?(object, name)
40
- # !observers_by_name[object][name].empty?
41
- # end
42
- #
43
- # def bulk_update
44
- # saved_bulk_update_flag = @bulk_update_flag
45
- # @bulk_update_flag = true
46
- # yield
47
- # ensure
48
- # @bulk_update_flag = saved_bulk_update_flag
49
- # end
50
- #
51
- # def set_state2(object, name, value, updates, exclusions = nil)
52
- # # set object's name state to value, tell all observers it has changed.
53
- # # Observers must implement update_react_js_state
54
- # object_needs_notification = object.respond_to?(:update_react_js_state)
55
- # observers_by_name[object][name].dup.each do |observer|
56
- # next if exclusions && exclusions.include?(observer)
57
- # updates[observer] += [object, name, value]
58
- # object_needs_notification = false if object == observer
59
- # end
60
- # updates[object] += [nil, name, value] if object_needs_notification
61
- # end
62
- #
63
- # def initialize_states(object, initial_values) # initialize objects' name/value pairs
64
- # states[object].merge!(initial_values || {})
65
- # end
66
- #
67
- # def get_state(object, name, current_observer = @current_observer)
68
- # # get current value of name for object, remember that the current object depends on this state,
69
- # # current observer can be overriden with last param
70
- # if current_observer && !new_observers[current_observer][object].include?(name)
71
- # new_observers[current_observer][object] << name
72
- # end
73
- # if @delayed_updates && @delayed_updates[object][name]
74
- # @delayed_updates[object][name][1] << current_observer
75
- # end
76
- # states[object][name]
77
- # end
78
- #
79
- # # ReactDOM.unstable_batchedUpdates does not seem to improve things here, ill leave it here commented for reference
80
- # # and later investigation
81
- # #if `ReactDOM.unstable_batchedUpdates !== undefined`
82
- # # %x{
83
- # # ReactDOM.unstable_batchedUpdates(function(){
84
- # # #{updates.each { |observer, args| observer.update_react_js_state(*args) }}
85
- # # });
86
- # # }
87
- # #else # run the other one
88
- # def set_state(object, name, value, delay=ALWAYS_UPDATE_STATE_AFTER_RENDER)
89
- # states[object][name] = value
90
- # delay = false if object.respond_to?(:set_state_synchronously?) && object.set_state_synchronously?
91
- # if delay || @bulk_update_flag
92
- # @delayed_updates ||= Hash.new { |h, k| h[k] = {} }
93
- # @delayed_updates[object][name] = [value, Set.new]
94
- # @delayed_updater ||= after(0.001) do
95
- # delayed_updates = @delayed_updates
96
- # @delayed_updates = Hash.new { |h, k| h[k] = {} } # could this be nil???
97
- # @delayed_updater = nil
98
- # updates = Hash.new { |hash, key| hash[key] = Array.new }
99
- # delayed_updates.each do |object, name_hash|
100
- # name_hash.each do |name, value_and_set|
101
- # set_state2(object, name, value_and_set[0], updates, value_and_set[1])
102
- # end
103
- # end
104
- # updates.each { |observer, args| observer.update_react_js_state(*args) }
105
- # end
106
- # elsif @rendering_level == 0
107
- # updates = Hash.new { |hash, key| hash[key] = Array.new }
108
- # set_state2(object, name, value, updates)
109
- # updates.each { |observer, args| observer.update_react_js_state(*args) }
110
- # end
111
- # value
112
- # end
113
- #
114
- # def will_be_observing?(object, name, current_observer)
115
- # current_observer && new_observers[current_observer][object].include?(name)
116
- # end
117
- #
118
- # def is_observing?(object, name, current_observer)
119
- # current_observer && observers_by_name[object][name].include?(current_observer)
120
- # end
121
- #
122
- # def update_states_to_observe(current_observer = @current_observer) # should be called after the last after_render callback, currently called after components render method
123
- # raise "update_states_to_observer called outside of watch block" unless current_observer
124
- # current_observers[current_observer].each do |object, names|
125
- # names.each do |name|
126
- # observers_by_name[object][name].delete(current_observer)
127
- # end
128
- # end
129
- # observers = current_observers[current_observer] = new_observers[current_observer]
130
- # new_observers.delete(current_observer)
131
- # observers.each do |object, names|
132
- # names.each do |name|
133
- # observers_by_name[object][name] << current_observer
134
- # end
135
- # end
136
- # end
137
- #
138
- # def remove # call after component is unmounted
139
- # raise "remove called outside of watch block" unless @current_observer
140
- # current_observers[@current_observer].each do |object, names|
141
- # names.each do |name|
142
- # observers_by_name[object][name].delete(@current_observer)
143
- # end
144
- # end
145
- # current_observers.delete(@current_observer)
146
- # end
147
- #
148
- # def set_state_context_to(observer, rendering = nil) # wrap all execution that may set or get states in a block so we know which observer is executing
149
- # saved_current_observer = @current_observer
150
- # @current_observer = observer
151
- # @rendering_level += 1 if rendering
152
- # return_value = yield
153
- # return_value
154
- # ensure
155
- # @current_observer = saved_current_observer
156
- # @rendering_level -= 1 if rendering
157
- # return_value
158
- # end
159
- #
160
- # def states
161
- # @states ||= Hash.new { |h, k| h[k] = {} }
162
- # end
163
- #
164
- # [:new_observers, :current_observers, :observers_by_name].each do |method_name|
165
- # define_method(method_name) do
166
- # instance_variable_get("@#{method_name}") ||
167
- # instance_variable_set("@#{method_name}", Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = [] } })
168
- # end
169
- # end
170
- # end
171
- # end
172
- # end
173
- # end
174
- # end