ruby-lint 0.0.2 → 0.0.3
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.
- data.tar.gz.asc +17 -0
- data/.gitignore +1 -0
- data/.travis.yml +25 -0
- data/.yardopts +4 -0
- data/Gemfile +1 -1
- data/LICENSE +1 -1
- data/MANIFEST +238 -49
- data/README.md +84 -131
- data/Rakefile +6 -0
- data/bin/ruby-lint +2 -2
- data/checksum/.gitkeep +0 -0
- data/doc/DCO.md +26 -0
- data/doc/architecture.md +63 -0
- data/doc/code_analysis.md +90 -0
- data/doc/configuration.md +86 -0
- data/doc/contributing.md +16 -0
- data/doc/graphviz/flow.dot +7 -0
- data/doc/images/.gitkeep +0 -0
- data/doc/images/flow.png +0 -0
- data/lib/ruby-lint.rb +35 -35
- data/lib/ruby-lint/analyze/argument_amount.rb +73 -0
- data/lib/ruby-lint/analyze/shadowing_variables.rb +19 -24
- data/lib/ruby-lint/analyze/undefined_methods.rb +68 -0
- data/lib/ruby-lint/analyze/undefined_variables.rb +42 -69
- data/lib/ruby-lint/analyze/unused_variables.rb +23 -78
- data/lib/ruby-lint/base.rb +85 -0
- data/lib/ruby-lint/cli.rb +23 -167
- data/lib/ruby-lint/cli/analyze.rb +99 -0
- data/lib/ruby-lint/cli/ast.rb +35 -0
- data/lib/ruby-lint/cli/base.rb +120 -0
- data/lib/ruby-lint/configuration.rb +112 -0
- data/lib/ruby-lint/constant_loader.rb +92 -0
- data/lib/ruby-lint/definition/ruby_method.rb +248 -0
- data/lib/ruby-lint/definition/ruby_object.rb +757 -0
- data/lib/ruby-lint/definition_generator.rb +155 -0
- data/lib/ruby-lint/definitions/core.rb +5 -0
- data/lib/ruby-lint/definitions/core/arg0.rb +7 -0
- data/lib/ruby-lint/definitions/core/argf.rb +7 -0
- data/lib/ruby-lint/definitions/core/argument_error.rb +12 -0
- data/lib/ruby-lint/definitions/core/argv.rb +7 -0
- data/lib/ruby-lint/definitions/core/array.rb +414 -0
- data/lib/ruby-lint/definitions/core/autoload.rb +39 -0
- data/lib/ruby-lint/definitions/core/basic_object.rb +46 -0
- data/lib/ruby-lint/definitions/core/bignum.rb +128 -0
- data/lib/ruby-lint/definitions/core/binding.rb +52 -0
- data/lib/ruby-lint/definitions/core/class.rb +23 -0
- data/lib/ruby-lint/definitions/core/comparable.rb +38 -0
- data/lib/ruby-lint/definitions/core/complex.rb +195 -0
- data/lib/ruby-lint/definitions/core/condition_variable.rb +19 -0
- data/lib/ruby-lint/definitions/core/continuation.rb +8 -0
- data/lib/ruby-lint/definitions/core/data.rb +8 -0
- data/lib/ruby-lint/definitions/core/date.rb +706 -0
- data/lib/ruby-lint/definitions/core/date_time.rb +381 -0
- data/lib/ruby-lint/definitions/core/default_record_separator.rb +7 -0
- data/lib/ruby-lint/definitions/core/digest.rb +166 -0
- data/lib/ruby-lint/definitions/core/dir.rb +496 -0
- data/lib/ruby-lint/definitions/core/encoding.rb +2030 -0
- data/lib/ruby-lint/definitions/core/encoding_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/enumerable.rb +352 -0
- data/lib/ruby-lint/definitions/core/enumerator.rb +37 -0
- data/lib/ruby-lint/definitions/core/env.rb +7 -0
- data/lib/ruby-lint/definitions/core/eoferror.rb +8 -0
- data/lib/ruby-lint/definitions/core/erb.rb +304 -0
- data/lib/ruby-lint/definitions/core/errno.rb +3331 -0
- data/lib/ruby-lint/definitions/core/etc.rb +138 -0
- data/lib/ruby-lint/definitions/core/exception.rb +72 -0
- data/lib/ruby-lint/definitions/core/false.rb +7 -0
- data/lib/ruby-lint/definitions/core/false_class.rb +30 -0
- data/lib/ruby-lint/definitions/core/fatal_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/fiber.rb +35 -0
- data/lib/ruby-lint/definitions/core/fiber_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/file.rb +1277 -0
- data/lib/ruby-lint/definitions/core/file_list.rb +727 -0
- data/lib/ruby-lint/definitions/core/file_test.rb +106 -0
- data/lib/ruby-lint/definitions/core/file_utils.rb +1027 -0
- data/lib/ruby-lint/definitions/core/fixnum.rb +156 -0
- data/lib/ruby-lint/definitions/core/float.rb +307 -0
- data/lib/ruby-lint/definitions/core/float_domain_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/gc.rb +57 -0
- data/lib/ruby-lint/definitions/core/gem.rb +3161 -0
- data/lib/ruby-lint/definitions/core/hash.rb +512 -0
- data/lib/ruby-lint/definitions/core/immediate_value.rb +19 -0
- data/lib/ruby-lint/definitions/core/index_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/integer.rb +100 -0
- data/lib/ruby-lint/definitions/core/interrupt.rb +14 -0
- data/lib/ruby-lint/definitions/core/io.rb +928 -0
- data/lib/ruby-lint/definitions/core/ioerror.rb +8 -0
- data/lib/ruby-lint/definitions/core/kernel.rb +504 -0
- data/lib/ruby-lint/definitions/core/key_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/load_error.rb +28 -0
- data/lib/ruby-lint/definitions/core/local_jump_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/main.rb +25 -0
- data/lib/ruby-lint/definitions/core/marshal.rb +466 -0
- data/lib/ruby-lint/definitions/core/match_data.rb +73 -0
- data/lib/ruby-lint/definitions/core/math.rb +205 -0
- data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/method.rb +61 -0
- data/lib/ruby-lint/definitions/core/module.rb +262 -0
- data/lib/ruby-lint/definitions/core/monitor.rb +39 -0
- data/lib/ruby-lint/definitions/core/monitor_mixin.rb +59 -0
- data/lib/ruby-lint/definitions/core/mutex.rb +32 -0
- data/lib/ruby-lint/definitions/core/name_error.rb +16 -0
- data/lib/ruby-lint/definitions/core/nil.rb +7 -0
- data/lib/ruby-lint/definitions/core/nil_class.rb +46 -0
- data/lib/ruby-lint/definitions/core/no_memory_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/no_method_error.rb +18 -0
- data/lib/ruby-lint/definitions/core/not_implemented_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/numeric.rb +123 -0
- data/lib/ruby-lint/definitions/core/object.rb +31 -0
- data/lib/ruby-lint/definitions/core/object_space.rb +41 -0
- data/lib/ruby-lint/definitions/core/open_struct.rb +49 -0
- data/lib/ruby-lint/definitions/core/option_parser.rb +1355 -0
- data/lib/ruby-lint/definitions/core/precision.rb +21 -0
- data/lib/ruby-lint/definitions/core/primitive_failure.rb +8 -0
- data/lib/ruby-lint/definitions/core/proc.rb +109 -0
- data/lib/ruby-lint/definitions/core/process.rb +602 -0
- data/lib/ruby-lint/definitions/core/psych.rb +2231 -0
- data/lib/ruby-lint/definitions/core/queue.rb +44 -0
- data/lib/ruby-lint/definitions/core/rake.rb +4784 -0
- data/lib/ruby-lint/definitions/core/rake_file_utils.rb +203 -0
- data/lib/ruby-lint/definitions/core/rakeversion.rb +7 -0
- data/lib/ruby-lint/definitions/core/random.rb +38 -0
- data/lib/ruby-lint/definitions/core/range.rb +104 -0
- data/lib/ruby-lint/definitions/core/range_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/rational.rb +96 -0
- data/lib/ruby-lint/definitions/core/rb_config.rb +36 -0
- data/lib/ruby-lint/definitions/core/regexp.rb +396 -0
- data/lib/ruby-lint/definitions/core/regexp_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/rubinius.rb +16637 -0
- data/lib/ruby-lint/definitions/core/ruby_copyright.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_description.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_engine.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_lint.rb +93 -0
- data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_platform.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_release_date.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_version.rb +7 -0
- data/lib/ruby-lint/definitions/core/runtime_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/scan_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/script_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/security_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/shellwords.rb +37 -0
- data/lib/ruby-lint/definitions/core/signal.rb +37 -0
- data/lib/ruby-lint/definitions/core/signal_exception.rb +19 -0
- data/lib/ruby-lint/definitions/core/singleton.rb +37 -0
- data/lib/ruby-lint/definitions/core/sized_queue.rb +42 -0
- data/lib/ruby-lint/definitions/core/standard_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/stderr.rb +7 -0
- data/lib/ruby-lint/definitions/core/stdin.rb +7 -0
- data/lib/ruby-lint/definitions/core/stdout.rb +7 -0
- data/lib/ruby-lint/definitions/core/stop_iteration.rb +8 -0
- data/lib/ruby-lint/definitions/core/string.rb +713 -0
- data/lib/ruby-lint/definitions/core/string_io.rb +287 -0
- data/lib/ruby-lint/definitions/core/string_scanner.rb +158 -0
- data/lib/ruby-lint/definitions/core/struct.rb +357 -0
- data/lib/ruby-lint/definitions/core/syck.rb +30 -0
- data/lib/ruby-lint/definitions/core/symbol.rb +90 -0
- data/lib/ruby-lint/definitions/core/syntax_error.rb +44 -0
- data/lib/ruby-lint/definitions/core/system_call_error.rb +31 -0
- data/lib/ruby-lint/definitions/core/system_exit.rb +19 -0
- data/lib/ruby-lint/definitions/core/system_stack_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/thread.rb +209 -0
- data/lib/ruby-lint/definitions/core/thread_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/thread_group.rb +22 -0
- data/lib/ruby-lint/definitions/core/time.rb +233 -0
- data/lib/ruby-lint/definitions/core/toplevel_binding.rb +7 -0
- data/lib/ruby-lint/definitions/core/true.rb +7 -0
- data/lib/ruby-lint/definitions/core/true_class.rb +30 -0
- data/lib/ruby-lint/definitions/core/type_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/unbound_method.rb +51 -0
- data/lib/ruby-lint/definitions/core/unmarshalable.rb +13 -0
- data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/weak_ref.rb +42 -0
- data/lib/ruby-lint/definitions/core/zero_division_error.rb +8 -0
- data/lib/ruby-lint/definitions_builder.rb +692 -0
- data/lib/ruby-lint/extensions/string.rb +15 -0
- data/lib/ruby-lint/helper/constant_paths.rb +41 -0
- data/lib/ruby-lint/helper/conversion.rb +33 -0
- data/lib/ruby-lint/helper/current_scope.rb +98 -0
- data/lib/ruby-lint/helper/methods.rb +91 -0
- data/lib/ruby-lint/inspector.rb +191 -0
- data/lib/ruby-lint/iterator.rb +187 -127
- data/lib/ruby-lint/node.rb +107 -0
- data/lib/ruby-lint/parser.rb +510 -1137
- data/lib/ruby-lint/parser_error.rb +15 -27
- data/lib/ruby-lint/presenter/json.rb +19 -0
- data/lib/ruby-lint/presenter/text.rb +37 -0
- data/lib/ruby-lint/report.rb +95 -53
- data/lib/ruby-lint/report/entry.rb +71 -0
- data/lib/ruby-lint/template/definition.erb +24 -0
- data/lib/ruby-lint/template/scope.rb +25 -0
- data/lib/ruby-lint/variable_predicates.rb +109 -0
- data/lib/ruby-lint/version.rb +1 -1
- data/ruby-lint.gemspec +19 -8
- data/spec/helper.rb +10 -2
- data/spec/ruby-lint/analyze/argument_amount.rb +91 -0
- data/spec/ruby-lint/analyze/shadowing_variables.rb +69 -14
- data/spec/ruby-lint/analyze/undefined_methods.rb +174 -0
- data/spec/ruby-lint/analyze/undefined_variables.rb +70 -179
- data/spec/ruby-lint/analyze/unused_variables.rb +63 -183
- data/spec/ruby-lint/configuration.rb +15 -0
- data/spec/ruby-lint/constant_loader.rb +32 -0
- data/spec/ruby-lint/definition/dsl.rb +142 -0
- data/spec/ruby-lint/definition/method_calls.rb +26 -0
- data/spec/ruby-lint/definition/ruby_method.rb +175 -0
- data/spec/ruby-lint/definition/ruby_object.rb +228 -0
- data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +71 -0
- data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +65 -0
- data/spec/ruby-lint/definitions_builder/assignments/objects.rb +23 -0
- data/spec/ruby-lint/definitions_builder/assignments/optional.rb +22 -0
- data/spec/ruby-lint/definitions_builder/assignments/return_values.rb +78 -0
- data/spec/ruby-lint/definitions_builder/assignments/variables.rb +71 -0
- data/spec/ruby-lint/definitions_builder/associate_nodes.rb +17 -0
- data/spec/ruby-lint/definitions_builder/blocks.rb +40 -0
- data/spec/ruby-lint/definitions_builder/classes.rb +230 -0
- data/spec/ruby-lint/definitions_builder/for.rb +16 -0
- data/spec/ruby-lint/definitions_builder/methods.rb +147 -0
- data/spec/ruby-lint/definitions_builder/modules.rb +175 -0
- data/spec/ruby-lint/definitions_builder/reference_amount.rb +31 -0
- data/spec/ruby-lint/definitions_builder/unused.rb +15 -0
- data/spec/ruby-lint/extensions/string.rb +7 -0
- data/spec/ruby-lint/iterator.rb +42 -417
- data/spec/ruby-lint/node.rb +38 -0
- data/spec/ruby-lint/parser/assignments.rb +225 -0
- data/spec/ruby-lint/parser/classes.rb +80 -122
- data/spec/ruby-lint/parser/errors.rb +7 -14
- data/spec/ruby-lint/parser/metadata.rb +17 -0
- data/spec/ruby-lint/parser/method_definitions.rb +111 -0
- data/spec/ruby-lint/parser/methods.rb +184 -216
- data/spec/ruby-lint/parser/modules.rb +54 -33
- data/spec/ruby-lint/parser/operators.rb +30 -65
- data/spec/ruby-lint/parser/statements/begin.rb +55 -0
- data/spec/ruby-lint/parser/statements/case.rb +34 -0
- data/spec/ruby-lint/parser/statements/defined.rb +11 -0
- data/spec/ruby-lint/parser/statements/for.rb +34 -0
- data/spec/ruby-lint/parser/statements/if.rb +46 -0
- data/spec/ruby-lint/parser/statements/return.rb +14 -0
- data/spec/ruby-lint/parser/statements/super.rb +49 -0
- data/spec/ruby-lint/parser/statements/unless.rb +42 -0
- data/spec/ruby-lint/parser/statements/until.rb +25 -0
- data/spec/ruby-lint/parser/statements/while.rb +25 -0
- data/spec/ruby-lint/parser/statements/yield.rb +18 -0
- data/spec/ruby-lint/parser/types/arrays.rb +47 -0
- data/spec/ruby-lint/parser/types/booleans.rb +11 -0
- data/spec/ruby-lint/parser/types/constants.rb +32 -0
- data/spec/ruby-lint/parser/types/hashes.rb +55 -0
- data/spec/ruby-lint/parser/types/nil.rb +7 -0
- data/spec/ruby-lint/parser/types/numbers.rb +11 -0
- data/spec/ruby-lint/parser/types/procs.rb +11 -0
- data/spec/ruby-lint/parser/types/ranges.rb +11 -0
- data/spec/ruby-lint/parser/types/regexp.rb +27 -0
- data/spec/ruby-lint/parser/types/strings.rb +44 -0
- data/spec/ruby-lint/parser/types/symbols.rb +15 -0
- data/spec/ruby-lint/presenter/json.rb +31 -0
- data/spec/ruby-lint/presenter/text.rb +22 -0
- data/spec/ruby-lint/report.rb +45 -15
- data/spec/ruby-lint/report/entry.rb +24 -0
- data/spec/support/bacon.rb +33 -0
- data/spec/support/building.rb +43 -0
- data/spec/support/definitions.rb +23 -0
- data/spec/support/parsing.rb +23 -0
- data/spec/support/simplecov.rb +16 -0
- data/task/build.rake +9 -0
- data/task/checksum.rake +13 -0
- data/task/coverage.rake +6 -0
- data/task/doc.rake +5 -0
- data/task/generate.rake +34 -0
- data/task/graphviz.rake +12 -0
- data/task/stdlib.rake +2 -9
- data/task/tag.rake +6 -0
- metadata +337 -68
- metadata.gz.asc +17 -0
- data/.rbenv-version +0 -1
- data/lib/ruby-lint/analyze/coding_style.rb +0 -407
- data/lib/ruby-lint/analyze/definitions.rb +0 -244
- data/lib/ruby-lint/analyze/method_validation.rb +0 -104
- data/lib/ruby-lint/callback.rb +0 -67
- data/lib/ruby-lint/constant_importer.rb +0 -112
- data/lib/ruby-lint/definition.rb +0 -230
- data/lib/ruby-lint/formatter/text.rb +0 -54
- data/lib/ruby-lint/helper/definition_resolver.rb +0 -143
- data/lib/ruby-lint/helper/scoping.rb +0 -138
- data/lib/ruby-lint/options.rb +0 -58
- data/lib/ruby-lint/token/assignment_token.rb +0 -35
- data/lib/ruby-lint/token/begin_rescue_token.rb +0 -57
- data/lib/ruby-lint/token/block_token.rb +0 -26
- data/lib/ruby-lint/token/case_token.rb +0 -44
- data/lib/ruby-lint/token/class_token.rb +0 -24
- data/lib/ruby-lint/token/keyword_token.rb +0 -43
- data/lib/ruby-lint/token/method_definition_token.rb +0 -64
- data/lib/ruby-lint/token/method_token.rb +0 -56
- data/lib/ruby-lint/token/parameters_token.rb +0 -99
- data/lib/ruby-lint/token/regexp_token.rb +0 -15
- data/lib/ruby-lint/token/statement_token.rb +0 -69
- data/lib/ruby-lint/token/token.rb +0 -176
- data/lib/ruby-lint/token/variable_token.rb +0 -18
- data/spec/benchmarks/memory.rb +0 -52
- data/spec/benchmarks/parse_parser.rb +0 -16
- data/spec/fixtures/stdlib/un.rb +0 -348
- data/spec/ruby-lint/analyze/coding_style.rb +0 -224
- data/spec/ruby-lint/analyze/complex/un.rb +0 -29
- data/spec/ruby-lint/analyze/definitions/classes.rb +0 -114
- data/spec/ruby-lint/analyze/definitions/methods.rb +0 -91
- data/spec/ruby-lint/analyze/definitions/modules.rb +0 -207
- data/spec/ruby-lint/analyze/definitions/variables.rb +0 -103
- data/spec/ruby-lint/analyze/method_validation.rb +0 -177
- data/spec/ruby-lint/callback.rb +0 -28
- data/spec/ruby-lint/constant_importer.rb +0 -27
- data/spec/ruby-lint/definition.rb +0 -96
- data/spec/ruby-lint/formatter/text.rb +0 -21
- data/spec/ruby-lint/parser/arrays.rb +0 -147
- data/spec/ruby-lint/parser/expander_assignments.rb +0 -183
- data/spec/ruby-lint/parser/hashes.rb +0 -136
- data/spec/ruby-lint/parser/keywords.rb +0 -89
- data/spec/ruby-lint/parser/objects.rb +0 -39
- data/spec/ruby-lint/parser/procs.rb +0 -113
- data/spec/ruby-lint/parser/ranges.rb +0 -49
- data/spec/ruby-lint/parser/regexp.rb +0 -31
- data/spec/ruby-lint/parser/scalars.rb +0 -93
- data/spec/ruby-lint/parser/statements.rb +0 -591
- data/spec/ruby-lint/parser/variables.rb +0 -230
data/lib/ruby-lint/cli.rb
CHANGED
|
@@ -1,167 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
opts.separator ''
|
|
26
|
-
opts.separator 'Analyzers:'
|
|
27
|
-
opts.separator hash_to_list(@analyzers)
|
|
28
|
-
|
|
29
|
-
opts.separator ''
|
|
30
|
-
opts.separator 'Formatters:'
|
|
31
|
-
opts.separator hash_to_list(@formatters)
|
|
32
|
-
|
|
33
|
-
opts.separator ''
|
|
34
|
-
opts.separator 'Reporting Levels:'
|
|
35
|
-
opts.separator " error\n warning\n info"
|
|
36
|
-
|
|
37
|
-
opts.separator ''
|
|
38
|
-
opts.separator 'Options:'
|
|
39
|
-
|
|
40
|
-
opts.on(
|
|
41
|
-
'-f',
|
|
42
|
-
'--formatter=VALUE',
|
|
43
|
-
'The formatter to use',
|
|
44
|
-
String
|
|
45
|
-
) do |formatter|
|
|
46
|
-
if @formatters.key?(formatter)
|
|
47
|
-
RubyLint.options.formatter = @formatters[formatter]
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
opts.on(
|
|
52
|
-
'-l',
|
|
53
|
-
'--levels=VALUE',
|
|
54
|
-
'The reporting levels to enable',
|
|
55
|
-
Array
|
|
56
|
-
) do |levels|
|
|
57
|
-
RubyLint.options.levels = levels.map { |level| level.to_sym }
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
opts.on(
|
|
61
|
-
'-a',
|
|
62
|
-
'--analyzers=VALUE',
|
|
63
|
-
'The analyzers to enable',
|
|
64
|
-
Array
|
|
65
|
-
) do |names|
|
|
66
|
-
analyzers = Options::REQUIRED_ANALYZERS.dup
|
|
67
|
-
|
|
68
|
-
names.each do |name|
|
|
69
|
-
const = @analyzers[name]
|
|
70
|
-
|
|
71
|
-
if const and !analyzers.include?(const)
|
|
72
|
-
analyzers << const
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
RubyLint.options.analyzers = analyzers
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
opts.on('-h', '--help', 'Shows this help message') do
|
|
80
|
-
puts @option_parser
|
|
81
|
-
exit
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
opts.on('-v', '--version', 'Shows the current version') do
|
|
85
|
-
version
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
##
|
|
91
|
-
# Runs RubyLint.
|
|
92
|
-
#
|
|
93
|
-
# @param [Array] argv Array of commandline parameters.
|
|
94
|
-
#
|
|
95
|
-
def run(argv = ARGV)
|
|
96
|
-
@option_parser.parse!(argv)
|
|
97
|
-
|
|
98
|
-
abort 'You have to specify a file to analyze' if argv.empty?
|
|
99
|
-
|
|
100
|
-
argv.each do |file|
|
|
101
|
-
abort "The file #{file} is not valid" unless File.file?(file)
|
|
102
|
-
|
|
103
|
-
code = File.read(file, File.size(file))
|
|
104
|
-
tokens = Parser.new(code, file).parse
|
|
105
|
-
report = Report.new(file, RubyLint.options.levels)
|
|
106
|
-
iterator = Iterator.new(report)
|
|
107
|
-
formatter = RubyLint.options.formatter.new
|
|
108
|
-
|
|
109
|
-
RubyLint.options.analyzers.each { |const| iterator.bind(const) }
|
|
110
|
-
|
|
111
|
-
iterator.run(tokens)
|
|
112
|
-
|
|
113
|
-
output = formatter.format(report)
|
|
114
|
-
|
|
115
|
-
puts output unless output.empty?
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
##
|
|
120
|
-
# Shows the current version of RubyLint.
|
|
121
|
-
#
|
|
122
|
-
def version
|
|
123
|
-
puts "RubyLint version #{RubyLint::VERSION} running on #{RUBY_DESCRIPTION}"
|
|
124
|
-
exit
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
private
|
|
128
|
-
|
|
129
|
-
##
|
|
130
|
-
# Returns a hash containing various short names and the constants to use.
|
|
131
|
-
#
|
|
132
|
-
# @param [Class] constant The constant to use.
|
|
133
|
-
# @return [Hash]
|
|
134
|
-
#
|
|
135
|
-
def constant_short_names(constant)
|
|
136
|
-
hash = {}
|
|
137
|
-
|
|
138
|
-
constant.constants.sort.each do |const|
|
|
139
|
-
name = const.to_s.gsub(/([a-z]+)([A-Z]+)/, '\\1_\\2').downcase
|
|
140
|
-
hash[name] = constant.const_get(const)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
return hash
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
##
|
|
147
|
-
# Returns a string containing the names and descriptions of various
|
|
148
|
-
# constants formatted as a list.
|
|
149
|
-
#
|
|
150
|
-
# @param [Hash] hash
|
|
151
|
-
# @return [String]
|
|
152
|
-
#
|
|
153
|
-
def hash_to_list(hash)
|
|
154
|
-
longest = hash.keys.sort { |l, r| l.length <=> r.length }[-1].length
|
|
155
|
-
longest = longest > 32 ? longest : 32
|
|
156
|
-
list = []
|
|
157
|
-
|
|
158
|
-
hash.each do |name, const|
|
|
159
|
-
description = const.const_get(:DESCRIPTION)
|
|
160
|
-
|
|
161
|
-
list << " %-#{longest}s %s" % [name, description]
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
return list.join("\n")
|
|
165
|
-
end
|
|
166
|
-
end # CLI
|
|
167
|
-
end # RubyLint
|
|
1
|
+
RubyLint::Configuration.register_names 'analysis' do |names|
|
|
2
|
+
names['argument_amount'] = RubyLint::Analyze::ArgumentAmount
|
|
3
|
+
names['shadowing_variables'] = RubyLint::Analyze::ShadowingVariables
|
|
4
|
+
names['undefined_methods'] = RubyLint::Analyze::UndefinedMethods
|
|
5
|
+
names['undefined_variables'] = RubyLint::Analyze::UndefinedVariables
|
|
6
|
+
names['unused_variables'] = RubyLint::Analyze::UnusedVariables
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
RubyLint::Configuration.register_names 'presenters' do |names|
|
|
10
|
+
names['text'] = RubyLint::Presenter::Text
|
|
11
|
+
names['json'] = RubyLint::Presenter::JSON
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
RubyLint::Configuration.register_names 'levels' do |names|
|
|
15
|
+
RubyLint::Report.levels.each do |level|
|
|
16
|
+
names[level.to_s] = level
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
require 'slop'
|
|
21
|
+
require_relative 'cli/base'
|
|
22
|
+
require_relative 'cli/analyze'
|
|
23
|
+
require_relative 'cli/ast'
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
RubyLint::CLI.options.command :analyze do
|
|
2
|
+
banner 'Usage: ruby-lint analyze [FILES] [OPTIONS]'
|
|
3
|
+
description 'Analyzes the source code of Ruby files'
|
|
4
|
+
|
|
5
|
+
separator <<-EOF.chomp
|
|
6
|
+
|
|
7
|
+
About:
|
|
8
|
+
|
|
9
|
+
This command analyses the source code of a Ruby file and presents a report
|
|
10
|
+
containing information such as errors about invalid code, warnings and
|
|
11
|
+
informational messages.
|
|
12
|
+
|
|
13
|
+
Configuration:
|
|
14
|
+
|
|
15
|
+
When this command is executed it will try to load a configuration file in
|
|
16
|
+
one of the following two locations (in this order):
|
|
17
|
+
|
|
18
|
+
* $PWD/ruby-lint.rb
|
|
19
|
+
* ~/.ruby-lint.rb
|
|
20
|
+
|
|
21
|
+
Only the first existing configuration file is loaded.
|
|
22
|
+
|
|
23
|
+
These configuration files can be used for specifying the presenter, reporting
|
|
24
|
+
levels and various other options.
|
|
25
|
+
|
|
26
|
+
You can also configure various parts using the supplied commandline options.
|
|
27
|
+
For example, to use the JSON presenter you'd run the following:
|
|
28
|
+
|
|
29
|
+
$ ruby-lint analyze ./test_file.rb --presenter=json
|
|
30
|
+
|
|
31
|
+
Analysis Classes:
|
|
32
|
+
|
|
33
|
+
#{RubyLint::CLI.format_names('analysis')}
|
|
34
|
+
|
|
35
|
+
Presenters:
|
|
36
|
+
|
|
37
|
+
#{RubyLint::CLI.format_names('presenters')}
|
|
38
|
+
|
|
39
|
+
Reporting Levels:
|
|
40
|
+
|
|
41
|
+
#{RubyLint::CLI.format_names('levels')}
|
|
42
|
+
|
|
43
|
+
Examples:
|
|
44
|
+
|
|
45
|
+
To analyze a single file you can run the following command:
|
|
46
|
+
|
|
47
|
+
$ ruby-lint analyze ./test_file.rb
|
|
48
|
+
|
|
49
|
+
You can also specify multiple files:
|
|
50
|
+
|
|
51
|
+
$ ruby-lint analyze first_file.rb second_file.rb
|
|
52
|
+
EOF
|
|
53
|
+
|
|
54
|
+
separator RubyLint::CLI::OPTIONS_HEADER
|
|
55
|
+
|
|
56
|
+
RubyLint::CLI.help_option(self)
|
|
57
|
+
|
|
58
|
+
on :l=, :levels=, 'The reporting levels to enable', :as => Array
|
|
59
|
+
on :p=, :presenter=, 'The presenter to use', :as => String
|
|
60
|
+
on :a=, :analysis=, 'The analysis classes to use', :as => Array
|
|
61
|
+
|
|
62
|
+
run do |opts, args|
|
|
63
|
+
abort 'You must specify at least one file to analyze' if args.empty?
|
|
64
|
+
|
|
65
|
+
files = RubyLint::CLI.existing_files(args)
|
|
66
|
+
|
|
67
|
+
RubyLint.load_configuration
|
|
68
|
+
|
|
69
|
+
RubyLint.configuration.set_reporting_levels(opts[:l]) if opts[:l]
|
|
70
|
+
RubyLint.configuration.set_presenter(opts[:p]) if opts[:p]
|
|
71
|
+
RubyLint.configuration.set_analysis(opts[:a]) if opts[:a]
|
|
72
|
+
|
|
73
|
+
files.each do |file|
|
|
74
|
+
ast = RubyLint::Parser.new(File.read(file), file).parse
|
|
75
|
+
|
|
76
|
+
RubyLint::ConstantLoader.new.iterate(ast)
|
|
77
|
+
|
|
78
|
+
report = RubyLint.configuration.report
|
|
79
|
+
presenter = RubyLint.configuration.presenter.new
|
|
80
|
+
defs_builder = RubyLint::DefinitionsBuilder.new
|
|
81
|
+
|
|
82
|
+
defs_builder.iterate(ast)
|
|
83
|
+
|
|
84
|
+
RubyLint.configuration.analysis.each do |constant|
|
|
85
|
+
instance = constant.new(
|
|
86
|
+
:report => report,
|
|
87
|
+
:definitions => defs_builder.options[:definitions],
|
|
88
|
+
:node_definitions => defs_builder.options[:node_definitions]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
instance.iterate(ast)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
output = presenter.present(report)
|
|
95
|
+
|
|
96
|
+
puts output unless output.empty?
|
|
97
|
+
end
|
|
98
|
+
end # run do |opts, args|
|
|
99
|
+
end # RubyLint::CLI.options.command
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
RubyLint::CLI.options.command :ast do
|
|
2
|
+
banner 'Usage: ruby-lint ast [FILE] [OPTIONS]'
|
|
3
|
+
description 'Shows the AST of a Ruby file'
|
|
4
|
+
|
|
5
|
+
separator <<-EOF.chomp
|
|
6
|
+
|
|
7
|
+
About:
|
|
8
|
+
|
|
9
|
+
This command displays the raw AST of a Ruby file. Unlike the `analyze`
|
|
10
|
+
command this particular one only takes a single file.
|
|
11
|
+
|
|
12
|
+
The output is a set of S expressions generated by the ruby-lint parser
|
|
13
|
+
(RubyLint::Parser).
|
|
14
|
+
|
|
15
|
+
Examples:
|
|
16
|
+
|
|
17
|
+
Displaying the AST:
|
|
18
|
+
|
|
19
|
+
$ ruby-lint ast ./test_file.rb
|
|
20
|
+
EOF
|
|
21
|
+
|
|
22
|
+
separator RubyLint::CLI::OPTIONS_HEADER
|
|
23
|
+
|
|
24
|
+
RubyLint::CLI.help_option(self)
|
|
25
|
+
|
|
26
|
+
run do |opts, args|
|
|
27
|
+
file = args[0]
|
|
28
|
+
|
|
29
|
+
if !file or !File.file?(file)
|
|
30
|
+
abort 'You must specify an existing file'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
puts RubyLint::Parser.new(File.read(file), file).parse.inspect
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module CLI
|
|
3
|
+
##
|
|
4
|
+
# Hash containing configuration options for Slop.
|
|
5
|
+
#
|
|
6
|
+
# @return [Hash]
|
|
7
|
+
#
|
|
8
|
+
SLOP_OPTIONS = {
|
|
9
|
+
:strict => true,
|
|
10
|
+
:banner => 'Usage: ruby-lint [COMMAND] [OPTIONS]'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# The header to use for separating options with other bits of information
|
|
15
|
+
# in help messages.
|
|
16
|
+
#
|
|
17
|
+
# @return [String]
|
|
18
|
+
#
|
|
19
|
+
OPTIONS_HEADER = "\nOptions:\n"
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
# Returns an Array containing the file paths that exist. If a non existing
|
|
23
|
+
# file is encountered `abort` is called.
|
|
24
|
+
#
|
|
25
|
+
# @param [Array] files
|
|
26
|
+
# @return [Array]
|
|
27
|
+
#
|
|
28
|
+
def self.existing_files(files)
|
|
29
|
+
existing = []
|
|
30
|
+
|
|
31
|
+
files.each do |file|
|
|
32
|
+
file = File.expand_path(file)
|
|
33
|
+
|
|
34
|
+
if File.file?(file)
|
|
35
|
+
existing << file
|
|
36
|
+
else
|
|
37
|
+
abort "The file #{file} does not exist"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
return existing
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# Returns a String containing a list of names as registered in
|
|
46
|
+
# {RubyLint::Configuration.names}.
|
|
47
|
+
#
|
|
48
|
+
# @param [String] scope
|
|
49
|
+
# @see RubyLint::Configuration.names
|
|
50
|
+
# @return [String]
|
|
51
|
+
#
|
|
52
|
+
def self.format_names(scope)
|
|
53
|
+
return "* #{Configuration.names[scope].keys.sort.join("\n * ")}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# Starts the CLI.
|
|
58
|
+
#
|
|
59
|
+
def self.run
|
|
60
|
+
options.parse
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
# @return [Slop]
|
|
65
|
+
#
|
|
66
|
+
def self.options
|
|
67
|
+
return @options ||= default_options
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# @return [Slop]
|
|
72
|
+
#
|
|
73
|
+
def self.default_options
|
|
74
|
+
return Slop.new(SLOP_OPTIONS) do
|
|
75
|
+
separator OPTIONS_HEADER
|
|
76
|
+
|
|
77
|
+
CLI.help_option(self)
|
|
78
|
+
|
|
79
|
+
on :v, :version, 'Shows the current version' do
|
|
80
|
+
puts CLI.version_information
|
|
81
|
+
exit
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
run do |opts, args|
|
|
85
|
+
if args.empty?
|
|
86
|
+
puts self
|
|
87
|
+
exit
|
|
88
|
+
else
|
|
89
|
+
CLI.options.commands['analyze'].parse(args)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
##
|
|
96
|
+
# Adds a `-h/--help` option for a command. This method should be executed
|
|
97
|
+
# in the context of a Slop command.
|
|
98
|
+
#
|
|
99
|
+
# @param [Mixed] command
|
|
100
|
+
#
|
|
101
|
+
def self.help_option(command)
|
|
102
|
+
command.instance_eval do
|
|
103
|
+
on :h, :help, 'Shows this help message' do
|
|
104
|
+
puts self
|
|
105
|
+
exit
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
##
|
|
111
|
+
# Returns a String containing information about the current ruby-lint
|
|
112
|
+
# version and platform.
|
|
113
|
+
#
|
|
114
|
+
# @return [String]
|
|
115
|
+
#
|
|
116
|
+
def self.version_information
|
|
117
|
+
return "ruby-lint v#{VERSION} on #{RUBY_DESCRIPTION}"
|
|
118
|
+
end
|
|
119
|
+
end # CLI
|
|
120
|
+
end # RubyLint
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
##
|
|
3
|
+
# The Configuration class is used for storing configuration information used
|
|
4
|
+
# when running the CLI of ruby-lint. It contains information such as the
|
|
5
|
+
# reporting levels, the formatter to use and so on.
|
|
6
|
+
#
|
|
7
|
+
# @!attribute [rw] presenter
|
|
8
|
+
# @return [RubyLint::Presenter] The presenter to use for displaying reports.
|
|
9
|
+
# @!attribute [rw] report_levels
|
|
10
|
+
# @return [Array] The reporting levels to use.
|
|
11
|
+
# @!attribute [rw] analysis
|
|
12
|
+
# @return [Array] The analysis classes to enable.
|
|
13
|
+
#
|
|
14
|
+
class Configuration
|
|
15
|
+
attr_accessor :presenter, :report_levels, :analysis
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Provides a small block based DSL for registering multiple names.
|
|
19
|
+
#
|
|
20
|
+
# @param [String] scope The scope to store the names under.
|
|
21
|
+
# @see RubyLint::Configuration.names
|
|
22
|
+
#
|
|
23
|
+
def self.register_names(scope)
|
|
24
|
+
hash = {}
|
|
25
|
+
|
|
26
|
+
yield hash
|
|
27
|
+
|
|
28
|
+
names[scope] = hash
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
# Returns a Hash used for storing values and their human readable names.
|
|
33
|
+
# This Hash is primarily used for the CLI.
|
|
34
|
+
#
|
|
35
|
+
# @return [Hash]
|
|
36
|
+
#
|
|
37
|
+
def self.names
|
|
38
|
+
return @names ||= {}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
##
|
|
42
|
+
# @param [Hash] options
|
|
43
|
+
#
|
|
44
|
+
def initialize(options = {})
|
|
45
|
+
options.each do |key, value|
|
|
46
|
+
instance_variable_set("@#{key}", value)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
@presenter ||= RubyLint::Presenter::Text
|
|
50
|
+
@report_levels ||= Report::DEFAULT_LEVELS
|
|
51
|
+
@analysis ||= default_analysis_classes
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
##
|
|
55
|
+
# @return [Array]
|
|
56
|
+
#
|
|
57
|
+
def default_analysis_classes
|
|
58
|
+
return Analyze.constants.map do |const|
|
|
59
|
+
Analyze.const_get(const)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
# Returns a report with the report levels set based on this configuration
|
|
65
|
+
# instance.
|
|
66
|
+
#
|
|
67
|
+
# @return [RubyLint::Report]
|
|
68
|
+
#
|
|
69
|
+
def report
|
|
70
|
+
return Report.new(report_levels)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
##
|
|
74
|
+
# Set the reporting levels based on a set of CLI options.
|
|
75
|
+
#
|
|
76
|
+
# @param [Array] levels
|
|
77
|
+
#
|
|
78
|
+
def set_reporting_levels(levels)
|
|
79
|
+
self.report_levels = []
|
|
80
|
+
available = self.class.names['levels']
|
|
81
|
+
|
|
82
|
+
levels.each do |level|
|
|
83
|
+
report_levels << available[level] if available[level]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
##
|
|
88
|
+
# Sets the presenter based on a set of CLI options.
|
|
89
|
+
#
|
|
90
|
+
# @param [String] name
|
|
91
|
+
#
|
|
92
|
+
def set_presenter(name)
|
|
93
|
+
if self.class.names['presenters'][name]
|
|
94
|
+
self.presenter = self.class.names['presenters'][name]
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
##
|
|
99
|
+
# Sets the analysis classes based on a set of CLI options.
|
|
100
|
+
#
|
|
101
|
+
# @param [Array] names
|
|
102
|
+
#
|
|
103
|
+
def set_analysis(names)
|
|
104
|
+
self.analysis = []
|
|
105
|
+
available = self.class.names['analysis']
|
|
106
|
+
|
|
107
|
+
names.each do |name|
|
|
108
|
+
self.analysis << available[name] if available[name]
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end # Configuration
|
|
112
|
+
end # RubyLint
|