cucumber_lint 0.0.4 → 0.1.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/Gemfile +2 -1
  4. data/Gemfile.lock +48 -30
  5. data/README.md +41 -24
  6. data/Rakefile +1 -1
  7. data/circle.yml +3 -0
  8. data/config/default.yml +27 -0
  9. data/cucumber_lint.gemspec +4 -4
  10. data/features/cucumber_lint/consistent_empty_lines/between_description_and_scenario.feature +39 -0
  11. data/features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_docstring.feature +47 -0
  12. data/features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_examples.feature +49 -0
  13. data/features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_step.feature +41 -0
  14. data/features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_table.feature +43 -0
  15. data/features/cucumber_lint/consistent_empty_lines/between_feature_and_description.feature +33 -0
  16. data/features/cucumber_lint/consistent_empty_lines/between_feature_and_scenario.feature +33 -0
  17. data/features/cucumber_lint/consistent_table_headers/examples_table.feature +74 -0
  18. data/features/cucumber_lint/consistent_table_headers/step_table.feature +64 -0
  19. data/features/cucumber_lint/consistent_table_headers/unsupported_style.feature +20 -0
  20. data/features/cucumber_lint/consistent_table_whitespace/examples_table.feature +46 -0
  21. data/features/cucumber_lint/consistent_table_whitespace/step_table.feature +42 -0
  22. data/features/cucumber_lint/no_empty_features.feature +20 -0
  23. data/features/cucumber_lint/no_files.feature +6 -0
  24. data/features/cucumber_lint/no_repeating_keywords.feature +44 -0
  25. data/features/cucumber_lint/unsupported_options.feature +11 -0
  26. data/features/step_definitions/cli_steps.rb +47 -10
  27. data/features/step_definitions/env.rb +5 -9
  28. data/features/step_definitions/fixtures/config/disabled.yml +18 -0
  29. data/features/step_definitions/support/file_helpers.rb +20 -0
  30. data/lib/core_ext/array.rb +8 -0
  31. data/lib/core_ext/basic_object.rb +8 -0
  32. data/lib/core_ext/hash.rb +3 -18
  33. data/lib/core_ext/string.rb +7 -0
  34. data/lib/cucumber_lint/cli.rb +60 -31
  35. data/lib/cucumber_lint/config.rb +55 -0
  36. data/lib/cucumber_lint/errors/unsupported_style.rb +10 -0
  37. data/lib/cucumber_lint/linted_file.rb +77 -0
  38. data/lib/cucumber_lint/linter/feature_empty_lines_linter.rb +125 -0
  39. data/lib/cucumber_lint/linter/feature_linter.rb +33 -30
  40. data/lib/cucumber_lint/linter/scenario_outline_linter.rb +17 -8
  41. data/lib/cucumber_lint/linter/steps_linter.rb +9 -8
  42. data/lib/cucumber_lint/linter/table_linter.rb +26 -15
  43. data/lib/cucumber_lint/linter.rb +10 -10
  44. data/lib/cucumber_lint/version.rb +1 -1
  45. data/lib/cucumber_lint.rb +4 -1
  46. metadata +35 -36
  47. data/.travis.yml +0 -9
  48. data/features/cucumber_lint/fix/nothing.feature +0 -12
  49. data/features/cucumber_lint/fix/repeating_steps.feature +0 -25
  50. data/features/cucumber_lint/fix/table_whitespace.feature +0 -25
  51. data/features/cucumber_lint/fix/uppercase_table_headers.feature +0 -25
  52. data/features/cucumber_lint/lint/nothing.feature +0 -12
  53. data/features/cucumber_lint/lint/repeating_steps.feature +0 -31
  54. data/features/cucumber_lint/lint/table_whitespace.feature +0 -27
  55. data/features/cucumber_lint/lint/uppercase_table_headers.feature +0 -30
  56. data/features/step_definitions/feature_formatter_steps.rb +0 -15
  57. data/features/step_definitions/fixtures/repeating_steps/bad.feature.example +0 -12
  58. data/features/step_definitions/fixtures/repeating_steps/good.feature.example +0 -12
  59. data/features/step_definitions/fixtures/table_whitespace/bad.feature.example +0 -20
  60. data/features/step_definitions/fixtures/table_whitespace/good.feature.example +0 -20
  61. data/features/step_definitions/fixtures/uppercase_table_headers/bad.feature.example +0 -20
  62. data/features/step_definitions/fixtures/uppercase_table_headers/good.feature.example +0 -20
  63. data/lib/cucumber_lint/fix_list.rb +0 -37
@@ -0,0 +1,77 @@
1
+ module CucumberLint
2
+ # A class that represents a file being linted
3
+ class LintedFile
4
+
5
+ attr_reader :content, :errors, :lines
6
+
7
+ def initialize path
8
+ @path = Pathname.new path
9
+ @content = IO.read path
10
+ @lines = @content.lines
11
+
12
+ @errors = []
13
+ @fixes = {}
14
+ @marked_for_deletion = false
15
+ end
16
+
17
+
18
+ def add_error error
19
+ @errors << "#{@path}:#{error}"
20
+ end
21
+
22
+
23
+ def add_fix line_number, fix
24
+ @fixes[line_number] ||= []
25
+ @fixes[line_number] += Array(fix)
26
+ end
27
+
28
+
29
+ def mark_for_deletion
30
+ @marked_for_deletion = true
31
+ end
32
+
33
+
34
+ def resolve
35
+ if @marked_for_deletion
36
+ delete
37
+ :deleted
38
+ elsif !errors.empty? || fixable?
39
+ fix
40
+ errors.empty? ? :written : :failed
41
+ else
42
+ :passed
43
+ end
44
+ end
45
+
46
+
47
+ private
48
+
49
+
50
+ def apply_fixes
51
+ lines.each_with_index.map do |line, index|
52
+ line_number = index + 1
53
+
54
+ @fixes.fetch(line_number, []).each do |fix|
55
+ line = fix.call(line)
56
+ end
57
+
58
+ line
59
+ end
60
+ end
61
+
62
+
63
+ def delete
64
+ @path.delete
65
+ end
66
+
67
+
68
+ def fix
69
+ IO.write @path, apply_fixes.join
70
+ end
71
+
72
+ def fixable?
73
+ !@fixes.empty?
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,125 @@
1
+ module CucumberLint
2
+ # A linter for a given feature's empty lines
3
+ class FeatureEmptyLinesLinter < Linter
4
+
5
+ def initialize config:, feature:, linted_file:
6
+ super config: config, linted_file: linted_file
7
+
8
+ @feature = feature
9
+ @description = feature.description
10
+ end
11
+
12
+
13
+ def lint
14
+ lint_description
15
+ lint_elements
16
+ end
17
+
18
+
19
+ private
20
+
21
+
22
+ def expected_first_element_start
23
+ spacing = if @description == ''
24
+ get_config(:between_feature_and_element)
25
+ else
26
+ get_config(:between_feature_and_description) +
27
+ @description.count("\n") +
28
+ get_config(:between_description_and_element) +
29
+ 1
30
+ end
31
+
32
+ @feature.line + spacing + 1
33
+ end
34
+
35
+
36
+ def extra_empty_line line_number, count
37
+ if @config.fix
38
+ count.times do |i|
39
+ add_fix line_number + i, -> (line) { line.sub("\n", '') }
40
+ end
41
+ else
42
+ add_error "#{line_number}: Remove#{" #{count}" if count > 1} empty line#{'s' if count > 1}"
43
+ end
44
+ end
45
+
46
+
47
+ def get_config key
48
+ @config.consistent_empty_lines.send(key)
49
+ end
50
+
51
+
52
+ def get_element_end element
53
+ if element.type == 'scenario_outline'
54
+ element.examples.last.rows.last.line
55
+ else
56
+ step_end element.steps.last
57
+ end
58
+ end
59
+
60
+
61
+ def lint_description
62
+ return if @description == ''
63
+
64
+ shared_lines = @feature.line + 1
65
+ expected_start = shared_lines + get_config(:between_feature_and_description)
66
+ actual_start = shared_lines + @description.match(/\n*/)[0].length
67
+ resolve_empty_line_difference actual_start, expected_start
68
+ end
69
+
70
+
71
+ def lint_elements
72
+ return unless @feature.elements
73
+
74
+ expected_element_start = expected_first_element_start
75
+ @feature.elements.each do |element|
76
+ resolve_empty_line_difference element.line, expected_element_start
77
+ lint_scenario_outline_and_examples element if element.type == 'scenario_outline'
78
+ element_end = get_element_end element
79
+ expected_element_start = element_end + get_config(:between_elements) + 1
80
+ end
81
+ end
82
+
83
+
84
+ def lint_scenario_outline_and_examples element
85
+ expected_start = step_end(element.steps.last) +
86
+ get_config(:between_scenario_outline_and_examples) +
87
+ 1
88
+ actual_start = element.examples.first.line
89
+ resolve_empty_line_difference actual_start, expected_start
90
+ end
91
+
92
+
93
+ def missing_empty_line line_number, count
94
+ if @config.fix
95
+ add_fix line_number, -> (line) { "\n" * count + line }
96
+ else
97
+ add_error "#{line_number}: Add#{" #{count}" if count > 1} empty line#{'s' if count > 1}"
98
+ end
99
+ end
100
+
101
+
102
+ def resolve_empty_line_difference actual, expected
103
+ if actual < expected
104
+ missing_empty_line actual, expected - actual
105
+ elsif actual > expected
106
+ extra_empty_line expected, actual - expected
107
+ end
108
+ end
109
+
110
+
111
+ def step_end step
112
+ rows = step.rows
113
+ doc_string = step.doc_string
114
+
115
+ if rows && rows.is_a?(Array)
116
+ rows.last.line
117
+ elsif doc_string
118
+ doc_string.line + doc_string.value.count("\n") + 2
119
+ else
120
+ step.line
121
+ end
122
+ end
123
+
124
+ end
125
+ end
@@ -1,3 +1,5 @@
1
+ require 'core_ext/array'
2
+ require 'core_ext/basic_object'
1
3
  require 'core_ext/hash'
2
4
  require 'gherkin/formatter/json_formatter'
3
5
  require 'gherkin/parser/parser'
@@ -7,29 +9,38 @@ module CucumberLint
7
9
  # A linter for a given feature (represented by a filename)
8
10
  class FeatureLinter < Linter
9
11
 
10
- attr_reader :errors, :fix_list
12
+ def lint
13
+ features = parse_content
11
14
 
12
- def initialize path, fix:
13
- super(fix: fix)
15
+ features.each do |feature|
16
+ lint_feature_empty_lines feature if @config.consistent_empty_lines.enabled
17
+ lint_elements feature
18
+ end
14
19
 
15
- @path = path
16
- @content = IO.read(path)
17
- @file_lines = @content.lines
20
+ empty_feature if features.count == 0
18
21
  end
19
22
 
23
+ private
24
+
20
25
 
21
- def can_fix?
22
- !fix_list.empty?
26
+ def empty_feature
27
+ return unless @config.no_empty_features.enabled
28
+
29
+ if @config.fix
30
+ @linted_file.mark_for_deletion
31
+ else
32
+ add_error ' Remove file with no feature'
33
+ end
23
34
  end
24
35
 
25
36
 
26
- def errors?
27
- !errors.empty?
37
+ def lint_examples examples
38
+ examples.each { |example| lint_table example.rows }
28
39
  end
29
40
 
30
41
 
31
- def lint
32
- feature = parse_content
42
+ def lint_elements feature
43
+ return unless feature.elements
33
44
 
34
45
  feature.elements.each do |element|
35
46
  lint_steps element.steps
@@ -39,25 +50,12 @@ module CucumberLint
39
50
  lint_examples element.examples
40
51
  end
41
52
  end
42
-
43
- errors.map! { |error| "#{feature.uri}:#{error}" }
44
53
  end
45
54
 
46
- def write
47
- fixed_content = fix_list.apply(@file_lines).join
48
- IO.write(@path, fixed_content)
49
- end
50
-
51
- private
52
55
 
53
-
54
- def linter_options
55
- { file_lines: @file_lines, fix: @fix, parent: self }
56
- end
57
-
58
-
59
- def lint_examples examples
60
- examples.each { |example| lint_table example.rows }
56
+ def lint_feature_empty_lines feature
57
+ linter = FeatureEmptyLinesLinter.new linter_options.merge(feature: feature)
58
+ linter.lint
61
59
  end
62
60
 
63
61
 
@@ -79,13 +77,18 @@ module CucumberLint
79
77
  end
80
78
 
81
79
 
80
+ def linter_options
81
+ { config: @config, linted_file: @linted_file }
82
+ end
83
+
84
+
82
85
  def parse_content
83
86
  io = StringIO.new
84
87
  formatter = Gherkin::Formatter::JSONFormatter.new(io)
85
88
  parser = Gherkin::Parser::Parser.new(formatter)
86
- parser.parse(@content, @path, 0)
89
+ parser.parse(@linted_file.content, '', 0)
87
90
  formatter.done
88
- MultiJson.load(io.string)[0].to_open_struct
91
+ MultiJson.load(io.string).to_open_struct
89
92
  end
90
93
 
91
94
  end
@@ -1,19 +1,21 @@
1
+ require 'core_ext/string'
2
+
1
3
  module CucumberLint
2
4
  # A linter for a series of steps in a scenario outline (as parsed by Gherkin)
3
5
  class ScenarioOutlineLinter < Linter
4
6
 
5
- def initialize steps:, file_lines:, fix:, parent:
6
- super(fix: fix, parent: parent)
7
+ def initialize steps:, config:, linted_file:
8
+ super config: config, linted_file: linted_file
7
9
 
8
10
  @steps = steps
9
- @file_lines = file_lines
11
+ @header_style = @config.consistent_table_headers.enforced_style.to_sym
10
12
  end
11
13
 
12
14
 
13
15
  def lint
14
16
  @steps.each do |step|
15
17
  step.name.scan(/<.+?>/).each do |placeholder|
16
- bad_placeholder step.line, placeholder unless placeholder == placeholder.upcase
18
+ inconsistent_placeholder step.line, placeholder if bad_placeholder? placeholder
17
19
  end
18
20
  end
19
21
  end
@@ -22,11 +24,18 @@ module CucumberLint
22
24
  private
23
25
 
24
26
 
25
- def bad_placeholder line_number, placeholder
26
- if @fix
27
- fix_list.add line_number, -> (line) { line.sub(placeholder, placeholder.upcase) }
27
+ def bad_placeholder? str
28
+ str != str.public_send(@header_style)
29
+ end
30
+
31
+
32
+ def inconsistent_placeholder line_number, str
33
+ return unless @config.consistent_table_headers.enabled
34
+
35
+ if @config.fix
36
+ add_fix line_number, -> (line) { line.sub(str, str.public_send(@header_style)) }
28
37
  else
29
- errors << "#{line_number}: Make \"#{placeholder}\" uppercase"
38
+ add_error "#{line_number}: #{@header_style} \"#{str}\""
30
39
  end
31
40
  end
32
41
 
@@ -2,11 +2,10 @@ module CucumberLint
2
2
  # A linter for a series of steps (as parsed by Gherkin)
3
3
  class StepsLinter < Linter
4
4
 
5
- def initialize steps:, file_lines:, fix:, parent:
6
- super(fix: fix, parent: parent)
5
+ def initialize steps:, config:, linted_file:
6
+ super config: config, linted_file: linted_file
7
7
 
8
8
  @steps = steps
9
- @file_lines = file_lines
10
9
  end
11
10
 
12
11
 
@@ -32,17 +31,19 @@ module CucumberLint
32
31
  STEP_TYPES = %w(Given When Then)
33
32
 
34
33
  def repeated_keyword line_number, keyword
35
- if @fix
36
- fix_list.add line_number, -> (line) { line.sub(keyword, 'And') }
34
+ return unless @config.no_repeating_keywords.enabled
35
+
36
+ if @config.fix
37
+ add_fix line_number, -> (line) { line.sub(keyword, 'And') }
37
38
  else
38
- errors << "#{line_number}: Use \"And\" instead of repeating \"#{keyword}\""
39
+ add_error "#{line_number}: Use \"And\" instead of repeating \"#{keyword}\""
39
40
  end
40
41
  end
41
42
 
42
43
 
43
44
  def lint_table rows
44
- table_linter = TableLinter.new rows: rows, file_lines: @file_lines, fix: @fix, parent: self
45
- table_linter.lint
45
+ linter = TableLinter.new rows: rows, config: @config, linted_file: @linted_file
46
+ linter.lint
46
47
  end
47
48
 
48
49
  end
@@ -1,53 +1,64 @@
1
+ require 'core_ext/string'
1
2
  require 'gherkin/formatter/pretty_formatter'
2
3
 
3
4
  module CucumberLint
4
5
  # A linter for a series of table rows (as parsed by Gherkin)
5
6
  class TableLinter < Linter
6
7
 
7
- def initialize rows:, file_lines:, fix:, parent:
8
- super(fix: fix, parent: parent)
8
+ def initialize rows:, config:, linted_file:
9
+ super config: config, linted_file: linted_file
9
10
 
10
11
  @rows = rows
11
- @file_lines = file_lines
12
+ @header_style = @config.consistent_table_headers.enforced_style.to_sym
12
13
  end
13
14
 
14
15
 
15
16
  def lint
16
- bad_whitespace unless actual_table_lines == expected_table_lines
17
- bad_table_headers unless actual_table_lines[0] == actual_table_lines[0].upcase
17
+ inconsistent_table_whitespace unless actual_table_lines == expected_table_lines
18
+ inconsistent_table_headers if inconsistent_table_headers?
18
19
  end
19
20
 
20
21
 
21
22
  private
22
23
 
23
24
 
24
- def bad_table_headers
25
- if @fix
26
- fix_list.add @rows[0].line, -> (line) { line.upcase }
25
+ def inconsistent_table_headers
26
+ return unless @config.consistent_table_headers.enabled
27
+
28
+ if @config.fix
29
+ add_fix @rows[0].line, -> (line) { line.split('|', -1).map(&@header_style).join('|') }
27
30
  else
28
- errors << "#{@rows[0].line}: Make table headers uppercase"
31
+ add_error "#{@rows[0].line}: #{@header_style} table headers"
29
32
  end
30
33
  end
31
34
 
32
35
 
36
+ def inconsistent_table_headers?
37
+ headers = actual_table_lines[0].split('|')
38
+ headers != headers.map(&@header_style)
39
+ end
40
+
41
+
33
42
  def actual_table_lines
34
43
  @actual_table_lines ||= determine_actual_table_lines
35
44
  end
36
45
 
37
46
 
38
- def bad_whitespace
39
- if @fix
47
+ def inconsistent_table_whitespace
48
+ return unless @config.consistent_table_whitespace.enabled
49
+
50
+ if @config.fix
40
51
  @rows.each_with_index.map do |row, index|
41
- fix_list.add row.line, -> (line) { line.gsub(/\|.+?\n/, expected_table_lines[index]) }
52
+ add_fix row.line, -> (line) { line.gsub(/\|.*\|/, expected_table_lines[index]) }
42
53
  end
43
54
  else
44
- errors << "#{@rows[0].line}: Fix table whitespace"
55
+ add_error "#{@rows[0].line}: Fix table whitespace"
45
56
  end
46
57
  end
47
58
 
48
59
 
49
60
  def determine_actual_table_lines
50
- @rows.map { |row| @file_lines[row.line - 1].lstrip }
61
+ @rows.map { |row| @linted_file.lines[row.line - 1].strip }
51
62
  end
52
63
 
53
64
 
@@ -58,7 +69,7 @@ module CucumberLint
58
69
  formatter = Gherkin::Formatter::PrettyFormatter.new(io, false, false)
59
70
  formatter.table(@rows)
60
71
  formatter.done
61
- io.string.lines.map(&:lstrip)
72
+ io.string.lines.map(&:strip)
62
73
  end
63
74
 
64
75
 
@@ -2,19 +2,19 @@ module CucumberLint
2
2
  # A base linter, not meant to be instantiated
3
3
  class Linter
4
4
 
5
- attr_reader :errors, :fix_list
5
+ def initialize config:, linted_file:
6
+ @config = config
7
+ @linted_file = linted_file
8
+ end
9
+
6
10
 
11
+ def add_error *args
12
+ @linted_file.add_error(*args)
13
+ end
7
14
 
8
- def initialize fix:, parent: nil
9
- @fix = fix
10
15
 
11
- if parent
12
- @errors = parent.errors
13
- @fix_list = parent.fix_list
14
- else
15
- @errors = []
16
- @fix_list = FixList.new
17
- end
16
+ def add_fix *args
17
+ @linted_file.add_fix(*args)
18
18
  end
19
19
 
20
20
  end
@@ -1,3 +1,3 @@
1
1
  module CucumberLint # rubocop:disable Style/Documentation
2
- VERSION = '0.0.4'
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/cucumber_lint.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'cucumber_lint/cli'
2
- require 'cucumber_lint/fix_list'
2
+ require 'cucumber_lint/config'
3
+ require 'cucumber_lint/errors/unsupported_style'
4
+ require 'cucumber_lint/linted_file'
3
5
  require 'cucumber_lint/linter'
6
+ require 'cucumber_lint/linter/feature_empty_lines_linter'
4
7
  require 'cucumber_lint/linter/feature_linter'
5
8
  require 'cucumber_lint/linter/scenario_outline_linter'
6
9
  require 'cucumber_lint/linter/steps_linter'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber_lint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - charlierudolph
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-07 00:00:00.000000000 Z
11
+ date: 2015-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.7.5
19
+ version: 0.7.7
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.7.5
26
+ version: 0.7.7
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: gherkin
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -31,9 +31,6 @@ dependencies:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 2.12.2
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 2.12.2
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -41,29 +38,20 @@ dependencies:
41
38
  - - "~>"
42
39
  - !ruby/object:Gem::Version
43
40
  version: 2.12.2
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 2.12.2
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: multi_json
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 1.10.1
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: 1.10.1
47
+ version: 1.11.2
57
48
  type: :runtime
58
49
  prerelease: false
59
50
  version_requirements: !ruby/object:Gem::Requirement
60
51
  requirements:
61
52
  - - "~>"
62
53
  - !ruby/object:Gem::Version
63
- version: 1.10.1
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: 1.10.1
54
+ version: 1.11.2
67
55
  description:
68
56
  email:
69
57
  - charles.w.rudolph@gmail.com
@@ -74,38 +62,49 @@ extra_rdoc_files: []
74
62
  files:
75
63
  - ".gitignore"
76
64
  - ".rubocop.yml"
77
- - ".travis.yml"
65
+ - ".ruby-version"
78
66
  - Gemfile
79
67
  - Gemfile.lock
80
68
  - LICENSE
81
69
  - README.md
82
70
  - Rakefile
83
71
  - bin/cucumber_lint
72
+ - circle.yml
73
+ - config/default.yml
84
74
  - cucumber.yml
85
75
  - cucumber_lint.gemspec
86
- - features/cucumber_lint/fix/nothing.feature
87
- - features/cucumber_lint/fix/repeating_steps.feature
88
- - features/cucumber_lint/fix/table_whitespace.feature
89
- - features/cucumber_lint/fix/uppercase_table_headers.feature
90
- - features/cucumber_lint/lint/nothing.feature
91
- - features/cucumber_lint/lint/repeating_steps.feature
92
- - features/cucumber_lint/lint/table_whitespace.feature
93
- - features/cucumber_lint/lint/uppercase_table_headers.feature
76
+ - features/cucumber_lint/consistent_empty_lines/between_description_and_scenario.feature
77
+ - features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_docstring.feature
78
+ - features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_examples.feature
79
+ - features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_step.feature
80
+ - features/cucumber_lint/consistent_empty_lines/between_elements/ending_with_table.feature
81
+ - features/cucumber_lint/consistent_empty_lines/between_feature_and_description.feature
82
+ - features/cucumber_lint/consistent_empty_lines/between_feature_and_scenario.feature
83
+ - features/cucumber_lint/consistent_table_headers/examples_table.feature
84
+ - features/cucumber_lint/consistent_table_headers/step_table.feature
85
+ - features/cucumber_lint/consistent_table_headers/unsupported_style.feature
86
+ - features/cucumber_lint/consistent_table_whitespace/examples_table.feature
87
+ - features/cucumber_lint/consistent_table_whitespace/step_table.feature
88
+ - features/cucumber_lint/no_empty_features.feature
89
+ - features/cucumber_lint/no_files.feature
90
+ - features/cucumber_lint/no_repeating_keywords.feature
91
+ - features/cucumber_lint/unsupported_options.feature
94
92
  - features/step_definitions/cli_steps.rb
95
93
  - features/step_definitions/env.rb
96
- - features/step_definitions/feature_formatter_steps.rb
97
- - features/step_definitions/fixtures/repeating_steps/bad.feature.example
98
- - features/step_definitions/fixtures/repeating_steps/good.feature.example
99
- - features/step_definitions/fixtures/table_whitespace/bad.feature.example
100
- - features/step_definitions/fixtures/table_whitespace/good.feature.example
101
- - features/step_definitions/fixtures/uppercase_table_headers/bad.feature.example
102
- - features/step_definitions/fixtures/uppercase_table_headers/good.feature.example
94
+ - features/step_definitions/fixtures/config/disabled.yml
95
+ - features/step_definitions/support/file_helpers.rb
103
96
  - features/step_definitions/support/run_helpers.rb
97
+ - lib/core_ext/array.rb
98
+ - lib/core_ext/basic_object.rb
104
99
  - lib/core_ext/hash.rb
100
+ - lib/core_ext/string.rb
105
101
  - lib/cucumber_lint.rb
106
102
  - lib/cucumber_lint/cli.rb
107
- - lib/cucumber_lint/fix_list.rb
103
+ - lib/cucumber_lint/config.rb
104
+ - lib/cucumber_lint/errors/unsupported_style.rb
105
+ - lib/cucumber_lint/linted_file.rb
108
106
  - lib/cucumber_lint/linter.rb
107
+ - lib/cucumber_lint/linter/feature_empty_lines_linter.rb
109
108
  - lib/cucumber_lint/linter/feature_linter.rb
110
109
  - lib/cucumber_lint/linter/scenario_outline_linter.rb
111
110
  - lib/cucumber_lint/linter/steps_linter.rb
@@ -131,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
130
  version: '0'
132
131
  requirements: []
133
132
  rubyforge_project:
134
- rubygems_version: 2.4.5
133
+ rubygems_version: 2.4.8
135
134
  signing_key:
136
135
  specification_version: 4
137
136
  summary: A command line interface for linting and formatting cucumber features