minitest_to_rspec 0.3.0 → 0.4.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: 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