minitest_to_rspec 0.4.0 → 0.5.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: 7a27f05346fd70cc99e4153026b9fbbfec34c534
4
- data.tar.gz: 56cb0bab1016ecde051d2fcb92f6142d2009c063
3
+ metadata.gz: f7af6cefcb0786c8e45326f8620a786ad8f2fe89
4
+ data.tar.gz: 67ca2d184a2ea2b98dda827c70e3a5fbaf44dfbe
5
5
  SHA512:
6
- metadata.gz: f17804b35926a1820f7f521b421bf27a6840afa78a7c6fef1e3ceb97523b19d451ea749b7af3445904448f0a76d805faba95291a49b4b44251486ad0707dbe95
7
- data.tar.gz: aee5ab8d4f585ac6a3798002400072278e0abf3b1d28a90fb6dcaf599424308b6d9d5907e75ef02b247f416827281fe7c713d6661a76395aa700d9482bde8870
6
+ metadata.gz: 71242e74b6d2c4801191aa11e85214c8ab28b2390e265a9b043c22b64fa05a9ff2e238164c601081a6c89a347e1ae8b840e27541d495fc81f132527f6820c613
7
+ data.tar.gz: d86f72884d87dba2b95b07132ab0e1a20ce463a4723056ff16c4292c0df2330bbc55e3552e45523521fff6e1ff99aa219b15d9a6f224fe798b8fe49c425a8205
data/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ 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.5.0
8
+ -----
9
+
10
+ ### Changed
11
+ - Executable
12
+ - Renamed from `minitest_to_rspec` to `mt2rspec`
13
+ - The `target_file` argument is now optional
14
+
7
15
  0.4.0
8
16
  -----
9
17
 
data/README.md CHANGED
@@ -4,9 +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
- 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].
7
+ - Selected assertions from [Test::Unit][26], [minitest][8],
8
+ and [ActiveSupport][27] are converted to [rspec-expectations][25].
9
+ - Selected methods from [mocha][28] are converted to [rspec-mocks][24].
10
10
 
11
11
  Example
12
12
  -------
@@ -46,8 +46,9 @@ Usage
46
46
  ### CLI
47
47
 
48
48
  ```bash
49
- gem install minitest_to_rspec
50
- bundle exec minitest_to_rspec --rails source_file target_file
49
+ gem install mt2rspec
50
+ bundle exec mt2rspec [--rails] source_file [target_file]
51
+ bundle exec mt2rspec --help
51
52
  ```
52
53
 
53
54
  ### Ruby
data/bin/mt2rspec ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require "minitest_to_rspec/cli"
3
+ MinitestToRspec::CLI.new(ARGV).run
@@ -0,0 +1,98 @@
1
+ require "minitest_to_rspec"
2
+ require "trollop"
3
+
4
+ # https://github.com/ManageIQ/trollop/issues/57
5
+ module Trollop
6
+ def self.educate_without_exiting
7
+ @last_parser.educate($stderr)
8
+ end
9
+ end
10
+
11
+ module MinitestToRspec
12
+ class CLI
13
+ E_USAGE = 1.freeze
14
+ E_FILE_NOT_FOUND = 2.freeze
15
+ E_FILE_ALREADY_EXISTS = 3.freeze
16
+ E_CONVERT_FAIL = 4.freeze
17
+
18
+ BANNER = <<EOS.freeze
19
+ Usage: mt2rspec --rails source_file [target_file]
20
+
21
+ Reads source_file, writes target_file. If target_file is omitted,
22
+ its location will be inferred. For example, test/fruit/banana_test.rb
23
+ implies spec/fruit/banana_spec.rb.
24
+
25
+ Options:
26
+ EOS
27
+
28
+ OPT_RAILS = <<EOS.gsub(/\n/, " ").freeze
29
+ Requires rails_helper instead of spec_helper.
30
+ Passes :type metadatum to RSpec.describe.
31
+ EOS
32
+
33
+ attr_reader :rails, :source, :target
34
+
35
+ def initialize(args)
36
+ opts = Trollop::options(args) do
37
+ version MinitestToRspec::VERSION
38
+ banner BANNER
39
+ opt :rails, OPT_RAILS, short: :none
40
+ end
41
+
42
+ @rails = opts[:rails]
43
+ case args.length
44
+ when 2
45
+ @source, @target = args
46
+ when 1
47
+ @source = args[0]
48
+ @target = infer_target_from @source
49
+ else
50
+ Trollop.educate_without_exiting
51
+ exit(E_USAGE)
52
+ end
53
+ end
54
+
55
+ def run
56
+ assert_file_exists(source)
57
+ assert_file_does_not_exist(target)
58
+ write_target(converter.convert(read_source))
59
+ rescue Error => e
60
+ $stderr.puts "Failed to convert: #{e}"
61
+ exit E_CONVERT_FAIL
62
+ end
63
+
64
+ private
65
+
66
+ def assert_file_exists(file)
67
+ unless File.exist?(file)
68
+ $stderr.puts "File not found: #{file}"
69
+ exit(E_FILE_NOT_FOUND)
70
+ end
71
+ end
72
+
73
+ def assert_file_does_not_exist(file)
74
+ if File.exist?(file)
75
+ $stderr.puts "File already exists: #{file}"
76
+ exit(E_FILE_ALREADY_EXISTS)
77
+ end
78
+ end
79
+
80
+ def converter
81
+ Converter.new(rails: rails)
82
+ end
83
+
84
+ def infer_target_from(source)
85
+ source.
86
+ gsub(/\Atest/, "spec").
87
+ gsub(/_test.rb\Z/, "_spec.rb")
88
+ end
89
+
90
+ def read_source
91
+ File.read(source)
92
+ end
93
+
94
+ def write_target(str)
95
+ File.write(target, str)
96
+ end
97
+ end
98
+ end
@@ -11,6 +11,14 @@ module MinitestToRspec
11
11
  assert_valid_name
12
12
  end
13
13
 
14
+ def action_controller_test_case?
15
+ lineage?(parent, [:ActionController, :TestCase])
16
+ end
17
+
18
+ def active_support_test_case?
19
+ lineage?(parent, [:ActiveSupport, :TestCase])
20
+ end
21
+
14
22
  # Raise an error if we don't know now to process the name
15
23
  # of this class. Specifically, classes with module-shorthand.
16
24
  def assert_valid_name
@@ -23,8 +31,12 @@ module MinitestToRspec
23
31
  end
24
32
  end
25
33
 
34
+ def block?
35
+ !block.empty?
36
+ end
37
+
26
38
  def block
27
- @exp[3..-1] || []
39
+ @_block ||= @exp[3..-1] || []
28
40
  end
29
41
 
30
42
  # Returns the name of the class. Examples:
@@ -46,7 +58,31 @@ module MinitestToRspec
46
58
  # - Inherit Bar::Foo #=> s(:colon2, s(:const, :Bar), :Foo)
47
59
  #
48
60
  def parent
49
- @exp[2]
61
+ @_parent ||= @exp[2]
62
+ end
63
+
64
+ # Returns true if `@exp` inherits from, e.g. ActiveSupport::TestCase.
65
+ # TODO: Other test case parent classes.
66
+ def test_case?
67
+ return false unless sexp_type?(:colon2, parent)
68
+ active_support_test_case? ||
69
+ action_controller_test_case?
70
+ end
71
+
72
+ private
73
+
74
+ def ancestor_name(exp, index)
75
+ assert_sexp_type(:colon2, exp)
76
+ ancestor = exp[index + 1]
77
+ sexp_type?(:const, ancestor) ? ancestor[1] : ancestor
78
+ end
79
+
80
+ def lineage?(exp, names)
81
+ assert_sexp_type(:colon2, exp)
82
+ exp.length == names.length + 1 &&
83
+ names.each_with_index.all? { |name, ix|
84
+ name.to_sym == ancestor_name(exp, ix).to_sym
85
+ }
50
86
  end
51
87
  end
52
88
  end
@@ -16,37 +16,16 @@ module MinitestToRspec
16
16
  end
17
17
 
18
18
  def process
19
- result = build_root(@exp.name, @exp.parent)
20
- block = build_block(@exp.block)
21
- result.push(block) if block.length > 1
22
- result
19
+ sexp = head
20
+ sexp << block if @exp.block?
21
+ sexp
23
22
  end
24
23
 
25
24
  private
26
25
 
27
- def action_controller_test_case?(exp)
28
- lineage?(exp, [:ActionController, :TestCase])
29
- end
30
-
31
- def active_support_test_case?(exp)
32
- lineage?(exp, [:ActiveSupport, :TestCase])
33
- end
34
-
35
- def ancestor_name(exp, index)
36
- assert_sexp_type(:colon2, exp)
37
- ancestor = exp[index + 1]
38
- sexp_type?(:const, ancestor) ? ancestor[1] : ancestor
39
- end
40
-
41
- # Returns the root of the result: either an :iter representing
42
- # an `RSpec.describe` or, if it's not a test case, a :class.
43
- def build_root(name, parent)
44
- if parent && test_case?(parent)
45
- md = rspec_describe_metadata(parent)
46
- rspec_describe_block(name, md)
47
- else
48
- s(:class, name, parent)
49
- end
26
+ # Returns a :block S-expression, the contents of the class.
27
+ def block
28
+ s(:block) + @exp.block.map { |line| full_process(line) }
50
29
  end
51
30
 
52
31
  # Given a `test_class_name` like `BananaTest`, returns the
@@ -55,34 +34,20 @@ module MinitestToRspec
55
34
  test_class_name.to_s.gsub(/Test\Z/, "").to_sym
56
35
  end
57
36
 
58
- def lineage?(exp, names)
59
- assert_sexp_type(:colon2, exp)
60
- exp.length == names.length + 1 &&
61
- names.each_with_index.all? { |name, ix|
62
- name.to_sym == ancestor_name(exp, ix).to_sym
63
- }
64
- end
65
-
66
- def rspec_describe(arg, metadata)
67
- call = s(:call, s(:const, :RSpec), :describe, arg)
68
- unless metadata.nil?
69
- call << metadata
37
+ # Returns the head of the output Sexp. If it's a test case,
38
+ # an :iter representing an `RSpec.describe`. Otherwise, a :class.
39
+ def head
40
+ if @exp.test_case?
41
+ rspec_describe_block
42
+ else
43
+ s(:class, @exp.name, @exp.parent)
70
44
  end
71
- call
72
45
  end
73
46
 
74
- # Returns a S-expression representing a call to RSpec.describe
75
- def rspec_describe_block(name, metadata)
76
- const = s(:const, described_class(name))
77
- s(:iter, rspec_describe(const, metadata), s(:args))
78
- end
79
-
80
- def rspec_describe_metadata(exp)
81
- if @rails
82
- s(:hash, s(:lit, :type), s(:lit, rdm_type(exp)))
83
- else
84
- nil
85
- end
47
+ # Returns an S-expression representing the
48
+ # RDM (RSpec Describe Metadata) hash
49
+ def rdm
50
+ s(:hash, s(:lit, :type), s(:lit, rdm_type))
86
51
  end
87
52
 
88
53
  # Returns the RDM (RSpec Describe Metadata) type.
@@ -98,25 +63,24 @@ module MinitestToRspec
98
63
  # > http://bit.ly/1G5w7CJ
99
64
  #
100
65
  # TODO: Obviously, they're not all supported yet.
101
- def rdm_type(exp)
102
- if action_controller_test_case?(exp)
66
+ def rdm_type
67
+ if @exp.action_controller_test_case?
103
68
  :controller
104
69
  else
105
70
  :model
106
71
  end
107
72
  end
108
73
 
109
- # "Fully" process `lines`, a collection of Sexp representing
110
- # the contents of the class.
111
- def build_block(lines)
112
- s(:block) + lines.map { |line| full_process(line) }
74
+ def rspec_describe
75
+ const = s(:const, described_class(@exp.name))
76
+ call = s(:call, s(:const, :RSpec), :describe, const)
77
+ call << rdm if @rails
78
+ call
113
79
  end
114
80
 
115
- # TODO: Obviously, there are other test case parent classes
116
- # not supported yet.
117
- def test_case?(exp)
118
- assert_sexp_type(:colon2, exp)
119
- active_support_test_case?(exp) || action_controller_test_case?(exp)
81
+ # Returns a S-expression representing a call to RSpec.describe
82
+ def rspec_describe_block
83
+ s(:iter, rspec_describe, s(:args))
120
84
  end
121
85
  end
122
86
  end
@@ -1,3 +1,3 @@
1
1
  module MinitestToRspec
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0".freeze
3
3
  end
@@ -6,7 +6,7 @@ require 'minitest_to_rspec/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "minitest_to_rspec"
8
8
  spec.version = MinitestToRspec::VERSION
9
- spec.executables << 'minitest_to_rspec'
9
+ spec.executables << 'mt2rspec'
10
10
  spec.authors = ["Jared Beck"]
11
11
  spec.email = ["jared@jaredbeck.com"]
12
12
 
@@ -27,6 +27,7 @@ ruby2ruby.
27
27
 
28
28
  spec.add_runtime_dependency "ruby_parser", "~> 3.6"
29
29
  spec.add_runtime_dependency "ruby2ruby", "~> 2.1"
30
+ spec.add_runtime_dependency "trollop", "~> 2.1"
30
31
 
31
32
  spec.add_development_dependency "bundler", "~> 1.7"
32
33
  spec.add_development_dependency "cane", "~> 2.6"
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.0
4
+ version: 0.5.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-25 00:00:00.000000000 Z
11
+ date: 2015-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby_parser
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: trollop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.1'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -143,7 +157,7 @@ description: |
143
157
  email:
144
158
  - jared@jaredbeck.com
145
159
  executables:
146
- - minitest_to_rspec
160
+ - mt2rspec
147
161
  extensions: []
148
162
  extra_rdoc_files: []
149
163
  files:
@@ -157,12 +171,13 @@ files:
157
171
  - README.md
158
172
  - Rakefile
159
173
  - bin/console
160
- - bin/minitest_to_rspec
174
+ - bin/mt2rspec
161
175
  - doc/code_style.md
162
176
  - doc/minitest.md
163
177
  - doc/rspec.md
164
178
  - doc/supported_assertions.md
165
179
  - lib/minitest_to_rspec.rb
180
+ - lib/minitest_to_rspec/cli.rb
166
181
  - lib/minitest_to_rspec/converter.rb
167
182
  - lib/minitest_to_rspec/errors.rb
168
183
  - lib/minitest_to_rspec/exp/base.rb
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'minitest_to_rspec'
4
-
5
- module MinitestToRspec
6
- class CLI
7
- E_USAGE = 1
8
- E_FILE_NOT_FOUND = 2
9
- E_FILE_ALREADY_EXISTS = 3
10
- E_CONVERT_FAIL = 4
11
-
12
- def initialize(args)
13
- check_usage(args)
14
- @target = args.pop
15
- @source = args.pop
16
- @rails = false
17
- parse_options(args)
18
- end
19
-
20
- def run
21
- assert_file_exists(@source)
22
- assert_file_does_not_exist(@target)
23
- write_target(converter.convert(read_source))
24
- rescue Error => e
25
- $stderr.puts "Failed to convert: #{e}"
26
- exit E_CONVERT_FAIL
27
- end
28
-
29
- private
30
-
31
- def assert_file_exists(file)
32
- unless File.exist?(file)
33
- $stderr.puts "File not found: #{file}"
34
- exit(E_FILE_NOT_FOUND)
35
- end
36
- end
37
-
38
- def assert_file_does_not_exist(file)
39
- if File.exist?(file)
40
- $stderr.puts "File already exists: #{file}"
41
- exit(E_FILE_ALREADY_EXISTS)
42
- end
43
- end
44
-
45
- def check_usage(args)
46
- unless (2..3).cover?(args.length)
47
- print_usage
48
- exit(E_USAGE)
49
- end
50
- end
51
-
52
- def converter
53
- Converter.new(rails: @rails)
54
- end
55
-
56
- def parse_options(args)
57
- raise ArgumentError unless args.length <= 1
58
- args.each do |arg|
59
- case arg
60
- when "--rails"
61
- @rails = true
62
- else
63
- raise ArgumentError, "Unexpected option: #{arg}"
64
- end
65
- end
66
- end
67
-
68
- def print_usage
69
- $stderr.puts "Usage: minitest_to_rspec --rails source_file target_file"
70
- end
71
-
72
- def read_source
73
- File.read(@source)
74
- end
75
-
76
- def write_target(str)
77
- File.write(@target, str)
78
- end
79
- end
80
- end
81
-
82
- MinitestToRspec::CLI.new(ARGV).run