tldr 0.4.0 → 0.5.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: 91190a0094836b21df8aaeccb57684848ada68707a4c52241ebd74437fb514c4
4
- data.tar.gz: a6cc8f1573bdb317f6fd5f337a9670bbeef95f735bdc1003774f4bca0a7b294b
3
+ metadata.gz: 32f7b9dbcf9e09433eef762eaafe19804643aa543ac2c0a9599303ea2e960f25
4
+ data.tar.gz: 789c07fb2db1fad39b234976999b575a1bea27c4796a4d062a373df11d3716e5
5
5
  SHA512:
6
- metadata.gz: 93b9fdf0d61dcaba8c3c6dff464700ca260bbdef433eaf799e33130baf5ef63d0e7dec1c6dc3558e5d0f1bc580b53fbacc31c466da1f4a9803533470bb1b5ec5
7
- data.tar.gz: f2a8de04ed3e9b84c277db21f111177849138c1b1b692a43d96492b0707c0e9a8c255c26a9991d899ed27312a04ebe13887a6db7d4417a4878b4e2cfc542acc4
6
+ metadata.gz: 7975ec24ae3f080ed564666c5319928964c970794a740a21253551be1be9b945374394b2f860cdd8737151f8e21fdb0d592c126895dd02b91dd21c899824226a
7
+ data.tar.gz: b11f3c52624b63a7aa44eadd4f17aa662d134648d61eb55eb7124e7956d0b28f20a04545552f9af8710330ffa98c94e85cec87dc80715a532522ccdeb15a8b42
data/CHANGELOG.md CHANGED
@@ -1,4 +1,12 @@
1
- ## [Unreleased]
1
+ ## [0.5.0]
2
+
3
+ * Define your own Rake tasks with `TLDR::Task` and pass in a custom configuration
4
+ * Any tests with `--prepend` AND marked thread-unsafe with `dont_run_these_in_parallel`
5
+ will be run BEFORE the parallel tests start running. This way if you're working
6
+ on a non-parallelizable test, running `tldr` will automatically run it first
7
+ thing
8
+ * Stop printing `--seed` in run commands, since it can be confusing to discover
9
+ that will disable `--parallel`. Instead, print the seed option beneath
2
10
 
3
11
  ## [0.4.0]
4
12
 
data/README.md CHANGED
@@ -181,6 +181,27 @@ You could then run the task with:
181
181
  $ TLDR_OPTS="--no-parallel" bundle exec rake tldr
182
182
  ```
183
183
 
184
+ One reason you'd want to invoke TLDR with Rake is because you have multiple
185
+ test suites that you want to be able to conveniently run separately ([this
186
+ talk](https://blog.testdouble.com/talks/2014-05-25-breaking-up-with-your-test-suite/)
187
+ discussed a few reasons why this can be useful).
188
+
189
+ To create a custom TLDR Rake test, just instantiate `TLDR::Task` like this:
190
+
191
+ ```ruby
192
+ require "tldr/rake"
193
+
194
+ TLDR::Task.new(name: :safe_tests, config: TLDR::Config.new(
195
+ paths: FileList["safe/**/*_test.rb"],
196
+ helper: "safe/helper.rb",
197
+ load_paths: ["lib", "safe"]
198
+ ))
199
+ ```
200
+
201
+ The above will create a second Rake task named `safe_tests` running a different
202
+ set of tests than the default `tldr` task. Here's [an
203
+ example](/example/b/Rakefile).
204
+
184
205
  ### Running tests without the CLI
185
206
 
186
207
  If you'd rather use TLDR by running Ruby files instead of the `tldr` CLI
@@ -207,7 +228,7 @@ $ ruby test/some_test.rb
207
228
 
208
229
  To maximize control and to avoid running code accidentally (and _unlike_ the
209
230
  `tldr` CLI), running `at_exit!` will not set default values to the `paths`,
210
- `helper`, `load_paths`, and `prepend_tests` config properties. You'll have to
231
+ `helper`, `load_paths`, and `prepend_paths` config properties. You'll have to
211
232
  pass any values you want to set on a [Config object](/lib/tldr/value/config.rb)
212
233
  and pass it to `at_exit!`.
213
234
 
@@ -4,11 +4,7 @@ class TLDR
4
4
  class ArgvParser
5
5
  PATTERN_FRIENDLY_SPLITTER = /,(?=(?:[^\/]*\/[^\/]*\/)*[^\/]*$)/
6
6
 
7
- def parse(args)
8
- options = {
9
- cli_mode: true
10
- }
11
-
7
+ def parse(args, options = {cli_defaults: true})
12
8
  OptionParser.new do |opts|
13
9
  opts.banner = "Usage: tldr [options] some_tests/**/*.rb some/path.rb:13 ..."
14
10
 
@@ -47,9 +43,9 @@ class TLDR
47
43
  options[:no_helper] = true
48
44
  end
49
45
 
50
- opts.on "#{CONFLAGS[:prepend_tests]} PATH", Array, "Prepend one or more paths to run before the rest (Default: most recently modified test)" do |prepend|
51
- options[:prepend_tests] ||= []
52
- options[:prepend_tests] += prepend
46
+ opts.on "#{CONFLAGS[:prepend_paths]} PATH", Array, "Prepend one or more paths to run before the rest (Default: most recently modified test)" do |prepend|
47
+ options[:prepend_paths] ||= []
48
+ options[:prepend_paths] += prepend
53
49
  end
54
50
 
55
51
  opts.on CONFLAGS[:no_prepend], "Don't prepend any tests before the rest of the suite" do
@@ -8,12 +8,18 @@ class TLDR
8
8
  )
9
9
  end
10
10
 
11
- def parallelize all_tests, parallel, &blk
12
- return run_in_sequence(all_tests, &blk) if all_tests.size < 2 || !parallel
11
+ def parallelize all_tests, config, &blk
12
+ return run_in_sequence(all_tests, &blk) if all_tests.size < 2 || !config.parallel
13
13
 
14
- strategy = @strategizer.strategize all_tests, GROUPED_TESTS, THREAD_UNSAFE_TESTS
14
+ strategy = @strategizer.strategize(
15
+ all_tests,
16
+ GROUPED_TESTS,
17
+ THREAD_UNSAFE_TESTS,
18
+ (config.no_prepend ? [] : config.prepend_paths)
19
+ )
15
20
 
16
- run_in_parallel(strategy.parallel_tests_and_groups, &blk) +
21
+ run_in_sequence(strategy.prepend_thread_unsafe_tests, &blk) +
22
+ run_in_parallel(strategy.parallel_tests_and_groups, &blk) +
17
23
  run_in_sequence(strategy.thread_unsafe_tests, &blk)
18
24
  end
19
25
 
@@ -0,0 +1,41 @@
1
+ class TLDR
2
+ module PathUtil
3
+ def self.expand_search_locations path_strings
4
+ path_strings.flat_map { |path_string|
5
+ File.directory?(path_string) ? Dir["#{path_string}/**/*.rb"] : path_string
6
+ }.flat_map { |path_string|
7
+ absolute_path = File.expand_path(path_string.gsub(/:.*$/, ""), Dir.pwd)
8
+ line_numbers = path_string.scan(/:(\d+)/).flatten.map(&:to_i)
9
+
10
+ if line_numbers.any?
11
+ line_numbers.map { |line_number| Location.new absolute_path, line_number }
12
+ else
13
+ [Location.new(absolute_path, nil)]
14
+ end
15
+ }.uniq
16
+ end
17
+
18
+ # Because search paths to TLDR can include line numbers (e.g. a.rb:4), we
19
+ # can't just pass everything to Dir.glob. Instead, we have to check whether
20
+ # a user-provided search path looks like a glob, and if so, expand it
21
+ #
22
+ # Globby characters specified here:
23
+ # https://ruby-doc.org/3.2.2/Dir.html#method-c-glob
24
+ def self.expand_globs search_paths
25
+ search_paths.flat_map { |search_path|
26
+ if search_path.match?(/[*?\[\]{}]/)
27
+ raise Error, "Can't combine globs and line numbers in: #{search_path}" if search_path.match?(/:(\d+)$/)
28
+ Dir[search_path]
29
+ else
30
+ search_path
31
+ end
32
+ }
33
+ end
34
+
35
+ def self.locations_include_test? locations, test
36
+ locations.any? { |location|
37
+ location.file == test.file && (location.line.nil? || test.covers_line?(location.line))
38
+ }
39
+ end
40
+ end
41
+ end
data/lib/tldr/planner.rb CHANGED
@@ -3,7 +3,7 @@ require "pathname"
3
3
  class TLDR
4
4
  class Planner
5
5
  def plan config
6
- search_locations = expand_search_locations config.paths
6
+ search_locations = PathUtil.expand_search_locations config.paths
7
7
 
8
8
  prepend_load_paths config
9
9
  require_test_helper config
@@ -32,21 +32,6 @@ class TLDR
32
32
 
33
33
  private
34
34
 
35
- def expand_search_locations path_strings
36
- path_strings.flat_map { |path_string|
37
- File.directory?(path_string) ? Dir["#{path_string}/**/*.rb"] : path_string
38
- }.flat_map { |path_string|
39
- absolute_path = File.expand_path(path_string.gsub(/:.*$/, ""), Dir.pwd)
40
- line_numbers = path_string.scan(/:(\d+)/).flatten.map(&:to_i)
41
-
42
- if line_numbers.any?
43
- line_numbers.map { |line_number| Location.new absolute_path, line_number }
44
- else
45
- [Location.new(absolute_path, nil)]
46
- end
47
- }.uniq
48
- end
49
-
50
35
  def gather_tests
51
36
  gather_descendants(TLDR).flat_map { |subklass|
52
37
  subklass.instance_methods.grep(/^test_/).sort.map { |method|
@@ -57,9 +42,9 @@ class TLDR
57
42
 
58
43
  def prepend tests, config
59
44
  return tests if config.no_prepend
60
- prepended_locations = expand_search_locations expand_globs config.prepend_tests
45
+ prepended_locations = PathUtil.expand_search_locations PathUtil.expand_globs config.prepend_paths
61
46
  prepended, rest = tests.partition { |test|
62
- locations_include_test? prepended_locations, test
47
+ PathUtil.locations_include_test? prepended_locations, test
63
48
  }
64
49
  prepended + rest
65
50
  end
@@ -69,11 +54,11 @@ class TLDR
69
54
  end
70
55
 
71
56
  def exclude_by_path tests, exclude_paths
72
- excluded_locations = expand_search_locations expand_globs exclude_paths
57
+ excluded_locations = PathUtil.expand_search_locations PathUtil.expand_globs exclude_paths
73
58
  return tests if excluded_locations.empty?
74
59
 
75
60
  tests.reject { |test|
76
- locations_include_test? excluded_locations, test
61
+ PathUtil.locations_include_test? excluded_locations, test
77
62
  }
78
63
  end
79
64
 
@@ -94,7 +79,7 @@ class TLDR
94
79
  return tests if line_specific_locations.empty?
95
80
 
96
81
  tests.select { |test|
97
- locations_include_test? line_specific_locations, test
82
+ PathUtil.locations_include_test? line_specific_locations, test
98
83
  }
99
84
  end
100
85
 
@@ -133,29 +118,6 @@ class TLDR
133
118
  }
134
119
  end
135
120
 
136
- def locations_include_test? locations, test
137
- locations.any? { |location|
138
- location.file == test.file && (location.line.nil? || test.covers_line?(location.line))
139
- }
140
- end
141
-
142
- # Because search paths to TLDR can include line numbers (e.g. a.rb:4), we
143
- # can't just pass everything to Dir.glob. Instead, we have to check whether
144
- # a user-provided search path looks like a glob, and if so, expand it
145
- #
146
- # Globby characters specified here:
147
- # https://ruby-doc.org/3.2.2/Dir.html#method-c-glob
148
- def expand_globs search_paths
149
- search_paths.flat_map { |search_path|
150
- if search_path.match?(/[*?\[\]{}]/)
151
- raise Error, "Can't combine globs and line numbers in: #{search_path}" if search_path.match?(/:(\d+)$/)
152
- Dir[search_path]
153
- else
154
- search_path
155
- end
156
- }
157
- end
158
-
159
121
  def expand_names_with_patterns names
160
122
  names.map { |name|
161
123
  if name.is_a?(String) && name =~ /^\/(.*)\/$/
data/lib/tldr/rake.rb CHANGED
@@ -1,4 +1,41 @@
1
- desc "Run tests with TLDR (use TLDR_OPTS or .tldr.yml to configure)"
2
- task :tldr do
3
- fail unless system "#{"bundle exec " if defined?(Bundler)}tldr #{ENV["TLDR_OPTS"]}"
1
+ require "rake"
2
+ require "shellwords"
3
+
4
+ require "tldr"
5
+
6
+ class TLDR
7
+ class Task
8
+ include Rake::DSL
9
+
10
+ def initialize(name: "tldr", config: Config.new)
11
+ define name, config
12
+ end
13
+
14
+ private
15
+
16
+ def define name, task_config
17
+ desc "Run #{name} tests (use TLDR_OPTS or .tldr.yml to configure)"
18
+ task name do
19
+ cli_args = build_cli_args(task_config)
20
+ fail unless system "#{"bundle exec " if defined?(Bundler)}tldr #{cli_args}"
21
+ end
22
+ end
23
+
24
+ def build_cli_args task_config
25
+ config = if ENV["TLDR_OPTS"]
26
+ env_argv = Shellwords.shellwords(ENV["TLDR_OPTS"])
27
+ opts_config = ArgvParser.new.parse(env_argv, {
28
+ config_intended_for_merge_only: true
29
+ })
30
+ task_config.merge(opts_config)
31
+ else
32
+ task_config
33
+ end
34
+
35
+ config.to_full_args
36
+ end
37
+ end
4
38
  end
39
+
40
+ # Create the default tldr task for users
41
+ TLDR::Task.new
@@ -9,7 +9,7 @@ class TLDR
9
9
  def before_suite tests
10
10
  @suite_start_time = Process.clock_gettime Process::CLOCK_MONOTONIC, :microsecond
11
11
  @out.print <<~MSG
12
- Command: #{tldr_command} #{@config.to_full_args}
12
+ Command: #{tldr_command} #{@config.to_full_args}#{"\n#{@icons.seed} #{CONFLAGS[:seed]} #{@config.seed}" unless @config.seed_set_intentionally}
13
13
 
14
14
  #{@icons.run} Running:
15
15
 
@@ -43,6 +43,10 @@ module IconProvider
43
43
  def rock_on
44
44
  ""
45
45
  end
46
+
47
+ def seed
48
+ ""
49
+ end
46
50
  end
47
51
 
48
52
  class Emoji < Base
@@ -89,5 +93,9 @@ module IconProvider
89
93
  def rock_on
90
94
  "🤘"
91
95
  end
96
+
97
+ def seed
98
+ "🌱"
99
+ end
92
100
  end
93
101
  end
data/lib/tldr/runner.rb CHANGED
@@ -34,7 +34,7 @@ class TLDR
34
34
  end
35
35
  }
36
36
 
37
- results = @parallelizer.parallelize(plan.tests, config.parallel) { |test|
37
+ results = @parallelizer.parallelize(plan.tests, config) { |test|
38
38
  e = nil
39
39
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :microsecond)
40
40
  wip_test = WIPTest.new test, start_time
@@ -1,6 +1,6 @@
1
1
  class TLDR
2
2
  class Strategizer
3
- Strategy = Struct.new :parallel_tests_and_groups, :thread_unsafe_tests
3
+ Strategy = Struct.new :prepend_thread_unsafe_tests, :parallel_tests_and_groups, :thread_unsafe_tests
4
4
 
5
5
  # Combine all discovered test methods with any methods grouped by run_these_together!
6
6
  #
@@ -8,13 +8,13 @@ class TLDR
8
8
  # - Map over tests to build out groups in order to retain shuffle order
9
9
  # (group will run in position of first test in the group)
10
10
  # - If a test is in multiple groups, only run it once
11
- def strategize all_tests, run_these_together_groups, thread_unsafe_test_groups
11
+ def strategize all_tests, run_these_together_groups, thread_unsafe_test_groups, prepend_paths
12
12
  thread_unsafe_tests, thread_safe_tests = partition_unsafe(all_tests, thread_unsafe_test_groups)
13
+ prepend_thread_unsafe_tests, thread_unsafe_tests = partition_prepend(thread_unsafe_tests, prepend_paths)
13
14
 
14
15
  grouped_tests = prepare_run_together_groups run_these_together_groups, thread_safe_tests, thread_unsafe_tests
15
16
  already_included_groups = []
16
-
17
- Strategy.new thread_safe_tests.map { |test|
17
+ Strategy.new prepend_thread_unsafe_tests, thread_safe_tests.map { |test|
18
18
  if (group = grouped_tests.find { |group| group.tests.include? test })
19
19
  if already_included_groups.include? group
20
20
  next
@@ -39,6 +39,16 @@ class TLDR
39
39
  }
40
40
  end
41
41
 
42
+ # Sadly duplicative with Planner.rb, necessitating the extraction of PathUtil
43
+ # Suboptimal, but we do indeed need to do this work in two places ¯\_(ツ)_/¯
44
+ def partition_prepend thread_unsafe_tests, prepend_paths
45
+ locations = PathUtil.expand_search_locations PathUtil.expand_globs prepend_paths
46
+
47
+ thread_unsafe_tests.partition { |test|
48
+ PathUtil.locations_include_test? locations, test
49
+ }
50
+ end
51
+
42
52
  def prepare_run_together_groups run_these_together_groups, thread_safe_tests, thread_unsafe_tests
43
53
  grouped_tests = run_these_together_groups.map(&:dup)
44
54
 
@@ -10,7 +10,7 @@ class TLDR
10
10
  names: "--name",
11
11
  fail_fast: "--fail-fast",
12
12
  no_emoji: "--no-emoji",
13
- prepend_tests: "--prepend",
13
+ prepend_paths: "--prepend",
14
14
  no_prepend: "--no-prepend",
15
15
  exclude_paths: "--exclude-path",
16
16
  exclude_names: "--exclude-name",
@@ -19,25 +19,35 @@ class TLDR
19
19
  paths: nil
20
20
  }.freeze
21
21
 
22
- PATH_FLAGS = [:paths, :helper, :load_paths, :prepend_tests, :exclude_paths].freeze
22
+ PATH_FLAGS = [:paths, :helper, :load_paths, :prepend_paths, :exclude_paths].freeze
23
23
  MOST_RECENTLY_MODIFIED_TAG = "MOST_RECENTLY_MODIFIED".freeze
24
24
 
25
25
  Config = Struct.new :paths, :seed, :no_helper, :verbose, :reporter,
26
26
  :helper, :load_paths, :parallel, :names, :fail_fast, :no_emoji,
27
- :prepend_tests, :no_prepend, :exclude_paths, :exclude_names, :base_path,
27
+ :prepend_paths, :no_prepend, :exclude_paths, :exclude_names, :base_path,
28
28
  :no_dotfile,
29
- :seed_set_intentionally, :cli_mode, keyword_init: true do
29
+ # Internal properties
30
+ :config_intended_for_merge_only, :seed_set_intentionally, :cli_defaults,
31
+ keyword_init: true do
30
32
  def initialize(**args)
31
- change_working_directory_because_i_am_bad_and_i_should_feel_bad!(args[:base_path])
32
- args = merge_dotfile_args(args) unless args[:no_dotfile]
33
+ unless args[:config_intended_for_merge_only]
34
+ change_working_directory_because_i_am_bad_and_i_should_feel_bad!(args[:base_path])
35
+ args = merge_dotfile_args(args) unless args[:no_dotfile]
36
+ end
37
+ args = undefault_parallel_if_seed_set(args)
38
+ unless args[:config_intended_for_merge_only]
39
+ args = merge_defaults(args)
40
+ end
33
41
 
34
- super(**merge_defaults(args))
42
+ super(**args)
35
43
  end
36
44
 
37
- # Must be set when the Config is first initialized
38
- undef_method :cli_mode=, :no_dotfile=, :base_path=
45
+ # These are for internal tracking and resolved at initialization-time
46
+ undef_method :config_intended_for_merge_only=, :seed_set_intentionally=,
47
+ # These must be set when the Config is first initialized
48
+ :cli_defaults=, :no_dotfile=, :base_path=
39
49
 
40
- def self.build_defaults(cli_mode = false)
50
+ def self.build_defaults cli_defaults: true
41
51
  common = {
42
52
  seed: rand(10_000),
43
53
  no_helper: false,
@@ -53,36 +63,36 @@ class TLDR
53
63
  base_path: nil
54
64
  }
55
65
 
56
- if cli_mode
66
+ if cli_defaults
57
67
  common.merge(
58
68
  paths: Dir["test/**/*_test.rb", "test/**/test_*.rb"],
59
69
  helper: "test/helper.rb",
60
70
  load_paths: ["test"],
61
- prepend_tests: [MOST_RECENTLY_MODIFIED_TAG]
71
+ prepend_paths: [MOST_RECENTLY_MODIFIED_TAG]
62
72
  )
63
73
  else
64
74
  common.merge(
65
75
  paths: [],
66
76
  helper: nil,
67
77
  load_paths: [],
68
- prepend_tests: []
78
+ prepend_paths: []
69
79
  )
70
80
  end
71
81
  end
72
82
 
73
- def merge_defaults(user_args)
74
- merged_args = user_args.dup
75
- defaults = Config.build_defaults(merged_args[:cli_mode])
76
- merged_args[:seed_set_intentionally] = !merged_args[:seed].nil?
83
+ def undefault_parallel_if_seed_set args
84
+ args.merge(
85
+ seed_set_intentionally: !args[:seed].nil?,
86
+ parallel: (args[:parallel].nil? ? args[:seed].nil? : args[:parallel])
87
+ )
88
+ end
77
89
 
78
- # Special cases
79
- if merged_args[:parallel].nil?
80
- # Disable parallelization if seed is set
81
- merged_args[:parallel] = merged_args[:seed].nil?
82
- end
90
+ def merge_defaults user_args
91
+ merged_args = user_args.dup
92
+ defaults = Config.build_defaults(cli_defaults: merged_args[:cli_defaults])
83
93
 
84
94
  # Arrays
85
- [:paths, :load_paths, :names, :prepend_tests, :exclude_paths, :exclude_names].each do |key|
95
+ [:paths, :load_paths, :names, :prepend_paths, :exclude_paths, :exclude_names].each do |key|
86
96
  merged_args[key] = defaults[key] if merged_args[key].nil? || merged_args[key].empty?
87
97
  end
88
98
 
@@ -99,13 +109,21 @@ class TLDR
99
109
  merged_args
100
110
  end
101
111
 
112
+ def merge other
113
+ this_config = to_h
114
+ kwargs = this_config.merge(
115
+ other.to_h.compact.except(:config_intended_for_merge_only)
116
+ )
117
+ Config.new(**kwargs)
118
+ end
119
+
102
120
  # We needed this hook (to be called by the planner), because we can't know
103
121
  # the default prepend location until we have all the resolved test paths,
104
122
  # so we have to mutate it after the fact.
105
123
  def update_after_gathering_tests! tests
106
- return unless prepend_tests.include?(MOST_RECENTLY_MODIFIED_TAG)
124
+ return unless prepend_paths.include?(MOST_RECENTLY_MODIFIED_TAG)
107
125
 
108
- self.prepend_tests = prepend_tests.map { |path|
126
+ self.prepend_paths = prepend_paths.map { |path|
109
127
  if path == MOST_RECENTLY_MODIFIED_TAG
110
128
  most_recently_modified_test_file tests
111
129
  else
@@ -115,12 +133,17 @@ class TLDR
115
133
  end
116
134
 
117
135
  def to_full_args(exclude: [])
118
- to_cli_argv(CONFLAGS.keys - exclude).join(" ")
136
+ to_cli_argv(
137
+ CONFLAGS.keys -
138
+ exclude - [
139
+ (:seed unless seed_set_intentionally)
140
+ ]
141
+ ).join(" ")
119
142
  end
120
143
 
121
144
  def to_single_path_args(path)
122
145
  argv = to_cli_argv(CONFLAGS.keys - [
123
- :seed, :parallel, :names, :fail_fast, :paths, :prepend_tests,
146
+ :seed, :parallel, :names, :fail_fast, :paths, :prepend_paths,
124
147
  :no_prepend, :exclude_paths
125
148
  ])
126
149
 
@@ -129,14 +152,14 @@ class TLDR
129
152
 
130
153
  private
131
154
 
132
- def to_cli_argv(options = CONFLAGS.keys)
133
- defaults = Config.build_defaults(cli_mode)
155
+ def to_cli_argv options = CONFLAGS.keys
156
+ defaults = Config.build_defaults(cli_defaults: true)
134
157
  options.map { |key|
135
158
  flag = CONFLAGS[key]
136
159
 
137
160
  # Special cases
138
- if key == :prepend_tests
139
- if prepend_tests.map { |s| stringify(key, s) }.sort == paths.map { |s| stringify(:paths, s) }.sort
161
+ if key == :prepend_paths
162
+ if prepend_paths.map { |s| stringify(key, s) }.sort == paths.map { |s| stringify(:paths, s) }.sort
140
163
  # Don't print prepended tests if they're the same as the test paths
141
164
  next
142
165
  elsif no_prepend
data/lib/tldr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class TLDR
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/tldr.rb CHANGED
@@ -6,6 +6,7 @@ require_relative "tldr/backtrace_filter"
6
6
  require_relative "tldr/error"
7
7
  require_relative "tldr/parallel_controls"
8
8
  require_relative "tldr/parallelizer"
9
+ require_relative "tldr/path_util"
9
10
  require_relative "tldr/planner"
10
11
  require_relative "tldr/reporters"
11
12
  require_relative "tldr/runner"
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.4.0
4
+ version: 0.5.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-27 00:00:00.000000000 Z
12
+ date: 2023-09-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: super_diff
@@ -62,6 +62,7 @@ files:
62
62
  - lib/tldr/error.rb
63
63
  - lib/tldr/parallel_controls.rb
64
64
  - lib/tldr/parallelizer.rb
65
+ - lib/tldr/path_util.rb
65
66
  - lib/tldr/planner.rb
66
67
  - lib/tldr/rake.rb
67
68
  - lib/tldr/reporters.rb
@@ -105,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
106
  - !ruby/object:Gem::Version
106
107
  version: '0'
107
108
  requirements: []
108
- rubygems_version: 3.4.17
109
+ rubygems_version: 3.4.6
109
110
  signing_key:
110
111
  specification_version: 4
111
112
  summary: TLDR will run your tests, but only for 1.8 seconds.