minitest-substitute 0.1.0 → 0.2.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
  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