minitest-substitute 0.1.0 → 0.2.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
  SHA256:
3
- metadata.gz: 82dcc1be480cea4b024afc50aa111065cb8f6762847d40db97e2eae37823d43e
4
- data.tar.gz: f9b44bae2d05d0552cbfdc944531ceb71834ee1e017eea62df34b8d5cd952e9e
3
+ metadata.gz: 288e4fc7e4e20c4b649237471762f8723ce333f2886d4244048033ea281c4ab2
4
+ data.tar.gz: ee23d391142761ea6be22ecb306944313e612fc697c4849ab4f70c7a6ce8e844
5
5
  SHA512:
6
- metadata.gz: ea455efb4e176abb0441e9fe57306628f0b5c232fda56ce4b152152127a902ddf0e75cd1a6a40513e610e14dee5d00cb8b187534fbe2ff5cef609be16e1c2803
7
- data.tar.gz: 52ffbfd39b06e813c4f7a44fd4dade18ab7c2e1728a0b0993971bb5d51c4607ac1ca29321a7e308de2244732efc33598e7be61e5b4afc38c06a6ae7fdd9a9ba4
6
+ metadata.gz: 6d2abd17135f9a750c2e7efb89e1fbc4d2b1ce30a7767e60ad368715059de575435e36856128e5e911c495cfc407169ef68baf9176721ee11eb28f55197fb13f
7
+ data.tar.gz: ba8d78a68880474bd1051887ad5435e0efdda86aa78c643ddad004bdf606e725ee688385da114abdc4dfb110ad5eb42e5c1a7de146de380e49372296ae6ec9de
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  Nothing so far
4
4
 
5
+ ## 0.2.0
6
+
7
+ #### Additions
8
+ * Refactor to support class variables as well
9
+ * Use declared subject as default target for with helper
10
+
5
11
  ## 0.1.0
6
12
 
7
13
  #### Initial Implementation
data/README.md CHANGED
@@ -41,13 +41,6 @@ require 'minitest/substitute'
41
41
 
42
42
  ## Usage
43
43
 
44
- This lightweight gem implements features on a "as needed" basis, as of now:
45
-
46
- * substitution of instance variables
47
- * substitution of global variables
48
-
49
- Please [create an issue describing your use case](https://github.com/svoop/minitest-substitute/issues) in case you need more features such as the substitution of class variables or substitution via accessor methods.
50
-
51
44
  ### Block
52
45
 
53
46
  To substitute the value of an instance variable for the duration of a block:
@@ -59,11 +52,29 @@ class Config
59
52
  end
60
53
  end
61
54
 
62
- Config.instance_variable_get('@version') # => 1
63
- with '@version', 2, on: Config do
64
- Config.instance_variable_get('@version') # => 2
55
+ config = Config.new
56
+
57
+ config.instance_variable_get('@version') # => 1
58
+ with '@version', 2, on: config do
59
+ config.instance_variable_get('@version') # => 2
60
+ end
61
+ config.instance_variable_get('@version') # => 1
62
+ ```
63
+
64
+ :warning: The target `on` is set explicitly in this case. If you omit this argument, `self` will be used as target by default.
65
+
66
+ Class variables can be substituted as well:
67
+
68
+ ```ruby
69
+ class Config
70
+ @@counter = 0
71
+ end
72
+
73
+ Config.class_variable_get('@@counter') # => 0
74
+ with '@@counter', 42, on: Config do
75
+ Config.class_variable_get('@@counter') # => 42
65
76
  end
66
- Config.instance_variable_get('@version') # => 1
77
+ Config.class_variable_get('@@counter') # => 0
67
78
  ```
68
79
 
69
80
  Same goes for global variables:
@@ -128,6 +139,8 @@ with '@version', on: Config do
128
139
  end
129
140
  ```
130
141
 
142
+ :warning: The target `on` is set explicitly in this case. If you omit this argument, `:subject` will be used as target by default which refers to the subject defined by the `subject {}` helper.
143
+
131
144
  It's safe to use multiple `with` statements within one `describe` block.
132
145
 
133
146
  (The spec integration is borrowed from [minitest-around](https://rubygems.org/gems/minitest-around) for elegance and compatibility.)
@@ -3,23 +3,23 @@
3
3
  require 'minitest/spec'
4
4
 
5
5
  Minitest::Spec::DSL.class_eval do
6
- class Substitutor
7
- include Minitest::Substitute::With
8
- end
9
6
 
10
7
  # Substitute the variable value for the duration of the current description
11
8
  #
12
9
  # @param variable [String] instance or global variable name
13
10
  # @param substitute [Object] temporary substitution value
14
- # @param on [Object, nil] substitute in the context of this object
11
+ # @param on [Object, Symbol, nil] substitute in the context of this object
12
+ # or in the context of the declared subject if +:subject+ is set
15
13
  # @yield temporary substitution value (takes precedence over +substitute+ param)
16
- def with(variable, substitute=nil, on: self)
14
+ def with(variable, substitute=nil, on: :subject)
15
+ substitute = yield if block_given?
16
+ substitutor = Minitest::Substitute::Substitutor.new(variable, substitute, on: on)
17
17
  before do
18
- substitute = yield if block_given?
19
- Substitutor.send(:commit_substitution, variable, substitute, on: on)
18
+ substitutor.on = subject if on == :subject && respond_to?(:subject)
19
+ substitutor.commit
20
20
  end
21
21
  after do
22
- Substitutor.send(:rollback_substitution, variable, on: on)
22
+ substitutor.rollback
23
23
  end
24
24
  end
25
25
 
@@ -44,4 +44,5 @@ Minitest::Spec::DSL.class_eval do
44
44
  end
45
45
  end) #.then &:include
46
46
  end
47
+
47
48
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Minitest
4
+ module Substitute
5
+ class Substitutor
6
+
7
+ EVAL_METHODS = [:instance_eval, :instance_eval, :class_eval].freeze
8
+
9
+ attr_writer :on
10
+
11
+ def initialize(variable, substitute, on:)
12
+ @variable, @substitute, @on = variable, substitute, on
13
+ end
14
+
15
+ def commit
16
+ @original = get
17
+ set @substitute
18
+ end
19
+
20
+ def rollback
21
+ set @original
22
+ end
23
+
24
+ private
25
+
26
+ def eval_method
27
+ EVAL_METHODS[@variable.count('@')]
28
+ end
29
+
30
+ def get
31
+ @on.send(eval_method, @variable.to_s)
32
+ end
33
+
34
+ def set(value)
35
+ @on.send(eval_method, "#{@variable} = value")
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Minitest
4
4
  module Substitute
5
- VERSION = '0.1.0'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
@@ -3,10 +3,6 @@
3
3
  module Minitest
4
4
  module Substitute
5
5
  module With
6
- @original = {}
7
- class << self
8
- attr_accessor :original
9
- end
10
6
 
11
7
  # Substitute the variable value for the duration of the given block
12
8
  #
@@ -16,22 +12,13 @@ module Minitest
16
12
  # @yield block during which the substitution is made
17
13
  # @return [Object] return value of the yielded block
18
14
  def with(variable, substitute, on: self)
19
- commit_substitution(variable, substitute, on: on)
15
+ substitutor = Minitest::Substitute::Substitutor.new(variable, substitute, on: on)
16
+ substitutor.commit
20
17
  yield.tap do
21
- rollback_substitution(variable, on: on)
18
+ substitutor.rollback
22
19
  end
23
20
  end
24
21
 
25
- private
26
-
27
- def commit_substitution(variable, substitute, on:)
28
- Minitest::Substitute::With.original[variable.hash] = on.instance_eval variable.to_s
29
- on.instance_eval "#{variable} = substitute"
30
- end
31
-
32
- def rollback_substitution(variable, on:)
33
- on.instance_eval "#{variable} = Minitest::Substitute::With.original.delete(variable.hash)"
34
- end
35
22
  end
36
23
  end
37
24
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'substitute/version'
4
4
 
5
+ require_relative 'substitute/substitutor'
5
6
  require_relative 'substitute/with'
6
7
  require_relative 'substitute/spec'
7
8
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-substitute
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Schwyn
@@ -29,7 +29,7 @@ cert_chain:
29
29
  kAyiRqgxF4dJviwtqI7mZIomWL63+kXLgjOjMe1SHxfIPo/0ji6+r1p4KYa7o41v
30
30
  fwIwU1MKlFBdsjkd
31
31
  -----END CERTIFICATE-----
32
- date: 2023-08-23 00:00:00.000000000 Z
32
+ date: 2023-08-25 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: minitest
@@ -157,7 +157,11 @@ dependencies:
157
157
  - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
- description: ''
160
+ description: |
161
+ Simple Minitest helper to replace values such as an instance variable of an
162
+ object or an environment variable for the duration of a block or a group of
163
+ tests. This comes in very handy when you have to derive from default
164
+ configuration in order to test some aspects of your code.
161
165
  email:
162
166
  - ruby@bitcetera.com
163
167
  executables: []
@@ -172,6 +176,7 @@ files:
172
176
  - README.md
173
177
  - lib/minitest/substitute.rb
174
178
  - lib/minitest/substitute/spec.rb
179
+ - lib/minitest/substitute/substitutor.rb
175
180
  - lib/minitest/substitute/version.rb
176
181
  - lib/minitest/substitute/with.rb
177
182
  homepage: https://github.com/svoop/minitest-substitute
metadata.gz.sig CHANGED
Binary file