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,196 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'stringio'
5
+
6
+ module Rubocop
7
+ describe Formatter::ProgressFormatter do
8
+ let(:formatter) { Formatter::ProgressFormatter.new(output) }
9
+ let(:output) { StringIO.new }
10
+
11
+ let(:files) do
12
+ %w(lib/rubocop.rb spec/spec_helper.rb bin/rubocop).map do |path|
13
+ File.expand_path(path)
14
+ end
15
+ end
16
+
17
+ describe '#file_finished' do
18
+ before do
19
+ formatter.started(files)
20
+ formatter.file_started(files.first, {})
21
+ end
22
+
23
+ shared_examples 'calls #report_file_as_mark' do
24
+ it 'calls #report_as_with_mark' do
25
+ formatter.should_receive(:report_file_as_mark)
26
+ formatter.file_finished(files.first, offences)
27
+ end
28
+ end
29
+
30
+ context 'when no offences are detected' do
31
+ let(:offences) { [] }
32
+ include_examples 'calls #report_file_as_mark'
33
+ end
34
+
35
+ context 'when any offences are detected' do
36
+ let(:offences) { [double('offence').as_null_object] }
37
+ include_examples 'calls #report_file_as_mark'
38
+ end
39
+ end
40
+
41
+ describe '#report_file_as_mark' do
42
+ before do
43
+ formatter.report_file_as_mark(files.first, offences)
44
+ end
45
+
46
+ def offence_with_severity(severity)
47
+ source_buffer = Parser::Source::Buffer.new('test', 1)
48
+ source_buffer.source = "a\n"
49
+ Cop::Offence.new(severity,
50
+ Parser::Source::Range.new(source_buffer, 0, 1),
51
+ 'message',
52
+ 'CopName')
53
+ end
54
+
55
+ context 'when no offences are detected' do
56
+ let(:offences) { [] }
57
+
58
+ it 'prints "."' do
59
+ expect(output.string).to eq('.')
60
+ end
61
+ end
62
+
63
+ context 'when a refactor severity offence is detected' do
64
+ let(:offences) { [offence_with_severity(:refactor)] }
65
+
66
+ it 'prints "R"' do
67
+ expect(output.string).to eq('R')
68
+ end
69
+ end
70
+
71
+ context 'when a refactor convention offence is detected' do
72
+ let(:offences) { [offence_with_severity(:convention)] }
73
+
74
+ it 'prints "C"' do
75
+ expect(output.string).to eq('C')
76
+ end
77
+ end
78
+
79
+ context 'when different severity offences are detected' do
80
+ let(:offences) do
81
+ [
82
+ offence_with_severity(:refactor),
83
+ offence_with_severity(:error)
84
+ ]
85
+ end
86
+
87
+ it 'prints highest level mark' do
88
+ expect(output.string).to eq('E')
89
+ end
90
+ end
91
+ end
92
+
93
+ describe '#finished' do
94
+ before do
95
+ formatter.started(files)
96
+ end
97
+
98
+ context 'when #reports_summary? is true' do
99
+ before { formatter.reports_summary = true }
100
+
101
+ context 'when any offences are detected' do
102
+ before do
103
+ source_buffer = Parser::Source::Buffer.new('test', 1)
104
+ source = 9.times.map do |index|
105
+ "This is line #{index + 1}."
106
+ end
107
+ source_buffer.source = source.join("\n")
108
+ line_length = source[0].length + "\n".length
109
+
110
+ formatter.file_started(files[0], {})
111
+ formatter.file_finished(files[0], [
112
+ Cop::Offence.new(
113
+ :convention,
114
+ Parser::Source::Range.new(source_buffer,
115
+ line_length + 2,
116
+ line_length + 3),
117
+ 'foo',
118
+ 'Cop'
119
+ )
120
+ ])
121
+
122
+ formatter.file_started(files[1], {})
123
+ formatter.file_finished(files[1], [
124
+ ])
125
+
126
+ formatter.file_started(files[2], {})
127
+ formatter.file_finished(files[2], [
128
+ Cop::Offence.new(
129
+ :error,
130
+ Parser::Source::Range.new(source_buffer,
131
+ 4 * line_length + 1,
132
+ 4 * line_length + 2),
133
+ 'bar',
134
+ 'Cop'
135
+ ),
136
+ Cop::Offence.new(
137
+ :convention,
138
+ Parser::Source::Range.new(source_buffer,
139
+ 5 * line_length,
140
+ 5 * line_length + 1),
141
+ 'foo',
142
+ 'Cop'
143
+ )
144
+ ])
145
+ end
146
+
147
+ it 'reports all detected offences for all failed files' do
148
+ formatter.finished(files)
149
+ expect(output.string).to include([
150
+ 'Offences:',
151
+ '',
152
+ 'lib/rubocop.rb:2:3: C: foo',
153
+ 'This is line 2.',
154
+ ' ^',
155
+ 'bin/rubocop:5:2: E: bar',
156
+ 'This is line 5.',
157
+ ' ^',
158
+ 'bin/rubocop:6:1: C: foo',
159
+ 'This is line 6.',
160
+ '^'
161
+ ].join("\n"))
162
+ end
163
+ end
164
+
165
+ context 'when no offences are detected' do
166
+ before do
167
+ files.each do |file|
168
+ formatter.file_started(file, {})
169
+ formatter.file_finished(file, [])
170
+ end
171
+ end
172
+
173
+ it 'does not report offences' do
174
+ formatter.finished(files)
175
+ expect(output.string).not_to include('Offences:')
176
+ end
177
+ end
178
+
179
+ it 'calls #report_summary' do
180
+ formatter.should_receive(:report_summary)
181
+ formatter.finished(files)
182
+ end
183
+ end
184
+
185
+ context 'when #reports_summary? is false' do
186
+ before { formatter.reports_summary = false }
187
+
188
+ it 'reports nothing' do
189
+ output.string = ''
190
+ formatter.finished(files)
191
+ expect(output.string).to eq("\n")
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,74 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'stringio'
5
+ require 'tempfile'
6
+
7
+ module Rubocop
8
+ module Formatter
9
+ describe SimpleTextFormatter do
10
+ subject(:formatter) { SimpleTextFormatter.new(output) }
11
+ let(:output) { StringIO.new }
12
+
13
+ describe '#report_file' do
14
+ before do
15
+ formatter.report_file(file, [])
16
+ end
17
+
18
+ context 'the file is under the current working directory' do
19
+ let(:file) { File.expand_path('spec/spec_helper.rb') }
20
+
21
+ it 'prints as relative path' do
22
+ expect(output.string).to include('== spec/spec_helper.rb ==')
23
+ end
24
+ end
25
+
26
+ context 'the file is outside of the current working directory' do
27
+ let(:file) do
28
+ tempfile = Tempfile.new('')
29
+ tempfile.close
30
+ File.expand_path(tempfile.path)
31
+ end
32
+
33
+ it 'prints as absolute path' do
34
+ expect(output.string).to include("== #{file} ==")
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#report_summary' do
40
+ context 'when no files inspected' do
41
+ it 'handles pluralization correctly' do
42
+ formatter.report_summary(0, 0)
43
+ expect(output.string).to eq(
44
+ "\n0 files inspected, no offences detected\n")
45
+ end
46
+ end
47
+
48
+ context 'when a file inspected and no offences detected' do
49
+ it 'handles pluralization correctly' do
50
+ formatter.report_summary(1, 0)
51
+ expect(output.string).to eq(
52
+ "\n1 file inspected, no offences detected\n")
53
+ end
54
+ end
55
+
56
+ context 'when a offence detected' do
57
+ it 'handles pluralization correctly' do
58
+ formatter.report_summary(1, 1)
59
+ expect(output.string).to eq(
60
+ "\n1 file inspected, 1 offence detected\n")
61
+ end
62
+ end
63
+
64
+ context 'when 2 offences detected' do
65
+ it 'handles pluralization correctly' do
66
+ formatter.report_summary(2, 2)
67
+ expect(output.string).to eq(
68
+ "\n2 files inspected, 2 offences detected\n")
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,92 @@
1
+ # encoding: utf-8
2
+
3
+ if ENV['TRAVIS'] && RUBY_ENGINE == 'jruby'
4
+ # Force JRuby not to select working directory
5
+ # as temporary directory on Travis CI.
6
+ # https://github.com/jruby/jruby/issues/405
7
+ require 'fileutils'
8
+ tmp_dir = ENV['TMPDIR'] || ENV['TMP'] || ENV['TEMP'] ||
9
+ Etc.systmpdir || '/tmp'
10
+ non_world_writable_tmp_dir = File.join(tmp_dir, 'rubocop')
11
+ FileUtils.makedirs(non_world_writable_tmp_dir, mode: 0700)
12
+ ENV['TMPDIR'] = non_world_writable_tmp_dir
13
+ end
14
+
15
+ if ENV['TRAVIS'] || ENV['COVERAGE']
16
+ require 'simplecov'
17
+
18
+ if ENV['TRAVIS']
19
+ require 'coveralls'
20
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
21
+ end
22
+
23
+ SimpleCov.start do
24
+ add_filter '/spec/'
25
+ add_filter '/vendor/bundle/'
26
+ end
27
+ end
28
+
29
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
30
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
31
+ require 'rspec'
32
+ require 'rubocop'
33
+ require 'rubocop/cli'
34
+
35
+ # disable colors in specs
36
+ Sickill::Rainbow.enabled = false
37
+
38
+ module ExitCodeMatchers
39
+ RSpec::Matchers.define :exit_with_code do |code|
40
+ actual = nil
41
+ match do |block|
42
+ begin
43
+ block.call
44
+ rescue SystemExit => e
45
+ actual = e.status
46
+ end
47
+ actual && actual == code
48
+ end
49
+ failure_message_for_should do |block|
50
+ "expected block to call exit(#{code}) but exit" +
51
+ (actual.nil? ? ' not called' : "(#{actual}) was called")
52
+ end
53
+ failure_message_for_should_not do |block|
54
+ "expected block not to call exit(#{code})"
55
+ end
56
+ description do
57
+ "expect block to call exit(#{code})"
58
+ end
59
+ end
60
+ end
61
+
62
+ RSpec.configure do |config|
63
+ broken_filter = lambda do |v|
64
+ v.is_a?(Symbol) ? RUBY_ENGINE == v.to_s : v
65
+ end
66
+ config.filter_run_excluding ruby: ->(v) { !RUBY_VERSION.start_with?(v.to_s) }
67
+ config.filter_run_excluding broken: broken_filter
68
+ config.treat_symbols_as_metadata_keys_with_true_values = true
69
+
70
+ config.expect_with :rspec do |c|
71
+ c.syntax = :expect # disables `should`
72
+ end
73
+
74
+ config.include(ExitCodeMatchers)
75
+ end
76
+
77
+ def inspect_source(cop, source)
78
+ ast, comments, tokens, src_buffer, _ = Rubocop::CLI.parse('(string)') do |sb|
79
+ sb.source = source.join($RS)
80
+ end
81
+ cop.inspect(src_buffer, source, tokens, ast, comments)
82
+ end
83
+
84
+ class Rubocop::Cop::Cop
85
+ def messages
86
+ offences.map(&:message)
87
+ end
88
+ end
89
+
90
+ # Requires supporting files with custom matchers and macros, etc,
91
+ # in ./support/ and its subdirectories.
92
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ require 'fileutils'
4
+
5
+ module FileHelper
6
+ def create_file(file_path, content)
7
+ file_path = File.expand_path(file_path)
8
+
9
+ dir_path = File.dirname(file_path)
10
+ FileUtils.makedirs dir_path unless File.exists?(dir_path)
11
+
12
+ File.open(file_path, 'w') do |file|
13
+ case content
14
+ when String
15
+ file.puts content
16
+ when Array
17
+ file.puts content.join("\n")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+
6
+ shared_context 'isolated environment', :isolated_environment do
7
+ around do |example|
8
+ Dir.mktmpdir do |tmpdir|
9
+ original_home = ENV['HOME']
10
+
11
+ begin
12
+ virtual_home = File.expand_path(File.join(tmpdir, 'home'))
13
+ Dir.mkdir(virtual_home)
14
+ ENV['HOME'] = virtual_home
15
+
16
+ working_dir = File.join(tmpdir, 'work')
17
+ Dir.mkdir(working_dir)
18
+
19
+ Dir.chdir(working_dir) do
20
+ example.run
21
+ end
22
+ ensure
23
+ ENV['HOME'] = original_home
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ require 'open3'
4
+
5
+ # The reincarnation of syntax cop :)
6
+ module MRISyntaxChecker
7
+ module_function
8
+
9
+ def offences_for_source(source, fake_cop_name = 'Syntax', grep_message = nil)
10
+ if source.is_a?(Array)
11
+ source_lines = source
12
+ source = source_lines.join("\n")
13
+ else
14
+ source_lines = source.each_line.to_a
15
+ end
16
+
17
+ source_buffer = Parser::Source::Buffer.new('test', 1)
18
+ source_buffer.source = source
19
+
20
+ offences = []
21
+
22
+ check_syntax(source).each_line do |line|
23
+ line_number, severity, message = process_line(line)
24
+ next unless line_number
25
+ next if grep_message && !message.include?(grep_message)
26
+ begin_pos = source_lines[0...(line_number - 1)].reduce(0) do |a, e|
27
+ a + e.length + "\n".length
28
+ end
29
+ offences << Rubocop::Cop::Offence.new(
30
+ severity,
31
+ Parser::Source::Range.new(source_buffer, begin_pos, begin_pos + 1),
32
+ message.capitalize,
33
+ fake_cop_name
34
+ )
35
+ end
36
+
37
+ offences
38
+ end
39
+
40
+ def check_syntax(source)
41
+ fail 'Must be running with MRI' unless RUBY_ENGINE == 'ruby'
42
+
43
+ stdin, stderr, thread = nil
44
+
45
+ # It's extremely important to run the syntax check in a
46
+ # clean environment - otherwise it will be extremely slow.
47
+ if defined? Bundler
48
+ Bundler.with_clean_env do
49
+ stdin, _, stderr, thread = Open3.popen3('ruby', '-cw')
50
+ end
51
+ else
52
+ stdin, _, stderr, thread = Open3.popen3('ruby', '-cw')
53
+ end
54
+
55
+ stdin.write(source)
56
+ stdin.close
57
+ thread.join
58
+
59
+ stderr.read
60
+ end
61
+
62
+ def process_line(line)
63
+ match_data = line.match(/.+:(\d+): (warning: )?(.+)/)
64
+ return nil unless match_data
65
+ line_number, warning, message = match_data.captures
66
+ severity = warning ? :warning : :error
67
+ [line_number.to_i, severity, message]
68
+ end
69
+ end