m 1.4.0 → 1.6.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 +5 -5
- data/.travis.yml +15 -8
- data/Appraisals +2 -2
- data/Gemfile.lock +38 -51
- data/README.md +44 -27
- data/gemfiles/minitest4.gemfile +5 -3
- data/gemfiles/minitest4.gemfile.lock +39 -51
- data/gemfiles/minitest5.gemfile +5 -3
- data/gemfiles/minitest5.gemfile.lock +44 -46
- data/gemfiles/test_unit_gem.gemfile +4 -2
- data/gemfiles/test_unit_gem.gemfile.lock +44 -53
- data/lib/error_tests/error_test.rb +7 -0
- data/lib/m/executor.rb +3 -3
- data/lib/m/frameworks.rb +6 -2
- data/lib/m/parser.rb +29 -6
- data/lib/m/test_collection.rb +5 -6
- data/lib/m/test_method.rb +3 -1
- data/lib/m/testable.rb +8 -6
- data/lib/m/version.rb +3 -0
- data/lib/m.rb +1 -1
- data/test/active_support_test.rb +17 -17
- data/test/everything_test.rb +4 -4
- data/test/examples/active_support_example_test.rb +1 -0
- data/test/examples/active_support_unescaped_example_test.rb +1 -0
- data/test/examples/minitest_example_test.rb +36 -0
- data/test/examples/multiple_example_test.rb +1 -0
- data/test/examples/subdir/another_subdir/d_test.rb +7 -0
- data/test/examples/subdir/another_subdir/yet_another_subdir/e_test.rb +7 -0
- data/test/exit_codes_test.rb +33 -0
- data/test/multiple_test.rb +3 -3
- data/test/options_test.rb +38 -6
- data/test/test_helper.rb +5 -0
- metadata +16 -8
- data/lib/version.rb +0 -3
@@ -1,80 +1,71 @@
|
|
1
1
|
PATH
|
2
|
-
remote:
|
2
|
+
remote: ..
|
3
3
|
specs:
|
4
|
-
m (1.
|
4
|
+
m (1.5.1)
|
5
5
|
method_source (>= 0.6.7)
|
6
6
|
rake (>= 0.9.2.2)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activesupport (4.
|
12
|
-
|
13
|
-
|
14
|
-
minitest (
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
activesupport (6.1.4.1)
|
12
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
13
|
+
i18n (>= 1.6, < 2)
|
14
|
+
minitest (>= 5.1)
|
15
|
+
tzinfo (~> 2.0)
|
16
|
+
zeitwerk (~> 2.3)
|
17
|
+
allocation_stats (0.1.5)
|
18
|
+
appraisal (2.4.1)
|
18
19
|
bundler
|
19
20
|
rake
|
20
21
|
thor (>= 0.14.0)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
benchmark-ips (2.9.1)
|
23
|
+
concurrent-ruby (1.1.9)
|
24
|
+
coveralls (0.8.23)
|
25
|
+
json (>= 1.8, < 3)
|
26
|
+
simplecov (~> 0.16.1)
|
25
27
|
term-ansicolor (~> 1.3)
|
26
|
-
thor (
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
netrc (0.10.3)
|
40
|
-
power_assert (0.2.4)
|
41
|
-
rake (10.4.2)
|
42
|
-
rdiscount (2.1.8)
|
43
|
-
redcarpet (3.3.2)
|
44
|
-
rest-client (1.8.0)
|
45
|
-
http-cookie (>= 1.0.2, < 2.0)
|
46
|
-
mime-types (>= 1.16, < 3.0)
|
47
|
-
netrc (~> 0.7)
|
28
|
+
thor (>= 0.19.4, < 2.0)
|
29
|
+
tins (~> 1.6)
|
30
|
+
docile (1.4.0)
|
31
|
+
i18n (1.8.10)
|
32
|
+
concurrent-ruby (~> 1.0)
|
33
|
+
json (2.5.1)
|
34
|
+
method_source (1.0.0)
|
35
|
+
minitest (5.14.4)
|
36
|
+
mustache (1.1.1)
|
37
|
+
power_assert (2.0.1)
|
38
|
+
rake (13.0.6)
|
39
|
+
rdiscount (2.2.0.2)
|
40
|
+
redcarpet (3.5.1)
|
48
41
|
rocco (0.8.2)
|
49
42
|
mustache
|
50
43
|
redcarpet
|
51
|
-
simplecov (0.
|
52
|
-
docile (~> 1.1
|
53
|
-
json (
|
44
|
+
simplecov (0.16.1)
|
45
|
+
docile (~> 1.1)
|
46
|
+
json (>= 1.8, < 3)
|
54
47
|
simplecov-html (~> 0.10.0)
|
55
|
-
simplecov-html (0.10.
|
56
|
-
|
48
|
+
simplecov-html (0.10.2)
|
49
|
+
sync (0.5.0)
|
50
|
+
term-ansicolor (1.7.1)
|
57
51
|
tins (~> 1.0)
|
58
|
-
test-unit (3.
|
52
|
+
test-unit (3.4.4)
|
59
53
|
power_assert
|
60
|
-
thor (
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
unf (0.1.4)
|
67
|
-
unf_ext
|
68
|
-
unf (0.1.4-java)
|
69
|
-
unf_ext (0.0.7.1)
|
54
|
+
thor (1.1.0)
|
55
|
+
tins (1.29.1)
|
56
|
+
sync
|
57
|
+
tzinfo (2.0.4)
|
58
|
+
concurrent-ruby (~> 1.0)
|
59
|
+
zeitwerk (2.4.2)
|
70
60
|
|
71
61
|
PLATFORMS
|
72
|
-
java
|
73
62
|
ruby
|
74
63
|
|
75
64
|
DEPENDENCIES
|
76
65
|
activesupport
|
66
|
+
allocation_stats
|
77
67
|
appraisal
|
68
|
+
benchmark-ips
|
78
69
|
coveralls
|
79
70
|
m!
|
80
71
|
rdiscount
|
@@ -82,4 +73,4 @@ DEPENDENCIES
|
|
82
73
|
test-unit
|
83
74
|
|
84
75
|
BUNDLED WITH
|
85
|
-
|
76
|
+
2.2.26
|
data/lib/m/executor.rb
CHANGED
@@ -12,7 +12,7 @@ module M
|
|
12
12
|
|
13
13
|
def execute
|
14
14
|
# Locate tests to run that may be inside of this line. There could be more than one!
|
15
|
-
tests_to_run = tests.within(testable.
|
15
|
+
tests_to_run = tests.within(testable.lines)
|
16
16
|
|
17
17
|
# If we found any tests,
|
18
18
|
if tests_to_run.size > 0
|
@@ -23,10 +23,10 @@ module M
|
|
23
23
|
test_arguments = ["-n", "/^(#{test_names})$/"]
|
24
24
|
|
25
25
|
# directly run the tests from here and exit with the status of the tests passing or failing
|
26
|
-
runner.run(test_arguments)
|
26
|
+
runner.run(test_arguments + testable.passthrough_options)
|
27
27
|
elsif tests.size > 0
|
28
28
|
# Otherwise we found no tests on this line, so you need to pick one.
|
29
|
-
message = "No tests found on line #{testable.
|
29
|
+
message = "No tests found on line #{testable.lines.join(', ')}. Valid tests to run:\n\n"
|
30
30
|
|
31
31
|
# For every test ordered by line number,
|
32
32
|
# spit out the test name and line number where it starts,
|
data/lib/m/frameworks.rb
CHANGED
@@ -30,12 +30,16 @@ module M
|
|
30
30
|
self.class.test_unit?
|
31
31
|
end
|
32
32
|
|
33
|
+
def self.minitest_version_major
|
34
|
+
defined?(Minitest) ? Minitest::Unit::VERSION.slice(/\d+/) : nil
|
35
|
+
end
|
36
|
+
|
33
37
|
def self.minitest5?
|
34
|
-
|
38
|
+
minitest_version_major == "5"
|
35
39
|
end
|
36
40
|
|
37
41
|
def self.minitest4?
|
38
|
-
|
42
|
+
minitest_version_major == "4"
|
39
43
|
end
|
40
44
|
|
41
45
|
def self.test_unit?
|
data/lib/m/parser.rb
CHANGED
@@ -15,8 +15,17 @@ module M
|
|
15
15
|
else
|
16
16
|
parse_options! argv
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
if argv.first.start_with?("--")
|
19
|
+
exec "rake test #{argv.join}"
|
20
|
+
exit 0
|
21
|
+
else
|
22
|
+
# Parse out ARGV, it should be coming in in a format like `test/test_file.rb:9:19`
|
23
|
+
parsed = argv.shift.split(':')
|
24
|
+
testable.file = parsed.shift
|
25
|
+
testable.lines = parsed if testable.lines.none?
|
26
|
+
# Anything else on ARGV will be passed along to the runner
|
27
|
+
testable.passthrough_options = argv
|
28
|
+
end
|
20
29
|
|
21
30
|
# If this file is a directory, not a file, run the tests inside of this directory
|
22
31
|
if Dir.exist?(testable.file)
|
@@ -25,15 +34,16 @@ module M
|
|
25
34
|
Rake::TestTask.new(:m_custom) do |t|
|
26
35
|
t.libs << 'test'
|
27
36
|
t.libs << 'spec'
|
28
|
-
t.test_files = FileList["
|
37
|
+
t.test_files = FileList[wildcard("test"), wildcard("spec")]
|
38
|
+
t.warning = false
|
29
39
|
end
|
30
40
|
# Invoke the rake task and exit, hopefully it'll work!
|
31
41
|
begin
|
32
42
|
Rake::Task['m_custom'].invoke
|
33
43
|
rescue RuntimeError
|
34
|
-
exit
|
44
|
+
exit(1)
|
35
45
|
ensure
|
36
|
-
exit
|
46
|
+
exit($?.exitstatus)
|
37
47
|
end
|
38
48
|
else
|
39
49
|
return testable
|
@@ -64,11 +74,24 @@ module M
|
|
64
74
|
|
65
75
|
opts.on '-l', '--line LINE', Integer, 'Line number for file.' do |line|
|
66
76
|
p "parsing line #{line}"
|
67
|
-
testable.
|
77
|
+
testable.lines = [line]
|
78
|
+
end
|
79
|
+
|
80
|
+
opts.on '-r', '--recursive DIR', 'Search provided directory recursively.' do |directory|
|
81
|
+
testable.recursive = true
|
82
|
+
argv << directory
|
68
83
|
end
|
69
84
|
|
70
85
|
opts.parse! argv
|
71
86
|
end
|
72
87
|
end
|
88
|
+
|
89
|
+
def wildcard(type)
|
90
|
+
if testable.recursive
|
91
|
+
"#{testable.file}/**/*#{type}*.rb"
|
92
|
+
else
|
93
|
+
"#{testable.file}/*#{type}*.rb"
|
94
|
+
end
|
95
|
+
end
|
73
96
|
end
|
74
97
|
end
|
data/lib/m/test_collection.rb
CHANGED
@@ -17,13 +17,12 @@ module M
|
|
17
17
|
|
18
18
|
# Slice out tests that may be within the given line.
|
19
19
|
# Returns a new TestCollection with the results.
|
20
|
-
def within(
|
20
|
+
def within(lines)
|
21
21
|
# Into a new collection, filter only the tests that...
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end)
|
22
|
+
collection = select do |test|
|
23
|
+
lines.none? || lines.any? { |line| (test.start_line..test.end_line).include?(line) }
|
24
|
+
end
|
25
|
+
self.class.new(collection)
|
27
26
|
end
|
28
27
|
|
29
28
|
# Used to line up method names in `#sprintf` when `m` aborts
|
data/lib/m/test_method.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "method_source"
|
2
|
+
|
1
3
|
module M
|
2
4
|
### Simple data structure for what a test method contains.
|
3
5
|
#
|
@@ -22,7 +24,7 @@ module M
|
|
22
24
|
#
|
23
25
|
# The end line should be the number of line breaks in the method source,
|
24
26
|
# added to the starting line and subtracted by one.
|
25
|
-
|
27
|
+
|
26
28
|
end_line = method.source.split("\n").size + start_line - 1
|
27
29
|
|
28
30
|
# Shove the given attributes into a new databag
|
data/lib/m/testable.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
module M
|
2
2
|
class Testable
|
3
|
-
attr_accessor :file
|
4
|
-
attr_reader :
|
3
|
+
attr_accessor :file, :recursive, :passthrough_options
|
4
|
+
attr_reader :lines
|
5
5
|
|
6
|
-
def initialize(file = "",
|
6
|
+
def initialize(file = "", lines = [], recursive = false)
|
7
7
|
@file = file
|
8
|
-
@
|
8
|
+
@recursive = recursive
|
9
|
+
@passthrough_options = []
|
10
|
+
self.lines = lines
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
@
|
13
|
+
def lines=(lines)
|
14
|
+
@lines = lines.map(&:to_i)
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
data/lib/m/version.rb
ADDED
data/lib/m.rb
CHANGED
data/test/active_support_test.rb
CHANGED
@@ -2,28 +2,28 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class ActiveSupportTest < MTest
|
4
4
|
def test_run_simple_test_by_line_number
|
5
|
-
output = m('examples/active_support_example_test.rb:
|
6
|
-
assert_output(/1 tests, 1 assertions/, output)
|
5
|
+
output = m('examples/active_support_example_test.rb:12')
|
6
|
+
assert_output(/1 (runs|tests), 1 assertions/, output)
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_runs_entire_test_without_line_number
|
10
10
|
output = m('examples/active_support_example_test.rb')
|
11
|
-
assert_output(/4 tests/, output)
|
11
|
+
assert_output(/4 (runs|tests)/, output)
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_run_inside_of_test
|
15
|
-
output = m('examples/active_support_example_test.rb:
|
16
|
-
assert_output(/1 tests, 1 assertions/, output)
|
15
|
+
output = m('examples/active_support_example_test.rb:13')
|
16
|
+
assert_output(/1 (runs|tests), 1 assertions/, output)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_run_on_end_of_test
|
20
|
-
output = m('examples/active_support_example_test.rb:
|
21
|
-
assert_output(/1 tests, 1 assertions/, output)
|
20
|
+
output = m('examples/active_support_example_test.rb:14')
|
21
|
+
assert_output(/1 (runs|tests), 1 assertions/, output)
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_run_inside_big_test
|
25
|
-
output = m('examples/active_support_example_test.rb:
|
26
|
-
assert_output(/1 tests, 3 assertions/, output)
|
25
|
+
output = m('examples/active_support_example_test.rb:18')
|
26
|
+
assert_output(/1 (runs|tests), 3 assertions/, output)
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_run_on_blank_line_orders_tests_by_line_number
|
@@ -33,21 +33,21 @@ class ActiveSupportTest < MTest
|
|
33
33
|
expected = <<-EOF
|
34
34
|
No tests found on line 2. Valid tests to run:
|
35
35
|
|
36
|
-
test_normal: m examples/active_support_example_test.rb:
|
37
|
-
test_carrot: m examples/active_support_example_test.rb:
|
38
|
-
test_daikon: m examples/active_support_example_test.rb:
|
39
|
-
test_eggplant_fig: m examples/active_support_example_test.rb:
|
36
|
+
test_normal: m examples/active_support_example_test.rb:8
|
37
|
+
test_carrot: m examples/active_support_example_test.rb:12
|
38
|
+
test_daikon: m examples/active_support_example_test.rb:16
|
39
|
+
test_eggplant_fig: m examples/active_support_example_test.rb:22
|
40
40
|
EOF
|
41
41
|
assert_equal expected.strip, output
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_run_on_test_with_spaces
|
45
|
-
output = m('examples/active_support_example_test.rb:
|
46
|
-
assert_output(/1 tests, 1 assertions/, output)
|
45
|
+
output = m('examples/active_support_example_test.rb:22')
|
46
|
+
assert_output(/1 (runs|tests), 1 assertions/, output)
|
47
47
|
end
|
48
48
|
|
49
49
|
def test_run_on_test_with_unescaped_regular_express_characters
|
50
|
-
output = m('examples/active_support_unescaped_example_test.rb:
|
51
|
-
assert_output(/1 tests, 1 assertions/, output)
|
50
|
+
output = m('examples/active_support_unescaped_example_test.rb:8')
|
51
|
+
assert_output(/1 (runs|tests), 1 assertions/, output)
|
52
52
|
end
|
53
53
|
end
|
data/test/everything_test.rb
CHANGED
@@ -3,7 +3,7 @@ require 'test_helper'
|
|
3
3
|
class EverythingTest < MTest
|
4
4
|
def test_runs_entire_test_suite_with_no_arguments
|
5
5
|
output = m('')
|
6
|
-
assert_output(/12 tests/, output)
|
6
|
+
assert_output(/12 (runs|tests)/, output)
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_missing_file_gives_a_decent_error_message
|
@@ -19,15 +19,15 @@ class EverythingTest < MTest
|
|
19
19
|
|
20
20
|
def test_running_tests_within_a_subdirectory
|
21
21
|
output = m('examples/subdir')
|
22
|
-
assert_output(/3 tests/, output)
|
22
|
+
assert_output(/3 (runs|tests)/, output)
|
23
23
|
|
24
24
|
output = m('examples')
|
25
|
-
assert_output(/12 tests/, output)
|
25
|
+
assert_output(/12 (runs|tests)/, output)
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_running_tests_with_failures_within_a_subdirectory
|
29
29
|
output = m('examples/subdir_with_failures')
|
30
|
-
|
30
|
+
assert_output_for_failed_execution(/1 (runs|tests), 1 assertions, 1 failures/, output)
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_blank_file_is_quieter
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
|
3
|
+
class Meme
|
4
|
+
def i_can_has_cheezburger?
|
5
|
+
"OHAI!"
|
6
|
+
end
|
7
|
+
|
8
|
+
def will_it_blend?
|
9
|
+
"YES!"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Test = M::Frameworks.minitest4? ? MiniTest::Unit::TestCase : Minitest::Test
|
14
|
+
|
15
|
+
class TestMeme < Test
|
16
|
+
def setup
|
17
|
+
@meme = Meme.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_that_kitty_can_eat
|
21
|
+
assert_equal "OHAI!", @meme.i_can_has_cheezburger?
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_that_it_will_not_blend
|
25
|
+
refute_match(/^maybe/i, @meme.will_it_blend?)
|
26
|
+
refute_match(/^no/i, @meme.will_it_blend?)
|
27
|
+
refute_match(/^lolz/i, @meme.will_it_blend?)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_that_kitty_can_eat_two_time
|
31
|
+
assert_equal "OHAI!", @meme.i_can_has_cheezburger?
|
32
|
+
assert_equal "OHAI!", @meme.i_can_has_cheezburger?
|
33
|
+
end
|
34
|
+
|
35
|
+
Minitest.after_run { p "ran after run block" } if Minitest.respond_to?(:after_run)
|
36
|
+
end
|