skn_utils 4.0.4 → 5.0.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/README.md +37 -5
- data/lib/skn_container.rb +71 -7
- data/lib/skn_utils/version.rb +2 -2
- data/spec/lib/skn_utils/container_spec.rb +61 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3697c08bd7a516dbb2a55b859f12b18a1cd7e9ca
|
4
|
+
data.tar.gz: e38dac4af4d7e5da6dd5096b513e95e407784390
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2223a7fb6597e014f2b94135f1c8626c12a798f3c6193cb1909fa887cc9aeb8ba311580f147f6289e18872b1961e8c431679d288d5cc88ae7a377c63aa39194a
|
7
|
+
data.tar.gz: 5ad2921a2d3cf465457f0f24f327a2286daff274cc9975e7f3d42fc46d9946074674a0ff8bd93863ab5e8001b66bff831292519f64899908bb4e2c6d7e36d798
|
data/README.md
CHANGED
@@ -44,17 +44,21 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
44
44
|
|
45
45
|
#### Available Classes
|
46
46
|
* SknSettings
|
47
|
+
* SknUtils::Configurable
|
48
|
+
* SknUtils::EnvStringHandler
|
47
49
|
* SknContainer
|
48
50
|
* SknHash
|
49
|
-
* SknUtils::NestedResult
|
50
|
-
* SknUtils::ResultBean
|
51
|
-
* SknUtils::PageControls
|
52
|
-
* SknUtils::Configurable
|
51
|
+
* SknUtils::NestedResult
|
52
|
+
* SknUtils::ResultBean
|
53
|
+
* SknUtils::PageControls
|
53
54
|
* SknUtils::NullObject
|
54
|
-
* SknUtils::EnvStringHandler
|
55
55
|
* SknUtils::CoreObjectExtensions
|
56
56
|
|
57
57
|
## History
|
58
|
+
10/2/2018 V5.0.0
|
59
|
+
Modified SknContainer (IoC) to only use #register and #resolve as it's public API.
|
60
|
+
- Inspired by: [Andrew Holland](http://cv.droppages.com)
|
61
|
+
|
58
62
|
09/30/2018 V4.0.4
|
59
63
|
Updated EnvStringHandler class to behave like Rails.root in all respects.
|
60
64
|
|
@@ -124,12 +128,40 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
124
128
|
SknSettings # Multi-level application Configuration class, Key/Value Container with Dot/Hash notiation support.
|
125
129
|
|
126
130
|
SknUtils::Configurable # Basic one-level configuration settings module for Applications and or Gems
|
131
|
+
SknContainer # Basic Key/Value container which #registers and #resolves procs, classes, and/or object
|
127
132
|
|
128
133
|
|
129
134
|
## Configuration Options
|
130
135
|
None required other than initialization hash
|
131
136
|
|
132
137
|
|
138
|
+
## Public Methods: SknContainer ONLY
|
139
|
+
SknContainer is global constant containing an initialized Object of Concurrent::Hash using defaults with additional methods.
|
140
|
+
Returns the keyed value as the original instance/value or if provided a proc the result of calling that proc.
|
141
|
+
To register a class or object for global retrieval, use the following API. Also review the RSpecs for additional useage info.
|
142
|
+
#register(key, contents = nil, options = {}, &block)
|
143
|
+
- example:
|
144
|
+
SknContainer.register(:some_klass, MyClass) -- class as value
|
145
|
+
SknContainer.register(:the_instance, MyClass.new) -- Object Instance as value
|
146
|
+
SknContainer.register(:unique_instance, -> {MyClass.new}) -- New Object Instance for each #resolve
|
147
|
+
|
148
|
+
SknContainer -- #register return self to enable chaining
|
149
|
+
.register(:unique_instance, -> {MyClass.new})
|
150
|
+
.register(:the_instance, MyClass.new)
|
151
|
+
.register(:some_klass, MyClass)
|
152
|
+
|
153
|
+
#resolve(key)
|
154
|
+
- example:
|
155
|
+
klass = SknContainer.resolve(:some_klass)
|
156
|
+
result = SknContainer.resolve(:some_klass).new
|
157
|
+
|
158
|
+
obj_instance1 = SknContainer.resolve(:unique_instance)
|
159
|
+
obj_instance2 = SknContainer.resolve(:unique_instance)
|
160
|
+
|
161
|
+
same_instance = SknContainer.resolve(:the_instance)
|
162
|
+
|
163
|
+
|
164
|
+
|
133
165
|
## Public Methods: SknSettings ONLY
|
134
166
|
SknSettings is global constant containing an initialized Object of SknUtils::SknConfiguration using defaults
|
135
167
|
To change the 'development'.yml default please use the following method early or in the case of Rails in 'application.rb
|
data/lib/skn_container.rb
CHANGED
@@ -1,12 +1,76 @@
|
|
1
|
-
##
|
2
|
-
#
|
3
|
-
#
|
1
|
+
# ##
|
2
|
+
#
|
3
|
+
# Credits: Inspired by: andyholland1991@aol.com, http://cv.droppages.com
|
4
|
+
#
|
5
|
+
# class UserRepository
|
6
|
+
# def self.first
|
7
|
+
# { name: 'Jack' }
|
8
|
+
# end
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# class PersonRepository
|
12
|
+
# def first
|
13
|
+
# { name: 'Gill' }
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
## Using Classes
|
18
|
+
#
|
19
|
+
# SknContainer.register(:user_repository, UserRepository)
|
20
|
+
# -- or --
|
21
|
+
# SknContainer.register(:user_repository, UserRepository, call: false )
|
22
|
+
#
|
23
|
+
# SknContainer.resolve(:user_repository).first
|
24
|
+
#
|
25
|
+
## Using Procs
|
26
|
+
#
|
27
|
+
# SknContainer.register(:person_repository, -> { PersonRepository.new })
|
28
|
+
# -- or --
|
29
|
+
# SknContainer.register(:person_repository, -> { PersonRepository.new }, call: true )
|
4
30
|
#
|
5
|
-
#
|
6
|
-
# SknContainer.<new.key> # => AnyObject
|
7
|
-
# SknContainer.<new.key>? # => True | False based on existance #
|
31
|
+
# SknContainer.resolve(:person_repository).first
|
8
32
|
##
|
9
33
|
|
10
34
|
# This creates a global constant (and singleton) wrapping a Hash
|
11
|
-
class << (SknContainer =
|
35
|
+
class << (SknContainer = Concurrent::Hash.new)
|
36
|
+
|
37
|
+
class Content
|
38
|
+
attr_reader :item, :options
|
39
|
+
|
40
|
+
def initialize(item, options = {})
|
41
|
+
@item, @options = item, {
|
42
|
+
call: item.is_a?(::Proc)
|
43
|
+
}.merge(options)
|
44
|
+
end
|
45
|
+
|
46
|
+
def call
|
47
|
+
if options[:call] == true
|
48
|
+
item.call
|
49
|
+
else
|
50
|
+
item
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def register(key, contents = nil, options = {}, &block)
|
56
|
+
if block_given?
|
57
|
+
item = block
|
58
|
+
options = contents if contents.is_a?(::Hash)
|
59
|
+
else
|
60
|
+
item = contents
|
61
|
+
end
|
62
|
+
|
63
|
+
self[key] = Content.new(item, options)
|
64
|
+
|
65
|
+
self # enable chaining
|
66
|
+
end
|
67
|
+
|
68
|
+
def resolve(key)
|
69
|
+
content = self.fetch(key) do
|
70
|
+
fail ArgumentError, "Nothing registered with the name #{key}"
|
71
|
+
end
|
72
|
+
|
73
|
+
content.call
|
74
|
+
end
|
75
|
+
|
12
76
|
end
|
data/lib/skn_utils/version.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
##
|
2
|
+
# spec/lib/skn_utils/container_spec.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
class MyService
|
6
|
+
def value
|
7
|
+
true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
describe SknContainer, "Gem D/I Lite Container module." do
|
14
|
+
|
15
|
+
|
16
|
+
context "Operational Features. " do
|
17
|
+
|
18
|
+
it "#register accepts a proc object to produce unique instances. " do
|
19
|
+
val = subject.register(:service, -> {MyService.new} )
|
20
|
+
expect( val ).to eq subject
|
21
|
+
end
|
22
|
+
|
23
|
+
it "#resolve returns new instances. " do
|
24
|
+
subject.register(:service, -> {MyService.new} )
|
25
|
+
val_a = subject.resolve(:service)
|
26
|
+
val_b = subject.resolve(:service)
|
27
|
+
|
28
|
+
expect( val_a ).to be_instance_of MyService
|
29
|
+
expect( val_a ).to_not be_equal val_b
|
30
|
+
end
|
31
|
+
|
32
|
+
it "#register accepts a class object and return self to enable chaining. " do
|
33
|
+
val = subject.register(:service_k, MyService).register(:more, "More")
|
34
|
+
expect( val ).to eq subject
|
35
|
+
end
|
36
|
+
|
37
|
+
it "#resolve returns class value. " do
|
38
|
+
subject.register(:service_k, MyService)
|
39
|
+
val = subject.resolve(:service_k)
|
40
|
+
|
41
|
+
expect( val ).to be_equal MyService
|
42
|
+
expect( val.new.value ).to be true
|
43
|
+
end
|
44
|
+
|
45
|
+
it "#resolve returns the same object value. " do
|
46
|
+
thingy = MyService.new
|
47
|
+
subject.register(:service_k, thingy)
|
48
|
+
val_a = subject.resolve(:service_k)
|
49
|
+
val_b = subject.resolve(:service_k)
|
50
|
+
|
51
|
+
expect( val_a ).to be_equal thingy
|
52
|
+
expect( val_a ).to be_equal val_b
|
53
|
+
end
|
54
|
+
|
55
|
+
it "#resolve raises ArgumentError when key is not found. " do
|
56
|
+
subject.register(:service_a, "AnyValue")
|
57
|
+
expect{subject.resolve(:no_find)}.to raise_error ArgumentError
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skn_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Scott Jr
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deep_merge
|
@@ -184,6 +184,7 @@ files:
|
|
184
184
|
- spec/factories/settings/test.yml
|
185
185
|
- spec/lib/skn_settings_spec.rb
|
186
186
|
- spec/lib/skn_utils/configurable_spec.rb
|
187
|
+
- spec/lib/skn_utils/container_spec.rb
|
187
188
|
- spec/lib/skn_utils/nested_result_spec.rb
|
188
189
|
- spec/lib/skn_utils/notifier_base_spec.rb
|
189
190
|
- spec/lib/skn_utils/null_object_spec.rb
|
@@ -222,6 +223,7 @@ test_files:
|
|
222
223
|
- spec/factories/settings/test.yml
|
223
224
|
- spec/lib/skn_settings_spec.rb
|
224
225
|
- spec/lib/skn_utils/configurable_spec.rb
|
226
|
+
- spec/lib/skn_utils/container_spec.rb
|
225
227
|
- spec/lib/skn_utils/nested_result_spec.rb
|
226
228
|
- spec/lib/skn_utils/notifier_base_spec.rb
|
227
229
|
- spec/lib/skn_utils/null_object_spec.rb
|