minitest_to_rspec 0.6.2 → 0.7.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 +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +25 -15
- data/lib/minitest_to_rspec/cli.rb +25 -20
- data/lib/minitest_to_rspec/converter.rb +10 -7
- data/lib/minitest_to_rspec/{exp → model}/base.rb +1 -1
- data/lib/minitest_to_rspec/{exp → model}/call.rb +52 -5
- data/lib/minitest_to_rspec/{exp → model}/calls/once.rb +1 -1
- data/lib/minitest_to_rspec/{exp → model}/calls/returns.rb +31 -16
- data/lib/minitest_to_rspec/{exp → model}/calls/twice.rb +1 -1
- data/lib/minitest_to_rspec/{exp → model}/hash_exp.rb +1 -1
- data/lib/minitest_to_rspec/{exp → model}/iter.rb +9 -9
- data/lib/minitest_to_rspec/{exp → model}/klass.rb +1 -1
- data/lib/minitest_to_rspec/processor.rb +5 -4
- data/lib/minitest_to_rspec/subprocessors/base.rb +6 -1
- data/lib/minitest_to_rspec/subprocessors/call.rb +78 -27
- data/lib/minitest_to_rspec/subprocessors/iter.rb +5 -4
- data/lib/minitest_to_rspec/subprocessors/klass.rb +4 -4
- data/lib/minitest_to_rspec/version.rb +1 -1
- metadata +10 -10
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c5b86085638913b9300eac531234df1080da30f8
         | 
| 4 | 
            +
              data.tar.gz: 25716e1fa38dd1770ecf4d6af06d1ae17e83f9b8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5f77f05e827b8a7ccf6670bd10f3ff595199b19be8398035377c3efad2ded7f251b188a5ba0a0d443abc7d78debcfab986a17b001afc2b653a9ee7ee9d1a51ba
         | 
| 7 | 
            +
              data.tar.gz: 602e936f4681ccb800f950185d8fb970299531a5616346a72b7f2a49c80e21aedf8168aa1aff1f87e36e2eafee9c45a59e54919a8e2985178236e853d63d858e
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -4,6 +4,27 @@ 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.7.0
         | 
| 8 | 
            +
            -----
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            ### Changed
         | 
| 11 | 
            +
            - `assert` on a question-mark method converts to `eq(true)` instead
         | 
| 12 | 
            +
              of `be_truthy`. Likewise, `refute` converts to `eq(false)`. This is not
         | 
| 13 | 
            +
              guaranteed to be the same as minitest's fuzzy `assert`, but the convention of
         | 
| 14 | 
            +
              question-mark methods returning real booleans is strong.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            ### Added
         | 
| 17 | 
            +
            - Converts assert_not_nil
         | 
| 18 | 
            +
            - CLI
         | 
| 19 | 
            +
              - Added `--mocha` flag. If present, converts mocha to
         | 
| 20 | 
            +
                rspec-mocks. (Experimental)
         | 
| 21 | 
            +
              - Creates `target_file` directory if it does not exist
         | 
| 22 | 
            +
            - Experimental
         | 
| 23 | 
            +
              - mocha: with
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            ### Fixed
         | 
| 26 | 
            +
            - `__FILE__` keyword in input
         | 
| 27 | 
            +
             | 
| 7 28 | 
             
            0.6.2
         | 
| 8 29 | 
             
            -----
         | 
| 9 30 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -7,6 +7,7 @@ Converts [minitest][8] files to [rspec][9]. | |
| 7 7 | 
             
            - Selected assertions from [Test::Unit][26], [minitest][8],
         | 
| 8 8 | 
             
              and [ActiveSupport][27] are converted to [rspec-expectations][25].
         | 
| 9 9 | 
             
            - Selected methods from [mocha][28] are converted to [rspec-mocks][24].
         | 
| 10 | 
            +
              (Experimental)
         | 
| 10 11 |  | 
| 11 12 | 
             
            Example
         | 
| 12 13 | 
             
            -------
         | 
| @@ -28,26 +29,22 @@ end | |
| 28 29 | 
             
            Output:
         | 
| 29 30 |  | 
| 30 31 | 
             
            ```ruby
         | 
| 31 | 
            -
            require | 
| 32 | 
            -
            RSpec.describe | 
| 33 | 
            -
              it | 
| 32 | 
            +
            require "spec_helper"
         | 
| 33 | 
            +
            RSpec.describe Array do
         | 
| 34 | 
            +
              it "changes length" do
         | 
| 34 35 | 
             
                ary = []
         | 
| 35 | 
            -
                expect { ary.push(:x) }.to | 
| 36 | 
            +
                expect { ary.push(:x) }.to change { ary.length }
         | 
| 36 37 | 
             
              end
         | 
| 37 38 | 
             
            end
         | 
| 38 39 | 
             
            ```
         | 
| 39 40 |  | 
| 40 | 
            -
            The code style is whatever [ruby2ruby][6] feels like printing,
         | 
| 41 | 
            -
            and is not configurable.  Comments are discarded.
         | 
| 42 | 
            -
             | 
| 43 41 | 
             
            Usage
         | 
| 44 42 | 
             
            -----
         | 
| 45 43 |  | 
| 46 44 | 
             
            ### CLI
         | 
| 47 45 |  | 
| 48 46 | 
             
            ```bash
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            bundle exec mt2rspec [--rails] source_file [target_file]
         | 
| 47 | 
            +
            bundle exec mt2rspec [--rails] [--mocha] source_file [target_file]
         | 
| 51 48 | 
             
            bundle exec mt2rspec --help
         | 
| 52 49 | 
             
            ```
         | 
| 53 50 |  | 
| @@ -55,16 +52,28 @@ bundle exec mt2rspec --help | |
| 55 52 |  | 
| 56 53 | 
             
            ```ruby
         | 
| 57 54 | 
             
            require 'minitest_to_rspec'
         | 
| 58 | 
            -
            MinitestToRspec::Converter.new | 
| 55 | 
            +
            converter = MinitestToRspec::Converter.new(rails: false, mocha: false)
         | 
| 56 | 
            +
            converter.convert("assert('banana')")
         | 
| 59 57 | 
             
            #=> "expect(\"banana\").to(be_truthy)"
         | 
| 60 58 | 
             
            ```
         | 
| 61 59 |  | 
| 60 | 
            +
            Output
         | 
| 61 | 
            +
            ------
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            The primary goal is correctness, but [code style][34] is also important. To
         | 
| 64 | 
            +
            allow us to configure our output, we use [sexp2ruby][33] instead of
         | 
| 65 | 
            +
            [ruby2ruby][6]. As [sexp2ruby][33] adds more configuration options, we'll make
         | 
| 66 | 
            +
            use of them.
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            Comments are discarded by [ruby_parser][14], so we have no way of
         | 
| 69 | 
            +
            preserving them.
         | 
| 70 | 
            +
             | 
| 62 71 | 
             
            Supported Assertions
         | 
| 63 72 | 
             
            --------------------
         | 
| 64 73 |  | 
| 65 | 
            -
            Selected assertions from minitest, Test::Unit, and | 
| 66 | 
            -
            See [doc/supported_assertions.md][5] for rationale. | 
| 67 | 
            -
            are welcome.
         | 
| 74 | 
            +
            Selected assertions from [minitest][8], [Test::Unit][26], and
         | 
| 75 | 
            +
            [ActiveSupport][27]. See [doc/supported_assertions.md][5] for rationale.
         | 
| 76 | 
            +
            Contributions are welcome.
         | 
| 68 77 |  | 
| 69 78 | 
             
            Assertion                   | Arity | Source
         | 
| 70 79 | 
             
            --------------------------- | ----- | ------
         | 
| @@ -74,6 +83,7 @@ assert_difference           | 1,2   | | |
| 74 83 | 
             
            [assert_not_equal][22]      | 2,3   | Test::Unit
         | 
| 75 84 | 
             
            assert_match                |       |
         | 
| 76 85 | 
             
            assert_nil                  |       |
         | 
| 86 | 
            +
            assert_not_nil              |       |
         | 
| 77 87 | 
             
            [assert_no_difference][12]  |       | ActiveSupport
         | 
| 78 88 | 
             
            [assert_nothing_raised][10] |       | Test::Unit
         | 
| 79 89 | 
             
            [assert_raise][11]          | 0..2  | Test::Unit
         | 
| @@ -81,8 +91,6 @@ assert_nil                  |       | | |
| 81 91 | 
             
            refute                      |       |
         | 
| 82 92 | 
             
            refute_equal                |       |
         | 
| 83 93 |  | 
| 84 | 
            -
            To do: assert_not_nil
         | 
| 85 | 
            -
             | 
| 86 94 | 
             
            Supported Mocha
         | 
| 87 95 | 
             
            ---------------
         | 
| 88 96 |  | 
| @@ -136,3 +144,5 @@ This project would not be possible without [ruby_parser][14], | |
| 136 144 | 
             
            [30]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/Expectation
         | 
| 137 145 | 
             
            [31]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/Expectation#once-instance_method
         | 
| 138 146 | 
             
            [32]: http://www.rubydoc.info/github/floehopper/mocha/Mocha/Expectation#twice-instance_method
         | 
| 147 | 
            +
            [33]: https://github.com/jaredbeck/sexp2ruby
         | 
| 148 | 
            +
            [34]: https://github.com/bbatsov/ruby-style-guide
         | 
| @@ -1,3 +1,4 @@ | |
| 1 | 
            +
            require "fileutils"
         | 
| 1 2 | 
             
            require "minitest_to_rspec"
         | 
| 2 3 | 
             
            require "trollop"
         | 
| 3 4 |  | 
| @@ -7,34 +8,36 @@ module MinitestToRspec | |
| 7 8 | 
             
                E_FILE_NOT_FOUND      = 2.freeze
         | 
| 8 9 | 
             
                E_FILE_ALREADY_EXISTS = 3.freeze
         | 
| 9 10 | 
             
                E_CONVERT_FAIL        = 4.freeze
         | 
| 11 | 
            +
                E_CANNOT_CREATE_TARGET_DIR = 5.freeze
         | 
| 10 12 |  | 
| 11 13 | 
             
                BANNER = <<EOS.freeze
         | 
| 12 | 
            -
            Usage: mt2rspec --rails source_file [target_file]
         | 
| 14 | 
            +
            Usage: mt2rspec [--rails] [--mocha] source_file [target_file]
         | 
| 13 15 |  | 
| 14 | 
            -
            Reads source_file, writes target_file. | 
| 15 | 
            -
            its location will be inferred. | 
| 16 | 
            -
            implies spec/fruit/banana_spec.rb.
         | 
| 16 | 
            +
            Reads source_file, writes target_file. If target_file is omitted,
         | 
| 17 | 
            +
            its location will be inferred. For example, test/fruit/banana_test.rb
         | 
| 18 | 
            +
            implies spec/fruit/banana_spec.rb. If the target directory doesn't
         | 
| 19 | 
            +
            exist, it will be created.
         | 
| 17 20 |  | 
| 18 21 | 
             
            Options:
         | 
| 19 22 | 
             
            EOS
         | 
| 20 | 
            -
             | 
| 23 | 
            +
                OPT_MOCHA = "Convert mocha to rspec-mocks. (Experimental)"
         | 
| 21 24 | 
             
                OPT_RAILS = <<EOS.gsub(/\n/, " ").freeze
         | 
| 22 25 | 
             
            Requires rails_helper instead of spec_helper.
         | 
| 23 26 | 
             
            Passes :type metadatum to RSpec.describe.
         | 
| 24 27 | 
             
            EOS
         | 
| 25 28 |  | 
| 26 | 
            -
                attr_reader : | 
| 29 | 
            +
                attr_reader :source, :target
         | 
| 27 30 |  | 
| 28 31 | 
             
                def initialize(args)
         | 
| 29 | 
            -
                  assert_trollop_version
         | 
| 30 | 
            -
             | 
| 31 32 | 
             
                  opts = Trollop.options(args) do
         | 
| 32 33 | 
             
                    version MinitestToRspec::VERSION
         | 
| 33 34 | 
             
                    banner BANNER
         | 
| 34 35 | 
             
                    opt :rails, OPT_RAILS, short: :none
         | 
| 36 | 
            +
                    opt :mocha, OPT_MOCHA, short: :none
         | 
| 35 37 | 
             
                  end
         | 
| 36 38 |  | 
| 37 39 | 
             
                  @rails = opts[:rails]
         | 
| 40 | 
            +
                  @mocha = opts[:mocha]
         | 
| 38 41 | 
             
                  case args.length
         | 
| 39 42 | 
             
                  when 2
         | 
| 40 43 | 
             
                    @source, @target = args
         | 
| @@ -50,7 +53,8 @@ EOS | |
| 50 53 | 
             
                def run
         | 
| 51 54 | 
             
                  assert_file_exists(source)
         | 
| 52 55 | 
             
                  assert_file_does_not_exist(target)
         | 
| 53 | 
            -
                   | 
| 56 | 
            +
                  ensure_target_directory(target)
         | 
| 57 | 
            +
                  write_target(converter.convert(read_source, source))
         | 
| 54 58 | 
             
                rescue Error => e
         | 
| 55 59 | 
             
                  $stderr.puts "Failed to convert: #{e}"
         | 
| 56 60 | 
             
                  exit E_CONVERT_FAIL
         | 
| @@ -72,19 +76,20 @@ EOS | |
| 72 76 | 
             
                  end
         | 
| 73 77 | 
             
                end
         | 
| 74 78 |  | 
| 75 | 
            -
                 | 
| 76 | 
            -
             | 
| 77 | 
            -
                  unless Trollop.method(:die).arity == -2
         | 
| 78 | 
            -
                    warn "Please use trollop version f7009b45 or greater."
         | 
| 79 | 
            -
                    warn "This manual version constraint will be removed when"
         | 
| 80 | 
            -
                    warn "https://github.com/ManageIQ/trollop/pull/63"
         | 
| 81 | 
            -
                    warn "is included in an official trollop release."
         | 
| 82 | 
            -
                    exit(-1)
         | 
| 83 | 
            -
                  end
         | 
| 79 | 
            +
                def converter
         | 
| 80 | 
            +
                  Converter.new(mocha: @mocha, rails: @rails)
         | 
| 84 81 | 
             
                end
         | 
| 85 82 |  | 
| 86 | 
            -
                def  | 
| 87 | 
            -
                   | 
| 83 | 
            +
                def ensure_target_directory(target)
         | 
| 84 | 
            +
                  dir = File.dirname(target)
         | 
| 85 | 
            +
                  return if Dir.exist?(dir)
         | 
| 86 | 
            +
                  begin
         | 
| 87 | 
            +
                    FileUtils.mkdir_p(dir)
         | 
| 88 | 
            +
                  rescue SystemCallError => e
         | 
| 89 | 
            +
                    $stderr.puts "Cannot create target dir: #{dir}"
         | 
| 90 | 
            +
                    $stderr.puts e.message
         | 
| 91 | 
            +
                    exit E_CANNOT_CREATE_TARGET_DIR
         | 
| 92 | 
            +
                  end
         | 
| 88 93 | 
             
                end
         | 
| 89 94 |  | 
| 90 95 | 
             
                def infer_target_from(source)
         | 
| @@ -19,21 +19,24 @@ module MinitestToRspec | |
| 19 19 | 
             
                  to_not
         | 
| 20 20 | 
             
                ]
         | 
| 21 21 |  | 
| 22 | 
            -
                def initialize( | 
| 23 | 
            -
                  @ | 
| 24 | 
            -
                  @processor = Processor.new(@options[:rails])
         | 
| 22 | 
            +
                def initialize(rails: false, mocha: false)
         | 
| 23 | 
            +
                  @processor = Processor.new(rails, mocha)
         | 
| 25 24 | 
             
                end
         | 
| 26 25 |  | 
| 27 | 
            -
                 | 
| 28 | 
            -
             | 
| 26 | 
            +
                # - `input` - Contents of a ruby file.
         | 
| 27 | 
            +
                # - `file_path` - Optional. Value will replace any `__FILE__`
         | 
| 28 | 
            +
                #   keywords in the input.
         | 
| 29 | 
            +
                def convert(input, file_path = nil)
         | 
| 30 | 
            +
                  render process parse(input, file_path)
         | 
| 29 31 | 
             
                end
         | 
| 30 32 |  | 
| 31 33 | 
             
                private
         | 
| 32 34 |  | 
| 33 35 | 
             
                # Parses input string and returns Abstract Syntax Tree (AST)
         | 
| 34 36 | 
             
                # as an S-expression.
         | 
| 35 | 
            -
                def parse(input)
         | 
| 36 | 
            -
                   | 
| 37 | 
            +
                def parse(input, file_path)
         | 
| 38 | 
            +
                  file_path ||= "No file path provided to #{self.class}#convert"
         | 
| 39 | 
            +
                  RubyParser.new.parse(input, file_path)
         | 
| 37 40 | 
             
                end
         | 
| 38 41 |  | 
| 39 42 | 
             
                # Processes an AST (S-expressions) representing a minitest
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            require_relative "base"
         | 
| 2 2 |  | 
| 3 3 | 
             
            module MinitestToRspec
         | 
| 4 | 
            -
              module  | 
| 4 | 
            +
              module Model
         | 
| 5 5 |  | 
| 6 6 | 
             
                # Data object.  Represents a `:call` s-expression.
         | 
| 7 7 | 
             
                class Call < Base
         | 
| @@ -35,7 +35,7 @@ module MinitestToRspec | |
| 35 35 | 
             
                    end
         | 
| 36 36 |  | 
| 37 37 | 
             
                    def method_name?(exp, name)
         | 
| 38 | 
            -
                      exp.sexp_type == :call && new(exp).method_name == name
         | 
| 38 | 
            +
                      exp.sexp_type == :call && new(exp).method_name.to_s == name.to_s
         | 
| 39 39 | 
             
                    end
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 |  | 
| @@ -70,6 +70,13 @@ module MinitestToRspec | |
| 70 70 | 
             
                    method_name == :assert_raises && raise_error_args?
         | 
| 71 71 | 
             
                  end
         | 
| 72 72 |  | 
| 73 | 
            +
                  def calls_in_receiver_chain
         | 
| 74 | 
            +
                    receiver_chain.
         | 
| 75 | 
            +
                      compact.
         | 
| 76 | 
            +
                      select { |r| sexp_type?(:call, r) }.
         | 
| 77 | 
            +
                      map { |r| Call.new(r) }
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 73 80 | 
             
                  def method_name
         | 
| 74 81 | 
             
                    @exp[2]
         | 
| 75 82 | 
             
                  end
         | 
| @@ -95,14 +102,14 @@ module MinitestToRspec | |
| 95 102 | 
             
                  end
         | 
| 96 103 |  | 
| 97 104 | 
             
                  # While `#receiver` returns a `Sexp`, `#receiver_call`
         | 
| 98 | 
            -
                  # returns a ` | 
| 105 | 
            +
                  # returns a `Model::Call`.
         | 
| 99 106 | 
             
                  def receiver_call
         | 
| 100 107 | 
             
                    if sexp_type?(:call, receiver)
         | 
| 101 | 
            -
                      rvc =  | 
| 108 | 
            +
                      rvc = Model::Call.new(receiver)
         | 
| 102 109 |  | 
| 103 110 | 
             
                      # TODO: Seems like a factory pattern
         | 
| 104 111 | 
             
                      if rvc.method_name == :returns
         | 
| 105 | 
            -
                         | 
| 112 | 
            +
                        Model::Calls::Returns.new(receiver)
         | 
| 106 113 | 
             
                      else
         | 
| 107 114 | 
             
                        rvc
         | 
| 108 115 | 
             
                      end
         | 
| @@ -111,12 +118,52 @@ module MinitestToRspec | |
| 111 118 | 
             
                    end
         | 
| 112 119 | 
             
                  end
         | 
| 113 120 |  | 
| 121 | 
            +
                  # Consider the following chain of method calls:
         | 
| 122 | 
            +
                  #
         | 
| 123 | 
            +
                  #     @a.b.c
         | 
| 124 | 
            +
                  #
         | 
| 125 | 
            +
                  # whose S-expression is
         | 
| 126 | 
            +
                  #
         | 
| 127 | 
            +
                  #     s(:call, s(:call, s(:call, nil, :a), :b), :c)
         | 
| 128 | 
            +
                  #
         | 
| 129 | 
            +
                  # the "receiver chain" is
         | 
| 130 | 
            +
                  #
         | 
| 131 | 
            +
                  #     [
         | 
| 132 | 
            +
                  #       s(:call, s(:call, nil, :a), :b),
         | 
| 133 | 
            +
                  #       s(:call, nil, :a),
         | 
| 134 | 
            +
                  #       nil
         | 
| 135 | 
            +
                  #     ]
         | 
| 136 | 
            +
                  #
         | 
| 137 | 
            +
                  # The order of the returned array matches the order in which
         | 
| 138 | 
            +
                  # messages are received, i.e. the order of execution.
         | 
| 139 | 
            +
                  #
         | 
| 140 | 
            +
                  # Note that the final receiver `nil` is included. This `nil`
         | 
| 141 | 
            +
                  # represents the implicit receiver, e.g. `self` or `main`.
         | 
| 142 | 
            +
                  #
         | 
| 143 | 
            +
                  def receiver_chain
         | 
| 144 | 
            +
                    receivers = []
         | 
| 145 | 
            +
                    ptr = @exp
         | 
| 146 | 
            +
                    while sexp_type?(:call, ptr)
         | 
| 147 | 
            +
                      receivers << ptr[1]
         | 
| 148 | 
            +
                      ptr = ptr[1]
         | 
| 149 | 
            +
                    end
         | 
| 150 | 
            +
                    receivers
         | 
| 151 | 
            +
                  end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                  def receiver_chain_include?(method_name)
         | 
| 154 | 
            +
                    receiver_chain.compact.any? { |r| Call.method_name?(r, method_name) }
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
             | 
| 114 157 | 
             
                  def require_test_helper?
         | 
| 115 158 | 
             
                    method_name == :require &&
         | 
| 116 159 | 
             
                      one_string_argument? &&
         | 
| 117 160 | 
             
                      arguments[0][1] == "test_helper"
         | 
| 118 161 | 
             
                  end
         | 
| 119 162 |  | 
| 163 | 
            +
                  def question_mark_method?
         | 
| 164 | 
            +
                    method_name.to_s.end_with?("?")
         | 
| 165 | 
            +
                  end
         | 
| 166 | 
            +
             | 
| 120 167 | 
             
                  private
         | 
| 121 168 |  | 
| 122 169 | 
             
                  def string?(exp)
         | 
| @@ -2,32 +2,29 @@ require_relative "../call" | |
| 2 2 | 
             
            require_relative "../../errors"
         | 
| 3 3 |  | 
| 4 4 | 
             
            module MinitestToRspec
         | 
| 5 | 
            -
              module  | 
| 5 | 
            +
              module Model
         | 
| 6 6 | 
             
                module Calls
         | 
| 7 7 |  | 
| 8 8 | 
             
                  # Represents a call to `returns`, the stubbing method
         | 
| 9 9 | 
             
                  # from `mocha`.
         | 
| 10 10 | 
             
                  class Returns < Call
         | 
| 11 | 
            -
                    KNOWN_RECEIVERS = %i[stubs expects]
         | 
| 12 | 
            -
                    RSPEC_MOCK_METHODS = { expects: :expect, stubs: :allow }
         | 
| 11 | 
            +
                    KNOWN_RECEIVERS = %i[stubs expects with]
         | 
| 13 12 |  | 
| 14 13 | 
             
                    def initialize(exp)
         | 
| 15 14 | 
             
                      @exp = exp
         | 
| 16 15 | 
             
                      raise UnknownVariant unless known_variant?
         | 
| 17 16 | 
             
                    end
         | 
| 18 17 |  | 
| 18 | 
            +
                    def stub?
         | 
| 19 | 
            +
                      receiver_chain_include?(:stubs)
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
             | 
| 19 22 | 
             
                    def any_instance?
         | 
| 20 | 
            -
                       | 
| 21 | 
            -
                      if !rcr.nil? && sexp_type?(:call, rcr)
         | 
| 22 | 
            -
                        Call.new(rcr).method_name == :any_instance
         | 
| 23 | 
            -
                      else
         | 
| 24 | 
            -
                        false
         | 
| 25 | 
            -
                      end
         | 
| 23 | 
            +
                      receiver_chain_include?(:any_instance)
         | 
| 26 24 | 
             
                    end
         | 
| 27 25 |  | 
| 28 | 
            -
                     | 
| 29 | 
            -
             | 
| 30 | 
            -
                      receiver_call.receiver
         | 
| 26 | 
            +
                    def expectation?
         | 
| 27 | 
            +
                      receiver_chain_include?(:expects)
         | 
| 31 28 | 
             
                    end
         | 
| 32 29 |  | 
| 33 30 | 
             
                    def known_variant?
         | 
| @@ -40,13 +37,25 @@ module MinitestToRspec | |
| 40 37 | 
             
                    end
         | 
| 41 38 |  | 
| 42 39 | 
             
                    def message
         | 
| 43 | 
            -
                       | 
| 40 | 
            +
                      calls_in_receiver_chain.
         | 
| 41 | 
            +
                        find { |c| [:stubs, :expects].include? c.method_name }.
         | 
| 42 | 
            +
                        arguments[0]
         | 
| 44 43 | 
             
                    end
         | 
| 45 44 |  | 
| 46 45 | 
             
                    # To avoid a `ProcessingError` please check `known_variant?`
         | 
| 47 46 | 
             
                    # before calling `rspec_mocks_method`.
         | 
| 48 47 | 
             
                    def rspec_mocks_method
         | 
| 49 | 
            -
                       | 
| 48 | 
            +
                      s = stub?
         | 
| 49 | 
            +
                      e = expectation?
         | 
| 50 | 
            +
                      if s && e
         | 
| 51 | 
            +
                        raise ProcessingError, "Method chain contains stubs and expects"
         | 
| 52 | 
            +
                      elsif s
         | 
| 53 | 
            +
                        :allow
         | 
| 54 | 
            +
                      elsif e
         | 
| 55 | 
            +
                        :expect
         | 
| 56 | 
            +
                      else
         | 
| 57 | 
            +
                        raise ProcessingError, "Found returns without stubs or expects"
         | 
| 58 | 
            +
                      end
         | 
| 50 59 | 
             
                    end
         | 
| 51 60 |  | 
| 52 61 | 
             
                    # Returns `Sexp` representing the object that will receive
         | 
| @@ -55,16 +64,22 @@ module MinitestToRspec | |
| 55 64 | 
             
                    #     banana.stubs(:delicious?).returns(true)
         | 
| 56 65 | 
             
                    #     Kiwi.any_instance.stubs(:delicious?).returns(false)
         | 
| 57 66 | 
             
                    #
         | 
| 58 | 
            -
                    #  | 
| 67 | 
            +
                    # On the first line, the `rspec_msg_recipient` is `banana`. On the
         | 
| 68 | 
            +
                    # second, `Kiwi`.
         | 
| 59 69 | 
             
                    #
         | 
| 60 70 | 
             
                    def rspec_msg_recipient
         | 
| 61 | 
            -
                       | 
| 71 | 
            +
                      receiver_chain.compact.last
         | 
| 62 72 | 
             
                    end
         | 
| 63 73 |  | 
| 64 74 | 
             
                    # The return values
         | 
| 65 75 | 
             
                    def values
         | 
| 66 76 | 
             
                      arguments
         | 
| 67 77 | 
             
                    end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    def with
         | 
| 80 | 
            +
                      w = calls_in_receiver_chain.find { |c| c.method_name == :with }
         | 
| 81 | 
            +
                      w.nil? ? [] : w.arguments
         | 
| 82 | 
            +
                    end
         | 
| 68 83 | 
             
                  end
         | 
| 69 84 | 
             
                end
         | 
| 70 85 | 
             
              end
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            require_relative "base"
         | 
| 2 2 |  | 
| 3 3 | 
             
            module MinitestToRspec
         | 
| 4 | 
            -
              module  | 
| 4 | 
            +
              module Model
         | 
| 5 5 |  | 
| 6 6 | 
             
                # Data object.  Represents an `:iter` s-expression.
         | 
| 7 7 | 
             
                class Iter < Base
         | 
| @@ -15,23 +15,23 @@ module MinitestToRspec | |
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 17 | 
             
                  def assert_difference?
         | 
| 18 | 
            -
                    !empty? &&  | 
| 18 | 
            +
                    !empty? && Model::Call.assert_difference?(@exp[1])
         | 
| 19 19 | 
             
                  end
         | 
| 20 20 |  | 
| 21 21 | 
             
                  def assert_no_difference?
         | 
| 22 | 
            -
                    !empty? &&  | 
| 22 | 
            +
                    !empty? && Model::Call.assert_no_difference?(@exp[1])
         | 
| 23 23 | 
             
                  end
         | 
| 24 24 |  | 
| 25 25 | 
             
                  def assert_nothing_raised?
         | 
| 26 | 
            -
                    !empty? &&  | 
| 26 | 
            +
                    !empty? && Model::Call.assert_nothing_raised?(@exp[1])
         | 
| 27 27 | 
             
                  end
         | 
| 28 28 |  | 
| 29 29 | 
             
                  def assert_raise?
         | 
| 30 | 
            -
                    !empty? &&  | 
| 30 | 
            +
                    !empty? && Model::Call.assert_raise?(@exp[1])
         | 
| 31 31 | 
             
                  end
         | 
| 32 32 |  | 
| 33 33 | 
             
                  def assert_raises?
         | 
| 34 | 
            -
                    !empty? &&  | 
| 34 | 
            +
                    !empty? && Model::Call.assert_raises?(@exp[1])
         | 
| 35 35 | 
             
                  end
         | 
| 36 36 |  | 
| 37 37 | 
             
                  def block
         | 
| @@ -48,7 +48,7 @@ module MinitestToRspec | |
| 48 48 | 
             
                  end
         | 
| 49 49 |  | 
| 50 50 | 
             
                  def call_obj
         | 
| 51 | 
            -
                     | 
| 51 | 
            +
                    Model::Call.new(call)
         | 
| 52 52 | 
             
                  end
         | 
| 53 53 |  | 
| 54 54 | 
             
                  # Enumerates children, skipping the base `call` and
         | 
| @@ -63,11 +63,11 @@ module MinitestToRspec | |
| 63 63 | 
             
                  end
         | 
| 64 64 |  | 
| 65 65 | 
             
                  def setup?
         | 
| 66 | 
            -
                    !empty? &&  | 
| 66 | 
            +
                    !empty? && Model::Call.method_name?(@exp[1], :setup)
         | 
| 67 67 | 
             
                  end
         | 
| 68 68 |  | 
| 69 69 | 
             
                  def teardown?
         | 
| 70 | 
            -
                    !empty? &&  | 
| 70 | 
            +
                    !empty? && Model::Call.method_name?(@exp[1], :teardown)
         | 
| 71 71 | 
             
                  end
         | 
| 72 72 |  | 
| 73 73 | 
             
                  def sexp
         | 
| @@ -6,22 +6,23 @@ require_relative "subprocessors/iter" | |
| 6 6 |  | 
| 7 7 | 
             
            module MinitestToRspec
         | 
| 8 8 | 
             
              class Processor < SexpProcessor
         | 
| 9 | 
            -
                def initialize(rails)
         | 
| 9 | 
            +
                def initialize(rails, mocha)
         | 
| 10 10 | 
             
                  super()
         | 
| 11 11 | 
             
                  self.strict = false
         | 
| 12 | 
            +
                  @mocha = mocha
         | 
| 12 13 | 
             
                  @rails = rails
         | 
| 13 14 | 
             
                end
         | 
| 14 15 |  | 
| 15 16 | 
             
                def process_call(exp)
         | 
| 16 | 
            -
                  Subprocessors::Call.new(exp, @rails).process
         | 
| 17 | 
            +
                  Subprocessors::Call.new(exp, @rails, @mocha).process
         | 
| 17 18 | 
             
                end
         | 
| 18 19 |  | 
| 19 20 | 
             
                def process_class(exp)
         | 
| 20 | 
            -
                  Subprocessors::Klass.new(exp, @rails).process
         | 
| 21 | 
            +
                  Subprocessors::Klass.new(exp, @rails, @mocha).process
         | 
| 21 22 | 
             
                end
         | 
| 22 23 |  | 
| 23 24 | 
             
                def process_iter(exp)
         | 
| 24 | 
            -
                  Subprocessors::Iter.new(exp).process
         | 
| 25 | 
            +
                  Subprocessors::Iter.new(exp, @rails, @mocha).process
         | 
| 25 26 | 
             
                end
         | 
| 26 27 | 
             
              end
         | 
| 27 28 | 
             
            end
         | 
| @@ -5,6 +5,11 @@ module MinitestToRspec | |
| 5 5 | 
             
                class Base
         | 
| 6 6 | 
             
                  include SexpAssertions
         | 
| 7 7 |  | 
| 8 | 
            +
                  def initialize(rails, mocha)
         | 
| 9 | 
            +
                    @rails = rails
         | 
| 10 | 
            +
                    @mocha = mocha
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 8 13 | 
             
                  # Returns a s-expression representing an rspec-mocks stub.
         | 
| 9 14 | 
             
                  def allow_to(msg_recipient, matcher, any_instance = false)
         | 
| 10 15 | 
             
                    allow_method = any_instance ? :allow_any_instance_of : :allow
         | 
| @@ -64,7 +69,7 @@ module MinitestToRspec | |
| 64 69 | 
             
                  #
         | 
| 65 70 | 
             
                  # TODO: `full_process` may not be the best name.
         | 
| 66 71 | 
             
                  def full_process(obj)
         | 
| 67 | 
            -
                    obj.is_a?(Sexp) ? Processor.new( | 
| 72 | 
            +
                    obj.is_a?(Sexp) ? Processor.new(@rails, @mocha).process(obj) : obj
         | 
| 68 73 | 
             
                  end
         | 
| 69 74 |  | 
| 70 75 | 
             
                  def matcher(name, *args)
         | 
| @@ -1,34 +1,57 @@ | |
| 1 | 
            -
            require_relative "../ | 
| 2 | 
            -
            require_relative "../ | 
| 3 | 
            -
            require_relative "../ | 
| 1 | 
            +
            require_relative "../model/call"
         | 
| 2 | 
            +
            require_relative "../model/calls/returns"
         | 
| 3 | 
            +
            require_relative "../model/hash_exp"
         | 
| 4 4 | 
             
            require_relative "base"
         | 
| 5 5 |  | 
| 6 6 | 
             
            module MinitestToRspec
         | 
| 7 7 | 
             
              module Subprocessors
         | 
| 8 8 | 
             
                class Call < Base
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 9 | 
            +
             | 
| 10 | 
            +
                  # Mocha methods will only be processed if `--mocha` flag was given,
         | 
| 11 | 
            +
                  # i.e. `mocha` argument in constructor is true.
         | 
| 12 | 
            +
                  MOCHA_METHODS = %i[
         | 
| 13 | 
            +
                    expects
         | 
| 14 | 
            +
                    once
         | 
| 15 | 
            +
                    returns
         | 
| 16 | 
            +
                    stub
         | 
| 17 | 
            +
                    stubs
         | 
| 18 | 
            +
                    stub_everything
         | 
| 19 | 
            +
                    twice
         | 
| 20 | 
            +
                  ]
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def initialize(sexp, rails, mocha)
         | 
| 23 | 
            +
                    super(rails, mocha)
         | 
| 24 | 
            +
                    @exp = Model::Call.new(sexp)
         | 
| 11 25 | 
             
                    sexp.clear
         | 
| 12 | 
            -
                    @rails = rails
         | 
| 13 26 | 
             
                  end
         | 
| 14 27 |  | 
| 15 | 
            -
                  # Given a ` | 
| 28 | 
            +
                  # Given a `Model::Call`, returns a `Sexp`
         | 
| 16 29 | 
             
                  def process
         | 
| 17 | 
            -
                    if  | 
| 30 | 
            +
                    if process?
         | 
| 18 31 | 
             
                      send(name_of_processing_method)
         | 
| 19 32 | 
             
                    else
         | 
| 20 33 | 
             
                      @exp.original
         | 
| 21 34 | 
             
                    end
         | 
| 22 35 | 
             
                  end
         | 
| 23 36 |  | 
| 37 | 
            +
                  def process?
         | 
| 38 | 
            +
                    respond_to?(name_of_processing_method, true) &&
         | 
| 39 | 
            +
                      (@mocha || !MOCHA_METHODS.include?(@exp.method_name))
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 24 42 | 
             
                  private
         | 
| 25 43 |  | 
| 26 44 | 
             
                  # - msg_rcp.  Message recipient.  The object to be stubbed.
         | 
| 27 45 | 
             
                  # - msg.  Message.  The name of the stubbed method.
         | 
| 28 46 | 
             
                  # - ret_vals.  Return values.
         | 
| 29 47 | 
             
                  # - any_ins.  Any instance?  True if this is an `any_instance` stub.
         | 
| 30 | 
            -
                   | 
| 31 | 
            -
             | 
| 48 | 
            +
                  # - with. Allowed arguments.
         | 
| 49 | 
            +
                  def allow_receive_and_return(msg_rcp, msg, ret_vals, any_ins, with)
         | 
| 50 | 
            +
                    allow_to(
         | 
| 51 | 
            +
                      msg_rcp,
         | 
| 52 | 
            +
                      receive_and_return(msg, ret_vals, with),
         | 
| 53 | 
            +
                      any_ins
         | 
| 54 | 
            +
                    )
         | 
| 32 55 | 
             
                  end
         | 
| 33 56 |  | 
| 34 57 | 
             
                  # Given `exp`, an S-expression representing an rspec-mocks statement
         | 
| @@ -52,6 +75,10 @@ module MinitestToRspec | |
| 52 75 | 
             
                    matcher(:be_truthy)
         | 
| 53 76 | 
             
                  end
         | 
| 54 77 |  | 
| 78 | 
            +
                  def call_to_question_mark?(exp)
         | 
| 79 | 
            +
                    sexp_type?(:call, exp) && Model::Call.new(exp).question_mark_method?
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
             | 
| 55 82 | 
             
                  def eq(exp)
         | 
| 56 83 | 
             
                    matcher(:eq, exp)
         | 
| 57 84 | 
             
                  end
         | 
| @@ -60,17 +87,23 @@ module MinitestToRspec | |
| 60 87 | 
             
                  # - msg.  Message.  The name of the stubbed method.
         | 
| 61 88 | 
             
                  # - ret_vals.  Return values.
         | 
| 62 89 | 
             
                  # - any_ins.  Any instance?  True if this is an `any_instance` stub.
         | 
| 63 | 
            -
                   | 
| 64 | 
            -
             | 
| 90 | 
            +
                  # - with. Allowed arguments.
         | 
| 91 | 
            +
                  def expect_receive_and_return(msg_rcp, msg, ret_vals, any_ins, with)
         | 
| 92 | 
            +
                    expect_to(
         | 
| 93 | 
            +
                      receive_and_return(msg, ret_vals, with),
         | 
| 94 | 
            +
                      msg_rcp,
         | 
| 95 | 
            +
                      true,
         | 
| 96 | 
            +
                      any_ins
         | 
| 97 | 
            +
                    )
         | 
| 65 98 | 
             
                  end
         | 
| 66 99 |  | 
| 67 100 | 
             
                  # Given a `Sexp` representing a `Hash` of message expectations,
         | 
| 68 101 | 
             
                  # return an array of `Sexp`, each representing an expectation
         | 
| 69 102 | 
             
                  # in rspec-mocks syntax.
         | 
| 70 103 | 
             
                  def hash_to_expectations(sexp, receiver)
         | 
| 71 | 
            -
                     | 
| 104 | 
            +
                    Model::HashExp.new(sexp).to_h.map { |msg, ret_val|
         | 
| 72 105 | 
             
                      expect_receive_and_return(
         | 
| 73 | 
            -
                        receiver.deep_clone, msg, wrap_sexp(ret_val)
         | 
| 106 | 
            +
                        receiver.deep_clone, msg, wrap_sexp(ret_val), false, []
         | 
| 74 107 | 
             
                      )
         | 
| 75 108 | 
             
                    }
         | 
| 76 109 | 
             
                  end
         | 
| @@ -80,7 +113,7 @@ module MinitestToRspec | |
| 80 113 | 
             
                  end
         | 
| 81 114 |  | 
| 82 115 | 
             
                  def method_assert
         | 
| 83 | 
            -
                     | 
| 116 | 
            +
                    refsert eq(s(:true)), be_truthy
         | 
| 84 117 | 
             
                  end
         | 
| 85 118 |  | 
| 86 119 | 
             
                  def method_assert_equal
         | 
| @@ -99,6 +132,10 @@ module MinitestToRspec | |
| 99 132 | 
             
                    expect_to(be_nil, @exp.arguments[0], true)
         | 
| 100 133 | 
             
                  end
         | 
| 101 134 |  | 
| 135 | 
            +
                  def method_assert_not_nil
         | 
| 136 | 
            +
                    expect_to_not(be_nil, @exp.arguments[0], true)
         | 
| 137 | 
            +
                  end
         | 
| 138 | 
            +
             | 
| 102 139 | 
             
                  def method_assert_not_equal
         | 
| 103 140 | 
             
                    expected = @exp.arguments[0]
         | 
| 104 141 | 
             
                    calculated = @exp.arguments[1]
         | 
| @@ -118,7 +155,7 @@ module MinitestToRspec | |
| 118 155 | 
             
                  end
         | 
| 119 156 |  | 
| 120 157 | 
             
                  def method_refute
         | 
| 121 | 
            -
                     | 
| 158 | 
            +
                    refsert eq(s(:false)), be_falsey
         | 
| 122 159 | 
             
                  end
         | 
| 123 160 |  | 
| 124 161 | 
             
                  def method_refute_equal
         | 
| @@ -128,7 +165,7 @@ module MinitestToRspec | |
| 128 165 | 
             
                  end
         | 
| 129 166 |  | 
| 130 167 | 
             
                  def method_returns
         | 
| 131 | 
            -
                    mocha_returns( | 
| 168 | 
            +
                    mocha_returns(Model::Calls::Returns.new(@exp.original))
         | 
| 132 169 | 
             
                  rescue UnknownVariant
         | 
| 133 170 | 
             
                    @exp.original
         | 
| 134 171 | 
             
                  end
         | 
| @@ -176,7 +213,7 @@ module MinitestToRspec | |
| 176 213 | 
             
                  end
         | 
| 177 214 |  | 
| 178 215 | 
             
                  def mocha_expects(exp)
         | 
| 179 | 
            -
                    raise ArgumentError unless exp.is_a?( | 
| 216 | 
            +
                    raise ArgumentError unless exp.is_a?(Model::Call)
         | 
| 180 217 | 
             
                    arg = exp.arguments.first
         | 
| 181 218 | 
             
                    if sexp_type?(:hash, arg)
         | 
| 182 219 | 
             
                      mocha_expects_hash(exp, arg)
         | 
| @@ -198,7 +235,7 @@ module MinitestToRspec | |
| 198 235 | 
             
                  end
         | 
| 199 236 |  | 
| 200 237 | 
             
                  def mocha_expectation_count(exp, ordinal)
         | 
| 201 | 
            -
                    raise ArgumentError unless exp.is_a?( | 
| 238 | 
            +
                    raise ArgumentError unless exp.is_a?(Model::Call)
         | 
| 202 239 | 
             
                    raise ArgumentError unless %i[once twice].include?(ordinal)
         | 
| 203 240 | 
             
                    rvc = exp.receiver_call
         | 
| 204 241 | 
             
                    receiver_processing_method = "mocha_#{rvc.method_name}".to_sym
         | 
| @@ -214,21 +251,22 @@ module MinitestToRspec | |
| 214 251 | 
             
                    mocha_expectation_count(exp, :once)
         | 
| 215 252 | 
             
                  end
         | 
| 216 253 |  | 
| 217 | 
            -
                  # Given `r`, a ` | 
| 254 | 
            +
                  # Given `r`, a `Model::Calls::Returns`, return a `Sexp` representing
         | 
| 218 255 | 
             
                  # the equivalent stub or message expectation in RSpec.
         | 
| 219 256 | 
             
                  def mocha_returns(r)
         | 
| 220 | 
            -
                    raise ArgumentError unless r.is_a?( | 
| 257 | 
            +
                    raise ArgumentError unless r.is_a?(Model::Calls::Returns)
         | 
| 221 258 | 
             
                    subprocessor_method = "#{r.rspec_mocks_method}_receive_and_return"
         | 
| 222 259 | 
             
                    send(subprocessor_method,
         | 
| 223 260 | 
             
                      r.rspec_msg_recipient,
         | 
| 224 261 | 
             
                      r.message,
         | 
| 225 262 | 
             
                      r.values,
         | 
| 226 | 
            -
                      r.any_instance | 
| 263 | 
            +
                      r.any_instance?,
         | 
| 264 | 
            +
                      r.with
         | 
| 227 265 | 
             
                    )
         | 
| 228 266 | 
             
                  end
         | 
| 229 267 |  | 
| 230 268 | 
             
                  def mocha_stub(exp)
         | 
| 231 | 
            -
                    raise ArgumentError unless exp.is_a?( | 
| 269 | 
            +
                    raise ArgumentError unless exp.is_a?(Model::Call)
         | 
| 232 270 | 
             
                    if exp.receiver.nil?
         | 
| 233 271 | 
             
                      s(:call, nil, :double, *exp.arguments)
         | 
| 234 272 | 
             
                    else
         | 
| @@ -275,16 +313,29 @@ module MinitestToRspec | |
| 275 313 | 
             
                    )
         | 
| 276 314 | 
             
                  end
         | 
| 277 315 |  | 
| 278 | 
            -
                  def receive(message)
         | 
| 279 | 
            -
                    s(:call, nil, :receive, message)
         | 
| 316 | 
            +
                  def receive(message, with = [])
         | 
| 317 | 
            +
                    r = s(:call, nil, :receive, message)
         | 
| 318 | 
            +
                    if with.empty?
         | 
| 319 | 
            +
                      r
         | 
| 320 | 
            +
                    else
         | 
| 321 | 
            +
                      s(:call, r, :with, *with)
         | 
| 322 | 
            +
                    end
         | 
| 280 323 | 
             
                  end
         | 
| 281 324 |  | 
| 282 325 | 
             
                  def receive_and_call_original(message)
         | 
| 283 326 | 
             
                    s(:call, s(:call, nil, :receive, message), :and_call_original)
         | 
| 284 327 | 
             
                  end
         | 
| 285 328 |  | 
| 286 | 
            -
                  def receive_and_return(message, return_values)
         | 
| 287 | 
            -
                    s(:call, receive(message), :and_return, *return_values)
         | 
| 329 | 
            +
                  def receive_and_return(message, return_values, with = [])
         | 
| 330 | 
            +
                    s(:call, receive(message, with), :and_return, *return_values)
         | 
| 331 | 
            +
                  end
         | 
| 332 | 
            +
             | 
| 333 | 
            +
                  # `refsert` - Code shared by refute and assert. I could also have gone
         | 
| 334 | 
            +
                  # with `assfute`. Wooo .. time for bed.
         | 
| 335 | 
            +
                  def refsert(exact, fuzzy)
         | 
| 336 | 
            +
                    actual = @exp.arguments[0]
         | 
| 337 | 
            +
                    matcher = call_to_question_mark?(actual) ? exact : fuzzy
         | 
| 338 | 
            +
                    expect_to(matcher, actual, true)
         | 
| 288 339 | 
             
                  end
         | 
| 289 340 |  | 
| 290 341 | 
             
                  def require_spec_helper
         | 
| @@ -1,11 +1,12 @@ | |
| 1 1 | 
             
            require_relative "base"
         | 
| 2 | 
            -
            require_relative "../ | 
| 2 | 
            +
            require_relative "../model/iter"
         | 
| 3 3 |  | 
| 4 4 | 
             
            module MinitestToRspec
         | 
| 5 5 | 
             
              module Subprocessors
         | 
| 6 6 | 
             
                class Iter < Base
         | 
| 7 | 
            -
                  def initialize(sexp)
         | 
| 8 | 
            -
                     | 
| 7 | 
            +
                  def initialize(sexp, rails, mocha)
         | 
| 8 | 
            +
                    super(rails, mocha)
         | 
| 9 | 
            +
                    @exp = Model::Iter.new(sexp)
         | 
| 9 10 | 
             
                    sexp.clear
         | 
| 10 11 | 
             
                  end
         | 
| 11 12 |  | 
| @@ -84,7 +85,7 @@ module MinitestToRspec | |
| 84 85 | 
             
                    RubyParser.new.parse(str)
         | 
| 85 86 | 
             
                  end
         | 
| 86 87 |  | 
| 87 | 
            -
                  # Given a ` | 
| 88 | 
            +
                  # Given a `Model::Iter`, returns a `Sexp`
         | 
| 88 89 | 
             
                  def process_exp(exp)
         | 
| 89 90 | 
             
                    if processable?(exp)
         | 
| 90 91 | 
             
                      send_to_processing_method(exp)
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            require_relative "../errors"
         | 
| 2 | 
            -
            require_relative "../ | 
| 2 | 
            +
            require_relative "../model/klass"
         | 
| 3 3 | 
             
            require_relative "base"
         | 
| 4 4 |  | 
| 5 5 | 
             
            module MinitestToRspec
         | 
| @@ -9,10 +9,10 @@ module MinitestToRspec | |
| 9 9 | 
             
                  # Takes `sexp`, a `:class` s-expression, and `rails`, a
         | 
| 10 10 | 
             
                  # boolean indicating that `rspec-rails` conventions (like
         | 
| 11 11 | 
             
                  # `:type` metadata) should be used.
         | 
| 12 | 
            -
                  def initialize(sexp, rails)
         | 
| 13 | 
            -
                     | 
| 12 | 
            +
                  def initialize(sexp, rails, mocha)
         | 
| 13 | 
            +
                    super(rails, mocha)
         | 
| 14 | 
            +
                    @exp = Model::Klass.new(sexp)
         | 
| 14 15 | 
             
                    sexp.clear
         | 
| 15 | 
            -
                    @rails = rails
         | 
| 16 16 | 
             
                  end
         | 
| 17 17 |  | 
| 18 18 | 
             
                  def process
         | 
    
        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. | 
| 4 | 
            +
              version: 0.7.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- | 
| 11 | 
            +
            date: 2015-07-19 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: ruby_parser
         | 
| @@ -180,14 +180,14 @@ files: | |
| 180 180 | 
             
            - lib/minitest_to_rspec/cli.rb
         | 
| 181 181 | 
             
            - lib/minitest_to_rspec/converter.rb
         | 
| 182 182 | 
             
            - lib/minitest_to_rspec/errors.rb
         | 
| 183 | 
            -
            - lib/minitest_to_rspec/ | 
| 184 | 
            -
            - lib/minitest_to_rspec/ | 
| 185 | 
            -
            - lib/minitest_to_rspec/ | 
| 186 | 
            -
            - lib/minitest_to_rspec/ | 
| 187 | 
            -
            - lib/minitest_to_rspec/ | 
| 188 | 
            -
            - lib/minitest_to_rspec/ | 
| 189 | 
            -
            - lib/minitest_to_rspec/ | 
| 190 | 
            -
            - lib/minitest_to_rspec/ | 
| 183 | 
            +
            - lib/minitest_to_rspec/model/base.rb
         | 
| 184 | 
            +
            - lib/minitest_to_rspec/model/call.rb
         | 
| 185 | 
            +
            - lib/minitest_to_rspec/model/calls/once.rb
         | 
| 186 | 
            +
            - lib/minitest_to_rspec/model/calls/returns.rb
         | 
| 187 | 
            +
            - lib/minitest_to_rspec/model/calls/twice.rb
         | 
| 188 | 
            +
            - lib/minitest_to_rspec/model/hash_exp.rb
         | 
| 189 | 
            +
            - lib/minitest_to_rspec/model/iter.rb
         | 
| 190 | 
            +
            - lib/minitest_to_rspec/model/klass.rb
         | 
| 191 191 | 
             
            - lib/minitest_to_rspec/processor.rb
         | 
| 192 192 | 
             
            - lib/minitest_to_rspec/sexp_assertions.rb
         | 
| 193 193 | 
             
            - lib/minitest_to_rspec/subprocessors/base.rb
         |