cuke_linter 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -1
  3. data/CONTRIBUTING.md +26 -0
  4. data/README.md +2 -15
  5. data/lib/cuke_linter.rb +36 -18
  6. data/lib/cuke_linter/linters/example_without_name_linter.rb +1 -1
  7. data/lib/cuke_linter/linters/feature_with_too_many_different_tags_linter.rb +38 -0
  8. data/lib/cuke_linter/linters/test_should_use_background_linter.rb +28 -0
  9. data/lib/cuke_linter/linters/test_with_action_step_as_final_step_linter.rb +23 -0
  10. data/lib/cuke_linter/linters/test_with_setup_step_after_action_step_linter.rb +31 -0
  11. data/lib/cuke_linter/linters/test_with_setup_step_after_verification_step_linter.rb +31 -0
  12. data/lib/cuke_linter/linters/test_with_setup_step_as_final_step_linter.rb +23 -0
  13. data/lib/cuke_linter/version.rb +1 -1
  14. data/testing/cucumber/features/default_linters.feature +20 -14
  15. data/testing/cucumber/features/linters/example_without_name.feature +8 -6
  16. data/testing/cucumber/features/linters/feature_with_too_many_different_tags.feature +56 -0
  17. data/testing/cucumber/features/linters/step_with_end_period.feature +1 -1
  18. data/testing/cucumber/features/linters/test_should_use_background.feature +29 -0
  19. data/testing/cucumber/features/linters/test_with_action_as_final_step.feature +28 -0
  20. data/testing/cucumber/features/linters/test_with_setup_step_after_action_step.feature +30 -0
  21. data/testing/cucumber/features/linters/test_with_setup_step_after_verification_step.feature +30 -0
  22. data/testing/cucumber/features/linters/test_with_setup_step_as_final_step.feature +28 -0
  23. data/testing/cucumber/features/linters/test_with_too_many_steps.feature +5 -0
  24. data/testing/cucumber/step_definitions/setup_steps.rb +28 -0
  25. data/testing/model_factory.rb +1 -1
  26. data/testing/rspec/spec/integration/cuke_linter_integration_spec.rb +12 -0
  27. data/testing/rspec/spec/integration/linters/feature_with_too_many_different_tags_linter_integration_spec.rb +8 -0
  28. data/testing/rspec/spec/integration/linters/test_should_use_background_linter_integration_spec.rb +8 -0
  29. data/testing/rspec/spec/integration/linters/test_with_action_step_as_final_step_linter_integration_spec.rb +8 -0
  30. data/testing/rspec/spec/integration/linters/test_with_setup_step_after_action_step_linter_integration_spec.rb +8 -0
  31. data/testing/rspec/spec/integration/linters/test_with_setup_step_after_verification_step_linter_integration_spec.rb +8 -0
  32. data/testing/rspec/spec/integration/linters/test_with_setup_step_as_final_step_linter_integration_spec.rb +8 -0
  33. data/testing/rspec/spec/unit/linters/background_does_more_than_setup_linter_unit_spec.rb +20 -57
  34. data/testing/rspec/spec/unit/linters/element_with_too_many_tags_linter_unit_spec.rb +18 -52
  35. data/testing/rspec/spec/unit/linters/example_without_name_linter_unit_spec.rb +41 -43
  36. data/testing/rspec/spec/unit/linters/feature_with_too_many_different_tags_linter_unit_spec.rb +293 -0
  37. data/testing/rspec/spec/unit/linters/feature_without_description_linter_unit_spec.rb +25 -42
  38. data/testing/rspec/spec/unit/linters/feature_without_name_linter_unit_spec.rb +10 -38
  39. data/testing/rspec/spec/unit/linters/feature_without_scenarios_linter_unit_spec.rb +32 -52
  40. data/testing/rspec/spec/unit/linters/linter_unit_spec.rb +27 -10
  41. data/testing/rspec/spec/unit/linters/linter_unit_specs.rb +26 -12
  42. data/testing/rspec/spec/unit/linters/outline_with_single_example_row_linter_unit_spec.rb +19 -66
  43. data/testing/rspec/spec/unit/linters/single_test_background_linter_unit_spec.rb +12 -39
  44. data/testing/rspec/spec/unit/linters/step_with_end_period_linter_unit_spec.rb +9 -28
  45. data/testing/rspec/spec/unit/linters/step_with_too_many_characters_linter_unit_spec.rb +19 -45
  46. data/testing/rspec/spec/unit/linters/test_should_use_background_linter_unit_spec.rb +226 -0
  47. data/testing/rspec/spec/unit/linters/test_with_action_step_as_final_step_linter_unit_spec.rb +98 -0
  48. data/testing/rspec/spec/unit/linters/test_with_no_action_step_linter_unit_spec.rb +10 -51
  49. data/testing/rspec/spec/unit/linters/test_with_no_name_linter_unit_spec.rb +11 -38
  50. data/testing/rspec/spec/unit/linters/test_with_no_verification_step_linter_unit_spec.rb +16 -54
  51. data/testing/rspec/spec/unit/linters/test_with_setup_step_after_action_step_linter_unit_spec.rb +124 -0
  52. data/testing/rspec/spec/unit/linters/test_with_setup_step_after_verification_step_linter_unit_spec.rb +125 -0
  53. data/testing/rspec/spec/unit/linters/test_with_setup_step_as_final_step_linter_unit_spec.rb +98 -0
  54. data/testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb +9 -49
  55. metadata +27 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 064456ffb63c27969a361497f8c1d6c9f9b96f5a59f488506db5611faa695f0f
4
- data.tar.gz: b31161d84e3bda65527caa854bdcfcb2e1bdaca8a0f94b4dc540d00274d54bdf
3
+ metadata.gz: 5bc16cc61de218e7a1790a86b16d614e9b831e24fb31b46dafa7fe60fbc6768a
4
+ data.tar.gz: d4bc88c2c166feef1057e89d2430889cb3baa4522a7bf03e2cc2a05586069707
5
5
  SHA512:
6
- metadata.gz: b83fad28c5cd56da418697695f4333659f8cd16f750e4be51cd796e62a979c125413aa7b9d443ef56a832e1585b7247e9eb07512acb62e9071a074ed3593e079
7
- data.tar.gz: 414f730e30415505687acc8abc8a197ba7d49e1bdb6ff9337d079d4450e928cb88d3582f85124b047bd554d13a0f2cf6fbb13f6c43e6a58db26b8ffb41e36d8a
6
+ metadata.gz: 2504c5d82a51883f883976bc427b9894a8af138a92bd4d714d8cac8c0dbfca9bff9467811002cfd748ad9f9f8d47ce3584d30443927cbce029ceb2549d8c12bb
7
+ data.tar.gz: 557843507486823449ff2cfed0e8e69f1b5500f3996a42df170e83286ef61d247bc586f3cf04b2393ad5b4b619080a9a95264620631dd82b8f0490cb411241dc
data/CHANGELOG.md CHANGED
@@ -8,6 +8,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
 
9
9
  Nothing yet...
10
10
 
11
+
12
+ ## [0.10.0] - 2019-10-04
13
+
14
+ ### Added
15
+ - New linters
16
+ - FeatureWithTooManyDifferentTagsLinter
17
+ - TestShouldUseBackgroundLinter
18
+ - TestWithActionStepAsFinalStepLinter
19
+ - TestWithSetupStepAfterActionStepLinter
20
+ - TestWithSetupStepAfterVerificationStepLinter
21
+ - TestWithSetupStepAsFinalStepLinter
22
+
23
+ ### Changed
24
+ - Improved some of the documentation and linting messages so that it is more clear what the problem is.
25
+
11
26
  ## [0.9.0] - 2019-09-11
12
27
 
13
28
  ### Added
@@ -90,7 +105,8 @@ Nothing yet...
90
105
  - Custom linters, formatters, and command line usability
91
106
 
92
107
 
93
- [Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.9.0...HEAD
108
+ [Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.10.0...HEAD
109
+ [0.10.0]: https://github.com/enkessler/cuke_linter/compare/v0.9.0...v0.10.0
94
110
  [0.9.0]: https://github.com/enkessler/cuke_linter/compare/v0.8.0...v0.9.0
95
111
  [0.8.0]: https://github.com/enkessler/cuke_linter/compare/v0.7.0...v0.8.0
96
112
  [0.7.0]: https://github.com/enkessler/cuke_linter/compare/v0.6.0...v0.7.0
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,26 @@
1
+ # Development
2
+
3
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake cuke_linter:test_everything` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
4
+
5
+
6
+ ## Contributing
7
+
8
+ Bug reports and pull requests are welcome on GitHub at https://github.com/enkessler/cuke_linter.
9
+
10
+ 1. Fork it
11
+ 2. Create your feature branch **(off of the development branch)**
12
+ `git checkout -b my-new-feature dev`
13
+ 3. Commit your changes
14
+ `git commit -am 'Add some feature'`
15
+ 4. Push to the branch
16
+ `git push origin my-new-feature`
17
+ 5. Create new Pull Request
18
+
19
+
20
+ ### Adding a new linter
21
+
22
+ Some guidelines when adding a new linter
23
+ * Inherit from the base linter class. It will handle almost all of the functional requirements of a linter.
24
+ * Existing linters should provide decent examples of how to create new linters and how to test them. A copy/paste/tweak approach is perfectly valid.
25
+ * Keep linters simple. Rather than have one linter that has different behaviors depending on context, create a different linter class for each context.
26
+ * Keep things alphabetical. There are going to be lots of linters and things will be easier to find if lists of them in the code base (e.g. `require` statments, documentation, etc.) are in an intuitive order.
data/README.md CHANGED
@@ -147,23 +147,10 @@ Rather than using the default linters or providing a custom set of of modified l
147
147
 
148
148
  For more detailed examples of usage, see the documentation [here](https://app.cucumber.pro/projects/cuke_linter).
149
149
 
150
+ ## Development and Contributing
150
151
 
151
- ## Development
152
+ See [CONTRIBUTING.md](https://github.com/enkessler/cuke_linter/blob/master/CONTRIBUTING.md)
152
153
 
153
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake cuke_linter:test_everything` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
154
-
155
- ## Contributing
156
-
157
- Bug reports and pull requests are welcome on GitHub at https://github.com/enkessler/cuke_linter.
158
-
159
- 1. Fork it
160
- 2. Create your feature branch **(off of the development branch)**
161
- `git checkout -b my-new-feature`
162
- 3. Commit your changes
163
- `git commit -am 'Add some feature'`
164
- 4. Push to the branch
165
- `git push origin my-new-feature`
166
- 5. Create new Pull Request
167
154
 
168
155
  ## License
169
156
 
data/lib/cuke_linter.rb CHANGED
@@ -7,6 +7,7 @@ require 'cuke_linter/linters/linter'
7
7
  require 'cuke_linter/linters/background_does_more_than_setup_linter'
8
8
  require 'cuke_linter/linters/element_with_too_many_tags_linter'
9
9
  require 'cuke_linter/linters/example_without_name_linter'
10
+ require 'cuke_linter/linters/feature_with_too_many_different_tags_linter'
10
11
  require 'cuke_linter/linters/feature_without_name_linter'
11
12
  require 'cuke_linter/linters/feature_without_description_linter'
12
13
  require 'cuke_linter/linters/feature_without_scenarios_linter'
@@ -14,9 +15,14 @@ require 'cuke_linter/linters/outline_with_single_example_row_linter'
14
15
  require 'cuke_linter/linters/single_test_background_linter'
15
16
  require 'cuke_linter/linters/step_with_end_period_linter'
16
17
  require 'cuke_linter/linters/step_with_too_many_characters_linter'
18
+ require 'cuke_linter/linters/test_should_use_background_linter'
19
+ require 'cuke_linter/linters/test_with_action_step_as_final_step_linter'
17
20
  require 'cuke_linter/linters/test_with_no_action_step_linter'
18
21
  require 'cuke_linter/linters/test_with_no_name_linter'
19
22
  require 'cuke_linter/linters/test_with_no_verification_step_linter'
23
+ require 'cuke_linter/linters/test_with_setup_step_after_action_step_linter'
24
+ require 'cuke_linter/linters/test_with_setup_step_after_verification_step_linter'
25
+ require 'cuke_linter/linters/test_with_setup_step_as_final_step_linter'
20
26
  require 'cuke_linter/linters/test_with_too_many_steps_linter'
21
27
 
22
28
 
@@ -24,20 +30,26 @@ require 'cuke_linter/linters/test_with_too_many_steps_linter'
24
30
 
25
31
  module CukeLinter
26
32
 
27
- @original_linters = { 'BackgroundDoesMoreThanSetupLinter' => BackgroundDoesMoreThanSetupLinter.new,
28
- 'ElementWithTooManyTagsLinter' => ElementWithTooManyTagsLinter.new,
29
- 'ExampleWithoutNameLinter' => ExampleWithoutNameLinter.new,
30
- 'FeatureWithoutDescriptionLinter' => FeatureWithoutDescriptionLinter.new,
31
- 'FeatureWithoutNameLinter' => FeatureWithoutNameLinter.new,
32
- 'FeatureWithoutScenariosLinter' => FeatureWithoutScenariosLinter.new,
33
- 'OutlineWithSingleExampleRowLinter' => OutlineWithSingleExampleRowLinter.new,
34
- 'SingleTestBackgroundLinter' => SingleTestBackgroundLinter.new,
35
- 'StepWithEndPeriodLinter' => StepWithEndPeriodLinter.new,
36
- 'TestWithNoActionStepLinter' => TestWithNoActionStepLinter.new,
37
- 'TestWithNoNameLinter' => TestWithNoNameLinter.new,
38
- 'TestWithNoVerificationStepLinter' => TestWithNoVerificationStepLinter.new,
39
- 'StepWithTooManyCharactersLinter' => StepWithTooManyCharactersLinter.new,
40
- 'TestWithTooManyStepsLinter' => TestWithTooManyStepsLinter.new }
33
+ @original_linters = { 'BackgroundDoesMoreThanSetupLinter' => BackgroundDoesMoreThanSetupLinter.new,
34
+ 'ElementWithTooManyTagsLinter' => ElementWithTooManyTagsLinter.new,
35
+ 'ExampleWithoutNameLinter' => ExampleWithoutNameLinter.new,
36
+ 'FeatureWithTooManyDifferentTagsLinter' => FeatureWithTooManyDifferentTagsLinter.new,
37
+ 'FeatureWithoutDescriptionLinter' => FeatureWithoutDescriptionLinter.new,
38
+ 'FeatureWithoutNameLinter' => FeatureWithoutNameLinter.new,
39
+ 'FeatureWithoutScenariosLinter' => FeatureWithoutScenariosLinter.new,
40
+ 'OutlineWithSingleExampleRowLinter' => OutlineWithSingleExampleRowLinter.new,
41
+ 'SingleTestBackgroundLinter' => SingleTestBackgroundLinter.new,
42
+ 'StepWithEndPeriodLinter' => StepWithEndPeriodLinter.new,
43
+ 'StepWithTooManyCharactersLinter' => StepWithTooManyCharactersLinter.new,
44
+ 'TestShouldUseBackgroundLinter' => TestShouldUseBackgroundLinter.new,
45
+ 'TestWithActionStepAsFinalStepLinter' => TestWithActionStepAsFinalStepLinter.new,
46
+ 'TestWithNoActionStepLinter' => TestWithNoActionStepLinter.new,
47
+ 'TestWithNoNameLinter' => TestWithNoNameLinter.new,
48
+ 'TestWithNoVerificationStepLinter' => TestWithNoVerificationStepLinter.new,
49
+ 'TestWithSetupStepAfterActionStepLinter' => TestWithSetupStepAfterActionStepLinter.new,
50
+ 'TestWithSetupStepAfterVerificationStepLinter' => TestWithSetupStepAfterVerificationStepLinter.new,
51
+ 'TestWithSetupStepAsFinalStepLinter' => TestWithSetupStepAsFinalStepLinter.new,
52
+ 'TestWithTooManyStepsLinter' => TestWithTooManyStepsLinter.new }
41
53
 
42
54
 
43
55
  # Configures linters based on the given options
@@ -97,8 +109,15 @@ module CukeLinter
97
109
  # Lints the given model trees and file paths using the given linting objects and formatting the results with the given formatters and their respective output locations
98
110
  def self.lint(file_paths: [], model_trees: [], linters: self.registered_linters.values, formatters: [[CukeLinter::PrettyFormatter.new]])
99
111
 
100
- model_trees = [CukeModeler::Directory.new(Dir.pwd)] if model_trees.empty? && file_paths.empty?
101
- file_path_models = file_paths.collect do |file_path|
112
+ # TODO: Test this?
113
+ # Because directive memoization is based on a model's `#object_id` and Ruby reuses object IDs over the life
114
+ # life of a program as objects are garbage collected, it is not safe to remember the IDs forever. However,
115
+ # models shouldn't get GC'd in the middle of the linting process and so the start of the linting process is
116
+ # a good time to reset things
117
+ @directives_for_feature_file = {}
118
+
119
+ model_trees = [CukeModeler::Directory.new(Dir.pwd)] if model_trees.empty? && file_paths.empty?
120
+ file_path_models = file_paths.collect do |file_path|
102
121
  # TODO: raise exception unless path exists
103
122
  case
104
123
  when File.directory?(file_path)
@@ -178,8 +197,7 @@ module CukeLinter
178
197
 
179
198
 
180
199
  def self.linter_directives_for_feature_file(feature_file_model)
181
- # IMPORTANT ASSUMPTION: Models never change during the life of the program, so data only has to be gathered once
182
- @directives_for_feature_file ||= {}
200
+ # IMPORTANT ASSUMPTION: Models never change during the life of a linting, so data only has to be gathered once
183
201
  return @directives_for_feature_file[feature_file_model.object_id] if @directives_for_feature_file[feature_file_model.object_id]
184
202
 
185
203
 
@@ -13,7 +13,7 @@ module CukeLinter
13
13
 
14
14
  # The message used to describe the problem that has been found
15
15
  def message
16
- 'Example has no name'
16
+ 'Example grouping has no name'
17
17
  end
18
18
 
19
19
  end
@@ -0,0 +1,38 @@
1
+ module CukeLinter
2
+
3
+ # A linter that detects features that contain too many different tags
4
+
5
+ class FeatureWithTooManyDifferentTagsLinter < Linter
6
+
7
+ # Changes the linting settings on the linter using the provided configuration
8
+ def configure(options)
9
+ @tag_threshold = options['TagCountThreshold']
10
+ end
11
+
12
+ # The rule used to determine if a model has a problem
13
+ def rule(model)
14
+ return false unless model.is_a?(CukeModeler::Feature)
15
+
16
+ tags = model.tags
17
+
18
+ model.each_descendant do |descendant_model|
19
+ if descendant_model.respond_to?(:tags)
20
+ tags.concat(descendant_model.tags)
21
+ end
22
+ end
23
+
24
+ tags = tags.collect(&:name).uniq
25
+
26
+ @linted_tag_threshold = @tag_threshold || 10
27
+ @linted_tag_count = tags.count
28
+
29
+ @linted_tag_count > @linted_tag_threshold
30
+ end
31
+
32
+ # The message used to describe the problem that has been found
33
+ def message
34
+ "Feature contains too many different tags. #{@linted_tag_count} tags found (max #{@linted_tag_threshold})."
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,28 @@
1
+ module CukeLinter
2
+
3
+ # A linter that detects scenarios and outlines within a feature that all share common beginning steps
4
+
5
+ class TestShouldUseBackgroundLinter < Linter
6
+
7
+ # The rule used to determine if a model has a problem
8
+ def rule(model)
9
+ return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
10
+
11
+ model_steps = model.steps || []
12
+ parent_feature_model = model.get_ancestor(:feature)
13
+
14
+ return false unless parent_feature_model.tests.count > 1
15
+
16
+ parent_feature_model.tests.all? do |test|
17
+ test_steps = test.steps || []
18
+ test_steps.first == model_steps.first
19
+ end
20
+ end
21
+
22
+ # The message used to describe the problem that has been found
23
+ def message
24
+ 'Test shares steps with all other tests in feature. Use a background.'
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ module CukeLinter
2
+
3
+ # A linter that detects scenarios and outlines that have an action step as their final step
4
+
5
+ class TestWithActionStepAsFinalStepLinter < Linter
6
+
7
+ # The rule used to determine if a model has a problem
8
+ def rule(model)
9
+ return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
10
+
11
+ model_steps = model.steps || []
12
+ return false unless model_steps.last
13
+
14
+ model_steps.last.keyword == 'When'
15
+ end
16
+
17
+ # The message used to describe the problem that has been found
18
+ def message
19
+ "Test has 'When' as the final step."
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ module CukeLinter
2
+
3
+ # A linter that detects scenarios and outlines that have a setup step that comes after an action step
4
+
5
+ class TestWithSetupStepAfterActionStepLinter < Linter
6
+
7
+ # The rule used to determine if a model has a problem
8
+ def rule(model)
9
+ return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
10
+
11
+ model_steps = model.steps || []
12
+ action_step_found = false
13
+
14
+ model_steps.each do |step|
15
+ if action_step_found
16
+ return true if step.keyword == 'Given'
17
+ else
18
+ action_step_found = step.keyword == 'When'
19
+ end
20
+ end
21
+
22
+ false
23
+ end
24
+
25
+ # The message used to describe the problem that has been found
26
+ def message
27
+ "Test has 'Given' step after 'When' step."
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ module CukeLinter
2
+
3
+ # A linter that detects scenarios and outlines that have a setup step that comes after a verification step
4
+
5
+ class TestWithSetupStepAfterVerificationStepLinter < Linter
6
+
7
+ # The rule used to determine if a model has a problem
8
+ def rule(model)
9
+ return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
10
+
11
+ model_steps = model.steps || []
12
+ verification_step_found = false
13
+
14
+ model_steps.each do |step|
15
+ if verification_step_found
16
+ return true if step.keyword == 'Given'
17
+ else
18
+ verification_step_found = step.keyword == 'Then'
19
+ end
20
+ end
21
+
22
+ false
23
+ end
24
+
25
+ # The message used to describe the problem that has been found
26
+ def message
27
+ "Test has 'Given' step after 'Then' step."
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ module CukeLinter
2
+
3
+ # A linter that detects scenarios and outlines that have a setup step as their final step
4
+
5
+ class TestWithSetupStepAsFinalStepLinter < Linter
6
+
7
+ # The rule used to determine if a model has a problem
8
+ def rule(model)
9
+ return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
10
+
11
+ model_steps = model.steps || []
12
+ return false unless model_steps.last
13
+
14
+ model_steps.last.keyword == 'Given'
15
+ end
16
+
17
+ # The message used to describe the problem that has been found
18
+ def message
19
+ "Test has 'Given' as the final step."
20
+ end
21
+
22
+ end
23
+ end
@@ -1,4 +1,4 @@
1
1
  module CukeLinter
2
2
  # The release version of this gem
3
- VERSION = "0.9.0"
3
+ VERSION = '0.10.0'
4
4
  end
@@ -8,20 +8,26 @@ Feature: Default Linters
8
8
  Scenario: Using the default linters
9
9
  Given no other linters have been registered or unregistered
10
10
  Then the following linters are registered by default
11
- | BackgroundDoesMoreThanSetupLinter |
12
- | ElementWithTooManyTagsLinter |
13
- | ExampleWithoutNameLinter |
14
- | FeatureWithoutDescriptionLinter |
15
- | FeatureWithoutNameLinter |
16
- | FeatureWithoutScenariosLinter |
17
- | OutlineWithSingleExampleRowLinter |
18
- | SingleTestBackgroundLinter |
19
- | StepWithEndPeriodLinter |
20
- | StepWithTooManyCharactersLinter |
21
- | TestWithNoActionStepLinter |
22
- | TestWithNoNameLinter |
23
- | TestWithNoVerificationStepLinter |
24
- | TestWithTooManyStepsLinter |
11
+ | BackgroundDoesMoreThanSetupLinter |
12
+ | ElementWithTooManyTagsLinter |
13
+ | ExampleWithoutNameLinter |
14
+ | FeatureWithTooManyDifferentTagsLinter |
15
+ | FeatureWithoutDescriptionLinter |
16
+ | FeatureWithoutNameLinter |
17
+ | FeatureWithoutScenariosLinter |
18
+ | OutlineWithSingleExampleRowLinter |
19
+ | SingleTestBackgroundLinter |
20
+ | StepWithEndPeriodLinter |
21
+ | StepWithTooManyCharactersLinter |
22
+ | TestShouldUseBackgroundLinter |
23
+ | TestWithActionStepAsFinalStepLinter |
24
+ | TestWithNoActionStepLinter |
25
+ | TestWithNoNameLinter |
26
+ | TestWithNoVerificationStepLinter |
27
+ | TestWithSetupStepAfterActionStepLinter |
28
+ | TestWithSetupStepAfterVerificationStepLinter |
29
+ | TestWithSetupStepAsFinalStepLinter |
30
+ | TestWithTooManyStepsLinter |
25
31
 
26
32
 
27
33
  Scenario: Registering new linters
@@ -1,8 +1,8 @@
1
1
  Feature: Example without name linter
2
2
 
3
3
  As a reader of documentation
4
- I want every example to have a name
5
- So that I can understand the significance of the example grouping
4
+ I want every example grouping to have a name
5
+ So that I can understand the significance of the example data
6
6
 
7
7
 
8
8
  Scenario: Linting
@@ -13,18 +13,20 @@ Feature: Example without name linter
13
13
 
14
14
  Scenario Outline:
15
15
  * a step
16
- Examples:
16
+
17
+ Examples: Happy paths!
17
18
  | param |
18
19
  | value |
20
+
21
+ # Unknown paths :(
19
22
  Examples:
20
23
  | param |
21
24
  | value |
22
25
  """
23
26
  When it is linted
24
27
  Then an error is reported:
25
- | linter | problem | location |
26
- | ExampleWithoutNameLinter | Example has no name | <path_to_file>:5 |
27
- | ExampleWithoutNameLinter | Example has no name | <path_to_file>:8 |
28
+ | linter | problem | location |
29
+ | ExampleWithoutNameLinter | Example grouping has no name | <path_to_file>:11 |
28
30
 
29
31
  @wip
30
32
  Scenario: Configuration