glimmer 2.2.2 → 2.5.0
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 +64 -14
- 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 -40
- data/lib/glimmer/data_binding/observer.rb +51 -38
- metadata +13 -10
|
@@ -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.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-
|
|
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
|
|
207
|
-
|
|
208
|
-
Development GUI Framework),
|
|
209
|
-
|
|
210
|
-
|
|
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.
|
|
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
|