skn_utils 5.5.0 → 5.6.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: 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