sabat-rubocop 0.9.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 (239) hide show
  1. data/.gitignore +50 -0
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +7 -0
  4. data/.travis.yml +7 -0
  5. data/.yardopts +2 -0
  6. data/CHANGELOG.md +268 -0
  7. data/CONTRIBUTING.md +16 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE.txt +20 -0
  10. data/README.md +324 -0
  11. data/Rakefile +29 -0
  12. data/bin/rubocop +22 -0
  13. data/config/default.yml +58 -0
  14. data/config/disabled.yml +5 -0
  15. data/config/enabled.yml +403 -0
  16. data/lib/rubocop.rb +116 -0
  17. data/lib/rubocop/cli.rb +407 -0
  18. data/lib/rubocop/config.rb +250 -0
  19. data/lib/rubocop/config_store.rb +39 -0
  20. data/lib/rubocop/cop/cop.rb +138 -0
  21. data/lib/rubocop/cop/lint/assignment_in_condition.rb +54 -0
  22. data/lib/rubocop/cop/lint/end_alignment.rb +189 -0
  23. data/lib/rubocop/cop/lint/end_in_method.rb +30 -0
  24. data/lib/rubocop/cop/lint/ensure_return.rb +22 -0
  25. data/lib/rubocop/cop/lint/eval.rb +22 -0
  26. data/lib/rubocop/cop/lint/handle_exceptions.rb +20 -0
  27. data/lib/rubocop/cop/lint/literal_in_condition.rb +81 -0
  28. data/lib/rubocop/cop/lint/loop.rb +29 -0
  29. data/lib/rubocop/cop/lint/rescue_exception.rb +29 -0
  30. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +34 -0
  31. data/lib/rubocop/cop/lint/unreachable_code.rb +35 -0
  32. data/lib/rubocop/cop/lint/unused_local_variable.rb +32 -0
  33. data/lib/rubocop/cop/lint/void.rb +58 -0
  34. data/lib/rubocop/cop/offence.rb +136 -0
  35. data/lib/rubocop/cop/rails/validation.rb +30 -0
  36. data/lib/rubocop/cop/style/access_control.rb +58 -0
  37. data/lib/rubocop/cop/style/alias.rb +28 -0
  38. data/lib/rubocop/cop/style/align_parameters.rb +39 -0
  39. data/lib/rubocop/cop/style/and_or.rb +45 -0
  40. data/lib/rubocop/cop/style/ascii_comments.rb +21 -0
  41. data/lib/rubocop/cop/style/ascii_identifiers.rb +22 -0
  42. data/lib/rubocop/cop/style/attr.rb +20 -0
  43. data/lib/rubocop/cop/style/avoid_class_vars.rb +20 -0
  44. data/lib/rubocop/cop/style/avoid_for.rb +18 -0
  45. data/lib/rubocop/cop/style/avoid_global_vars.rb +65 -0
  46. data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +21 -0
  47. data/lib/rubocop/cop/style/avoid_perlisms.rb +50 -0
  48. data/lib/rubocop/cop/style/begin_block.rb +18 -0
  49. data/lib/rubocop/cop/style/block_comments.rb +20 -0
  50. data/lib/rubocop/cop/style/block_nesting.rb +47 -0
  51. data/lib/rubocop/cop/style/blocks.rb +27 -0
  52. data/lib/rubocop/cop/style/case_equality.rb +22 -0
  53. data/lib/rubocop/cop/style/case_indentation.rb +28 -0
  54. data/lib/rubocop/cop/style/character_literal.rb +37 -0
  55. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +33 -0
  56. data/lib/rubocop/cop/style/class_methods.rb +22 -0
  57. data/lib/rubocop/cop/style/collection_methods.rb +56 -0
  58. data/lib/rubocop/cop/style/colon_method_call.rb +29 -0
  59. data/lib/rubocop/cop/style/constant_name.rb +31 -0
  60. data/lib/rubocop/cop/style/def_parentheses.rb +70 -0
  61. data/lib/rubocop/cop/style/documentation.rb +58 -0
  62. data/lib/rubocop/cop/style/dot_position.rb +25 -0
  63. data/lib/rubocop/cop/style/empty_line_between_defs.rb +26 -0
  64. data/lib/rubocop/cop/style/empty_lines.rb +40 -0
  65. data/lib/rubocop/cop/style/empty_literal.rb +53 -0
  66. data/lib/rubocop/cop/style/encoding.rb +29 -0
  67. data/lib/rubocop/cop/style/end_block.rb +18 -0
  68. data/lib/rubocop/cop/style/end_of_line.rb +23 -0
  69. data/lib/rubocop/cop/style/favor_join.rb +29 -0
  70. data/lib/rubocop/cop/style/favor_modifier.rb +118 -0
  71. data/lib/rubocop/cop/style/favor_sprintf.rb +28 -0
  72. data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +54 -0
  73. data/lib/rubocop/cop/style/hash_syntax.rb +47 -0
  74. data/lib/rubocop/cop/style/if_then_else.rb +29 -0
  75. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -0
  76. data/lib/rubocop/cop/style/lambda.rb +47 -0
  77. data/lib/rubocop/cop/style/leading_comment_space.rb +25 -0
  78. data/lib/rubocop/cop/style/line_continuation.rb +26 -0
  79. data/lib/rubocop/cop/style/line_length.rb +30 -0
  80. data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +61 -0
  81. data/lib/rubocop/cop/style/method_call_parentheses.rb +22 -0
  82. data/lib/rubocop/cop/style/method_length.rb +57 -0
  83. data/lib/rubocop/cop/style/multiline_if_then.rb +47 -0
  84. data/lib/rubocop/cop/style/not.rb +24 -0
  85. data/lib/rubocop/cop/style/numeric_literals.rb +25 -0
  86. data/lib/rubocop/cop/style/one_line_conditional.rb +20 -0
  87. data/lib/rubocop/cop/style/op_method.rb +29 -0
  88. data/lib/rubocop/cop/style/parameter_lists.rb +42 -0
  89. data/lib/rubocop/cop/style/parentheses_around_condition.rb +42 -0
  90. data/lib/rubocop/cop/style/proc.rb +30 -0
  91. data/lib/rubocop/cop/style/reduce_arguments.rb +34 -0
  92. data/lib/rubocop/cop/style/regexp_literal.rb +39 -0
  93. data/lib/rubocop/cop/style/rescue_modifier.rb +55 -0
  94. data/lib/rubocop/cop/style/semicolon.rb +51 -0
  95. data/lib/rubocop/cop/style/single_line_methods.rb +48 -0
  96. data/lib/rubocop/cop/style/space_after_comma_etc.rb +69 -0
  97. data/lib/rubocop/cop/style/space_after_control_keyword.rb +32 -0
  98. data/lib/rubocop/cop/style/string_literals.rb +36 -0
  99. data/lib/rubocop/cop/style/surrounding_space.rb +314 -0
  100. data/lib/rubocop/cop/style/symbol_array.rb +31 -0
  101. data/lib/rubocop/cop/style/symbol_name.rb +27 -0
  102. data/lib/rubocop/cop/style/tab.rb +25 -0
  103. data/lib/rubocop/cop/style/ternary_operator.rb +49 -0
  104. data/lib/rubocop/cop/style/trailing_whitespace.rb +24 -0
  105. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -0
  106. data/lib/rubocop/cop/style/unless_else.rb +26 -0
  107. data/lib/rubocop/cop/style/variable_interpolation.rb +32 -0
  108. data/lib/rubocop/cop/style/when_then.rb +25 -0
  109. data/lib/rubocop/cop/style/while_until_do.rb +45 -0
  110. data/lib/rubocop/cop/style/word_array.rb +44 -0
  111. data/lib/rubocop/cop/util.rb +27 -0
  112. data/lib/rubocop/cop/variable_inspector.rb +280 -0
  113. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  114. data/lib/rubocop/formatter/clang_style_formatter.rb +21 -0
  115. data/lib/rubocop/formatter/emacs_style_formatter.rb +17 -0
  116. data/lib/rubocop/formatter/formatter_set.rb +77 -0
  117. data/lib/rubocop/formatter/json_formatter.rb +76 -0
  118. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  119. data/lib/rubocop/formatter/simple_text_formatter.rb +62 -0
  120. data/lib/rubocop/version.rb +21 -0
  121. data/rubocop.gemspec +36 -0
  122. data/spec/.rubocop.yml +5 -0
  123. data/spec/project_spec.rb +24 -0
  124. data/spec/rubocop/cli_spec.rb +906 -0
  125. data/spec/rubocop/config_spec.rb +470 -0
  126. data/spec/rubocop/config_store_spec.rb +66 -0
  127. data/spec/rubocop/cops/cop_spec.rb +38 -0
  128. data/spec/rubocop/cops/lint/assignment_in_condition_spec.rb +111 -0
  129. data/spec/rubocop/cops/lint/end_alignment_spec.rb +333 -0
  130. data/spec/rubocop/cops/lint/end_in_method_spec.rb +35 -0
  131. data/spec/rubocop/cops/lint/ensure_return_spec.rb +37 -0
  132. data/spec/rubocop/cops/lint/eval_spec.rb +41 -0
  133. data/spec/rubocop/cops/lint/handle_exceptions_spec.rb +36 -0
  134. data/spec/rubocop/cops/lint/literal_in_condition_spec.rb +42 -0
  135. data/spec/rubocop/cops/lint/loop_spec.rb +33 -0
  136. data/spec/rubocop/cops/lint/rescue_exception_spec.rb +127 -0
  137. data/spec/rubocop/cops/lint/shadowing_outer_local_variable_spec.rb +243 -0
  138. data/spec/rubocop/cops/lint/unreachable_code_spec.rb +69 -0
  139. data/spec/rubocop/cops/lint/unused_local_variable_spec.rb +497 -0
  140. data/spec/rubocop/cops/lint/void_spec.rb +63 -0
  141. data/spec/rubocop/cops/offence_spec.rb +133 -0
  142. data/spec/rubocop/cops/rails/validation_spec.rb +27 -0
  143. data/spec/rubocop/cops/style/access_control_spec.rb +142 -0
  144. data/spec/rubocop/cops/style/alias_spec.rb +47 -0
  145. data/spec/rubocop/cops/style/align_parameters_spec.rb +199 -0
  146. data/spec/rubocop/cops/style/and_or_spec.rb +39 -0
  147. data/spec/rubocop/cops/style/ascii_comments_spec.rb +28 -0
  148. data/spec/rubocop/cops/style/ascii_identifiers_spec.rb +28 -0
  149. data/spec/rubocop/cops/style/attr_spec.rb +20 -0
  150. data/spec/rubocop/cops/style/avoid_class_vars_spec.rb +27 -0
  151. data/spec/rubocop/cops/style/avoid_for_spec.rb +37 -0
  152. data/spec/rubocop/cops/style/avoid_global_vars_spec.rb +34 -0
  153. data/spec/rubocop/cops/style/avoid_perl_backrefs_spec.rb +20 -0
  154. data/spec/rubocop/cops/style/avoid_perlisms_spec.rb +47 -0
  155. data/spec/rubocop/cops/style/begin_block_spec.rb +19 -0
  156. data/spec/rubocop/cops/style/block_comments_spec.rb +27 -0
  157. data/spec/rubocop/cops/style/block_nesting_spec.rb +159 -0
  158. data/spec/rubocop/cops/style/blocks_spec.rb +35 -0
  159. data/spec/rubocop/cops/style/case_equality_spec.rb +18 -0
  160. data/spec/rubocop/cops/style/case_indentation_spec.rb +88 -0
  161. data/spec/rubocop/cops/style/character_literal_spec.rb +28 -0
  162. data/spec/rubocop/cops/style/class_and_module_camel_case_spec.rb +46 -0
  163. data/spec/rubocop/cops/style/class_methods_spec.rb +51 -0
  164. data/spec/rubocop/cops/style/collection_methods_spec.rb +41 -0
  165. data/spec/rubocop/cops/style/colon_method_call_spec.rb +55 -0
  166. data/spec/rubocop/cops/style/constant_name_spec.rb +56 -0
  167. data/spec/rubocop/cops/style/def_with_parentheses_spec.rb +40 -0
  168. data/spec/rubocop/cops/style/def_without_parentheses_spec.rb +34 -0
  169. data/spec/rubocop/cops/style/documentation_spec.rb +79 -0
  170. data/spec/rubocop/cops/style/dot_position_spec.rb +30 -0
  171. data/spec/rubocop/cops/style/empty_line_between_defs_spec.rb +85 -0
  172. data/spec/rubocop/cops/style/empty_lines_spec.rb +40 -0
  173. data/spec/rubocop/cops/style/empty_literal_spec.rb +91 -0
  174. data/spec/rubocop/cops/style/encoding_spec.rb +49 -0
  175. data/spec/rubocop/cops/style/end_block_spec.rb +19 -0
  176. data/spec/rubocop/cops/style/end_of_line_spec.rb +25 -0
  177. data/spec/rubocop/cops/style/favor_join_spec.rb +37 -0
  178. data/spec/rubocop/cops/style/favor_modifier_spec.rb +160 -0
  179. data/spec/rubocop/cops/style/favor_sprintf_spec.rb +53 -0
  180. data/spec/rubocop/cops/style/favor_unless_over_negated_if_spec.rb +64 -0
  181. data/spec/rubocop/cops/style/favor_until_over_negated_while_spec.rb +47 -0
  182. data/spec/rubocop/cops/style/hash_syntax_spec.rb +51 -0
  183. data/spec/rubocop/cops/style/if_with_semicolon_spec.rb +25 -0
  184. data/spec/rubocop/cops/style/lambda_spec.rb +45 -0
  185. data/spec/rubocop/cops/style/leading_comment_space_spec.rb +65 -0
  186. data/spec/rubocop/cops/style/line_continuation_spec.rb +26 -0
  187. data/spec/rubocop/cops/style/line_length_spec.rb +25 -0
  188. data/spec/rubocop/cops/style/method_and_variable_snake_case_spec.rb +95 -0
  189. data/spec/rubocop/cops/style/method_call_parentheses_spec.rb +25 -0
  190. data/spec/rubocop/cops/style/method_length_spec.rb +151 -0
  191. data/spec/rubocop/cops/style/multiline_if_then_spec.rb +97 -0
  192. data/spec/rubocop/cops/style/not_spec.rb +28 -0
  193. data/spec/rubocop/cops/style/numeric_literals_spec.rb +51 -0
  194. data/spec/rubocop/cops/style/one_line_conditional_spec.rb +18 -0
  195. data/spec/rubocop/cops/style/op_method_spec.rb +80 -0
  196. data/spec/rubocop/cops/style/parameter_lists_spec.rb +49 -0
  197. data/spec/rubocop/cops/style/parentheses_around_condition_spec.rb +59 -0
  198. data/spec/rubocop/cops/style/proc_spec.rb +28 -0
  199. data/spec/rubocop/cops/style/reduce_arguments_spec.rb +59 -0
  200. data/spec/rubocop/cops/style/regexp_literal_spec.rb +83 -0
  201. data/spec/rubocop/cops/style/rescue_modifier_spec.rb +122 -0
  202. data/spec/rubocop/cops/style/semicolon_spec.rb +95 -0
  203. data/spec/rubocop/cops/style/single_line_methods_spec.rb +54 -0
  204. data/spec/rubocop/cops/style/space_after_colon_spec.rb +29 -0
  205. data/spec/rubocop/cops/style/space_after_comma_spec.rb +31 -0
  206. data/spec/rubocop/cops/style/space_after_control_keyword_spec.rb +69 -0
  207. data/spec/rubocop/cops/style/space_after_semicolon_spec.rb +24 -0
  208. data/spec/rubocop/cops/style/space_around_braces_spec.rb +49 -0
  209. data/spec/rubocop/cops/style/space_around_equals_in_default_parameter_spec.rb +34 -0
  210. data/spec/rubocop/cops/style/space_around_operators_spec.rb +216 -0
  211. data/spec/rubocop/cops/style/space_inside_brackets_spec.rb +51 -0
  212. data/spec/rubocop/cops/style/space_inside_hash_literal_braces_spec.rb +99 -0
  213. data/spec/rubocop/cops/style/space_inside_parens_spec.rb +33 -0
  214. data/spec/rubocop/cops/style/string_literals_spec.rb +62 -0
  215. data/spec/rubocop/cops/style/symbol_array_spec.rb +45 -0
  216. data/spec/rubocop/cops/style/symbol_name_spec.rb +122 -0
  217. data/spec/rubocop/cops/style/tab_spec.rb +23 -0
  218. data/spec/rubocop/cops/style/ternary_operator_spec.rb +42 -0
  219. data/spec/rubocop/cops/style/trailing_whitespace_spec.rb +29 -0
  220. data/spec/rubocop/cops/style/trivial_accessors_spec.rb +338 -0
  221. data/spec/rubocop/cops/style/unless_else_spec.rb +31 -0
  222. data/spec/rubocop/cops/style/variable_interpolation_spec.rb +53 -0
  223. data/spec/rubocop/cops/style/when_then_spec.rb +40 -0
  224. data/spec/rubocop/cops/style/while_until_do_spec.rb +47 -0
  225. data/spec/rubocop/cops/style/word_array_spec.rb +61 -0
  226. data/spec/rubocop/cops/variable_inspector_spec.rb +374 -0
  227. data/spec/rubocop/formatter/base_formatter_spec.rb +190 -0
  228. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +70 -0
  229. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +32 -0
  230. data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
  231. data/spec/rubocop/formatter/json_formatter_spec.rb +142 -0
  232. data/spec/rubocop/formatter/progress_formatter_spec.rb +196 -0
  233. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +74 -0
  234. data/spec/spec_helper.rb +92 -0
  235. data/spec/support/file_helper.rb +21 -0
  236. data/spec/support/isolated_environment.rb +27 -0
  237. data/spec/support/mri_syntax_checker.rb +69 -0
  238. data/spec/support/shared_examples.rb +33 -0
  239. metadata +517 -0
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ describe ConfigStore do
7
+ before(:each) { ConfigStore.prepare }
8
+ before do
9
+ Config.stub(:configuration_file_for) do |arg|
10
+ # File tree:
11
+ # file1
12
+ # dir/.rubocop.yml
13
+ # dir/file2
14
+ # dir/subdir/file3
15
+ (arg =~ /dir/ ? 'dir' : '.') + '/.rubocop.yml'
16
+ end
17
+ Config.stub(:configuration_from_file) { |arg| arg }
18
+ Config.stub(:load_file) { |arg| "#{arg} loaded" }
19
+ Config.stub(:merge_with_default) { |config, file| "merged #{config}" }
20
+ end
21
+
22
+ describe '.prepare' do
23
+ it 'resets @options_config' do
24
+ ConfigStore.set_options_config(:options_config)
25
+ ConfigStore.prepare
26
+ Config.should_receive(:configuration_file_for)
27
+ ConfigStore.for('file1')
28
+ end
29
+
30
+ it 'resets @config_cache' do
31
+ ConfigStore.for('file1')
32
+ ConfigStore.prepare
33
+ Config.should_receive(:configuration_file_for)
34
+ ConfigStore.for('file1')
35
+ end
36
+ end
37
+
38
+ describe '.for' do
39
+ it 'always uses config specified in command line' do
40
+ ConfigStore.set_options_config(:options_config)
41
+ expect(ConfigStore.for('file1')).to eq('merged options_config loaded')
42
+ end
43
+
44
+ context 'when no config specified in command line' do
45
+ it 'gets config path and config from cache if available' do
46
+ Config.should_receive(:configuration_file_for).once.with('dir')
47
+ Config.should_receive(:configuration_file_for).once.with('dir/' +
48
+ 'subdir')
49
+ # The stub returns the same config path for dir and dir/subdir.
50
+ Config.should_receive(:configuration_from_file).once
51
+ .with('dir/.rubocop.yml')
52
+
53
+ ConfigStore.for('dir/file2')
54
+ ConfigStore.for('dir/file2')
55
+ ConfigStore.for('dir/subdir/file3')
56
+ end
57
+
58
+ it 'searches for config path if not available in cache' do
59
+ Config.should_receive(:configuration_file_for).once
60
+ Config.should_receive(:configuration_from_file).once
61
+ ConfigStore.for('file1')
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ describe Cop do
8
+ let(:cop) { Cop.new }
9
+ let(:location) do
10
+ source_buffer = Parser::Source::Buffer.new('test', 1)
11
+ source_buffer.source = "a\n"
12
+ Parser::Source::Range.new(source_buffer, 0, 1)
13
+ end
14
+
15
+ it 'initially has 0 offences' do
16
+ expect(cop.offences).to be_empty
17
+ end
18
+
19
+ it 'keeps track of offences' do
20
+ cop.add_offence(:convention, location, 'message')
21
+
22
+ expect(cop.offences.size).to eq(1)
23
+ end
24
+
25
+ it 'will report registered offences' do
26
+ cop.add_offence(:convention, location, 'message')
27
+
28
+ expect(cop.offences).not_to be_empty
29
+ end
30
+
31
+ it 'registers offence with its name' do
32
+ cop = Style::AvoidFor.new
33
+ cop.add_offence(:convention, location, 'message')
34
+ expect(cop.offences.first.cop_name).to eq('AvoidFor')
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,111 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Rubocop
6
+ module Cop
7
+ module Lint
8
+ describe AssignmentInCondition do
9
+ let(:cop) { AssignmentInCondition.new }
10
+ before do
11
+ AssignmentInCondition.config = { 'AllowSafeAssignment' => true }
12
+ end
13
+
14
+ it 'registers an offence for lvar assignment in condition' do
15
+ inspect_source(cop,
16
+ ['if test = 10',
17
+ 'end'
18
+ ])
19
+ expect(cop.offences.size).to eq(1)
20
+ end
21
+
22
+ it 'registers an offence for lvar assignment in while condition' do
23
+ inspect_source(cop,
24
+ ['while test = 10',
25
+ 'end'
26
+ ])
27
+ expect(cop.offences.size).to eq(1)
28
+ end
29
+
30
+ it 'registers an offence for lvar assignment in until condition' do
31
+ inspect_source(cop,
32
+ ['until test = 10',
33
+ 'end'
34
+ ])
35
+ expect(cop.offences.size).to eq(1)
36
+ end
37
+
38
+ it 'registers an offence for ivar assignment in condition' do
39
+ inspect_source(cop,
40
+ ['if @test = 10',
41
+ 'end'
42
+ ])
43
+ expect(cop.offences.size).to eq(1)
44
+ end
45
+
46
+ it 'registers an offence for clvar assignment in condition' do
47
+ inspect_source(cop,
48
+ ['if @@test = 10',
49
+ 'end'
50
+ ])
51
+ expect(cop.offences.size).to eq(1)
52
+ end
53
+
54
+ it 'registers an offence for gvar assignment in condition' do
55
+ inspect_source(cop,
56
+ ['if $test = 10',
57
+ 'end'
58
+ ])
59
+ expect(cop.offences.size).to eq(1)
60
+ end
61
+
62
+ it 'registers an offence for constant assignment in condition' do
63
+ inspect_source(cop,
64
+ ['if TEST = 10',
65
+ 'end'
66
+ ])
67
+ expect(cop.offences.size).to eq(1)
68
+ end
69
+
70
+ it 'accepts == in condition' do
71
+ inspect_source(cop,
72
+ ['if test == 10',
73
+ 'end'
74
+ ])
75
+ expect(cop.offences).to be_empty
76
+ end
77
+
78
+ it 'accepts ||= in condition' do
79
+ inspect_source(cop,
80
+ ['raise StandardError unless foo ||= bar'])
81
+ expect(cop.offences).to be_empty
82
+ end
83
+
84
+ context 'safe assignment is allowed' do
85
+ it 'accepts = in condition surrounded with braces' do
86
+ inspect_source(cop,
87
+ ['if (test = 10)',
88
+ 'end'
89
+ ])
90
+ expect(cop.offences).to be_empty
91
+ end
92
+
93
+ end
94
+
95
+ context 'safe assignment is not allowed' do
96
+ before do
97
+ AssignmentInCondition.config['AllowSafeAssignment'] = false
98
+ end
99
+
100
+ it 'does not accepts = in condition surrounded with braces' do
101
+ inspect_source(cop,
102
+ ['if (test == 10)',
103
+ 'end'
104
+ ])
105
+ expect(cop.offences).to be_empty
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,333 @@
1
+ # encoding: utf-8
2
+ # rubocop:disable LineLength
3
+
4
+ require 'spec_helper'
5
+
6
+ module Rubocop
7
+ module Cop
8
+ module Lint
9
+ describe EndAlignment do
10
+ let(:cop) { EndAlignment.new }
11
+
12
+ it 'registers an offence for mismatched class end' do
13
+ inspect_source(cop,
14
+ ['class Test',
15
+ ' end'
16
+ ])
17
+ expect(cop.offences.size).to eq(1)
18
+ end
19
+
20
+ it 'registers an offence for mismatched module end' do
21
+ inspect_source(cop,
22
+ ['module Test',
23
+ ' end'
24
+ ])
25
+ expect(cop.offences.size).to eq(1)
26
+ end
27
+
28
+ it 'registers an offence for mismatched def end' do
29
+ inspect_source(cop,
30
+ ['def test',
31
+ ' end'
32
+ ])
33
+ expect(cop.offences.size).to eq(1)
34
+ end
35
+
36
+ it 'registers an offence for mismatched defs end' do
37
+ inspect_source(cop,
38
+ ['def Test.test',
39
+ ' end'
40
+ ])
41
+ expect(cop.offences.size).to eq(1)
42
+ end
43
+
44
+ it 'registers an offence for mismatched if end' do
45
+ inspect_source(cop,
46
+ ['if test',
47
+ ' end'
48
+ ])
49
+ expect(cop.offences.size).to eq(1)
50
+ end
51
+
52
+ it 'registers an offence for mismatched while end' do
53
+ inspect_source(cop,
54
+ ['while test',
55
+ ' end'
56
+ ])
57
+ expect(cop.offences.size).to eq(1)
58
+ end
59
+
60
+ it 'registers an offence for mismatched until end' do
61
+ inspect_source(cop,
62
+ ['until test',
63
+ ' end'
64
+ ])
65
+ expect(cop.offences.size).to eq(1)
66
+ end
67
+
68
+ it 'registers an offence for mismatched block end' do
69
+ inspect_source(cop,
70
+ ['test do |ala|',
71
+ ' end'
72
+ ])
73
+ expect(cop.offences.size).to eq(1)
74
+ end
75
+
76
+ context 'when the block is a logical operand' do
77
+ it 'accepts a correctly aligned block end' do
78
+ inspect_source(cop,
79
+ ['(value.is_a? Array) && value.all? do |subvalue|',
80
+ ' type_check_value(subvalue, array_type)',
81
+ 'end',
82
+ 'a || b do',
83
+ 'end',
84
+ ])
85
+ expect(cop.offences).to be_empty
86
+ end
87
+ end
88
+
89
+ it 'accepts end aligned with a variable' do
90
+ inspect_source(cop,
91
+ ['variable = test do |ala|',
92
+ 'end'
93
+ ])
94
+ expect(cop.offences).to be_empty
95
+ end
96
+
97
+ context 'and the block is an operand' do
98
+ it 'accepts end aligned with a variable' do
99
+ inspect_source(cop,
100
+ ['b = 1 + preceding_line.reduce(0) do |a, e|',
101
+ ' a + e.length + newline_length',
102
+ 'end + 1'
103
+ ])
104
+ expect(cop.offences).to be_empty
105
+ end
106
+ end
107
+
108
+ it 'registers an offence for mismatched block end with a variable' do
109
+ inspect_source(cop,
110
+ ['variable = test do |ala|',
111
+ ' end'
112
+ ])
113
+ expect(cop.offences.size).to eq(1)
114
+ end
115
+
116
+ context 'when the block is defined on the next line' do
117
+ it 'accepts end aligned with the block expression' do
118
+ inspect_source(cop,
119
+ ['variable =',
120
+ ' a_long_method_that_dont_fit_on_the_line do |v|',
121
+ ' v.foo',
122
+ ' end'
123
+ ])
124
+ expect(cop.offences).to be_empty
125
+ end
126
+
127
+ it 'registers an offences for mismatched end alignment' do
128
+ inspect_source(cop,
129
+ ['variable =',
130
+ ' a_long_method_that_dont_fit_on_the_line do |v|',
131
+ ' v.foo',
132
+ 'end'
133
+ ])
134
+ expect(cop.offences.size).to eq(1)
135
+ end
136
+ end
137
+
138
+ it 'accepts end aligned with an instance variable' do
139
+ inspect_source(cop,
140
+ ['@variable = test do |ala|',
141
+ 'end'
142
+ ])
143
+ expect(cop.offences).to be_empty
144
+ end
145
+
146
+ it 'registers an offence for mismatched block end with an instance variable' do
147
+ inspect_source(cop,
148
+ ['@variable = test do |ala|',
149
+ ' end'
150
+ ])
151
+ expect(cop.offences.size).to eq(1)
152
+ end
153
+
154
+ it 'accepts end aligned with a class variable' do
155
+ inspect_source(cop,
156
+ ['@@variable = test do |ala|',
157
+ 'end'
158
+ ])
159
+ expect(cop.offences).to be_empty
160
+ end
161
+
162
+ it 'registers an offence for mismatched block end with a class variable' do
163
+ inspect_source(cop,
164
+ ['@@variable = test do |ala|',
165
+ ' end'
166
+ ])
167
+ expect(cop.offences.size).to eq(1)
168
+ end
169
+
170
+ it 'accepts end aligned with a global variable' do
171
+ inspect_source(cop,
172
+ ['$variable = test do |ala|',
173
+ 'end'
174
+ ])
175
+ expect(cop.offences).to be_empty
176
+ end
177
+
178
+ it 'registers an offence for mismatched block end with a global variable' do
179
+ inspect_source(cop,
180
+ ['$variable = test do |ala|',
181
+ ' end'
182
+ ])
183
+ expect(cop.offences.size).to eq(1)
184
+ end
185
+
186
+ it 'accepts end aligned with a constant' do
187
+ inspect_source(cop,
188
+ ['CONSTANT = test do |ala|',
189
+ 'end'
190
+ ])
191
+ expect(cop.offences).to be_empty
192
+ end
193
+
194
+ it 'registers an offence for mismatched block end with a constant' do
195
+ inspect_source(cop,
196
+ ['Module::CONSTANT = test do |ala|',
197
+ ' end'
198
+ ])
199
+ expect(cop.offences.size).to eq(1)
200
+ end
201
+
202
+ it 'accepts end aligned with a method call' do
203
+ inspect_source(cop,
204
+ ['parser.childs << lambda do |token|',
205
+ ' token << 1',
206
+ 'end'
207
+ ])
208
+ expect(cop.offences).to be_empty
209
+ end
210
+
211
+ it 'registers an offence for mismatched block end with a method call' do
212
+ inspect_source(cop,
213
+ ['parser.childs << lambda do |token|',
214
+ ' token << 1',
215
+ ' end'
216
+ ])
217
+ expect(cop.offences.size).to eq(1)
218
+ end
219
+
220
+ it 'accepts end aligned with a method call with arguments' do
221
+ inspect_source(cop,
222
+ ['@h[:f] = f.each_pair.map do |f, v|',
223
+ ' v = 1',
224
+ 'end'
225
+ ])
226
+ expect(cop.offences).to be_empty
227
+ end
228
+
229
+ it 'registers an offence for mismatched end with a method call with arguments' do
230
+ inspect_source(cop,
231
+ ['@h[:f] = f.each_pair.map do |f, v|',
232
+ ' v = 1',
233
+ ' end'
234
+ ])
235
+ expect(cop.offences.size).to eq(1)
236
+ end
237
+
238
+ it 'does not raise an error for nested block in a method call' do
239
+ inspect_source(cop,
240
+ ['expect(arr.all? { |o| o.valid? })'
241
+ ])
242
+ expect(cop.offences).to be_empty
243
+ end
244
+
245
+ it 'accepts end aligned with the outermost method in the method chain that calls the block' do
246
+ inspect_source(cop,
247
+ ['expect(arr.all? do |o|',
248
+ ' o.valid?',
249
+ 'end)'
250
+ ])
251
+ expect(cop.offences).to be_empty
252
+ end
253
+
254
+ it 'registers an offence for mismatched end aligned with the outermost method in the method chain that calls the block' do
255
+ inspect_source(cop,
256
+ ['expect(arr.all? do |o|',
257
+ ' o.valid?',
258
+ ' end)'
259
+ ])
260
+ expect(cop.offences.size).to eq(1)
261
+ end
262
+
263
+ it 'accepts end aligned with an op-asgn (+=, -=)' do
264
+ inspect_source(cop,
265
+ ['rb += files.select do |file|',
266
+ ' file << something',
267
+ 'end'
268
+ ])
269
+ expect(cop.offences).to be_empty
270
+ end
271
+
272
+ it 'registers an offence for mismatched block end with an op-asgn (+=, -=)' do
273
+ inspect_source(cop,
274
+ ['rb += files.select do |file|',
275
+ ' file << something',
276
+ ' end'
277
+ ])
278
+ expect(cop.offences.size).to eq(1)
279
+ end
280
+
281
+ it 'accepts end aligned with an and-asgn (&&=)' do
282
+ inspect_source(cop,
283
+ ['variable &&= test do |ala|',
284
+ 'end'
285
+ ])
286
+ expect(cop.offences).to be_empty
287
+ end
288
+
289
+ it 'registers an offence for mismatched block end with an and-asgn (&&=)' do
290
+ inspect_source(cop,
291
+ ['variable &&= test do |ala|',
292
+ ' end'
293
+ ])
294
+ expect(cop.offences.size).to eq(1)
295
+ end
296
+
297
+ it 'accepts end aligned with an or-asgn (||=)' do
298
+ inspect_source(cop,
299
+ ['variable ||= test do |ala|',
300
+ 'end'
301
+ ])
302
+ expect(cop.offences).to be_empty
303
+ end
304
+
305
+ it 'registers an offence for mismatched block end with an or-asgn (||=)' do
306
+ inspect_source(cop,
307
+ ['variable ||= test do |ala|',
308
+ ' end'
309
+ ])
310
+ expect(cop.offences.size).to eq(1)
311
+ end
312
+
313
+ it 'accepts end aligned with a mass assignment' do
314
+ inspect_source(cop,
315
+ ['var1, var2 = lambda do |test|',
316
+ ' [1, 2]',
317
+ 'end'
318
+ ])
319
+ expect(cop.offences).to be_empty
320
+ end
321
+
322
+ it 'registers an offence for mismatched block end with a mass assignment' do
323
+ inspect_source(cop,
324
+ ['var1, var2 = lambda do |test|',
325
+ ' [1, 2]',
326
+ ' end'
327
+ ])
328
+ expect(cop.offences.size).to eq(1)
329
+ end
330
+ end
331
+ end
332
+ end
333
+ end