active_module 0.1.5 → 0.1.7
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/README.md +79 -26
- data/lib/active_module/comparison.rb +4 -8
- data/lib/active_module/module_refinement.rb +4 -0
- data/lib/active_module/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 191f7c2deb3a07261247a4302436cc734541ab62c3db9dd742974d58320dd763
|
4
|
+
data.tar.gz: bd20cb4d1aa7b6437facfaefc8213485571497df5e9e607ce19d16b81db246b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc48c3f11e8f71321ab4abece1b5d58f671c96de7e494a5f2f7a8e55b9946c6e88af9e61970bdd2332eba12ee74dadec13485555dff0f05a4f74209c1327fd96
|
7
|
+
data.tar.gz: 126c9c4a2d885cadbe472dc23caa5025415f2806411e9eecce37a5b40c28ce990c5956246646292e9780b6f30d6f77705ab681899a7532940dbe0cfe59f2a471
|
data/README.md
CHANGED
@@ -17,6 +17,35 @@ This is a very generic mechanism that enables many possible utilizations, for in
|
|
17
17
|
|
18
18
|
You can find examples of these in [Usage -> Examples :](#Examples)
|
19
19
|
|
20
|
+
## TL;DR
|
21
|
+
|
22
|
+
Declare module attributes like this:
|
23
|
+
```ruby
|
24
|
+
class MyARObject < ActiveRecord::Base
|
25
|
+
attribute :module_field,
|
26
|
+
:active_module,
|
27
|
+
possible_modules: [MyModule1, MyClass, Nested::Module]
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
Assign them like this:
|
32
|
+
```ruby
|
33
|
+
object.module_field = Nested::Module
|
34
|
+
object.module_field = :Module
|
35
|
+
object.module_field = "Module"
|
36
|
+
object.module_field #=> Nested::Module:Module
|
37
|
+
```
|
38
|
+
|
39
|
+
And compare them like this (optional):
|
40
|
+
```ruby
|
41
|
+
module MyNameSpace
|
42
|
+
using ActiveModule::Comparison
|
43
|
+
|
44
|
+
object.module_field =~ :Module1
|
45
|
+
object.module_field =~ "Module1"
|
46
|
+
end
|
47
|
+
```
|
48
|
+
|
20
49
|
## Installation
|
21
50
|
|
22
51
|
Add to your gemfile - and if you are using rails - that's all you need:
|
@@ -54,7 +83,7 @@ class MyARObject < ActiveRecord::Base
|
|
54
83
|
module MyModule1; end
|
55
84
|
module MyModule2; end
|
56
85
|
class MyClass;
|
57
|
-
module
|
86
|
+
module MyModule1; end
|
58
87
|
end
|
59
88
|
end
|
60
89
|
```
|
@@ -63,13 +92,13 @@ You can make the field refer to one of these modules/classes like this:
|
|
63
92
|
class MyARObject < ActiveRecord::Base
|
64
93
|
attribute :module_field,
|
65
94
|
:active_module,
|
66
|
-
possible_modules: [MyModule1, MyModule2, MyClass, MyClass::
|
95
|
+
possible_modules: [MyModule1, MyModule2, MyClass, MyClass::MyModule1]
|
67
96
|
end
|
68
97
|
```
|
69
98
|
And this is it! Easy!<br>
|
70
99
|
|
71
100
|
### Assigning and querying module attributes
|
72
|
-
Now you can use this attribute in many handy ways
|
101
|
+
Now you can use this attribute in many handy ways!
|
73
102
|
<br>
|
74
103
|
<br>
|
75
104
|
For instance, you may refer to it using module literals:
|
@@ -118,10 +147,25 @@ only available within the namespace that includes the refinement.
|
|
118
147
|
```ruby
|
119
148
|
module YourClassOrModuleThatWantsToCompare
|
120
149
|
using ActiveModule::Comparison
|
150
|
+
|
121
151
|
def method_that_compares
|
122
152
|
my_ar_object.module_field =~ :MyModule1
|
123
153
|
end
|
124
154
|
end
|
155
|
+
```
|
156
|
+
|
157
|
+
or like this, if you don't want to use the refinement:
|
158
|
+
|
159
|
+
```ruby
|
160
|
+
ActiveModule::Comparison.compare(my_ar_object.module_field, :MyModule1)
|
161
|
+
```
|
162
|
+
|
163
|
+
but in this last case it would probably make more sense to simply use a module literal:
|
164
|
+
|
165
|
+
```ruby
|
166
|
+
my_ar_object.module_field == MyClass::MyModule1
|
167
|
+
```
|
168
|
+
|
125
169
|
|
126
170
|
## Examples
|
127
171
|
|
@@ -130,6 +174,19 @@ end
|
|
130
174
|
[The Strategy design pattern](https://en.wikipedia.org/wiki/Strategy_pattern) allows composition based polymorphism. This enables runtime polymorphism (by changing the strategy in runtime),
|
131
175
|
and multiple-polymorphism (by composing an object of multiple strategies).
|
132
176
|
|
177
|
+
If you want to use classes this will do:
|
178
|
+
```ruby
|
179
|
+
class MyARObject < ActiveRecord::Base
|
180
|
+
attribute :strategy, :active_module, possible_modules: StrategySuperclass.subclasses
|
181
|
+
|
182
|
+
def run_strategy!(args)
|
183
|
+
strategy.new(some_args).call(other_args)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
```
|
187
|
+
|
188
|
+
But if you are not in the mood to define a class hierarchy for it, you can use modules instead:
|
189
|
+
|
133
190
|
```ruby
|
134
191
|
class MyARObject < ActiveRecord::Base
|
135
192
|
module Strategy1
|
@@ -148,16 +205,13 @@ class MyARObject < ActiveRecord::Base
|
|
148
205
|
:active_module,
|
149
206
|
possible_modules: [Strategy1, Strategy2]
|
150
207
|
|
151
|
-
def run_strategy!
|
152
|
-
|
153
|
-
# in this case strategies were classes we could also
|
154
|
-
# instantiate them
|
155
|
-
strategy.call
|
208
|
+
def run_strategy!(some_args)
|
209
|
+
strategy.call(some_args, other_args)
|
156
210
|
end
|
157
211
|
end
|
158
212
|
|
159
213
|
MyARObject.create!(module_field: :Strategy1).run_strategy! #=> "strategy1 called"
|
160
|
-
MyARObject.create!(module_field: :
|
214
|
+
MyARObject.create!(module_field: :Strategy2).run_strategy! #=> "strategy2 called"
|
161
215
|
```
|
162
216
|
|
163
217
|
|
@@ -219,6 +273,10 @@ this is how you could do so:
|
|
219
273
|
# Provider domain Object
|
220
274
|
module Provider
|
221
275
|
# As if the domain model class
|
276
|
+
def self.all
|
277
|
+
[Ebay, Amazon]
|
278
|
+
end
|
279
|
+
|
222
280
|
module Base
|
223
281
|
def do_something!
|
224
282
|
"do something with #{something_from_an_instance}"
|
@@ -243,11 +301,6 @@ module Provider
|
|
243
301
|
"the amazon provider config"
|
244
302
|
end
|
245
303
|
end
|
246
|
-
|
247
|
-
# As if the domain model class
|
248
|
-
def self.all
|
249
|
-
[Ebay, Amazon]
|
250
|
-
end
|
251
304
|
end
|
252
305
|
```
|
253
306
|
|
@@ -314,6 +367,18 @@ Java/C# enums allow defining methods on the enum, which are shared across all en
|
|
314
367
|
|
315
368
|
```ruby
|
316
369
|
module PipelineStage
|
370
|
+
module_function
|
371
|
+
|
372
|
+
def all
|
373
|
+
[InitialContact, InNegotiations, LostDeal, PaidOut]
|
374
|
+
end
|
375
|
+
|
376
|
+
def cast(stage)
|
377
|
+
self.all.map(&:external_provider_code).find{|code| code == stage} ||
|
378
|
+
self.all.map(&:database_representation).find{|code| code == stage} ||
|
379
|
+
self.all.map(&:frontend_representation).find{|code| code == stage}
|
380
|
+
end
|
381
|
+
|
317
382
|
module Base
|
318
383
|
def external_provider_code
|
319
384
|
@external_provider_code ||= self.name.underscore
|
@@ -343,18 +408,6 @@ module PipelineStage
|
|
343
408
|
module PaidOut
|
344
409
|
extend Base
|
345
410
|
end
|
346
|
-
|
347
|
-
module_function
|
348
|
-
|
349
|
-
def all
|
350
|
-
[InitialContact, InNegotiations, LostDeal, PaidOut]
|
351
|
-
end
|
352
|
-
|
353
|
-
def cast(stage)
|
354
|
-
self.all.map(&:external_provider_code).find{|code| code == stage} ||
|
355
|
-
self.all.map(&:database_representation).find{|code| code == stage} ||
|
356
|
-
self.all.map(&:frontend_representation).find{|code| code == stage}
|
357
|
-
end
|
358
411
|
end
|
359
412
|
|
360
413
|
class MyARObject < ActiveRecord::Base
|
@@ -7,16 +7,12 @@ module ActiveModule
|
|
7
7
|
|
8
8
|
def =~(other)
|
9
9
|
case other
|
10
|
-
when nil
|
11
|
-
false
|
12
|
-
when ::Module
|
13
|
-
super(other)
|
14
|
-
when ::String
|
15
|
-
(@possible_names ||= possible_names).include?(other)
|
16
10
|
when ::Symbol
|
17
|
-
|
11
|
+
possible_symbol_names_set.include?(other)
|
12
|
+
when ::String
|
13
|
+
possible_symbol_names_set.include?(other.to_sym)
|
18
14
|
else
|
19
|
-
|
15
|
+
self == other
|
20
16
|
end
|
21
17
|
end
|
22
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_module
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Rolo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|