cuke_slicer 2.2.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -1
  3. data/LICENSE.txt +1 -1
  4. data/README.md +18 -10
  5. data/cuke_slicer.gemspec +34 -19
  6. data/lib/cuke_slicer/collections/nested_tag_collection.rb +6 -4
  7. data/lib/cuke_slicer/collections/path_collection.rb +4 -2
  8. data/lib/cuke_slicer/collections/tag_collection.rb +6 -4
  9. data/lib/cuke_slicer/extractors/directory_extractor.rb +3 -1
  10. data/lib/cuke_slicer/extractors/file_extractor.rb +11 -4
  11. data/lib/cuke_slicer/filters/filter_set.rb +12 -10
  12. data/lib/cuke_slicer/helpers/extraction_helpers.rb +11 -5
  13. data/lib/cuke_slicer/helpers/filter_helpers.rb +36 -30
  14. data/lib/cuke_slicer/helpers/helpers.rb +5 -4
  15. data/lib/cuke_slicer/helpers/matching_helpers.rb +12 -7
  16. data/lib/cuke_slicer/slicer.rb +16 -20
  17. data/lib/cuke_slicer/version.rb +1 -1
  18. data/lib/cuke_slicer.rb +2 -2
  19. data/{features → testing/cucumber/features}/test_case_extraction.feature +22 -0
  20. metadata +79 -57
  21. data/.gitignore +0 -24
  22. data/.simplecov +0 -7
  23. data/.travis.yml +0 -33
  24. data/Gemfile +0 -4
  25. data/Rakefile +0 -85
  26. data/appveyor.yml +0 -81
  27. data/features/step_definitions/action_steps.rb +0 -107
  28. data/features/step_definitions/setup_steps.rb +0 -103
  29. data/features/step_definitions/verification_steps.rb +0 -58
  30. data/features/support/env.rb +0 -18
  31. data/gemfiles/cuke_modeler0.gemfile +0 -28
  32. data/gemfiles/cuke_modeler1.gemfile +0 -29
  33. data/gemfiles/cuke_modeler2.gemfile +0 -29
  34. data/gemfiles/cuke_modeler3.gemfile +0 -12
  35. data/spec/cuke_slicer_spec.rb +0 -28
  36. data/spec/slicer_integration_spec.rb +0 -279
  37. data/spec/slicer_unit_spec.rb +0 -37
  38. data/spec/spec_helper.rb +0 -22
  39. /data/{features → testing/cucumber/features}/tag_logic.feature +0 -0
  40. /data/{features → testing/cucumber/features}/test_case_filtering.feature +0 -0
  41. /data/{features → testing/cucumber/features}/validation.feature +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c69098207d6d5580577ecad5469270b5cbec21138e66739d74815ed0a4442ab3
4
- data.tar.gz: 5dd474604bdddeddf0f02ffebec61b6af2a9319f48bc8b8e10f37a94cb7459d0
3
+ metadata.gz: fa79b66cbc3e85e4d8a532123fe92ed2431da5435fc28617c171b891ba850b2e
4
+ data.tar.gz: 58106b978a4a83ac08e4f16b1c99f3c3c230170bb4273d2d6e634cefa2a40b8d
5
5
  SHA512:
6
- metadata.gz: 213337d4665b2c5b329c9335fde6afc0af9dbe4031a626eb45eba6acce31924f1df00cbb83a55cfd756dabea379b06c515a4633ff5ee3657170f8e4520acce5d
7
- data.tar.gz: cd6e817e1a30de5700bb11f47435a08af612cc7fb218bf07e1f8522d21a3f00eb1578423cb56fbeff136fd38cc36cec310774cbf2a8a223a27ebef202026fe4a
6
+ metadata.gz: 3bd5f29074a87dcc620347623feaca14023b1399ea56dc71bdebc1067e2b063a4a705ed3711b4c3f881acf33ce793a51eb7ef72902ce48d25a39a30097da2fcd
7
+ data.tar.gz: b69b1759f3aeab9c16bc9521280e6e12b9757ccfcc6960b60b46dec88352a51b2b14e729265f05f11597e14513dd1d1c3a1b56b42e93d978f085b5858f1b37d9
data/CHANGELOG.md CHANGED
@@ -8,6 +8,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
 
9
9
  Nothing yet...
10
10
 
11
+
12
+ ## [3.0.0] - 2024-03-17
13
+
14
+ ### Added
15
+ - Tests inside of `Rule` elements are now taken into account when slicing.
16
+
17
+ ### Removed
18
+ - Removed support for some older versions of the gem's dependencies:
19
+ - CukeModeler `0.x`, CukeModeler `1.x`, and CukeModeler `2.x`. Slicing features with `Rule` elements requires at
20
+ least CukeModeler `3.x`, because that is the major version that first modeled rules.
21
+ - Ruby `1.x`. Testing against older Rubies in the current CI ecosystem has become too burdensome and Ruby `1.x` is
22
+ long past end-of-life. Additionally, CukeModeler `3.x` requires at least Ruby `2.x`.
23
+
24
+ ### Changed
25
+ - No longer including every file in the Git repository as part of the gem. Only the files needed for using the
26
+ gem (and the informative ones like the README) will be packaged into the released gem.
27
+
11
28
  ## [2.2.0] - 2021-01-07
12
29
 
13
30
  ### Added
@@ -57,7 +74,8 @@ Nothing yet...
57
74
 
58
75
  - Initial release
59
76
 
60
- [Unreleased]: https://github.com/enkessler/cuke_slicer/compare/v2.2.0...HEAD
77
+ [Unreleased]: https://github.com/enkessler/cuke_slicer/compare/v3.0.0...HEAD
78
+ [3.0.0]: https://github.com/enkessler/cuke_slicer/compare/v2.2.0...v3.0.0
61
79
  [2.2.0]: https://github.com/enkessler/cuke_slicer/compare/v2.1.0...v2.2.0
62
80
  [2.1.0]: https://github.com/enkessler/cuke_slicer/compare/v2.0.3...v2.1.0
63
81
  [2.0.3]: https://github.com/enkessler/cuke_slicer/compare/v2.0.2...v2.0.3
data/LICENSE.txt CHANGED
@@ -1,5 +1,5 @@
1
1
  Copyright (c) 2015-2019 Grange Insurance
2
- Copyright (c) 2020 Eric Kessler
2
+ Copyright (c) 2020-2024 Eric Kessler
3
3
 
4
4
  MIT License
5
5
 
data/README.md CHANGED
@@ -4,13 +4,13 @@ Basic stuff:
4
4
  [![Downloads](https://img.shields.io/gem/dt/cuke_slicer.svg)](https://rubygems.org/gems/cuke_slicer)
5
5
 
6
6
  User stuff:
7
+ [![Cucumber Docs](http://img.shields.io/badge/Documentation-Features-green.svg)](https://github.com/enkessler/cuke_slicer/tree/master/testing/cucumber/features)
7
8
  [![Yard Docs](http://img.shields.io/badge/Documentation-API-blue.svg)](https://www.rubydoc.info/gems/cuke_slicer)
8
9
 
9
10
  Developer stuff:
10
- [![Build Status](https://travis-ci.org/enkessler/cuke_slicer.svg)](https://travis-ci.org/enkessler/cuke_slicer)
11
- [![Build status](https://ci.appveyor.com/api/projects/status/706c8x5ug897wq3x?svg=true)](https://ci.appveyor.com/project/enkessler/cuke-slicer)
12
- [![Coverage Status](https://coveralls.io/repos/github/enkessler/cuke_slicer/badge.svg)](https://coveralls.io/github/enkessler/cuke_slicer)
13
- [![Maintainability](https://codeclimate.com/github/enkessler/cuke_slicer/badges/gpa.svg)](https://codeclimate.com/github/enkessler/cuke_slicer/maintainability)
11
+ [![Build Status](https://github.com/enkessler/cuke_slicer/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/enkessler/cuke_slicer/actions/workflows/ci.yml?query=branch%3Amaster)
12
+ [![Coverage Status](https://coveralls.io/repos/github/enkessler/cuke_slicer/badge.svg?branch=master)](https://coveralls.io/github/enkessler/cuke_slicer?branch=master)
13
+ [![Maintainability](https://api.codeclimate.com/v1/badges/14c5ad2f8583be273418/maintainability)](https://codeclimate.com/github/enkessler/cuke_slicer/maintainability)
14
14
 
15
15
  ---
16
16
 
@@ -60,11 +60,19 @@ Or install it yourself as:
60
60
 
61
61
  system('cucumber @tests_to_run.txt')
62
62
 
63
+ In addition to tag and path filters, a block can be used for filtering tests by inspecting the
64
+ underlying CukeModeler models that represent test cases and filtering on whatever criteria you can think up.
63
65
 
64
- ## Contributing
66
+ CukeSlicer::Slicer.new.slice(test_directory, {}, :file_line) do |test_case|
67
+ test_case.is_a?(CukeModeler::Scenario) &&
68
+ test_case.get_ancestor(:feature).name =~ /first/
69
+ end
65
70
 
66
- 1. Fork it ( https://github.com/[my-github-username]/cuke_slicer/fork )
67
- 2. Create your feature branch (`git checkout -b my-new-feature`)
68
- 3. Commit your changes (`git commit -am 'Add some feature'`)
69
- 4. Push to the branch (`git push origin my-new-feature`)
70
- 5. Create a new Pull Request
71
+
72
+ ## Development and Contributing
73
+
74
+ See [CONTRIBUTING.md](https://github.com/enkessler/cuke_slicer/blob/master/CONTRIBUTING.md)
75
+
76
+ ## License
77
+
78
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/cuke_slicer.gemspec CHANGED
@@ -1,34 +1,49 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'cuke_slicer/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "cuke_slicer"
6
+ spec.name = 'cuke_slicer'
8
7
  spec.version = CukeSlicer::VERSION
9
- spec.authors = ["Eric Kessler"]
10
- spec.email = ["morrow748@gmail.com"]
11
- spec.summary = %q{A gem for extracting test cases from a Cucumber test suite.}
12
- spec.description = %q{Slices a Cucumber test suite into the smallest possible executable pieces (i.e. scenarios and individual outline example rows. These pieces can then be more easily used for running tests in parallel.}
13
- spec.homepage = "https://github.com/enkessler/cuke_slicer"
14
- spec.license = "MIT"
8
+ spec.authors = ['Eric Kessler']
9
+ spec.email = ['morrow748@gmail.com']
10
+ spec.summary = 'A gem for extracting test cases from a Cucumber test suite.'
11
+ spec.description = ['Slices a Cucumber test suite into the smallest possible executable pieces (i.e. scenarios ',
12
+ 'and individual outline example rows. These pieces can then be more easily used for running ',
13
+ 'tests in parallel.'].join
14
+ spec.homepage = 'https://github.com/enkessler/cuke_slicer'
15
+ spec.license = 'MIT'
15
16
 
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
17
+ spec.metadata = {
18
+ 'bug_tracker_uri' => 'https://github.com/enkessler/cuke_slicer/issues',
19
+ 'changelog_uri' => 'https://github.com/enkessler/cuke_slicer/blob/master/CHANGELOG.md',
20
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/cuke_slicer',
21
+ 'homepage_uri' => 'https://github.com/enkessler/cuke_slicer',
22
+ 'source_code_uri' => 'https://github.com/enkessler/cuke_slicer'
23
+ }
20
24
 
21
- spec.required_ruby_version = '>= 1.9.3', '< 4.0'
25
+ # Specify which files should be added to the gem when it is released.
26
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ spec.files = Dir.chdir(File.expand_path('', __dir__)) do
28
+ source_controlled_files = `git ls-files -z`.split("\x0")
29
+ source_controlled_files.keep_if { |file| file =~ %r{^(lib|testing/cucumber/features)} }
30
+ source_controlled_files + ['README.md', 'LICENSE.txt', 'CHANGELOG.md', 'cuke_slicer.gemspec']
31
+ end
32
+ spec.require_paths = ['lib']
22
33
 
23
- spec.add_runtime_dependency "cuke_modeler", "< 4.0"
34
+ spec.required_ruby_version = '>= 2.3', '< 4.0'
24
35
 
36
+ spec.add_runtime_dependency 'cuke_modeler', '>= 3.2', '< 4.0'
37
+
38
+ spec.add_development_dependency 'childprocess', '< 5.0'
39
+ spec.add_development_dependency 'ffi', '< 2.0' # This is an invisible dependency for the `childprocess` gem on Windows
25
40
  spec.add_development_dependency 'bundler', '< 3.0'
26
41
  spec.add_development_dependency 'rake', '< 13.0.0'
27
- spec.add_development_dependency "rspec", '~> 3.0'
42
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
43
  spec.add_development_dependency 'cucumber', '< 5.0.0'
29
- spec.add_development_dependency 'simplecov', '<= 0.16.1' # Coveralls gem does not support any newer version than this
30
- spec.add_development_dependency "racatt", '~> 1.0'
31
- spec.add_development_dependency 'coveralls', '< 1.0.0'
44
+ spec.add_development_dependency 'simplecov', '< 1.0.0'
45
+ spec.add_development_dependency 'simplecov-lcov', '< 1.0'
32
46
  spec.add_development_dependency 'rainbow', '< 4.0.0'
33
-
47
+ spec.add_development_dependency 'rubocop', '<= 0.50.0' # RuboCop can not lint against Ruby 2.0 after this version
48
+ spec.add_development_dependency 'yard', '< 1.0'
34
49
  end
@@ -1,22 +1,24 @@
1
- require "cuke_slicer/helpers/helpers"
1
+ require 'cuke_slicer/helpers/helpers'
2
2
 
3
3
 
4
4
  # Internal helper module that is not part of the public API. Subject to change at any time.
5
5
  # :nodoc: all
6
6
  module CukeSlicer
7
+ # private
7
8
  class NestedTagCollection
8
9
 
9
10
  include Helpers
10
11
 
11
12
 
12
- def initialize collection
13
+ def initialize(collection)
13
14
  self.nested_collection = collection
14
15
  end
15
16
 
17
+ # private
16
18
  def validate
17
19
  nested_collection.each do |element|
18
- raise(ArgumentError, "Tag filters cannot be nested more than one level deep.") if element.is_a?(Array)
19
- raise(ArgumentError, "Filter '#{element}' must be a String or Regexp. Got #{element.class}") unless str_regex?(element)
20
+ raise(ArgumentError, 'Tag filters cannot be nested more than one level deep.') if element.is_a?(Array)
21
+ raise(ArgumentError, "Filter '#{element}' must be a String or Regexp. Got #{element.class}") unless str_regex?(element) # rubocop:disable Metrics/LineLength
20
22
  end
21
23
  end
22
24
 
@@ -1,18 +1,20 @@
1
- require "cuke_slicer/helpers/helpers"
1
+ require 'cuke_slicer/helpers/helpers'
2
2
 
3
3
 
4
4
  # Internal helper module that is not part of the public API. Subject to change at any time.
5
5
  # :nodoc: all
6
6
  module CukeSlicer
7
+ # private
7
8
  class PathCollection
8
9
 
9
10
  include Helpers
10
11
 
11
12
 
12
- def initialize filter_values
13
+ def initialize(filter_values)
13
14
  self.filter_values = filter_values
14
15
  end
15
16
 
17
+ # private
16
18
  def validate
17
19
  filter_values.each do |val|
18
20
  raise(ArgumentError, "Filter '#{val}' must be a String or Regexp. Got #{val.class}") unless str_regex?(val)
@@ -1,22 +1,24 @@
1
- require "cuke_slicer/helpers/helpers"
2
- require "cuke_slicer/collections/nested_tag_collection"
1
+ require 'cuke_slicer/helpers/helpers'
2
+ require 'cuke_slicer/collections/nested_tag_collection'
3
3
 
4
4
 
5
5
  # Internal helper module that is not part of the public API. Subject to change at any time.
6
6
  # :nodoc: all
7
7
  module CukeSlicer
8
+ # private
8
9
  class TagCollection
9
10
 
10
11
  include Helpers
11
12
 
12
13
 
13
- def initialize parameters
14
+ def initialize(parameters)
14
15
  self.filter_values = parameters
15
16
  end
16
17
 
18
+ # private
17
19
  def validate
18
20
  filter_values.each do |val|
19
- raise(ArgumentError, "Filter '#{val}' must be a String, Regexp, or Array. Got #{val.class}") unless str_regex_arr?(val)
21
+ raise(ArgumentError, "Filter '#{val}' must be a String, Regexp, or Array. Got #{val.class}") unless str_regex_arr?(val) # rubocop:disable Metrics/LineLength
20
22
  NestedTagCollection.new(val).validate if val.is_a?(Array)
21
23
  end
22
24
  end
@@ -1,10 +1,12 @@
1
1
  # Internal helper module that is not part of the public API. Subject to change at any time.
2
2
  # :nodoc: all
3
3
  module CukeSlicer
4
+ # private
4
5
  class DirectoryExtractor
5
6
 
7
+ # private
6
8
  def extract(target, filters, format, &block)
7
- Array.new.tap do |test_cases|
9
+ [].tap do |test_cases|
8
10
  target.feature_files.each do |feature_file|
9
11
  test_cases.concat(FileExtractor.new.extract(feature_file, filters, format, &block))
10
12
  end
@@ -1,20 +1,25 @@
1
- require "cuke_slicer/helpers/matching_helpers"
2
- require "cuke_slicer/helpers/filter_helpers"
3
- require "cuke_slicer/helpers/extraction_helpers"
1
+ require 'cuke_slicer/helpers/matching_helpers'
2
+ require 'cuke_slicer/helpers/filter_helpers'
3
+ require 'cuke_slicer/helpers/extraction_helpers'
4
4
 
5
+ # TODO: get rid of this class
6
+ # rubocop:disable Metrics/AbcSize
5
7
 
6
8
  # Internal helper module that is not part of the public API. Subject to change at any time.
7
9
  # :nodoc: all
8
10
  module CukeSlicer
11
+ # private
9
12
  class FileExtractor
10
13
 
11
14
  include ExtractionHelpers
12
15
 
13
16
 
17
+ # private
14
18
  def extract(target, filters, format, &block)
15
- Array.new.tap do |test_cases|
19
+ [].tap do |test_cases|
16
20
  unless target.feature.nil?
17
21
  tests = target.feature.tests
22
+ tests += target.feature.rules.flat_map(&:tests)
18
23
 
19
24
  runnable_elements = extract_runnable_elements(extract_runnable_block_elements(tests, filters, &block))
20
25
 
@@ -32,3 +37,5 @@ module CukeSlicer
32
37
 
33
38
  end
34
39
  end
40
+
41
+ # rubocop:enable Metrics/AbcSize
@@ -1,29 +1,31 @@
1
- require "cuke_slicer/helpers/helpers"
2
- require "cuke_slicer/collections/tag_collection"
3
- require "cuke_slicer/collections/path_collection"
1
+ require 'cuke_slicer/helpers/helpers'
2
+ require 'cuke_slicer/collections/tag_collection'
3
+ require 'cuke_slicer/collections/path_collection'
4
4
 
5
5
 
6
6
  # Internal helper module that is not part of the public API. Subject to change at any time.
7
7
  # :nodoc: all
8
8
  module CukeSlicer
9
+ # private
9
10
  class FilterSet
10
11
 
11
12
  include Helpers
12
13
 
13
14
 
14
- def initialize filter_type, filter_value
15
+ def initialize(filter_type, filter_value)
15
16
  self.filter_type = filter_type
16
17
  self.filter_value = filter_value
17
18
  end
18
19
 
20
+ # private
19
21
  def validate
20
22
  block_unknown
21
23
  block_invalid
22
24
 
23
- if filter_value.is_a?(Array)
24
- TagCollection.new(filter_value).validate if is_tag?(filter_type)
25
- PathCollection.new(filter_value).validate if is_path?(filter_type)
26
- end
25
+ return unless filter_value.is_a?(Array)
26
+
27
+ TagCollection.new(filter_value).validate if tag?(filter_type)
28
+ PathCollection.new(filter_value).validate if path?(filter_type)
27
29
  end
28
30
 
29
31
 
@@ -31,11 +33,11 @@ module CukeSlicer
31
33
 
32
34
 
33
35
  def block_unknown
34
- raise(ArgumentError, "Unknown filter '#{filter_type}'") unless CukeSlicer::Slicer.known_filters.include?(filter_type)
36
+ raise(ArgumentError, "Unknown filter '#{filter_type}'") unless CukeSlicer::Slicer.known_filters.include?(filter_type) # rubocop:disable Metrics/LineLength
35
37
  end
36
38
 
37
39
  def block_invalid
38
- raise(ArgumentError, "Invalid filter '#{filter_value}'. Must be a String, Regexp, or Array thereof. Got #{filter_value.class}") unless str_regex_arr?(filter_value)
40
+ raise(ArgumentError, "Invalid filter '#{filter_value}'. Must be a String, Regexp, or Array thereof. Got #{filter_value.class}") unless str_regex_arr?(filter_value) # rubocop:disable Metrics/LineLength
39
41
  end
40
42
 
41
43
  attr_accessor :filter_type, :filter_value
@@ -1,13 +1,19 @@
1
+ # TODO: get rid of this module
2
+ # rubocop:disable Metrics/AbcSize
3
+
4
+
1
5
  # Internal helper module that is not part of the public API. Subject to change at any time.
2
6
  # :nodoc: all
3
7
  module CukeSlicer
8
+ # private
4
9
  module ExtractionHelpers
5
10
 
6
11
  include FilterHelpers
7
12
 
8
13
 
14
+ # private
9
15
  def extract_runnable_block_elements(things, filters, &block)
10
- Array.new.tap do |elements|
16
+ [].tap do |elements|
11
17
  things.each do |thing|
12
18
  if thing.is_a?(CukeModeler::Outline)
13
19
  elements.concat(thing.examples)
@@ -25,14 +31,13 @@ module CukeSlicer
25
31
  end
26
32
  end
27
33
 
34
+ # private
28
35
  def extract_runnable_elements(things)
29
- method_for_row_models = Gem.loaded_specs['cuke_modeler'].version.version[/^0/] ? :row_elements : :rows
30
-
31
- Array.new.tap do |elements|
36
+ [].tap do |elements|
32
37
  things.each do |thing|
33
38
  if thing.is_a?(CukeModeler::Example)
34
39
  # Slicing in order to remove the parameter row element
35
- elements.concat(thing.send(method_for_row_models).slice(1, thing.rows.count))
40
+ elements.concat(thing.rows.slice(1, thing.rows.count))
36
41
  else
37
42
  elements << thing
38
43
  end
@@ -42,3 +47,4 @@ module CukeSlicer
42
47
 
43
48
  end
44
49
  end
50
+ # rubocop:enable Metrics/AbcSize
@@ -1,60 +1,66 @@
1
1
  # Internal helper module that is not part of the public API. Subject to change at any time.
2
2
  # :nodoc: all
3
3
  module CukeSlicer
4
+ # private
4
5
  module FilterHelpers
5
6
 
6
7
  include MatchingHelpers
7
8
 
8
9
 
10
+ # private
9
11
  def apply_custom_filter(elements, &block)
10
- if block
11
- elements.reject! do |element|
12
- block.call(element)
13
- end
12
+ return unless block
13
+
14
+ elements.reject! do |element|
15
+ yield(element)
14
16
  end
15
17
  end
16
18
 
19
+ # private
17
20
  def filter_excluded_tags(elements, filters)
18
- if filters
19
- filters = [filters] unless filters.is_a?(Array)
20
-
21
- unless filters.empty?
22
- elements.reject! do |element|
23
- matching_tag?(element, filters)
24
- end
25
- end
21
+ return unless filters
22
+
23
+ filters = [filters] unless filters.is_a?(Array)
24
+
25
+ return if filters.empty?
26
+
27
+ elements.reject! do |element|
28
+ matching_tag?(element, filters)
26
29
  end
27
30
  end
28
31
 
32
+ # private
29
33
  def filter_included_tags(elements, filters)
30
- if filters
31
- filters = [filters] unless filters.is_a?(Array)
34
+ return unless filters
35
+
36
+ filters = [filters] unless filters.is_a?(Array)
32
37
 
33
- elements.keep_if do |element|
34
- matching_tag?(element, filters)
35
- end
38
+ elements.keep_if do |element|
39
+ matching_tag?(element, filters)
36
40
  end
37
41
  end
38
42
 
43
+ # private
39
44
  def filter_excluded_paths(elements, filters)
40
- if filters
41
- filters = [filters] unless filters.is_a?(Array)
45
+ return unless filters
42
46
 
43
- elements.reject! do |element|
44
- matching_path?(element, filters)
45
- end
47
+ filters = [filters] unless filters.is_a?(Array)
48
+
49
+ elements.reject! do |element|
50
+ matching_path?(element, filters)
46
51
  end
47
52
  end
48
53
 
54
+ # private
49
55
  def filter_included_paths(elements, filters)
50
- if filters
51
- filters = [filters] unless filters.is_a?(Array)
52
-
53
- unless filters.empty?
54
- elements.keep_if do |element|
55
- matching_path?(element, filters)
56
- end
57
- end
56
+ return unless filters
57
+
58
+ filters = [filters] unless filters.is_a?(Array)
59
+
60
+ return if filters.empty?
61
+
62
+ elements.keep_if do |element|
63
+ matching_path?(element, filters)
58
64
  end
59
65
  end
60
66
 
@@ -1,21 +1,22 @@
1
1
  # Internal helper module that is not part of the public API. Subject to change at any time.
2
2
  # :nodoc: all
3
3
  module CukeSlicer
4
+ # private
4
5
  module Helpers
5
6
 
6
7
  def str_regex?(parameter)
7
- parameter.is_a?(String) or parameter.is_a?(Regexp)
8
+ parameter.is_a?(String) || parameter.is_a?(Regexp)
8
9
  end
9
10
 
10
11
  def str_regex_arr?(parameter)
11
- parameter.is_a?(String) or parameter.is_a?(Regexp) or parameter.is_a?(Array)
12
+ parameter.is_a?(String) || parameter.is_a?(Regexp) || parameter.is_a?(Array)
12
13
  end
13
14
 
14
- def is_tag?(parameter)
15
+ def tag?(parameter)
15
16
  parameter.to_s =~ /tag/
16
17
  end
17
18
 
18
- def is_path?(parameter)
19
+ def path?(parameter)
19
20
  parameter.to_s =~ /path/
20
21
  end
21
22
 
@@ -1,15 +1,17 @@
1
1
  # Internal helper module that is not part of the public API. Subject to change at any time.
2
2
  # :nodoc: all
3
3
  module CukeSlicer
4
+ # private
4
5
  module MatchingHelpers
5
6
 
7
+ # private
6
8
  def matching_tag?(element, filters)
7
9
  filters.each do |filter|
8
- if filter.is_a?(Array)
9
- filter_match = or_filter_match(element, filter)
10
- else
11
- filter_match = and_filter_match(element, filter)
12
- end
10
+ filter_match = if filter.is_a?(Array)
11
+ or_filter_match(element, filter)
12
+ else
13
+ and_filter_match(element, filter)
14
+ end
13
15
 
14
16
  return false unless filter_match
15
17
  end
@@ -17,19 +19,21 @@ module CukeSlicer
17
19
  true
18
20
  end
19
21
 
22
+ # private
20
23
  def and_filter_match(element, filter)
21
24
  filter_match(element, filter)
22
25
  end
23
26
 
27
+ # private
24
28
  def or_filter_match(element, filters)
25
29
  filters.any? do |filter|
26
30
  filter_match(element, filter)
27
31
  end
28
32
  end
29
33
 
34
+ # private
30
35
  def filter_match(element, filter)
31
- tag_values = element.all_tags
32
- tag_values = tag_values.collect { |tag| tag.name } unless Gem.loaded_specs['cuke_modeler'].version.version[/^[0]/]
36
+ tag_values = element.all_tags.map(&:name)
33
37
 
34
38
  if filter.is_a?(Regexp)
35
39
  tag_values.any? { |tag| tag =~ filter }
@@ -38,6 +42,7 @@ module CukeSlicer
38
42
  end
39
43
  end
40
44
 
45
+ # private
41
46
  def matching_path?(element, filters)
42
47
  filters.any? do |filtered_path|
43
48
  if filtered_path.is_a?(Regexp)
@@ -1,8 +1,9 @@
1
- require "cuke_slicer/extractors/directory_extractor"
2
- require "cuke_slicer/extractors/file_extractor"
3
- require "cuke_slicer/filters/filter_set"
4
-
1
+ require 'cuke_slicer/extractors/directory_extractor'
2
+ require 'cuke_slicer/extractors/file_extractor'
3
+ require 'cuke_slicer/filters/filter_set'
5
4
 
5
+ # TODO: refactor all of this
6
+ # rubocop:disable Metrics/AbcSize, Style/OptionalArguments
6
7
  module CukeSlicer
7
8
 
8
9
  # The object responsible for slicing up a Cucumber test suite into discrete test cases.
@@ -32,29 +33,23 @@ module CukeSlicer
32
33
  begin
33
34
  target = File.directory?(target) ? CukeModeler::Directory.new(target) : CukeModeler::FeatureFile.new(target)
34
35
  rescue => e
35
- if e.message =~ /lexing|parsing/i
36
- raise(ArgumentError, "A syntax or lexing problem was encountered while trying to parse #{target}")
37
- else
38
- raise e
39
- end
40
-
36
+ raise e unless e.message =~ /lexing|parsing/i
37
+ raise(ArgumentError, "A syntax or lexing problem was encountered while trying to parse #{target}")
41
38
  end
42
39
 
43
40
  if target.is_a?(CukeModeler::Directory)
44
- sliced_tests = DirectoryExtractor.new.extract(target, filters, format, &block)
41
+ DirectoryExtractor.new.extract(target, filters, format, &block)
45
42
  else
46
- sliced_tests = FileExtractor.new.extract(target, filters, format, &block)
43
+ FileExtractor.new.extract(target, filters, format, &block)
47
44
  end
48
-
49
- sliced_tests
50
45
  end
51
46
 
52
47
  # The filtering options that are currently supported by the slicer.
53
48
  def self.known_filters
54
- [:excluded_tags,
55
- :included_tags,
56
- :excluded_paths,
57
- :included_paths]
49
+ %i[excluded_tags
50
+ included_tags
51
+ excluded_paths
52
+ included_paths]
58
53
  end
59
54
 
60
55
 
@@ -62,7 +57,7 @@ module CukeSlicer
62
57
 
63
58
 
64
59
  def validate_target(target)
65
- raise(ArgumentError, "File or directory '#{target}' does not exist") unless File.exists?(target.to_s)
60
+ raise(ArgumentError, "File or directory '#{target}' does not exist") unless File.exist?(target.to_s)
66
61
  end
67
62
 
68
63
  def validate_filters(filters)
@@ -71,8 +66,9 @@ module CukeSlicer
71
66
  end
72
67
 
73
68
  def validate_format(format)
74
- raise(ArgumentError, "Invalid Output Format: #{format}") unless [:test_object, :file_line].include?(format)
69
+ raise(ArgumentError, "Invalid Output Format: #{format}") unless %i[test_object file_line].include?(format)
75
70
  end
76
71
 
77
72
  end
78
73
  end
74
+ # rubocop:enable Metrics/AbcSize, Style/OptionalArguments