glimmer 2.2.2 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -46,12 +46,12 @@ module Glimmer
46
46
  end
47
47
  end
48
48
 
49
- class Registration < Struct.new(:observer, :observable, :property, keyword_init: true)
50
- def unregister
51
- observer.unobserve(observable, property)
49
+ class Registration < Struct.new(:observer, :observable, :args, keyword_init: true)
50
+ def deregister
51
+ observer.unobserve(observable, *args)
52
52
  end
53
- alias unobserve unregister
54
- alias deregister unregister
53
+ alias unregister deregister
54
+ alias unobserve deregister
55
55
  end
56
56
 
57
57
  class << self
@@ -61,29 +61,31 @@ module Glimmer
61
61
  end
62
62
 
63
63
  def registrations
64
- @registrations ||= Concurrent::Set.new
64
+ @registrations ||= Concurrent::Hash.new
65
65
  end
66
66
 
67
- def registration_for(observable, property = nil)
68
- Registration.new(observer: self, observable: observable, property: property)
67
+ def registration_for(observable, *args)
68
+ args = compact_args(args)
69
+ registrations[[observable.object_id, args]] ||= Registration.new(observer: self, observable: observable, args: args)
69
70
  end
71
+ alias ensure_registration_for! registration_for
70
72
 
71
73
  # mapping of registrations to dependents
72
74
  # {[observable, property] => [[dependent, dependent_observable, dependent_property], ...]}
73
75
  def dependents
74
- @dependents ||= Hash.new
76
+ @dependents ||= Concurrent::Hash.new
75
77
  end
76
78
 
77
79
  def dependents_for(registration)
78
- dependents[registration] ||= Concurrent::Set.new
80
+ dependents[registration.object_id] ||= Concurrent::Set.new
79
81
  end
80
82
 
81
- # registers observer in an observable on a property (optional)
83
+ # registers observer in an observable on args usually containing a property and options (optional)
82
84
  # observer maintains registration list to unregister later
83
- def register(observable, property = nil)
85
+ def observe(observable, *args)
84
86
  return if observable.nil?
85
87
  unless observable.is_a?(Observable)
86
- # TODO refactor code to be more smart/polymorphic/automated and honor open/closed principle
88
+ # TODO refactor code to be more smart/polymorphic/automated and honor open/closed principle (e.g. for SomeClass, search if there is ObservableSomeClass)
87
89
  if observable.is_a?(Array)
88
90
  observable.extend(ObservableArray)
89
91
  elsif observable.is_a?(Hash)
@@ -92,43 +94,46 @@ module Glimmer
92
94
  observable.extend(ObservableModel)
93
95
  end
94
96
  end
95
- observable.add_observer(*[self, property].compact)
96
- registration_for(observable, property).tap do |registration|
97
- self.registrations << registration
98
- end
97
+ args = compact_args(args)
98
+ observable.add_observer(self, *args)
99
+ ensure_registration_for!(observable, *args)
99
100
  end
100
- alias observe register
101
+ alias register observe
101
102
 
102
- def unregister(observable, property = nil)
103
+ def unobserve(observable, *args)
103
104
  return unless observable.is_a?(Observable)
104
- # TODO optimize performance in the future via indexing and/or making a registration official object/class
105
- registration = registration_for(observable, property)
106
- dependents_for(registration).each do |dependent|
107
- dependent.unregister
108
- remove_dependent(registration => dependent)
109
- end
110
- registrations.delete(registration).tap do |registration|
111
- observable.remove_observer(*[self, property].compact)
105
+ args = compact_args(args)
106
+ registration = registration_for(observable, *args)
107
+ registrations.delete([observable.object_id, args])
108
+ registration.tap do |registration|
109
+ dependents_for(registration).each do |dependent|
110
+ remove_dependent(registration => dependent)
111
+ dependent.deregister if dependent != registration
112
+ end
113
+ observable.remove_observer(self, *args)
112
114
  end
113
115
  end
114
- alias unobserve unregister
115
- alias deregister unregister
116
+ alias unregister unobserve
117
+ alias deregister unobserve
116
118
 
117
- def unregister_dependents_with_observable(registration, dependent_observable)
119
+ def unobserve_dependents_with_observable(registration, dependent_observable)
118
120
  thedependents = dependents_for(registration).select do |thedependent|
119
121
  thedependent.observable == dependent_observable
120
122
  end
121
- thedependents.each(&:unregister)
123
+ thedependents.each(&:deregister)
122
124
  end
123
- alias unobserve_dependents_with_observable unregister_dependents_with_observable
124
- alias deregister_dependents_with_observable unregister_dependents_with_observable
125
+ alias unregister_dependents_with_observable unobserve_dependents_with_observable
126
+ alias deregister_dependents_with_observable unobserve_dependents_with_observable
125
127
 
126
128
  # cleans up all registrations in observables
127
- def unregister_all_observables
128
- registrations.each(&:unregister)
129
+ def unobserve_all_observables
130
+ registrations.values.dup.each do |registration|
131
+ registration.deregister
132
+ registrations.delete([registration.observable.object_id, registration.args])
133
+ end
129
134
  end
130
- alias unobserve_all_observables unregister_all_observables
131
- alias deregister_all_observables unregister_all_observables
135
+ alias unregister_all_observables unobserve_all_observables
136
+ alias deregister_all_observables unobserve_all_observables
132
137
 
133
138
  # add dependent observer to unregister when unregistering observer
134
139
  def add_dependent(parent_to_dependent_hash)
@@ -140,12 +145,20 @@ module Glimmer
140
145
  def remove_dependent(parent_to_dependent_hash)
141
146
  registration = parent_to_dependent_hash.keys.first
142
147
  dependent = parent_to_dependent_hash.values.first
143
- dependents_for(registration).delete(dependent)
148
+ dependents_for(registration).delete(dependent).tap do
149
+ dependents.delete([registration.object_id]) if dependents_for(registration).empty?
150
+ end
144
151
  end
145
152
 
146
153
  def call(new_value = nil, *extra_args)
147
154
  raise Error, 'Not implemented!'
148
155
  end
156
+
157
+ def compact_args(args)
158
+ args = args[0...-1] if args.last == {}
159
+ args = args[0...-1] if args.last == []
160
+ args.compact
161
+ end
149
162
  end
150
163
  end
151
164
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-03 00:00:00.000000000 Z
11
+ date: 2021-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: array_include_methods
@@ -192,22 +192,24 @@ dependencies:
192
192
  name: rake-tui
193
193
  requirement: !ruby/object:Gem::Requirement
194
194
  requirements:
195
- - - ">="
195
+ - - ">"
196
196
  - !ruby/object:Gem::Version
197
197
  version: '0'
198
198
  type: :development
199
199
  prerelease: false
200
200
  version_requirements: !ruby/object:Gem::Requirement
201
201
  requirements:
202
- - - ">="
202
+ - - ">"
203
203
  - !ruby/object:Gem::Version
204
204
  version: '0'
205
205
  description: Glimmer is a Ruby DSL Framework for Ruby GUI and More, consisting of
206
- a DSL Engine and an Observable / Observer / Data-Binding Library (including ObservableModel,
207
- ObservableArray, and ObservableHash). Used in the Glimmer DSL for SWT (JRuby Desktop
208
- Development GUI Framework), the Glimmer DSL for Tk (Ruby Desktop Development GUI
209
- Library), the Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop
210
- Apps), the Glimmer DSL for XML (& HTML), and the Glimmer DSL for CSS.
206
+ a DSL Engine and an Observable / Observer / Data-Binding Library (including Observable
207
+ Model, Observable Array, and Observable Hash). Used in Glimmer DSL for SWT (JRuby
208
+ Desktop Development GUI Framework), Glimmer DSL for Opal (Pure Ruby Web GUI and
209
+ Auto-Webifier of Desktop Apps), Glimmer DSL for Tk (Ruby Desktop Development GUI
210
+ Library), Glimmer DSL for LibUI (Prerequisite-Free Ruby Desktop Development GUI
211
+ Library), Glimmer DSL for GTK (Ruby-GNOME Desktop Development GUI Library), Glimmer
212
+ DSL for XML (& HTML), and Glimmer DSL for CSS.
211
213
  email: andy.am@gmail.com
212
214
  executables: []
213
215
  extensions: []
@@ -229,6 +231,7 @@ files:
229
231
  - lib/glimmer/data_binding/observable.rb
230
232
  - lib/glimmer/data_binding/observable_array.rb
231
233
  - lib/glimmer/data_binding/observable_hash.rb
234
+ - lib/glimmer/data_binding/observable_hashable.rb
232
235
  - lib/glimmer/data_binding/observable_model.rb
233
236
  - lib/glimmer/data_binding/observer.rb
234
237
  - lib/glimmer/data_binding/shine.rb
@@ -263,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
263
266
  - !ruby/object:Gem::Version
264
267
  version: '0'
265
268
  requirements: []
266
- rubygems_version: 3.2.28
269
+ rubygems_version: 3.2.31
267
270
  signing_key:
268
271
  specification_version: 4
269
272
  summary: Glimmer - DSL Engine for Ruby GUI and More