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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -0
- data/README.md +234 -144
- data/VERSION +1 -1
- data/glimmer.gemspec +8 -7
- data/lib/glimmer/data_binding/model_binding.rb +30 -14
- data/lib/glimmer/data_binding/observable_array.rb +31 -22
- data/lib/glimmer/data_binding/observable_hash.rb +12 -63
- data/lib/glimmer/data_binding/observable_hashable.rb +75 -0
- data/lib/glimmer/data_binding/observable_model.rb +33 -39
- data/lib/glimmer/data_binding/observer.rb +51 -38
- metadata +11 -9
@@ -46,12 +46,12 @@ module Glimmer
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
class Registration < Struct.new(:observer, :observable, :
|
50
|
-
def
|
51
|
-
observer.unobserve(observable,
|
49
|
+
class Registration < Struct.new(:observer, :observable, :args, keyword_init: true)
|
50
|
+
def deregister
|
51
|
+
observer.unobserve(observable, *args)
|
52
52
|
end
|
53
|
-
alias
|
54
|
-
alias deregister
|
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::
|
64
|
+
@registrations ||= Concurrent::Hash.new
|
65
65
|
end
|
66
66
|
|
67
|
-
def registration_for(observable,
|
68
|
-
|
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
|
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
|
-
|
96
|
-
|
97
|
-
|
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
|
101
|
+
alias register observe
|
101
102
|
|
102
|
-
def
|
103
|
+
def unobserve(observable, *args)
|
103
104
|
return unless observable.is_a?(Observable)
|
104
|
-
|
105
|
-
registration = registration_for(observable,
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
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
|
115
|
-
alias deregister
|
116
|
+
alias unregister unobserve
|
117
|
+
alias deregister unobserve
|
116
118
|
|
117
|
-
def
|
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(&:
|
123
|
+
thedependents.each(&:deregister)
|
122
124
|
end
|
123
|
-
alias unobserve_dependents_with_observable
|
124
|
-
alias deregister_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
|
128
|
-
registrations.each
|
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
|
131
|
-
alias deregister_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.
|
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-
|
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
|
209
|
-
|
210
|
-
|
211
|
-
|
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.
|
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
|