minitest-line 0.5.0 → 0.6.5

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f5682e0e61c883aee95ae4538f2351ec4c17791
4
+ data.tar.gz: 9c5ef7ac3bd9cfb7eee5005dea2a16d71366ada5
5
+ SHA512:
6
+ metadata.gz: a1e9d3c361b462e48be4eed806f723f0d4cfb8ee4ff2d32b0ab782090f4cf046d69037a3d41e52416659a461bbbdb754eaf739c8d3072453fc39a2867f1d025b
7
+ data.tar.gz: 8d6a52655b8aa605831a0f2a7f4fb461a35a4e4ce45524f0033726b404812d2ade8eefc26c8c565f0150b45dcad1f2b105b82459b64da2a16449c25aa95af8bd
@@ -0,0 +1,13 @@
1
+ module Minitest
2
+ module Line
3
+ module DescribeTrack
4
+ def describe(*args, &block)
5
+ klass = super
6
+ klass.instance_variable_set(:@minitest_line_caller, caller(0..5))
7
+ klass
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ Object.send(:include, Minitest::Line::DescribeTrack)
@@ -1,4 +1,41 @@
1
+ require 'pathname'
2
+
1
3
  module Minitest
4
+ module Line
5
+ class << self
6
+ def tests_with_lines
7
+ target_file = $0
8
+ methods_with_lines(target_file).concat describes_with_lines(target_file)
9
+ end
10
+
11
+ private
12
+
13
+ def methods_with_lines(target_file)
14
+ runnables.flat_map do |runnable|
15
+ rname = runnable.name
16
+ runnable.runnable_methods.map do |name|
17
+ file, line = runnable.instance_method(name).source_location
18
+ next unless file == target_file
19
+ test_name = (rname ? "#{rname}##{name}" : name)
20
+ [test_name, line]
21
+ end
22
+ end.uniq.compact
23
+ end
24
+
25
+ def describes_with_lines(target_file)
26
+ runnables.map do |runnable|
27
+ next unless caller = runnable.instance_variable_defined?(:@minitest_line_caller) && runnable.instance_variable_get(:@minitest_line_caller)
28
+ next unless line = caller.detect { |l| l.include?(target_file) }
29
+ ["/#{Regexp.escape(runnable.name)}/", line[/:(\d+):in/, 1].to_i]
30
+ end.compact
31
+ end
32
+
33
+ def runnables
34
+ Minitest::Runnable.runnables
35
+ end
36
+ end
37
+ end
38
+
2
39
  def self.plugin_line_options(opts, options)
3
40
  opts.on '-l', '--line N', Integer, "Run test at line number" do |lineno|
4
41
  options[:line] = lineno
@@ -6,31 +43,52 @@ module Minitest
6
43
  end
7
44
 
8
45
  def self.plugin_line_init(options)
9
- return unless exp_line = options[:line]
46
+ unless exp_line = options[:line]
47
+ reporter.reporters << LineReporter.new
48
+ return
49
+ end
10
50
 
11
- methods = Runnable.runnables.flat_map do |runnable|
12
- runnable.runnable_methods.map do |name|
13
- [name, runnable.instance_method(name)]
14
- end
15
- end.uniq
51
+ tests = Minitest::Line.tests_with_lines
52
+
53
+ filter, _ = tests.sort_by { |n, l| -l }.detect { |n, l| exp_line >= l }
16
54
 
17
- current_filename = nil
18
- tests = {}
55
+ raise "Could not find test method before line #{exp_line}" unless filter
19
56
 
20
- methods.each do |name, meth|
21
- next unless loc = meth.source_location
22
- current_filename ||= loc[0]
23
- next unless current_filename == loc[0]
24
- tests[loc[1]] = name
57
+ options[:filter] = filter
58
+ end
59
+
60
+ class LineReporter < Reporter
61
+ def initialize(*)
62
+ super
63
+ @failures = []
25
64
  end
26
65
 
27
- _, main_test = tests.sort_by { |k, v| -k }.detect do |line, name|
28
- exp_line >= line
66
+ def record(result)
67
+ if !result.skipped? && !result.passed?
68
+ @failures << result
69
+ end
29
70
  end
30
71
 
31
- raise "Could not find test method after line #{exp_line}" unless main_test
72
+ def report
73
+ return unless @failures.any?
74
+ io.puts
75
+ io.puts "Focus on failing tests:"
76
+ pwd = Pathname.new(Dir.pwd)
77
+ @failures.each do |res|
78
+ result = (res.respond_to?(:source_location) ? res : res.method(res.name))
79
+ file, line = result.source_location
32
80
 
33
- options[:filter] = main_test
81
+ if file
82
+ file = Pathname.new(file)
83
+ file = file.relative_path_from(pwd) if file.absolute?
84
+ output = "ruby #{file} -l #{line}"
85
+ output = "\e[31m#{output}\e[0m" if $stdout.tty?
86
+ io.puts output
87
+ end
88
+ end
89
+ end
34
90
  end
35
- end
36
91
 
92
+ def self.plugin_line_inject_reporter
93
+ end
94
+ end
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-line
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
5
- prerelease:
4
+ version: 0.6.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Magnus Holm
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-26 00:00:00.000000000 Z
11
+ date: 2018-04-25 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: minitest
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '5.0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '5.0'
30
27
  description: Focused tests for Minitest
@@ -33,32 +30,30 @@ executables: []
33
30
  extensions: []
34
31
  extra_rdoc_files: []
35
32
  files:
36
- - test/test_line.rb
33
+ - lib/minitest/line/describe_track.rb
37
34
  - lib/minitest/line_plugin.rb
38
35
  homepage: https://github.com/judofyr/minitest-line
39
- licenses: []
36
+ licenses:
37
+ - MIT
38
+ metadata: {}
40
39
  post_install_message:
41
40
  rdoc_options: []
42
41
  require_paths:
43
42
  - lib
44
43
  required_ruby_version: !ruby/object:Gem::Requirement
45
- none: false
46
44
  requirements:
47
- - - ! '>='
45
+ - - ">="
48
46
  - !ruby/object:Gem::Version
49
- version: '0'
47
+ version: 2.0.0
50
48
  required_rubygems_version: !ruby/object:Gem::Requirement
51
- none: false
52
49
  requirements:
53
- - - ! '>='
50
+ - - ">="
54
51
  - !ruby/object:Gem::Version
55
52
  version: '0'
56
53
  requirements: []
57
54
  rubyforge_project:
58
- rubygems_version: 1.8.25
55
+ rubygems_version: 2.6.11
59
56
  signing_key:
60
- specification_version: 3
57
+ specification_version: 4
61
58
  summary: Focused tests for Minitest
62
- test_files:
63
- - test/test_line.rb
64
- has_rdoc:
59
+ test_files: []
data/test/test_line.rb DELETED
@@ -1,52 +0,0 @@
1
- $LOAD_PATH << File.expand_path('../../lib', __FILE__)
2
-
3
- require 'stringio'
4
- require 'minitest'
5
- require 'minitest/autorun'
6
- require 'minitest/mock'
7
-
8
- class LineExample < Minitest::Test
9
- def test_hello
10
- p :hello
11
- end
12
-
13
- def test_world
14
- p :world
15
- end
16
- end
17
-
18
- Minitest::Runnable.runnables.delete(LineExample)
19
-
20
- class TestLine < Minitest::Test
21
- def run_class(klass, args = [])
22
- Minitest::Runnable.stub :runnables, [klass] do
23
- $stdout = io = StringIO.new
24
- Minitest.run(args)
25
- $stdout = STDOUT
26
- io.string
27
- end
28
- end
29
-
30
- def test_line
31
- (9..12).each do |line|
32
- output = run_class LineExample, ['--line', line.to_s]
33
- assert_match /1 runs/, output
34
- assert_match /:hello/, output
35
- refute_match /:world/, output
36
- end
37
-
38
- (13..45).each do |line|
39
- output = run_class LineExample, ['--line', line.to_s]
40
- assert_match /1 runs/, output
41
- assert_match /:world/, output
42
- refute_match /:hello/, output
43
- end
44
- end
45
-
46
- def test_before
47
- assert_raises(RuntimeError) do
48
- run_class LineExample, ['--line', '8']
49
- end
50
- end
51
- end
52
-