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

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