cuke_linter 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -1
- data/README.md +8 -11
- data/Rakefile +2 -2
- data/lib/cuke_linter.rb +7 -3
- data/lib/cuke_linter/linters/example_without_name_linter.rb +9 -13
- data/lib/cuke_linter/linters/feature_without_scenarios_linter.rb +9 -13
- data/lib/cuke_linter/linters/linter.rb +35 -0
- data/lib/cuke_linter/linters/outline_with_single_example_row_linter.rb +11 -15
- data/lib/cuke_linter/linters/test_with_too_many_steps_linter.rb +12 -16
- data/lib/cuke_linter/version.rb +1 -1
- data/testing/cucumber/features/linters/custom_linters.feature +54 -0
- data/testing/cucumber/step_definitions/action_steps.rb +1 -1
- data/testing/cucumber/step_definitions/setup_steps.rb +27 -0
- data/testing/cucumber/step_definitions/verification_steps.rb +1 -1
- data/testing/linter_factory.rb +7 -3
- data/testing/model_factory.rb +9 -12
- data/testing/rspec/spec/integration/cuke_linter_integration_spec.rb +16 -5
- data/testing/rspec/spec/integration/linters/linter_integration_spec.rb +8 -0
- data/testing/rspec/spec/unit/linters/example_without_name_linter_unit_spec.rb +11 -11
- data/testing/rspec/spec/unit/linters/feature_without_scenarios_linter_unit_spec.rb +13 -13
- data/testing/rspec/spec/unit/linters/linter_unit_spec.rb +180 -0
- data/testing/rspec/spec/unit/linters/linter_unit_specs.rb +7 -7
- data/testing/rspec/spec/unit/linters/outline_with_single_example_row_linter_unit_spec.rb +17 -17
- data/testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb +22 -22
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 232cb6cefe917fc75ea2c3b21da060298a4b4f1d4c392dd0853ee2cef91bb80d
|
4
|
+
data.tar.gz: b8365e3d6b4b82bb494a9af552ee06db6467dac7e73d144a5c7dcc4df8d7b59c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2ad543a81bd093b5856e82fe7fb2bcf74447dcd96f1816adc47dcb220253d4a5e581e2e7fa7414cbb595b34815e217f431fb658f4ce70f4a779f8ff1bbc603c
|
7
|
+
data.tar.gz: b721820908884a39d786de81e8b87ff3c77daa4ff77037ad87384e301f3391f005328c0147aae9b093aea40552cf35a030db62c563c893838bef275f61dd44f9
|
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
8
8
|
|
9
9
|
Nothing yet...
|
10
10
|
|
11
|
+
## [0.4.0] - 2019-05-11
|
12
|
+
|
13
|
+
### Added
|
14
|
+
- A base linter class has been added that can be used to create custom linters more easily by providing common boilerplate code that every linter would need.
|
15
|
+
|
16
|
+
### Changed
|
17
|
+
- Linters now return only a single problem instead of returning a collection of problems.
|
18
|
+
|
11
19
|
## [0.3.1] - 2019-04-13
|
12
20
|
|
13
21
|
### Added
|
@@ -33,7 +41,8 @@ Nothing yet...
|
|
33
41
|
- Custom linters, formatters, and command line usability
|
34
42
|
|
35
43
|
|
36
|
-
[Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.
|
44
|
+
[Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.4.0...HEAD
|
45
|
+
[0.4.0]: https://github.com/enkessler/cuke_linter/compare/v0.3.1...v0.4.0
|
37
46
|
[0.3.1]: https://github.com/enkessler/cuke_linter/compare/v0.3.0...v0.3.1
|
38
47
|
[0.3.0]: https://github.com/enkessler/cuke_linter/compare/v0.2.0...v0.3.0
|
39
48
|
[0.2.0]: https://github.com/enkessler/cuke_linter/compare/v0.1.0...v0.2.0
|
data/README.md
CHANGED
@@ -56,20 +56,17 @@ CukeLinter.lint
|
|
56
56
|
|
57
57
|
The linting will happen against a tree of `CukeModeler` models that is generated based on the current directory. You can generate your own model tree and use that instead, if desired.
|
58
58
|
|
59
|
-
Custom linters can be any object that responds to `#lint` and returns a
|
59
|
+
Custom linters can be any object that responds to `#lint` and returns a detected issue (or `nil`) in the format of
|
60
60
|
|
61
61
|
```
|
62
|
-
|
63
|
-
|
64
|
-
location: 'path/to/file:line_number' },
|
65
|
-
{ problem: 'some linting issue',
|
66
|
-
location: 'path/to/file:line_number' },
|
67
|
-
# etc.
|
68
|
-
]
|
62
|
+
{ problem: 'some linting issue',
|
63
|
+
location: 'path/to/file:line_number' }
|
69
64
|
```
|
70
65
|
|
71
66
|
Note that a linter will receive, in turn, *every model* in the model tree in order for it to have the chance to detect problems with it. Checking the model's class before attempting to lint it is recommended.
|
72
67
|
|
68
|
+
**In order to simplify the process of creating custom linters a base class is provided (see [documentation](#documentation)).**
|
69
|
+
|
73
70
|
Custom formatters can be any object that responds to `#format` and takes input data in the following format:
|
74
71
|
|
75
72
|
```
|
@@ -98,12 +95,12 @@ class MyCustomLinter
|
|
98
95
|
end
|
99
96
|
|
100
97
|
def lint(model)
|
101
|
-
return
|
98
|
+
return nil unless model.is_a?(CukeModeler::Scenario)
|
102
99
|
|
103
100
|
if model.name.empty?
|
104
|
-
|
101
|
+
{ problem: 'Scenario has no name', location: "#{model.get_ancestor(:feature_file).path}:#{model.source_line}" }
|
105
102
|
else
|
106
|
-
|
103
|
+
nil
|
107
104
|
end
|
108
105
|
end
|
109
106
|
|
data/Rakefile
CHANGED
@@ -50,11 +50,11 @@ namespace 'cuke_linter' do
|
|
50
50
|
Rake::Task['cuke_linter:test_everything'].invoke
|
51
51
|
Rake::Task['cuke_linter:check_documentation'].invoke
|
52
52
|
rescue => e
|
53
|
-
puts Rainbow("
|
53
|
+
puts Rainbow("-----------------------\nSomething isn't right!").red
|
54
54
|
raise e
|
55
55
|
end
|
56
56
|
|
57
|
-
puts Rainbow(
|
57
|
+
puts Rainbow("-----------------------\nAll is well. :)").green
|
58
58
|
end
|
59
59
|
|
60
60
|
end
|
data/lib/cuke_linter.rb
CHANGED
@@ -2,6 +2,7 @@ require 'cuke_modeler'
|
|
2
2
|
|
3
3
|
require "cuke_linter/version"
|
4
4
|
require 'cuke_linter/formatters/pretty_formatter'
|
5
|
+
require 'cuke_linter/linters/linter'
|
5
6
|
require 'cuke_linter/linters/example_without_name_linter'
|
6
7
|
require 'cuke_linter/linters/feature_without_scenarios_linter'
|
7
8
|
require 'cuke_linter/linters/outline_with_single_example_row_linter'
|
@@ -73,9 +74,12 @@ module CukeLinter
|
|
73
74
|
# TODO: have linters lint only certain types of models
|
74
75
|
# linting_data.concat(linter.lint(model)) if relevant_model?(linter, model)
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
77
|
+
result = linter.lint(model)
|
78
|
+
|
79
|
+
if result
|
80
|
+
result[:linter] = linter.name
|
81
|
+
linting_data << result
|
82
|
+
end
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
@@ -2,22 +2,18 @@ module CukeLinter
|
|
2
2
|
|
3
3
|
# A linter that detects unnamed example groups
|
4
4
|
|
5
|
-
class ExampleWithoutNameLinter
|
5
|
+
class ExampleWithoutNameLinter < Linter
|
6
6
|
|
7
|
-
#
|
8
|
-
def
|
9
|
-
|
10
|
-
end
|
7
|
+
# The rule used to determine if a model has a problem
|
8
|
+
def rule(model)
|
9
|
+
return false unless model.is_a?(CukeModeler::Example)
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
return [] unless model.is_a?(CukeModeler::Example)
|
11
|
+
model.name.nil? || model.name.empty?
|
12
|
+
end
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
[]
|
20
|
-
end
|
14
|
+
# The message used to describe the problem that has been found
|
15
|
+
def message
|
16
|
+
'Example has no name'
|
21
17
|
end
|
22
18
|
|
23
19
|
end
|
@@ -2,22 +2,18 @@ module CukeLinter
|
|
2
2
|
|
3
3
|
# A linter that detects empty features
|
4
4
|
|
5
|
-
class FeatureWithoutScenariosLinter
|
5
|
+
class FeatureWithoutScenariosLinter < Linter
|
6
6
|
|
7
|
-
#
|
8
|
-
def
|
9
|
-
|
10
|
-
end
|
7
|
+
# The rule used to determine if a model has a problem
|
8
|
+
def rule(model)
|
9
|
+
return false unless model.is_a?(CukeModeler::Feature)
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
return [] unless model.is_a?(CukeModeler::Feature)
|
11
|
+
model.tests.nil? || model.tests.empty?
|
12
|
+
end
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
[]
|
20
|
-
end
|
14
|
+
# The message used to describe the problem that has been found
|
15
|
+
def message
|
16
|
+
'Feature has no scenarios'
|
21
17
|
end
|
22
18
|
|
23
19
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module CukeLinter
|
2
|
+
|
3
|
+
# A generic linter that can be used to make arbitrary linting rules
|
4
|
+
|
5
|
+
class Linter
|
6
|
+
|
7
|
+
# Creates a new linter object
|
8
|
+
def initialize(name: nil, message: nil, rule: nil)
|
9
|
+
@name = name || self.class.name.split('::').last
|
10
|
+
@message = message || "#{self.name} problem detected"
|
11
|
+
@rule = rule
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns the name of the linter
|
15
|
+
def name
|
16
|
+
@name
|
17
|
+
end
|
18
|
+
|
19
|
+
# Lints the given model and returns linting data about said model
|
20
|
+
def lint(model)
|
21
|
+
raise 'No linting rule provided!' unless @rule || respond_to?(:rule)
|
22
|
+
|
23
|
+
problem_found = respond_to?(:rule) ? rule(model) : @rule.call(model)
|
24
|
+
|
25
|
+
if problem_found
|
26
|
+
problem_message = respond_to?(:message) ? message : @message
|
27
|
+
|
28
|
+
{ problem: problem_message, location: "#{model.get_ancestor(:feature_file).path}:#{model.source_line}" }
|
29
|
+
else
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -2,25 +2,21 @@ module CukeLinter
|
|
2
2
|
|
3
3
|
# A linter that detects outlines that don't have multiple example rows
|
4
4
|
|
5
|
-
class OutlineWithSingleExampleRowLinter
|
5
|
+
class OutlineWithSingleExampleRowLinter < Linter
|
6
6
|
|
7
|
-
#
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# Lints the given model and returns linting data about said model
|
13
|
-
def lint(model)
|
14
|
-
return [] unless model.is_a?(CukeModeler::Outline)
|
15
|
-
return [] if model.examples.nil?
|
7
|
+
# The rule used to determine if a model has a problem
|
8
|
+
def rule(model)
|
9
|
+
return false unless model.is_a?(CukeModeler::Outline)
|
10
|
+
return false if model.examples.nil?
|
16
11
|
|
17
12
|
examples_rows = model.examples.collect(&:argument_rows).flatten
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
14
|
+
examples_rows.count == 1
|
15
|
+
end
|
16
|
+
|
17
|
+
# The message used to describe the problem that has been found
|
18
|
+
def message
|
19
|
+
'Outline has only one example row'
|
24
20
|
end
|
25
21
|
|
26
22
|
end
|
@@ -2,30 +2,26 @@ module CukeLinter
|
|
2
2
|
|
3
3
|
# A linter that detects scenarios and outlines that have too many steps
|
4
4
|
|
5
|
-
class TestWithTooManyStepsLinter
|
6
|
-
|
7
|
-
# Returns the name of the linter
|
8
|
-
def name
|
9
|
-
'TestWithTooManyStepsLinter'
|
10
|
-
end
|
5
|
+
class TestWithTooManyStepsLinter < Linter
|
11
6
|
|
12
7
|
# Changes the linting settings on the linter using the provided configuration
|
13
8
|
def configure(options)
|
14
9
|
@step_threshold = options['StepThreshold'] if options['StepThreshold']
|
15
10
|
end
|
16
11
|
|
17
|
-
#
|
18
|
-
def
|
19
|
-
return
|
12
|
+
# The rule used to determine if a model has a problem
|
13
|
+
def rule(model)
|
14
|
+
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
20
15
|
|
21
|
-
|
22
|
-
|
16
|
+
@linted_step_count = model.steps.nil? ? 0 : model.steps.count
|
17
|
+
@linted_step_threshold = @step_threshold || 10
|
18
|
+
|
19
|
+
@linted_step_count > @linted_step_threshold
|
20
|
+
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
[]
|
28
|
-
end
|
22
|
+
# The message used to describe the problem that has been found
|
23
|
+
def message
|
24
|
+
"Test has too many steps. #{@linted_step_count} steps found (max #{@linted_step_threshold})"
|
29
25
|
end
|
30
26
|
|
31
27
|
end
|
data/lib/cuke_linter/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
Feature: Custom linters
|
2
|
+
|
3
|
+
In addition to the linters provided by CukeSlicer, custom linters can be used. A linter is essentially any object that provides a few needed methods. In order to simplify the creation of custom linters, a base linter class is available that provides these needed methods.
|
4
|
+
|
5
|
+
|
6
|
+
Scenario: Creating a custom linter object
|
7
|
+
Given the following custom linter object:
|
8
|
+
"""
|
9
|
+
custom_name = 'MyCustomLinter'
|
10
|
+
custom_message = 'My custom message'
|
11
|
+
custom_rule = lambda do |model|
|
12
|
+
# Your logic here, return true for a problem and false for not problem
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
@linter = CukeLinter::Linter.new(name: custom_name,
|
17
|
+
message: custom_message,
|
18
|
+
rule: custom_rule)
|
19
|
+
"""
|
20
|
+
And a model to lint
|
21
|
+
When the model is linted
|
22
|
+
Then an error is reported
|
23
|
+
| linter | problem | location |
|
24
|
+
| MyCustomLinter | My custom message | <path_to_file>:<model_line_number> |
|
25
|
+
|
26
|
+
Scenario: Creating a custom linter class
|
27
|
+
Given the following custom linter class:
|
28
|
+
"""
|
29
|
+
class MyCustomLinter < CukeLinter::Linter
|
30
|
+
|
31
|
+
def name
|
32
|
+
'MyCustomLinter'
|
33
|
+
end
|
34
|
+
|
35
|
+
def message
|
36
|
+
'My custom message'
|
37
|
+
end
|
38
|
+
|
39
|
+
def rule(model)
|
40
|
+
# Your logic here, return true for a problem and false for not problem
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
"""
|
46
|
+
And the following code is used:
|
47
|
+
"""
|
48
|
+
@linter = MyCustomLinter.new
|
49
|
+
"""
|
50
|
+
And a model to lint
|
51
|
+
When the model is linted
|
52
|
+
Then an error is reported
|
53
|
+
| linter | problem | location |
|
54
|
+
| MyCustomLinter | My custom message | <path_to_file>:<model_line_number> |
|
@@ -8,7 +8,7 @@ When(/^it is formatted by the "([^"]*)" formatter$/) do |linter_name|
|
|
8
8
|
@results = CukeLinter.const_get("#{linter_name.capitalize}Formatter").new.format(@linter_data)
|
9
9
|
end
|
10
10
|
|
11
|
-
When(/^(?:the feature|it) is linted$/) do
|
11
|
+
When(/^(?:the feature|the model|it) is linted$/) do
|
12
12
|
options = { model_tree: @model,
|
13
13
|
formatters: [[CukeLinter::FormatterFactory.generate_fake_formatter, "#{CukeLinter::FileHelper::create_directory}/junk_output_file.txt"]] }
|
14
14
|
options[:linters] = [@linter] if @linter
|
@@ -66,3 +66,30 @@ end
|
|
66
66
|
Given(/^no linters are currently registered$/) do
|
67
67
|
CukeLinter.clear_registered_linters
|
68
68
|
end
|
69
|
+
|
70
|
+
Given(/^the following custom linter object:$/) do |code|
|
71
|
+
code.sub!('<path_to>', @root_test_directory)
|
72
|
+
code.sub!('<code_to_generate_a_new_linter_instance>', 'CukeLinter::LinterFactory.generate_fake_linter')
|
73
|
+
|
74
|
+
if @working_directory
|
75
|
+
Dir.chdir(@working_directory) do
|
76
|
+
eval(code)
|
77
|
+
end
|
78
|
+
else
|
79
|
+
eval(code)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
And(/^a model to lint$/) do
|
84
|
+
# Any old model should be fine
|
85
|
+
@model = CukeModeler::Feature.new
|
86
|
+
|
87
|
+
fake_file_model = CukeModeler::FeatureFile.new
|
88
|
+
fake_file_model.path = 'path_to_file'
|
89
|
+
|
90
|
+
@model.parent_model = fake_file_model
|
91
|
+
end
|
92
|
+
|
93
|
+
Given(/^the following custom linter class:$/) do |code|
|
94
|
+
eval(code)
|
95
|
+
end
|
@@ -10,7 +10,7 @@ Then(/^an error is reported$/) do |table|
|
|
10
10
|
table.hashes.each do |error_record|
|
11
11
|
expect(@results).to include({ linter: error_record['linter'],
|
12
12
|
problem: error_record['problem'],
|
13
|
-
location: error_record['location'].sub('<path_to_file>', @model.get_ancestor(:feature_file).path) })
|
13
|
+
location: error_record['location'].sub('<path_to_file>', @model.get_ancestor(:feature_file).path).sub('<model_line_number>', @model.source_line.to_s) })
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/testing/linter_factory.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
module CukeLinter
|
2
2
|
module LinterFactory
|
3
3
|
|
4
|
-
def self.generate_fake_linter(name: 'FakeLinter')
|
4
|
+
def self.generate_fake_linter(name: 'FakeLinter', finds_problems: true)
|
5
5
|
linter = Object.new
|
6
6
|
|
7
7
|
linter.define_singleton_method('lint') do |model|
|
8
8
|
location = model.respond_to?(:source_line) ? "#{model.get_ancestor(:feature_file).path}:#{model.source_line}" : model.path
|
9
9
|
problem = @problem || "#{name} problem"
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
if finds_problems
|
12
|
+
{ problem: problem,
|
13
|
+
location: location }
|
14
|
+
else
|
15
|
+
nil
|
16
|
+
end
|
13
17
|
end
|
14
18
|
|
15
19
|
linter.define_singleton_method('name') do
|
data/testing/model_factory.rb
CHANGED
@@ -17,41 +17,38 @@ module CukeLinter
|
|
17
17
|
module ModelFactory
|
18
18
|
|
19
19
|
def self.generate_feature_model(source_text: 'Feature:', parent_file_path: 'path_to_file')
|
20
|
-
|
21
|
-
|
20
|
+
fake_parent_model = CukeModeler::FeatureFile.new
|
21
|
+
fake_parent_model.path = parent_file_path
|
22
22
|
|
23
23
|
model = CukeModeler::Feature.new(source_text)
|
24
|
-
model.parent_model =
|
24
|
+
model.parent_model = fake_parent_model
|
25
25
|
|
26
26
|
model
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.generate_example_model(source_text: 'Examples:', parent_file_path: 'path_to_file')
|
30
|
-
|
31
|
-
fake_file_model.path = parent_file_path
|
30
|
+
fake_parent_model = generate_outline_model(parent_file_path: parent_file_path)
|
32
31
|
|
33
32
|
model = CukeModeler::Example.new(source_text)
|
34
|
-
model.parent_model =
|
33
|
+
model.parent_model = fake_parent_model
|
35
34
|
|
36
35
|
model
|
37
36
|
end
|
38
37
|
|
39
38
|
def self.generate_outline_model(source_text: "Scenario Outline:\n*a step\nExamples:\n|param|", parent_file_path: 'path_to_file')
|
40
|
-
|
41
|
-
fake_file_model.path = parent_file_path
|
39
|
+
fake_parent_model = generate_feature_model(parent_file_path: parent_file_path)
|
42
40
|
|
43
41
|
model = CukeModeler::Outline.new(source_text)
|
44
|
-
model.parent_model =
|
42
|
+
model.parent_model = fake_parent_model
|
45
43
|
|
46
44
|
model
|
47
45
|
end
|
48
46
|
|
49
47
|
def self.generate_scenario_model(source_text: 'Scenario:', parent_file_path: 'path_to_file')
|
50
|
-
|
51
|
-
fake_file_model.path = parent_file_path
|
48
|
+
fake_parent_model = generate_feature_model(parent_file_path: parent_file_path)
|
52
49
|
|
53
50
|
model = CukeModeler::Scenario.new(source_text)
|
54
|
-
model.parent_model =
|
51
|
+
model.parent_model = fake_parent_model
|
55
52
|
|
56
53
|
model
|
57
54
|
end
|
@@ -82,16 +82,21 @@ RSpec.describe CukeLinter do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'uses all registered linters if none are provided', :linter_registration do
|
85
|
+
CukeLinter.clear_registered_linters
|
85
86
|
CukeLinter.register_linter(linter: CukeLinter::LinterFactory.generate_fake_linter(name: 'FakeLinter1'), name: 'FakeLinter1')
|
86
87
|
CukeLinter.register_linter(linter: CukeLinter::LinterFactory.generate_fake_linter(name: 'FakeLinter2'), name: 'FakeLinter2')
|
87
88
|
CukeLinter.register_linter(linter: CukeLinter::LinterFactory.generate_fake_linter(name: 'FakeLinter3'), name: 'FakeLinter3')
|
88
|
-
linting_options.delete(:linters)
|
89
89
|
|
90
|
-
|
90
|
+
begin
|
91
|
+
linting_options.delete(:linters)
|
92
|
+
results = subject.lint(linting_options)
|
91
93
|
|
92
|
-
|
93
|
-
|
94
|
-
|
94
|
+
expect(results).to match_array([{ linter: 'FakeLinter1', location: 'path_to_file:1', problem: 'FakeLinter1 problem' },
|
95
|
+
{ linter: 'FakeLinter2', location: 'path_to_file:1', problem: 'FakeLinter2 problem' },
|
96
|
+
{ linter: 'FakeLinter3', location: 'path_to_file:1', problem: 'FakeLinter3 problem' }])
|
97
|
+
ensure
|
98
|
+
CukeLinter.reset_linters
|
99
|
+
end
|
95
100
|
end
|
96
101
|
|
97
102
|
it 'includes the name of the linter in the linting data' do
|
@@ -136,6 +141,12 @@ RSpec.describe CukeLinter do
|
|
136
141
|
expect(CukeLinter.registered_linters.values.map(&:object_id)).to_not match_array(original_linter_ids)
|
137
142
|
end
|
138
143
|
|
144
|
+
it 'can handle a mixture of problematic and non-problematic models' do
|
145
|
+
linting_options[:linters] = [CukeLinter::LinterFactory.generate_fake_linter(finds_problems: true),
|
146
|
+
CukeLinter::LinterFactory.generate_fake_linter(finds_problems: false)]
|
147
|
+
|
148
|
+
expect { subject.lint(linting_options) }.to_not raise_error
|
149
|
+
end
|
139
150
|
|
140
151
|
describe 'configuration' do
|
141
152
|
|
@@ -44,13 +44,13 @@ RSpec.describe CukeLinter::ExampleWithoutNameLinter do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'records a problem' do
|
47
|
-
|
47
|
+
result = subject.lint(test_model_with_nil_name)
|
48
48
|
|
49
|
-
expect(
|
49
|
+
expect(result[:problem]).to eq('Example has no name')
|
50
50
|
|
51
|
-
|
51
|
+
result = subject.lint(test_model_with_blank_name)
|
52
52
|
|
53
|
-
expect(
|
53
|
+
expect(result[:problem]).to eq('Example has no name')
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'records the location of the problem' do
|
@@ -61,21 +61,21 @@ RSpec.describe CukeLinter::ExampleWithoutNameLinter do
|
|
61
61
|
model_2.name = nil
|
62
62
|
model_2.source_line = 3
|
63
63
|
|
64
|
-
|
65
|
-
expect(
|
64
|
+
result = subject.lint(model_1)
|
65
|
+
expect(result[:location]).to eq('path_to_file:1')
|
66
66
|
|
67
|
-
|
68
|
-
expect(
|
67
|
+
result = subject.lint(model_2)
|
68
|
+
expect(result[:location]).to eq('path_to_file:3')
|
69
69
|
end
|
70
70
|
|
71
71
|
end
|
72
72
|
|
73
73
|
context 'a non-example model' do
|
74
74
|
|
75
|
-
it 'returns
|
76
|
-
|
75
|
+
it 'returns no result' do
|
76
|
+
result = subject.lint(CukeModeler::Model.new)
|
77
77
|
|
78
|
-
expect(
|
78
|
+
expect(result).to eq(nil)
|
79
79
|
end
|
80
80
|
|
81
81
|
end
|
@@ -44,13 +44,13 @@ RSpec.describe CukeLinter::FeatureWithoutScenariosLinter do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'records a problem' do
|
47
|
-
|
47
|
+
result = subject.lint(test_model_with_empty_scenarios)
|
48
48
|
|
49
|
-
expect(
|
49
|
+
expect(result[:problem]).to eq('Feature has no scenarios')
|
50
50
|
|
51
|
-
|
51
|
+
result = subject.lint(test_model_with_nil_scenarios)
|
52
52
|
|
53
|
-
expect(
|
53
|
+
expect(result[:problem]).to eq('Feature has no scenarios')
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'records the location of the problem' do
|
@@ -61,11 +61,11 @@ RSpec.describe CukeLinter::FeatureWithoutScenariosLinter do
|
|
61
61
|
model_2.tests = []
|
62
62
|
model_2.source_line = 3
|
63
63
|
|
64
|
-
|
65
|
-
expect(
|
64
|
+
result = subject.lint(model_1)
|
65
|
+
expect(result[:location]).to eq('path_to_file:1')
|
66
66
|
|
67
|
-
|
68
|
-
expect(
|
67
|
+
result = subject.lint(model_2)
|
68
|
+
expect(result[:location]).to eq('path_to_file:3')
|
69
69
|
end
|
70
70
|
|
71
71
|
end
|
@@ -83,7 +83,7 @@ RSpec.describe CukeLinter::FeatureWithoutScenariosLinter do
|
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'does not record a problem' do
|
86
|
-
expect(subject.lint(test_model)).to eq(
|
86
|
+
expect(subject.lint(test_model)).to eq(nil)
|
87
87
|
end
|
88
88
|
|
89
89
|
end
|
@@ -102,7 +102,7 @@ RSpec.describe CukeLinter::FeatureWithoutScenariosLinter do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
it 'does not record a problem' do
|
105
|
-
expect(subject.lint(test_model)).to eq(
|
105
|
+
expect(subject.lint(test_model)).to eq(nil)
|
106
106
|
end
|
107
107
|
|
108
108
|
end
|
@@ -111,10 +111,10 @@ RSpec.describe CukeLinter::FeatureWithoutScenariosLinter do
|
|
111
111
|
|
112
112
|
context 'a non-feature model' do
|
113
113
|
|
114
|
-
it 'returns
|
115
|
-
|
114
|
+
it 'returns no result' do
|
115
|
+
result = subject.lint(CukeModeler::Model.new)
|
116
116
|
|
117
|
-
expect(
|
117
|
+
expect(result).to eq(nil)
|
118
118
|
end
|
119
119
|
|
120
120
|
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require_relative '../../../../../environments/rspec_env'
|
2
|
+
|
3
|
+
|
4
|
+
RSpec.describe CukeLinter::Linter do
|
5
|
+
|
6
|
+
let(:linter_name) { 'FooLinter' }
|
7
|
+
let(:linter_message) { 'Foo!' }
|
8
|
+
let(:linter_rule) { lambda { |model| !model.is_a?(CukeModeler::Example) } }
|
9
|
+
let(:linter_options) { { name: linter_name, message: linter_message, rule: linter_rule } }
|
10
|
+
|
11
|
+
let(:good_data) do
|
12
|
+
CukeLinter::ModelFactory.generate_example_model
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:bad_data) do
|
16
|
+
CukeLinter::ModelFactory.generate_outline_model
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
context 'with custom values' do
|
21
|
+
|
22
|
+
subject { CukeLinter::Linter.new(linter_options) }
|
23
|
+
|
24
|
+
|
25
|
+
it_should_behave_like 'a linter at the unit level'
|
26
|
+
|
27
|
+
it 'uses the provided name' do
|
28
|
+
expect(subject.name).to eq(linter_name)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'uses the provided rule' do
|
32
|
+
expect(subject.lint(good_data)).to be_nil
|
33
|
+
expect(subject.lint(bad_data)).to_not be_nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'uses the provided message' do
|
37
|
+
result = subject.lint(bad_data)
|
38
|
+
|
39
|
+
expect(result[:problem]).to eq(linter_message)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with custom methods' do
|
45
|
+
|
46
|
+
subject { linter = CukeLinter::Linter.new
|
47
|
+
|
48
|
+
linter.define_singleton_method('rule') do |model|
|
49
|
+
!model.is_a?(CukeModeler::Example)
|
50
|
+
end
|
51
|
+
|
52
|
+
linter.define_singleton_method('name') do
|
53
|
+
'FooLinter'
|
54
|
+
end
|
55
|
+
|
56
|
+
linter.define_singleton_method('message') do
|
57
|
+
'Foo!'
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
linter }
|
62
|
+
|
63
|
+
|
64
|
+
it_should_behave_like 'a linter at the unit level'
|
65
|
+
|
66
|
+
it 'uses the provided #name' do
|
67
|
+
expect(subject.name).to eq(linter_name)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'uses the provided #rule' do
|
71
|
+
expect(subject.lint(good_data)).to be_nil
|
72
|
+
expect(subject.lint(bad_data)).to_not be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'uses the provided #message' do
|
76
|
+
result = subject.lint(bad_data)
|
77
|
+
|
78
|
+
expect(result[:problem]).to eq(linter_message)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'with both custom values and methods' do
|
84
|
+
|
85
|
+
let(:good_data) do
|
86
|
+
CukeLinter::ModelFactory.generate_outline_model
|
87
|
+
end
|
88
|
+
|
89
|
+
let(:bad_data) do
|
90
|
+
CukeLinter::ModelFactory.generate_example_model
|
91
|
+
end
|
92
|
+
|
93
|
+
subject { linter = CukeLinter::Linter.new(linter_options)
|
94
|
+
|
95
|
+
linter.define_singleton_method('rule') do |model|
|
96
|
+
model.is_a?(CukeModeler::Example)
|
97
|
+
end
|
98
|
+
|
99
|
+
linter.define_singleton_method('name') do
|
100
|
+
'Method Linter'
|
101
|
+
end
|
102
|
+
|
103
|
+
linter.define_singleton_method('message') do
|
104
|
+
'Method Foo!'
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
linter }
|
109
|
+
|
110
|
+
|
111
|
+
it 'uses #name instead of the provided name' do
|
112
|
+
expect(subject.name).to eq('Method Linter')
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'uses #rule instead of the provided rule' do
|
116
|
+
expect(subject.lint(good_data)).to be_nil
|
117
|
+
expect(subject.lint(bad_data)).to_not be_nil
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'uses #message instead of the provided message' do
|
121
|
+
result = subject.lint(bad_data)
|
122
|
+
|
123
|
+
expect(result[:problem]).to eq('Method Foo!')
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'with neither custom values nor methods' do
|
129
|
+
|
130
|
+
subject { CukeLinter::Linter.new }
|
131
|
+
|
132
|
+
|
133
|
+
it 'complains if not provided with a rule' do
|
134
|
+
expect { subject.lint('Anything') }.to raise_error('No linting rule provided!')
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
it 'has a default name based on its class' do
|
139
|
+
expect(subject.name).to eq('Linter')
|
140
|
+
|
141
|
+
class CustomLinter < CukeLinter::Linter;
|
142
|
+
end
|
143
|
+
|
144
|
+
expect(CustomLinter.new.name).to eq('CustomLinter')
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'has a default message based on its name' do
|
148
|
+
linter_options[:message] = nil
|
149
|
+
|
150
|
+
# Default name
|
151
|
+
linter_options[:name] = nil
|
152
|
+
linter = CukeLinter::Linter.new(linter_options)
|
153
|
+
result = linter.lint(bad_data)
|
154
|
+
|
155
|
+
expect(result[:problem]).to eq('Linter problem detected')
|
156
|
+
|
157
|
+
# Value name
|
158
|
+
linter_options[:name] = 'Value name'
|
159
|
+
linter = CukeLinter::Linter.new(linter_options)
|
160
|
+
result = linter.lint(bad_data)
|
161
|
+
|
162
|
+
expect(result[:problem]).to eq('Value name problem detected')
|
163
|
+
|
164
|
+
# Method name
|
165
|
+
class CustomLinter < CukeLinter::Linter;
|
166
|
+
def name
|
167
|
+
'Method name'
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
linter_options[:name] = nil
|
172
|
+
linter = CustomLinter.new(linter_options)
|
173
|
+
result = linter.lint(bad_data)
|
174
|
+
|
175
|
+
expect(result[:problem]).to eq('Method name problem detected')
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
@@ -16,22 +16,22 @@ shared_examples_for 'a linter at the unit level' do
|
|
16
16
|
|
17
17
|
context 'with good data' do
|
18
18
|
|
19
|
-
it 'returns
|
20
|
-
expect(subject.lint(good_data)).to
|
19
|
+
it 'returns no problem' do
|
20
|
+
expect(subject.lint(good_data)).to be_nil
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
24
24
|
|
25
25
|
context 'with bad data' do
|
26
26
|
|
27
|
-
it 'returns a
|
28
|
-
expect(subject.lint(bad_data)).to_not
|
27
|
+
it 'returns a detected problems' do
|
28
|
+
expect(subject.lint(bad_data)).to_not be_nil
|
29
29
|
end
|
30
30
|
|
31
|
-
it 'includes the
|
32
|
-
|
31
|
+
it 'includes the problem and its locations in its result' do
|
32
|
+
result = subject.lint(bad_data)
|
33
33
|
|
34
|
-
|
34
|
+
expect(result.keys).to match_array([:problem, :location])
|
35
35
|
end
|
36
36
|
|
37
37
|
end
|
@@ -49,9 +49,9 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'records a problem' do
|
52
|
-
|
52
|
+
result = subject.lint(test_model)
|
53
53
|
|
54
|
-
expect(
|
54
|
+
expect(result[:problem]).to eq('Outline has only one example row')
|
55
55
|
end
|
56
56
|
|
57
57
|
end
|
@@ -71,9 +71,9 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'records a problem' do
|
74
|
-
|
74
|
+
result = subject.lint(test_model)
|
75
75
|
|
76
|
-
expect(
|
76
|
+
expect(result[:problem]).to eq('Outline has only one example row')
|
77
77
|
end
|
78
78
|
|
79
79
|
end
|
@@ -92,11 +92,11 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
92
92
|
model_1.source_line = 1
|
93
93
|
model_2.source_line = 3
|
94
94
|
|
95
|
-
|
96
|
-
expect(
|
95
|
+
result = subject.lint(model_1)
|
96
|
+
expect(result[:location]).to eq('path_to_file:1')
|
97
97
|
|
98
|
-
|
99
|
-
expect(
|
98
|
+
result = subject.lint(model_2)
|
99
|
+
expect(result[:location]).to eq('path_to_file:3')
|
100
100
|
end
|
101
101
|
|
102
102
|
end
|
@@ -117,7 +117,7 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
117
117
|
end
|
118
118
|
|
119
119
|
it 'does not record a problem' do
|
120
|
-
expect(subject.lint(test_model)).to eq(
|
120
|
+
expect(subject.lint(test_model)).to eq(nil)
|
121
121
|
end
|
122
122
|
|
123
123
|
end
|
@@ -138,7 +138,7 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
138
138
|
end
|
139
139
|
|
140
140
|
it 'does not record a problem' do
|
141
|
-
expect(subject.lint(test_model)).to eq(
|
141
|
+
expect(subject.lint(test_model)).to eq(nil)
|
142
142
|
end
|
143
143
|
|
144
144
|
end
|
@@ -159,7 +159,7 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
159
159
|
end
|
160
160
|
|
161
161
|
it 'does not record a problem' do
|
162
|
-
expect(subject.lint(test_model)).to eq(
|
162
|
+
expect(subject.lint(test_model)).to eq(nil)
|
163
163
|
end
|
164
164
|
|
165
165
|
end
|
@@ -173,7 +173,7 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
173
173
|
end
|
174
174
|
|
175
175
|
it 'does not record a problem' do
|
176
|
-
expect(subject.lint(test_model)).to eq(
|
176
|
+
expect(subject.lint(test_model)).to eq(nil)
|
177
177
|
end
|
178
178
|
|
179
179
|
end
|
@@ -192,7 +192,7 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
192
192
|
end
|
193
193
|
|
194
194
|
it 'does not record a problem' do
|
195
|
-
expect(subject.lint(test_model)).to eq(
|
195
|
+
expect(subject.lint(test_model)).to eq(nil)
|
196
196
|
end
|
197
197
|
|
198
198
|
end
|
@@ -211,7 +211,7 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
211
211
|
end
|
212
212
|
|
213
213
|
it 'does not record a problem' do
|
214
|
-
expect(subject.lint(test_model)).to eq(
|
214
|
+
expect(subject.lint(test_model)).to eq(nil)
|
215
215
|
end
|
216
216
|
|
217
217
|
end
|
@@ -220,10 +220,10 @@ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
|
|
220
220
|
|
221
221
|
context 'a non-outline model' do
|
222
222
|
|
223
|
-
it 'returns
|
224
|
-
|
223
|
+
it 'returns no result' do
|
224
|
+
result = subject.lint(CukeModeler::Model.new)
|
225
225
|
|
226
|
-
expect(
|
226
|
+
expect(result).to eq(nil)
|
227
227
|
end
|
228
228
|
|
229
229
|
end
|
@@ -60,29 +60,29 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'records a problem' do
|
63
|
-
|
63
|
+
result = subject.lint(test_model)
|
64
64
|
|
65
|
-
expect(
|
65
|
+
expect(result[:problem]).to match(/^Test has too many steps. \d+ steps found \(max 10\)/)
|
66
66
|
end
|
67
67
|
|
68
68
|
it 'records the location of the problem' do
|
69
69
|
test_model.source_line = 1
|
70
|
-
|
71
|
-
expect(
|
70
|
+
result = subject.lint(test_model)
|
71
|
+
expect(result[:location]).to eq('path_to_file:1')
|
72
72
|
|
73
73
|
test_model.source_line = 3
|
74
|
-
|
75
|
-
expect(
|
74
|
+
result = subject.lint(test_model)
|
75
|
+
expect(result[:location]).to eq('path_to_file:3')
|
76
76
|
end
|
77
77
|
|
78
78
|
it 'includes the number of steps found in the problem record' do
|
79
79
|
step_count = test_model.steps.count
|
80
|
-
|
81
|
-
expect(
|
80
|
+
result = subject.lint(test_model)
|
81
|
+
expect(result[:problem]).to eq("Test has too many steps. #{step_count} steps found (max 10)")
|
82
82
|
|
83
83
|
test_model.steps << :another_step
|
84
|
-
|
85
|
-
expect(
|
84
|
+
result = subject.lint(test_model)
|
85
|
+
expect(result[:problem]).to eq("Test has too many steps. #{step_count + 1} steps found (max 10)")
|
86
86
|
end
|
87
87
|
|
88
88
|
end
|
@@ -99,7 +99,7 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
99
99
|
end
|
100
100
|
|
101
101
|
it 'does not record a problem' do
|
102
|
-
expect(subject.lint(test_model)).to eq(
|
102
|
+
expect(subject.lint(test_model)).to eq(nil)
|
103
103
|
end
|
104
104
|
|
105
105
|
end
|
@@ -116,7 +116,7 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
116
116
|
end
|
117
117
|
|
118
118
|
it 'does not record a problem' do
|
119
|
-
expect(subject.lint(test_model)).to eq(
|
119
|
+
expect(subject.lint(test_model)).to eq(nil)
|
120
120
|
end
|
121
121
|
|
122
122
|
end
|
@@ -131,7 +131,7 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
131
131
|
end
|
132
132
|
|
133
133
|
it 'does not record a problem' do
|
134
|
-
expect(subject.lint(test_model)).to eq(
|
134
|
+
expect(subject.lint(test_model)).to eq(nil)
|
135
135
|
end
|
136
136
|
|
137
137
|
end
|
@@ -158,9 +158,9 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
it 'defaults to a step threshold of 10 steps' do
|
161
|
-
|
161
|
+
result = subject.lint(unconfigured_test_model)
|
162
162
|
|
163
|
-
expect(
|
163
|
+
expect(result[:problem]).to match(/^Test has too many steps. #{unconfigured_test_model.steps.count} steps found \(max 10\)/)
|
164
164
|
end
|
165
165
|
|
166
166
|
end
|
@@ -178,9 +178,9 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
178
178
|
end
|
179
179
|
|
180
180
|
it 'defaults to a step threshold of 10 steps' do
|
181
|
-
|
181
|
+
result = subject.lint(configured_test_model)
|
182
182
|
|
183
|
-
expect(
|
183
|
+
expect(result[:problem]).to match(/^Test has too many steps. #{configured_test_model.steps.count} steps found \(max 10\)/)
|
184
184
|
end
|
185
185
|
|
186
186
|
end
|
@@ -203,9 +203,9 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
203
203
|
end
|
204
204
|
|
205
205
|
it 'the step threshold used is the configured value' do
|
206
|
-
|
206
|
+
result = subject.lint(configured_test_model)
|
207
207
|
|
208
|
-
expect(
|
208
|
+
expect(result[:problem]).to match(/^Test has too many steps. #{configured_test_model.steps.count} steps found \(max #{step_threshhold}\)/)
|
209
209
|
end
|
210
210
|
|
211
211
|
end
|
@@ -218,10 +218,10 @@ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
|
|
218
218
|
|
219
219
|
let(:test_model) { CukeModeler::Model.new }
|
220
220
|
|
221
|
-
it 'returns
|
222
|
-
|
221
|
+
it 'returns no result' do
|
222
|
+
result = subject.lint(test_model)
|
223
223
|
|
224
|
-
expect(
|
224
|
+
expect(result).to eq(nil)
|
225
225
|
end
|
226
226
|
|
227
227
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cuke_linter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kessler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cuke_modeler
|
@@ -178,6 +178,7 @@ files:
|
|
178
178
|
- lib/cuke_linter/formatters/pretty_formatter.rb
|
179
179
|
- lib/cuke_linter/linters/example_without_name_linter.rb
|
180
180
|
- lib/cuke_linter/linters/feature_without_scenarios_linter.rb
|
181
|
+
- lib/cuke_linter/linters/linter.rb
|
181
182
|
- lib/cuke_linter/linters/outline_with_single_example_row_linter.rb
|
182
183
|
- lib/cuke_linter/linters/test_with_too_many_steps_linter.rb
|
183
184
|
- lib/cuke_linter/version.rb
|
@@ -185,6 +186,7 @@ files:
|
|
185
186
|
- testing/cucumber/features/configuration/configuring_linters.feature
|
186
187
|
- testing/cucumber/features/configuration/using_configurations.feature
|
187
188
|
- testing/cucumber/features/formatters/pretty_formatter.feature
|
189
|
+
- testing/cucumber/features/linters/custom_linters.feature
|
188
190
|
- testing/cucumber/features/linters/default_linters.feature
|
189
191
|
- testing/cucumber/features/linters/example_without_name.feature
|
190
192
|
- testing/cucumber/features/linters/feature_without_scenarios.feature
|
@@ -202,6 +204,7 @@ files:
|
|
202
204
|
- testing/rspec/spec/integration/formatters/pretty_formatter_integration_spec.rb
|
203
205
|
- testing/rspec/spec/integration/linters/example_without_name_linter_integration_spec.rb
|
204
206
|
- testing/rspec/spec/integration/linters/feature_without_scenarios_linter_integration_spec.rb
|
207
|
+
- testing/rspec/spec/integration/linters/linter_integration_spec.rb
|
205
208
|
- testing/rspec/spec/integration/linters/linter_integration_specs.rb
|
206
209
|
- testing/rspec/spec/integration/linters/outline_with_single_example_row_linter_integration_spec.rb
|
207
210
|
- testing/rspec/spec/integration/linters/test_with_too_many_steps_linter_integration_spec.rb
|
@@ -211,6 +214,7 @@ files:
|
|
211
214
|
- testing/rspec/spec/unit/linters/configurable_linter_unit_specs.rb
|
212
215
|
- testing/rspec/spec/unit/linters/example_without_name_linter_unit_spec.rb
|
213
216
|
- testing/rspec/spec/unit/linters/feature_without_scenarios_linter_unit_spec.rb
|
217
|
+
- testing/rspec/spec/unit/linters/linter_unit_spec.rb
|
214
218
|
- testing/rspec/spec/unit/linters/linter_unit_specs.rb
|
215
219
|
- testing/rspec/spec/unit/linters/outline_with_single_example_row_linter_unit_spec.rb
|
216
220
|
- testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb
|