cuke_slicer 1.0.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.travis.yml +33 -0
- data/CHANGELOG.md +67 -0
- data/LICENSE.txt +2 -1
- data/README.md +18 -1
- data/Rakefile +85 -49
- data/appveyor.yml +81 -0
- data/cuke_slicer.gemspec +13 -7
- data/features/step_definitions/action_steps.rb +12 -11
- data/features/step_definitions/setup_steps.rb +24 -0
- data/features/step_definitions/verification_steps.rb +11 -0
- data/features/test_case_extraction.feature +7 -1
- data/features/validation.feature +6 -0
- data/gemfiles/cuke_modeler0.gemfile +28 -0
- data/gemfiles/cuke_modeler1.gemfile +29 -0
- data/gemfiles/cuke_modeler2.gemfile +29 -0
- data/gemfiles/cuke_modeler3.gemfile +12 -0
- data/lib/cuke_slicer.rb +10 -10
- data/lib/cuke_slicer/collections/nested_tag_collection.rb +29 -0
- data/lib/cuke_slicer/collections/path_collection.rb +28 -0
- data/lib/cuke_slicer/collections/tag_collection.rb +30 -0
- data/lib/cuke_slicer/extractors/directory_extractor.rb +19 -0
- data/lib/cuke_slicer/extractors/file_extractor.rb +34 -0
- data/lib/cuke_slicer/filters/filter_set.rb +44 -0
- data/lib/cuke_slicer/helpers/extraction_helpers.rb +44 -0
- data/lib/cuke_slicer/helpers/filter_helpers.rb +62 -0
- data/lib/cuke_slicer/helpers/helpers.rb +23 -0
- data/lib/cuke_slicer/helpers/matching_helpers.rb +52 -0
- data/lib/cuke_slicer/slicer.rb +25 -196
- data/lib/cuke_slicer/version.rb +1 -1
- data/spec/cuke_slicer_spec.rb +15 -0
- data/spec/slicer_integration_spec.rb +151 -43
- data/spec/slicer_unit_spec.rb +3 -3
- metadata +98 -54
@@ -77,3 +77,27 @@ end
|
|
77
77
|
Given(/^a slicer$/) do
|
78
78
|
@slicer = CukeSlicer::Slicer.new
|
79
79
|
end
|
80
|
+
|
81
|
+
And(/^the test cases are to be extracted as objects$/) do
|
82
|
+
@output_type = :test_object
|
83
|
+
end
|
84
|
+
|
85
|
+
And(/^an invalid output option$/) do
|
86
|
+
@output_type = :invalid_option
|
87
|
+
end
|
88
|
+
|
89
|
+
Given(/^a test suite to extract from$/) do
|
90
|
+
@test_directory ||= @default_file_directory
|
91
|
+
|
92
|
+
@targets ||= []
|
93
|
+
@targets << @default_feature_file_name
|
94
|
+
|
95
|
+
|
96
|
+
test_suite = "Feature: Test feature
|
97
|
+
|
98
|
+
@tag
|
99
|
+
Scenario: Test scenario
|
100
|
+
* some step"
|
101
|
+
|
102
|
+
File.write("#{@test_directory}/#{@default_feature_file_name}", test_suite)
|
103
|
+
end
|
@@ -45,3 +45,14 @@ Then(/^an error indicating that the filter is invalid will be triggered$/) do
|
|
45
45
|
expect(@error_raised).to_not be_nil
|
46
46
|
expect(@error_raised.message).to match(/invalid filter/i)
|
47
47
|
end
|
48
|
+
|
49
|
+
Then(/^the test cases are provided as objects$/) do
|
50
|
+
@output.values.flatten.each do |output|
|
51
|
+
expect(output).to be_a(CukeModeler::Scenario).or be_a(CukeModeler::Row)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
Then(/^an error indicating that the output type is invalid will be triggered$/) do
|
56
|
+
expect(@error_raised).to_not be_nil
|
57
|
+
expect(@error_raised.message).to match(/Invalid Output Format/i)
|
58
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Feature: Test case extraction
|
2
2
|
|
3
|
-
Test cases can be extracted from a source file or directory as a collection of 'file:line' items that
|
3
|
+
Test cases can be extracted from a source file or directory as a collection of 'file:line' items or objects that
|
4
4
|
can then be conveniently arranged for consumption by some other tool (e.g. Cucumber).
|
5
5
|
|
6
6
|
|
@@ -76,3 +76,9 @@ Feature: Test case extraction
|
|
76
76
|
And the directory "test_directory/empty_directory"
|
77
77
|
When test cases are extracted from "test_directory"
|
78
78
|
Then no test cases are found
|
79
|
+
|
80
|
+
Scenario: Extracting objects
|
81
|
+
Given a test suite to extract from
|
82
|
+
And the test cases are to be extracted as objects
|
83
|
+
When test cases are extracted from it
|
84
|
+
Then the test cases are provided as objects
|
data/features/validation.feature
CHANGED
@@ -54,3 +54,9 @@ Feature: Validation
|
|
54
54
|
When test cases are extracted from "test_directory"
|
55
55
|
Then the following test cases are found
|
56
56
|
| path/to/test_directory/a_test.feature:3 |
|
57
|
+
|
58
|
+
Scenario: Invalid output type are not allowed
|
59
|
+
Given a test suite to extract from
|
60
|
+
And an invalid output option
|
61
|
+
When test cases are extracted from it
|
62
|
+
Then an error indicating that the output type is invalid will be triggered
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Older Rubies on Windows cannot securely connect to RubyGems anymore (https://github.com/rubygems/rubygems/issues/2330)
|
2
|
+
if (RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw32/) && (RUBY_VERSION =~ /^1\./)
|
3
|
+
source 'http://rubygems.org'
|
4
|
+
else
|
5
|
+
source 'https://rubygems.org'
|
6
|
+
end
|
7
|
+
|
8
|
+
gemspec :path => "../"
|
9
|
+
|
10
|
+
# Using the most recent release of the 0.x series in order to have all of the bug fixes.
|
11
|
+
gem 'cuke_modeler', '0.4.1'
|
12
|
+
|
13
|
+
if RUBY_VERSION =~ /^1\./
|
14
|
+
gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
|
15
|
+
gem 'ffi', '< 1.9.15' # The 'ffi' gem requires Ruby 2.x on/after this version
|
16
|
+
gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
|
17
|
+
gem 'mime-types', '< 3.0.0' # The 'mime-types' gem requires Ruby 2.x on/after this version
|
18
|
+
gem 'rainbow', '< 3.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
19
|
+
gem 'rake', '< 12.3.0' # The 'rake' gem requires Ruby 2.x on/after this version
|
20
|
+
gem 'rest-client', '< 2.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
21
|
+
gem 'simplecov-html', '< 0.11.0' # The 'simplecov-html' gem requires Ruby 2.x on/after this version
|
22
|
+
gem 'thor', '< 1.0' # The 'thor' gem requires Ruby 2.x on/after this version
|
23
|
+
gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
|
24
|
+
gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
|
25
|
+
gem 'unf_ext', '< 0.0.7.3' # The 'unf_ext' gem requires Ruby 2.x on/after this version
|
26
|
+
else
|
27
|
+
gem 'cucumber', '< 4.0.0' # Cucumber 4.x switches to needing the `cucumber-gherkin` gem, which is incompatible with `cuke_modeler` 0.x
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Older Rubies on Windows cannot securely connect to RubyGems anymore (https://github.com/rubygems/rubygems/issues/2330)
|
2
|
+
if (RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw32/) && (RUBY_VERSION =~ /^1\./)
|
3
|
+
source 'http://rubygems.org'
|
4
|
+
else
|
5
|
+
source 'https://rubygems.org'
|
6
|
+
end
|
7
|
+
|
8
|
+
gemspec :path => "../"
|
9
|
+
|
10
|
+
# The version of CukeModeler being tested
|
11
|
+
gem 'cuke_modeler', '~> 1.0'
|
12
|
+
|
13
|
+
|
14
|
+
if RUBY_VERSION =~ /^1\./
|
15
|
+
gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
|
16
|
+
gem 'ffi', '< 1.9.15' # The 'ffi' gem requires Ruby 2.x on/after this version
|
17
|
+
gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
|
18
|
+
gem 'mime-types', '< 3.0.0' # The 'mime-types' gem requires Ruby 2.x on/after this version
|
19
|
+
gem 'rainbow', '< 3.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
20
|
+
gem 'rake', '< 12.3.0' # The 'rake' gem requires Ruby 2.x on/after this version
|
21
|
+
gem 'rest-client', '< 2.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
22
|
+
gem 'simplecov-html', '< 0.11.0' # The 'simplecov-html' gem requires Ruby 2.x on/after this version
|
23
|
+
gem 'thor', '< 1.0' # The 'thor' gem requires Ruby 2.x on/after this version
|
24
|
+
gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
|
25
|
+
gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
|
26
|
+
gem 'unf_ext', '< 0.0.7.3' # The 'unf_ext' gem requires Ruby 2.x on/after this version
|
27
|
+
else
|
28
|
+
gem 'cucumber', '< 4.0.0' # Cucumber 4.x switches to needing the `cucumber-gherkin` gem, which is incompatible with `cuke_modeler` 1.x
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Older Rubies on Windows cannot securely connect to RubyGems anymore (https://github.com/rubygems/rubygems/issues/2330)
|
2
|
+
if (RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw32/) && (RUBY_VERSION =~ /^1\./)
|
3
|
+
source 'http://rubygems.org'
|
4
|
+
else
|
5
|
+
source 'https://rubygems.org'
|
6
|
+
end
|
7
|
+
|
8
|
+
gemspec :path => "../"
|
9
|
+
|
10
|
+
# The version of CukeModeler being tested
|
11
|
+
gem 'cuke_modeler', '~> 2.0'
|
12
|
+
|
13
|
+
|
14
|
+
if RUBY_VERSION =~ /^1\./
|
15
|
+
gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
|
16
|
+
gem 'ffi', '< 1.9.15' # The 'ffi' gem requires Ruby 2.x on/after this version
|
17
|
+
gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
|
18
|
+
gem 'mime-types', '< 3.0.0' # The 'mime-types' gem requires Ruby 2.x on/after this version
|
19
|
+
gem 'rainbow', '< 3.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
20
|
+
gem 'rake', '< 12.3.0' # The 'rake' gem requires Ruby 2.x on/after this version
|
21
|
+
gem 'rest-client', '< 2.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
22
|
+
gem 'simplecov-html', '< 0.11.0' # The 'simplecov-html' gem requires Ruby 2.x on/after this version
|
23
|
+
gem 'thor', '< 1.0' # The 'thor' gem requires Ruby 2.x on/after this version
|
24
|
+
gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
|
25
|
+
gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
|
26
|
+
gem 'unf_ext', '< 0.0.7.3' # The 'unf_ext' gem requires Ruby 2.x on/after this version
|
27
|
+
else
|
28
|
+
gem 'cucumber', '< 4.0.0' # Cucumber 4.x switches to needing the `cucumber-gherkin` gem, which is incompatible with `cuke_modeler` 2.x
|
29
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec :path => "../"
|
4
|
+
|
5
|
+
# The version of CukeModeler being tested
|
6
|
+
gem 'cuke_modeler', '~> 3.0'
|
7
|
+
|
8
|
+
gem 'cucumber', '2.2.0' # `cucumber` 4.x does not currently work on JRuby
|
9
|
+
|
10
|
+
if RUBY_VERSION =~ /^2\.[1234]/
|
11
|
+
gem 'activesupport', '< 6.0' # `activesupport` 6.x requires at least Ruby 2.5
|
12
|
+
end
|
data/lib/cuke_slicer.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require 'cuke_modeler'
|
2
|
-
|
3
|
-
require "cuke_slicer/version"
|
4
|
-
require "cuke_slicer/slicer"
|
5
|
-
|
6
|
-
|
7
|
-
# Top level module under which the gem code lives.
|
8
|
-
module CukeSlicer
|
9
|
-
# Your code goes here...
|
10
|
-
end
|
1
|
+
require 'cuke_modeler'
|
2
|
+
|
3
|
+
require "cuke_slicer/version"
|
4
|
+
require "cuke_slicer/slicer"
|
5
|
+
|
6
|
+
|
7
|
+
# Top level module under which the gem code lives.
|
8
|
+
module CukeSlicer
|
9
|
+
# Your code goes here...
|
10
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "cuke_slicer/helpers/helpers"
|
2
|
+
|
3
|
+
|
4
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
5
|
+
# :nodoc: all
|
6
|
+
module CukeSlicer
|
7
|
+
class NestedTagCollection
|
8
|
+
|
9
|
+
include Helpers
|
10
|
+
|
11
|
+
|
12
|
+
def initialize collection
|
13
|
+
self.nested_collection = collection
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate
|
17
|
+
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
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_accessor :nested_collection
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "cuke_slicer/helpers/helpers"
|
2
|
+
|
3
|
+
|
4
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
5
|
+
# :nodoc: all
|
6
|
+
module CukeSlicer
|
7
|
+
class PathCollection
|
8
|
+
|
9
|
+
include Helpers
|
10
|
+
|
11
|
+
|
12
|
+
def initialize filter_values
|
13
|
+
self.filter_values = filter_values
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate
|
17
|
+
filter_values.each do |val|
|
18
|
+
raise(ArgumentError, "Filter '#{val}' must be a String or Regexp. Got #{val.class}") unless str_regex?(val)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_accessor :filter_values
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "cuke_slicer/helpers/helpers"
|
2
|
+
require "cuke_slicer/collections/nested_tag_collection"
|
3
|
+
|
4
|
+
|
5
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
6
|
+
# :nodoc: all
|
7
|
+
module CukeSlicer
|
8
|
+
class TagCollection
|
9
|
+
|
10
|
+
include Helpers
|
11
|
+
|
12
|
+
|
13
|
+
def initialize parameters
|
14
|
+
self.filter_values = parameters
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate
|
18
|
+
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)
|
20
|
+
NestedTagCollection.new(val).validate if val.is_a?(Array)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_accessor :filter_values
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
2
|
+
# :nodoc: all
|
3
|
+
module CukeSlicer
|
4
|
+
class DirectoryExtractor
|
5
|
+
|
6
|
+
def extract(target, filters, format, &block)
|
7
|
+
Array.new.tap do |test_cases|
|
8
|
+
target.feature_files.each do |feature_file|
|
9
|
+
test_cases.concat(FileExtractor.new.extract(feature_file, filters, format, &block))
|
10
|
+
end
|
11
|
+
|
12
|
+
target.directories.each do |directory|
|
13
|
+
test_cases.concat(extract(directory, filters, format, &block))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "cuke_slicer/helpers/matching_helpers"
|
2
|
+
require "cuke_slicer/helpers/filter_helpers"
|
3
|
+
require "cuke_slicer/helpers/extraction_helpers"
|
4
|
+
|
5
|
+
|
6
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
7
|
+
# :nodoc: all
|
8
|
+
module CukeSlicer
|
9
|
+
class FileExtractor
|
10
|
+
|
11
|
+
include ExtractionHelpers
|
12
|
+
|
13
|
+
|
14
|
+
def extract(target, filters, format, &block)
|
15
|
+
Array.new.tap do |test_cases|
|
16
|
+
unless target.feature.nil?
|
17
|
+
tests = target.feature.tests
|
18
|
+
|
19
|
+
runnable_elements = extract_runnable_elements(extract_runnable_block_elements(tests, filters, &block))
|
20
|
+
|
21
|
+
runnable_elements.each do |element|
|
22
|
+
case
|
23
|
+
when format == :file_line
|
24
|
+
test_cases << "#{element.get_ancestor(:feature_file).path}:#{element.source_line}"
|
25
|
+
when format == :test_object
|
26
|
+
test_cases << element
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "cuke_slicer/helpers/helpers"
|
2
|
+
require "cuke_slicer/collections/tag_collection"
|
3
|
+
require "cuke_slicer/collections/path_collection"
|
4
|
+
|
5
|
+
|
6
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
7
|
+
# :nodoc: all
|
8
|
+
module CukeSlicer
|
9
|
+
class FilterSet
|
10
|
+
|
11
|
+
include Helpers
|
12
|
+
|
13
|
+
|
14
|
+
def initialize filter_type, filter_value
|
15
|
+
self.filter_type = filter_type
|
16
|
+
self.filter_value = filter_value
|
17
|
+
end
|
18
|
+
|
19
|
+
def validate
|
20
|
+
block_unknown
|
21
|
+
block_invalid
|
22
|
+
|
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
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
|
33
|
+
def block_unknown
|
34
|
+
raise(ArgumentError, "Unknown filter '#{filter_type}'") unless CukeSlicer::Slicer.known_filters.include?(filter_type)
|
35
|
+
end
|
36
|
+
|
37
|
+
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)
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_accessor :filter_type, :filter_value
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
2
|
+
# :nodoc: all
|
3
|
+
module CukeSlicer
|
4
|
+
module ExtractionHelpers
|
5
|
+
|
6
|
+
include FilterHelpers
|
7
|
+
|
8
|
+
|
9
|
+
def extract_runnable_block_elements(things, filters, &block)
|
10
|
+
Array.new.tap do |elements|
|
11
|
+
things.each do |thing|
|
12
|
+
if thing.is_a?(CukeModeler::Outline)
|
13
|
+
elements.concat(thing.examples)
|
14
|
+
else
|
15
|
+
elements << thing
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
filter_excluded_paths(elements, filters[:excluded_paths])
|
20
|
+
filter_included_paths(elements, filters[:included_paths])
|
21
|
+
filter_excluded_tags(elements, filters[:excluded_tags])
|
22
|
+
filter_included_tags(elements, filters[:included_tags])
|
23
|
+
|
24
|
+
apply_custom_filter(elements, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
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|
|
32
|
+
things.each do |thing|
|
33
|
+
if thing.is_a?(CukeModeler::Example)
|
34
|
+
# Slicing in order to remove the parameter row element
|
35
|
+
elements.concat(thing.send(method_for_row_models).slice(1, thing.rows.count))
|
36
|
+
else
|
37
|
+
elements << thing
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Internal helper module that is not part of the public API. Subject to change at any time.
|
2
|
+
# :nodoc: all
|
3
|
+
module CukeSlicer
|
4
|
+
module FilterHelpers
|
5
|
+
|
6
|
+
include MatchingHelpers
|
7
|
+
|
8
|
+
|
9
|
+
def apply_custom_filter(elements, &block)
|
10
|
+
if block
|
11
|
+
elements.reject! do |element|
|
12
|
+
block.call(element)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
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
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def filter_included_tags(elements, filters)
|
30
|
+
if filters
|
31
|
+
filters = [filters] unless filters.is_a?(Array)
|
32
|
+
|
33
|
+
elements.keep_if do |element|
|
34
|
+
matching_tag?(element, filters)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def filter_excluded_paths(elements, filters)
|
40
|
+
if filters
|
41
|
+
filters = [filters] unless filters.is_a?(Array)
|
42
|
+
|
43
|
+
elements.reject! do |element|
|
44
|
+
matching_path?(element, filters)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
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
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|