nicetest 0.1.2 → 0.1.3

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: ca570cb158012e0e98984c7abf67f6aa92b2653bda115e6ce933287854ef269d
4
- data.tar.gz: 551b0ba37750778871181487bae3f9c17d0a8dbb662d0e94b1967191c753483f
3
+ metadata.gz: e5039d33254ce5a534e39a585909dceefe1dd3bcc40dbbf406700b952f293264
4
+ data.tar.gz: 7a80a7e24b2d5ce333362f2b3ba929aa181e8112cd11dfec9a63799632f53a7a
5
5
  SHA512:
6
- metadata.gz: 397a83bad37cedcce9c4804872c6d8f749ba3ded816e26767fa056260d6145e44373b2dd59409e55e1ddced29a3090dbe676adcb548b54c8b8f43a2dbc2970d9
7
- data.tar.gz: 23d3fccdca0763553f62e9be37d60079d869aefa71c861c9518a9db1de2ff52496d5b100727ad7bd0d5a297fb768d0b9a1ac361e43f1f1c0f44c1d6209d76bcc
6
+ metadata.gz: 5ad2f7a6140d4a536bed67b234b66af9af985faa3f87b09aeda005ae71318b0f2d72a5af657a1edb79ff01913f0a02e1f7e7d736f0da8c98909076f9a5a60532
7
+ data.tar.gz: 6443e1ca210c7f3ad4bf19e06c3590baa59cb163fbae978c6315e87366ae20a1fb446f70dfe90b5c6d64037fa063680b4618a1ffc2b1e6350e208cf56dc6d2a4
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- C;�횦�6zL`�v����z_�Gs
2
- ��ԞR¼�a��2�xd���I7�ov.�� S���ddMk��e=Ť�R�CD�� V�+�@�.� q�T�ʥ�c��V��u{�f�D4
1
+ 0l.┧@^��U�m�� KjO�@��;����Tdx��Fd@�},w<LyI5g��ʶ�{��nF�Ξ�{0�犫}��m����^����K� � �8�)#$���1�J��2y_�h9�1ф- El�a��7~^
2
+ ������
data/README.md CHANGED
@@ -26,19 +26,35 @@ $ gem install nicetest
26
26
  # Go into a repo
27
27
  $ git clone https://github.com/Shopfy/liquid; cd liquid; bundle install
28
28
 
29
- # Run the tests
30
- $ nicetest --reporter doc test/integration/capture_test.rb
31
- Started with run options --reporter doc --seed 12874
29
+ # Run a test
30
+ nicetest --reporter doc test/integration/capture_test.rb:14
31
+ Started with run options --reporter doc --name=/CaptureTest#test_capture_with_hyphen_in_variable_name/ --seed 24518
32
32
 
33
33
  CaptureTest
34
- test_increment_assign_score_by_bytes_not_characters PASS (0.00s)
35
- test_captures_block_content_in_variable PASS (0.00s)
36
- test_capture_to_variable_from_outer_scope_if_existing PASS (0.00s)
37
- test_assigning_from_capture PASS (0.00s)
38
34
  test_capture_with_hyphen_in_variable_name PASS (0.00s)
39
35
 
40
- Finished in 0.00123s
41
- 5 tests, 5 assertions, 0 failures, 0 errors, 0 skips
36
+ Finished in 0.00115s
37
+ 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
38
+
39
+ # JUnit is easy
40
+ ❯ nicetest --reporter junit,progress
41
+ Emptying /Users/ianks/Code/Shopify/liquid/tmp/nicetest/junit/1721874837
42
+ Started with run options --reporter junit,progress --seed 36139
43
+
44
+ 799/799: [================================================================================] 100% Time: 00:00:00, Time: 00:00:00
45
+ Writing XML reports to /Users/ianks/Code/Shopify/liquid/tmp/nicetest/junit/1721874837
46
+
47
+ Finished in 0.94625s
48
+ 799 tests, 1924 assertions, 0 failures, 0 errors, 0 skips
49
+
50
+ # Filter by name
51
+ ❯ nicetest --name=/assign/
52
+ Started with run options --name=/assign/ --seed 44734
53
+
54
+ 33/33: [====================================================================================] 100% Time: 00:00:00, Time: 00:00:00
55
+
56
+ Finished in 0.03157s
57
+ 33 tests, 69 assertions, 0 failures, 0 errors, 0 skips
42
58
  ```
43
59
 
44
60
  ### Add to project
@@ -86,6 +102,14 @@ task :test do
86
102
  end
87
103
  ```
88
104
 
105
+ ## Recognition
106
+
107
+ - [minitest] for superb testing
108
+ - [minitest-reporters] for the excellent reporting
109
+ - [super_diff] for the pretty diffs
110
+ - [prism] for the blissful parser
111
+ - [pastel] for the pretty colors
112
+
89
113
  ## Contributing
90
114
 
91
115
  Bug reports and pull requests are welcome on GitHub at
@@ -95,3 +119,9 @@ https://github.com/ianks/nicetest.
95
119
 
96
120
  The gem is available as open source under the terms of the [MIT
97
121
  License](https://opensource.org/licenses/MIT).
122
+
123
+ [minitest]: https://github.com/minitest/minitest
124
+ [minitest-reporters]: https://github.com/minitest-reporters/minitest-reporters
125
+ [super_diff]: https://github.com/mcmire/super_diff
126
+ [prism]: https://github.com/ruby/prism
127
+ [pastel]: https://github.com/piotrmurach/pastel
@@ -6,14 +6,18 @@ require "nicetest"
6
6
  module Minitest
7
7
  class << self
8
8
  def plugin_nicetest_options(opts, options)
9
- opts.banner = Nicetest::Cli::BANNER
10
- ValidateMinitestFocus.apply!
9
+ opts.banner = ::Nicetest::Cli::BANNER
10
+ Nicetest::NicetestPlugin::ValidateMinitestFocus.apply!
11
11
  end
12
12
 
13
13
  def plugin_nicetest_init(_options)
14
14
  Minitest.backtrace_filter = Nicetest::BacktraceFilter.new
15
15
  end
16
+ end
17
+ end
16
18
 
19
+ module Nicetest
20
+ module NicetestPlugin
17
21
  module ValidateMinitestFocus
18
22
  class << self
19
23
  def apply!
@@ -1,25 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Minitest
4
- module ReportersPlugin
5
- MAPPING ||= {
6
- "none" => ->(_options) { nil },
7
- "default" => ->(options) { Minitest::Reporters::DefaultReporter.new(io: options[:io]) },
8
- "spec" => ->(options) { Minitest::Reporters::SpecReporter.new(io: options[:io]) },
9
- "doc" => ->(options) { MAPPING["spec"].call(options) },
10
- "junit" => ->(options) {
11
- ENV["MINITEST_REPORTERS_REPORTS_DIR"] ||= "tmp/nicetest/junit/#{Time.now.to_i}"
12
- Minitest::Reporters::JUnitReporter.new(io: options[:io])
13
- },
14
- "progress" => ->(options) { Minitest::Reporters::ProgressReporter.new(io: options[:io]) },
15
- }
16
- end
17
-
18
4
  class << self
19
5
  def plugin_reporters_options(opts, options)
20
6
  options[:reporters] = ["progress"]
21
7
 
22
- vals = Minitest::ReportersPlugin::MAPPING.keys.join(",")
8
+ vals = Nicetest::ReportersPlugin::MAPPING.keys.join(",")
23
9
  description = <<~DESC.strip
24
10
  The reporters to use for test output as comma-seperated list.
25
11
  DESC
@@ -27,7 +13,7 @@ module Minitest
27
13
  opts.on("-r", "--reporter #{vals}", Array, description) do |reporters|
28
14
  reporters = options[:reporters] + reporters if reporters == ["junit"]
29
15
 
30
- is_subset = (reporters - Minitest::ReportersPlugin::MAPPING.keys).empty?
16
+ is_subset = (reporters - Nicetest::ReportersPlugin::MAPPING.keys).empty?
31
17
  raise OptionParser::InvalidArgument, "Invalid reporter: #{reporters.join(", ")}" unless is_subset
32
18
 
33
19
  options[:reporters] = reporters
@@ -40,10 +26,26 @@ module Minitest
40
26
  require "minitest/reporters"
41
27
 
42
28
  reporters = options[:reporters].map do |reporter|
43
- ReportersPlugin::MAPPING.fetch(reporter).call(options)
29
+ Nicetest::ReportersPlugin::MAPPING.fetch(reporter).call(options)
44
30
  end.compact
45
31
 
46
32
  Minitest::Reporters.use!(reporters, ENV, Minitest.backtrace_filter) unless reporters.empty?
47
33
  end
48
34
  end
49
35
  end
36
+
37
+ module Nicetest
38
+ module ReportersPlugin
39
+ MAPPING = {
40
+ "none" => ->(_options) { nil },
41
+ "default" => ->(options) { Minitest::Reporters::DefaultReporter.new(io: options[:io]) },
42
+ "spec" => ->(options) { Minitest::Reporters::SpecReporter.new(io: options[:io]) },
43
+ "doc" => ->(options) { MAPPING["spec"].call(options) },
44
+ "junit" => ->(options) {
45
+ ENV["MINITEST_REPORTERS_REPORTS_DIR"] ||= "tmp/nicetest/junit/#{Time.now.to_i}"
46
+ Minitest::Reporters::JUnitReporter.new(io: options[:io])
47
+ },
48
+ "progress" => ->(options) { Minitest::Reporters::ProgressReporter.new(io: options[:io]) },
49
+ }
50
+ end
51
+ end
@@ -12,13 +12,16 @@ module Minitest
12
12
  return if options[:no_superdiff]
13
13
 
14
14
  require "super_diff"
15
- Minitest::Assertions.prepend(SuperdiffPlugin)
15
+ Minitest::Assertions.prepend(Nicetest::SuperdiffPlugin)
16
16
  end
17
17
  end
18
+ end
18
19
 
20
+ module Nicetest
19
21
  module SuperdiffPlugin
20
22
  module Helpers
21
23
  extend self
24
+
22
25
  def inspect_styled(obj, style, prefix: nil)
23
26
  obj = SuperDiff.inspect_object(obj, as_lines: false)
24
27
  SuperDiff::Core::Helpers.style(style, "#{prefix}#{obj}")
@@ -42,54 +45,54 @@ module Minitest
42
45
  exception.set_backtrace(e.backtrace)
43
46
  raise exception
44
47
  end
45
- end
46
48
 
47
- class AssertIncludesMessage
48
- include SuperdiffPlugin::Helpers
49
+ class AssertIncludesMessage
50
+ include SuperdiffPlugin::Helpers
49
51
 
50
- def initialize(collection:, item:)
51
- @collection = collection
52
- @item = item
53
- end
52
+ def initialize(collection:, item:)
53
+ @collection = collection
54
+ @item = item
55
+ end
54
56
 
55
- def to_s
56
- return @to_s if defined?(@to_s)
57
+ def to_s
58
+ return @to_s if defined?(@to_s)
57
59
 
58
- content = if (diff = optional_diff)
59
- collection = inspect_styled(@collection, :expected)
60
- item = inspect_styled(@item, :actual)
60
+ content = if (diff = optional_diff)
61
+ collection = inspect_styled(@collection, :expected)
62
+ item = inspect_styled(@item, :actual)
61
63
 
62
- <<~OUTPUT.strip
63
- Expected #{collection} to include #{item}, but it did not.
64
+ <<~OUTPUT.strip
65
+ Expected #{collection} to include #{item}, but it did not.
64
66
 
65
- #{diff}
66
- OUTPUT
67
- else
68
- expected = inspect_styled(@collection, :expected, prefix: " Collection: ")
69
- actual = inspect_styled(@item, :actual, prefix: "Missing item: ")
67
+ #{diff}
68
+ OUTPUT
69
+ else
70
+ expected = inspect_styled(@collection, :expected, prefix: " Collection: ")
71
+ actual = inspect_styled(@item, :actual, prefix: "Missing item: ")
70
72
 
71
- <<~OUTPUT.strip
72
- Expected collection to include item but it did not.
73
+ <<~OUTPUT.strip
74
+ Expected collection to include item but it did not.
73
75
 
74
- #{expected}
75
- #{actual}
76
- OUTPUT
77
- end
76
+ #{expected}
77
+ #{actual}
78
+ OUTPUT
79
+ end
78
80
 
79
- @to_s ||= content
80
- end
81
+ @to_s ||= content
82
+ end
81
83
 
82
- def optional_diff
83
- case @collection
84
- when Array, Set
85
- collection_with_item = @collection + [@item].flatten(1)
86
- basic_diff(@collection, collection_with_item)
84
+ def optional_diff
85
+ case @collection
86
+ when Array, Set
87
+ collection_with_item = @collection + [@item].flatten(1)
88
+ basic_diff(@collection, collection_with_item)
89
+ end
87
90
  end
88
- end
89
91
 
90
- def basic_diff(expected, actual)
91
- content = SuperDiff.diff(expected, actual)
92
- "\nDiff:\n\n#{content}"
92
+ def basic_diff(expected, actual)
93
+ content = SuperDiff.diff(expected, actual)
94
+ "\nDiff:\n\n#{content}"
95
+ end
93
96
  end
94
97
  end
95
98
  end
data/lib/nicetest/cli.rb CHANGED
@@ -11,6 +11,7 @@ module Nicetest
11
11
  def initialize(argv)
12
12
  @argv = argv
13
13
  @logger = Logger.new($stderr)
14
+ adjust_load_path!
14
15
  end
15
16
 
16
17
  def run
@@ -26,7 +27,6 @@ module Nicetest
26
27
 
27
28
  def run_tests(cli_options = Opts.parse!(@argv))
28
29
  disable_autorun!
29
- adjust_load_path!
30
30
 
31
31
  args = @argv.dup
32
32
  argv_test_files = select_file_args(args)
@@ -42,6 +42,10 @@ module Nicetest
42
42
  filters << name
43
43
  end
44
44
 
45
+ # Gross hack to allow for plugins to be loaded before we require the test files
46
+ Minitest.load_plugins unless args.delete("--no-plugins") || ENV["MT_NO_PLUGINS"]
47
+ processed_args = Minitest.process_args(args)
48
+
45
49
  required_files = argv_test_files.map do |pattern|
46
50
  file_or_dir, filter = finder.filter_for(pattern)
47
51
  filters << filter if filter && !cli_options.name
@@ -49,13 +53,29 @@ module Nicetest
49
53
  end
50
54
 
51
55
  @logger.fatal!("no test files found") if required_files.compact.empty?
52
- args << "--name=/#{filters.to_a.join("|")}/" if filters.any?
56
+
57
+ if filters.any?
58
+ processed_args[:filter] = Regexp.union(*filters.map do |filter|
59
+ Regexp.new("^#{filter}$")
60
+ end)
61
+ processed_args[:args] = "#{processed_args[:args]} --name=/^#{processed_args[:filter].source}$/"
62
+ end
63
+
64
+ patch_minitest_process_args!(processed_args)
53
65
 
54
66
  Minitest.run(args)
55
67
  end
56
68
 
57
69
  private
58
70
 
71
+ def patch_minitest_process_args!(preprocessed)
72
+ original_process_args = Minitest.method(:process_args)
73
+ Minitest.define_singleton_method(:process_args) do |_input_args|
74
+ Minitest.define_singleton_method(:process_args, original_process_args)
75
+ preprocessed
76
+ end
77
+ end
78
+
59
79
  def fetch_dep_loadpaths(gemspec, seen = {})
60
80
  return [] if seen[gemspec.name]
61
81
 
@@ -87,6 +107,7 @@ module Nicetest
87
107
 
88
108
  loadpaths = fetch_dep_loadpaths(Gem.loaded_specs["nicetest"]).map { |path| "-I#{path}" }
89
109
  requires = ["-rnicetest"]
110
+ includes = ["-I#{dir}/test"]
90
111
  args_with_removed_leading_path = @argv.map do |arg|
91
112
  arg = arg.dup
92
113
  arg.delete_prefix!(dir)
@@ -102,6 +123,7 @@ module Nicetest
102
123
  RbConfig.ruby,
103
124
  *loadpaths,
104
125
  *requires,
126
+ *includes,
105
127
  "-e",
106
128
  "exit(Nicetest::Cli.new(ARGV).run_tests)",
107
129
  "--",
@@ -123,7 +145,7 @@ module Nicetest
123
145
 
124
146
  def select_file_args(args)
125
147
  args = args.dup
126
- Minitest.instance_variable_set(:@extensions, Set.new) # Avoid double-loading plugins
148
+ Minitest.instance_variable_set(:@extensions, Set.new(Minitest.extensions)) # Avoid double-loading plugins
127
149
  Minitest.load_plugins unless args.delete("--no-plugins") || ENV["MT_NO_PLUGINS"]
128
150
  # this will remove all options from the args array
129
151
  temporarily_disable_optparse_callbacks { Minitest.process_args(args) }
@@ -131,14 +153,17 @@ module Nicetest
131
153
  end
132
154
 
133
155
  def glob_test_files(dir)
134
- Dir.glob("#{dir}/**{,/*/**}/*_test.rb")
156
+ Dir[
157
+ "#{dir}/**/test_*.rb",
158
+ "#{dir}/**/*_{test,spec}.rb",
159
+ ]
135
160
  end
136
161
 
137
162
  def require_path_or_dir(path_or_dir)
138
163
  if path_or_dir.end_with?(".rb")
139
164
  [try_require(path_or_dir)]
140
165
  else
141
- Dir.glob("#{path_or_dir}/**{,/*/**}/*_test.rb").map do |f|
166
+ glob_test_files(path_or_dir).map do |f|
142
167
  try_require(f)
143
168
  end
144
169
  end
@@ -159,7 +184,8 @@ module Nicetest
159
184
  end
160
185
 
161
186
  def adjust_load_path!
162
- $LOAD_PATH.unshift(File.expand_path("test"))
187
+ $LOAD_PATH.unshift(File.expand_path("test")) unless @adjusted
188
+ @adjusted = true
163
189
  end
164
190
 
165
191
  def temporarily_disable_optparse_callbacks(&blk)
@@ -190,9 +216,8 @@ module Nicetest
190
216
  options[:cd] = dir
191
217
  end
192
218
 
193
- opts.on("--version", "Show the version") do
194
- puts "nicetest #{Nicetest::VERSION}"
195
- exit
219
+ opts.on("-n", "--name=PATTERN", "Filter test names on pattern") do |pattern|
220
+ options[:name] = pattern
196
221
  end
197
222
  end
198
223
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nicetest
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
data/lib/nicetest.rb CHANGED
@@ -8,6 +8,9 @@ require_relative "nicetest/logger"
8
8
  require_relative "nicetest/cli"
9
9
  require_relative "nicetest/backtrace_filter"
10
10
  require_relative "nicetest/test_finder"
11
+ require_relative "minitest/nicetest_plugin"
12
+ require_relative "minitest/reporters_plugin"
13
+ require_relative "minitest/superdiff_plugin"
11
14
 
12
15
  module Nicetest
13
16
  class Error < StandardError; end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nicetest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Ker-Seymer
@@ -29,7 +29,7 @@ cert_chain:
29
29
  Lvd35BNvZkhFzs9xfykhurpkT2TiP2F3ZFn9dwLXMFe41pwrtEYLIWhYi8mUG4Ek
30
30
  6aR8M/tqIpChVV39
31
31
  -----END CERTIFICATE-----
32
- date: 2024-07-25 00:00:00.000000000 Z
32
+ date: 2024-08-02 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: minitest
metadata.gz.sig CHANGED
Binary file