tailor 0.1.5 → 1.0.0.alpha

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 (124) hide show
  1. data/.gitignore +9 -1
  2. data/.rspec +2 -1
  3. data/.tailor +6 -0
  4. data/Gemfile.lock +47 -78
  5. data/{ChangeLog.rdoc → History.rdoc} +0 -0
  6. data/README.rdoc +157 -24
  7. data/Rakefile +0 -9
  8. data/bin/tailor +16 -69
  9. data/features/configurable.feature +78 -0
  10. data/features/horizontal_spacing.feature +262 -0
  11. data/features/indentation.feature +17 -21
  12. data/features/indentation/bad_files_with_no_trailing_newline.feature +90 -0
  13. data/features/indentation/good_files_with_no_trailing_newline.feature +206 -0
  14. data/features/name_detection.feature +72 -0
  15. data/features/step_definitions/indentation_steps.rb +10 -133
  16. data/features/support/env.rb +7 -15
  17. data/features/support/file_cases/horizontal_spacing_cases.rb +265 -0
  18. data/features/support/file_cases/indentation_cases.rb +972 -0
  19. data/features/support/file_cases/naming_cases.rb +52 -0
  20. data/features/support/file_cases/vertical_spacing_cases.rb +70 -0
  21. data/features/support/hooks.rb +8 -0
  22. data/features/support/{1_file_with_bad_operator_spacing → legacy}/bad_op_spacing.rb +0 -0
  23. data/features/support/{1_file_with_bad_ternary_colon_spacing → legacy}/bad_ternary_colon_spacing.rb +0 -0
  24. data/features/support/{1_long_file_with_indentation/my_project.rb → legacy/long_file_with_indentation.rb} +1 -1
  25. data/features/support/world.rb +14 -0
  26. data/features/vertical_spacing.feature +114 -0
  27. data/lib/ext/string_ext.rb +5 -0
  28. data/lib/tailor.rb +6 -252
  29. data/lib/tailor/cli.rb +49 -0
  30. data/lib/tailor/cli/options.rb +251 -0
  31. data/lib/tailor/composite_observable.rb +56 -0
  32. data/lib/tailor/configuration.rb +263 -0
  33. data/lib/tailor/critic.rb +162 -0
  34. data/lib/tailor/formatters/text.rb +126 -0
  35. data/lib/tailor/lexed_line.rb +246 -0
  36. data/lib/tailor/lexer.rb +428 -0
  37. data/lib/tailor/lexer/token.rb +103 -0
  38. data/lib/tailor/lexer_constants.rb +75 -0
  39. data/lib/tailor/logger.rb +28 -0
  40. data/lib/tailor/problem.rb +100 -0
  41. data/lib/tailor/reporter.rb +48 -0
  42. data/lib/tailor/ruler.rb +39 -0
  43. data/lib/tailor/rulers.rb +7 -0
  44. data/lib/tailor/rulers/allow_camel_case_methods_ruler.rb +30 -0
  45. data/lib/tailor/rulers/allow_hard_tabs_ruler.rb +22 -0
  46. data/lib/tailor/rulers/allow_screaming_snake_case_classes_ruler.rb +32 -0
  47. data/lib/tailor/rulers/allow_trailing_line_spaces_ruler.rb +33 -0
  48. data/lib/tailor/rulers/indentation_spaces_ruler.rb +199 -0
  49. data/lib/tailor/rulers/indentation_spaces_ruler/indentation_manager.rb +362 -0
  50. data/lib/tailor/rulers/max_code_lines_in_class_ruler.rb +84 -0
  51. data/lib/tailor/rulers/max_code_lines_in_method_ruler.rb +84 -0
  52. data/lib/tailor/rulers/max_line_length_ruler.rb +31 -0
  53. data/lib/tailor/rulers/spaces_after_comma_ruler.rb +83 -0
  54. data/lib/tailor/rulers/spaces_after_lbrace_ruler.rb +114 -0
  55. data/lib/tailor/rulers/spaces_after_lbracket_ruler.rb +123 -0
  56. data/lib/tailor/rulers/spaces_after_lparen_ruler.rb +116 -0
  57. data/lib/tailor/rulers/spaces_before_comma_ruler.rb +67 -0
  58. data/lib/tailor/rulers/spaces_before_lbrace_ruler.rb +93 -0
  59. data/lib/tailor/rulers/spaces_before_rbrace_ruler.rb +98 -0
  60. data/lib/tailor/rulers/spaces_before_rbracket_ruler.rb +70 -0
  61. data/lib/tailor/rulers/spaces_before_rparen_ruler.rb +70 -0
  62. data/lib/tailor/rulers/spaces_in_empty_braces_ruler.rb +94 -0
  63. data/lib/tailor/rulers/trailing_newlines_ruler.rb +36 -0
  64. data/lib/tailor/runtime_error.rb +3 -0
  65. data/lib/tailor/tailorrc.erb +88 -0
  66. data/lib/tailor/version.rb +2 -2
  67. data/spec/spec_helper.rb +7 -5
  68. data/spec/tailor/cli_spec.rb +94 -0
  69. data/spec/tailor/configuration_spec.rb +147 -0
  70. data/spec/tailor/critic_spec.rb +63 -0
  71. data/spec/tailor/lexed_line_spec.rb +569 -0
  72. data/spec/tailor/lexer/token_spec.rb +46 -0
  73. data/spec/tailor/lexer_spec.rb +181 -0
  74. data/spec/tailor/options_spec.rb +6 -0
  75. data/spec/tailor/problem_spec.rb +74 -0
  76. data/spec/tailor/reporter_spec.rb +53 -0
  77. data/spec/tailor/ruler_spec.rb +56 -0
  78. data/spec/tailor/rulers/indentation_spaces_ruler/indentation_manager_spec.rb +454 -0
  79. data/spec/tailor/rulers/indentation_spaces_ruler_spec.rb +128 -0
  80. data/spec/tailor/rulers/spaces_after_comma_spec.rb +31 -0
  81. data/spec/tailor/rulers/spaces_after_lbrace_ruler_spec.rb +145 -0
  82. data/spec/tailor/rulers/spaces_before_lbrace_ruler_spec.rb +63 -0
  83. data/spec/tailor/rulers/spaces_before_rbrace_ruler_spec.rb +63 -0
  84. data/spec/tailor/rulers_spec.rb +9 -0
  85. data/spec/tailor/version_spec.rb +6 -0
  86. data/spec/tailor_spec.rb +9 -21
  87. data/tailor.gemspec +22 -35
  88. data/tasks/features.rake +7 -0
  89. data/tasks/roodi.rake +9 -0
  90. data/tasks/roodi_config.yaml +14 -0
  91. data/tasks/spec.rake +16 -0
  92. data/tasks/yard.rake +14 -0
  93. metadata +224 -77
  94. data/features/case_checking.feature +0 -38
  95. data/features/spacing.feature +0 -97
  96. data/features/spacing/commas.feature +0 -44
  97. data/features/step_definitions/case_checking_steps.rb +0 -42
  98. data/features/step_definitions/spacing_steps.rb +0 -156
  99. data/features/support/1_file_with_bad_comma_spacing/bad_comma_spacing.rb +0 -43
  100. data/features/support/1_file_with_bad_curly_brace_spacing/bad_curly_brace_spacing.rb +0 -60
  101. data/features/support/1_file_with_bad_parenthesis/bad_parenthesis.rb +0 -4
  102. data/features/support/1_file_with_bad_square_brackets/bad_square_brackets.rb +0 -62
  103. data/features/support/1_file_with_camel_case_class/camel_case_class.rb +0 -5
  104. data/features/support/1_file_with_camel_case_method/camel_case_method.rb +0 -3
  105. data/features/support/1_file_with_hard_tabs/hard_tab.rb +0 -3
  106. data/features/support/1_file_with_long_lines/long_lines.rb +0 -5
  107. data/features/support/1_file_with_snake_case_class/snake_case_class.rb +0 -5
  108. data/features/support/1_file_with_snake_case_method/snake_case_method.rb +0 -3
  109. data/features/support/1_file_with_trailing_whitespace/trailing_whitespace.rb +0 -5
  110. data/features/support/1_good_simple_file/simple_project.rb +0 -5
  111. data/features/support/common.rb +0 -102
  112. data/features/support/matchers.rb +0 -11
  113. data/lib/tailor/file_line.rb +0 -220
  114. data/lib/tailor/indentation.rb +0 -245
  115. data/lib/tailor/spacing.rb +0 -237
  116. data/spec/file_line_spec.rb +0 -70
  117. data/spec/indentation_spec.rb +0 -259
  118. data/spec/spacing/colon_spacing_spec.rb +0 -71
  119. data/spec/spacing/comma_spacing_spec.rb +0 -159
  120. data/spec/spacing/curly_brace_spacing_spec.rb +0 -257
  121. data/spec/spacing/parentheses_spacing_spec.rb +0 -28
  122. data/spec/spacing/square_bracket_spacing_spec.rb +0 -116
  123. data/spec/spacing_spec.rb +0 -167
  124. data/tasks/metrics.rake +0 -23
@@ -0,0 +1,67 @@
1
+ require_relative '../ruler'
2
+
3
+ class Tailor
4
+ module Rulers
5
+
6
+ # Checks for spaces before a ',' as given by +@config+.
7
+ class SpacesBeforeCommaRuler < Tailor::Ruler
8
+ def initialize(config)
9
+ super(config)
10
+ @comma_columns = []
11
+ end
12
+
13
+ def comma_update(text_line, lineno, column)
14
+ @comma_columns << column
15
+ end
16
+
17
+ def comment_update(token, lexed_line, file_text, lineno, column)
18
+ if token =~ /\n$/
19
+ log "Found comment with trailing newline."
20
+ ignored_nl_update(lexed_line, lineno, column)
21
+ end
22
+ end
23
+
24
+ # Checks to see if the number of spaces before a comma equals the value
25
+ # at +@config+.
26
+ #
27
+ # @param [Fixnum] actual_spaces The number of spaces before the comma.
28
+ # @param [Fixnum] lineno Line the potential problem is on.
29
+ # @param [Fixnum] column Column the potential problem is on.
30
+ def measure(actual_spaces, lineno, column)
31
+ if actual_spaces != @config
32
+ @problems << Problem.new(:spaces_before_comma, lineno, column - 1,
33
+ { actual_spaces: actual_spaces, should_have: @config })
34
+ end
35
+ end
36
+
37
+ def check_spaces_before_comma(lexed_line, lineno)
38
+ @comma_columns.each do |c|
39
+ event_index = lexed_line.event_index(c)
40
+ if event_index.nil?
41
+ log "Event index is nil. Weird..."
42
+ next
43
+ end
44
+
45
+ previous_event = lexed_line.at(event_index - 1)
46
+ actual_spaces = if previous_event[1] != :on_sp
47
+ 0
48
+ else
49
+ previous_event.last.size
50
+ end
51
+
52
+ measure(actual_spaces, lineno, c)
53
+ end
54
+
55
+ @comma_columns.clear
56
+ end
57
+
58
+ def ignored_nl_update(lexed_line, lineno, column)
59
+ check_spaces_before_comma(lexed_line, lineno)
60
+ end
61
+
62
+ def nl_update(lexed_line, lineno, column)
63
+ ignored_nl_update(lexed_line, lineno, column)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,93 @@
1
+ require_relative '../ruler'
2
+
3
+ class Tailor
4
+ module Rulers
5
+
6
+ # Detects spaces before a '{' as given by +@config+. It skips checking
7
+ # when:
8
+ # * it's the first char in the line.
9
+ # * the char before it is a '#{'.
10
+ # * the char before it is a '('.
11
+ # * the char before it is a '['.
12
+ # * it's only preceded by spaces.
13
+ class SpacesBeforeLbraceRuler < Tailor::Ruler
14
+
15
+ # Counts the spaces before the '{'.
16
+ #
17
+ # @param [LexedLine] lexed_line
18
+ # @param [Fixnum] column
19
+ # @return [Fixnum] The number of spaces before the lbrace.
20
+ def count_spaces(lexed_line, column)
21
+ current_index = lexed_line.event_index(column)
22
+ log "Current event index: #{current_index}"
23
+ previous_event = lexed_line.at(current_index - 1)
24
+ log "Previous event: #{previous_event}"
25
+
26
+ if column.zero? || previous_event.nil?
27
+ log "lbrace must be at the beginning of the line."
28
+ @do_measurement = false
29
+ return 0
30
+ end
31
+
32
+ if previous_event[1] == :on_embexpr_beg
33
+ log "lbrace comes after a '\#{'."
34
+ @do_measurement = false
35
+ return 0
36
+ end
37
+
38
+ if previous_event[1] == :on_lparen
39
+ log "lbrace comes after a '('."
40
+ @do_measurement = false
41
+ return 0
42
+ end
43
+
44
+ if previous_event[1] == :on_lbracket
45
+ log "lbrace comes after a '['."
46
+ @do_measurement = false
47
+ return 0
48
+ end
49
+
50
+ return 0 if previous_event[1] != :on_sp
51
+
52
+ if current_index - 2 < 0
53
+ log "lbrace comes at the beginning of an indented line."
54
+ @do_measurement = false
55
+ return previous_event.last.size
56
+ end
57
+
58
+ previous_event.last.size
59
+ end
60
+
61
+ # Called by {Lexer} when :on_lbrace is encountered.
62
+ #
63
+ # @param [LexedLine] lexed_line
64
+ # @param [Fixnum] lineno
65
+ # @param [Fixnum] column
66
+ def lbrace_update(lexed_line, lineno, column)
67
+ count = count_spaces(lexed_line, column)
68
+ log "Found #{count} space(s) before lbrace."
69
+
70
+ if @do_measurement == false
71
+ log "Skipping measurement."
72
+ else
73
+ measure(count, lineno, column)
74
+ end
75
+
76
+ @do_measurement = true
77
+ end
78
+
79
+ # Checks to see if the counted spaces before an lbrace equals the value
80
+ # at +@config+.
81
+ #
82
+ # @param [Fixnum] count The number of spaces before the lbrace.
83
+ # @param [Fixnum] lineno Line the potential problem is on.
84
+ # @param [Fixnum] column Column the potential problem is on.
85
+ def measure(count, lineno, column)
86
+ if count != @config
87
+ @problems << Problem.new(:spaces_before_lbrace, lineno, column,
88
+ { actual_spaces: count, should_have: @config })
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,98 @@
1
+ require_relative '../ruler'
2
+
3
+ class Tailor
4
+ module Rulers
5
+
6
+ # Checks for spaces before a '}' as given by +@config+. It skips checking
7
+ # when:
8
+ # * it's the first char in the line.
9
+ # * it's the first char in the line, preceded by spaces.
10
+ # * it's directly preceded by a '{'.
11
+ class SpacesBeforeRbraceRuler < Tailor::Ruler
12
+ def initialize(config)
13
+ super(config)
14
+ @lbrace_nesting = []
15
+ end
16
+
17
+ # @param [LexedLine] lexed_line
18
+ # @param [Fixnum] column
19
+ # @return [Fixnum] The number of spaces before the rbrace.
20
+ def count_spaces(lexed_line, column)
21
+ current_index = lexed_line.event_index(column)
22
+ log "Current event index: #{current_index}"
23
+ previous_event = lexed_line.at(current_index - 1)
24
+ log "Previous event: #{previous_event}"
25
+
26
+ if column.zero? || previous_event.nil?
27
+ log "rbrace is at the beginning of the line."
28
+ @do_measurement = false
29
+ return 0
30
+ end
31
+
32
+ if previous_event[1] == :on_lbrace
33
+ log "rbrace comes after a '{'"
34
+ @do_measurement = false
35
+ return 0
36
+ end
37
+
38
+ return 0 if previous_event[1] != :on_sp
39
+
40
+ if current_index - 2 < 0
41
+ log "rbrace is at the beginning of an indented line. Moving on."
42
+ @do_measurement = false
43
+ return previous_event.last.size
44
+ end
45
+
46
+ previous_event.last.size
47
+ end
48
+
49
+ def embexpr_beg_update
50
+ @lbrace_nesting << :embexpr_beg
51
+ end
52
+
53
+ def lbrace_update(lexed_line, lineno, column)
54
+ @lbrace_nesting << :lbrace
55
+ end
56
+
57
+ # Checks to see if the number of spaces before an rbrace equals the value
58
+ # at +@config+.
59
+ #
60
+ # @param [Fixnum] count The number of spaces after the rbrace.
61
+ # @param [Fixnum] lineno Line the problem was found on.
62
+ # @param [Fixnum] column Column the problem was found on.
63
+ def measure(count, lineno, column)
64
+ if count != @config
65
+ @problems << Problem.new(:spaces_before_rbrace, lineno, column,
66
+ { actual_spaces: count, should_have: @config })
67
+ end
68
+ end
69
+
70
+ # This has to keep track of '{'s and only follow through with the check
71
+ # if the '{' was an lbrace because Ripper doesn't scan the '}' of an
72
+ # embedded expression (embexpr_end) as such.
73
+ #
74
+ # @param [Tailor::LexedLine] lexed_line
75
+ # @param [Fixnum] lineno
76
+ # @param [Fixnum] column
77
+ def rbrace_update(lexed_line, lineno, column)
78
+ if @lbrace_nesting.last == :embexpr_beg
79
+ @lbrace_nesting.pop
80
+ return
81
+ end
82
+
83
+ @lbrace_nesting.pop
84
+
85
+ count = count_spaces(lexed_line, column)
86
+ log "Found #{count} space(s) before rbrace."
87
+
88
+ if @do_measurement == false
89
+ log "Skipping measurement."
90
+ else
91
+ measure(count, lineno, column)
92
+ end
93
+
94
+ @do_measurement = true
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,70 @@
1
+ require_relative '../ruler'
2
+
3
+ class Tailor
4
+ module Rulers
5
+
6
+ # Checks for spaces before a ']' as given by +@config+. It skips checking
7
+ # when:
8
+ # * it's the first char in the line.
9
+ # * it's directly preceded by a '['.
10
+ # * it's directly preceded by spaces, then a '['.
11
+ class SpacesBeforeRbracketRuler < Tailor::Ruler
12
+
13
+ # @param [LexedLine] lexed_line
14
+ # @param [Fixnum] column
15
+ # @return [Fixnum] The number of spaces before the rbracket.
16
+ def count_spaces(lexed_line, column)
17
+ current_index = lexed_line.event_index(column)
18
+ log "Current event index: #{current_index}"
19
+ previous_event = lexed_line.at(current_index - 1)
20
+ log "Previous event: #{previous_event}"
21
+
22
+ if column.zero? || previous_event.nil? ||
23
+ previous_event[1] == :on_lbracket
24
+ return nil
25
+ end
26
+
27
+ return 0 if previous_event[1] != :on_sp
28
+ return nil if current_index - 2 < 0
29
+
30
+ second_previous_event = lexed_line.at(current_index - 2)
31
+ return nil if second_previous_event[1] == :on_lbracket
32
+
33
+ previous_event.last.size
34
+ end
35
+
36
+ # Checks to see if the counted spaces before an rbracket equals the value
37
+ # at +@config+.
38
+ #
39
+ # @param [Fixnum] count The number of spaces before the rbracket.
40
+ # @param [Fixnum] lineno Line the potential problem is on.
41
+ # @param [Fixnum] column Column the potential problem is on.
42
+ def measure(count, lineno, column)
43
+ if count != @config
44
+ @problems << Problem.new(:spaces_before_rbracket, lineno, column,
45
+ { actual_spaces: count, should_have: @config })
46
+ end
47
+ end
48
+
49
+ # This has to keep track of '{'s and only follow through with the check
50
+ # if the '{' was an lbrace because Ripper doesn't scan the '}' of an
51
+ # embedded expression (embexpr_end) as such.
52
+ #
53
+ # @param [Tailor::LexedLine] lexed_line
54
+ # @param [Fixnum] lineno
55
+ # @param [Fixnum] column
56
+ def rbracket_update(lexed_line, lineno, column)
57
+ count = count_spaces(lexed_line, column)
58
+
59
+ if count.nil?
60
+ log "rbracket must be at the beginning of the line."
61
+ return
62
+ else
63
+ log "Found #{count} space(s) before rbracket."
64
+ end
65
+
66
+ measure(count, lineno, column)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,70 @@
1
+ require_relative '../ruler'
2
+
3
+ class Tailor
4
+ module Rulers
5
+
6
+ # Checks for spaces before a ')' as given by +@config+. It skips checking
7
+ # when:
8
+ # * it's the first char in the line.
9
+ # * it's directly preceded by a '('.
10
+ # * it's directly preceded by spaces, then a '('.
11
+ class SpacesBeforeRparenRuler < Tailor::Ruler
12
+
13
+ # @param [LexedLine] lexed_line
14
+ # @param [Fixnum] column
15
+ # @return [Fixnum] The number of spaces before the rparen.
16
+ def count_spaces(lexed_line, column)
17
+ current_index = lexed_line.event_index(column)
18
+ log "Current event index: #{current_index}"
19
+ previous_event = lexed_line.at(current_index - 1)
20
+ log "Previous event: #{previous_event}"
21
+
22
+ if column.zero? || previous_event.nil? ||
23
+ previous_event[1] == :on_lparen
24
+ return nil
25
+ end
26
+
27
+ return 0 if previous_event[1] != :on_sp
28
+ return nil if current_index - 2 < 0
29
+
30
+ second_previous_event = lexed_line.at(current_index - 2)
31
+ return nil if second_previous_event[1] == :on_lparen
32
+
33
+ previous_event.last.size
34
+ end
35
+
36
+ # Checks to see if the counted spaces before an rparen equals the value
37
+ # at +@config+.
38
+ #
39
+ # @param [Fixnum] count The number of spaces before the rparen.
40
+ # @param [Fixnum] lineno Line the potential problem is on.
41
+ # @param [Fixnum] column Column the potential problem is on.
42
+ def measure(count, lineno, column)
43
+ if count != @config
44
+ @problems << Problem.new(:spaces_before_rparen, lineno, column,
45
+ { actual_spaces: count, should_have: @config })
46
+ end
47
+ end
48
+
49
+ # This has to keep track of '{'s and only follow through with the check
50
+ # if the '{' was an lbrace because Ripper doesn't scan the '}' of an
51
+ # embedded expression (embexpr_end) as such.
52
+ #
53
+ # @param [Tailor::LexedLine] lexed_line
54
+ # @param [Fixnum] lineno
55
+ # @param [Fixnum] column
56
+ def rparen_update(lexed_line, lineno, column)
57
+ count = count_spaces(lexed_line, column)
58
+
59
+ if count.nil?
60
+ log "rparen must be at the beginning of the line."
61
+ return
62
+ else
63
+ log "Found #{count} space(s) before rparen."
64
+ end
65
+
66
+ measure(count, lineno, column)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,94 @@
1
+ require_relative '../ruler'
2
+
3
+ class Tailor
4
+ module Rulers
5
+
6
+ # Checks for spaces that exist between a '{' and '}' when there is only
7
+ # space in between them.
8
+ class SpacesInEmptyBracesRuler < Tailor::Ruler
9
+ def initialize(config)
10
+ super(config)
11
+ @lbrace_nesting = []
12
+ end
13
+
14
+ # @param [LexedLine] lexed_line
15
+ # @param [Fixnum] column
16
+ # @return [Fixnum] The number of spaces before the rbrace.
17
+ def count_spaces(lexed_line, column)
18
+ current_index = lexed_line.event_index(column)
19
+ log "Current event index: #{current_index}"
20
+ previous_event = lexed_line.at(current_index - 1)
21
+ log "Previous event: #{previous_event}"
22
+
23
+ if column.zero? || previous_event.nil?
24
+ return
25
+ end
26
+
27
+ if previous_event[1] == :on_lbrace
28
+ return 0
29
+ end
30
+
31
+ if previous_event[1] == :on_sp
32
+ second_previous_event = lexed_line.at(current_index - 2)
33
+
34
+ if second_previous_event[1] == :on_lbrace
35
+ previous_event.last.size
36
+ else
37
+ nil
38
+ end
39
+ end
40
+ end
41
+
42
+ def embexpr_beg_update
43
+ @lbrace_nesting << :embexpr_beg
44
+ end
45
+
46
+ def lbrace_update(lexed_line, lineno, column)
47
+ @lbrace_nesting << :lbrace
48
+ end
49
+
50
+ def nl_update(lexed_line, lineno, column)
51
+ ignored_nl_update(lexed_line, lineno, column)
52
+ end
53
+
54
+ # Checks to see if the counted spaces between an lbrace and an rbrace
55
+ # equals the value at +@config+.
56
+ #
57
+ # @param [Fixnum] count The number of spaces before the lbrace.
58
+ # @param [Fixnum] lineno Line the potential problem is on.
59
+ # @param [Fixnum] column Column the potential problem is on.
60
+ def measure(count, lineno, column)
61
+ if count != @config
62
+ @problems << Problem.new(:spaces_in_empty_braces, lineno, column,
63
+ { actual_spaces: count, should_have: @config })
64
+ end
65
+ end
66
+
67
+ # This has to keep track of '{'s and only follow through with the check
68
+ # if the '{' was an lbrace because Ripper doesn't scan the '}' of an
69
+ # embedded expression (embexpr_end) as such.
70
+ #
71
+ # @param [Tailor::LexedLine] lexed_line
72
+ # @param [Fixnum] lineno
73
+ # @param [Fixnum] column
74
+ def rbrace_update(lexed_line, lineno, column)
75
+ if @lbrace_nesting.last == :embexpr_beg
76
+ @lbrace_nesting.pop
77
+ return
78
+ end
79
+
80
+ @lbrace_nesting.pop
81
+ count = count_spaces(lexed_line, column)
82
+
83
+ if count.nil?
84
+ log "Braces aren't empty. Moving on."
85
+ return
86
+ else
87
+ log "Found #{count} space(s) before rbrace."
88
+ end
89
+
90
+ measure(count, lineno, column)
91
+ end
92
+ end
93
+ end
94
+ end