cuke_linter 0.13.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -1
  3. data/README.md +4 -4
  4. data/cuke_linter.gemspec +3 -3
  5. data/lib/cuke_linter.rb +5 -3
  6. data/lib/cuke_linter/version.rb +1 -1
  7. metadata +2 -86
  8. data/.gitignore +0 -19
  9. data/.simplecov +0 -8
  10. data/.travis.yml +0 -33
  11. data/CONTRIBUTING.md +0 -26
  12. data/Gemfile +0 -6
  13. data/Rakefile +0 -63
  14. data/appveyor.yml +0 -43
  15. data/bin/console +0 -14
  16. data/bin/setup +0 -8
  17. data/environments/common_env.rb +0 -12
  18. data/environments/cucumber_env.rb +0 -22
  19. data/environments/rspec_env.rb +0 -50
  20. data/testing/cucumber/step_definitions/action_steps.rb +0 -84
  21. data/testing/cucumber/step_definitions/setup_steps.rb +0 -258
  22. data/testing/cucumber/step_definitions/verification_steps.rb +0 -94
  23. data/testing/file_helper.rb +0 -41
  24. data/testing/formatter_factory.rb +0 -15
  25. data/testing/gemfiles/cuke_modeler1.gemfile +0 -8
  26. data/testing/gemfiles/cuke_modeler2.gemfile +0 -8
  27. data/testing/linter_factory.rb +0 -60
  28. data/testing/model_factory.rb +0 -109
  29. data/testing/rspec/spec/integration/cli_integration_spec.rb +0 -556
  30. data/testing/rspec/spec/integration/configuration_spec.rb +0 -811
  31. data/testing/rspec/spec/integration/cuke_linter_integration_spec.rb +0 -243
  32. data/testing/rspec/spec/integration/formatters/formatter_integration_specs.rb +0 -5
  33. data/testing/rspec/spec/integration/formatters/pretty_formatter_integration_spec.rb +0 -8
  34. data/testing/rspec/spec/integration/linters/background_does_more_than_setup_linter_integration_spec.rb +0 -8
  35. data/testing/rspec/spec/integration/linters/element_with_common_tags_linter_integration_spec.rb +0 -8
  36. data/testing/rspec/spec/integration/linters/element_with_duplicate_tags_linter_integration_spec.rb +0 -8
  37. data/testing/rspec/spec/integration/linters/element_with_too_many_tags_linter_integration_spec.rb +0 -8
  38. data/testing/rspec/spec/integration/linters/example_without_name_linter_integration_spec.rb +0 -8
  39. data/testing/rspec/spec/integration/linters/feature_file_with_invalid_name_integration_spec.rb +0 -8
  40. data/testing/rspec/spec/integration/linters/feature_file_with_mismatched_name_integration_spec.rb +0 -8
  41. data/testing/rspec/spec/integration/linters/feature_with_too_many_different_tags_linter_integration_spec.rb +0 -8
  42. data/testing/rspec/spec/integration/linters/feature_without_description_linter_integration_spec.rb +0 -8
  43. data/testing/rspec/spec/integration/linters/feature_without_name_linter_integration_spec.rb +0 -8
  44. data/testing/rspec/spec/integration/linters/feature_without_scenarios_linter_integration_spec.rb +0 -8
  45. data/testing/rspec/spec/integration/linters/linter_integration_spec.rb +0 -8
  46. data/testing/rspec/spec/integration/linters/linter_integration_specs.rb +0 -7
  47. data/testing/rspec/spec/integration/linters/outline_with_single_example_row_linter_integration_spec.rb +0 -8
  48. data/testing/rspec/spec/integration/linters/single_test_background_linter_integration_spec.rb +0 -8
  49. data/testing/rspec/spec/integration/linters/step_with_end_period_linter_integration_spec.rb +0 -8
  50. data/testing/rspec/spec/integration/linters/step_with_too_many_characters_linter_integration_spec.rb +0 -8
  51. data/testing/rspec/spec/integration/linters/test_should_use_background_linter_integration_spec.rb +0 -8
  52. data/testing/rspec/spec/integration/linters/test_with_action_step_as_final_step_linter_integration_spec.rb +0 -8
  53. data/testing/rspec/spec/integration/linters/test_with_bad_name_integration_spec.rb +0 -8
  54. data/testing/rspec/spec/integration/linters/test_with_no_action_step_integration_spec.rb +0 -8
  55. data/testing/rspec/spec/integration/linters/test_with_no_name_integration_spec.rb +0 -8
  56. data/testing/rspec/spec/integration/linters/test_with_no_verification_step_integration_spec.rb +0 -8
  57. data/testing/rspec/spec/integration/linters/test_with_setup_step_after_action_step_linter_integration_spec.rb +0 -8
  58. data/testing/rspec/spec/integration/linters/test_with_setup_step_after_verification_step_linter_integration_spec.rb +0 -8
  59. data/testing/rspec/spec/integration/linters/test_with_setup_step_as_final_step_linter_integration_spec.rb +0 -8
  60. data/testing/rspec/spec/integration/linters/test_with_too_many_steps_linter_integration_spec.rb +0 -8
  61. data/testing/rspec/spec/unit/cuke_linter_unit_spec.rb +0 -114
  62. data/testing/rspec/spec/unit/formatters/formatter_unit_specs.rb +0 -11
  63. data/testing/rspec/spec/unit/formatters/pretty_formatter_unit_spec.rb +0 -115
  64. data/testing/rspec/spec/unit/linters/background_does_more_than_setup_linter_unit_spec.rb +0 -186
  65. data/testing/rspec/spec/unit/linters/configurable_linter_unit_specs.rb +0 -11
  66. data/testing/rspec/spec/unit/linters/element_with_common_tags_linter_unit_spec.rb +0 -248
  67. data/testing/rspec/spec/unit/linters/element_with_duplicate_tags_linter_unit_spec.rb +0 -203
  68. data/testing/rspec/spec/unit/linters/element_with_too_many_tags_linter_unit_spec.rb +0 -296
  69. data/testing/rspec/spec/unit/linters/example_without_name_linter_unit_spec.rb +0 -81
  70. data/testing/rspec/spec/unit/linters/feature_file_with_invalid_name_linter_unit_spec.rb +0 -106
  71. data/testing/rspec/spec/unit/linters/feature_file_with_mismatched_name_linter_unit_spec.rb +0 -124
  72. data/testing/rspec/spec/unit/linters/feature_with_too_many_different_tags_linter_unit_spec.rb +0 -293
  73. data/testing/rspec/spec/unit/linters/feature_without_description_linter_unit_spec.rb +0 -80
  74. data/testing/rspec/spec/unit/linters/feature_without_name_linter_unit_spec.rb +0 -84
  75. data/testing/rspec/spec/unit/linters/feature_without_scenarios_linter_unit_spec.rb +0 -102
  76. data/testing/rspec/spec/unit/linters/linter_unit_spec.rb +0 -197
  77. data/testing/rspec/spec/unit/linters/linter_unit_specs.rb +0 -57
  78. data/testing/rspec/spec/unit/linters/outline_with_single_example_row_linter_unit_spec.rb +0 -184
  79. data/testing/rspec/spec/unit/linters/single_test_background_linter_unit_spec.rb +0 -89
  80. data/testing/rspec/spec/unit/linters/step_with_end_period_linter_unit_spec.rb +0 -54
  81. data/testing/rspec/spec/unit/linters/step_with_too_many_characters_linter_unit_spec.rb +0 -155
  82. data/testing/rspec/spec/unit/linters/test_should_use_background_linter_unit_spec.rb +0 -464
  83. data/testing/rspec/spec/unit/linters/test_with_action_step_as_final_step_linter_unit_spec.rb +0 -165
  84. data/testing/rspec/spec/unit/linters/test_with_bad_name_linter_unit_spec.rb +0 -81
  85. data/testing/rspec/spec/unit/linters/test_with_no_action_step_linter_unit_spec.rb +0 -244
  86. data/testing/rspec/spec/unit/linters/test_with_no_name_linter_unit_spec.rb +0 -88
  87. data/testing/rspec/spec/unit/linters/test_with_no_verification_step_linter_unit_spec.rb +0 -246
  88. data/testing/rspec/spec/unit/linters/test_with_setup_step_after_action_step_linter_unit_spec.rb +0 -233
  89. data/testing/rspec/spec/unit/linters/test_with_setup_step_after_verification_step_linter_unit_spec.rb +0 -233
  90. data/testing/rspec/spec/unit/linters/test_with_setup_step_as_final_step_linter_unit_spec.rb +0 -164
  91. data/testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb +0 -192
@@ -1,8 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::TestWithNoActionStepLinter do
5
-
6
- it_should_behave_like 'a linter at the integration level'
7
-
8
- end
@@ -1,8 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::TestWithNoNameLinter do
5
-
6
- it_should_behave_like 'a linter at the integration level'
7
-
8
- end
@@ -1,8 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::TestWithNoVerificationStepLinter do
5
-
6
- it_should_behave_like 'a linter at the integration level'
7
-
8
- end
@@ -1,8 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::TestWithSetupStepAfterActionStepLinter do
5
-
6
- it_should_behave_like 'a linter at the integration level'
7
-
8
- end
@@ -1,8 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::TestWithSetupStepAfterVerificationStepLinter do
5
-
6
- it_should_behave_like 'a linter at the integration level'
7
-
8
- end
@@ -1,8 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::TestWithSetupStepAsFinalStepLinter do
5
-
6
- it_should_behave_like 'a linter at the integration level'
7
-
8
- end
@@ -1,8 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
5
-
6
- it_should_behave_like 'a linter at the integration level'
7
-
8
- end
@@ -1,114 +0,0 @@
1
- require_relative '../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe 'the gem' do
5
-
6
- let(:gemspec) { eval(File.read "#{__dir__}/../../../../cuke_linter.gemspec") }
7
-
8
- it 'has an executable' do
9
- expect(gemspec.executables).to include('cuke_linter')
10
- end
11
-
12
- it 'validates cleanly' do
13
- mock_ui = Gem::MockGemUi.new
14
- Gem::DefaultUserInteraction.use_ui(mock_ui) { gemspec.validate }
15
-
16
- expect(mock_ui.error).to_not match(/warn/i)
17
- end
18
-
19
- end
20
-
21
-
22
- RSpec.describe CukeLinter do
23
-
24
- it "has a version number" do
25
- expect(CukeLinter::VERSION).not_to be nil
26
- end
27
-
28
- it "has a default keyword for 'Given'" do
29
- expect(CukeLinter::DEFAULT_GIVEN_KEYWORD).to eq('Given')
30
- end
31
-
32
- it "has a default keyword for 'When'" do
33
- expect(CukeLinter::DEFAULT_WHEN_KEYWORD).to eq('When')
34
- end
35
-
36
- it "has a default keyword for 'Then'" do
37
- expect(CukeLinter::DEFAULT_THEN_KEYWORD).to eq('Then')
38
- end
39
-
40
- it 'can lint' do
41
- expect(CukeLinter).to respond_to(:lint)
42
- end
43
-
44
- it 'lints the (optionally) given model trees and (optionally) file paths using the (optionally) provided set of linters and formats the output with the (optionally) provided formatters' do
45
- expect(CukeLinter.method(:lint).arity).to eq(-1)
46
- expect(CukeLinter.method(:lint).parameters).to match_array([[:key, :model_trees],
47
- [:key, :linters],
48
- [:key, :formatters],
49
- [:key, :file_paths]])
50
- end
51
-
52
- it 'can register a linter' do
53
- expect(CukeLinter).to respond_to(:register_linter)
54
- end
55
-
56
- it 'can unregister a linter' do
57
- expect(CukeLinter).to respond_to(:unregister_linter)
58
- end
59
-
60
- it 'registers a linter by name' do
61
- expect(CukeLinter.method(:register_linter).arity).to eq(1)
62
- expect(CukeLinter.method(:register_linter).parameters).to match_array([[:keyreq, :linter],
63
- [:keyreq, :name]])
64
- end
65
-
66
- it 'unregisters a linter by name' do
67
- expect(CukeLinter.method(:unregister_linter).arity).to eq(1)
68
- expect(CukeLinter.method(:unregister_linter).parameters).to match_array([[:req, :name]])
69
- end
70
-
71
- it 'knows its currently registered linters' do
72
- expect(CukeLinter).to respond_to(:registered_linters)
73
- end
74
-
75
- it 'correctly registers, unregisters, and tracks linters', :linter_registration do
76
- CukeLinter.clear_registered_linters
77
- CukeLinter.register_linter(name: 'foo', linter: :linter_1)
78
- CukeLinter.register_linter(name: 'bar', linter: :linter_2)
79
- CukeLinter.register_linter(name: 'baz', linter: :linter_3)
80
-
81
- CukeLinter.unregister_linter('bar')
82
-
83
- expect(CukeLinter.registered_linters).to eq({ 'foo' => :linter_1,
84
- 'baz' => :linter_3, })
85
- end
86
-
87
- it 'can clear all of its currently registered linters', :linter_registration do
88
- expect(CukeLinter).to respond_to(:clear_registered_linters)
89
-
90
- CukeLinter.register_linter(name: 'some_linter', linter: :the_linter)
91
- CukeLinter.clear_registered_linters
92
-
93
- expect(CukeLinter.registered_linters).to eq({})
94
- end
95
-
96
- it 'can reset to its default set of linters' do
97
- expect(CukeLinter).to respond_to(:reset_linters)
98
- end
99
-
100
- describe 'configuration' do
101
-
102
- it 'can load a configuration' do
103
- expect(CukeLinter).to respond_to(:load_configuration)
104
- end
105
-
106
- it 'is configured optionally via a file or a directly provided configuration' do
107
- expect(CukeLinter.method(:load_configuration).arity).to eq(-1)
108
- expect(CukeLinter.method(:load_configuration).parameters).to match_array([[:key, :config_file_path],
109
- [:key, :config]])
110
- end
111
-
112
- end
113
-
114
- end
@@ -1,11 +0,0 @@
1
- shared_examples_for 'a formatter at the unit level' do
2
-
3
- it 'can format' do
4
- expect(subject).to respond_to(:format)
5
- end
6
-
7
- it 'formats linting data' do
8
- expect(subject.method(:format).arity).to eq(1)
9
- end
10
-
11
- end
@@ -1,115 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::PrettyFormatter do
5
-
6
- it_should_behave_like 'a formatter at the unit level'
7
-
8
-
9
- it 'formats linting data as pretty text' do
10
- linting_data = [{ linter: 'SomeLinter',
11
- problem: 'Some problem',
12
- location: 'path/to/the_file:1' },
13
- { linter: 'SomeOtherLinter',
14
- problem: 'Some other problem',
15
- location: 'path/to/the_file:1' },
16
- { linter: 'YetAnotherLinter',
17
- problem: 'Yet another problem',
18
- location: 'path/to/the_file' }]
19
-
20
- results = subject.format(linting_data)
21
-
22
- expect(results).to eq(['SomeLinter',
23
- ' Some problem',
24
- ' path/to/the_file:1',
25
- 'SomeOtherLinter',
26
- ' Some other problem',
27
- ' path/to/the_file:1',
28
- 'YetAnotherLinter',
29
- ' Yet another problem',
30
- ' path/to/the_file',
31
- '',
32
- '3 issues found'].join("\n"))
33
- end
34
-
35
- it 'groups data by linter and problem' do
36
- linting_data = [{ linter: 'SomeLinter',
37
- problem: 'Some problem',
38
- location: 'path/to/the_file:1' },
39
- { linter: 'SomeOtherLinter',
40
- problem: 'Some other problem',
41
- location: 'path/to/the_file:1' },
42
- { linter: 'SomeLinter',
43
- problem: 'Some problem',
44
- location: 'path/to/the_file:11' }]
45
-
46
- results = subject.format(linting_data)
47
-
48
- expect(results).to eq(['SomeLinter',
49
- ' Some problem',
50
- ' path/to/the_file:1',
51
- ' path/to/the_file:11',
52
- 'SomeOtherLinter',
53
- ' Some other problem',
54
- ' path/to/the_file:1',
55
- '',
56
- '3 issues found'].join("\n"))
57
- end
58
-
59
- it 'orders violations within the same problem category by file path' do
60
- linting_data = [{ linter: 'SomeLinter',
61
- problem: 'Some problem',
62
- location: 'path/to/the_file:1' },
63
- { linter: 'SomeLinter',
64
- problem: 'Some problem',
65
- location: 'path/to/the_file:3' },
66
- { linter: 'SomeLinter',
67
- problem: 'Some problem',
68
- location: 'path/to/a_different_file:2' }]
69
-
70
- results = subject.format(linting_data)
71
-
72
- expect(results).to eq(['SomeLinter',
73
- ' Some problem',
74
- ' path/to/a_different_file:2',
75
- ' path/to/the_file:1',
76
- ' path/to/the_file:3',
77
- '',
78
- '3 issues found'].join("\n"))
79
- end
80
-
81
- it 'orders violations in the same file by line number' do
82
- linting_data = [{ linter: 'SomeLinter',
83
- problem: 'Some problem',
84
- location: 'path/to/the_file:2' },
85
- { linter: 'SomeLinter',
86
- problem: 'Some problem',
87
- location: 'path/to/the_file:3' },
88
- { linter: 'SomeLinter',
89
- problem: 'Some problem',
90
- location: 'path/to/the_file:11' }, # larger number that is alphabetically lower
91
- { linter: 'SomeLinter',
92
- problem: 'Some problem',
93
- location: 'path/to/the_file:3' }, # duplicate number
94
- { linter: 'SomeLinter',
95
- problem: 'Some problem',
96
- location: 'path/to/the_file' }, # no number
97
- { linter: 'SomeLinter',
98
- problem: 'Some problem',
99
- location: 'path/to/the_file:1' }]
100
-
101
- results = subject.format(linting_data)
102
-
103
- expect(results).to eq(['SomeLinter',
104
- ' Some problem',
105
- ' path/to/the_file',
106
- ' path/to/the_file:1',
107
- ' path/to/the_file:2',
108
- ' path/to/the_file:3',
109
- ' path/to/the_file:3',
110
- ' path/to/the_file:11',
111
- '',
112
- '6 issues found'].join("\n"))
113
- end
114
-
115
- end
@@ -1,186 +0,0 @@
1
- require_relative '../../../../../environments/rspec_env'
2
-
3
-
4
- RSpec.describe CukeLinter::BackgroundDoesMoreThanSetupLinter do
5
-
6
- let(:model_file_path) { 'some_file_path' }
7
-
8
- it_should_behave_like 'a linter at the unit level'
9
- it_should_behave_like 'a configurable linter at the unit level'
10
-
11
-
12
- it 'has a name' do
13
- expect(subject.name).to eq('BackgroundDoesMoreThanSetupLinter')
14
- end
15
-
16
- describe 'linting' do
17
-
18
- context 'a background with action steps' do
19
-
20
- let(:test_model) do
21
- CukeLinter::ModelFactory.generate_background_model(parent_file_path: model_file_path,
22
- source_text: 'Background:
23
- When something')
24
- end
25
-
26
- it_should_behave_like 'a linter linting a bad model'
27
-
28
-
29
- it 'records a problem' do
30
- result = subject.lint(test_model)
31
-
32
- expect(result[:problem]).to eq('Background has non-setup steps')
33
- end
34
-
35
- end
36
-
37
- context 'a background with verification steps' do
38
-
39
- let(:test_model) do
40
- CukeLinter::ModelFactory.generate_background_model(parent_file_path: model_file_path,
41
- source_text: 'Background:
42
- Then something')
43
- end
44
-
45
- it_should_behave_like 'a linter linting a bad model'
46
-
47
-
48
- it 'records a problem' do
49
- result = subject.lint(test_model)
50
-
51
- expect(result[:problem]).to eq('Background has non-setup steps')
52
- end
53
-
54
- end
55
-
56
- context 'a background with only setup steps' do
57
-
58
- let(:test_model) do
59
- gherkin = 'Background:
60
- Given something
61
- * (plus something)'
62
-
63
- CukeLinter::ModelFactory.generate_background_model(source_text: gherkin)
64
- end
65
-
66
- it_should_behave_like 'a linter linting a good model'
67
-
68
- end
69
-
70
-
71
- describe 'configuration' do
72
-
73
- let(:test_model) do
74
- CukeLinter::ModelFactory.generate_background_model
75
- end
76
-
77
- context 'with configuration' do
78
-
79
- before(:each) do
80
- subject.configure(configuration)
81
- end
82
-
83
- context "with a configured 'When' keyword" do
84
-
85
- let(:when_keyword) { 'Foo' }
86
- let(:configuration) { { 'When' => when_keyword } }
87
-
88
- it "uses the configured 'When' keyword" do
89
- test_model.steps.first.keyword = when_keyword
90
-
91
- result = subject.lint(test_model)
92
-
93
- expect(result).to_not be_nil
94
- end
95
-
96
- end
97
-
98
- context "with a configured 'Then' keyword" do
99
-
100
- let(:then_keyword) { 'Foo' }
101
- let(:configuration) { { 'Then' => then_keyword } }
102
-
103
- it "uses the configured 'Then' keyword" do
104
- test_model.steps.first.keyword = then_keyword
105
-
106
- result = subject.lint(test_model)
107
-
108
- expect(result).to_not be_nil
109
- end
110
-
111
- end
112
-
113
- end
114
-
115
- context 'without configuration' do
116
-
117
- context 'because configuration never happened' do
118
-
119
- it "uses the default 'When' keyword" do
120
- test_model.steps.first.keyword = CukeLinter::DEFAULT_WHEN_KEYWORD
121
-
122
- result = subject.lint(test_model)
123
-
124
- expect(result).to_not be_nil
125
- end
126
-
127
- it "uses the default 'Then' keyword" do
128
- test_model.steps.first.keyword = CukeLinter::DEFAULT_THEN_KEYWORD
129
-
130
- result = subject.lint(test_model)
131
-
132
- expect(result).to_not be_nil
133
- end
134
-
135
- end
136
-
137
- context "because configuration did not set a 'When' keyword" do
138
-
139
- before(:each) do
140
- subject.configure(configuration)
141
- end
142
-
143
- let(:configuration) { {} }
144
-
145
- it "uses the default 'When' keyword" do
146
- test_model.steps.first.keyword = CukeLinter::DEFAULT_WHEN_KEYWORD
147
-
148
- result = subject.lint(test_model)
149
-
150
- expect(result).to_not be_nil
151
- end
152
-
153
- end
154
-
155
- context "because configuration did not set a 'Then' keyword" do
156
-
157
- before(:each) do
158
- subject.configure(configuration)
159
- end
160
-
161
- let(:configuration) { {} }
162
-
163
- it "uses the default 'Then' keyword" do
164
- test_model.steps.first.keyword = CukeLinter::DEFAULT_THEN_KEYWORD
165
-
166
- result = subject.lint(test_model)
167
-
168
- expect(result).to_not be_nil
169
- end
170
-
171
- end
172
-
173
- end
174
-
175
- end
176
-
177
-
178
- context 'a non-background model' do
179
-
180
- let(:test_model) { CukeModeler::Model.new }
181
-
182
- it_should_behave_like 'a linter linting a good model'
183
-
184
- end
185
- end
186
- end