sabat-rubocop 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +50 -0
- data/.rspec +1 -0
- data/.rubocop.yml +7 -0
- data/.travis.yml +7 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +268 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +324 -0
- data/Rakefile +29 -0
- data/bin/rubocop +22 -0
- data/config/default.yml +58 -0
- data/config/disabled.yml +5 -0
- data/config/enabled.yml +403 -0
- data/lib/rubocop.rb +116 -0
- data/lib/rubocop/cli.rb +407 -0
- data/lib/rubocop/config.rb +250 -0
- data/lib/rubocop/config_store.rb +39 -0
- data/lib/rubocop/cop/cop.rb +138 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +54 -0
- data/lib/rubocop/cop/lint/end_alignment.rb +189 -0
- data/lib/rubocop/cop/lint/end_in_method.rb +30 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +22 -0
- data/lib/rubocop/cop/lint/eval.rb +22 -0
- data/lib/rubocop/cop/lint/handle_exceptions.rb +20 -0
- data/lib/rubocop/cop/lint/literal_in_condition.rb +81 -0
- data/lib/rubocop/cop/lint/loop.rb +29 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +29 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +34 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +35 -0
- data/lib/rubocop/cop/lint/unused_local_variable.rb +32 -0
- data/lib/rubocop/cop/lint/void.rb +58 -0
- data/lib/rubocop/cop/offence.rb +136 -0
- data/lib/rubocop/cop/rails/validation.rb +30 -0
- data/lib/rubocop/cop/style/access_control.rb +58 -0
- data/lib/rubocop/cop/style/alias.rb +28 -0
- data/lib/rubocop/cop/style/align_parameters.rb +39 -0
- data/lib/rubocop/cop/style/and_or.rb +45 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +21 -0
- data/lib/rubocop/cop/style/ascii_identifiers.rb +22 -0
- data/lib/rubocop/cop/style/attr.rb +20 -0
- data/lib/rubocop/cop/style/avoid_class_vars.rb +20 -0
- data/lib/rubocop/cop/style/avoid_for.rb +18 -0
- data/lib/rubocop/cop/style/avoid_global_vars.rb +65 -0
- data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +21 -0
- data/lib/rubocop/cop/style/avoid_perlisms.rb +50 -0
- data/lib/rubocop/cop/style/begin_block.rb +18 -0
- data/lib/rubocop/cop/style/block_comments.rb +20 -0
- data/lib/rubocop/cop/style/block_nesting.rb +47 -0
- data/lib/rubocop/cop/style/blocks.rb +27 -0
- data/lib/rubocop/cop/style/case_equality.rb +22 -0
- data/lib/rubocop/cop/style/case_indentation.rb +28 -0
- data/lib/rubocop/cop/style/character_literal.rb +37 -0
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +33 -0
- data/lib/rubocop/cop/style/class_methods.rb +22 -0
- data/lib/rubocop/cop/style/collection_methods.rb +56 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +29 -0
- data/lib/rubocop/cop/style/constant_name.rb +31 -0
- data/lib/rubocop/cop/style/def_parentheses.rb +70 -0
- data/lib/rubocop/cop/style/documentation.rb +58 -0
- data/lib/rubocop/cop/style/dot_position.rb +25 -0
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +26 -0
- data/lib/rubocop/cop/style/empty_lines.rb +40 -0
- data/lib/rubocop/cop/style/empty_literal.rb +53 -0
- data/lib/rubocop/cop/style/encoding.rb +29 -0
- data/lib/rubocop/cop/style/end_block.rb +18 -0
- data/lib/rubocop/cop/style/end_of_line.rb +23 -0
- data/lib/rubocop/cop/style/favor_join.rb +29 -0
- data/lib/rubocop/cop/style/favor_modifier.rb +118 -0
- data/lib/rubocop/cop/style/favor_sprintf.rb +28 -0
- data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +54 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +47 -0
- data/lib/rubocop/cop/style/if_then_else.rb +29 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -0
- data/lib/rubocop/cop/style/lambda.rb +47 -0
- data/lib/rubocop/cop/style/leading_comment_space.rb +25 -0
- data/lib/rubocop/cop/style/line_continuation.rb +26 -0
- data/lib/rubocop/cop/style/line_length.rb +30 -0
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +61 -0
- data/lib/rubocop/cop/style/method_call_parentheses.rb +22 -0
- data/lib/rubocop/cop/style/method_length.rb +57 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +47 -0
- data/lib/rubocop/cop/style/not.rb +24 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +25 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +20 -0
- data/lib/rubocop/cop/style/op_method.rb +29 -0
- data/lib/rubocop/cop/style/parameter_lists.rb +42 -0
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +42 -0
- data/lib/rubocop/cop/style/proc.rb +30 -0
- data/lib/rubocop/cop/style/reduce_arguments.rb +34 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +39 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +55 -0
- data/lib/rubocop/cop/style/semicolon.rb +51 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +48 -0
- data/lib/rubocop/cop/style/space_after_comma_etc.rb +69 -0
- data/lib/rubocop/cop/style/space_after_control_keyword.rb +32 -0
- data/lib/rubocop/cop/style/string_literals.rb +36 -0
- data/lib/rubocop/cop/style/surrounding_space.rb +314 -0
- data/lib/rubocop/cop/style/symbol_array.rb +31 -0
- data/lib/rubocop/cop/style/symbol_name.rb +27 -0
- data/lib/rubocop/cop/style/tab.rb +25 -0
- data/lib/rubocop/cop/style/ternary_operator.rb +49 -0
- data/lib/rubocop/cop/style/trailing_whitespace.rb +24 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -0
- data/lib/rubocop/cop/style/unless_else.rb +26 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +32 -0
- data/lib/rubocop/cop/style/when_then.rb +25 -0
- data/lib/rubocop/cop/style/while_until_do.rb +45 -0
- data/lib/rubocop/cop/style/word_array.rb +44 -0
- data/lib/rubocop/cop/util.rb +27 -0
- data/lib/rubocop/cop/variable_inspector.rb +280 -0
- data/lib/rubocop/formatter/base_formatter.rb +119 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +21 -0
- data/lib/rubocop/formatter/emacs_style_formatter.rb +17 -0
- data/lib/rubocop/formatter/formatter_set.rb +77 -0
- data/lib/rubocop/formatter/json_formatter.rb +76 -0
- data/lib/rubocop/formatter/progress_formatter.rb +63 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +62 -0
- data/lib/rubocop/version.rb +21 -0
- data/rubocop.gemspec +36 -0
- data/spec/.rubocop.yml +5 -0
- data/spec/project_spec.rb +24 -0
- data/spec/rubocop/cli_spec.rb +906 -0
- data/spec/rubocop/config_spec.rb +470 -0
- data/spec/rubocop/config_store_spec.rb +66 -0
- data/spec/rubocop/cops/cop_spec.rb +38 -0
- data/spec/rubocop/cops/lint/assignment_in_condition_spec.rb +111 -0
- data/spec/rubocop/cops/lint/end_alignment_spec.rb +333 -0
- data/spec/rubocop/cops/lint/end_in_method_spec.rb +35 -0
- data/spec/rubocop/cops/lint/ensure_return_spec.rb +37 -0
- data/spec/rubocop/cops/lint/eval_spec.rb +41 -0
- data/spec/rubocop/cops/lint/handle_exceptions_spec.rb +36 -0
- data/spec/rubocop/cops/lint/literal_in_condition_spec.rb +42 -0
- data/spec/rubocop/cops/lint/loop_spec.rb +33 -0
- data/spec/rubocop/cops/lint/rescue_exception_spec.rb +127 -0
- data/spec/rubocop/cops/lint/shadowing_outer_local_variable_spec.rb +243 -0
- data/spec/rubocop/cops/lint/unreachable_code_spec.rb +69 -0
- data/spec/rubocop/cops/lint/unused_local_variable_spec.rb +497 -0
- data/spec/rubocop/cops/lint/void_spec.rb +63 -0
- data/spec/rubocop/cops/offence_spec.rb +133 -0
- data/spec/rubocop/cops/rails/validation_spec.rb +27 -0
- data/spec/rubocop/cops/style/access_control_spec.rb +142 -0
- data/spec/rubocop/cops/style/alias_spec.rb +47 -0
- data/spec/rubocop/cops/style/align_parameters_spec.rb +199 -0
- data/spec/rubocop/cops/style/and_or_spec.rb +39 -0
- data/spec/rubocop/cops/style/ascii_comments_spec.rb +28 -0
- data/spec/rubocop/cops/style/ascii_identifiers_spec.rb +28 -0
- data/spec/rubocop/cops/style/attr_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_class_vars_spec.rb +27 -0
- data/spec/rubocop/cops/style/avoid_for_spec.rb +37 -0
- data/spec/rubocop/cops/style/avoid_global_vars_spec.rb +34 -0
- data/spec/rubocop/cops/style/avoid_perl_backrefs_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_perlisms_spec.rb +47 -0
- data/spec/rubocop/cops/style/begin_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/block_comments_spec.rb +27 -0
- data/spec/rubocop/cops/style/block_nesting_spec.rb +159 -0
- data/spec/rubocop/cops/style/blocks_spec.rb +35 -0
- data/spec/rubocop/cops/style/case_equality_spec.rb +18 -0
- data/spec/rubocop/cops/style/case_indentation_spec.rb +88 -0
- data/spec/rubocop/cops/style/character_literal_spec.rb +28 -0
- data/spec/rubocop/cops/style/class_and_module_camel_case_spec.rb +46 -0
- data/spec/rubocop/cops/style/class_methods_spec.rb +51 -0
- data/spec/rubocop/cops/style/collection_methods_spec.rb +41 -0
- data/spec/rubocop/cops/style/colon_method_call_spec.rb +55 -0
- data/spec/rubocop/cops/style/constant_name_spec.rb +56 -0
- data/spec/rubocop/cops/style/def_with_parentheses_spec.rb +40 -0
- data/spec/rubocop/cops/style/def_without_parentheses_spec.rb +34 -0
- data/spec/rubocop/cops/style/documentation_spec.rb +79 -0
- data/spec/rubocop/cops/style/dot_position_spec.rb +30 -0
- data/spec/rubocop/cops/style/empty_line_between_defs_spec.rb +85 -0
- data/spec/rubocop/cops/style/empty_lines_spec.rb +40 -0
- data/spec/rubocop/cops/style/empty_literal_spec.rb +91 -0
- data/spec/rubocop/cops/style/encoding_spec.rb +49 -0
- data/spec/rubocop/cops/style/end_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/end_of_line_spec.rb +25 -0
- data/spec/rubocop/cops/style/favor_join_spec.rb +37 -0
- data/spec/rubocop/cops/style/favor_modifier_spec.rb +160 -0
- data/spec/rubocop/cops/style/favor_sprintf_spec.rb +53 -0
- data/spec/rubocop/cops/style/favor_unless_over_negated_if_spec.rb +64 -0
- data/spec/rubocop/cops/style/favor_until_over_negated_while_spec.rb +47 -0
- data/spec/rubocop/cops/style/hash_syntax_spec.rb +51 -0
- data/spec/rubocop/cops/style/if_with_semicolon_spec.rb +25 -0
- data/spec/rubocop/cops/style/lambda_spec.rb +45 -0
- data/spec/rubocop/cops/style/leading_comment_space_spec.rb +65 -0
- data/spec/rubocop/cops/style/line_continuation_spec.rb +26 -0
- data/spec/rubocop/cops/style/line_length_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_and_variable_snake_case_spec.rb +95 -0
- data/spec/rubocop/cops/style/method_call_parentheses_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_length_spec.rb +151 -0
- data/spec/rubocop/cops/style/multiline_if_then_spec.rb +97 -0
- data/spec/rubocop/cops/style/not_spec.rb +28 -0
- data/spec/rubocop/cops/style/numeric_literals_spec.rb +51 -0
- data/spec/rubocop/cops/style/one_line_conditional_spec.rb +18 -0
- data/spec/rubocop/cops/style/op_method_spec.rb +80 -0
- data/spec/rubocop/cops/style/parameter_lists_spec.rb +49 -0
- data/spec/rubocop/cops/style/parentheses_around_condition_spec.rb +59 -0
- data/spec/rubocop/cops/style/proc_spec.rb +28 -0
- data/spec/rubocop/cops/style/reduce_arguments_spec.rb +59 -0
- data/spec/rubocop/cops/style/regexp_literal_spec.rb +83 -0
- data/spec/rubocop/cops/style/rescue_modifier_spec.rb +122 -0
- data/spec/rubocop/cops/style/semicolon_spec.rb +95 -0
- data/spec/rubocop/cops/style/single_line_methods_spec.rb +54 -0
- data/spec/rubocop/cops/style/space_after_colon_spec.rb +29 -0
- data/spec/rubocop/cops/style/space_after_comma_spec.rb +31 -0
- data/spec/rubocop/cops/style/space_after_control_keyword_spec.rb +69 -0
- data/spec/rubocop/cops/style/space_after_semicolon_spec.rb +24 -0
- data/spec/rubocop/cops/style/space_around_braces_spec.rb +49 -0
- data/spec/rubocop/cops/style/space_around_equals_in_default_parameter_spec.rb +34 -0
- data/spec/rubocop/cops/style/space_around_operators_spec.rb +216 -0
- data/spec/rubocop/cops/style/space_inside_brackets_spec.rb +51 -0
- data/spec/rubocop/cops/style/space_inside_hash_literal_braces_spec.rb +99 -0
- data/spec/rubocop/cops/style/space_inside_parens_spec.rb +33 -0
- data/spec/rubocop/cops/style/string_literals_spec.rb +62 -0
- data/spec/rubocop/cops/style/symbol_array_spec.rb +45 -0
- data/spec/rubocop/cops/style/symbol_name_spec.rb +122 -0
- data/spec/rubocop/cops/style/tab_spec.rb +23 -0
- data/spec/rubocop/cops/style/ternary_operator_spec.rb +42 -0
- data/spec/rubocop/cops/style/trailing_whitespace_spec.rb +29 -0
- data/spec/rubocop/cops/style/trivial_accessors_spec.rb +338 -0
- data/spec/rubocop/cops/style/unless_else_spec.rb +31 -0
- data/spec/rubocop/cops/style/variable_interpolation_spec.rb +53 -0
- data/spec/rubocop/cops/style/when_then_spec.rb +40 -0
- data/spec/rubocop/cops/style/while_until_do_spec.rb +47 -0
- data/spec/rubocop/cops/style/word_array_spec.rb +61 -0
- data/spec/rubocop/cops/variable_inspector_spec.rb +374 -0
- data/spec/rubocop/formatter/base_formatter_spec.rb +190 -0
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +70 -0
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +32 -0
- data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
- data/spec/rubocop/formatter/json_formatter_spec.rb +142 -0
- data/spec/rubocop/formatter/progress_formatter_spec.rb +196 -0
- data/spec/rubocop/formatter/simple_text_formatter_spec.rb +74 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/file_helper.rb +21 -0
- data/spec/support/isolated_environment.rb +27 -0
- data/spec/support/mri_syntax_checker.rb +69 -0
- data/spec/support/shared_examples.rb +33 -0
- 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
|