reality-facets 1.5.0 → 1.6.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/lib/reality/facets/facet.rb +23 -17
- data/lib/reality/facets/facet_container.rb +61 -21
- data/lib/reality/facets/target_manager.rb +10 -4
- data/reality-facets.gemspec +1 -1
- data/test/facets/test_facet.rb +64 -2
- data/test/facets/test_facet_container.rb +7 -0
- data/test/facets/test_faceted_model.rb +14 -0
- data/test/facets/test_target_manager.rb +32 -0
- data/test/helper.rb +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d17f63aa3fd221512dc2cf8fb3305c70a33f18df
|
4
|
+
data.tar.gz: 0e66691871d7376d787d10eed9bf6d84f28ed982
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b39725276dde3d9d2cd95068d597525f5e9c92e9836087f8af4bdae090d642f230c8699c99b957278cc6dd4fcfc34a9088a97fd1bc9cbf6e5f8b9693aa79b3ba
|
7
|
+
data.tar.gz: f06caabcc236eb7899f1eac6aa95fd11535689d14eefc4a6dd337996b7dfdab85365ea0ab4c0b40b69243f4ee6e21bf9505ed8ff4301a65dfda70e64859f126f
|
data/lib/reality/facets/facet.rb
CHANGED
@@ -27,6 +27,7 @@ module Reality #nodoc
|
|
27
27
|
@facet_container = facet_container
|
28
28
|
@required_facets = []
|
29
29
|
@suggested_facets = []
|
30
|
+
@model_extension_instances = {}
|
30
31
|
facet_container.send :register_facet, self
|
31
32
|
super(options, &block)
|
32
33
|
facet_container.target_manager.targets.each do |target|
|
@@ -51,13 +52,18 @@ module Reality #nodoc
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
55
|
+
def enhanced?(model_class)
|
56
|
+
!!@model_extension_instances[model_class]
|
57
|
+
end
|
58
|
+
|
54
59
|
def enhance(model_class, &block)
|
55
60
|
target_manager = facet_container.target_manager
|
56
61
|
target = target_manager.target_by_model_class(model_class)
|
57
62
|
|
58
|
-
|
59
|
-
|
60
|
-
|
63
|
+
if @model_extension_instances[model_class].nil?
|
64
|
+
extension_name = "#{::Reality::Naming.pascal_case(self.key)}#{model_class.name.gsub(/^.*\:\:([^\:]+)/, '\1')}Facet"
|
65
|
+
definitions = target_manager.container.facet_definitions
|
66
|
+
definitions.class_eval(<<-RUBY)
|
61
67
|
class #{extension_name} < Reality.base_element(:container_key => :#{target.inverse_access_method})
|
62
68
|
def facet_key
|
63
69
|
:#{self.key}
|
@@ -79,21 +85,21 @@ class #{extension_name} < Reality.base_element(:container_key => :#{target.inver
|
|
79
85
|
self.#{target.inverse_access_method}
|
80
86
|
end
|
81
87
|
end
|
82
|
-
|
83
|
-
|
84
|
-
extension_instance.class_eval(&block) if block_given?
|
85
|
-
|
86
|
-
model_extension = target.extension_module
|
87
|
-
model_extension.class_eval <<-RUBY
|
88
|
-
def #{self.key}
|
89
|
-
self.facet_#{self.key}
|
90
|
-
end
|
88
|
+
RUBY
|
89
|
+
@model_extension_instances[model_class] = definitions.const_get(extension_name)
|
91
90
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
91
|
+
target.extension_module.class_eval <<-RUBY
|
92
|
+
def #{self.key}
|
93
|
+
self.facet_#{self.key}
|
94
|
+
end
|
95
|
+
|
96
|
+
def facet_#{self.key}
|
97
|
+
Reality::Facets.error("Attempted to access '#{self.key}' facet for model '#{model_class.name}' when facet disabled.") unless #{self.key}?
|
98
|
+
@facet_#{self.key} ||= #{@model_extension_instances[model_class].name}.new(self)
|
99
|
+
end
|
100
|
+
RUBY
|
101
|
+
end
|
102
|
+
@model_extension_instances[model_class].class_eval(&block) if block_given?
|
97
103
|
end
|
98
104
|
end
|
99
105
|
end
|
@@ -19,17 +19,29 @@ module Reality #nodoc
|
|
19
19
|
base.class_eval 'module FacetDefinitions; end'
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
# An array of modules that should be mixed in to every extension object
|
23
|
+
def facet_extensions
|
24
|
+
facet_extension_list.dup
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
-
|
27
|
+
# Add a ruby module that will be applied to all extension objects
|
28
|
+
def facet_extension(extension)
|
29
|
+
Facets.error("Attempting to define facet extension #{extension} after facet manager is locked") if locked?
|
30
|
+
facet_extension_list << extension
|
31
|
+
target_manager.lock!
|
28
32
|
end
|
29
33
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
34
|
+
def facet?(name)
|
35
|
+
facet_by_name?(name)
|
36
|
+
end
|
37
|
+
|
38
|
+
def facet_by_name?(name)
|
39
|
+
!!facet_map[name.to_s]
|
40
|
+
end
|
41
|
+
|
42
|
+
def facet_by_name(name)
|
43
|
+
facet = facet_map[name.to_s]
|
44
|
+
Facets.error("Unknown facet '#{name}'") unless facet
|
33
45
|
facet
|
34
46
|
end
|
35
47
|
|
@@ -48,6 +60,15 @@ module Reality #nodoc
|
|
48
60
|
facet_map.values
|
49
61
|
end
|
50
62
|
|
63
|
+
def lock!
|
64
|
+
@locked = true
|
65
|
+
apply_facet_extensions
|
66
|
+
end
|
67
|
+
|
68
|
+
def locked?
|
69
|
+
!!(@locked ||= nil)
|
70
|
+
end
|
71
|
+
|
51
72
|
def target_manager
|
52
73
|
@target_manager ||= Reality::Facets::TargetManager.new(self)
|
53
74
|
end
|
@@ -73,35 +94,35 @@ module Reality #nodoc
|
|
73
94
|
results
|
74
95
|
end
|
75
96
|
|
76
|
-
def activate_facet(object,
|
77
|
-
return if object.facet_enabled?(
|
97
|
+
def activate_facet(object, facet_name)
|
98
|
+
return if object.facet_enabled?(facet_name)
|
78
99
|
|
79
|
-
facet = facet_by_name(
|
100
|
+
facet = facet_by_name(facet_name)
|
80
101
|
facet.required_facets.each do |required_facet_key|
|
81
102
|
activate_facet(object, required_facet_key)
|
82
103
|
end
|
83
104
|
facet.suggested_facets.each do |suggested_facet_key|
|
84
105
|
activate_facet(object, suggested_facet_key)
|
85
106
|
end
|
86
|
-
object.send(:"_enable_facet_#{
|
107
|
+
object.send(:"_enable_facet_#{facet_name}!")
|
87
108
|
|
88
109
|
each_contained_model_object(object) do |child|
|
89
|
-
activate_facet(child,
|
110
|
+
activate_facet(child, facet_name)
|
90
111
|
end
|
91
112
|
end
|
92
113
|
|
93
|
-
def deactivate_facet(object,
|
94
|
-
return unless object.facet_enabled?(
|
114
|
+
def deactivate_facet(object, facet_name)
|
115
|
+
return unless object.facet_enabled?(facet_name)
|
95
116
|
each_contained_model_object(object) do |child|
|
96
|
-
deactivate_facet(child,
|
117
|
+
deactivate_facet(child, facet_name)
|
97
118
|
end
|
98
119
|
|
99
120
|
facets.each do |facet|
|
100
|
-
if facet.required_facets.include?(
|
121
|
+
if facet.required_facets.include?(facet_name)
|
101
122
|
deactivate_facet(object, facet.key)
|
102
123
|
end
|
103
124
|
end
|
104
|
-
object.send(:"_disable_facet_#{
|
125
|
+
object.send(:"_disable_facet_#{facet_name}!")
|
105
126
|
end
|
106
127
|
|
107
128
|
def extension_point(object, action)
|
@@ -111,13 +132,13 @@ module Reality #nodoc
|
|
111
132
|
Facets.debug "Running '#{action}' hook on #{object.class} #{name}"
|
112
133
|
object.send(action)
|
113
134
|
end
|
114
|
-
object.enabled_facets.each do |
|
135
|
+
object.enabled_facets.each do |facet_name|
|
115
136
|
# Need to check for the magic facet_X method rather than X method directly as
|
116
137
|
# sometimes there is a global method of the same name.
|
117
|
-
method_name = "facet_#{
|
138
|
+
method_name = "facet_#{facet_name}"
|
118
139
|
extension_object = object.respond_to?(method_name) ? object.send(method_name) : nil
|
119
140
|
if extension_object && extension_object.respond_to?(action, true)
|
120
|
-
Facets.debug "Running '#{action}' hook on #{
|
141
|
+
Facets.debug "Running '#{action}' hook on #{facet_name} facet of #{object.class} #{name}"
|
121
142
|
extension_object.send(action)
|
122
143
|
end
|
123
144
|
end
|
@@ -145,8 +166,27 @@ module Reality #nodoc
|
|
145
166
|
true
|
146
167
|
end
|
147
168
|
|
169
|
+
def apply_facet_extensions
|
170
|
+
facet_extension_list.each do |extension|
|
171
|
+
facet_map.values.each do |facet|
|
172
|
+
target_manager.targets.each do |target|
|
173
|
+
if facet.enhanced?(target.model_class)
|
174
|
+
facet.enhance(target.model_class) do
|
175
|
+
include extension
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def facet_extension_list
|
184
|
+
@facet_extensions ||= []
|
185
|
+
end
|
186
|
+
|
148
187
|
def register_facet(facet)
|
149
|
-
target_manager.
|
188
|
+
target_manager.lock!
|
189
|
+
Facets.error("Attempting to define facet #{facet.key} after facet manager is locked") if locked?
|
150
190
|
Facets.error("Attempting to redefine facet #{facet.key}") if facet_map[facet.key.to_s]
|
151
191
|
facet_map[facet.key.to_s] = facet
|
152
192
|
end
|
@@ -75,6 +75,7 @@ module Reality #nodoc
|
|
75
75
|
|
76
76
|
def initialize(container)
|
77
77
|
@container = container
|
78
|
+
@locked = false
|
78
79
|
end
|
79
80
|
|
80
81
|
def is_target_valid?(key)
|
@@ -107,6 +108,7 @@ module Reality #nodoc
|
|
107
108
|
end
|
108
109
|
|
109
110
|
def apply_extension(model)
|
111
|
+
container.lock!
|
110
112
|
self.target_by_model_class(model.class).apply_extension_to(model)
|
111
113
|
end
|
112
114
|
|
@@ -118,19 +120,23 @@ module Reality #nodoc
|
|
118
120
|
target_map.values.select { |target| target.container_key == container_key }
|
119
121
|
end
|
120
122
|
|
121
|
-
def
|
122
|
-
@
|
123
|
+
def lock!
|
124
|
+
@locked = true
|
125
|
+
end
|
126
|
+
|
127
|
+
def locked?
|
128
|
+
!!@locked
|
123
129
|
end
|
124
130
|
|
125
131
|
def reset_targets
|
126
132
|
target_map.clear
|
127
|
-
@
|
133
|
+
@locked = false
|
128
134
|
end
|
129
135
|
|
130
136
|
private
|
131
137
|
|
132
138
|
def register_target(target)
|
133
|
-
Reality::Facets.error("Attempting to define target #{target.key} when targets have been locked.") if
|
139
|
+
Reality::Facets.error("Attempting to define target #{target.key} when targets have been locked.") if locked?
|
134
140
|
Reality::Facets.error("Attempting to redefine target #{target.key}") if target_map[target.key]
|
135
141
|
target_map[target.key] = target
|
136
142
|
end
|
data/reality-facets.gemspec
CHANGED
data/test/facets/test_facet.rb
CHANGED
@@ -31,10 +31,10 @@ class Reality::Facets::TestFacet < Reality::TestCase
|
|
31
31
|
:access_method => :comps,
|
32
32
|
:inverse_access_method => :comp)
|
33
33
|
|
34
|
-
Reality::Facets::Facet.new(TestFacetContainer, :gwt)
|
34
|
+
facet_gwt = Reality::Facets::Facet.new(TestFacetContainer, :gwt)
|
35
35
|
Reality::Facets::Facet.new(TestFacetContainer, :gwt_rpc, :required_facets => [:gwt])
|
36
36
|
|
37
|
-
Reality::Facets::Facet.new(TestFacetContainer, :imit, :suggested_facets => [:gwt_rpc]) do |f|
|
37
|
+
facet_imit = Reality::Facets::Facet.new(TestFacetContainer, :imit, :suggested_facets => [:gwt_rpc]) do |f|
|
38
38
|
f.enhance(Project) do
|
39
39
|
def name
|
40
40
|
"Gwt#{project.name}"
|
@@ -47,6 +47,11 @@ class Reality::Facets::TestFacet < Reality::TestCase
|
|
47
47
|
assert_equal true, TestFacetContainer.facet_by_name?(:gwt_rpc)
|
48
48
|
assert_equal true, TestFacetContainer.facet_by_name?(:imit)
|
49
49
|
|
50
|
+
assert_equal false, facet_gwt.enhanced?(Project)
|
51
|
+
assert_equal false, facet_gwt.enhanced?(Component)
|
52
|
+
assert_equal true, facet_imit.enhanced?(Project)
|
53
|
+
assert_equal true, facet_imit.enhanced?(Component)
|
54
|
+
|
50
55
|
project = Project.new(:MyProject) do |p|
|
51
56
|
p.enable_facets(:imit)
|
52
57
|
p.component(:MyComponent)
|
@@ -86,4 +91,61 @@ class Reality::Facets::TestFacet < Reality::TestCase
|
|
86
91
|
assert_equal component, component.imit.comp
|
87
92
|
assert_equal component, component.imit.parent
|
88
93
|
end
|
94
|
+
|
95
|
+
class Component2 < Reality.base_element(:name => true, :container_key => :project, :pre_config_code => 'Reality::TestCase::TestFacetContainer.target_manager.apply_extension(self)')
|
96
|
+
end
|
97
|
+
|
98
|
+
class Project2 < Reality.base_element(:name => true, :pre_config_code => 'Reality::TestCase::TestFacetContainer.target_manager.apply_extension(self)')
|
99
|
+
def component(name, options = {}, &block)
|
100
|
+
component_map[name.to_s] = Component2.new(self, name, options, &block)
|
101
|
+
end
|
102
|
+
|
103
|
+
def components
|
104
|
+
component_map.values
|
105
|
+
end
|
106
|
+
|
107
|
+
def component_map
|
108
|
+
@component_map ||= {}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
module MyExtensionModule
|
113
|
+
def hello_message
|
114
|
+
'yo'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_common_extension_modules
|
119
|
+
|
120
|
+
assert_equal false, TestFacetContainer.facet_by_name?(:gwt)
|
121
|
+
|
122
|
+
TestFacetContainer.target_manager.target(Project2, :project)
|
123
|
+
TestFacetContainer.target_manager.target(Component2,
|
124
|
+
:component,
|
125
|
+
:project)
|
126
|
+
|
127
|
+
|
128
|
+
assert_equal [], TestFacetContainer.facet_extensions
|
129
|
+
TestFacetContainer.facet_extension(MyExtensionModule)
|
130
|
+
assert_equal [MyExtensionModule], TestFacetContainer.facet_extensions
|
131
|
+
|
132
|
+
Reality::Facets::Facet.new(TestFacetContainer, :gwt) do |f|
|
133
|
+
f.enhance(Project2) do
|
134
|
+
def name
|
135
|
+
"Gwt#{project.name}"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
project = Project2.new(:MyProject) do |p|
|
141
|
+
p.enable_facets(:gwt)
|
142
|
+
p.component(:MyComponent)
|
143
|
+
end
|
144
|
+
component = project.components[0]
|
145
|
+
|
146
|
+
assert_equal true, project.gwt?
|
147
|
+
assert_equal 'GwtMyProject', project.gwt.name
|
148
|
+
assert_equal 'yo', project.gwt.hello_message
|
149
|
+
assert_equal false, component.respond_to?(:gwt)
|
150
|
+
end
|
89
151
|
end
|
@@ -7,6 +7,9 @@ class Reality::Facets::TestFacetContainer < Reality::TestCase
|
|
7
7
|
class Component2 < Reality.base_element(:name => true)
|
8
8
|
end
|
9
9
|
|
10
|
+
module MyExtensionModule
|
11
|
+
end
|
12
|
+
|
10
13
|
def test_basic_operation
|
11
14
|
|
12
15
|
assert_equal false, TestFacetContainer.facet_by_name?(:gwt)
|
@@ -36,6 +39,10 @@ class Reality::Facets::TestFacetContainer < Reality::TestCase
|
|
36
39
|
assert_equal %w(gwt), TestFacetContainer.facet_keys
|
37
40
|
assert_equal 1, TestFacetContainer.facets.size
|
38
41
|
|
42
|
+
assert_equal [], TestFacetContainer.facet_extensions
|
43
|
+
TestFacetContainer.facet_extension(MyExtensionModule)
|
44
|
+
assert_equal [MyExtensionModule], TestFacetContainer.facet_extensions
|
45
|
+
|
39
46
|
assert_facet_error("Unknown facet 'gwt_rpc'") { TestFacetContainer.facet_by_name(:gwt_rpc) }
|
40
47
|
|
41
48
|
assert_equal TestFacetContainer, TestFacetContainer.facet_by_name(:gwt).facet_container
|
@@ -276,4 +276,18 @@ class Reality::Facets::TestFacetedModel < Reality::TestCase
|
|
276
276
|
assert_equal true, attribute1.jpa.hook2?
|
277
277
|
assert_equal true, attribute2.jpa.hook2?
|
278
278
|
end
|
279
|
+
|
280
|
+
def test_facet_container_locking
|
281
|
+
TestFacetContainer.target_manager.target(Repository, :repository)
|
282
|
+
|
283
|
+
TestFacetContainer.facet(:json)
|
284
|
+
|
285
|
+
assert_equal 1, TestFacetContainer.facets.size
|
286
|
+
|
287
|
+
Repository.new(:MyRepo) do |r|
|
288
|
+
TestFacetContainer.target_manager.apply_extension(r)
|
289
|
+
end
|
290
|
+
|
291
|
+
assert_facet_error('Attempting to define facet gwt after facet manager is locked') { TestFacetContainer.facet(:gwt) }
|
292
|
+
end
|
279
293
|
end
|
@@ -193,4 +193,36 @@ class Reality::Facets::TestTargetManager < Reality::TestCase
|
|
193
193
|
|
194
194
|
assert_equal [:json], fragment1.enabled_facets
|
195
195
|
end
|
196
|
+
|
197
|
+
class Project2 < Reality.base_element(:name => true)
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_apply_extension_with_multiple_enhances
|
201
|
+
TestFacetContainer.target_manager.target(Project2, :project)
|
202
|
+
|
203
|
+
TestFacetContainer.facet(:gwt) do |f|
|
204
|
+
f.enhance(Project2) do
|
205
|
+
def name
|
206
|
+
"Gwt#{project.name}"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
f.enhance(Project2) do
|
210
|
+
def name2
|
211
|
+
"Gwt2#{project.name}"
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
project = Project2.new(:MyProject)
|
217
|
+
assert_equal false, project.respond_to?(:facet_enabled?)
|
218
|
+
assert_equal false, project.respond_to?(:parent)
|
219
|
+
|
220
|
+
TestFacetContainer.target_manager.apply_extension(project)
|
221
|
+
|
222
|
+
assert_equal true, project.respond_to?(:facet_enabled?)
|
223
|
+
project.enable_facets(:gwt)
|
224
|
+
|
225
|
+
assert_equal 'GwtMyProject', project.gwt.name
|
226
|
+
assert_equal 'Gwt2MyProject', project.gwt.name2
|
227
|
+
end
|
196
228
|
end
|
data/test/helper.rb
CHANGED
@@ -13,7 +13,9 @@ class Reality::TestCase < Minitest::Test
|
|
13
13
|
class << self
|
14
14
|
|
15
15
|
def reset
|
16
|
+
@locked = false
|
16
17
|
facet_map.clear
|
18
|
+
facet_extension_list.clear
|
17
19
|
target_manager.reset_targets
|
18
20
|
TestFacetContainer::FacetDefinitions.constants.each do |constant|
|
19
21
|
TestFacetContainer::FacetDefinitions.send(:remove_const, constant)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reality-facets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Donald
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: reality-core
|