minitest-utils 0.4.10 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62a63ab4c4bc09bdb1d655a20fd7c393d812a6205563ca37aceee3a8fb167fcc
4
- data.tar.gz: 6465e49d3b9d4e71917e86f91fc5804fd92b1936868df4f57c42e0caaf3b5a17
3
+ metadata.gz: ee05007ab6791116cc1ea0e62b39d94b2e11cdfebcd02f66c993717ca620c1f4
4
+ data.tar.gz: a535e5c9454fa423faab453f8719ca1978711e9a07c9423de8aba8778c762446
5
5
  SHA512:
6
- metadata.gz: 61536bf195760217673850b83e98f504a3477a24c60dedf498186d262ebfcb708b88b5630faeea35786e653c025d727d2b70ce2bc1652f5715fea97ab60c310c
7
- data.tar.gz: 9ddac910a50b8999163936bc4b7aa8e1fb91579f07ed75e3948a4ce6e1564a60936fde92349bed2ecf69997f223a707970c3d79d8e3bc2fc9247a4d13fff57f1
6
+ metadata.gz: 5cfdbc7786514bcad2dcf4d43ba3f0377018895027b7600c4a8f2aad954588851df558291db149f69c73ab44b0f0026eaf39393a68789809aaa9a69e49e1a0fb
7
+ data.tar.gz: 3d2cf46cbc08556df35d4ea73a59782c1ef702a27ad7472b3b79fa145b3c0e01c2efaf5a03254f3a0d86126a3bb32398167d6cee9e39e0610a29b955f070fa68
data/.rubocop.yml CHANGED
@@ -3,8 +3,11 @@ inherit_gem:
3
3
  rubocop-fnando: .rubocop.yml
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 2.7
6
+ TargetRubyVersion: 3.2
7
7
 
8
8
  Style/GlobalVars:
9
9
  Exclude:
10
10
  - test/minitest/utils/let_test.rb
11
+
12
+ Minitest/UselessAssertion:
13
+ Enabled: false
@@ -18,19 +18,34 @@ module Minitest
18
18
  class Test
19
19
  include ::Minitest::Utils::Assertions
20
20
 
21
+ def self.tests
22
+ @tests ||= []
23
+ end
24
+
21
25
  def self.test(name, &block)
22
- name = name.downcase
23
- .gsub(/[^a-z0-9]+/, "_")
24
- .gsub(/^_+/, "")
25
- .gsub(/_+$/, "")
26
- .gsub(/_+/, "_")
27
- test_name = "test_#{name}".to_sym
26
+ source_location = caller_locations(1..1).first
27
+ method_name = name.downcase
28
+ .gsub(/[^a-z0-9]+/, "_")
29
+ .gsub(/^_+/, "")
30
+ .gsub(/_+$/, "").squeeze("_")
31
+ test_name = "test_#{method_name}".to_sym
28
32
  defined = method_defined? test_name
33
+ testable = proc do
34
+ benchmark = Benchmark.measure { instance_eval(&block) }
35
+
36
+ Test.tests << {
37
+ class: self.class,
38
+ name: name,
39
+ test_name: test_name,
40
+ benchmark: benchmark,
41
+ source_location:
42
+ }
43
+ end
29
44
 
30
45
  raise "#{test_name} is already defined in #{self}" if defined
31
46
 
32
- if block_given?
33
- define_method(test_name, &block)
47
+ if block
48
+ define_method(test_name, &testable)
34
49
  else
35
50
  define_method(test_name) do
36
51
  flunk "No implementation provided for #{name}"
@@ -28,7 +28,7 @@ module ActionDispatch
28
28
 
29
29
  messages = errors
30
30
  .map(&:message)
31
- .map {|message| message[/(\d+:\d+ .*?)$/, 1] }
31
+ .map! {|message| message[/(\d+:\d+ .*?)$/, 1] }
32
32
  .join("\n")
33
33
 
34
34
  raise "JavaScript Errors\n#{messages}"
@@ -14,7 +14,8 @@ module Minitest
14
14
  red: 31,
15
15
  green: 32,
16
16
  yellow: 33,
17
- blue: 34
17
+ blue: 34,
18
+ gray: 37
18
19
  }.freeze
19
20
 
20
21
  def initialize(*)
@@ -62,11 +63,47 @@ module Minitest
62
63
  io.puts statistics
63
64
  io.puts color(summary, color)
64
65
 
65
- return unless failing_results.any?
66
+ if failing_results.any?
67
+ io.puts "\nFailed Tests:\n"
68
+ failing_results.each {|result| display_replay_command(result) }
69
+ io.puts "\n\n"
70
+ else
71
+ io.puts "\nSlow Tests:\n"
72
+ threshold = 0.1 # 100ms
73
+ test_results =
74
+ Test
75
+ .tests
76
+ .sort_by { _1[:benchmark].total }
77
+ .reverse
78
+ .take(10).filter { _1[:benchmark].total > threshold }
79
+ pwd = Pathname(Dir.pwd)
80
+
81
+ test_results.each_with_index do |info, index|
82
+ relative_path = Pathname(info[:source_location].absolute_path)
83
+ .relative_path_from(pwd)
84
+ location = "#{relative_path}:#{info[:source_location].lineno}"
85
+ duration = humanize_duration(info[:benchmark].total * 1_000_000_000)
86
+
87
+ prefix = "#{index + 1}) "
88
+ padding = " " * prefix.size
89
+
90
+ io.puts color("#{prefix}#{info[:name]} (#{duration})", :red)
91
+ io.puts color("#{padding}#{location}", :gray)
92
+ io.puts
93
+ end
94
+ end
95
+ end
66
96
 
67
- io.puts "\nFailed Tests:\n"
68
- failing_results.each {|result| display_replay_command(result) }
69
- io.puts "\n\n"
97
+ private def humanize_duration(duration_ns)
98
+ if duration_ns < 1000
99
+ format("%.2f ns", duration_ns)
100
+ elsif duration_ns < 1_000_000
101
+ format("%.2f μs", (duration_ns / 1000))
102
+ elsif duration_ns < 1_000_000_000
103
+ format("%.2f ms", (duration_ns / 1_000_000))
104
+ else
105
+ format("%.2f s", (duration_ns / 1_000_000_000))
106
+ end
70
107
  end
71
108
 
72
109
  private def statistics
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Minitest
4
4
  module Utils
5
- VERSION = "0.4.10"
5
+ VERSION = "0.5.0"
6
6
  end
7
7
  end
@@ -3,6 +3,8 @@
3
3
  module Minitest
4
4
  module Utils
5
5
  require "minitest"
6
+ require "benchmark"
7
+ require "pathname"
6
8
  require "minitest/utils/version"
7
9
  require "minitest/utils/reporter"
8
10
  require "minitest/utils/extension"
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.summary = "Some utilities for your Minitest day-to-day usage."
11
11
  spec.description = spec.summary
12
12
  spec.homepage = "http://github.com/fnando/minitest-utils"
13
- spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.2.0")
14
14
 
15
15
  spec.files = `git ls-files -z`
16
16
  .split("\x0")
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
+ spec.add_dependency "benchmark"
22
23
  spec.add_dependency "minitest"
23
24
  spec.add_development_dependency "bundler"
24
25
  spec.add_development_dependency "pry-meta"
metadata CHANGED
@@ -1,14 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.10
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-02-15 00:00:00.000000000 Z
10
+ date: 2025-02-24 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: benchmark
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
12
26
  - !ruby/object:Gem::Dependency
13
27
  name: minitest
14
28
  requirement: !ruby/object:Gem::Requirement
@@ -155,7 +169,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
169
  requirements:
156
170
  - - ">="
157
171
  - !ruby/object:Gem::Version
158
- version: 2.7.0
172
+ version: 3.2.0
159
173
  required_rubygems_version: !ruby/object:Gem::Requirement
160
174
  requirements:
161
175
  - - ">="