skn_utils 4.0.4 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c8d822f2476ea5f01e6862c6fbd47c40d359da3
4
- data.tar.gz: cd4f1a35654e403618ae01a6f339ea015c91ad3d
3
+ metadata.gz: 3697c08bd7a516dbb2a55b859f12b18a1cd7e9ca
4
+ data.tar.gz: e38dac4af4d7e5da6dd5096b513e95e407784390
5
5
  SHA512:
6
- metadata.gz: 4807810404d01d9f6410efdbb61b041992ccaf06d2814f80cf0df247e4d901d81865f15296d83f4245d5bb13396bfce7b95e79d2b81614371056ce1282067a0e
7
- data.tar.gz: 17132674f1dd97946ab99ad8f6970f3a17d19e4c842a88eaf2ee04c7d52c14032e89bc8c97522558d18e49425ed25954d0a669c5665d9fdfc84d71cc3712a105
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
- # Register:
3
- # SknContainer.<new.key> = AnyObject
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
- # Resolve:
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 = SknUtils::NestedResult.new())
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
@@ -1,9 +1,9 @@
1
1
  # A better way to say it
2
2
  module SknUtils
3
3
  class Version
4
- MAJOR = 4
4
+ MAJOR = 5
5
5
  MINOR = 0
6
- PATCH = 4
6
+ PATCH = 0
7
7
 
8
8
  def self.to_s
9
9
  [MAJOR, MINOR, PATCH].join('.')
@@ -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.0.4
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-01 00:00:00.000000000 Z
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