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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6929795fbe4a33bf03bc8bb107a4902b6f125bfc879edf0ec0441b5ec7e5d7a5
4
- data.tar.gz: 52df3f72b9fcd4dd046d5513fd1c0c1ce69a04a6559f3edfc2c50c58fb7aa073
3
+ metadata.gz: 29759fb49b03f109abea0bc89b863a8094b965784e6827772dae2e148b6b38fd
4
+ data.tar.gz: f511164ea7cfb2602fe242dbd0cb3cfa36fee656d89a38cede3eb09ae73ffaef
5
5
  SHA512:
6
- metadata.gz: d065a84fd62ebc48fdac9223a615540c02b570172e4337c07e362dcdd8fec94037fbb64447b1099e127641c8909e0148f465252fc5f2e48c5d2af2128b5d4e28
7
- data.tar.gz: cbfbaee9dbbbc6854d48c415f3818611f9b980527a0afb5ce7d032484edce9753bf902c0f737b44480e1717484e74fac96221cc2104844a96d2b1e9c2b5eaaf5
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
@@ -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
@@ -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
@@ -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(**args)
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)] }
@@ -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
@@ -1,3 +1,9 @@
1
1
  class TLDR
2
- WIPTest = Struct.new(:test, :start_time)
2
+ WIPTest = Struct.new(:test, :start_time, :thread) do
3
+ attr_reader :backtrace_at_exit
4
+
5
+ def capture_backtrace_at_exit
6
+ @backtrace_at_exit = thread&.backtrace
7
+ end
8
+ end
3
9
  end
data/lib/tldr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class TLDR
2
- VERSION = "0.9.5"
2
+ VERSION = "0.10.1"
3
3
  end
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
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ bundle update
6
+
7
+ cd example/a
8
+ bundle update
9
+ cd ../..
10
+
11
+ cd example/b
12
+ bundle update
13
+ cd ../..
14
+
15
+ cd example/c
16
+ bundle update
17
+ cd ../..
18
+
19
+ cd example/d
20
+ bundle update
21
+ cd ../..
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.9.5
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: 2023-10-15 00:00:00.000000000 Z
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
- homepage: https://github.com/tenderlove/tldr
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/tenderlove/tldr
97
- source_code_uri: https://github.com/tenderlove/tldr
98
- changelog_uri: https://github.com/tenderlove/tldr/blob/main/CHANGELOG.md
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.4.6
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: []