ruby-lint 0.0.4 → 0.0.5
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.asc +17 -0
- data.tar.gz.asc +14 -14
- data/.ruby-version +1 -0
- data/.travis.yml +0 -1
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +41 -0
- data/MANIFEST +99 -66
- data/README.md +36 -10
- data/Rakefile +6 -0
- data/checksum/ruby-lint-0.0.4.gem.sha512 +1 -0
- data/doc/changelog.md +94 -0
- data/lib/ruby-lint.rb +18 -1
- data/lib/ruby-lint/analysis/argument_amount.rb +43 -10
- data/lib/ruby-lint/analysis/base.rb +23 -17
- data/lib/ruby-lint/analysis/pedantics.rb +3 -1
- data/lib/ruby-lint/analysis/undefined_methods.rb +48 -10
- data/lib/ruby-lint/analysis/unused_variables.rb +27 -5
- data/lib/ruby-lint/ast/node.rb +10 -0
- data/lib/ruby-lint/cli/analyze.rb +22 -4
- data/lib/ruby-lint/cli/base.rb +8 -2
- data/lib/ruby-lint/configuration.rb +43 -4
- data/lib/ruby-lint/definition/constant_proxy.rb +10 -1
- data/lib/ruby-lint/definition/ruby_method.rb +45 -31
- data/lib/ruby-lint/definition/ruby_object.rb +56 -15
- data/lib/ruby-lint/definition_builder/base.rb +4 -0
- data/lib/ruby-lint/definition_builder/primitive.rb +1 -1
- data/lib/ruby-lint/definition_builder/ruby_array.rb +1 -1
- data/lib/ruby-lint/definition_builder/ruby_block.rb +1 -0
- data/lib/ruby-lint/definition_builder/ruby_class.rb +1 -1
- data/lib/ruby-lint/definition_builder/ruby_hash.rb +1 -1
- data/lib/ruby-lint/definition_builder/ruby_module.rb +3 -1
- data/lib/ruby-lint/definition_generator.rb +15 -7
- data/lib/ruby-lint/definitions/core/arg0.rb +1 -1
- data/lib/ruby-lint/definitions/core/argf.rb +1 -1
- data/lib/ruby-lint/definitions/core/argument_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/argv.rb +1 -1
- data/lib/ruby-lint/definitions/core/array.rb +6 -6
- data/lib/ruby-lint/definitions/core/autoload.rb +2 -2
- data/lib/ruby-lint/definitions/core/basic_object.rb +8 -12
- data/lib/ruby-lint/definitions/core/bignum.rb +2 -2
- data/lib/ruby-lint/definitions/core/binding.rb +2 -2
- data/lib/ruby-lint/definitions/core/class.rb +2 -2
- data/lib/ruby-lint/definitions/core/comparable.rb +1 -1
- data/lib/ruby-lint/definitions/core/complex.rb +4 -4
- data/lib/ruby-lint/definitions/core/condition_variable.rb +2 -2
- data/lib/ruby-lint/definitions/core/continuation.rb +2 -2
- data/lib/ruby-lint/definitions/core/data.rb +2 -2
- data/lib/ruby-lint/definitions/core/date.rb +34 -34
- data/lib/ruby-lint/definitions/core/date_time.rb +26 -26
- data/lib/ruby-lint/definitions/core/default_record_separator.rb +1 -1
- data/lib/ruby-lint/definitions/core/digest.rb +14 -14
- data/lib/ruby-lint/definitions/core/dir.rb +34 -34
- data/lib/ruby-lint/definitions/core/encoding.rb +237 -237
- data/lib/ruby-lint/definitions/core/encoding_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/enumerable.rb +15 -15
- data/lib/ruby-lint/definitions/core/enumerator.rb +2 -2
- data/lib/ruby-lint/definitions/core/env.rb +1 -1
- data/lib/ruby-lint/definitions/core/eoferror.rb +2 -2
- data/lib/ruby-lint/definitions/core/erb.rb +30 -23
- data/lib/ruby-lint/definitions/core/errno.rb +525 -525
- data/lib/ruby-lint/definitions/core/etc.rb +6 -6
- data/lib/ruby-lint/definitions/core/exception.rb +2 -2
- data/lib/ruby-lint/definitions/core/false.rb +1 -1
- data/lib/ruby-lint/definitions/core/false_class.rb +2 -2
- data/lib/ruby-lint/definitions/core/fatal_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/fiber.rb +2 -2
- data/lib/ruby-lint/definitions/core/fiber_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/file.rb +68 -68
- data/lib/ruby-lint/definitions/core/file_list.rb +2 -2
- data/lib/ruby-lint/definitions/core/file_test.rb +1 -1
- data/lib/ruby-lint/definitions/core/file_utils.rb +16 -16
- data/lib/ruby-lint/definitions/core/fixnum.rb +4 -4
- data/lib/ruby-lint/definitions/core/float.rb +16 -16
- data/lib/ruby-lint/definitions/core/float_domain_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/gc.rb +2 -2
- data/lib/ruby-lint/definitions/core/gem.rb +119 -119
- data/lib/ruby-lint/definitions/core/hash.rb +14 -14
- data/lib/ruby-lint/definitions/core/immediate_value.rb +1 -1
- data/lib/ruby-lint/definitions/core/index_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/integer.rb +2 -2
- data/lib/ruby-lint/definitions/core/interrupt.rb +2 -2
- data/lib/ruby-lint/definitions/core/io.rb +38 -38
- data/lib/ruby-lint/definitions/core/ioerror.rb +2 -2
- data/lib/ruby-lint/definitions/core/kernel.rb +113 -60
- data/lib/ruby-lint/definitions/core/key_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/load_error.rb +6 -6
- data/lib/ruby-lint/definitions/core/local_jump_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/marshal.rb +35 -35
- data/lib/ruby-lint/definitions/core/match_data.rb +2 -2
- data/lib/ruby-lint/definitions/core/math.rb +7 -7
- data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/method.rb +2 -2
- data/lib/ruby-lint/definitions/core/module.rb +39 -3
- data/lib/ruby-lint/definitions/core/monitor.rb +4 -4
- data/lib/ruby-lint/definitions/core/monitor_mixin.rb +5 -5
- data/lib/ruby-lint/definitions/core/mutex.rb +2 -2
- data/lib/ruby-lint/definitions/core/name_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/nil.rb +1 -1
- data/lib/ruby-lint/definitions/core/nil_class.rb +2 -2
- data/lib/ruby-lint/definitions/core/no_memory_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/no_method_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/not_implemented_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/numeric.rb +2 -2
- data/lib/ruby-lint/definitions/core/object.rb +2 -2
- data/lib/ruby-lint/definitions/core/object_space.rb +1 -1
- data/lib/ruby-lint/definitions/core/open_struct.rb +3 -3
- data/lib/ruby-lint/definitions/core/option_parser.rb +83 -83
- data/lib/ruby-lint/definitions/core/precision.rb +1 -1
- data/lib/ruby-lint/definitions/core/primitive_failure.rb +2 -2
- data/lib/ruby-lint/definitions/core/proc.rb +2 -2
- data/lib/ruby-lint/definitions/core/process.rb +29 -29
- data/lib/ruby-lint/definitions/core/queue.rb +2 -2
- data/lib/ruby-lint/definitions/core/rake.rb +117 -117
- data/lib/ruby-lint/definitions/core/rake_file_utils.rb +1 -1
- data/lib/ruby-lint/definitions/core/rakeversion.rb +1 -1
- data/lib/ruby-lint/definitions/core/random.rb +2 -2
- data/lib/ruby-lint/definitions/core/range.rb +4 -4
- data/lib/ruby-lint/definitions/core/range_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/rational.rb +2 -2
- data/lib/ruby-lint/definitions/core/rb_config.rb +3 -3
- data/lib/ruby-lint/definitions/core/regexp.rb +28 -28
- data/lib/ruby-lint/definitions/core/regexp_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/ruby_copyright.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_description.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_engine.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_platform.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_release_date.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_version.rb +1 -1
- data/lib/ruby-lint/definitions/core/runtime_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/scan_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/script_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/security_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/shellwords.rb +1 -1
- data/lib/ruby-lint/definitions/core/signal.rb +3 -3
- data/lib/ruby-lint/definitions/core/signal_exception.rb +2 -2
- data/lib/ruby-lint/definitions/core/singleton.rb +2 -2
- data/lib/ruby-lint/definitions/core/sized_queue.rb +2 -2
- data/lib/ruby-lint/definitions/core/standard_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/stderr.rb +3 -2
- data/lib/ruby-lint/definitions/core/stdin.rb +3 -2
- data/lib/ruby-lint/definitions/core/stdout.rb +3 -2
- data/lib/ruby-lint/definitions/core/stop_iteration.rb +2 -2
- data/lib/ruby-lint/definitions/core/string.rb +21 -21
- data/lib/ruby-lint/definitions/core/string_io.rb +7 -7
- data/lib/ruby-lint/definitions/core/string_scanner.rb +4 -4
- data/lib/ruby-lint/definitions/core/struct.rb +20 -20
- data/lib/ruby-lint/definitions/core/syck.rb +4 -4
- data/lib/ruby-lint/definitions/core/symbol.rb +2 -2
- data/lib/ruby-lint/definitions/core/syntax_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/system_call_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/system_exit.rb +2 -2
- data/lib/ruby-lint/definitions/core/system_stack_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/thread.rb +6 -6
- data/lib/ruby-lint/definitions/core/thread_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/thread_group.rb +2 -2
- data/lib/ruby-lint/definitions/core/time.rb +3 -3
- data/lib/ruby-lint/definitions/core/toplevel_binding.rb +1 -1
- data/lib/ruby-lint/definitions/core/true.rb +1 -1
- data/lib/ruby-lint/definitions/core/true_class.rb +2 -2
- data/lib/ruby-lint/definitions/core/type_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/unbound_method.rb +2 -2
- data/lib/ruby-lint/definitions/core/unmarshalable.rb +1 -1
- data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/weak_ref.rb +4 -4
- data/lib/ruby-lint/definitions/core/yaml.rb +2361 -0
- data/lib/ruby-lint/definitions/core/zero_division_error.rb +2 -2
- data/lib/ruby-lint/definitions/global_variables.rb +9 -0
- data/lib/ruby-lint/definitions/rails/abstract_controller.rb +174 -28
- data/lib/ruby-lint/definitions/rails/action_controller.rb +4959 -550
- data/lib/ruby-lint/definitions/rails/action_dispatch.rb +2489 -292
- data/lib/ruby-lint/definitions/rails/action_mailer.rb +1285 -42
- data/lib/ruby-lint/definitions/rails/action_pack.rb +14 -6
- data/lib/ruby-lint/definitions/rails/action_view.rb +6941 -445
- data/lib/ruby-lint/definitions/rails/active_model.rb +1212 -69
- data/lib/ruby-lint/definitions/rails/active_record.rb +10344 -1450
- data/lib/ruby-lint/definitions/rails/active_support.rb +4631 -573
- data/lib/ruby-lint/definitions/rails/arel.rb +3211 -319
- data/lib/ruby-lint/definitions/rails/rails.rb +2922 -84
- data/lib/ruby-lint/definitions/rails/sprockets.rb +3048 -277
- data/lib/ruby-lint/docstring/mapping.rb +55 -0
- data/lib/ruby-lint/docstring/param_tag.rb +29 -0
- data/lib/ruby-lint/docstring/parser.rb +133 -0
- data/lib/ruby-lint/docstring/return_tag.rb +24 -0
- data/lib/ruby-lint/file_loader.rb +96 -0
- data/lib/ruby-lint/file_scanner.rb +91 -0
- data/lib/ruby-lint/global_scope.rb +56 -0
- data/lib/ruby-lint/helper/constant_paths.rb +1 -1
- data/lib/ruby-lint/inspector.rb +11 -33
- data/lib/ruby-lint/iterator.rb +31 -4
- data/lib/ruby-lint/method_call/alias.rb +46 -0
- data/lib/ruby-lint/method_call/assign_member.rb +55 -0
- data/lib/ruby-lint/method_call/attribute.rb +102 -0
- data/lib/ruby-lint/method_call/base.rb +37 -0
- data/lib/ruby-lint/method_call/define_method.rb +17 -0
- data/lib/ruby-lint/method_call/include.rb +39 -0
- data/lib/ruby-lint/parser.rb +9 -4
- data/lib/ruby-lint/presenter/text.rb +2 -1
- data/lib/ruby-lint/report.rb +19 -42
- data/lib/ruby-lint/report/entry.rb +20 -17
- data/lib/ruby-lint/runner.rb +92 -11
- data/lib/ruby-lint/template/definition.erb +2 -2
- data/lib/ruby-lint/variable_predicates.rb +7 -10
- data/lib/ruby-lint/version.rb +1 -1
- data/lib/ruby-lint/virtual_machine.rb +265 -188
- data/ruby-lint.gemspec +4 -4
- data/ruby-lint.yml +7 -0
- data/spec/fixtures/associating.rb +7 -0
- data/spec/fixtures/file_scanner/lib/example/recursive/source.rb +6 -0
- data/spec/fixtures/file_scanner/lib/example/recursive/target.rb +8 -0
- data/spec/fixtures/file_scanner/lib/example/user.rb +6 -0
- data/spec/fixtures/file_scanner/lib/test-dashes/foo.rb +4 -0
- data/spec/fixtures/file_scanner/rails/app/models/example/user.rb +6 -0
- data/spec/fixtures/file_scanner/rails/app/models/user.rb +4 -0
- data/spec/fixtures/uses_external.rb +1 -0
- data/spec/fixtures/uses_external_invalid.rb +3 -0
- data/spec/fixtures/uses_external_namespace.rb +1 -0
- data/spec/ruby-lint/analysis/{argument_amount.rb → argument_amount_spec.rb} +33 -7
- data/spec/ruby-lint/analysis/base_spec.rb +12 -0
- data/spec/ruby-lint/analysis/{pedantics.rb → pedantics_spec.rb} +24 -4
- data/spec/ruby-lint/analysis/{shadowing_variables.rb → shadowing_variables_spec.rb} +6 -6
- data/spec/ruby-lint/analysis/undefined_methods_spec.rb +320 -0
- data/spec/ruby-lint/analysis/{undefined_variables.rb → undefined_variables_spec.rb} +33 -10
- data/spec/ruby-lint/analysis/{unused_variables.rb → unused_variables_spec.rb} +36 -9
- data/spec/ruby-lint/ast/{node.rb → node_spec.rb} +12 -6
- data/spec/ruby-lint/cli/{analyze.rb → analyze_spec.rb} +16 -5
- data/spec/ruby-lint/cli/{ast.rb → ast_spec.rb} +3 -3
- data/spec/ruby-lint/configuration_spec.rb +106 -0
- data/spec/ruby-lint/definition/constant_proxy_spec.rb +54 -0
- data/spec/ruby-lint/definition/{dsl.rb → dsl_spec.rb} +15 -15
- data/spec/ruby-lint/definition/{ruby_method.rb → ruby_method_spec.rb} +31 -17
- data/spec/ruby-lint/definition/{ruby_object.rb → ruby_object_spec.rb} +28 -23
- data/spec/ruby-lint/definition_builder/{primitive.rb → primitive_spec.rb} +9 -9
- data/spec/ruby-lint/definition_builder/{ruby_class.rb → ruby_class_spec.rb} +13 -13
- data/spec/ruby-lint/definition_builder/{ruby_method.rb → ruby_method_spec.rb} +9 -9
- data/spec/ruby-lint/definition_builder/{ruby_module.rb → ruby_module_spec.rb} +12 -10
- data/spec/ruby-lint/docstring/mapping.rb +27 -0
- data/spec/ruby-lint/docstring/parser_spec.rb +88 -0
- data/spec/ruby-lint/extensions/{string.rb → string_spec.rb} +3 -3
- data/spec/ruby-lint/file_loader_spec.rb +69 -0
- data/spec/ruby-lint/file_scanner_spec.rb +51 -0
- data/spec/ruby-lint/inspector_spec.rb +44 -0
- data/spec/ruby-lint/{iterator.rb → iterator_spec.rb} +39 -4
- data/spec/ruby-lint/{nested_stack.rb → nested_stack_spec.rb} +4 -4
- data/spec/ruby-lint/parser_spec.rb +31 -0
- data/spec/ruby-lint/presenter/json_spec.rb +58 -0
- data/spec/ruby-lint/presenter/text_spec.rb +49 -0
- data/spec/ruby-lint/report/entry_spec.rb +58 -0
- data/spec/ruby-lint/report_spec.rb +39 -0
- data/spec/ruby-lint/runner_spec.rb +52 -0
- data/spec/ruby-lint/virtual_machine/alias_spec.rb +55 -0
- data/spec/ruby-lint/virtual_machine/assignments/{arrays.rb → arrays_spec.rb} +7 -7
- data/spec/ruby-lint/virtual_machine/assignments/{hashes.rb → hashes_spec.rb} +6 -6
- data/spec/ruby-lint/virtual_machine/assignments/{optional.rb → optional_spec.rb} +6 -6
- data/spec/ruby-lint/virtual_machine/assignments/{return_values.rb → return_values_spec.rb} +11 -11
- data/spec/ruby-lint/virtual_machine/assignments/{variables.rb → variables_spec.rb} +38 -7
- data/spec/ruby-lint/virtual_machine/associate_nodes_spec.rb +59 -0
- data/spec/ruby-lint/virtual_machine/{autoloading.rb → autoloading_spec.rb} +6 -6
- data/spec/ruby-lint/virtual_machine/{blocks.rb → blocks_spec.rb} +30 -4
- data/spec/ruby-lint/virtual_machine/classes/{class_methods.rb → class_methods_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/classes/{extending.rb → extending_spec.rb} +20 -15
- data/spec/ruby-lint/virtual_machine/classes/{redefining.rb → redefining_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/classes/{sclass.rb → sclass_spec.rb} +7 -7
- data/spec/ruby-lint/virtual_machine/classes/{scoping.rb → scoping_spec.rb} +5 -5
- data/spec/ruby-lint/virtual_machine/complex/{rails.rb → rails_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/complex/{rcap.rb → rcap_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/complex/{slop.rb → slop_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/constants_spec.rb +31 -0
- data/spec/ruby-lint/virtual_machine/{for.rb → for_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/{freeze.rb → freeze_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/global_variables_spec.rb +12 -0
- data/spec/ruby-lint/virtual_machine/inherit_kernel_spec.rb +15 -0
- data/spec/ruby-lint/virtual_machine/{interpolation.rb → interpolation_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/methods/attr_spec.rb +116 -0
- data/spec/ruby-lint/virtual_machine/methods/define_method_spec.rb +41 -0
- data/spec/ruby-lint/virtual_machine/methods/{defining.rb → defining_spec.rb} +4 -4
- data/spec/ruby-lint/virtual_machine/methods/docstrings_spec.rb +69 -0
- data/spec/ruby-lint/virtual_machine/methods/{exporting.rb → exporting_spec.rb} +3 -3
- data/spec/ruby-lint/virtual_machine/methods/{parameters.rb → parameters_spec.rb} +17 -5
- data/spec/ruby-lint/virtual_machine/methods/{patching.rb → patching_spec.rb} +4 -4
- data/spec/ruby-lint/virtual_machine/methods/{scoping.rb → scoping_spec.rb} +5 -5
- data/spec/ruby-lint/virtual_machine/methods/{visibility.rb → visibility_spec.rb} +6 -6
- data/spec/ruby-lint/virtual_machine/{modules.rb → modules_spec.rb} +39 -9
- data/spec/ruby-lint/virtual_machine/reference_amount_spec.rb +61 -0
- data/spec/ruby-lint/virtual_machine/{unused.rb → unused_spec.rb} +4 -4
- data/spec/{helper.rb → spec_helper.rb} +6 -4
- data/spec/support/building.rb +10 -6
- data/spec/support/coveralls.rb +1 -1
- data/spec/support/parsing.rb +10 -1
- data/spec/support/simplecov.rb +1 -1
- data/spec/support/versions.rb +9 -0
- data/task/test.rake +2 -4
- data/task/travis.rake +1 -0
- metadata +144 -143
- metadata.gz.asc +14 -14
- data/.rubocop.yml +0 -59
- data/doc/contributing.md +0 -16
- data/lib/ruby-lint/analysis/confusing_variables.rb +0 -26
- data/lib/ruby-lint/definitions/core/main.rb +0 -25
- data/lib/ruby-lint/definitions/core/psych.rb +0 -2231
- data/lib/ruby-lint/definitions/core/rubinius.rb +0 -16637
- data/lib/ruby-lint/definitions/core/ruby_lint.rb +0 -93
- data/spec/ruby-lint/analysis/confusing_variables.rb +0 -46
- data/spec/ruby-lint/analysis/undefined_methods.rb +0 -174
- data/spec/ruby-lint/configuration.rb +0 -54
- data/spec/ruby-lint/definition/constant_proxy.rb +0 -31
- data/spec/ruby-lint/parser.rb +0 -14
- data/spec/ruby-lint/presenter/json.rb +0 -31
- data/spec/ruby-lint/presenter/text.rb +0 -22
- data/spec/ruby-lint/report.rb +0 -50
- data/spec/ruby-lint/report/entry.rb +0 -28
- data/spec/ruby-lint/runner.rb +0 -32
- data/spec/ruby-lint/virtual_machine/associate_nodes.rb +0 -17
- data/spec/ruby-lint/virtual_machine/reference_amount.rb +0 -33
- data/spec/support/bacon.rb +0 -33
- data/task/cop.rake +0 -11
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Docstring
|
|
3
|
+
##
|
|
4
|
+
# {RubyLint::Docstring::Mapping} is a small data container for storing
|
|
5
|
+
# docstring tags separately and optionally by their names (e.g. for
|
|
6
|
+
# parameter tags).
|
|
7
|
+
#
|
|
8
|
+
# @!attribute [r] param_tags
|
|
9
|
+
# @return [Hash]
|
|
10
|
+
#
|
|
11
|
+
# @!attribute [r] return_tag
|
|
12
|
+
# @return [RubyLint::Docstring::ReturnTag]
|
|
13
|
+
#
|
|
14
|
+
class Mapping
|
|
15
|
+
attr_reader :param_tags, :return_tag
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Hash containing the known tag classes and their callback methods.
|
|
19
|
+
#
|
|
20
|
+
# @return [Hash]
|
|
21
|
+
#
|
|
22
|
+
TAG_METHODS = {
|
|
23
|
+
ParamTag => :on_param_tag,
|
|
24
|
+
ReturnTag => :on_return_tag
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# @param [Array] tags
|
|
29
|
+
#
|
|
30
|
+
def initialize(tags = [])
|
|
31
|
+
@param_tags = {}
|
|
32
|
+
|
|
33
|
+
tags.each do |tag|
|
|
34
|
+
send(TAG_METHODS[tag.class], tag)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
# @param [RubyLint::Docstring::ParamTag] tag
|
|
42
|
+
#
|
|
43
|
+
def on_param_tag(tag)
|
|
44
|
+
@param_tags[tag.name] = tag
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
# @param [RubyLint::Docstring::ReturnTag] tag
|
|
49
|
+
#
|
|
50
|
+
def on_return_tag(tag)
|
|
51
|
+
@return_tag = tag
|
|
52
|
+
end
|
|
53
|
+
end # Mapping
|
|
54
|
+
end # Docstring
|
|
55
|
+
end # RubyLint
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Docstring
|
|
3
|
+
##
|
|
4
|
+
# The ParamTag class contains information about YARD `@param` tags such as
|
|
5
|
+
# the types of the parameter.
|
|
6
|
+
#
|
|
7
|
+
# @!attribute [r] name
|
|
8
|
+
# @return [String]
|
|
9
|
+
#
|
|
10
|
+
# @!attribute [r] types
|
|
11
|
+
# @return [Array]
|
|
12
|
+
#
|
|
13
|
+
# @!attribute [r] description
|
|
14
|
+
# @return [String]
|
|
15
|
+
#
|
|
16
|
+
class ParamTag
|
|
17
|
+
attr_reader :name, :types, :description
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# @param [Hash] options
|
|
21
|
+
#
|
|
22
|
+
def initialize(options = {})
|
|
23
|
+
@name = options[:name]
|
|
24
|
+
@types = options[:types] || []
|
|
25
|
+
@description = options[:description]
|
|
26
|
+
end
|
|
27
|
+
end # ParamTag
|
|
28
|
+
end # Docstring
|
|
29
|
+
end # RubyLint
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Docstring
|
|
3
|
+
##
|
|
4
|
+
# {RubyLint::Docstring::Parser} parses a collection of Ruby source comments
|
|
5
|
+
# and tries to extract various YARD tags out of them. These tags can then
|
|
6
|
+
# be used as extra information for building definitions (e.g. the arguments
|
|
7
|
+
# of a method definition).
|
|
8
|
+
#
|
|
9
|
+
class Parser
|
|
10
|
+
##
|
|
11
|
+
# Regexp used to get rid of leading `#` markers. This makes the regular
|
|
12
|
+
# expressions used for tags a little bit easier.
|
|
13
|
+
#
|
|
14
|
+
# @return [Regexp]
|
|
15
|
+
#
|
|
16
|
+
COMMENT_REGEXP = /^#+\s*/
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# The character used for separating types in a tag.
|
|
20
|
+
#
|
|
21
|
+
# @return [String]
|
|
22
|
+
#
|
|
23
|
+
TYPE_SEPARATOR = '|'
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# Hash containing regular expressions and their corresponding callback
|
|
27
|
+
# methods.
|
|
28
|
+
#
|
|
29
|
+
# @return [Hash]
|
|
30
|
+
#
|
|
31
|
+
KNOWN_TAGS = {
|
|
32
|
+
# Matches: @param [Type] name description
|
|
33
|
+
# Matches: @param [Type<Value>] name description
|
|
34
|
+
/^@param\s+\[(.+)\]\s+(\S+)\s*(.+)*/ => :on_param_with_type,
|
|
35
|
+
|
|
36
|
+
# Matches: @param name description
|
|
37
|
+
/^@param\s+(\S+)\s*(.+)*/ => :on_param,
|
|
38
|
+
|
|
39
|
+
# Matches: @return [Type] description
|
|
40
|
+
/^@return\s+\[(.+)\]\s*(.+)*/ => :on_return_with_type,
|
|
41
|
+
|
|
42
|
+
# Matches; @return description
|
|
43
|
+
/^@return\s+(.+)/ => :on_return,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Parses an Array of comments and returns a collection of docstring tags.
|
|
48
|
+
#
|
|
49
|
+
# @param [Array] comments
|
|
50
|
+
# @return [Array]
|
|
51
|
+
#
|
|
52
|
+
def parse(comments)
|
|
53
|
+
tags = []
|
|
54
|
+
|
|
55
|
+
comments.each do |comment|
|
|
56
|
+
comment = comment.gsub(COMMENT_REGEXP, '').strip
|
|
57
|
+
|
|
58
|
+
KNOWN_TAGS.each do |regexp, method|
|
|
59
|
+
matchdata = comment.match(regexp)
|
|
60
|
+
|
|
61
|
+
if matchdata
|
|
62
|
+
retval = send(method, *matchdata.captures)
|
|
63
|
+
|
|
64
|
+
if retval
|
|
65
|
+
tags << retval
|
|
66
|
+
break
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
return tags
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
##
|
|
78
|
+
# Processes a `@param` tag without a given type.
|
|
79
|
+
#
|
|
80
|
+
# @param [String] name The name of the argument.
|
|
81
|
+
# @param [String] description The description of the argument.
|
|
82
|
+
# @return [RubyLint::Docstring::ParamTag]
|
|
83
|
+
#
|
|
84
|
+
def on_param(name, description)
|
|
85
|
+
return ParamTag.new(:name => name, :description => description)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
##
|
|
89
|
+
# Processes a `@param` tag with a set of types specified.
|
|
90
|
+
#
|
|
91
|
+
# @param [String] types The argument types.
|
|
92
|
+
# @see #on_param
|
|
93
|
+
#
|
|
94
|
+
def on_param_with_type(types, name, description)
|
|
95
|
+
# The inner values of compound types are ignored since ruby-lint
|
|
96
|
+
# doesn't have the means to store this information.
|
|
97
|
+
types = types.split(TYPE_SEPARATOR).map do |type|
|
|
98
|
+
type.gsub(/<.+>/, '')
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
return ParamTag.new(
|
|
102
|
+
:name => name,
|
|
103
|
+
:description => description,
|
|
104
|
+
:types => types
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
##
|
|
109
|
+
# Processes a `@return` tag with just the description.
|
|
110
|
+
#
|
|
111
|
+
# @param [String] description
|
|
112
|
+
# @return [RubyLint::Docstring::ReturnTag]
|
|
113
|
+
#
|
|
114
|
+
def on_return(description)
|
|
115
|
+
return ReturnTag.new(:description => description)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# Processes a `@return` tag with the type and description.
|
|
120
|
+
#
|
|
121
|
+
# @param [String] types The return types.
|
|
122
|
+
# @param [String] description
|
|
123
|
+
# @return [RubyLint::Docstring::ReturnTag]
|
|
124
|
+
#
|
|
125
|
+
def on_return_with_type(types, description)
|
|
126
|
+
return ReturnTag.new(
|
|
127
|
+
:description => description,
|
|
128
|
+
:types => types.split(TYPE_SEPARATOR)
|
|
129
|
+
)
|
|
130
|
+
end
|
|
131
|
+
end # DocstringParser
|
|
132
|
+
end # Docstring
|
|
133
|
+
end # RubyLint
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Docstring
|
|
3
|
+
##
|
|
4
|
+
# The ReturnTag class contains information about a YARD `@return` tag.
|
|
5
|
+
#
|
|
6
|
+
# @!attribute [r] types
|
|
7
|
+
# @return [Array]
|
|
8
|
+
#
|
|
9
|
+
# @!attribute [r] description
|
|
10
|
+
# @return [String]
|
|
11
|
+
#
|
|
12
|
+
class ReturnTag
|
|
13
|
+
attr_reader :types, :description
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# @param [Hash] options
|
|
17
|
+
#
|
|
18
|
+
def initialize(options = {})
|
|
19
|
+
@types = options[:types] || []
|
|
20
|
+
@description = options[:description]
|
|
21
|
+
end
|
|
22
|
+
end # ReturnTag
|
|
23
|
+
end # Docstring
|
|
24
|
+
end # RubyLint
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
##
|
|
3
|
+
# {RubyLint::FileLoader} iterates over an AST and given a constant node will
|
|
4
|
+
# try to find the corresponding filepath using {RubyLint::FileScanner}.
|
|
5
|
+
#
|
|
6
|
+
# ## Options
|
|
7
|
+
#
|
|
8
|
+
# The following options must be set when creating an instance of this class:
|
|
9
|
+
#
|
|
10
|
+
# * `:directories`: the directories to scan for files.
|
|
11
|
+
# * `:ignore_paths`: a list of paths to ignore when scanning for files.
|
|
12
|
+
#
|
|
13
|
+
# @!attribute [r] file_scanner
|
|
14
|
+
# @return [RubyLint::FileScanner]
|
|
15
|
+
#
|
|
16
|
+
# @!attribute [r] parser
|
|
17
|
+
# @return [RubyLint::Parser]
|
|
18
|
+
#
|
|
19
|
+
# @!attribute [r] nodes
|
|
20
|
+
# @return [Array] A list of extra nodes (and their comments) a VM instance
|
|
21
|
+
# should process before processing the file being analyzed.
|
|
22
|
+
#
|
|
23
|
+
# @!attribute [r] debug
|
|
24
|
+
# @return [TrueClass|FalseClass]
|
|
25
|
+
#
|
|
26
|
+
# @!attribute [r] paths
|
|
27
|
+
# @return [Set]
|
|
28
|
+
#
|
|
29
|
+
class FileLoader < Iterator
|
|
30
|
+
include Helper::ConstantPaths
|
|
31
|
+
|
|
32
|
+
attr_reader :file_scanner, :parser, :nodes, :comments, :debug, :paths
|
|
33
|
+
|
|
34
|
+
##
|
|
35
|
+
# Called after a new instance of this class is created.
|
|
36
|
+
#
|
|
37
|
+
def after_initialize
|
|
38
|
+
@file_scanner = FileScanner.new(@directories, @ignore_paths)
|
|
39
|
+
@parser = Parser.new
|
|
40
|
+
@nodes = []
|
|
41
|
+
@paths = Set.new
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# @param [RubyLint::AST::Node] node
|
|
46
|
+
#
|
|
47
|
+
def on_const(node)
|
|
48
|
+
segments = constant_segments(node)
|
|
49
|
+
constant_path = segments.join('::')
|
|
50
|
+
files = file_scanner.scan(constant_path)
|
|
51
|
+
|
|
52
|
+
paths << node.file
|
|
53
|
+
|
|
54
|
+
files.each do |path|
|
|
55
|
+
next if paths.include?(path)
|
|
56
|
+
|
|
57
|
+
paths << path
|
|
58
|
+
|
|
59
|
+
debug_message("Processing extra file: #{path}")
|
|
60
|
+
|
|
61
|
+
process_file(segments[-1], path)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
##
|
|
68
|
+
# @param [String] constant_name
|
|
69
|
+
# @param [String] path
|
|
70
|
+
#
|
|
71
|
+
def process_file(constant_name, path)
|
|
72
|
+
code = File.read(path)
|
|
73
|
+
|
|
74
|
+
unless code.include?(constant_name)
|
|
75
|
+
debug_message(
|
|
76
|
+
%Q{ Skipping since "#{constant_name}" was not found in this file}
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
ast, comments = parser.parse(code, path)
|
|
83
|
+
|
|
84
|
+
iterate(ast)
|
|
85
|
+
|
|
86
|
+
nodes << [ast, comments]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
##
|
|
90
|
+
# @param [String] message
|
|
91
|
+
#
|
|
92
|
+
def debug_message(message)
|
|
93
|
+
STDERR.puts(message) if debug
|
|
94
|
+
end
|
|
95
|
+
end # FileLoader
|
|
96
|
+
end # RubyLint
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
##
|
|
3
|
+
# {RubyLint::FileScanner} is used for finding a list of files that could
|
|
4
|
+
# potentially define a given Ruby constant (path).
|
|
5
|
+
#
|
|
6
|
+
# @!attribute [r] directories
|
|
7
|
+
# @return [Array]
|
|
8
|
+
#
|
|
9
|
+
# @!attribute [r] ignore
|
|
10
|
+
# @return [Array]
|
|
11
|
+
#
|
|
12
|
+
class FileScanner
|
|
13
|
+
attr_reader :directories, :ignore
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# @param [Array] directories A collection of base directories to search in.
|
|
17
|
+
# @param [Array] ignore A list of paths to ignore.
|
|
18
|
+
#
|
|
19
|
+
def initialize(directories = [Dir.pwd], ignore = [])
|
|
20
|
+
unless directories.respond_to?(:each)
|
|
21
|
+
raise TypeError, 'Directories must be specified as an Enumerable'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@directories = directories
|
|
25
|
+
@ignore = ignore || []
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
##
|
|
29
|
+
# Tries to find `constant` in one of the directories. The return value is
|
|
30
|
+
# an Array of file paths sorted from top-level to deeply nested structures
|
|
31
|
+
# (e.g. `a.rb` comes before `foo/a.rb`).
|
|
32
|
+
#
|
|
33
|
+
# @param [String] constant
|
|
34
|
+
# @return [Array]
|
|
35
|
+
#
|
|
36
|
+
def scan(constant)
|
|
37
|
+
segment = constant_to_path(constant)
|
|
38
|
+
paths = Dir.glob(glob_pattern(segment))
|
|
39
|
+
|
|
40
|
+
# Lets see if we can find anything when using dashes for the directory
|
|
41
|
+
# names instead of underscores.
|
|
42
|
+
if paths.empty?
|
|
43
|
+
segment = constant_to_dashed_path(constant)
|
|
44
|
+
paths = Dir.glob(glob_pattern(segment))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
ignore.each do |pattern|
|
|
48
|
+
paths.reject! do |path|
|
|
49
|
+
path.include?(pattern)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Ensure that the order is from top-level -> deeply nested files instead
|
|
54
|
+
# of a random order.
|
|
55
|
+
paths.sort! do |left, right|
|
|
56
|
+
left.length <=> right.length
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
return paths
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# @param [String] constant
|
|
66
|
+
# @return [String]
|
|
67
|
+
#
|
|
68
|
+
def constant_to_path(constant)
|
|
69
|
+
return constant.gsub('::', '/').snake_case
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
# @see #constant_to_path
|
|
74
|
+
#
|
|
75
|
+
def constant_to_dashed_path(constant)
|
|
76
|
+
segments = constant.split('::')
|
|
77
|
+
last = segments[-1]
|
|
78
|
+
path = segments[0..-2].join('/').snake_case.gsub('_', '-')
|
|
79
|
+
|
|
80
|
+
return "#{path}/#{last.snake_case}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
##
|
|
84
|
+
# @param [String] segment
|
|
85
|
+
# @return [String]
|
|
86
|
+
#
|
|
87
|
+
def glob_pattern(segment)
|
|
88
|
+
return "{#{directories.join(',')}}/**/#{segment}.rb"
|
|
89
|
+
end
|
|
90
|
+
end # FileScanner
|
|
91
|
+
end # RubyLint
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module GlobalScope
|
|
3
|
+
##
|
|
4
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
5
|
+
#
|
|
6
|
+
def self.definitions
|
|
7
|
+
return @definitions ||= Definition::RubyObject.new(
|
|
8
|
+
:name => 'global',
|
|
9
|
+
:type => :global
|
|
10
|
+
)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Looks up the given constant in the global scope. If it does not exist
|
|
15
|
+
# this method will try to load it from one of the existing definitions.
|
|
16
|
+
#
|
|
17
|
+
# @param [String] name
|
|
18
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
19
|
+
#
|
|
20
|
+
def self.global_constant(name)
|
|
21
|
+
found = definitions.lookup_constant_path(name)
|
|
22
|
+
|
|
23
|
+
if !found and !constant_loader.loaded?(name)
|
|
24
|
+
constant_loader.load_constant(name)
|
|
25
|
+
|
|
26
|
+
found = definitions.lookup_constant_path(name)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
return found
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class << self
|
|
33
|
+
# This allows the ConstantProxy class to use the same code while still
|
|
34
|
+
# being able to use the global scope as its input.
|
|
35
|
+
alias_method :lookup_constant_path, :global_constant
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Creates a new proxy for a global constant.
|
|
40
|
+
#
|
|
41
|
+
# @param [String] name The name of the constant, can include an entire
|
|
42
|
+
# constant path in the form of `Foo::Bar`.
|
|
43
|
+
# @return [RubyLint::Definition::ConstantProxy]
|
|
44
|
+
#
|
|
45
|
+
def self.constant_proxy(name)
|
|
46
|
+
return Definition::ConstantProxy.new(self, name)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
##
|
|
50
|
+
# @return [RubyLint::ConstantLoader]
|
|
51
|
+
#
|
|
52
|
+
def self.constant_loader
|
|
53
|
+
return @constant_loader ||= ConstantLoader.new
|
|
54
|
+
end
|
|
55
|
+
end # GlobalScope
|
|
56
|
+
end # RubyLint
|