ridecharge-rubocop 0.0.1

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 (219) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +14 -0
  5. data/CHANGELOG.md +0 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +35 -0
  9. data/Rakefile +22 -0
  10. data/bin/ridecharge-rubocop +49 -0
  11. data/config/0default.yml +8 -0
  12. data/config/fleet-magic-todo.yml +380 -0
  13. data/config/rc-todo.yml +190 -0
  14. data/config/ridecharge-rubocop_todo.yml +73 -0
  15. data/config/rubocop/default.yml +308 -0
  16. data/config/rubocop/disabled.yml +9 -0
  17. data/config/rubocop/enabled.yml +648 -0
  18. data/config/standard-todo.yml +24 -0
  19. data/config/tabs.yml +15 -0
  20. data/config/vehicle-todo.yml +195 -0
  21. data/lib/ridecharge/rubocop.rb +2 -0
  22. data/lib/ridecharge/rubocop/version.rb +5 -0
  23. data/lib/rubocop/config_loader_monkeypatch.rb +117 -0
  24. data/lib/rubocop/ridecharge.rb +1 -0
  25. data/ridecharge-rubocop.gemspec +25 -0
  26. data/spec/isolated_environment_spec.rb +24 -0
  27. data/spec/project_spec.rb +118 -0
  28. data/spec/rubocop/cli_spec.rb +1385 -0
  29. data/spec/rubocop/config_loader_spec.rb +328 -0
  30. data/spec/rubocop/config_spec.rb +179 -0
  31. data/spec/rubocop/config_store_spec.rb +53 -0
  32. data/spec/rubocop/cop/commissioner_spec.rb +83 -0
  33. data/spec/rubocop/cop/cop_spec.rb +114 -0
  34. data/spec/rubocop/cop/corrector_spec.rb +59 -0
  35. data/spec/rubocop/cop/lint/ambiguous_operator_spec.rb +113 -0
  36. data/spec/rubocop/cop/lint/ambiguous_regexp_literal_spec.rb +35 -0
  37. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +107 -0
  38. data/spec/rubocop/cop/lint/block_alignment_spec.rb +411 -0
  39. data/spec/rubocop/cop/lint/condition_position_spec.rb +49 -0
  40. data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
  41. data/spec/rubocop/cop/lint/else_layout_spec.rb +65 -0
  42. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +27 -0
  43. data/spec/rubocop/cop/lint/end_alignment_spec.rb +136 -0
  44. data/spec/rubocop/cop/lint/end_in_method_spec.rb +29 -0
  45. data/spec/rubocop/cop/lint/ensure_return_spec.rb +39 -0
  46. data/spec/rubocop/cop/lint/eval_spec.rb +35 -0
  47. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +30 -0
  48. data/spec/rubocop/cop/lint/invalid_character_literal_spec.rb +33 -0
  49. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +63 -0
  50. data/spec/rubocop/cop/lint/loop_spec.rb +27 -0
  51. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +57 -0
  52. data/spec/rubocop/cop/lint/require_parentheses_spec.rb +82 -0
  53. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +131 -0
  54. data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +237 -0
  55. data/spec/rubocop/cop/lint/syntax_spec.rb +34 -0
  56. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +63 -0
  57. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1570 -0
  58. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +30 -0
  59. data/spec/rubocop/cop/lint/useless_else_without_rescue_spec.rb +48 -0
  60. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +149 -0
  61. data/spec/rubocop/cop/lint/void_spec.rb +57 -0
  62. data/spec/rubocop/cop/offence_spec.rb +133 -0
  63. data/spec/rubocop/cop/rails/default_scope_spec.rb +37 -0
  64. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +13 -0
  65. data/spec/rubocop/cop/rails/output_spec.rb +41 -0
  66. data/spec/rubocop/cop/rails/read_attribute_spec.rb +13 -0
  67. data/spec/rubocop/cop/rails/validation_spec.rb +21 -0
  68. data/spec/rubocop/cop/style/access_modifier_indentation_spec.rb +361 -0
  69. data/spec/rubocop/cop/style/accessor_method_name_spec.rb +81 -0
  70. data/spec/rubocop/cop/style/alias_spec.rb +59 -0
  71. data/spec/rubocop/cop/style/align_array_spec.rb +75 -0
  72. data/spec/rubocop/cop/style/align_hash_spec.rb +310 -0
  73. data/spec/rubocop/cop/style/align_parameters_spec.rb +222 -0
  74. data/spec/rubocop/cop/style/and_or_spec.rb +57 -0
  75. data/spec/rubocop/cop/style/ascii_comments_spec.rb +22 -0
  76. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +36 -0
  77. data/spec/rubocop/cop/style/attr_spec.rb +19 -0
  78. data/spec/rubocop/cop/style/begin_block_spec.rb +13 -0
  79. data/spec/rubocop/cop/style/block_comments_spec.rb +21 -0
  80. data/spec/rubocop/cop/style/block_nesting_spec.rb +156 -0
  81. data/spec/rubocop/cop/style/blocks_spec.rb +99 -0
  82. data/spec/rubocop/cop/style/braces_around_hash_parameters_spec.rb +284 -0
  83. data/spec/rubocop/cop/style/case_equality_spec.rb +12 -0
  84. data/spec/rubocop/cop/style/case_indentation_spec.rb +289 -0
  85. data/spec/rubocop/cop/style/character_literal_spec.rb +37 -0
  86. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +40 -0
  87. data/spec/rubocop/cop/style/class_length_spec.rb +131 -0
  88. data/spec/rubocop/cop/style/class_methods_spec.rb +45 -0
  89. data/spec/rubocop/cop/style/class_vars_spec.rb +19 -0
  90. data/spec/rubocop/cop/style/collection_methods_spec.rb +48 -0
  91. data/spec/rubocop/cop/style/colon_method_call_spec.rb +60 -0
  92. data/spec/rubocop/cop/style/comment_annotation_spec.rb +86 -0
  93. data/spec/rubocop/cop/style/constant_name_spec.rb +65 -0
  94. data/spec/rubocop/cop/style/cyclomatic_complexity_spec.rb +204 -0
  95. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +39 -0
  96. data/spec/rubocop/cop/style/documentation_spec.rb +123 -0
  97. data/spec/rubocop/cop/style/dot_position_spec.rb +94 -0
  98. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +127 -0
  99. data/spec/rubocop/cop/style/empty_lines_around_access_modifier_spec.rb +56 -0
  100. data/spec/rubocop/cop/style/empty_lines_around_body_spec.rb +131 -0
  101. data/spec/rubocop/cop/style/empty_lines_spec.rb +40 -0
  102. data/spec/rubocop/cop/style/empty_literal_spec.rb +100 -0
  103. data/spec/rubocop/cop/style/encoding_spec.rb +56 -0
  104. data/spec/rubocop/cop/style/end_block_spec.rb +13 -0
  105. data/spec/rubocop/cop/style/end_of_line_spec.rb +47 -0
  106. data/spec/rubocop/cop/style/even_odd_spec.rb +75 -0
  107. data/spec/rubocop/cop/style/favor_join_spec.rb +31 -0
  108. data/spec/rubocop/cop/style/favor_sprintf_spec.rb +47 -0
  109. data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +76 -0
  110. data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +41 -0
  111. data/spec/rubocop/cop/style/final_newline_spec.rb +30 -0
  112. data/spec/rubocop/cop/style/flip_flop_spec.rb +23 -0
  113. data/spec/rubocop/cop/style/for_spec.rb +105 -0
  114. data/spec/rubocop/cop/style/global_vars_spec.rb +34 -0
  115. data/spec/rubocop/cop/style/hash_methods_spec.rb +45 -0
  116. data/spec/rubocop/cop/style/hash_syntax_spec.rb +131 -0
  117. data/spec/rubocop/cop/style/if_unless_modifier_spec.rb +128 -0
  118. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +19 -0
  119. data/spec/rubocop/cop/style/indentation_consistency_spec.rb +490 -0
  120. data/spec/rubocop/cop/style/indentation_width_spec.rb +470 -0
  121. data/spec/rubocop/cop/style/lambda_call_spec.rb +65 -0
  122. data/spec/rubocop/cop/style/lambda_spec.rb +41 -0
  123. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +64 -0
  124. data/spec/rubocop/cop/style/line_end_concatenation_spec.rb +34 -0
  125. data/spec/rubocop/cop/style/line_length_spec.rb +20 -0
  126. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +59 -0
  127. data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
  128. data/spec/rubocop/cop/style/method_def_parentheses_spec.rb +106 -0
  129. data/spec/rubocop/cop/style/method_length_spec.rb +147 -0
  130. data/spec/rubocop/cop/style/method_name_spec.rb +125 -0
  131. data/spec/rubocop/cop/style/module_function_spec.rb +24 -0
  132. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +78 -0
  133. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +107 -0
  134. data/spec/rubocop/cop/style/multiline_ternary_operator_spec.rb +18 -0
  135. data/spec/rubocop/cop/style/nested_ternary_operator_spec.rb +21 -0
  136. data/spec/rubocop/cop/style/nil_comparison_spec.rb +30 -0
  137. data/spec/rubocop/cop/style/not_spec.rb +22 -0
  138. data/spec/rubocop/cop/style/numeric_literals_spec.rb +64 -0
  139. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +13 -0
  140. data/spec/rubocop/cop/style/op_method_spec.rb +74 -0
  141. data/spec/rubocop/cop/style/parameter_lists_spec.rb +44 -0
  142. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +122 -0
  143. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +17 -0
  144. data/spec/rubocop/cop/style/predicate_name_spec.rb +25 -0
  145. data/spec/rubocop/cop/style/proc_spec.rb +27 -0
  146. data/spec/rubocop/cop/style/raise_args_spec.rb +82 -0
  147. data/spec/rubocop/cop/style/redundant_begin_spec.rb +57 -0
  148. data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
  149. data/spec/rubocop/cop/style/redundant_return_spec.rb +171 -0
  150. data/spec/rubocop/cop/style/redundant_self_spec.rb +142 -0
  151. data/spec/rubocop/cop/style/regexp_literal_spec.rb +83 -0
  152. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +116 -0
  153. data/spec/rubocop/cop/style/semicolon_spec.rb +100 -0
  154. data/spec/rubocop/cop/style/signal_exception_spec.rb +266 -0
  155. data/spec/rubocop/cop/style/single_line_block_params_spec.rb +68 -0
  156. data/spec/rubocop/cop/style/single_line_methods_spec.rb +52 -0
  157. data/spec/rubocop/cop/style/space_after_colon_spec.rb +38 -0
  158. data/spec/rubocop/cop/style/space_after_comma_spec.rb +30 -0
  159. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +84 -0
  160. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +70 -0
  161. data/spec/rubocop/cop/style/space_after_not_spec.rb +22 -0
  162. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +23 -0
  163. data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +283 -0
  164. data/spec/rubocop/cop/style/space_around_equals_in_parameter_default_spec.rb +33 -0
  165. data/spec/rubocop/cop/style/space_around_operators_spec.rb +325 -0
  166. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +70 -0
  167. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +52 -0
  168. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +138 -0
  169. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +34 -0
  170. data/spec/rubocop/cop/style/special_global_vars_spec.rb +56 -0
  171. data/spec/rubocop/cop/style/string_literals_spec.rb +212 -0
  172. data/spec/rubocop/cop/style/symbol_array_spec.rb +37 -0
  173. data/spec/rubocop/cop/style/tab_spec.rb +17 -0
  174. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +43 -0
  175. data/spec/rubocop/cop/style/trailing_comma_spec.rb +230 -0
  176. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +30 -0
  177. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +415 -0
  178. data/spec/rubocop/cop/style/unless_else_spec.rb +25 -0
  179. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +47 -0
  180. data/spec/rubocop/cop/style/variable_name_spec.rb +107 -0
  181. data/spec/rubocop/cop/style/when_then_spec.rb +41 -0
  182. data/spec/rubocop/cop/style/while_until_do_spec.rb +53 -0
  183. data/spec/rubocop/cop/style/while_until_modifier_spec.rb +75 -0
  184. data/spec/rubocop/cop/style/word_array_spec.rb +97 -0
  185. data/spec/rubocop/cop/team_spec.rb +156 -0
  186. data/spec/rubocop/cop/util_spec.rb +49 -0
  187. data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +213 -0
  188. data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +734 -0
  189. data/spec/rubocop/cop/variable_inspector/scope_spec.rb +184 -0
  190. data/spec/rubocop/cop/variable_inspector/variable_spec.rb +73 -0
  191. data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +269 -0
  192. data/spec/rubocop/cop/variable_inspector_spec.rb +29 -0
  193. data/spec/rubocop/file_inspector_spec.rb +78 -0
  194. data/spec/rubocop/formatter/base_formatter_spec.rb +191 -0
  195. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +114 -0
  196. data/spec/rubocop/formatter/colorizable_spec.rb +107 -0
  197. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +50 -0
  198. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +62 -0
  199. data/spec/rubocop/formatter/file_list_formatter_spec.rb +33 -0
  200. data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
  201. data/spec/rubocop/formatter/json_formatter_spec.rb +148 -0
  202. data/spec/rubocop/formatter/offence_count_formatter_spec.rb +52 -0
  203. data/spec/rubocop/formatter/progress_formatter_spec.rb +182 -0
  204. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +123 -0
  205. data/spec/rubocop/options_spec.rb +145 -0
  206. data/spec/rubocop/path_util_spec.rb +42 -0
  207. data/spec/rubocop/processed_source_spec.rb +114 -0
  208. data/spec/rubocop/source_parser_spec.rb +139 -0
  209. data/spec/rubocop/target_finder_spec.rb +180 -0
  210. data/spec/rubocop/token_spec.rb +25 -0
  211. data/spec/spec_helper.rb +136 -0
  212. data/spec/support/ast_helper.rb +15 -0
  213. data/spec/support/file_helper.rb +21 -0
  214. data/spec/support/isolated_environment.rb +34 -0
  215. data/spec/support/mri_syntax_checker.rb +73 -0
  216. data/spec/support/shared_context.rb +22 -0
  217. data/spec/support/shared_examples.rb +33 -0
  218. data/spec/support/statement_modifier_helper.rb +41 -0
  219. metadata +511 -0
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::Tab do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'registers an offence for a line indented with tab' do
9
+ inspect_source(cop, ["\tx = 0"])
10
+ expect(cop.offences.size).to eq(1)
11
+ end
12
+
13
+ it 'accepts a line with tab in a string' do
14
+ inspect_source(cop, ["(x = \"\t\")"])
15
+ expect(cop.offences).to be_empty
16
+ end
17
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::TrailingBlankLines do
6
+ subject(:cop) { described_class.new(config) }
7
+ let(:config) do
8
+ Rubocop::Config.new('TrailingWhitespace' => { 'Enabled' => true })
9
+ end
10
+
11
+ it 'accepts final newline' do
12
+ inspect_source(cop, ['x = 0', ''])
13
+ expect(cop.offences).to be_empty
14
+ end
15
+
16
+ it 'registers an offence for multiple trailing blank lines' do
17
+ inspect_source(cop, ['x = 0', '', '', '', ''])
18
+ expect(cop.offences.size).to eq(1)
19
+ expect(cop.messages).to eq(['3 trailing blank lines detected.'])
20
+ end
21
+
22
+ it 'auto-corrects unwanted blank lines' do
23
+ new_source = autocorrect_source(cop, ['x = 0', '', '', '', ''])
24
+ expect(new_source).to eq(['x = 0', ''].join("\n"))
25
+ end
26
+
27
+ it 'does not auto-correct if it interferes with TrailingWhitespace' do
28
+ original = ['x = 0', '', ' ', '', '']
29
+ new_source = autocorrect_source(cop, original)
30
+ expect(new_source).to eq(original.join("\n"))
31
+ end
32
+
33
+ context 'with TrailingWhitespace disabled' do
34
+ let(:config) do
35
+ Rubocop::Config.new('TrailingWhitespace' => { 'Enabled' => false })
36
+ end
37
+
38
+ it 'auto-corrects even if some lines have space' do
39
+ new_source = autocorrect_source(cop, ['x = 0', '', ' ', '', ''])
40
+ expect(new_source).to eq(['x = 0', ''].join("\n"))
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,230 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::TrailingComma, :config do
6
+ subject(:cop) { described_class.new(config) }
7
+ let(:cop_config) { { 'EnforcedStyleForMultiline' => 'no_comma' } }
8
+
9
+ context 'with single line list of values' do
10
+ it 'registers an offence for trailing comma in an Array literal' do
11
+ inspect_source(cop, 'VALUES = [1001, 2020, 3333, ]')
12
+ expect(cop.messages)
13
+ .to eq(['Avoid comma after the last item of an array.'])
14
+ expect(cop.highlights).to eq([','])
15
+ end
16
+
17
+ it 'registers an offence for trailing comma in a Hash literal' do
18
+ inspect_source(cop, 'MAP = { a: 1001, b: 2020, c: 3333, }')
19
+ expect(cop.messages)
20
+ .to eq(['Avoid comma after the last item of a hash.'])
21
+ expect(cop.highlights).to eq([','])
22
+ end
23
+
24
+ it 'registers an offence for trailing comma in a method call' do
25
+ inspect_source(cop, 'some_method(a, b, c, )')
26
+ expect(cop.messages)
27
+ .to eq(['Avoid comma after the last parameter of a method call.'])
28
+ expect(cop.highlights).to eq([','])
29
+ end
30
+
31
+ it 'registers an offence for trailing comma in a method call with hash' \
32
+ ' parameters at the end' do
33
+ inspect_source(cop, 'some_method(a, b, c: 0, d: 1, )')
34
+ expect(cop.messages)
35
+ .to eq(['Avoid comma after the last parameter of a method call.'])
36
+ expect(cop.highlights).to eq([','])
37
+ end
38
+
39
+ it 'accepts Array literal without trailing comma' do
40
+ inspect_source(cop, 'VALUES = [1001, 2020, 3333]')
41
+ expect(cop.offences).to be_empty
42
+ end
43
+
44
+ it 'accepts empty Array literal' do
45
+ inspect_source(cop, 'VALUES = []')
46
+ expect(cop.offences).to be_empty
47
+ end
48
+
49
+ it 'accepts rescue clause' do
50
+ # The list of rescued classes is an array.
51
+ inspect_source(cop, ['begin',
52
+ ' do_something',
53
+ 'rescue RuntimeError',
54
+ 'end'])
55
+ expect(cop.offences).to be_empty
56
+ end
57
+
58
+ it 'accepts Hash literal without trailing comma' do
59
+ inspect_source(cop, 'MAP = { a: 1001, b: 2020, c: 3333 }')
60
+ expect(cop.offences).to be_empty
61
+ end
62
+
63
+ it 'accepts empty Hash literal' do
64
+ inspect_source(cop, 'MAP = {}')
65
+ expect(cop.offences).to be_empty
66
+ end
67
+
68
+ it 'accepts method call without trailing comma' do
69
+ inspect_source(cop, 'some_method(a, b, c)')
70
+ expect(cop.offences).to be_empty
71
+ end
72
+
73
+ it 'accepts method call without parameters' do
74
+ inspect_source(cop, 'some_method')
75
+ expect(cop.offences).to be_empty
76
+ end
77
+ end
78
+
79
+ context 'with multi-line list of values' do
80
+ context 'when EnforcedStyleForMultiline is no_comma' do
81
+ it 'registers an offence for trailing comma in an Array literal' do
82
+ inspect_source(cop, ['VALUES = [',
83
+ ' 1001,',
84
+ ' 2020,',
85
+ ' 3333,',
86
+ ' ]'])
87
+ expect(cop.highlights).to eq([','])
88
+ end
89
+
90
+ it 'registers an offence for trailing comma in a Hash literal' do
91
+ inspect_source(cop, ['MAP = { a: 1001,',
92
+ ' b: 2020,',
93
+ ' c: 3333,',
94
+ ' }'])
95
+ expect(cop.highlights).to eq([','])
96
+ end
97
+
98
+ it 'registers an offence for trailing comma in a method call with ' \
99
+ 'hash parameters at the end' do
100
+ inspect_source(cop, ['some_method(',
101
+ ' a,',
102
+ ' b,',
103
+ ' c: 0,',
104
+ ' d: 1,)'])
105
+ expect(cop.highlights).to eq([','])
106
+ end
107
+
108
+ it 'accepts an Array literal with no trailing comma' do
109
+ inspect_source(cop, ['VALUES = [ 1001,',
110
+ ' 2020,',
111
+ ' 3333 ]'])
112
+ expect(cop.offences).to be_empty
113
+ end
114
+
115
+ it 'accepts a Hash literal with no trailing comma' do
116
+ inspect_source(cop, ['MAP = {',
117
+ ' a: 1001,',
118
+ ' b: 2020,',
119
+ ' c: 3333',
120
+ ' }'])
121
+ expect(cop.offences).to be_empty
122
+ end
123
+
124
+ it 'accepts a method call with ' \
125
+ 'hash parameters at the end and no trailing comma' do
126
+ inspect_source(cop, ['some_method(a,',
127
+ ' b,',
128
+ ' c: 0,',
129
+ ' d: 1',
130
+ ' )'])
131
+ expect(cop.offences).to be_empty
132
+ end
133
+
134
+ it 'accepts comma inside a heredoc' \
135
+ ' parameters at the end' do
136
+ inspect_source(cop, ['route(help: {',
137
+ " 'auth' => <<-HELP.chomp",
138
+ ',',
139
+ 'HELP',
140
+ '})'])
141
+ expect(cop.offences).to be_empty
142
+ end
143
+ end
144
+
145
+ context 'when EnforcedStyleForMultiline is comma' do
146
+ let(:cop_config) { { 'EnforcedStyleForMultiline' => 'comma' } }
147
+
148
+ it 'registers an offence for no trailing comma in an Array literal' do
149
+ inspect_source(cop, ['VALUES = [',
150
+ ' 1001,',
151
+ ' 2020,',
152
+ ' 3333]'])
153
+ expect(cop.messages)
154
+ .to eq(['Put a comma after the last item of a multiline array.'])
155
+ expect(cop.highlights).to eq(['3333'])
156
+ end
157
+
158
+ it 'registers an offence for no trailing comma in a Hash literal' do
159
+ inspect_source(cop, ['MAP = { a: 1001,',
160
+ ' b: 2020,',
161
+ ' c: 3333 }'])
162
+ expect(cop.messages)
163
+ .to eq(['Put a comma after the last item of a multiline hash.'])
164
+ expect(cop.highlights).to eq(['c: 3333'])
165
+ end
166
+
167
+ it 'registers an offence for no trailing comma in a method call with' \
168
+ ' hash parameters at the end' do
169
+ inspect_source(cop, ['some_method(',
170
+ ' a,',
171
+ ' b,',
172
+ ' c: 0,',
173
+ ' d: 1',
174
+ ' )'])
175
+ expect(cop.messages)
176
+ .to eq(['Put a comma after the last parameter of a multiline ' \
177
+ 'method call.'])
178
+ expect(cop.highlights).to eq(['d: 1'])
179
+ end
180
+
181
+ it 'accepts trailing comma in an Array literal' do
182
+ inspect_source(cop, ['VALUES = [1001,',
183
+ ' 2020,',
184
+ ' 3333,',
185
+ ' ]'])
186
+ expect(cop.offences).to be_empty
187
+ end
188
+
189
+ it 'accepts trailing comma in a Hash literal' do
190
+ inspect_source(cop, ['MAP = {',
191
+ ' a: 1001,',
192
+ ' b: 2020,',
193
+ ' c: 3333,',
194
+ ' }'])
195
+ expect(cop.offences).to be_empty
196
+ end
197
+
198
+ it 'accepts trailing comma in a method call with hash' \
199
+ ' parameters at the end' do
200
+ inspect_source(cop, ['some_method(',
201
+ ' a,',
202
+ ' b,',
203
+ ' c: 0,',
204
+ ' d: 1,',
205
+ ' )'])
206
+ expect(cop.offences).to be_empty
207
+ end
208
+
209
+ it 'accepts a multiline word array' do
210
+ inspect_source(cop, ['ingredients = %w(',
211
+ ' sausage',
212
+ ' anchovies',
213
+ ' olives',
214
+ ')'])
215
+ expect(cop.offences).to be_empty
216
+ end
217
+
218
+ it 'accepts missing comma after a heredoc' do
219
+ # A heredoc that's the last item in a literal or parameter list can not
220
+ # have a trailing comma. It's a syntax error.
221
+ inspect_source(cop, ['route(help: {',
222
+ " 'auth' => <<-HELP.chomp",
223
+ '...',
224
+ 'HELP',
225
+ '},)']) # We still need a comma after the hash.
226
+ expect(cop.offences).to be_empty
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::TrailingWhitespace do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'registers an offence for a line ending with space' do
9
+ source = ['x = 0 ']
10
+ inspect_source(cop, source)
11
+ expect(cop.offences.size).to eq(1)
12
+ end
13
+
14
+ it 'registers an offence for a line ending with tab' do
15
+ inspect_source(cop, ["x = 0\t"])
16
+ expect(cop.offences.size).to eq(1)
17
+ end
18
+
19
+ it 'accepts a line without trailing whitespace' do
20
+ inspect_source(cop, ["x = 0\n"])
21
+ expect(cop.offences).to be_empty
22
+ end
23
+
24
+ it 'auto-corrects unwanted space' do
25
+ new_source = autocorrect_source(cop, ['x = 0 ',
26
+ "x = 0\t"])
27
+ expect(new_source).to eq(['x = 0',
28
+ 'x = 0'].join("\n"))
29
+ end
30
+ end
@@ -0,0 +1,415 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Style::TrivialAccessors, :config do
6
+ subject(:cop) { described_class.new(config) }
7
+ let(:cop_config) { {} }
8
+
9
+ it 'finds trivial reader' do
10
+ inspect_source(cop,
11
+ ['def foo',
12
+ ' @foo',
13
+ 'end',
14
+ '',
15
+ 'def Foo',
16
+ ' @Foo',
17
+ 'end'])
18
+ expect(cop.offences.size).to eq(2)
19
+ expect(cop.offences
20
+ .map(&:line).sort).to eq([1, 5])
21
+ end
22
+
23
+ it 'finds trivial reader in a class' do
24
+ inspect_source(cop,
25
+ ['class TrivialFoo',
26
+ ' def foo',
27
+ ' @foo',
28
+ ' end',
29
+ ' def bar',
30
+ ' !foo',
31
+ ' end',
32
+ 'end'])
33
+ expect(cop.offences.size).to eq(1)
34
+ expect(cop.offences
35
+ .map(&:line).sort).to eq([2])
36
+ end
37
+
38
+ it 'finds trivial reader in a class method' do
39
+ inspect_source(cop,
40
+ ['class TrivialFoo',
41
+ ' def self.foo',
42
+ ' @foo',
43
+ ' end',
44
+ ' def bar',
45
+ ' !foo',
46
+ ' end',
47
+ 'end'])
48
+ expect(cop.offences.size).to eq(1)
49
+ expect(cop.offences
50
+ .map(&:line).sort).to eq([2])
51
+ end
52
+
53
+ it 'finds trivial reader in a nested class' do
54
+ inspect_source(cop,
55
+ ['class TrivialFoo',
56
+ ' class Nested',
57
+ ' def foo',
58
+ ' @foo',
59
+ ' end',
60
+ ' end',
61
+ 'end'])
62
+ expect(cop.offences.size).to eq(1)
63
+ expect(cop.offences
64
+ .map(&:line).sort).to eq([3])
65
+ end
66
+
67
+ it 'finds trivial readers in a little less trivial class' do
68
+ inspect_source(cop,
69
+ ['class TrivialFoo',
70
+ ' def foo',
71
+ ' @foo',
72
+ ' end',
73
+ ' def foo_and_bar',
74
+ ' @foo_bar = @foo + @bar',
75
+ ' end',
76
+ ' def foo_bar',
77
+ ' @foo_bar',
78
+ ' end',
79
+ ' def foo?',
80
+ ' foo.present?',
81
+ ' end',
82
+ ' def bar?',
83
+ ' !bar',
84
+ ' end',
85
+ ' def foobar',
86
+ ' foo? ? foo.value : "bar"',
87
+ ' end',
88
+ ' def bar',
89
+ ' foo.bar',
90
+ ' end',
91
+ ' def foo_required?',
92
+ ' super && !bar_required?',
93
+ ' end',
94
+ ' def self.from_omniauth(auth)',
95
+ ' foobars.each do |f|',
96
+ ' # do stuff',
97
+ ' end',
98
+ ' end',
99
+ ' def regex',
100
+ ' %r{\A#{visit node}\Z}',
101
+ ' end',
102
+ ' def array',
103
+ ' [foo, bar].join',
104
+ ' end',
105
+ ' def string',
106
+ ' "string"',
107
+ ' end',
108
+ ' def class',
109
+ ' Foo.class',
110
+ ' end',
111
+ ' def with_return',
112
+ ' return foo',
113
+ ' end',
114
+ ' def captures',
115
+ ' (length - 1).times.map { |i| self[i + 1] }',
116
+ ' end',
117
+ ' def foo val',
118
+ ' super',
119
+ ' @val',
120
+ ' end',
121
+ 'end'])
122
+ expect(cop.offences.size).to eq(2)
123
+ expect(cop.offences
124
+ .map(&:line).sort).to eq([2, 8])
125
+ end
126
+
127
+ it 'finds trivial reader with braces' do
128
+ inspect_source(cop,
129
+ ['class Test',
130
+ ' # trivial reader with braces',
131
+ ' def name()',
132
+ ' @name',
133
+ ' end',
134
+ 'end'])
135
+ expect(cop.offences.size).to eq(1)
136
+ expect(cop.offences
137
+ .map(&:line).sort).to eq([3])
138
+ end
139
+
140
+ it 'finds trivial writer without braces' do
141
+ inspect_source(cop,
142
+ ['class Test',
143
+ ' # trivial writer without braces',
144
+ ' def name= name',
145
+ ' @name = name',
146
+ ' end',
147
+ 'end'])
148
+ expect(cop.offences.size).to eq(1)
149
+ expect(cop.offences
150
+ .map(&:line).sort).to eq([3])
151
+ end
152
+
153
+ it 'does not find trivial writer with function calls' do
154
+ inspect_source(cop,
155
+ ['class TrivialTest',
156
+ ' def test=(val)',
157
+ ' @test = val',
158
+ ' some_function_call',
159
+ ' or_more_of_them',
160
+ ' end',
161
+ 'end'])
162
+ expect(cop.offences).to be_empty
163
+ end
164
+
165
+ it 'finds trivials with less peculiar methods' do
166
+ inspect_source(cop,
167
+ ['class NilStats',
168
+ 'def most_traded_pair',
169
+ 'end',
170
+ 'def win_ratio',
171
+ 'end',
172
+ 'def win_ratio_percentage()',
173
+ 'end',
174
+ 'def pips_won',
175
+ ' 0.0',
176
+ 'end',
177
+ 'def gain_at(date)',
178
+ ' 1',
179
+ 'end',
180
+ 'def gain_percentage',
181
+ ' 0',
182
+ 'end',
183
+ 'def gain_breakdown(options = {})',
184
+ ' []',
185
+ 'end',
186
+ 'def copy_to_all_ratio',
187
+ ' nil',
188
+ 'end',
189
+ 'def trade_population',
190
+ ' {}',
191
+ 'end',
192
+ 'def average_leverage',
193
+ ' 1',
194
+ 'end',
195
+ 'def with_yield',
196
+ ' yield',
197
+ 'rescue Error => e',
198
+ ' #do stuff',
199
+ 'end',
200
+ 'end'])
201
+ expect(cop.offences).to be_empty
202
+ end
203
+
204
+ it 'treats splats as non-trivial' do
205
+ inspect_source(cop,
206
+ [' def splatomatic(*values)',
207
+ ' @splatomatic = values',
208
+ ' end'])
209
+ expect(cop.offences).to be_empty
210
+ end
211
+
212
+ it 'finds oneliner trivials' do
213
+ inspect_source(cop,
214
+ ['class Oneliner',
215
+ ' def foo; @foo; end',
216
+ ' def foo= foo; @foo = foo; end',
217
+ 'end'])
218
+ expect(cop.offences.size).to eq(2)
219
+ expect(cop.offences
220
+ .map(&:line).sort).to eq([2, 3])
221
+ end
222
+
223
+ it 'does not find a trivial reader' do
224
+ inspect_source(cop,
225
+ ['def bar',
226
+ ' @bar + foo',
227
+ 'end'])
228
+ expect(cop.offences).to be_empty
229
+ end
230
+
231
+ it 'finds trivial writer' do
232
+ inspect_source(cop,
233
+ ['def foo=(val)',
234
+ ' @foo = val',
235
+ 'end'])
236
+ expect(cop.offences.size).to eq(1)
237
+ expect(cop.offences
238
+ .map(&:line).sort).to eq([1])
239
+ end
240
+
241
+ it 'finds trivial writer in a class' do
242
+ inspect_source(cop,
243
+ ['class TrivialFoo',
244
+ ' def foo=(val)',
245
+ ' @foo = val',
246
+ ' end',
247
+ ' def void(no_value)',
248
+ ' end',
249
+ ' def inspect(sexp)',
250
+ ' each(:def, sexp) do |item|',
251
+ ' #do stuff',
252
+ ' end',
253
+ ' end',
254
+ ' def if_method(foo)',
255
+ ' if true',
256
+ ' unless false',
257
+ ' #do stuff',
258
+ ' end',
259
+ ' end',
260
+ ' end',
261
+ 'end'])
262
+ expect(cop.offences.size).to eq(1)
263
+ expect(cop.offences
264
+ .map(&:line).sort).to eq([2])
265
+ end
266
+
267
+ it 'finds trivial accessors in a little less trivial class' do
268
+ inspect_source(cop,
269
+ ['class TrivialFoo',
270
+ ' def foo',
271
+ ' @foo',
272
+ ' end',
273
+ ' def foo_and_bar',
274
+ ' @foo_bar = @foo + @bar',
275
+ ' end',
276
+ ' def foo_bar',
277
+ ' @foo_bar',
278
+ ' end',
279
+ ' def bar=(bar_value)',
280
+ ' @bar = bar_value',
281
+ ' end',
282
+ 'end'])
283
+ expect(cop.offences.size).to eq(3)
284
+ expect(cop.offences
285
+ .map(&:line).sort).to eq([2, 8, 11])
286
+ end
287
+
288
+ it 'does not find a trivial writer' do
289
+ inspect_source(cop,
290
+ ['def bar=(value)',
291
+ ' @bar = value + 42',
292
+ 'end'])
293
+ expect(cop.offences).to be_empty
294
+ end
295
+
296
+ it 'finds trivial writers in a little less trivial class' do
297
+ inspect_source(cop,
298
+ ['class TrivialFoo',
299
+ ' def foo_bar=(foo, bar)',
300
+ ' @foo_bar = foo + bar',
301
+ ' end',
302
+ ' def universal=(answer=42)',
303
+ ' @universal = answer',
304
+ ' end',
305
+ ' def bar=(bar_value)',
306
+ ' @bar = bar_value',
307
+ ' end',
308
+ 'end'])
309
+ expect(cop.offences.size).to eq(2)
310
+ expect(cop.offences
311
+ .map(&:line).sort).to eq([5, 8])
312
+ end
313
+
314
+ it 'does not find trivial accessors with method calls' do
315
+ inspect_source(cop,
316
+ ['class TrivialFoo',
317
+ ' def foo_bar(foo)',
318
+ ' foo_bar = foo + 42',
319
+ ' end',
320
+ ' def foo(value)',
321
+ ' foo = []',
322
+ ' # do stuff',
323
+ ' foo',
324
+ ' end',
325
+ ' def bar',
326
+ ' foo_method',
327
+ ' end',
328
+ 'end'])
329
+ expect(cop.offences).to be_empty
330
+ end
331
+
332
+ it 'does not find trivial writer with exceptions' do
333
+ inspect_source(cop,
334
+ [' def expiration_formatted=(value)',
335
+ ' begin',
336
+ ' @expiration = foo_stuff',
337
+ ' rescue ArgumentError',
338
+ ' @expiration = nil',
339
+ ' end',
340
+ ' self[:expiration] = @expiration',
341
+ ' end'])
342
+ expect(cop.offences).to be_empty
343
+ end
344
+
345
+ it 'accepts an initialize method looking like a writer' do
346
+ inspect_source(cop,
347
+ [' def initialize(value)',
348
+ ' @top = value',
349
+ ' end'])
350
+ expect(cop.offences).to be_empty
351
+ end
352
+
353
+ context 'exact name match required' do
354
+ let(:cop_config) { { 'ExactNameMatch' => true } }
355
+
356
+ it 'finds only 1 trivial reader' do
357
+ inspect_source(cop,
358
+ ['def foo',
359
+ ' @foo',
360
+ 'end',
361
+ '',
362
+ 'def bar',
363
+ ' @barr',
364
+ 'end'])
365
+ expect(cop.offences.size).to eq(1)
366
+ expect(cop.offences
367
+ .map(&:line).sort).to eq([1])
368
+ end
369
+
370
+ it 'finds only 1 trivial writer' do
371
+ inspect_source(cop,
372
+ ['def foo=(foo)',
373
+ ' @foo = foo',
374
+ 'end',
375
+ '',
376
+ 'def bar=(bar)',
377
+ ' @barr = bar',
378
+ 'end'])
379
+ expect(cop.offences.size).to eq(1)
380
+ expect(cop.offences
381
+ .map(&:line).sort).to eq([1])
382
+ end
383
+ end
384
+
385
+ context 'with predicates allowed' do
386
+ let(:cop_config) { { 'AllowPredicates' => true } }
387
+
388
+ it 'ignores accessors ending with a question mark' do
389
+ inspect_source(cop,
390
+ [' def foo?',
391
+ ' @foo',
392
+ ' end'])
393
+ expect(cop.offences).to be_empty
394
+ end
395
+ end
396
+
397
+ context 'with whitelist defined' do
398
+ let(:cop_config) { { 'Whitelist' => ['to_foo', 'bar='] } }
399
+
400
+ it 'ignores accessors in the whitelist' do
401
+ inspect_source(cop,
402
+ [' def to_foo',
403
+ ' @foo',
404
+ ' end'])
405
+ expect(cop.offences).to be_empty
406
+ end
407
+ it 'ignores writers in the whitelist' do
408
+ inspect_source(cop,
409
+ [' def bar=(bar)',
410
+ ' @bar = bar',
411
+ ' end'])
412
+ expect(cop.offences).to be_empty
413
+ end
414
+ end
415
+ end