cucumber_lint 0.0.3 → 0.0.4

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -4
  3. data/.travis.yml +9 -0
  4. data/Gemfile +7 -5
  5. data/Gemfile.lock +3 -1
  6. data/README.md +28 -40
  7. data/Rakefile +12 -6
  8. data/cucumber_lint.gemspec +2 -0
  9. data/features/cucumber_lint/fix/nothing.feature +12 -0
  10. data/features/cucumber_lint/fix/repeating_steps.feature +25 -0
  11. data/features/cucumber_lint/fix/table_whitespace.feature +25 -0
  12. data/features/cucumber_lint/fix/uppercase_table_headers.feature +25 -0
  13. data/features/cucumber_lint/lint/nothing.feature +12 -0
  14. data/features/cucumber_lint/lint/repeating_steps.feature +31 -0
  15. data/features/cucumber_lint/lint/table_whitespace.feature +27 -0
  16. data/features/cucumber_lint/lint/uppercase_table_headers.feature +30 -0
  17. data/features/step_definitions/cli_steps.rb +9 -6
  18. data/features/step_definitions/fixtures/repeating_steps/bad.feature.example +12 -0
  19. data/features/step_definitions/fixtures/repeating_steps/good.feature.example +12 -0
  20. data/features/step_definitions/fixtures/table_whitespace/bad.feature.example +20 -0
  21. data/features/step_definitions/fixtures/table_whitespace/good.feature.example +20 -0
  22. data/features/step_definitions/fixtures/uppercase_table_headers/bad.feature.example +20 -0
  23. data/features/step_definitions/fixtures/uppercase_table_headers/good.feature.example +20 -0
  24. data/lib/core_ext/hash.rb +29 -0
  25. data/lib/cucumber_lint/cli.rb +50 -38
  26. data/lib/cucumber_lint/fix_list.rb +37 -0
  27. data/lib/cucumber_lint/linter/feature_linter.rb +92 -0
  28. data/lib/cucumber_lint/linter/scenario_outline_linter.rb +34 -0
  29. data/lib/cucumber_lint/linter/steps_linter.rb +49 -0
  30. data/lib/cucumber_lint/linter/table_linter.rb +70 -0
  31. data/lib/cucumber_lint/linter.rb +21 -0
  32. data/lib/cucumber_lint/version.rb +2 -2
  33. data/lib/cucumber_lint.rb +7 -4
  34. metadata +64 -16
  35. data/features/cucumber_lint/cli_fix.feature +0 -51
  36. data/features/cucumber_lint/cli_lint.feature +0 -55
  37. data/features/cucumber_lint/feature_formatter.feature +0 -106
  38. data/features/cucumber_lint/steps_formatter.feature +0 -30
  39. data/features/cucumber_lint/table_formatter.feature +0 -45
  40. data/features/step_definitions/fixtures/formatted.feature.example +0 -9
  41. data/features/step_definitions/fixtures/unformatted.feature.example +0 -9
  42. data/features/step_definitions/steps_formatter_steps.rb +0 -15
  43. data/features/step_definitions/table_formatter_steps.rb +0 -15
  44. data/lib/core_ext/array.rb +0 -22
  45. data/lib/cucumber_lint/feature_formatter.rb +0 -48
  46. data/lib/cucumber_lint/steps_formatter.rb +0 -50
  47. data/lib/cucumber_lint/table_formatter.rb +0 -65
  48. data/spec/core_ext/array_spec.rb +0 -19
@@ -1,30 +0,0 @@
1
- Feature: table formatter
2
-
3
- Scenario: unformatted steps
4
- Given steps
5
- """
6
- Given A
7
- Given B
8
- When C
9
- Then D
10
- Then E
11
- """
12
- Then the formatted steps are
13
- """
14
- Given A
15
- And B
16
- When C
17
- Then D
18
- And E
19
- """
20
-
21
- Scenario: formatted steps
22
- Given steps
23
- """
24
- Given A
25
- And B
26
- When C
27
- Then D
28
- And E
29
- """
30
- Then the steps are formatted
@@ -1,45 +0,0 @@
1
- Feature: table formatter
2
-
3
- Scenario: minimal table
4
- Given table lines
5
- """
6
- |header_column1|header_column2|
7
- |row1_column1|row1_column2|
8
- |row2_column1|row2_column2|
9
- |row3_column1|row3_column2|
10
- """
11
- Then the formatted table lines are
12
- """
13
- | header_column1 | header_column2 |
14
- | row1_column1 | row1_column2 |
15
- | row2_column1 | row2_column2 |
16
- | row3_column1 | row3_column2 |
17
- """
18
-
19
-
20
- Scenario: misaligned spacing in table
21
- Given table lines
22
- """
23
- | header_column1 | header_column2 |
24
- | row1_column1 | row1_column2 |
25
- | row2_column1 | row2_column2 |
26
- | row3_column1 | row3_column2 |
27
- """
28
- Then the formatted table lines are
29
- """
30
- | header_column1 | header_column2 |
31
- | row1_column1 | row1_column2 |
32
- | row2_column1 | row2_column2 |
33
- | row3_column1 | row3_column2 |
34
- """
35
-
36
-
37
- Scenario: formatted table
38
- Given table lines
39
- """
40
- | header_column1 | header_column2 |
41
- | row1_column1 | row1_column2 |
42
- | row2_column1 | row2_column2 |
43
- | row3_column1 | row3_column2 |
44
- """
45
- Then the table is formatted
@@ -1,9 +0,0 @@
1
- Feature: Test Feature
2
-
3
- Scenario: Test Scenario
4
- Given a table
5
- | header_column1 | header_column2 |
6
- | row1_column1 | row1_column2 |
7
- | row2_column1 | row2_column2 |
8
- | row3_column1 | row3_column2 |
9
- Then my tests pass
@@ -1,9 +0,0 @@
1
- Feature: Test Feature
2
-
3
- Scenario: Test Scenario
4
- Given a table
5
- |header_column1|header_column2|
6
- |row1_column1|row1_column2|
7
- |row2_column1|row2_column2|
8
- |row3_column1|row3_column2|
9
- Then my tests pass
@@ -1,15 +0,0 @@
1
- Given(/^steps$/) do |steps|
2
- @steps = steps.split("\n", -1)
3
- end
4
-
5
-
6
- Then(/^the formatted steps are$/) do |steps|
7
- expected = steps.split("\n", -1)
8
- actual = CucumberLint::StepsFormatter.new(@steps).formatted_content
9
- expect(actual).to eql expected
10
- end
11
-
12
-
13
- Then(/^the steps are formatted$/) do
14
- expect(CucumberLint::StepsFormatter.new(@steps)).to be_formatted
15
- end
@@ -1,15 +0,0 @@
1
- Given(/^table lines$/) do |lines|
2
- @lines = lines.split("\n", -1)
3
- end
4
-
5
-
6
- Then(/^the formatted table lines are$/) do |lines|
7
- expected = lines.split("\n", -1)
8
- actual = CucumberLint::TableFormatter.new(@lines).formatted_content
9
- expect(actual).to eql expected
10
- end
11
-
12
-
13
- Then(/^the table is formatted$/) do
14
- expect(CucumberLint::TableFormatter.new(@lines)).to be_formatted
15
- end
@@ -1,22 +0,0 @@
1
- # Monkey-patching Array
2
- class Array
3
-
4
- def group
5
- groups = []
6
- last_group = { passing: true, values: [] }
7
-
8
- each do |element|
9
- passing = yield element
10
-
11
- if passing != last_group[:passing]
12
- groups << last_group unless last_group[:values].empty?
13
- last_group = { passing: passing, values: [] }
14
- end
15
-
16
- last_group[:values] << element
17
- end
18
-
19
- groups + [last_group]
20
- end
21
-
22
- end
@@ -1,48 +0,0 @@
1
- require 'core_ext/array'
2
-
3
- module CucumberLint
4
- # A class that takes in the content that make up a cucumber feature
5
- # and can determine if it is formatted and output the formatted content
6
- class FeatureFormatter
7
-
8
- attr_reader :formatted_content
9
-
10
- def initialize content
11
- @content = content
12
- @formatted_content = format
13
- end
14
-
15
-
16
- def formatted?
17
- @content == @formatted_content
18
- end
19
-
20
-
21
- private
22
-
23
-
24
- def format
25
- lines = format_steps @content.split("\n", -1)
26
- groupings = lines.group { |line| line =~ /^\s*\|/ }
27
-
28
- groupings.map do |group|
29
- if group[:passing]
30
- format_table group[:values]
31
- else
32
- group[:values]
33
- end
34
- end.flatten.join("\n")
35
- end
36
-
37
-
38
- def format_table lines
39
- TableFormatter.new(lines).formatted_content
40
- end
41
-
42
-
43
- def format_steps steps
44
- StepsFormatter.new(steps).formatted_content
45
- end
46
-
47
- end
48
- end
@@ -1,50 +0,0 @@
1
- module CucumberLint
2
- # A class that takes in the lines of a cucumber feature
3
- # and can determine if the steps are formatted and output the formatted steps
4
- class StepsFormatter
5
-
6
- attr_reader :formatted_content
7
-
8
- def initialize lines
9
- @lines = lines
10
- @formatted_content = format
11
- end
12
-
13
-
14
- def formatted?
15
- @lines == @formatted_content
16
- end
17
-
18
- private
19
-
20
- RESET_KEYWORDS = %w(Background Scenario)
21
- STEP_TYPES = %w(Given When Then)
22
-
23
- def format
24
- @lines.map { |line| format_line line }
25
- end
26
-
27
-
28
- def format_line line
29
- @previous_step_type = nil if should_reset_previous_step_type? line
30
-
31
- step_type = line.split(' ', -1)[0]
32
-
33
- if STEP_TYPES.include?(step_type)
34
- if @previous_step_type == step_type
35
- line.sub! step_type, 'And'
36
- else
37
- @previous_step_type = step_type
38
- end
39
- end
40
-
41
- line
42
- end
43
-
44
-
45
- def should_reset_previous_step_type? line
46
- RESET_KEYWORDS.any? { |keyword| line.start_with? keyword }
47
- end
48
-
49
- end
50
- end
@@ -1,65 +0,0 @@
1
- module CucumberLint
2
- # A class that takes in the lines that make up a cucumber table
3
- # and can determine if it is formatted and output the formatted table
4
- class TableFormatter
5
-
6
- attr_reader :formatted_content
7
-
8
- def initialize lines
9
- @lines = lines
10
- @column_widths = column_widths
11
- @formatted_content = format
12
- end
13
-
14
-
15
- def formatted?
16
- @lines == @formatted_content
17
- end
18
-
19
-
20
- private
21
-
22
-
23
- def column_widths
24
- widths_by_line = @lines.map { |line| line_column_widths line }
25
- grouped_widths = widths_by_line[0].zip(*widths_by_line[1..-1])
26
- grouped_widths.each_with_index.map do |width, i|
27
- i == 0 ? width.min : width.max
28
- end
29
- end
30
-
31
-
32
- def format
33
- @lines.each_with_index.map do |line|
34
- line.split('|', -1).each_with_index.map do |piece, index|
35
- format_piece piece, index
36
- end.join('|')
37
- end
38
- end
39
-
40
-
41
- def format_piece piece, index
42
- if index == 0
43
- ' ' * column_widths[index]
44
- elsif index == column_widths.length - 1
45
- piece
46
- else
47
- " #{piece.strip} ".ljust column_widths[index]
48
- end
49
- end
50
-
51
-
52
- def line_column_widths line
53
- pieces = line.split('|', -1)
54
- pieces.each_with_index.map do |piece, index|
55
- if index == 0 || index == pieces.length - 1
56
- piece.length
57
- else
58
- piece.strip!
59
- piece.length + 2 # one space padding on each side
60
- end
61
- end
62
- end
63
-
64
- end
65
- end
@@ -1,19 +0,0 @@
1
- require 'core_ext/array'
2
-
3
- describe Array do
4
- describe '#group' do
5
- it 'returns elements grouped by whether of not they pass the given block' do
6
- array = [1, 1, 2, 3, 5, 8, 13, 21, 34]
7
- expected = array.group(&:odd?)
8
- actual = [
9
- { passing: true, values: [1, 1] },
10
- { passing: false, values: [2] },
11
- { passing: true, values: [3, 5] },
12
- { passing: false, values: [8] },
13
- { passing: true, values: [13, 21] },
14
- { passing: false, values: [34] }
15
- ]
16
- expect(expected).to eql actual
17
- end
18
- end
19
- end