skn_utils 3.0.1 → 3.0.2

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