tldr 0.9.5 → 0.10.1
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 +8 -0
- data/README.md +2 -0
- data/lib/tldr/argv_parser.rb +4 -0
- data/lib/tldr/assertions.rb +2 -2
- data/lib/tldr/reporters/default.rb +7 -1
- data/lib/tldr/ruby_util.rb +32 -0
- data/lib/tldr/runner.rb +2 -1
- data/lib/tldr/value/config.rb +6 -4
- data/lib/tldr/value/test.rb +14 -8
- data/lib/tldr/value/wip_test.rb +7 -1
- data/lib/tldr/version.rb +1 -1
- data/lib/tldr.rb +1 -0
- data/script/upgrade +21 -0
- metadata +9 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29759fb49b03f109abea0bc89b863a8094b965784e6827772dae2e148b6b38fd
|
4
|
+
data.tar.gz: f511164ea7cfb2602fe242dbd0cb3cfa36fee656d89a38cede3eb09ae73ffaef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a2760b9496cf063b295c08661004e24def945d219b45869ac731ab856b6370138d3bb53549ea7612110bf7ed8f9f565400413ef7b8c1084b2dce96d916aea86
|
7
|
+
data.tar.gz: 47d2fa8f8c3a32a4ee6eb730d097960d404f9eef5f406b07bf599049e391614f6b095be5222c181bb2d35cbf527f8bae86829edf8758cddccb49c0e4dc438967
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## [0.10.1]
|
2
|
+
|
3
|
+
* Fix 3.4 / Prism [#17](https://github.com/tendersearls/tldr/pull/17)
|
4
|
+
|
5
|
+
## [0.10.0]
|
6
|
+
|
7
|
+
* Add an option to print the stack traces of interrupted tests [#13](https://github.com/tendersearls/tldr/pull/13) by [@henrahmagix](https://github.com/henrahmagix)
|
8
|
+
|
1
9
|
## [0.9.5]
|
2
10
|
|
3
11
|
* Fix warning when defining `setup`/`teardown` on TLDR class itself [#7](https://github.com/tendersearls/tldr/issues/7)
|
data/README.md
CHANGED
@@ -122,6 +122,8 @@ Usage: tldr [options] some_tests/**/*.rb some/path.rb:13 ...
|
|
122
122
|
--no-dotfile Disable loading .tldr.yml dotfile
|
123
123
|
--no-emoji Disable emoji in the output
|
124
124
|
-v, --verbose Print stack traces for errors
|
125
|
+
--print-interrupted-test-backtraces
|
126
|
+
Print stack traces for interrupted tests
|
125
127
|
--[no-]warnings Print Ruby warnings (Default: true)
|
126
128
|
--watch Run your tests continuously on file save (requires 'fswatch' to be installed)
|
127
129
|
--yes-i-know Suppress TLDR report when suite runs over 1.8s
|
data/lib/tldr/argv_parser.rb
CHANGED
@@ -78,6 +78,10 @@ class TLDR
|
|
78
78
|
options[:verbose] = verbose
|
79
79
|
end
|
80
80
|
|
81
|
+
opts.on CONFLAGS[:print_interrupted_test_backtraces], "Print stack traces for interrupted tests" do |print_interrupted_test_backtraces|
|
82
|
+
options[:print_interrupted_test_backtraces] = print_interrupted_test_backtraces
|
83
|
+
end
|
84
|
+
|
81
85
|
opts.on CONFLAGS[:warnings], "Print Ruby warnings (Default: true)" do |warnings|
|
82
86
|
options[:warnings] = warnings
|
83
87
|
end
|
data/lib/tldr/assertions.rb
CHANGED
@@ -241,7 +241,7 @@ class TLDR
|
|
241
241
|
begin
|
242
242
|
yield
|
243
243
|
rescue NoMatchingPatternError => e
|
244
|
-
assert false, Assertions.msg(message) { "Expected pattern match: #{e.message}" }
|
244
|
+
assert false, Assertions.msg(message) { "Expected pattern to match, but NoMatchingPatternError was raised: #{e.message}" }
|
245
245
|
end
|
246
246
|
end
|
247
247
|
|
@@ -250,7 +250,7 @@ class TLDR
|
|
250
250
|
|
251
251
|
begin
|
252
252
|
yield
|
253
|
-
refute true, Assertions.msg(message) { "Expected pattern not to match, but NoMatchingPatternError was raised" }
|
253
|
+
refute true, Assertions.msg(message) { "Expected pattern not to match, but NoMatchingPatternError was not raised" }
|
254
254
|
rescue NoMatchingPatternError
|
255
255
|
end
|
256
256
|
end
|
@@ -47,7 +47,7 @@ class TLDR
|
|
47
47
|
"#{@icons.run} Completed #{test_results.size} of #{planned_tests.size} tests (#{((test_results.size.to_f / planned_tests.size) * 100).round}%) before running out of time.",
|
48
48
|
(<<~WIP.chomp if wip_tests.any?),
|
49
49
|
#{@icons.wip} #{plural(wip_tests.size, "test was", "tests were")} cancelled in progress:
|
50
|
-
#{wip_tests.map { |wip_test| " #{time_diff(wip_test.start_time, stop_time)}ms - #{describe(wip_test.test)}" }.join("\n")}
|
50
|
+
#{wip_tests.map { |wip_test| " #{time_diff(wip_test.start_time, stop_time)}ms - #{describe(wip_test.test)}#{print_wip_backtrace(wip_test, indent: " ") if @config.print_interrupted_test_backtraces}" }.join("\n")}
|
51
51
|
WIP
|
52
52
|
(<<~SLOW.chomp if test_results.any?),
|
53
53
|
#{@icons.slow} Your #{[10, test_results.size].min} slowest completed tests:
|
@@ -137,6 +137,12 @@ class TLDR
|
|
137
137
|
"#{test.test_class}##{test.method_name} [#{location.locator}]"
|
138
138
|
end
|
139
139
|
|
140
|
+
def print_wip_backtrace wip_test, indent: ""
|
141
|
+
return unless wip_test.backtrace_at_exit
|
142
|
+
|
143
|
+
"\n#{indent}Backtrace at the point of cancellation:\n#{indent}#{wip_test.backtrace_at_exit.join("\n#{indent}")}"
|
144
|
+
end
|
145
|
+
|
140
146
|
def plural count, singular, plural = "#{singular}s"
|
141
147
|
"#{count} #{(count == 1) ? singular : plural}"
|
142
148
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class TLDR
|
2
|
+
module RubyUtil
|
3
|
+
def self.version
|
4
|
+
@version ||= Gem::Version.new(RUBY_VERSION)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.parsing_with_prism?
|
8
|
+
@parsing_with_prism ||= RubyVM::InstructionSequence.compile("").to_a[4][:parser] == :prism
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.find_prism_def_node_for(method)
|
12
|
+
require "prism"
|
13
|
+
|
14
|
+
iseq = RubyVM::InstructionSequence.of(method).to_a
|
15
|
+
method_metadata = iseq[4]
|
16
|
+
method_name = iseq[5]
|
17
|
+
|
18
|
+
file_path, line_number = method.source_location
|
19
|
+
parse_prism_ast(file_path).breadth_first_search { |node|
|
20
|
+
node.type == :def_node &&
|
21
|
+
line_number == node.start_line &&
|
22
|
+
method_name == node.name.to_s &&
|
23
|
+
method_metadata[:code_location] == [node.start_line, node.start_column, node.end_line, node.end_column]
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.parse_prism_ast(file_path)
|
28
|
+
@prism_ast = Thread.current[:prism_parse_results] ||= {}
|
29
|
+
@prism_ast[file_path] ||= Prism.parse(File.read(file_path)).value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/tldr/runner.rb
CHANGED
@@ -20,6 +20,7 @@ class TLDR
|
|
20
20
|
next if ENV["CI"] && !$stderr.tty?
|
21
21
|
next if @run_aborted.true?
|
22
22
|
@run_aborted.make_true
|
23
|
+
@wip.each(&:capture_backtrace_at_exit)
|
23
24
|
reporter.after_tldr(plan.tests, @wip.dup, @results.dup)
|
24
25
|
exit!(3)
|
25
26
|
end
|
@@ -51,7 +52,7 @@ class TLDR
|
|
51
52
|
def run_test test, config, plan, reporter
|
52
53
|
e = nil
|
53
54
|
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :microsecond)
|
54
|
-
wip_test = WIPTest.new(test, start_time)
|
55
|
+
wip_test = WIPTest.new(test, start_time, Thread.current)
|
55
56
|
@wip << wip_test
|
56
57
|
runtime = time_it(start_time) do
|
57
58
|
instance = test.test_class.new
|
data/lib/tldr/value/config.rb
CHANGED
@@ -3,6 +3,7 @@ class TLDR
|
|
3
3
|
seed: "--seed",
|
4
4
|
no_helper: "--no-helper",
|
5
5
|
verbose: "--verbose",
|
6
|
+
print_interrupted_test_backtraces: "--print-interrupted-test-backtraces",
|
6
7
|
reporter: "--reporter",
|
7
8
|
helper_paths: "--helper",
|
8
9
|
load_paths: "--load-path",
|
@@ -26,7 +27,7 @@ class TLDR
|
|
26
27
|
PATH_FLAGS = [:paths, :helper_paths, :load_paths, :prepend_paths, :exclude_paths].freeze
|
27
28
|
MOST_RECENTLY_MODIFIED_TAG = "MOST_RECENTLY_MODIFIED".freeze
|
28
29
|
CONFIG_ATTRIBUTES = [
|
29
|
-
:paths, :seed, :no_helper, :verbose, :reporter,
|
30
|
+
:paths, :seed, :no_helper, :verbose, :print_interrupted_test_backtraces, :reporter,
|
30
31
|
:helper_paths, :load_paths, :parallel, :names, :fail_fast, :no_emoji,
|
31
32
|
:prepend_paths, :no_prepend, :exclude_paths, :exclude_names, :base_path,
|
32
33
|
:no_dotfile, :warnings, :watch, :yes_i_know, :i_am_being_watched,
|
@@ -47,7 +48,7 @@ class TLDR
|
|
47
48
|
revert_working_directory_change_because_itll_ruin_everything!(original_base_path)
|
48
49
|
end
|
49
50
|
|
50
|
-
super
|
51
|
+
super
|
51
52
|
end
|
52
53
|
|
53
54
|
# These are for internal tracking and resolved at initialization-time
|
@@ -60,6 +61,7 @@ class TLDR
|
|
60
61
|
seed: rand(10_000),
|
61
62
|
no_helper: false,
|
62
63
|
verbose: false,
|
64
|
+
print_interrupted_test_backtraces: false,
|
63
65
|
reporter: Reporters::Default,
|
64
66
|
parallel: true,
|
65
67
|
names: [],
|
@@ -109,7 +111,7 @@ class TLDR
|
|
109
111
|
end
|
110
112
|
|
111
113
|
# Booleans
|
112
|
-
[:no_helper, :verbose, :fail_fast, :no_emoji, :no_prepend, :warnings, :yes_i_know, :i_am_being_watched].each do |key|
|
114
|
+
[:no_helper, :verbose, :print_interrupted_test_backtraces, :fail_fast, :no_emoji, :no_prepend, :warnings, :yes_i_know, :i_am_being_watched].each do |key|
|
113
115
|
merged_args[key] = defaults[key] if merged_args[key].nil?
|
114
116
|
end
|
115
117
|
|
@@ -201,7 +203,7 @@ class TLDR
|
|
201
203
|
next warnings ? "--warnings" : "--no-warnings"
|
202
204
|
end
|
203
205
|
|
204
|
-
if defaults[key] == self[key]
|
206
|
+
if defaults[key] == self[key] && (key != :seed || !seed_set_intentionally)
|
205
207
|
next
|
206
208
|
elsif self[key].is_a?(Array)
|
207
209
|
self[key].map { |value| [flag, stringify(key, value)] }
|
data/lib/tldr/value/test.rb
CHANGED
@@ -8,14 +8,6 @@ class TLDR
|
|
8
8
|
@location = Location.new(file, line)
|
9
9
|
end
|
10
10
|
|
11
|
-
# Memoizing at call time, because re-parsing isn't free and isn't usually necessary
|
12
|
-
def end_line
|
13
|
-
@end_line ||= begin
|
14
|
-
test_method = SorbetCompatibility.unwrap_method(test_class.instance_method(method_name))
|
15
|
-
RubyVM::AbstractSyntaxTree.of(test_method).last_lineno
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
11
|
# Test exact match starting line condition first to save us a potential re-parsing to look up end_line
|
20
12
|
def covers_line? l
|
21
13
|
line == l || (l >= line && l <= end_line)
|
@@ -24,5 +16,19 @@ class TLDR
|
|
24
16
|
def group?
|
25
17
|
false
|
26
18
|
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
# Memoizing at call time, because re-parsing isn't free and isn't usually necessary
|
23
|
+
def end_line
|
24
|
+
@end_line ||= begin
|
25
|
+
test_method = SorbetCompatibility.unwrap_method(test_class.instance_method(method_name))
|
26
|
+
if RubyUtil.parsing_with_prism?
|
27
|
+
RubyUtil.find_prism_def_node_for(test_method)&.end_line || -1
|
28
|
+
else
|
29
|
+
RubyVM::AbstractSyntaxTree.of(test_method).last_lineno
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
27
33
|
end
|
28
34
|
end
|
data/lib/tldr/value/wip_test.rb
CHANGED
data/lib/tldr/version.rb
CHANGED
data/lib/tldr.rb
CHANGED
@@ -11,6 +11,7 @@ require_relative "tldr/parallel_controls"
|
|
11
11
|
require_relative "tldr/path_util"
|
12
12
|
require_relative "tldr/planner"
|
13
13
|
require_relative "tldr/reporters"
|
14
|
+
require_relative "tldr/ruby_util"
|
14
15
|
require_relative "tldr/runner"
|
15
16
|
require_relative "tldr/skippable"
|
16
17
|
require_relative "tldr/sorbet_compatibility"
|
data/script/upgrade
ADDED
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tldr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Searls
|
8
8
|
- Aaron Patterson
|
9
|
-
autorequire:
|
10
9
|
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2025-03-26 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: super_diff
|
@@ -39,7 +38,6 @@ dependencies:
|
|
39
38
|
- - "~>"
|
40
39
|
- !ruby/object:Gem::Version
|
41
40
|
version: '1.2'
|
42
|
-
description:
|
43
41
|
email:
|
44
42
|
- searls@gmail.com
|
45
43
|
- tenderlove@ruby-lang.org
|
@@ -73,6 +71,7 @@ files:
|
|
73
71
|
- lib/tldr/reporters/base.rb
|
74
72
|
- lib/tldr/reporters/default.rb
|
75
73
|
- lib/tldr/reporters/icon_provider.rb
|
74
|
+
- lib/tldr/ruby_util.rb
|
76
75
|
- lib/tldr/runner.rb
|
77
76
|
- lib/tldr/skippable.rb
|
78
77
|
- lib/tldr/sorbet_compatibility.rb
|
@@ -89,14 +88,14 @@ files:
|
|
89
88
|
- lib/tldr/watcher.rb
|
90
89
|
- script/setup
|
91
90
|
- script/test
|
92
|
-
|
91
|
+
- script/upgrade
|
92
|
+
homepage: https://github.com/tendersearls/tldr
|
93
93
|
licenses:
|
94
94
|
- MIT
|
95
95
|
metadata:
|
96
|
-
homepage_uri: https://github.com/
|
97
|
-
source_code_uri: https://github.com/
|
98
|
-
changelog_uri: https://github.com/
|
99
|
-
post_install_message:
|
96
|
+
homepage_uri: https://github.com/tendersearls/tldr
|
97
|
+
source_code_uri: https://github.com/tendersearls/tldr
|
98
|
+
changelog_uri: https://github.com/tendersearls/tldr/blob/main/CHANGELOG.md
|
100
99
|
rdoc_options: []
|
101
100
|
require_paths:
|
102
101
|
- lib
|
@@ -111,8 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
110
|
- !ruby/object:Gem::Version
|
112
111
|
version: '0'
|
113
112
|
requirements: []
|
114
|
-
rubygems_version: 3.
|
115
|
-
signing_key:
|
113
|
+
rubygems_version: 3.6.2
|
116
114
|
specification_version: 4
|
117
115
|
summary: TLDR will run your tests, but only for 1.8 seconds.
|
118
116
|
test_files: []
|