glimmer 2.3.0 → 2.5.1

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.
@@ -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.3.0
4
+ version: 2.5.1
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-07 00:00:00.000000000 Z
11
+ date: 2021-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: array_include_methods
@@ -192,23 +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
206
  a DSL Engine and an Observable / Observer / Data-Binding Library (including Observable
207
207
  Model, Observable Array, and Observable Hash). Used in Glimmer DSL for SWT (JRuby
208
- Desktop Development GUI Framework), Glimmer DSL for Tk (Ruby Desktop Development
209
- GUI Library), Glimmer DSL for LibUI (Prerequisite-Free Ruby Desktop Development
210
- GUI Library), Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop
211
- Apps), Glimmer DSL for XML (& HTML), and Glimmer DSL for CSS.
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.
212
213
  email: andy.am@gmail.com
213
214
  executables: []
214
215
  extensions: []
@@ -230,6 +231,7 @@ files:
230
231
  - lib/glimmer/data_binding/observable.rb
231
232
  - lib/glimmer/data_binding/observable_array.rb
232
233
  - lib/glimmer/data_binding/observable_hash.rb
234
+ - lib/glimmer/data_binding/observable_hashable.rb
233
235
  - lib/glimmer/data_binding/observable_model.rb
234
236
  - lib/glimmer/data_binding/observer.rb
235
237
  - lib/glimmer/data_binding/shine.rb
@@ -264,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
266
  - !ruby/object:Gem::Version
265
267
  version: '0'
266
268
  requirements: []
267
- rubygems_version: 3.2.28
269
+ rubygems_version: 3.2.31
268
270
  signing_key:
269
271
  specification_version: 4
270
272
  summary: Glimmer - DSL Engine for Ruby GUI and More