skn_utils 3.0.1 → 3.0.2

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: 7fe0db5477b549906e45652fb7ead4ac75b227be
4
- data.tar.gz: caa018ba88a00a513eb445612baba7ce3b5b20c0
3
+ metadata.gz: 82fb6a798fdac8263ee4faa65a6dd734cf148365
4
+ data.tar.gz: 2dc5b9cc3fa76df1d7c9dbef494b8e9d2dcee707
5
5
  SHA512:
6
- metadata.gz: 7564b414d805436f0419845b9a47da19194d868aa18149893d33cb9cf29569c7842cacdac6533152234f6456d7b875b95561b7c3ff7a2b938d77b20b5d4b7d50
7
- data.tar.gz: 9d952ba616307c63b09f7980e5c18a60f1b66205dde461898dfd3643f438e43836225fa605f9d91bb00928afc667ffc915677c60245e4f8ef398b009912f868e
6
+ metadata.gz: f5d5410f5f06e63a85e054a36e27f20cd5a8c344c59453f992c36e3e28d9632ac256e10f96df6b03421649da3b64e5493808c48e42b5abbc1bce18206347b2c9
7
+ data.tar.gz: 217fc83650fff470b1a5869734747875727bfbcc374a2762e3562b1d610a90bd020505dfbb2ef2340bf09ddcc98791f2688e3095af5f6a0569eb3c86782c5219
@@ -95,7 +95,7 @@ module SknUtils
95
95
 
96
96
  def initialize(params={})
97
97
  @container = {}
98
- initialize_from_hash(params)
98
+ initialize_for_speed(params)
99
99
  end
100
100
 
101
101
  def [](attr)
@@ -131,33 +131,10 @@ module SknUtils
131
131
  #
132
132
  # Returns a string containing a detailed summary of the keys and values.
133
133
  #
134
- InspectKey = :__inspect_key__ # :nodoc:
135
- def inspect
136
- package = to_hash
137
- str = "#<#{self.class}"
138
-
139
- ids = (Thread.current[InspectKey] ||= [])
140
- if ids.include?(object_id)
141
- return str << ' ...>'
142
- end
143
-
144
- ids << object_id
145
- begin
146
- first = true
147
- for k,v in package
148
- str << "," unless first
149
- first = false
150
- str << " #{k}=#{v.inspect}"
151
- end
152
- return str << '>'
153
- ensure
154
- ids.pop
155
- end
134
+ def to_s
135
+ attributes.to_s
156
136
  end
157
137
 
158
- alias_method :to_s, :inspect
159
-
160
-
161
138
  ##
162
139
  # Ruby basic Class methods
163
140
  #
@@ -186,14 +163,14 @@ module SknUtils
186
163
  #
187
164
  # Use our unwrapped/original input Hash when yaml'ing
188
165
  def encode_with(coder)
189
- coder['container'] = self.to_h
166
+ coder['container'] = attributes
190
167
  end
191
168
 
192
169
  # Use our hash from above to fully re-initialize this instance
193
170
  def init_with(coder)
194
171
  case coder.tag
195
- when '!ruby/object:SknUtils::NestedResult'
196
- initialize_from_hash( coder.map['container'] )
172
+ when '!ruby/object:SknUtils::NestedResult', "!ruby/object:#{self.class.name}"
173
+ initialize_for_speed( coder.map['container'] )
197
174
  end
198
175
  end
199
176
 
@@ -208,7 +185,7 @@ module SknUtils
208
185
 
209
186
  # Using the String from above create and return an instance of this class
210
187
  def marshal_load(hash)
211
- initialize_from_hash(hash)
188
+ initialize_for_speed(hash)
212
189
  end
213
190
 
214
191
  def respond_to_missing?(method, incl_private=false)
@@ -237,14 +214,14 @@ module SknUtils
237
214
  # - protected to reasonably ensure key is a symbol
238
215
  def hash_from(sym)
239
216
  starting_sym = key_as_sym(sym)
240
- bundle = starting_sym == container ? container : { starting_sym => container[starting_sym] }
217
+ bundle = ((starting_sym == container) ? container : { starting_sym => container[starting_sym] })
241
218
  bundle.keys.each_with_object({}) do |attr,collector|
242
219
  value = bundle[attr]
243
220
  case value
244
- when Array
245
- value = value.map {|ele| array_to_hash(ele) }
246
221
  when NestedResult
247
222
  value = value.to_hash
223
+ when Array
224
+ value = value.map {|ele| array_to_hash(ele) }
248
225
  end
249
226
  collector[attr] = value # new copy
250
227
  end
@@ -265,6 +242,22 @@ module SknUtils
265
242
  name
266
243
  end
267
244
 
245
+ # Don't create methods until first access
246
+ def initialize_for_speed(hash)
247
+ hash.each_pair do |k,v|
248
+ key = key_as_sym(k)
249
+ case v
250
+ when Array
251
+ value = v.map { |element| translate_value(element) }
252
+ container.store(key, value)
253
+ when Hash
254
+ container.store(key, NestedResult.new(v))
255
+ else
256
+ container.store(key, v)
257
+ end
258
+ end
259
+ end
260
+
268
261
  def initialize_from_hash(hash)
269
262
  hash.each_pair do |k,v|
270
263
  key = key_as_sym(k)
@@ -284,10 +277,10 @@ module SknUtils
284
277
  # Feature: unwrap array of array-of-hashes/object
285
278
  def array_to_hash(array)
286
279
  case array
287
- when Array
288
- array.map { |element| array_to_hash(element) }
289
280
  when NestedResult
290
281
  array.to_hash
282
+ when Array
283
+ array.map { |element| array_to_hash(element) }
291
284
  else
292
285
  array
293
286
  end
@@ -296,10 +289,10 @@ module SknUtils
296
289
  # Feature: wrap array of array-of-hashes/object
297
290
  def translate_value(value)
298
291
  case value
299
- when Array
300
- value.map { |element| translate_value(element) }
301
292
  when Hash
302
293
  NestedResult.new(value)
294
+ when Array
295
+ value.map { |element| translate_value(element) }
303
296
  else
304
297
  value
305
298
  end
@@ -322,18 +315,16 @@ module SknUtils
322
315
  method_nsym = method_sym.is_a?(Symbol) ? method.to_s[0..-2].to_sym : method
323
316
 
324
317
 
325
- if method.to_s.end_with?("=") and container[method_nsym].nil? # add new key/value pair, transform value if Hash or Array
318
+ if method.to_s.end_with?("=") # add new key/value pair, transform value if Hash or Array
326
319
  initialize_from_hash({method_nsym => args.first})
327
320
 
328
321
  elsif container.key?(method_sym)
329
- puts "#{__method__}() method: #{method}"
330
- enable_dot_notation(method_sym) # Add Reader/Writer one first need
331
- container[method_sym]
322
+ container[enable_dot_notation(method_sym)] # Add Reader/Writer one first need
332
323
 
333
- elsif method.to_s.end_with?('?') # order of tests is significant,
324
+ elsif method.to_s.end_with?('?') # order of tests is significant,
334
325
  attribute?(method_nsym)
335
326
 
336
- else
327
+ else # TODO: replace following with nil to match OpenStruct behavior when key not found
337
328
  e = NoMethodError.new "undefined method `#{method}' for #{self.class.name}", method, args
338
329
  e.set_backtrace caller(1)
339
330
  raise e
@@ -343,40 +334,3 @@ module SknUtils
343
334
 
344
335
  end # end class
345
336
  end # end module
346
-
347
-
348
- # YAML.load(str) will trigger #init_with for each type it encounters when loading
349
- # Psych.dump ==> "--- !ruby/object:SknUtils::NestedResult\ncontainer:\n :one: 1\n :two: two\n"
350
- #
351
- #
352
- # [2] pry(main)> ay = Psych.dump a
353
- # respond_to_missing?() checking for method: :encode_with existence.
354
- # => "--- !ruby/object:SknUtils::NestedResult\ncontainer:\n :one: 1\n :two: two\n"
355
- # [3] pry(main)> az = Psych.load ay
356
- # respond_to_missing?() checking for method: :init_with existence.
357
- # respond_to_missing?() checking for method: :yaml_initialize existence.
358
- # => #<SknUtils::NestedResult:0x007fe410993238 @container={:one=>1, :two=>"two"}>
359
-
360
-
361
- # YAML RTM? querys
362
- # [:encode_with, :init_with].include?(method)
363
-
364
-
365
- # can be accessed just like a hash
366
- # respond_to_missing?() checking for method: :encode_with existence.
367
- # respond_to_missing?() checking for method: :encode_with existence.
368
- # respond_to_missing?() checking for method: :encode_with existence.
369
- # respond_to_missing?() checking for method: :encode_with existence.
370
- # respond_to_missing?() checking for method: :encode_with existence.
371
- # respond_to_missing?() checking for method: :encode_with existence.
372
- # respond_to_missing?() checking for method: :encode_with existence.
373
- # respond_to_missing?() checking for method: :encode_with existence.
374
- # init_with() hooking into Yaml/Psych.load for codes: {:seven=>7, :eight=>"eight"}.
375
- # init_with() hooking into Yaml/Psych.load for codes: {:four=>4, :five=>5, :six=>#<SknUtils::NestedResult:0x007fba101740e0 @container={:seven=>7, :eight=>"eight"}>, :seven=>false}.
376
- # init_with() hooking into Yaml/Psych.load for codes: {:any_key=>#<Tuple:0x007fba101643e8 @first="foo", @second="bar">}.
377
- # init_with() hooking into Yaml/Psych.load for codes: {:seven=>7, :eight=>"eight"}.
378
- # init_with() hooking into Yaml/Psych.load for codes: {:four=>4, :five=>5, :six=>#<SknUtils::NestedResult:0x007fba1014f880 @container={:seven=>7, :eight=>"eight"}>}.
379
- # init_with() hooking into Yaml/Psych.load for codes: {:nine=>9, :ten=>"ten"}.
380
- # init_with() hooking into Yaml/Psych.load for codes: {:four=>4, :five=>5, :six=>#<SknUtils::NestedResult:0x007fba1014cd60 @container={:nine=>9, :ten=>"ten"}>}.
381
- # init_with() hooking into Yaml/Psych.load for codes: {:one=>"one", :two=>"two", :three=>#<SknUtils::NestedResult:0x007fba10175058 @container={:four=>4, :five=>5, :six=>#<SknUtils::NestedResult:0x007fba101740e0 @container={:seven=>7, :eight=>"eight"}>, :seven=>false}>, :four=>#<SknUtils::NestedResult:0x007fba101664b8 @container={:any_key=>#<Tuple:0x007fba101643e8 @first="foo", @second="bar">}>, :five=>[4, 5, 6], :six=>[#<SknUtils::NestedResult:0x007fba10154628 @container={:four=>4, :five=>5, :six=>#<SknUtils::NestedResult:0x007fba1014f880 @container={:seven=>7, :eight=>"eight"}>}>, #<SknUtils::NestedResult:0x007fba1014d738 @container={:four=>4, :five=>5, :six=>#<SknUtils::NestedResult:0x007fba1014cd60 @container={:nine=>9, :ten=>"ten"}>}>, #<Tuple:0x007fba10146d48 @first="another", @second="tuple">], :seven=>#<Tuple:0x007fba10145a60 @first="hello", @second="world">}.
382
-
@@ -4,91 +4,39 @@
4
4
  #
5
5
  # Ref: https://ozone.wordpress.com/category/programming/metaprogramming/
6
6
 
7
-
8
- class NotifierBase
9
-
10
- def initialize
11
- @listeners = []
12
- end
13
-
14
- def register_listener(l)
15
- @listeners.push(l) unless @listeners.include?(l)
16
- end
17
-
18
- def unregister_listener(l)
19
- @listeners.delete(l)
20
- end
21
-
22
- def self.attribute(*properties)
23
- properties.each do |prop|
24
- define_method(prop) {
25
- instance_variable_get("@#{prop}")
26
- }
27
- define_method("#{prop}=") do |value|
28
- old_value = instance_variable_get("@#{prop}")
29
- return if (value == old_value)
30
- @listeners.each { |listener|
31
- listener.attribute_changed(prop, old_value, value)
7
+ module SknUtils
8
+ class NotifierBase
9
+
10
+ def initialize
11
+ @listeners = []
12
+ end
13
+
14
+ def register_listener(listener)
15
+ @listeners.push(listener) unless @listeners.include?(listener)
16
+ end
17
+
18
+ def unregister_listener(listener)
19
+ @listeners.delete(listener)
20
+ end
21
+
22
+ # create writer-with-notify and reader
23
+ def self.attribute(*attrs)
24
+ attrs.each do |attr|
25
+ instance_variable_set("@#{attr}", nil)
26
+ define_method(attr) {
27
+ instance_variable_get("@#{attr}")
32
28
  }
33
- instance_variable_set("@#{prop}", value)
34
- end
35
- end # loop on properties
36
- end # end of attribute method
37
-
38
- end # end of NotifierBase class
39
-
40
-
41
- # Create a bean from that base
42
- class TestBean < NotifierBase
43
- attribute :name, :firstname
44
- end
45
-
46
- class LoggingPropertyChangeListener
47
- def attribute_changed(attribute, old_value, new_value)
48
- print attribute, " changed from ",
49
- old_value, " to ",
50
- new_value, "\n"
51
- end
29
+ define_method("#{attr}=") do |value|
30
+ old_value = instance_variable_get("@#{attr}")
31
+ return if (value == old_value)
32
+ @listeners.each { |listener|
33
+ listener.attribute_changed(attr, old_value, value)
34
+ }
35
+ instance_variable_set("@#{attr}", value)
36
+ end
37
+ end # loop on attrs
38
+ end # end of attribute method
39
+
40
+ end # end of NotifierBase class
52
41
  end
53
42
 
54
- class SimpleBean < NotifierBase
55
- attribute :name, :firstname
56
-
57
- def impotent_name=(new_name)
58
- @name = new_name
59
- end
60
- end
61
-
62
-
63
- test = TestBean.new
64
- listener = LoggingPropertyChangeListener.new
65
- test.register_listener(listener)
66
- test.name = 'James Scott'
67
- test.firstname = "Scott"
68
- test.firstname = "James"
69
- test.unregister_listener(listener)
70
-
71
-
72
-
73
- test = SimpleBean.new
74
- listener = LoggingPropertyChangeListener.new
75
- test.register_listener(listener)
76
- test.name = 'James Scott'
77
- test.firstname = 'Scott'
78
- test.firstname = 'James'
79
- test.unregister_listener(listener)
80
-
81
-
82
- # output it generates:
83
-
84
- # ==> name changed from nil to James Scott
85
- # ==> firstname changed from nil to Scott
86
- # ==> firstname changed from Scott to James
87
-
88
-
89
- #
90
- # END
91
- #
92
-
93
-
94
-
@@ -3,7 +3,7 @@ module SknUtils
3
3
  class Version
4
4
  MAJOR = 3
5
5
  MINOR = 0
6
- PATCH = 1
6
+ PATCH = 2
7
7
 
8
8
  def self.to_s
9
9
  [MAJOR, MINOR, PATCH].join('.')
data/lib/skn_utils.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "skn_utils/version"
2
2
  require 'skn_utils/nested_result'
3
3
  require 'skn_utils/null_object'
4
+ require 'skn_utils/notifier_base'
4
5
  require 'skn_utils/exploring/commander'
5
6
  require 'skn_utils/exploring/action_service'
6
7
 
data/skn_utils.gemspec CHANGED
@@ -22,7 +22,7 @@ EOF
22
22
  This version does not include ResultBean, PageControls, or ValueBean classes.
23
23
  SknUtils::NestedResult class replaces those original classes and their function.
24
24
 
25
- Please update your existing code to make the above change or use the prior version 2.0.7
25
+ Please update your existing code to make the above change or use the prior version 2.0.6
26
26
  EOF
27
27
  spec.homepage = "https://github.com/skoona/skn_utils"
28
28
  spec.license = "MIT"
@@ -30,17 +30,11 @@ EOF
30
30
  spec.files = `git ls-files -z`.split("\x0")
31
31
  spec.executables = []
32
32
  spec.test_files = spec.files.grep(%r{^(spec)/})
33
- spec.require_paths = ["lib"]
33
+ spec.require_paths = ['lib']
34
34
 
35
35
  spec.add_development_dependency "bundler", ">= 0"
36
36
  spec.add_development_dependency "rake", ">= 0"
37
37
  spec.add_development_dependency "rspec", '~> 3.0'
38
38
  spec.add_development_dependency "pry", ">= 0"
39
39
  spec.add_development_dependency "simplecov", ">= 0"
40
-
41
- ## Make sure you can build the gem on older versions of RubyGems too:
42
- spec.rubygems_version = "1.6.2"
43
- spec.required_rubygems_version = Gem::Requirement.new(">= 0") if spec.respond_to? :required_rubygems_version=
44
- spec.required_ruby_version = '~> 2.0'
45
- spec.specification_version = 3 if spec.respond_to? :specification_version
46
40
  end
@@ -22,6 +22,18 @@ class MyObject
22
22
 
23
23
  end
24
24
 
25
+ class IFeature < SknUtils::NestedResult
26
+ def initialize(parms={})
27
+ super(parms)
28
+ # @some_value = 'Three'
29
+ end
30
+
31
+ def say(val='hello')
32
+ "Three #{val}s"
33
+ end
34
+ end
35
+
36
+
25
37
  RSpec.shared_examples 'plain old ruby object' do
26
38
 
27
39
  context "Core Operations " do
@@ -165,6 +177,19 @@ end
165
177
 
166
178
 
167
179
  RSpec.describe SknUtils::NestedResult, 'NestedResult class - Basic usage.' do
180
+ let(:ifeature) do
181
+ IFeature.new(one: 'one', 4201 => 'Account Code',
182
+ two: 'two',
183
+ three: { four: 4, five: 5, six: { seven: 7, eight: 'eight' }, seven: false },
184
+ four: { any_key: MyObject.new(value: ['MyObject Testing', 'Looking for Modifications']) },
185
+ five: [4, 5, 6],
186
+ six: [{ four: 4, five: 5, six: { seven: 7, eight: 'eight' } },
187
+ { four: 4, five: 5, six: { nine: 9, ten: 'ten' } },
188
+ MyObject.new(value: ['MyObject Testing', 'Looking for Modifications'])],
189
+ seven: MyObject.new(value: ['MyObject Testing', 'Looking for Modifications']),
190
+ eight: [[{one: 'one', two: 'two'}],[{three: 'three', four: 'four'}]])
191
+ end
192
+
168
193
  let(:object) do
169
194
  SknUtils::NestedResult.new(one: 'one', 4201 => 'Account Code',
170
195
  two: 'two',
@@ -227,6 +252,12 @@ RSpec.describe SknUtils::NestedResult, 'NestedResult class - Basic usage.' do
227
252
  it_behaves_like 'plain old ruby object' do
228
253
  let(:bean) { object }
229
254
  end
255
+ it_behaves_like 'plain old ruby object' do
256
+ let(:bean) { ifeature }
257
+ end
258
+ it "behaves as expected when inherited" do
259
+ expect(ifeature.say('Person')).to eq('Three Persons')
260
+ end
230
261
  end
231
262
 
232
263
  context 'Marshalling to JSON' do
@@ -235,10 +266,24 @@ RSpec.describe SknUtils::NestedResult, 'NestedResult class - Basic usage.' do
235
266
  end
236
267
  end
237
268
 
269
+ context 'IFeature Basic Operations after Yaml marshaling' do
270
+ let(:dumped_object) { Psych.dump(ifeature) }
271
+
272
+ it "#encode_with exports the original hash when YAML'ed" do
273
+ expect(dumped_object).to include('ruby/object:IFeature')
274
+ expect(dumped_object[42..-1]).to_not include('ruby/object:IFeature')
275
+ end
276
+
277
+ it_behaves_like 'plain old ruby object' do
278
+ let(:bean) { Psych.load(dumped_object) }
279
+ end
280
+ end
281
+
238
282
  context 'Basic Operations after Yaml marshaling' do
239
283
  let(:dumped_object) { Psych.dump(object) }
240
284
 
241
285
  it "#encode_with exports the original hash when YAML'ed" do
286
+ expect(dumped_object).to include('ruby/object:SknUtils::NestedResult')
242
287
  expect(dumped_object[42..-1]).to_not include('ruby/object:SknUtils::NestedResult')
243
288
  end
244
289
 
@@ -0,0 +1,66 @@
1
+ ##
2
+ # spec/lib/skn_utils/null_object_spec.rb
3
+ #
4
+
5
+ # Create a bean from that base
6
+ class TestBean < SknUtils::NotifierBase
7
+ attribute :name, :firstname
8
+ end
9
+
10
+ class LoggingPropertyChangeListener
11
+ def attribute_changed(attribute, old_value, new_value)
12
+ print attribute, " changed from ",
13
+ old_value, " to ",
14
+ new_value, "\n"
15
+ end
16
+ end
17
+
18
+ class SimpleBean < SknUtils::NotifierBase
19
+ attribute :name, :firstname
20
+
21
+ def impotent_name=(new_name)
22
+ @name = new_name
23
+ end
24
+ end
25
+
26
+
27
+ RSpec.describe SknUtils::NotifierBase, "Notify feature example for Ruby " do
28
+ let(:test_obj) { TestBean.new }
29
+ let(:simple_obj) { SimpleBean.new }
30
+ let(:listener) { LoggingPropertyChangeListener.new }
31
+
32
+ context "Basic Operations" do
33
+ it "Initializes without params" do
34
+ expect(subject).to be
35
+ end
36
+ it "Can be Inherited." do
37
+ expect(test_obj).to be
38
+ end
39
+ end
40
+
41
+ context "Notify Operations" do
42
+ it "#register_listener registers listeners." do
43
+ expect(test_obj.register_listener(listener)).to include(listener)
44
+ end
45
+
46
+ it "#unregister_listener removes listener." do
47
+ test_obj.register_listener(listener)
48
+ expect(test_obj.unregister_listener(listener)).to eq(listener)
49
+ end
50
+
51
+ it "notifies listeners of changes when attribute writer is used." do
52
+ test_obj.register_listener(listener)
53
+ expect(listener).to receive(:attribute_changed).with(:name, nil, 'James Scott')
54
+ test_obj.name = 'James Scott'
55
+ end
56
+
57
+ it "does not notify listeners when attribute writer is not used." do
58
+ simple_obj.register_listener(listener)
59
+ expect(listener).not_to receive(:attribute_changed)
60
+ simple_obj.impotent_name = 'James Scott'
61
+ expect(simple_obj.name).to eq('James Scott')
62
+ end
63
+
64
+ end
65
+
66
+ 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: 3.0.1
4
+ version: 3.0.2
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: 2017-03-31 00:00:00.000000000 Z
11
+ date: 2017-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -112,6 +112,7 @@ files:
112
112
  - spec/lib/skn_utils/exploring/commander_spec.rb
113
113
  - spec/lib/skn_utils/exploring/configuration_spec.rb
114
114
  - spec/lib/skn_utils/nested_result_spec.rb
115
+ - spec/lib/skn_utils/notifier_base_spec.rb
115
116
  - spec/lib/skn_utils/null_object_spec.rb
116
117
  - spec/spec_helper.rb
117
118
  homepage: https://github.com/skoona/skn_utils
@@ -121,15 +122,15 @@ metadata: {}
121
122
  post_install_message: "This version does not include ResultBean, PageControls, or
122
123
  ValueBean classes. \nSknUtils::NestedResult class replaces those original classes
123
124
  and their function. \n\nPlease update your existing code to make the above change
124
- or use the prior version 2.0.7\n"
125
+ or use the prior version 2.0.6\n"
125
126
  rdoc_options: []
126
127
  require_paths:
127
128
  - lib
128
129
  required_ruby_version: !ruby/object:Gem::Requirement
129
130
  requirements:
130
- - - "~>"
131
+ - - ">="
131
132
  - !ruby/object:Gem::Version
132
- version: '2.0'
133
+ version: '0'
133
134
  required_rubygems_version: !ruby/object:Gem::Requirement
134
135
  requirements:
135
136
  - - ">="
@@ -139,7 +140,7 @@ requirements: []
139
140
  rubyforge_project:
140
141
  rubygems_version: 2.6.11
141
142
  signing_key:
142
- specification_version: 3
143
+ specification_version: 4
143
144
  summary: SknUtils contains a small collection of Ruby utilities, the first being a
144
145
  NestedResult a key/value container.
145
146
  test_files:
@@ -147,5 +148,6 @@ test_files:
147
148
  - spec/lib/skn_utils/exploring/commander_spec.rb
148
149
  - spec/lib/skn_utils/exploring/configuration_spec.rb
149
150
  - spec/lib/skn_utils/nested_result_spec.rb
151
+ - spec/lib/skn_utils/notifier_base_spec.rb
150
152
  - spec/lib/skn_utils/null_object_spec.rb
151
153
  - spec/spec_helper.rb