inch 0.2.3 → 0.3.0.rc1
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 +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
|