glimmer 2.2.2 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|