skn_utils 5.5.0 → 5.6.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: 9a78df2df5ed11a61cea3d00b0f3543295e3ce5b
4
- data.tar.gz: eb021f9d1f707e8e08411b542b05959061322d25
3
+ metadata.gz: 2822f2d8bb83e07b5b099fe277285948dc0e687f
4
+ data.tar.gz: 28ae0ca8c94fbc7998ce696d3424345976588ff8
5
5
  SHA512:
6
- metadata.gz: 0ee33852c9675b13b64a8beb22fdd26fa6afd09994ee4809e4d2fc84bbc46201f469f9b715f4a7ba2291abadd3f5de36f6d98d257c3cc1f085b29f4f7c316374
7
- data.tar.gz: d7ff622a8c1dc13ab5a0438c08b5f9f0e5fc04f32c989bcc8ab32d8d08243cae69c1cd6ce985c0a7871b7784f56a181d6ed6ab8879282e9c139588cbd4112f95
6
+ metadata.gz: 951ff479251217472626d4e8c4dca4bf8e40d59be6606ecefc7ee21b9eb5150f2ff080a9edb8e02b003d2d5cc59cca194cd63a57fc8b5c19dd36a6f4fe334671
7
+ data.tar.gz: a7919693b23911d56a4c3411e5f8c89e62142921a507ecae61357d49e8f7a4eda5e1df65ecf0abf1516f4d3c47fead9820568d1fb2aeaf95972c83f3cfa58f36
data/README.md CHANGED
@@ -323,6 +323,10 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
323
323
 
324
324
  same_instance = SknContainer.resolve(:the_instance)
325
325
 
326
+ * Testing Support:
327
+ - #substitute(...) allows you to mock an existing entry. #substitute is an alias for #register_mock
328
+ - #restore! clears all mocked entries. #restore! is an alias for #unregister_mock!
329
+
326
330
 
327
331
  ## Public Methods: SknUtils::ConcurrentJobs ONLY
328
332
  `ConcurrentJobs` behaves as a concurrent thread pool by using Concurrent::Promise from the `concurrent-ruby` gem.
@@ -73,9 +73,8 @@ class SknRegistry < Concurrent::Hash
73
73
  attr_reader :item, :options
74
74
 
75
75
  def initialize(item, options = {})
76
- @item, @options = item, {
77
- call: item.is_a?(::Proc)
78
- }.merge(options)
76
+ @item = item
77
+ @options = { call: item.is_a?(::Proc) }.merge(options)
79
78
  end
80
79
 
81
80
  # Determine if call is required, without changing original values
@@ -96,18 +95,19 @@ class SknRegistry < Concurrent::Hash
96
95
  def initialize(&block)
97
96
  super
98
97
  block.call(self) if block_given?
98
+ @__substitutes = {}
99
99
  end
100
100
 
101
101
  # public instance methods
102
102
  def register(key, contents = nil, options = {}, &block)
103
103
  if block_given?
104
104
  item = block
105
- options = contents if contents.is_a?(::Hash)
105
+ options.merge!(contents) if contents.is_a?(::Hash)
106
106
  else
107
107
  item = contents
108
108
  end
109
109
 
110
- self[key] = Content.new(item, options)
110
+ self.store( key, Content.new(item, options) )
111
111
 
112
112
  self # enable chaining
113
113
  end
@@ -116,4 +116,22 @@ class SknRegistry < Concurrent::Hash
116
116
  self[key]&.call(render_proc)
117
117
  end
118
118
 
119
+ def register_mock(key, contents = nil, options = {}, &block)
120
+ if member?(key)
121
+ @__substitutes.store(key, self.delete(key) )
122
+ end
123
+
124
+ register(key, contents, options, &block)
125
+ end
126
+ alias_method :substitute, :register_mock
127
+
128
+ def unregister_mocks!
129
+ @__substitutes.keys.each do |k|
130
+ self[k] = @__substitutes.delete(k)
131
+ end
132
+
133
+ nil
134
+ end
135
+ alias_method :restore!, :unregister_mocks!
136
+
119
137
  end
@@ -4,6 +4,7 @@
4
4
  # File: ./lib/skn_utils/core_extensions.rb --
5
5
  # -- from: Rails 4.1 ActiveSupport:lib/active_support/core_ext/object/blank.rb
6
6
  # -- Ref: https://6ftdan.com/allyourdev/2015/01/20/refinements-over-monkey-patching/
7
+ # -- Ref: https://medium.com/rubycademy/the-complete-guide-to-create-a-copy-of-an-object-in-ruby-part-ii-cd28a99d58d9
7
8
 
8
9
  module SknUtils
9
10
  module CoreObjectExtensions
@@ -53,6 +54,15 @@ module SknUtils
53
54
  def presence
54
55
  self if present?
55
56
  end
57
+
58
+ def duplicable?
59
+ true
60
+ end
61
+
62
+ def deep_dup
63
+ duplicable? ? dup : self
64
+ end
65
+
56
66
  end
57
67
 
58
68
  class ::NilClass
@@ -96,6 +106,10 @@ module SknUtils
96
106
  #
97
107
  # @return [true, false]
98
108
  alias_method :blank?, :empty?
109
+
110
+ def deep_dup
111
+ map(&:deep_dup)
112
+ end
99
113
  end
100
114
 
101
115
  class ::Hash
@@ -106,6 +120,19 @@ module SknUtils
106
120
  #
107
121
  # @return [true, false]
108
122
  alias_method :blank?, :empty?
123
+
124
+ def deep_dup
125
+ hash = dup
126
+ each_pair do |key, value|
127
+ if key.frozen? && ::String === key
128
+ hash[key] = value.deep_dup
129
+ else
130
+ hash.delete(key)
131
+ hash[key.deep_dup] = value.deep_dup
132
+ end
133
+ end
134
+ hash
135
+ end
109
136
  end
110
137
 
111
138
  class ::String
@@ -4,7 +4,7 @@
4
4
  module SknUtils
5
5
  class Version
6
6
  MAJOR = 5
7
- MINOR = 5
7
+ MINOR = 6
8
8
  PATCH = 0
9
9
 
10
10
  def self.to_s
@@ -127,4 +127,26 @@ describe SknRegistry, "IoC Lite Container class." do
127
127
  end
128
128
  end
129
129
 
130
+
131
+ context "When used for testing " do
132
+
133
+ it "#register_mock Registers a temporary mock." do
134
+ services.register_mock(:service_c, "Testing" )
135
+
136
+ expect(services.resolve(:service_c)).to eq "Testing"
137
+ services.restore!
138
+ end
139
+
140
+ it "#unregister_mocks! Remove all mocks and restores previous entries if present." do
141
+ original = services.resolve(:service_c)
142
+ services.substitute(:service_c, "Testing")
143
+ expect(services.resolve(:service_c)).to eq "Testing"
144
+
145
+ services.unregister_mocks!
146
+
147
+ services.resolve(:service_c)
148
+ expect(services.resolve(:service_c)).to eq original
149
+ end
150
+ end
151
+
130
152
  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: 5.5.0
4
+ version: 5.6.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: 2019-02-25 00:00:00.000000000 Z
11
+ date: 2019-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge