tldr 0.6.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82e76ebc309cbf643c22244a1674aa3a7ae32578006ce05fac262aec15292bec
4
- data.tar.gz: 99610ebabba0d069f3618f6fa7cf79793c44491c4764463283e304fe329c7247
3
+ metadata.gz: 81e3d6734a718c5abbf80cfb088369d5a6bb89b81fc261020d97e34cbd6903bb
4
+ data.tar.gz: 1c4d0b5a53a948d868556b027f6fd6cdb4b9a96e67b459f0b2bf73e05a251d2f
5
5
  SHA512:
6
- metadata.gz: de39822a1208f86b69a45ac1185d2c6de22462282a6fa2f59054e84bfa55b135f61279ae3b9be2f61463557a2a04516397bd02083a6c2c8a26c8e627875a44d1
7
- data.tar.gz: ae0c0ed4ec84f2969a0b223a668351ce475536121fb59e2b56a4fbd7be18be844d5fec3aaf3d5ebfd5cf37ddb6a0a02afeef1f0e1f2f975c7d2796d322ab0ccb
6
+ metadata.gz: df9de67f0609adc2c5e0d2fc44a3bec44dd8a25a4ed0d128b8f1beaad6f45343dc9e5644e8d3b94b5bbe4db919f3becdf2e9a468a6eda0978669018135993d1f
7
+ data.tar.gz: 00e813b4947ef3d9e267e3ea4248def3254829b4b910719ad4cdd258cf809d751d7c5a539d527a708f9ff3471fe45fe24fc342d132f15948a56d7d5a56b38c7e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.8.0]
2
+
3
+ * Add a `--yes-i-know` flag that will suppress the large warning when your test
4
+ suite runs over the 1.8s limit
5
+
6
+ ## [0.7.0]
7
+
8
+ * Add a `tldt` alias for folks who have another executable named `tldr` on their
9
+ paths
10
+ * BREAKING: Reverse decision in 0.1.1 to capture_io on every TLDR subclass;
11
+ moving back to the MinitestCompatibility mixin
12
+ * Fix `assert_in_delta` defaultarg to retain Minitest compatibility
13
+ * Add `mu_pp` to the MinitestCompatibility mixin
14
+
1
15
  ## [0.6.2]
2
16
 
3
17
  * Since TLDR runs fine on 3.1, reduce the gem requirement
data/README.md CHANGED
@@ -123,7 +123,8 @@ Usage: tldr [options] some_tests/**/*.rb some/path.rb:13 ...
123
123
  --no-emoji Disable emoji in the output
124
124
  -v, --verbose Print stack traces for errors
125
125
  --[no-]warnings Print Ruby warnings (Default: true)
126
- --comment COMMENT No-op comment, used internally for multi-line execution instructions
126
+ --yes-i-know Suppress TLDR report when suite runs over 1.8s
127
+ --comment COMMENT No-op; used for multi-line execution instructions
127
128
  ```
128
129
 
129
130
  After being parsed, all the CLI options are converted into a
@@ -319,6 +320,14 @@ TLDR will run all your tests in CI without the time bomb going off. If
319
320
  `tldr` is run in a non-interactive shell and a `CI` environment variable is set
320
321
  (as it is on virtually every CI service), then the bomb will be defused.
321
322
 
323
+ ### What if I already have another `tldr` executable on my path?
324
+
325
+ There's a [command-line utility named tldr](https://tldr.sh) that might conflict
326
+ with this gem's binary in your PATH. If that's the case you could change your
327
+ path, invoke `bundle exec tldr`, run [with Rake](#running-tldr-with-rake), or
328
+ use the `tldt` ("too long; didn't test") executable alias that ships with this
329
+ gem.
330
+
322
331
  ### Is there a plugin system?
323
332
 
324
333
  There is not.
@@ -328,12 +337,26 @@ with the `--reporter` command line option. It can be set to any fully-qualified
328
337
  class name that extends from
329
338
  [TLDR::Reporters::Base](/lib/tldr/reporters/base.rb).
330
339
 
340
+ ### I know my tests are over 1.8s, how do I suppress the huge output?
341
+
342
+ Plenty of test suites are over 1.8s and having TLDR repeatedly print out the
343
+ huge summary at the end of each test run can be distracting and make it harder
344
+ to spot test failures. If you know your test suite is too slow, you can simply
345
+ add the `--yes-i-know` flag
346
+
331
347
  ### What about mocking?
332
348
 
333
349
  TLDR is laser-focused on running tests, so it doesn't provide a built-in mocking
334
350
  facility. Might we interest you in a refreshing
335
351
  [mocktail](https://github.com/testdouble/mocktail), instead?
336
352
 
353
+ ### Contributing to TLDR
354
+
355
+ If you want to submit PRs on this repo, please know that the code style is
356
+ [Kirkland-style Ruby](https://mastodon.social/@searls/111137666157318482), where
357
+ method definitions have parentheses omitted but parentheses are generally
358
+ expected for method invocations.
359
+
337
360
  ## Acknowledgements
338
361
 
339
362
  Thanks to [George Sheppard](https://github.com/fuzzmonkey) for freeing up the
data/exe/tldt ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "tldr"
4
+
5
+ TLDR::Run.cli(ARGV)
@@ -82,7 +82,11 @@ class TLDR
82
82
  options[:warnings] = warnings
83
83
  end
84
84
 
85
- opts.on "--comment COMMENT", String, "No-op comment, used internally for multi-line execution instructions" do
85
+ opts.on CONFLAGS[:yes_i_know], "Suppress TLDR report when suite runs over 1.8s" do
86
+ options[:yes_i_know] = true
87
+ end
88
+
89
+ opts.on "--comment COMMENT", String, "No-op; used for multi-line execution instructions" do
86
90
  # See "--comment" in lib/tldr/reporters/default.rb for an example of how this is used internally
87
91
  end
88
92
  end.parse!(args)
@@ -33,6 +33,23 @@ class TLDR
33
33
 
34
34
  assert receiver.__send__(method, *args), message
35
35
  end
36
+
37
+ def capture_io(&blk)
38
+ Assertions.capture_io(&blk)
39
+ end
40
+
41
+ def mu_pp obj
42
+ s = obj.inspect.encode(Encoding.default_external)
43
+
44
+ if String === obj && (obj.encoding != Encoding.default_external ||
45
+ !obj.valid_encoding?)
46
+ enc = "# encoding: #{obj.encoding}"
47
+ val = "# valid: #{obj.valid_encoding?}"
48
+ "#{enc}\n#{val}\n#{s}"
49
+ else
50
+ s
51
+ end
52
+ end
36
53
  end
37
54
  end
38
55
  end
@@ -28,7 +28,7 @@ class TLDR
28
28
  SuperDiff::EqualityMatchers::Main.call(expected:, actual:)
29
29
  end
30
30
 
31
- def capture_io
31
+ def self.capture_io
32
32
  captured_stdout, captured_stderr = StringIO.new, StringIO.new
33
33
 
34
34
  original_stdout, original_stderr = $stdout, $stderr
@@ -85,7 +85,7 @@ class TLDR
85
85
  refute expected == actual, message
86
86
  end
87
87
 
88
- def assert_in_delta expected, actual, delta, message = nil
88
+ def assert_in_delta expected, actual, delta = 0.001, message = nil
89
89
  difference = (expected - actual).abs
90
90
  message = Assertions.msg(message) {
91
91
  "Expected |#{expected} - #{actual}| (#{difference}) to be within #{delta}"
@@ -204,7 +204,7 @@ class TLDR
204
204
  def assert_output expected_stdout, expected_stderr, message = nil, &block
205
205
  assert_block "assert_output requires a block to capture output" unless block
206
206
 
207
- actual_stdout, actual_stderr = capture_io(&block)
207
+ actual_stdout, actual_stderr = Assertions.capture_io(&block)
208
208
 
209
209
  if Regexp === expected_stderr
210
210
  assert_match expected_stderr, actual_stderr, "In stderr"
@@ -31,29 +31,31 @@ class TLDR
31
31
  end
32
32
  end
33
33
 
34
- def time_diff start, stop = Process.clock_gettime(Process::CLOCK_MONOTONIC, :microsecond)
35
- ((stop - start) / 1000.0).round
36
- end
37
-
38
34
  def after_tldr planned_tests, wip_tests, test_results
39
35
  stop_time = Process.clock_gettime Process::CLOCK_MONOTONIC, :microsecond
40
36
 
41
37
  @out.print @icons.tldr
42
38
  @err.print "\n\n"
43
- wrap_in_horizontal_rule do
44
- @err.print [
45
- "too long; didn't run!",
46
- "#{@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.",
47
- (<<~WIP.chomp if wip_tests.any?),
48
- #{@icons.wip} #{plural wip_tests.size, "test was", "tests were"} cancelled in progress:
49
- #{wip_tests.map { |wip_test| " #{time_diff(wip_test.start_time, stop_time)}ms - #{describe(wip_test.test)}" }.join("\n")}
50
- WIP
51
- (<<~SLOW.chomp if test_results.any?),
52
- #{@icons.slow} Your #{[10, test_results.size].min} slowest completed tests:
53
- #{test_results.sort_by(&:runtime).last(10).reverse.map { |result| " #{result.runtime}ms - #{describe(result.test)}" }.join("\n")}
54
- SLOW
55
- describe_tests_that_didnt_finish(planned_tests, test_results)
56
- ].compact.join("\n\n")
39
+
40
+ if @config.yes_i_know
41
+ @err.print "🚨 TLDR! Display summary by omitting --yes-i-know"
42
+ else
43
+ wrap_in_horizontal_rule do
44
+ @err.print [
45
+ "too long; didn't run!",
46
+ "#{@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.",
47
+ (<<~WIP.chomp if wip_tests.any?),
48
+ #{@icons.wip} #{plural wip_tests.size, "test was", "tests were"} cancelled in progress:
49
+ #{wip_tests.map { |wip_test| " #{time_diff(wip_test.start_time, stop_time)}ms - #{describe(wip_test.test)}" }.join("\n")}
50
+ WIP
51
+ (<<~SLOW.chomp if test_results.any?),
52
+ #{@icons.slow} Your #{[10, test_results.size].min} slowest completed tests:
53
+ #{test_results.sort_by(&:runtime).last(10).reverse.map { |result| " #{result.runtime}ms - #{describe(result.test)}" }.join("\n")}
54
+ SLOW
55
+ describe_tests_that_didnt_finish(planned_tests, test_results),
56
+ "🙈 Suppress this summary with --yes-i-know"
57
+ ].compact.join("\n\n")
58
+ end
57
59
  end
58
60
 
59
61
  after_suite test_results
@@ -102,6 +104,10 @@ class TLDR
102
104
 
103
105
  private
104
106
 
107
+ def time_diff start, stop = Process.clock_gettime(Process::CLOCK_MONOTONIC, :microsecond)
108
+ ((stop - start) / 1000.0).round
109
+ end
110
+
105
111
  def summarize_failures results
106
112
  failures = results.select { |result| result.failing? }
107
113
  return failures if failures.empty?
@@ -138,7 +144,7 @@ class TLDR
138
144
  rule = @icons.alarm + "=" * 20 + " ABORTED RUN " + "=" * 20 + @icons.alarm
139
145
  @err.print "#{rule}\n\n"
140
146
  yield
141
- @err.print "\n\n#{rule}\n\n"
147
+ @err.print "\n\n#{rule}"
142
148
  end
143
149
 
144
150
  def describe_tests_that_didnt_finish planned_tests, test_results
@@ -150,7 +156,7 @@ class TLDR
150
156
  failed_locators = consolidate failed, exclude: unrun_locators
151
157
  suggested_locators = unrun_locators + [
152
158
  ("--comment \"Also include #{plural failed.size, "test"} that failed:\"" if failed_locators.any?)
153
- ] + failed_locators
159
+ ].compact + failed_locators
154
160
  <<~MSG
155
161
  #{@icons.rock_on} Run the #{plural unrun.size, "test"} that didn't finish:
156
162
  #{tldr_command} #{@config.to_full_args exclude: [:paths]} #{suggested_locators.join(" \\\n ")}
@@ -17,6 +17,7 @@ class TLDR
17
17
  base_path: "--base-path",
18
18
  no_dotfile: "--no-dotfile",
19
19
  warnings: "--[no-]warnings",
20
+ yes_i_know: "--yes-i-know",
20
21
  paths: nil
21
22
  }.freeze
22
23
 
@@ -26,7 +27,7 @@ class TLDR
26
27
  :paths, :seed, :no_helper, :verbose, :reporter,
27
28
  :helper_paths, :load_paths, :parallel, :names, :fail_fast, :no_emoji,
28
29
  :prepend_paths, :no_prepend, :exclude_paths, :exclude_names, :base_path,
29
- :no_dotfile, :warnings,
30
+ :no_dotfile, :warnings, :yes_i_know,
30
31
  # Internal properties
31
32
  :config_intended_for_merge_only, :seed_set_intentionally, :cli_defaults
32
33
  ].freeze
@@ -64,7 +65,8 @@ class TLDR
64
65
  exclude_paths: [],
65
66
  exclude_names: [],
66
67
  base_path: nil,
67
- warnings: true
68
+ warnings: true,
69
+ yes_i_know: false
68
70
  }
69
71
 
70
72
  if cli_defaults
@@ -101,7 +103,7 @@ class TLDR
101
103
  end
102
104
 
103
105
  # Booleans
104
- [:no_helper, :verbose, :fail_fast, :no_emoji, :no_prepend, :warnings].each do |key|
106
+ [:no_helper, :verbose, :fail_fast, :no_emoji, :no_prepend, :warnings, :yes_i_know].each do |key|
105
107
  merged_args[key] = defaults[key] if merged_args[key].nil?
106
108
  end
107
109
 
data/lib/tldr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class TLDR
2
- VERSION = "0.6.2"
2
+ VERSION = "0.8.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tldr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Searls
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-09-29 00:00:00.000000000 Z
12
+ date: 2023-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: super_diff
@@ -45,6 +45,7 @@ email:
45
45
  - tenderlove@ruby-lang.org
46
46
  executables:
47
47
  - tldr
48
+ - tldt
48
49
  extensions: []
49
50
  extra_rdoc_files: []
50
51
  files:
@@ -54,6 +55,7 @@ files:
54
55
  - README.md
55
56
  - Rakefile
56
57
  - exe/tldr
58
+ - exe/tldt
57
59
  - lib/tldr.rb
58
60
  - lib/tldr/argv_parser.rb
59
61
  - lib/tldr/assertions.rb