chutney 3.3.0 → 3.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6725cb1d8360b6cf746da8362a04e4e1e1795ee21d70876d39ff08e230ffd0dd
4
- data.tar.gz: ad0cc926afdacbdcd8853866073102f0796f0cd3338b02f5ff5bdc69060c2724
3
+ metadata.gz: 0badc9f82efb1e59bc755597c4ef3f7a4f973e37fec2fc25d4b93192319a75eb
4
+ data.tar.gz: 9459b41ac94999efc721d07f54e8e14b3c83c4f00786f003937a65dd2054fb9f
5
5
  SHA512:
6
- metadata.gz: a36c2f5da40c1672b77dbbc836a4db6cccf7f445547303aae8e85392ab7b84daba918c8d0343eb73c4683f42c0fce03ebbaf4500a2690878a1fe4fdb5fe0385a
7
- data.tar.gz: 5a51f02edf59cee68d71855263cdc7692d6132c8eddeb5f97f8d1e3d0512a08e1533457f6545abf6f737dada8c36f81a83d29d6cea15a8c6f4c198a51a7c5728
6
+ metadata.gz: 404c7bd04be47d2c2fb6c71e9d44bc317b5d0a9abe1a3362945ce2841a76f9cc25eb7703cc39134c2065dfcc8c83d5f615f24e035160cd10aab09178e8f8d6fe
7
+ data.tar.gz: 29150aae2c605d2ce489dd3a41b914ad7bc67dc53867122c7c11b67830d5fe82771a433d0b6250c926d0e7bd34c0fa8af53941c734e32d5d8db3f435153f8c0f
data/README.md CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  </div>
21
21
 
22
- Read the documentation [here](https://billyruffian.github.io/chutney/) or try [Chutney Online](https://chutney.billy-ruffian.co.uk).
22
+ Read the documentation [here](https://billyruffian.github.io/chutney/).
23
23
 
24
24
  See [this page](https://billyruffian.github.io/chutney/usage/rules.html) for a full list of the rules chutney encourages.
25
25
 
data/chutney.gemspec CHANGED
@@ -50,7 +50,7 @@ Gem::Specification.new do |spec|
50
50
 
51
51
  spec.add_runtime_dependency 'amatch', '~> 0.4.0'
52
52
  spec.add_runtime_dependency 'cuke_modeler', '~> 3.3'
53
- spec.add_runtime_dependency 'i18n', '>= 1.8.2', '< 1.13.0'
53
+ spec.add_runtime_dependency 'i18n', '>= 1.8.2', '< 1.15.0'
54
54
  spec.add_runtime_dependency 'pastel', '~> 0.7'
55
55
  spec.add_runtime_dependency 'tty-pie', '~> 0.3'
56
56
 
@@ -61,7 +61,7 @@ Gem::Specification.new do |spec|
61
61
  spec.add_development_dependency 'rake', '~> 13.0'
62
62
  spec.add_development_dependency 'rerun', '~> 0.13'
63
63
  spec.add_development_dependency 'rspec-expectations', '~> 3.0'
64
- spec.add_development_dependency 'rubocop', '~> 1.32.0'
64
+ spec.add_development_dependency 'rubocop', '~> 1.50.2'
65
65
  spec.add_development_dependency 'rspec', '~> 3.8'
66
66
 
67
67
  spec.required_ruby_version = '>= 2.6'
@@ -24,16 +24,22 @@ GivensAfterBackground:
24
24
  Enabled: true
25
25
  MissingExampleName:
26
26
  Enabled: true
27
+ MissingExampleTable:
28
+ Enabled: true
27
29
  MissingFeatureDescription:
28
30
  Enabled: true
29
31
  MissingFeatureName:
30
32
  Enabled: true
31
33
  MissingScenarioName:
32
34
  Enabled: true
35
+ MissingScenarioOutline:
36
+ Enabled: true
33
37
  MissingTestAction:
34
38
  Enabled: true
35
39
  MissingVerification:
36
40
  Enabled: true
41
+ InconsistentQuoting:
42
+ Enabled: true
37
43
  InvalidFileName:
38
44
  Enabled: true
39
45
  InvalidStepFlow:
data/docs/usage/rules.md CHANGED
@@ -33,18 +33,24 @@ Chutney enforces its rules with the linters. These are:
33
33
 
34
34
  [GivensAfterBackground](https://github.com/BillyRuffian/chutney/blob/master/features/givens_after_background.feature): If you have a Background section and your scenario needs more preconditions then it should start immediately with an `And` step and not another `Given`.
35
35
 
36
+ [InconsistentQuoting](https://github.com/BillyRuffian/chutney/blob/master/features/inconsistent_quoting.feature): Use either single quotation marks *or* double quotation marks around parameters but don't use a mix of the two styles.
37
+
36
38
  [InvalidFileName](https://github.com/BillyRuffian/chutney/blob/master/features/invalid_file_name.feature): Make sure your file name is in snake case, not mixed case or with spaces.
37
39
 
38
40
  [InvalidStepFlow](https://github.com/BillyRuffian/chutney/blob/master/features/invalid_step_flow.feature): Your scenarios should follow Given → When → Then, in that order.
39
41
 
40
42
  [MissingExampleName](https://github.com/BillyRuffian/chutney/blob/master/features/missing_example_name.feature): If you have more than one example table in your scenario, they should each be given unique names.
41
43
 
44
+ [MissingExampleTable](https://github.com/BillyRuffian/chutney/blob/master/features/missing_example_table.feature): You are missing an example table. You should have at least one example table when using Scenario outlines.
45
+
42
46
  [MissingFeatureDescription](https://github.com/BillyRuffian/chutney/blob/master/features/missing_feature_description.feature): Your feature should have a value statement. These are usually in the form 'As a... I want.. So that...'.
43
47
 
44
48
  [MissingFeatureName](https://github.com/BillyRuffian/chutney/blob/master/features/missing_feature_name.feature): You should give your features a descriptive name.
45
49
 
46
50
  [MissingScenarioName](https://github.com/BillyRuffian/chutney/blob/master/features/missing_scenario_name.feature): You should name your scenarios and scenario outlines.
47
51
 
52
+ [MissingScenarioOutline](https://github.com/BillyRuffian/chutney/blob/master/features/missing_scenario_outline.feature): You should use Scenario Outline instead of Scenario when there is an Examples table to indicate that this scenario will be run multiple times with different data.
53
+
48
54
  [MissingTestAction](https://github.com/BillyRuffian/chutney/blob/master/features/missing_test_action.feature): You don't have an action (a `When` step) in your scenario.
49
55
 
50
56
  [MissingVerification](https://github.com/BillyRuffian/chutney/blob/master/features/missing_verification.feature): You don't have a verification step (a `Then` step) in your scenario.
@@ -9,6 +9,7 @@ module Chutney
9
9
  next unless scenario.examples
10
10
 
11
11
  next if scenario.examples.length > 1
12
+ next if scenario.examples.first.nil? # dont run lint if the example does not exist
12
13
  next if scenario.examples.first.rows.length > 2 # first row is the header
13
14
 
14
15
  add_issue(I18n.t('linters.avoid_outline_for_single_example'), feature, scenario)
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chutney
4
+ # service class to lint for avoiding periods
5
+ class InconsistentQuoting < Linter
6
+ # regular expression to extract quoted string
7
+ # matching group 1: opening quote; 2: quoted text; 3: closing quote
8
+ # opening and closing quote must match (via backrefs)
9
+ # apostrophes, both singular and plural posessives, are accounted for
10
+ QUOTED_STRING = /(?!\b\b)(['"])(.*(?:\b'\b[^\1]*)*(?!\b[\1]\b))(\1)/.freeze
11
+ Parameter = Struct.new('Parameter', :quotation_mark, :name)
12
+
13
+ def lint
14
+ quoted_params = parameters.group_by(&:quotation_mark)
15
+ single_quoted = quoted_params[%(')] || []
16
+ double_quoted = quoted_params[%(")] || []
17
+ return unless single_quoted.count.positive? && double_quoted.count.positive?
18
+
19
+ add_issue(
20
+ I18n.t('linters.inconsistent_quoting',
21
+ count_single: single_quoted.count, count_double: double_quoted.count,
22
+ example_single: %('#{single_quoted.first.name}'), example_double: %("#{double_quoted.first.name}")),
23
+ feature
24
+ )
25
+ end
26
+
27
+ def parameters
28
+ parameters = []
29
+
30
+ steps do |_feature, _child, step|
31
+ step_parameters = step
32
+ .text
33
+ .scan(QUOTED_STRING)
34
+ .map { |p| p.take(2) } # close quote will match open quote: drop it
35
+ .map { |p| Parameter.new(*p) }
36
+ parameters.concat(step_parameters)
37
+ end
38
+
39
+ parameters
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'chutney/linter'
4
+
5
+ module Chutney
6
+ # service class to lint for missing example tables in scenario outlines
7
+ class MissingExampleTable < Linter
8
+ def lint
9
+ scenarios do |_feature, scenario|
10
+ next unless scenario.is_a? CukeModeler::Outline
11
+ next unless scenario.examples.empty?
12
+
13
+ add_issue(I18n.t('linters.missing_example_table'), feature, scenario)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'chutney/linter'
4
+
5
+ module Chutney
6
+ # service class to lint for missing scenario outlines when examples tables given
7
+ class MissingScenarioOutline < Linter
8
+ def lint
9
+ scenarios do |_feature, scenario|
10
+ next unless scenario.is_a? CukeModeler::Outline
11
+ next unless scenario.keyword == 'Scenario'
12
+
13
+ add_issue(I18n.t('linters.missing_scenario_outline'), feature, scenario)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Chutney
4
- VERSION = '3.3.0'
4
+ VERSION = '3.6.0'
5
5
  end
data/lib/chutney.rb CHANGED
@@ -16,12 +16,15 @@ require 'chutney/linter/bad_scenario_name'
16
16
  require 'chutney/linter/empty_feature_file'
17
17
  require 'chutney/linter/file_name_differs_feature_name'
18
18
  require 'chutney/linter/givens_after_background'
19
+ require 'chutney/linter/inconsistent_quoting'
19
20
  require 'chutney/linter/invalid_file_name'
20
21
  require 'chutney/linter/invalid_step_flow'
21
22
  require 'chutney/linter/missing_example_name'
23
+ require 'chutney/linter/missing_example_table'
22
24
  require 'chutney/linter/missing_feature_description'
23
25
  require 'chutney/linter/missing_feature_name'
24
26
  require 'chutney/linter/missing_scenario_name'
27
+ require 'chutney/linter/missing_scenario_outline'
25
28
  require 'chutney/linter/missing_test_action'
26
29
  require 'chutney/linter/missing_verification'
27
30
  require 'chutney/linter/required_tags_starts_with'
@@ -33,6 +33,12 @@ en:
33
33
  givens_after_background: >-
34
34
  Avoid using the 'Given' keyword in scenarios if you have a background.
35
35
  Instead, setup steps begin your scenario and should start with an 'And' or 'But' keyword.
36
+ inconsistent_quoting: >-
37
+ Avoid using inconsistent quoting for your parameters.
38
+ You have %{count_single} single-quoted parameters (e.g. %{example_single})
39
+ and %{count_double} double-quoted parameters (e.g. %{example_double}).
40
+ You should adopt a single style to avoid confusion about the meaning and purpose
41
+ of the parameters.
36
42
  invalid_file_name: >-
37
43
  Filenames of feature files should be in snake case.
38
44
  You should name this file '%{recommended_name}'.
@@ -49,6 +55,8 @@ en:
49
55
  You have a scenerio with more than one example table, at least one of which is
50
56
  unnamed or has a duplicate name.
51
57
  You should give your example tables clear and meaningful names when you have more than one.
58
+ missing_example_table: >-
59
+ Scenario Outline must have at least one Examples table.
52
60
  missing_feature_description: >-
53
61
  Features should have a description / value statement so that the importance of the feature
54
62
  is well understood.
@@ -56,6 +64,8 @@ en:
56
64
  This feature is unnamed. You should name all features.
57
65
  missing_scenario_name: >-
58
66
  This scenario is unnamed. You should name all scenarios.
67
+ missing_scenario_outline: >-
68
+ Scenario Outline should be used instead of Scenario when there is an Examples table.
59
69
  missing_test_action: >-
60
70
  Your test has no action step. All scenarios should have a 'When' step indicating the
61
71
  action being taken.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chutney
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nigel Brookes-Thomas
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2022-08-26 00:00:00.000000000 Z
14
+ date: 2023-07-18 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: amatch
@@ -50,7 +50,7 @@ dependencies:
50
50
  version: 1.8.2
51
51
  - - "<"
52
52
  - !ruby/object:Gem::Version
53
- version: 1.13.0
53
+ version: 1.15.0
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -60,7 +60,7 @@ dependencies:
60
60
  version: 1.8.2
61
61
  - - "<"
62
62
  - !ruby/object:Gem::Version
63
- version: 1.13.0
63
+ version: 1.15.0
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: pastel
66
66
  requirement: !ruby/object:Gem::Requirement
@@ -179,14 +179,14 @@ dependencies:
179
179
  requirements:
180
180
  - - "~>"
181
181
  - !ruby/object:Gem::Version
182
- version: 1.32.0
182
+ version: 1.50.2
183
183
  type: :development
184
184
  prerelease: false
185
185
  version_requirements: !ruby/object:Gem::Requirement
186
186
  requirements:
187
187
  - - "~>"
188
188
  - !ruby/object:Gem::Version
189
- version: 1.32.0
189
+ version: 1.50.2
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: rspec
192
192
  requirement: !ruby/object:Gem::Requirement
@@ -262,12 +262,15 @@ files:
262
262
  - lib/chutney/linter/empty_feature_file.rb
263
263
  - lib/chutney/linter/file_name_differs_feature_name.rb
264
264
  - lib/chutney/linter/givens_after_background.rb
265
+ - lib/chutney/linter/inconsistent_quoting.rb
265
266
  - lib/chutney/linter/invalid_file_name.rb
266
267
  - lib/chutney/linter/invalid_step_flow.rb
267
268
  - lib/chutney/linter/missing_example_name.rb
269
+ - lib/chutney/linter/missing_example_table.rb
268
270
  - lib/chutney/linter/missing_feature_description.rb
269
271
  - lib/chutney/linter/missing_feature_name.rb
270
272
  - lib/chutney/linter/missing_scenario_name.rb
273
+ - lib/chutney/linter/missing_scenario_outline.rb
271
274
  - lib/chutney/linter/missing_test_action.rb
272
275
  - lib/chutney/linter/missing_verification.rb
273
276
  - lib/chutney/linter/required_tags_starts_with.rb
@@ -312,7 +315,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
312
315
  - !ruby/object:Gem::Version
313
316
  version: '0'
314
317
  requirements: []
315
- rubygems_version: 3.3.7
318
+ rubygems_version: 3.4.10
316
319
  signing_key:
317
320
  specification_version: 4
318
321
  summary: A linter for multi-lingual Gherkin