minitest_to_rspec 0.3.0 → 0.4.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: dfbca8efedaf7c52597ad002776c9a91913ef953
4
- data.tar.gz: f0338aab60ec0ed5c47a73b4da8efe10d219a7b7
3
+ metadata.gz: 7a27f05346fd70cc99e4153026b9fbbfec34c534
4
+ data.tar.gz: 56cb0bab1016ecde051d2fcb92f6142d2009c063
5
5
  SHA512:
6
- metadata.gz: 5c19ee604832c47a8a2b29bf04f80a339e0542fd34d282d2fca7faa571cfdce424d556bc66c607413e9a8b48024b7714561d30b89a4b5f4cc0a4d149615f3a6e
7
- data.tar.gz: c84d8763c6788a1e7f781256d7fdd84f673fe995fbd08aad97d26c51f770cce2bd607430c09ade0e9243b01cbe7ff2b3c85b708b3e1d28aa13b4c7a4f35aa93e
6
+ metadata.gz: f17804b35926a1820f7f521b421bf27a6840afa78a7c6fef1e3ceb97523b19d451ea749b7af3445904448f0a76d805faba95291a49b4b44251486ad0707dbe95
7
+ data.tar.gz: aee5ab8d4f585ac6a3798002400072278e0abf3b1d28a90fb6dcaf599424308b6d9d5907e75ef02b247f416827281fe7c713d6661a76395aa700d9482bde8870
data/.travis.yml CHANGED
@@ -1,8 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - "2.0.0-p598"
4
- - "2.1.5"
5
- - "2.2.1"
4
+ - "2.1.6"
5
+ - "2.2.2"
6
6
  script: bundle exec rake
7
7
  notifications:
8
8
  email: false
data/CHANGELOG.md CHANGED
@@ -4,6 +4,18 @@ Change Log
4
4
  This project follows [semver 2.0.0][1] and the recommendations
5
5
  of [keepachangelog.com][2].
6
6
 
7
+ 0.4.0
8
+ -----
9
+
10
+ ### Added
11
+ - Experimental
12
+ - Conversion of mocha to rspec-mocks
13
+ - expects
14
+ - any_instance
15
+
16
+ ### Fixed
17
+ - NoMethodError when input contains stabby lambda
18
+
7
19
  0.3.0
8
20
  -----
9
21
 
data/README.md CHANGED
@@ -4,8 +4,9 @@ Converts [minitest][8] files to [rspec][9].
4
4
 
5
5
  [![Build Status][1]][2] [![Code Climate][3]][4] [![Test Coverage][7]][4]
6
6
 
7
- Uses [ruby_parser][14], [sexp_processor][15], and [ruby2ruby][16],
8
- in that order. Thank you, [Ryan Davis][17]!
7
+ Selected assertions from [Test::Unit][26], [minitest][8], and
8
+ [ActiveSupport][27] are converted to [rspec-expectations][25].
9
+ Selected methods from [mocha][28] are converted to [rspec-mocks][24].
9
10
 
10
11
  Example
11
12
  -------
@@ -14,11 +15,12 @@ Input:
14
15
 
15
16
  ```ruby
16
17
  require 'test_helper'
17
-
18
- # This comment will be discarded!
19
- class BananaTest < ActiveSupport::TestCase
20
- test "is delicious" do
21
- assert Banana.new.delicious?
18
+ class ArrayTest < ActiveSupport::TestCase
19
+ test "changes length" do
20
+ ary = []
21
+ assert_difference "ary.length" do
22
+ ary.push(:x)
23
+ end
22
24
  end
23
25
  end
24
26
  ```
@@ -27,16 +29,16 @@ Output:
27
29
 
28
30
  ```ruby
29
31
  require("spec_helper")
30
- RSpec.describe(Banana) do
31
- it("is delicious") { expect(Banana.new.delicious?).to(be_truthy) }
32
+ RSpec.describe(Array) do
33
+ it("changes length") do
34
+ ary = []
35
+ expect { ary.push(:x) }.to(change { ary.length })
36
+ end
32
37
  end
33
38
  ```
34
39
 
35
- [RubyParser][14] discards all comments.
36
-
37
40
  The code style is whatever [ruby2ruby][6] feels like printing,
38
- and is not configurable. The goal is not style, but to get to
39
- rspec quickly.
41
+ and is not configurable. Comments are discarded.
40
42
 
41
43
  Usage
42
44
  -----
@@ -45,7 +47,7 @@ Usage
45
47
 
46
48
  ```bash
47
49
  gem install minitest_to_rspec
48
- minitest_to_rspec --rails source_file target_file
50
+ bundle exec minitest_to_rspec --rails source_file target_file
49
51
  ```
50
52
 
51
53
  ### Ruby
@@ -67,7 +69,8 @@ Assertion | Arity | Source
67
69
  --------------------------- | ----- | ------
68
70
  assert | |
69
71
  assert_difference | 1,2 |
70
- assert_equal | |
72
+ [assert_equal][23] | 2,3 | Test::Unit
73
+ [assert_not_equal][22] | 2,3 | Test::Unit
71
74
  assert_match | |
72
75
  assert_nil | |
73
76
  [assert_no_difference][12] | | ActiveSupport
@@ -82,11 +85,19 @@ Supported Mocha
82
85
 
83
86
  Mocha | Arity | Block | Notes
84
87
  --------------------- | ----- | ----- | -------
88
+ [any_instance][29] | 0 | n/a |
89
+ [expects][21] | 1 | n/a |
85
90
  [stub][19] | 0,1,2 | no |
86
91
  [stub_everything][18] | 0,1,2 | no | Uses `as_null_object`, not the same.
87
92
  [stubs][20] | 1 | n/a |
88
93
 
89
- Notably not yet supported: `expects`, `any_instance`
94
+ Notably not supported yet: [at_least, once, never, raises, etc.][30]
95
+
96
+ Acknowledgements
97
+ ----------------
98
+
99
+ Uses [ruby_parser][14], [sexp_processor][15], and [ruby2ruby][16]
100
+ by [Ryan Davis][17].
90
101
 
91
102
  [1]: https://travis-ci.org/jaredbeck/minitest_to_rspec.svg
92
103
  [2]: https://travis-ci.org/jaredbeck/minitest_to_rspec
@@ -108,3 +119,13 @@ Notably not yet supported: `expects`, `any_instance`
108
119
  [18]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/API:stub_everything
109
120
  [19]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/API#stub-instance_method
110
121
  [20]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/ObjectMethods#stubs-instance_method
122
+ [21]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/ObjectMethods:expects
123
+ [22]: http://www.rubydoc.info/gems/test-unit/3.0.9/Test/Unit/Assertions#assert_not_equal-instance_method
124
+ [23]: http://www.rubydoc.info/gems/test-unit/3.0.9/Test/Unit/Assertions#assert_equal-instance_method
125
+ [24]: https://github.com/rspec/rspec-mocks
126
+ [25]: https://github.com/rspec/rspec-expectations
127
+ [26]: http://test-unit.github.io/
128
+ [27]: https://rubygems.org/gems/activesupport
129
+ [28]: http://gofreerange.com/mocha/docs/
130
+ [29]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/ClassMethods#any_instance-instance_method
131
+ [30]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/Expectation
@@ -1,6 +1,15 @@
1
1
  module MinitestToRspec
2
2
  class Error < StandardError; end
3
3
  class ProcessingError < Error; end
4
+
5
+ # Raise `UnknownVariant` to indicate that an expression is
6
+ # not recognized. This exception should always be rescued,
7
+ # and the original expression should be used in the output.
8
+ class UnknownVariant < Error; end
9
+
10
+ # Raise `NotImplemented` to indicate that an expression is
11
+ # recognized (not an `UnknownVariant`) but that `minitest_to_rspec`
12
+ # does not (yet) implement a conversion.
4
13
  class NotImplemented < Error; end
5
14
 
6
15
  class ModuleShorthandError < NotImplemented
@@ -74,6 +74,10 @@ module MinitestToRspec
74
74
  @exp[2]
75
75
  end
76
76
 
77
+ def num_arguments
78
+ arguments.length
79
+ end
80
+
77
81
  def one_string_argument?
78
82
  arguments.length == 1 && string?(arguments[0])
79
83
  end
@@ -1,3 +1,6 @@
1
+ require_relative "../call"
2
+ require_relative "../../errors"
3
+
1
4
  module MinitestToRspec
2
5
  module Exp
3
6
  module Calls
@@ -5,23 +8,57 @@ module MinitestToRspec
5
8
  # Represents a call to `returns`, the stubbing method
6
9
  # from `mocha`.
7
10
  class Returns < Call
11
+ KNOWN_RECEIVERS = %i[stubs expects]
12
+ RSPEC_MOCK_METHODS = { expects: :expect, stubs: :allow }
13
+
8
14
  def initialize(exp)
9
15
  @exp = exp
16
+ raise UnknownVariant unless known_variant?
17
+ end
18
+
19
+ def any_instance?
20
+ rcr = receiver_call.receiver
21
+ if !rcr.nil? && sexp_type?(:call, rcr)
22
+ Call.new(rcr).method_name == :any_instance
23
+ else
24
+ false
25
+ end
10
26
  end
11
27
 
12
28
  # The message recipient
13
29
  def msg_recipient
14
- stubs_call.receiver
30
+ receiver_call.receiver
15
31
  end
16
32
 
17
33
  def known_variant?
18
- receiver_is_call_to_stubs? &&
34
+ r = receiver
35
+ !r.nil? &&
36
+ r.sexp_type == :call &&
37
+ KNOWN_RECEIVERS.include?(Call.new(r).method_name) &&
19
38
  !values.empty? &&
20
39
  message.sexp_type == :lit
21
40
  end
22
41
 
23
42
  def message
24
- stubs_call.arguments[0]
43
+ receiver_call.arguments[0]
44
+ end
45
+
46
+ # To avoid a `ProcessingError` please check `known_variant?`
47
+ # before calling `rspec_mocks_method`.
48
+ def rspec_mocks_method
49
+ RSPEC_MOCK_METHODS[receiver_call.method_name]
50
+ end
51
+
52
+ # Returns `Sexp` representing the object that will receive
53
+ # the stubbed message. Examples:
54
+ #
55
+ # banana.stubs(:delicious?).returns(true)
56
+ # Kiwi.any_instance.stubs(:delicious?).returns(false)
57
+ #
58
+ # The `rspec_msg_recipient` is `banana` and `Kiwi`, respectively.
59
+ #
60
+ def rspec_msg_recipient
61
+ any_instance? ? Call.new(msg_recipient).receiver : msg_recipient
25
62
  end
26
63
 
27
64
  # The return values
@@ -31,14 +68,9 @@ module MinitestToRspec
31
68
 
32
69
  private
33
70
 
34
- def receiver_is_call_to_stubs?
35
- r = receiver
36
- !r.nil? &&
37
- r.sexp_type == :call &&
38
- Call.new(r).method_name == :stubs
39
- end
40
-
41
- def stubs_call
71
+ # The receiver of the `:returns` message is a `:call`
72
+ # either to `#stubs` or `#expects`.
73
+ def receiver_call
42
74
  Call.new(receiver)
43
75
  end
44
76
  end
@@ -0,0 +1,19 @@
1
+ module MinitestToRspec
2
+ module Exp
3
+
4
+ # Data object. Represents a `:hash` S-expression.
5
+ class HashExp < Base
6
+ def initialize(sexp)
7
+ assert_sexp_type(:hash, sexp)
8
+ @exp = sexp.dup
9
+ end
10
+
11
+ # A slightly nicer implementation would be:
12
+ # `@exp[1..-1].each_slice(2).to_h`
13
+ # but that would require ruby >= 2.1
14
+ def to_h
15
+ Hash[@exp[1..-1].each_slice(2).to_a]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,6 +2,12 @@ module MinitestToRspec
2
2
 
3
3
  # Useful runtime assertions regarding S-expressions.
4
4
  module SexpAssertions
5
+ def assert_sexp_type_array(type, obj)
6
+ unless obj.is_a?(Array) && obj.all? { |x| sexp_type?(type, x) }
7
+ raise TypeError, "Expected array of #{type} sexp, got #{obj.inspect}"
8
+ end
9
+ end
10
+
5
11
  def assert_sexp_type(type, exp)
6
12
  unless sexp_type?(type, exp)
7
13
  raise TypeError, "Expected #{type} s-expression, got #{exp.inspect}"
@@ -6,36 +6,42 @@ module MinitestToRspec
6
6
  include SexpAssertions
7
7
 
8
8
  # Returns a s-expression representing an rspec-mocks stub.
9
- def allow_to(msg_recipient, matcher)
10
- target = s(:call, nil, :allow, msg_recipient)
9
+ def allow_to(msg_recipient, matcher, any_instance = false)
10
+ allow_method = any_instance ? :allow_any_instance_of : :allow
11
+ target = s(:call, nil, allow_method, msg_recipient)
11
12
  s(:call, target, :to, matcher)
12
13
  end
13
14
 
14
15
  # Returns a s-expression representing an RSpec expectation, i.e. the
15
16
  # combination of an "expectation target" and a matcher.
16
- def expect(target, eager, phase, matcher)
17
- s(:call, expectation_target(target, eager), phase, matcher)
17
+ def expect(target, eager, phase, matcher, any_instance)
18
+ et = expectation_target(target, eager, any_instance)
19
+ s(:call, et, phase, matcher)
18
20
  end
19
21
 
20
- def expect_to(matcher, target, eager)
21
- expect(target, eager, :to, matcher)
22
+ def expect_to(matcher, target, eager, any_instance = false)
23
+ expect(target, eager, :to, matcher, any_instance)
22
24
  end
23
25
 
24
26
  def expect_to_not(matcher, target, eager)
25
- expect(target, eager, :to_not, matcher)
27
+ expect(target, eager, :to_not, matcher, false)
26
28
  end
27
29
 
28
30
  # In RSpec, `expect` returns an "expectation target". This
29
31
  # can be based on an expression, as in `expect(1 + 1)` or it
30
32
  # can be based on a block, as in `expect { raise }`. Either
31
33
  # way, it's called an "expectation target".
32
- def expectation_target(exp, eager = true)
33
- m = "expectation_target_%s" % [eager ? "eager" : "lazy"]
34
- send(m, exp)
34
+ def expectation_target(exp, eager, any_instance)
35
+ if eager
36
+ expectation_target_eager(exp, any_instance)
37
+ else
38
+ expectation_target_lazy(exp)
39
+ end
35
40
  end
36
41
 
37
- def expectation_target_eager(exp)
38
- s(:call, nil, :expect, exp)
42
+ def expectation_target_eager(exp, any_instance)
43
+ expect_method = any_instance ? :expect_any_instance_of : :expect
44
+ s(:call, nil, expect_method, exp)
39
45
  end
40
46
 
41
47
  def expectation_target_lazy(block)
@@ -46,14 +52,19 @@ module MinitestToRspec
46
52
  )
47
53
  end
48
54
 
49
- # Run `exp` through a new `Processor`. This is useful for expressions
50
- # that cannot be fully understood by a single subprocessor. For
51
- # example, we process :iter expressions, because we're interested in
52
- # :iter that contain e.g. an `assert_difference`. However, if the :iter
53
- # turns out to be uninteresting, we still want to fully process its
54
- # sub-expressions. TODO: `full_process` may not be the best name.
55
- def full_process(exp)
56
- Processor.new(false).process(exp)
55
+ # If it's a `Sexp`, run `obj` through a new `Processor`. Otherwise,
56
+ # return `obj`.
57
+ #
58
+ # This is useful for expressions that cannot be fully understood by a
59
+ # single subprocessor. For example, we must begin processing all :iter
60
+ # expressions, because some :iter represent calls we're interested in,
61
+ # e.g. `assert_difference`. However, if the :iter turns out to be
62
+ # uninteresting (perhaps it has no assertions) we still want to fully
63
+ # process its sub-expressions.
64
+ #
65
+ # TODO: `full_process` may not be the best name.
66
+ def full_process(obj)
67
+ obj.is_a?(Sexp) ? Processor.new(false).process(obj) : obj
57
68
  end
58
69
 
59
70
  def matcher(name, *args)
@@ -1,5 +1,6 @@
1
1
  require_relative "../exp/call"
2
2
  require_relative "../exp/calls/returns"
3
+ require_relative "../exp/hash_exp"
3
4
  require_relative "base"
4
5
 
5
6
  module MinitestToRspec
@@ -22,8 +23,12 @@ module MinitestToRspec
22
23
 
23
24
  private
24
25
 
25
- def allow_receive_and_return(msg_recipient, msg, return_values)
26
- allow_to(msg_recipient, receive_and_return(msg, return_values))
26
+ # - msg_rcp. Message recipient. The object to be stubbed.
27
+ # - msg. Message. The name of the stubbed method.
28
+ # - ret_vals. Return values.
29
+ # - any_ins. Any instance? True if this is an `any_instance` stub.
30
+ def allow_receive_and_return(msg_rcp, msg, ret_vals, any_ins = false)
31
+ allow_to(msg_rcp, receive_and_return(msg, ret_vals), any_ins)
27
32
  end
28
33
 
29
34
  def be_falsey
@@ -42,6 +47,25 @@ module MinitestToRspec
42
47
  matcher(:eq, exp)
43
48
  end
44
49
 
50
+ # - msg_rcp. Message recipient. The object to be stubbed.
51
+ # - msg. Message. The name of the stubbed method.
52
+ # - ret_vals. Return values.
53
+ # - any_ins. Any instance? True if this is an `any_instance` stub.
54
+ def expect_receive_and_return(msg_rcp, msg, ret_vals, any_ins = false)
55
+ expect_to(receive_and_return(msg, ret_vals), msg_rcp, true, any_ins)
56
+ end
57
+
58
+ # Given a `Sexp` representing a `Hash` of message expectations,
59
+ # return an array of `Sexp`, each representing an expectation
60
+ # in rspec-mocks syntax.
61
+ def hash_to_expectations(sexp, receiver)
62
+ Exp::HashExp.new(sexp).to_h.map { |msg, ret_val|
63
+ expect_receive_and_return(
64
+ receiver.deep_clone, msg, wrap_sexp(ret_val)
65
+ )
66
+ }
67
+ end
68
+
45
69
  def match(pattern)
46
70
  matcher(:match, pattern)
47
71
  end
@@ -66,6 +90,20 @@ module MinitestToRspec
66
90
  expect_to(be_nil, @exp.arguments[0], true)
67
91
  end
68
92
 
93
+ def method_assert_not_equal
94
+ expected = @exp.arguments[0]
95
+ calculated = @exp.arguments[1]
96
+ expect_to_not(eq(expected), calculated, true)
97
+ end
98
+
99
+ def method_expects
100
+ if @exp.num_arguments == 1
101
+ mocha_expects
102
+ else
103
+ @exp.original
104
+ end
105
+ end
106
+
69
107
  def method_refute
70
108
  expect_to(be_falsey, @exp.arguments[0], true)
71
109
  end
@@ -77,12 +115,9 @@ module MinitestToRspec
77
115
  end
78
116
 
79
117
  def method_returns
80
- r = Exp::Calls::Returns.new(@exp.original)
81
- if r.known_variant?
82
- allow_receive_and_return(r.msg_recipient, r.message, r.values)
83
- else
84
- @exp.original
85
- end
118
+ mocha_returns(Exp::Calls::Returns.new(@exp.original))
119
+ rescue UnknownVariant
120
+ @exp.original
86
121
  end
87
122
 
88
123
  def method_require
@@ -127,14 +162,82 @@ module MinitestToRspec
127
162
  s(:call, nil, :it, *@exp.arguments)
128
163
  end
129
164
 
165
+ def mocha_expects
166
+ arg = @exp.arguments.first
167
+ if sexp_type?(:hash, arg)
168
+ mocha_expects_hash(arg)
169
+ elsif sexp_type?(:lit, arg)
170
+ mocha_expects_lit(arg)
171
+ else
172
+ @exp.original
173
+ end
174
+ end
175
+
176
+ def mocha_expects_hash(hash_sexp)
177
+ assert_sexp_type(:hash, hash_sexp)
178
+ pointless_lambda(hash_to_expectations(hash_sexp, @exp.receiver))
179
+ end
180
+
181
+ def mocha_expects_lit(lit_sexp)
182
+ assert_sexp_type(:lit, lit_sexp)
183
+ expect_to(receive_and_call_original(lit_sexp), @exp.receiver, true)
184
+ end
185
+
186
+ # Given `r`, a `Exp::Calls::Returns`, return a `Sexp` representing
187
+ # the equivalent stub or message expectation in RSpec.
188
+ def mocha_returns(r)
189
+ subprocessor_method = "#{r.rspec_mocks_method}_receive_and_return"
190
+ send(subprocessor_method,
191
+ r.rspec_msg_recipient,
192
+ r.message,
193
+ r.values,
194
+ r.any_instance?
195
+ )
196
+ end
197
+
130
198
  def name_of_processing_method
131
199
  "method_#{@exp.method_name}".to_sym
132
200
  end
133
201
 
202
+ # Given `array_of_calls`, returns a `Sexp` representing a
203
+ # self-executing lambda.
204
+ #
205
+ # This works around the fact that `sexp_processor` expects us to return
206
+ # a single `Sexp`, not an array of `Sexp`. We also can't return a
207
+ # `:block`, or else certain input would produce nested blocks (e.g.
208
+ # `s(:block, s(:block, ..))`) which `ruby2ruby` (naturally) does not know
209
+ # how to process. So, the easiest solution I could think of is a
210
+ # self-executing lambda.
211
+ #
212
+ # Currently, the only `:call` which we process into multiple calls is
213
+ # the hash form of a mocha `#expects`, thankfully uncommon.
214
+ #
215
+ # To get better output (without a pointless lambda) we would have to
216
+ # process `:block` *and* `:defn`, which we are not yet doing.
217
+
218
+ def pointless_lambda(array_of_calls)
219
+ assert_sexp_type_array(:call, array_of_calls)
220
+ s(:call,
221
+ s(:iter,
222
+ s(:call, nil, :lambda),
223
+ s(:args),
224
+ s(:block,
225
+ s(:str, "Sorry for the pointless lambda here."),
226
+ *array_of_calls
227
+ )
228
+ ),
229
+ :call
230
+ )
231
+ end
232
+
134
233
  def receive(message)
135
234
  s(:call, nil, :receive, message)
136
235
  end
137
236
 
237
+ def receive_and_call_original(message)
238
+ s(:call, s(:call, nil, :receive, message), :and_call_original)
239
+ end
240
+
138
241
  def receive_and_return(message, return_values)
139
242
  s(:call, receive(message), :and_return, *return_values)
140
243
  end
@@ -143,6 +246,11 @@ module MinitestToRspec
143
246
  prefix = @rails ? "rails" : "spec"
144
247
  s(:call, nil, :require, s(:str, "#{prefix}_helper"))
145
248
  end
249
+
250
+ # Wraps `obj` in an `Array` if it is a `Sexp`
251
+ def wrap_sexp(obj)
252
+ obj.is_a?(Sexp) ? [obj] : obj
253
+ end
146
254
  end
147
255
  end
148
256
  end
@@ -1,3 +1,3 @@
1
1
  module MinitestToRspec
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest_to_rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jared Beck
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-19 00:00:00.000000000 Z
11
+ date: 2015-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby_parser
@@ -168,6 +168,7 @@ files:
168
168
  - lib/minitest_to_rspec/exp/base.rb
169
169
  - lib/minitest_to_rspec/exp/call.rb
170
170
  - lib/minitest_to_rspec/exp/calls/returns.rb
171
+ - lib/minitest_to_rspec/exp/hash_exp.rb
171
172
  - lib/minitest_to_rspec/exp/iter.rb
172
173
  - lib/minitest_to_rspec/exp/klass.rb
173
174
  - lib/minitest_to_rspec/processor.rb