sabat-rubocop 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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,119 @@
1
+ # encoding: utf-8
2
+
3
+ # rubocop:disable LineLength
4
+
5
+ module Rubocop
6
+ module Formatter
7
+ # Abstract base class for formatter, implements all public API methods.
8
+ #
9
+ # ## Creating Custom Formatter
10
+ #
11
+ # You can create a custom formatter by subclassing
12
+ # `Rubocop::Formatter::BaseFormatter` and override some methods,
13
+ # or implement all the methods by duck typing.
14
+ #
15
+ # ## Using Custom Formatter in Command Line
16
+ #
17
+ # You can tell RuboCop to use your custom formatter with a combination of
18
+ # `--format` and `--require` option.
19
+ # For example, when you have defined `MyCustomFormatter` in
20
+ # `./path/to/my_custom_formatter.rb`, you would type this command:
21
+ #
22
+ # rubocop --require ./path/to/my_custom_formatter --format MyCustomFormatter
23
+ #
24
+ # Note: The path passed to `--require` is directly passed to
25
+ # `Kernel.require`.
26
+ # If your custom formatter file is not in `$LOAD_PATH`,
27
+ # you need to specify the path as relative path prefixed with `./`
28
+ # explicitly, or absolute path.
29
+ #
30
+ # ## Method Invocation Order
31
+ #
32
+ # For example, when RuboCop inspects 2 files,
33
+ # the invocation order should be like this:
34
+ #
35
+ # * `#initialize`
36
+ # * `#started`
37
+ # * `#file_started`
38
+ # * `#file_finished`
39
+ # * `#file_started`
40
+ # * `#file_finished`
41
+ # * `#finished`
42
+ #
43
+ class BaseFormatter
44
+ # rubocop:enable LineLength
45
+
46
+ # @api public
47
+ #
48
+ # @!attribute [r] output
49
+ #
50
+ # @return [IO]
51
+ # the IO object passed to `#initialize`
52
+ #
53
+ # @see #initialize
54
+ attr_reader :output
55
+
56
+ # @api public
57
+ #
58
+ # @param output [IO]
59
+ # `$stdout` or opened file
60
+ def initialize(output)
61
+ @output = output
62
+ end
63
+
64
+ # @api public
65
+ #
66
+ # Invoked once before any files are inspected.
67
+ #
68
+ # @param target_files [Array(String)]
69
+ # all target file paths to be inspected
70
+ #
71
+ # @return [void]
72
+ def started(target_files)
73
+ end
74
+
75
+ # @api public
76
+ #
77
+ # Invoked at the beginning of inspecting each files.
78
+ #
79
+ # @param file [String]
80
+ # the file path
81
+ #
82
+ # @param options [Hash]
83
+ # file specific information, currently this is always empty.
84
+ #
85
+ # @return [void]
86
+ def file_started(file, options)
87
+ end
88
+
89
+ # @api public
90
+ #
91
+ # Invoked at the end of inspecting each files.
92
+ #
93
+ # @param file [String]
94
+ # the file path
95
+ #
96
+ # @param offences [Array(Rubocop::Cop::Offence)]
97
+ # all detected offences for the file
98
+ #
99
+ # @return [void]
100
+ #
101
+ # @see Rubocop::Cop::Offence
102
+ def file_finished(file, offences)
103
+ end
104
+
105
+ # @api public
106
+ #
107
+ # Invoked after all files are inspected, or interrupted by user.
108
+ #
109
+ # @param inspected_files [Array(String)]
110
+ # the inspected file paths.
111
+ # This would be same as `target_files` passed to `#started`
112
+ # unless RuboCop is interrupted by user.
113
+ #
114
+ # @return [void]
115
+ def finished(inspected_files)
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Formatter
5
+ # This formatter formats report data in clang style.
6
+ # The precise location of the problem is shown together with the
7
+ # relevant source code.
8
+ class ClangStyleFormatter < SimpleTextFormatter
9
+ def report_file(file, offences)
10
+ offences.each do |o|
11
+ output.printf("%s:%d:%d: %s: %s\n",
12
+ smart_path(file).color(:cyan), o.line, o.real_column,
13
+ o.clang_severity, o.message)
14
+ output.puts(o.location.source_line)
15
+ output.puts(' ' * o.location.column +
16
+ '^' * o.location.column_range.count)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Formatter
5
+ # This formatter displays the report data in format that's
6
+ # easy to process in the Emacs text editor.
7
+ class EmacsStyleFormatter < SimpleTextFormatter
8
+ def report_file(file, offences)
9
+ offences.each do |o|
10
+ output.printf("%s:%d:%d: %s: %s\n",
11
+ file, o.line, o.real_column, o.encode_severity,
12
+ o.message)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Formatter
5
+ # This is a collection of formatters. A FormatterSet can hold multiple
6
+ # formatter instances and provides transparent formatter API methods
7
+ # which invoke same method of each formatters.
8
+ class FormatterSet < Array
9
+ BUILTIN_FORMATTERS_FOR_KEYS = {
10
+ 'progress' => ProgressFormatter,
11
+ 'simple' => SimpleTextFormatter,
12
+ 'clang' => ClangStyleFormatter,
13
+ 'emacs' => EmacsStyleFormatter,
14
+ 'json' => JSONFormatter
15
+ }
16
+
17
+ FORMATTER_APIS = [:started, :file_started, :file_finished, :finished]
18
+
19
+ def initialize(report_summary = true)
20
+ @reports_summary = report_summary
21
+ end
22
+
23
+ FORMATTER_APIS.each do |method_name|
24
+ define_method(method_name) do |*args|
25
+ each { |f| f.send(method_name, *args) }
26
+ end
27
+ end
28
+
29
+ def add_formatter(formatter_key, output_path = nil)
30
+ formatter_class = if formatter_key =~ /\A[A-Z]/
31
+ custom_formatter_class(formatter_key)
32
+ else
33
+ builtin_formatter_class(formatter_key)
34
+ end
35
+
36
+ output = output_path ? File.open(output_path, 'w') : $stdout
37
+
38
+ formatter = formatter_class.new(output)
39
+ if formatter.respond_to?(:reports_summary=)
40
+ # TODO: Consider dropping -s/--silent option
41
+ formatter.reports_summary = @reports_summary
42
+ end
43
+ self << formatter
44
+ end
45
+
46
+ def close_output_files
47
+ each do |formatter|
48
+ formatter.output.close if formatter.output.is_a?(File)
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def builtin_formatter_class(specified_key)
55
+ matching_keys = BUILTIN_FORMATTERS_FOR_KEYS.keys.select do |key|
56
+ key.start_with?(specified_key)
57
+ end
58
+
59
+ if matching_keys.empty?
60
+ fail %(No formatter for "#{specified_key}")
61
+ elsif matching_keys.size > 1
62
+ fail %(Cannot determine formatter for "#{specified_key}")
63
+ end
64
+
65
+ BUILTIN_FORMATTERS_FOR_KEYS[matching_keys.first]
66
+ end
67
+
68
+ def custom_formatter_class(specified_class_name)
69
+ constant_names = specified_class_name.split('::')
70
+ constant_names.shift if constant_names.first.empty?
71
+ constant_names.reduce(Object) do |namespace, constant_name|
72
+ namespace.const_get(constant_name, false)
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,76 @@
1
+ # encoding: utf-8
2
+
3
+ require 'json'
4
+ require 'pathname'
5
+
6
+ module Rubocop
7
+ module Formatter
8
+ # This formatter formats the report data in JSON format.
9
+ class JSONFormatter < BaseFormatter
10
+ attr_reader :output_hash
11
+
12
+ def initialize(output)
13
+ super
14
+ @output_hash = {
15
+ metadata: metadata_hash,
16
+ files: [],
17
+ summary: { offence_count: 0 }
18
+ }
19
+ end
20
+
21
+ def started(target_files)
22
+ output_hash[:summary][:target_file_count] = target_files.count
23
+ end
24
+
25
+ def file_finished(file, offences)
26
+ output_hash[:files] << hash_for_file(file, offences)
27
+ output_hash[:summary][:offence_count] += offences.count
28
+ end
29
+
30
+ def finished(inspected_files)
31
+ output_hash[:summary][:inspected_file_count] = inspected_files.count
32
+ output.write output_hash.to_json
33
+ end
34
+
35
+ def metadata_hash
36
+ {
37
+ rubocop_version: Rubocop::Version::STRING,
38
+ ruby_engine: RUBY_ENGINE,
39
+ ruby_version: RUBY_VERSION,
40
+ ruby_patchlevel: RUBY_PATCHLEVEL.to_s,
41
+ ruby_platform: RUBY_PLATFORM
42
+ }
43
+ end
44
+
45
+ def hash_for_file(file, offences)
46
+ {
47
+ path: relative_path(file),
48
+ offences: offences.map { |o| hash_for_offence(o) }
49
+ }
50
+ end
51
+
52
+ def hash_for_offence(offence)
53
+ {
54
+ severity: offence.severity,
55
+ message: offence.message,
56
+ cop_name: offence.cop_name,
57
+ location: hash_for_location(offence)
58
+ }
59
+ end
60
+
61
+ # TODO: Consider better solution for Offence#real_column.
62
+ def hash_for_location(offence)
63
+ {
64
+ line: offence.line,
65
+ column: offence.real_column
66
+ }
67
+ end
68
+
69
+ private
70
+
71
+ def relative_path(path)
72
+ Pathname.new(path).relative_path_from(Pathname.getwd).to_s
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Formatter
5
+ # This formatter display dots for files with no offences and
6
+ # letters for files with problems in the them. In the end it
7
+ # appends the regular report data in the clang style format.
8
+ class ProgressFormatter < ClangStyleFormatter
9
+ COLOR_FOR_SEVERITY = {
10
+ refactor: :yellow,
11
+ convention: :yellow,
12
+ warning: :magenta,
13
+ error: :red,
14
+ fatal: :red
15
+ }
16
+
17
+ def started(target_files)
18
+ super
19
+ @offences_for_files = {}
20
+ file_phrase = target_files.count == 1 ? 'file' : 'files'
21
+ output.puts "Inspecting #{target_files.count} #{file_phrase}"
22
+ end
23
+
24
+ def file_finished(file, offences)
25
+ @total_offence_count += offences.count
26
+ @offences_for_files[file] = offences unless offences.empty?
27
+ report_file_as_mark(file, offences)
28
+ end
29
+
30
+ def finished(inspected_files)
31
+ output.puts
32
+
33
+ return unless reports_summary?
34
+
35
+ unless @offences_for_files.empty?
36
+ output.puts
37
+ output.puts 'Offences:'
38
+ output.puts
39
+
40
+ @offences_for_files.each do |file, offences|
41
+ report_file(file, offences)
42
+ end
43
+ end
44
+
45
+ report_summary(inspected_files.count, @total_offence_count)
46
+ end
47
+
48
+ def report_file_as_mark(file, offences)
49
+ mark = if offences.empty?
50
+ '.'.color(:green)
51
+ else
52
+ highest_offence = offences.max do |a, b|
53
+ a.severity_level <=> b.severity_level
54
+ end
55
+ color = COLOR_FOR_SEVERITY[highest_offence.severity]
56
+ highest_offence.encode_severity.color(color)
57
+ end
58
+
59
+ output.write mark
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Formatter
5
+ # A basic formatter that displays only files with offences.
6
+ # Offences are displayed at compact form - just the
7
+ # location of the problem and the associated message.
8
+ class SimpleTextFormatter < BaseFormatter
9
+ attr_accessor :reports_summary
10
+ alias_method :reports_summary?, :reports_summary
11
+
12
+ def started(target_files)
13
+ @total_offence_count = 0
14
+ end
15
+
16
+ def file_finished(file, offences)
17
+ return if offences.empty?
18
+ @total_offence_count += offences.count
19
+ report_file(file, offences)
20
+ end
21
+
22
+ def finished(inspected_files)
23
+ if reports_summary?
24
+ report_summary(inspected_files.count, @total_offence_count)
25
+ end
26
+ end
27
+
28
+ def report_file(file, offences)
29
+ output.puts "== #{smart_path(file)} ==".color(:yellow)
30
+ output.puts offences.join("\n")
31
+ end
32
+
33
+ def report_summary(file_count, offence_count)
34
+ summary = ''
35
+
36
+ plural = file_count == 0 || file_count > 1 ? 's' : ''
37
+ summary << "#{file_count} file#{plural} inspected, "
38
+
39
+ offences_string = case offence_count
40
+ when 0 then 'no offences'
41
+ when 1 then '1 offence'
42
+ else "#{offence_count} offences"
43
+ end
44
+ summary << "#{offences_string} detected"
45
+ .color(offence_count.zero? ? :green : :red)
46
+
47
+ output.puts
48
+ output.puts summary
49
+ end
50
+
51
+ protected
52
+
53
+ def smart_path(path)
54
+ if path.start_with?(Dir.pwd)
55
+ Pathname.new(path).relative_path_from(Pathname.getwd).to_s
56
+ else
57
+ path
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ # This module holds the RuboCop version information.
5
+ module Version
6
+ STRING = '0.9.0'
7
+
8
+ MSG = '%s (using Parser %s, running on %s %s %s)'
9
+
10
+ module_function
11
+
12
+ def version(debug = false)
13
+ if debug
14
+ sprintf(MSG, STRING, Parser::VERSION,
15
+ RUBY_ENGINE, RUBY_VERSION, RUBY_PLATFORM)
16
+ else
17
+ STRING
18
+ end
19
+ end
20
+ end
21
+ end