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 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