inch 0.2.3 → 0.3.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.simplecov +7 -0
- data/TODOS.md +0 -5
- data/config/defaults.rb +26 -1
- data/inch.gemspec +1 -0
- data/lib/inch.rb +2 -1
- data/lib/inch/api.rb +34 -0
- data/lib/inch/api/filter.rb +17 -0
- data/lib/inch/api/get.rb +30 -0
- data/lib/inch/api/list.rb +10 -0
- data/lib/inch/api/options/base.rb +45 -0
- data/lib/inch/api/options/filter.rb +25 -0
- data/lib/inch/api/options/suggest.rb +36 -0
- data/lib/inch/api/stats.rb +7 -0
- data/lib/inch/api/suggest.rb +110 -0
- data/lib/inch/cli.rb +4 -1
- data/lib/inch/cli/command/base.rb +1 -17
- data/lib/inch/cli/command/base_list.rb +3 -63
- data/lib/inch/cli/command/base_object.rb +6 -28
- data/lib/inch/cli/command/list.rb +3 -2
- data/lib/inch/cli/command/options/base.rb +1 -1
- data/lib/inch/cli/command/options/base_list.rb +4 -2
- data/lib/inch/cli/command/options/suggest.rb +9 -8
- data/lib/inch/cli/command/output/base.rb +9 -11
- data/lib/inch/cli/command/output/list.rb +2 -2
- data/lib/inch/cli/command/output/show.rb +2 -10
- data/lib/inch/cli/command/output/stats.rb +4 -3
- data/lib/inch/cli/command/output/suggest.rb +5 -5
- data/lib/inch/cli/command/stats.rb +4 -3
- data/lib/inch/cli/command/suggest.rb +4 -94
- data/lib/inch/code_object.rb +2 -2
- data/lib/inch/code_object/converter.rb +89 -0
- data/lib/inch/code_object/provider.rb +36 -0
- data/lib/inch/code_object/provider/yard.rb +19 -0
- data/lib/inch/code_object/provider/yard/docstring.rb +106 -0
- data/lib/inch/code_object/provider/yard/nodoc_helper.rb +93 -0
- data/lib/inch/code_object/provider/yard/object.rb +55 -0
- data/lib/inch/code_object/provider/yard/object/base.rb +262 -0
- data/lib/inch/code_object/provider/yard/object/class_object.rb +12 -0
- data/lib/inch/code_object/provider/yard/object/constant_object.rb +12 -0
- data/lib/inch/code_object/provider/yard/object/method_object.rb +126 -0
- data/lib/inch/code_object/provider/yard/object/method_parameter_object.rb +88 -0
- data/lib/inch/code_object/provider/yard/object/module_object.rb +12 -0
- data/lib/inch/code_object/provider/yard/object/namespace_object.rb +47 -0
- data/lib/inch/code_object/provider/yard/parser.rb +54 -0
- data/lib/inch/code_object/proxy.rb +5 -3
- data/lib/inch/code_object/proxy/base.rb +103 -110
- data/lib/inch/code_object/proxy/class_object.rb +0 -1
- data/lib/inch/code_object/proxy/method_object.rb +20 -99
- data/lib/inch/code_object/proxy/method_parameter_object.rb +15 -39
- data/lib/inch/code_object/proxy/namespace_object.rb +7 -18
- data/lib/inch/codebase.rb +19 -0
- data/lib/inch/codebase/objects.rb +73 -0
- data/lib/inch/codebase/objects_filter.rb +61 -0
- data/lib/inch/codebase/proxy.rb +22 -0
- data/lib/inch/config.rb +8 -1
- data/lib/inch/evaluation.rb +5 -7
- data/lib/inch/evaluation/file.rb +1 -1
- data/lib/inch/evaluation/grade.rb +1 -1
- data/lib/inch/evaluation/object_schema.rb +3 -1
- data/lib/inch/evaluation/priority_range.rb +44 -0
- data/lib/inch/evaluation/proxy.rb +25 -0
- data/lib/inch/evaluation/proxy/base.rb +146 -0
- data/lib/inch/evaluation/proxy/class_object.rb +8 -0
- data/lib/inch/evaluation/proxy/constant_object.rb +19 -0
- data/lib/inch/evaluation/proxy/method_object.rb +65 -0
- data/lib/inch/evaluation/proxy/module_object.rb +8 -0
- data/lib/inch/evaluation/proxy/namespace_object.rb +27 -0
- data/lib/inch/evaluation/role/base.rb +19 -0
- data/lib/inch/evaluation/role/constant.rb +16 -0
- data/lib/inch/evaluation/role/method.rb +22 -0
- data/lib/inch/evaluation/role/method_parameter.rb +31 -1
- data/lib/inch/evaluation/role/namespace.rb +15 -0
- data/lib/inch/evaluation/role/object.rb +24 -0
- data/lib/inch/rake/suggest.rb +1 -0
- data/lib/inch/utils/read_write_methods.rb +44 -0
- data/lib/inch/{cli → utils}/weighted_list.rb +1 -1
- data/lib/inch/version.rb +1 -1
- data/test/fixtures/simple/lib/broken.rb +8 -0
- data/test/inch/api/filter_test.rb +51 -0
- data/test/inch/api/get_test.rb +22 -0
- data/test/inch/api/list_test.rb +15 -0
- data/test/inch/api/options/base_test.rb +30 -0
- data/test/inch/api/stats_test.rb +15 -0
- data/test/inch/api/suggest_test.rb +26 -0
- data/test/inch/cli/command/list_test.rb +2 -1
- data/test/inch/code_object/converter_test.rb +29 -0
- data/test/inch/code_object/{docstring_test.rb → provider/yard/docstring_test.rb} +13 -13
- data/test/inch/code_object/{nodoc_helper_test.rb → provider/yard/nodoc_helper_test.rb} +6 -6
- data/test/inch/code_object/provider/yard_test.rb +11 -0
- data/test/inch/code_object/provider_test.rb +9 -0
- data/test/inch/code_object/proxy/method_object_test.rb +22 -22
- data/test/inch/code_object/proxy_test.rb +10 -10
- data/test/inch/codebase/objects_test.rb +28 -0
- data/test/inch/codebase/proxy_test.rb +17 -0
- data/test/inch/evaluation/role/base_test.rb +71 -0
- data/test/inch/{cli → utils}/weighted_list_test.rb +2 -2
- data/test/shared/base_list.rb +73 -0
- data/test/test_helper.rb +0 -95
- metadata +89 -24
- data/lib/inch/code_object/docstring.rb +0 -102
- data/lib/inch/code_object/nodoc_helper.rb +0 -107
- data/lib/inch/evaluation/base.rb +0 -157
- data/lib/inch/evaluation/class_object.rb +0 -6
- data/lib/inch/evaluation/constant_object.rb +0 -33
- data/lib/inch/evaluation/method_object.rb +0 -105
- data/lib/inch/evaluation/module_object.rb +0 -6
- data/lib/inch/evaluation/namespace_object.rb +0 -52
- data/lib/inch/evaluation/read_write_methods.rb +0 -21
- data/lib/inch/source_parser.rb +0 -62
- data/test/inch/source_parser_test.rb +0 -23
@@ -0,0 +1,126 @@
|
|
1
|
+
module Inch
|
2
|
+
module CodeObject
|
3
|
+
module Provider
|
4
|
+
module YARD
|
5
|
+
module Object
|
6
|
+
# Proxy class for methods
|
7
|
+
class MethodObject < Base
|
8
|
+
|
9
|
+
def constructor?
|
10
|
+
name == :initialize
|
11
|
+
end
|
12
|
+
|
13
|
+
def bang_name?
|
14
|
+
name =~ /\!$/
|
15
|
+
end
|
16
|
+
|
17
|
+
def getter?
|
18
|
+
attr_info = object.attr_info || {}
|
19
|
+
read_info = attr_info[:read]
|
20
|
+
if read_info
|
21
|
+
read_info.path == fullname
|
22
|
+
else
|
23
|
+
parent.child(:"#{name}=")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def has_doc?
|
28
|
+
super && !implicit_docstring?
|
29
|
+
end
|
30
|
+
|
31
|
+
def has_alias?
|
32
|
+
!object.aliases.empty?
|
33
|
+
end
|
34
|
+
|
35
|
+
def method?
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def parameters
|
40
|
+
@parameters ||= all_parameter_names.map do |name|
|
41
|
+
in_signature = signature_parameter_names.include?(name)
|
42
|
+
tag = parameter_tag(name)
|
43
|
+
MethodParameterObject.new(self, name, tag, in_signature)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def parameter(name)
|
48
|
+
parameters.detect { |p| p.name == name.to_s }
|
49
|
+
end
|
50
|
+
|
51
|
+
def overridden?
|
52
|
+
!!object.overridden_method
|
53
|
+
end
|
54
|
+
|
55
|
+
def overridden_method
|
56
|
+
return unless overridden?
|
57
|
+
@overridden_method ||= YARD::Object.for(object.overridden_method)
|
58
|
+
end
|
59
|
+
|
60
|
+
def overridden_method_fullname
|
61
|
+
return unless overridden?
|
62
|
+
overridden_method.fullname
|
63
|
+
end
|
64
|
+
|
65
|
+
def return_mentioned?
|
66
|
+
!!return_tag || docstring.mentions_return?
|
67
|
+
end
|
68
|
+
|
69
|
+
def return_described?
|
70
|
+
(return_tag && !return_tag.text.empty?) || docstring.describes_return?
|
71
|
+
end
|
72
|
+
|
73
|
+
def return_typed?
|
74
|
+
return_mentioned?
|
75
|
+
end
|
76
|
+
|
77
|
+
def setter?
|
78
|
+
name =~ /\=$/ && parameters.size == 1
|
79
|
+
end
|
80
|
+
|
81
|
+
def questioning_name?
|
82
|
+
name =~ /\?$/
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def all_parameter_names
|
88
|
+
names = signature_parameter_names
|
89
|
+
names.concat parameter_tags.map(&:name)
|
90
|
+
names.compact.uniq
|
91
|
+
end
|
92
|
+
|
93
|
+
def implicit_docstring?
|
94
|
+
if getter?
|
95
|
+
docstring == "Returns the value of attribute #{name}"
|
96
|
+
elsif setter?
|
97
|
+
basename = name.to_s.gsub(/(\=)$/, '')
|
98
|
+
docstring == "Sets the attribute #{basename}"
|
99
|
+
else
|
100
|
+
false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def signature_parameter_names
|
105
|
+
object.parameters.map(&:first)
|
106
|
+
end
|
107
|
+
|
108
|
+
def parameter_tag(param_name)
|
109
|
+
parameter_tags.detect do |tag|
|
110
|
+
tag.name == param_name
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def parameter_tags
|
115
|
+
object.tags(:param)
|
116
|
+
end
|
117
|
+
|
118
|
+
def return_tag
|
119
|
+
object.tags(:return).first
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Inch
|
2
|
+
module CodeObject
|
3
|
+
module Provider
|
4
|
+
module YARD
|
5
|
+
module Object
|
6
|
+
# Proxy class for method parameters
|
7
|
+
class MethodParameterObject
|
8
|
+
attr_reader :name # @return [String]
|
9
|
+
|
10
|
+
# @param method [YARD::Object::MethodObject] the method the parameter belongs to
|
11
|
+
# @param name [String] the name of the parameter
|
12
|
+
# @param tag [YARD::Tags::Tag] the Tag object for the parameter
|
13
|
+
# @param in_signature [Boolean] +true+ if the method's signature contains the parameter
|
14
|
+
def initialize(method, name, tag, in_signature)
|
15
|
+
@method = method
|
16
|
+
@name = name
|
17
|
+
@tag = tag
|
18
|
+
@in_signature = in_signature
|
19
|
+
end
|
20
|
+
|
21
|
+
BAD_NAME_EXCEPTIONS = %w(id)
|
22
|
+
BAD_NAME_THRESHOLD = 3
|
23
|
+
|
24
|
+
# @return [Boolean] +true+ if the name of the parameter is uncommunicative
|
25
|
+
def bad_name?
|
26
|
+
return false if BAD_NAME_EXCEPTIONS.include?(name)
|
27
|
+
name.size < BAD_NAME_THRESHOLD || name =~ /[0-9]$/
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Boolean] +true+ if the parameter is a block
|
31
|
+
def block?
|
32
|
+
name =~ /^\&/
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Boolean] +true+ if an additional description given?
|
36
|
+
def described?
|
37
|
+
described_by_tag? || described_by_docstring?
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Boolean] +true+ if the parameter is mentioned in the docs
|
41
|
+
def mentioned?
|
42
|
+
!!@tag || mentioned_by_docstring?
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Boolean] +true+ if the parameter is a splat argument
|
46
|
+
def splat?
|
47
|
+
name =~ /^\*/
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [Boolean] +true+ if the type of the parameter is defined
|
51
|
+
def typed?
|
52
|
+
@tag && @tag.types && !@tag.types.empty?
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [Boolean] +true+ if the parameter is mentioned in the docs, but not present in the method's signature
|
56
|
+
def wrongly_mentioned?
|
57
|
+
mentioned? && !@in_signature
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def described_by_tag?
|
63
|
+
@tag && @tag.text && !@tag.text.empty?
|
64
|
+
end
|
65
|
+
|
66
|
+
def described_by_docstring?
|
67
|
+
if @method.docstring.describes_parameter?(name)
|
68
|
+
true
|
69
|
+
else
|
70
|
+
unsplatted = name.gsub(/^[\&\*]/, '')
|
71
|
+
@method.docstring.describes_parameter?(unsplatted)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def mentioned_by_docstring?
|
76
|
+
if @method.docstring.mentions_parameter?(name)
|
77
|
+
true
|
78
|
+
else
|
79
|
+
unsplatted = name.gsub(/^[\&\*]/, '')
|
80
|
+
@method.docstring.mentions_parameter?(unsplatted)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Inch
|
2
|
+
module CodeObject
|
3
|
+
module Provider
|
4
|
+
module YARD
|
5
|
+
module Object
|
6
|
+
# a namespace object can have methods and other namespace objects
|
7
|
+
# inside itself (e.g. classes and modules)
|
8
|
+
class NamespaceObject < Base
|
9
|
+
def attributes
|
10
|
+
object.class_attributes.values + object.instance_attributes.values
|
11
|
+
end
|
12
|
+
|
13
|
+
def children_fullnames
|
14
|
+
children.map(&:fullname)
|
15
|
+
end
|
16
|
+
|
17
|
+
def namespace?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
def has_methods?
|
22
|
+
children.any?(&:method?)
|
23
|
+
end
|
24
|
+
|
25
|
+
def pure_namespace?
|
26
|
+
children.all?(&:namespace?)
|
27
|
+
end
|
28
|
+
|
29
|
+
# called by MethodObject#getter?
|
30
|
+
def child(name)
|
31
|
+
if children
|
32
|
+
children.detect { |child| child.name == name }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def children
|
37
|
+
object.children.map do |o|
|
38
|
+
YARD::Object.for(o)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Inch
|
2
|
+
module CodeObject
|
3
|
+
module Provider
|
4
|
+
module YARD
|
5
|
+
# Parses the source tree (using YARD)
|
6
|
+
class Parser
|
7
|
+
DEFAULT_PATHS = ["app/**/*.rb", "lib/**/*.rb"]
|
8
|
+
DEFAULT_EXCLUDED = []
|
9
|
+
|
10
|
+
# Helper method to parse an instance with the given +args+
|
11
|
+
#
|
12
|
+
# @see #parse
|
13
|
+
# @return [CodeObject::Provider::YARD] the instance that ran
|
14
|
+
def self.parse(*args)
|
15
|
+
parser = self.new
|
16
|
+
parser.parse(*args)
|
17
|
+
parser
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse(dir, paths, excluded)
|
21
|
+
old_dir = Dir.pwd
|
22
|
+
Dir.chdir dir
|
23
|
+
parse_yard_objects(paths, excluded)
|
24
|
+
inject_base_dir(dir)
|
25
|
+
Dir.chdir old_dir
|
26
|
+
end
|
27
|
+
|
28
|
+
def objects
|
29
|
+
@objects ||= parsed_objects.map do |o|
|
30
|
+
YARD::Object.for(o)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def parse_yard_objects(paths, excluded)
|
37
|
+
::YARD::Registry.clear
|
38
|
+
::YARD.parse(paths || DEFAULT_PATHS, excluded || DEFAULT_EXCLUDED)
|
39
|
+
end
|
40
|
+
|
41
|
+
def inject_base_dir(dir)
|
42
|
+
objects.each do |object|
|
43
|
+
object.base_dir = dir
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def parsed_objects
|
48
|
+
::YARD::Registry.all
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -7,14 +7,16 @@ module Inch
|
|
7
7
|
class << self
|
8
8
|
# Returns a Proxy object for the given +code_object+
|
9
9
|
#
|
10
|
-
# @param code_object [YARD::
|
10
|
+
# @param code_object [YARD::Object::Base]
|
11
11
|
# @return [CodeObject::Proxy::Base]
|
12
12
|
def for(code_object)
|
13
13
|
@cache ||= {}
|
14
14
|
if proxy_object = @cache[cache_key(code_object)]
|
15
15
|
proxy_object
|
16
16
|
else
|
17
|
-
|
17
|
+
attributes = Converter.to_hash(code_object)
|
18
|
+
proxy_object = class_for(code_object).new(attributes)
|
19
|
+
@cache[cache_key(code_object)] = proxy_object
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
@@ -35,7 +37,7 @@ module Inch
|
|
35
37
|
#
|
36
38
|
# @return [String]
|
37
39
|
def cache_key(code_object)
|
38
|
-
code_object.
|
40
|
+
code_object.fullname
|
39
41
|
end
|
40
42
|
end
|
41
43
|
end
|
@@ -6,60 +6,88 @@ module Inch
|
|
6
6
|
# @abstract
|
7
7
|
class Base
|
8
8
|
extend Forwardable
|
9
|
-
include NodocHelper
|
10
|
-
|
11
|
-
# @return [YARD::CodeObjects::Base] the actual (YARD) code object
|
12
|
-
attr_reader :object
|
13
9
|
|
14
10
|
# @return [Symbol]
|
15
11
|
# when objects are assigned to GradeLists, this grade is set to
|
16
12
|
# enable easier querying for objects of a certain grade
|
17
13
|
attr_writer :grade
|
18
14
|
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def_delegators :object, :type, :path, :name, :namespace, :source, :source_type, :signature, :group, :dynamic, :visibility, :docstring
|
15
|
+
# @return [#find]
|
16
|
+
# an object that responds to #find to look up objects by their
|
17
|
+
# full name
|
18
|
+
attr_accessor :object_lookup
|
24
19
|
|
25
20
|
# convenient shortcuts to evalution object
|
26
21
|
def_delegators :evaluation, :score, :roles, :priority
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
@object = object
|
23
|
+
def initialize(attributes)
|
24
|
+
@attributes = attributes
|
31
25
|
end
|
32
26
|
|
33
|
-
|
34
|
-
|
27
|
+
# Returns the attribute for the given +key+
|
28
|
+
#
|
29
|
+
# @param key [Symbol]
|
30
|
+
def [](key)
|
31
|
+
@attributes[key]
|
35
32
|
end
|
36
33
|
|
37
|
-
|
38
|
-
|
34
|
+
# @return [Evaluation::Base]
|
35
|
+
def evaluation
|
36
|
+
@evaluation ||= Evaluation::Proxy.for(self)
|
39
37
|
end
|
40
38
|
|
41
|
-
#
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
39
|
+
# @return [Symbol]
|
40
|
+
def grade
|
41
|
+
@grade ||= Evaluation.new_grade_lists.detect { |range|
|
42
|
+
range.scores.include?(score)
|
43
|
+
}.grade
|
46
44
|
end
|
47
45
|
|
48
|
-
#
|
49
|
-
|
50
|
-
|
46
|
+
# @return [Boolean] +true+ if the object has an @api tag
|
47
|
+
def api_tag?
|
48
|
+
self[:api_tag?]
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [Array] the children of the current object
|
51
52
|
def children
|
52
|
-
|
53
|
+
@children ||= self[:children_fullnames].map do |fullname|
|
54
|
+
object_lookup.find(fullname)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [Boolean] +true+ if the object represents a constant
|
59
|
+
def constant?
|
60
|
+
self[:constant?]
|
61
|
+
end
|
62
|
+
|
63
|
+
def core?
|
64
|
+
self[:api_tag?]
|
65
|
+
end
|
66
|
+
|
67
|
+
# The depth of the following is 4:
|
68
|
+
#
|
69
|
+
# Foo::Bar::Baz#initialize
|
70
|
+
# ^ ^ ^ ^
|
71
|
+
# 1 << 2 << 3 << 4
|
72
|
+
#
|
73
|
+
# +depth+ answers the question "how many layers of code objects are
|
74
|
+
# above this one?"
|
75
|
+
#
|
76
|
+
# @note top-level counts, that's why Foo has depth 1!
|
77
|
+
#
|
78
|
+
# @param i [Fixnum] a counter for recursive method calls
|
79
|
+
# @return [Fixnum] the depth of the object in terms of namespace
|
80
|
+
def depth
|
81
|
+
self[:depth]
|
53
82
|
end
|
54
83
|
|
55
84
|
# @return [Docstring]
|
56
85
|
def docstring
|
57
|
-
|
86
|
+
self[:docstring]
|
58
87
|
end
|
59
88
|
|
60
|
-
|
61
|
-
|
62
|
-
@evaluation ||= Evaluation.for(self)
|
89
|
+
def files
|
90
|
+
self[:files]
|
63
91
|
end
|
64
92
|
|
65
93
|
# Returns the name of the file where the object is declared first
|
@@ -67,146 +95,111 @@ module Inch
|
|
67
95
|
def filename
|
68
96
|
# just checking the first file (which is the file where an object
|
69
97
|
# is first declared)
|
70
|
-
files.
|
98
|
+
files.first
|
71
99
|
end
|
72
100
|
|
73
|
-
# @return [
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
101
|
+
# @return [String] the name of an object, e.g.
|
102
|
+
# "Docstring"
|
103
|
+
def name
|
104
|
+
self[:name]
|
105
|
+
end
|
106
|
+
|
107
|
+
# @return [String] the fully qualified name of an object, e.g.
|
108
|
+
# "Inch::CodeObject::Provider::YARD::Docstring"
|
109
|
+
def fullname
|
110
|
+
self[:fullname]
|
78
111
|
end
|
79
112
|
|
80
113
|
def has_alias?
|
81
|
-
|
114
|
+
self[:has_alias?]
|
115
|
+
end
|
116
|
+
|
117
|
+
def has_children?
|
118
|
+
self[:has_children?]
|
82
119
|
end
|
83
120
|
|
84
121
|
def has_code_example?
|
85
|
-
|
86
|
-
docstring.contains_code_example?
|
122
|
+
self[:has_code_example?]
|
87
123
|
end
|
88
124
|
|
89
125
|
def has_doc?
|
90
|
-
|
126
|
+
self[:has_doc?]
|
91
127
|
end
|
92
128
|
|
93
129
|
def has_multiple_code_examples?
|
94
|
-
|
95
|
-
true
|
96
|
-
else
|
97
|
-
if tag = tag(:example)
|
98
|
-
multi_code_examples?(tag.text)
|
99
|
-
elsif text = docstring.code_examples.first
|
100
|
-
multi_code_examples?(text)
|
101
|
-
else
|
102
|
-
false
|
103
|
-
end
|
104
|
-
end
|
130
|
+
self[:has_multiple_code_examples?]
|
105
131
|
end
|
106
132
|
|
107
133
|
def has_unconsidered_tags?
|
108
|
-
|
134
|
+
self[:has_unconsidered_tags?]
|
109
135
|
end
|
110
136
|
|
111
137
|
def in_root?
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
# The depth of the following is 4:
|
116
|
-
#
|
117
|
-
# Foo::Bar::Baz#initialize
|
118
|
-
# ^ ^ ^ ^
|
119
|
-
# 1 << 2 << 3 << 4
|
120
|
-
#
|
121
|
-
# +depth+ answers the question "how many layers of code objects are
|
122
|
-
# above this one?"
|
123
|
-
#
|
124
|
-
# @note top-level counts, that's why Foo has depth 1!
|
125
|
-
#
|
126
|
-
# @param i [Fixnum] a counter for recursive method calls
|
127
|
-
# @return [Fixnum] the depth of the object in terms of namespace
|
128
|
-
def depth(i = 0)
|
129
|
-
if parent
|
130
|
-
parent.depth(i+1)
|
131
|
-
else
|
132
|
-
i
|
133
|
-
end
|
138
|
+
self[:in_root?]
|
134
139
|
end
|
135
140
|
|
136
141
|
# @return [Boolean] +true+ if the object represents a method
|
137
142
|
def method?
|
138
|
-
|
143
|
+
self[:method?]
|
139
144
|
end
|
140
145
|
|
141
146
|
# @return [Boolean] +true+ if the object represents a namespace
|
142
147
|
def namespace?
|
143
|
-
|
148
|
+
self[:namespace?]
|
149
|
+
end
|
150
|
+
|
151
|
+
# @return [Boolean] +true+ if the object was tagged not to be documented
|
152
|
+
def nodoc?
|
153
|
+
self[:nodoc?]
|
144
154
|
end
|
145
155
|
|
146
156
|
# @return [Array,nil] the parent of the current object or +nil+
|
147
157
|
def parent
|
148
|
-
|
158
|
+
object_lookup.find( self[:parent_fullname] )
|
149
159
|
end
|
150
160
|
|
151
161
|
def private?
|
152
|
-
|
162
|
+
self[:private?]
|
153
163
|
end
|
154
164
|
|
155
165
|
# @return [Boolean]
|
156
166
|
# +true+ if the object or its parent is tagged as @private
|
157
167
|
def private_tag?
|
158
|
-
|
159
|
-
end
|
160
|
-
|
161
|
-
def private_tag
|
162
|
-
tag(:private) || (parent && parent.private_tag)
|
168
|
+
self[:private_tag?]
|
163
169
|
end
|
164
170
|
|
165
171
|
def private_api_tag?
|
166
|
-
|
172
|
+
self[:private_api_tag?]
|
167
173
|
end
|
168
174
|
|
169
175
|
def protected?
|
170
|
-
|
176
|
+
self[:protected?]
|
171
177
|
end
|
172
178
|
|
173
179
|
def public?
|
174
|
-
|
180
|
+
self[:public?]
|
175
181
|
end
|
176
182
|
|
177
|
-
|
178
|
-
|
179
|
-
docstring.empty? && tags.empty?
|
183
|
+
def source
|
184
|
+
self[:source]
|
180
185
|
end
|
181
186
|
|
182
|
-
# @return [
|
183
|
-
|
184
|
-
|
185
|
-
@unconsidered_tags ||= tags.reject do |tag|
|
186
|
-
CONSIDERED_YARD_TAGS.include?(tag.tag_name)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def inspect
|
191
|
-
"#<#{self.class.to_s}: #{path}>"
|
187
|
+
# @return [Boolean] +true+ if the object has no documentation at all
|
188
|
+
def undocumented?
|
189
|
+
self[:undocumented?]
|
192
190
|
end
|
193
191
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
text.scan(/\b(#{Regexp.escape(name)})[^_0-9\!\?]/m).size > 1
|
192
|
+
# @return [Fixnum] the amount of tags not considered for this object
|
193
|
+
def unconsidered_tag_count
|
194
|
+
self[:unconsidered_tag_count]
|
198
195
|
end
|
199
196
|
|
200
|
-
def
|
201
|
-
|
197
|
+
def visibility
|
198
|
+
self[:visibility]
|
202
199
|
end
|
203
200
|
|
204
|
-
def
|
205
|
-
|
206
|
-
rescue YARD::CodeObjects::ProxyMethodError
|
207
|
-
# this error is raised by YARD
|
208
|
-
# see broken.rb in test fixtures
|
209
|
-
[]
|
201
|
+
def inspect
|
202
|
+
"#<#{self.class.to_s}: #{fullname}>"
|
210
203
|
end
|
211
204
|
end
|
212
205
|
end
|