yard 0.2.1 → 0.2.2
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.
Potentially problematic release.
This version of yard might be problematic. Click here for more details.
- data/{LICENSE.txt → LICENSE} +1 -1
- data/README +211 -0
- data/Rakefile +31 -0
- data/benchmarks/builtins_vs_eval.rb +23 -0
- data/benchmarks/erb_vs_erubis.rb +53 -0
- data/benchmarks/generation.rb +37 -0
- data/benchmarks/parsing.rb +33 -0
- data/bin/view_generator +17 -0
- data/bin/yard-graph +4 -0
- data/bin/yardoc +1 -93
- data/bin/yri +12 -3
- data/lib/yard.rb +10 -5
- data/lib/yard/autoload.rb +116 -0
- data/lib/yard/cli/yard_graph.rb +86 -0
- data/lib/yard/cli/yardoc.rb +131 -0
- data/lib/yard/code_objects/base.rb +321 -0
- data/lib/yard/code_objects/class_object.rb +89 -0
- data/lib/yard/code_objects/class_variable_object.rb +4 -0
- data/lib/yard/code_objects/constant_object.rb +4 -0
- data/lib/yard/code_objects/method_object.rb +51 -0
- data/lib/yard/code_objects/module_object.rb +4 -0
- data/lib/yard/code_objects/namespace_object.rb +88 -0
- data/lib/yard/code_objects/proxy.rb +183 -0
- data/lib/yard/code_objects/root_object.rb +8 -0
- data/lib/yard/core_ext/file.rb +26 -0
- data/lib/yard/core_ext/logger.rb +5 -0
- data/lib/yard/core_ext/module.rb +9 -0
- data/lib/yard/core_ext/string.rb +13 -0
- data/lib/yard/core_ext/symbol_hash.rb +24 -0
- data/lib/yard/generators/attributes_generator.rb +22 -0
- data/lib/yard/generators/base.rb +285 -0
- data/lib/yard/generators/class_generator.rb +25 -0
- data/lib/yard/generators/constants_generator.rb +73 -0
- data/lib/yard/generators/constructor_generator.rb +25 -0
- data/lib/yard/generators/deprecated_generator.rb +15 -0
- data/lib/yard/generators/docstring_generator.rb +15 -0
- data/lib/yard/generators/full_doc_generator.rb +59 -0
- data/lib/yard/generators/helpers/base_helper.rb +52 -0
- data/lib/yard/generators/helpers/filter_helper.rb +21 -0
- data/lib/yard/generators/helpers/html_helper.rb +137 -0
- data/lib/yard/generators/helpers/method_helper.rb +27 -0
- data/lib/yard/generators/helpers/uml_helper.rb +16 -0
- data/lib/yard/generators/inheritance_generator.rb +16 -0
- data/lib/yard/generators/method_details_generator.rb +18 -0
- data/lib/yard/generators/method_generator.rb +31 -0
- data/lib/yard/generators/method_listing_generator.rb +105 -0
- data/lib/yard/generators/method_missing_generator.rb +25 -0
- data/lib/yard/generators/method_signature_generator.rb +19 -0
- data/lib/yard/generators/method_summary_generator.rb +21 -0
- data/lib/yard/generators/mixins_generator.rb +15 -0
- data/lib/yard/generators/module_generator.rb +22 -0
- data/lib/yard/generators/quick_doc_generator.rb +31 -0
- data/lib/yard/generators/source_generator.rb +26 -0
- data/lib/yard/generators/tags_generator.rb +50 -0
- data/lib/yard/generators/uml_generator.rb +92 -0
- data/lib/yard/generators/visibility_group_generator.rb +26 -0
- data/lib/yard/handlers/alias_handler.rb +32 -0
- data/lib/yard/handlers/attribute_handler.rb +54 -0
- data/lib/yard/handlers/base.rb +509 -0
- data/lib/yard/handlers/class_handler.rb +44 -0
- data/lib/yard/handlers/class_variable_handler.rb +13 -0
- data/lib/yard/handlers/constant_handler.rb +13 -0
- data/lib/yard/handlers/exception_handler.rb +12 -0
- data/lib/yard/handlers/method_handler.rb +27 -0
- data/lib/yard/handlers/mixin_handler.rb +16 -0
- data/lib/yard/handlers/module_handler.rb +9 -0
- data/lib/yard/handlers/visibility_handler.rb +14 -0
- data/lib/yard/handlers/yield_handler.rb +26 -0
- data/lib/yard/logging.rb +27 -0
- data/lib/yard/parser/ruby_lex.rb +1344 -0
- data/lib/yard/parser/source_parser.rb +109 -0
- data/lib/yard/parser/statement.rb +36 -0
- data/lib/yard/parser/statement_list.rb +167 -0
- data/lib/yard/parser/token_list.rb +58 -0
- data/lib/yard/rake/yardoc_task.rb +30 -0
- data/lib/yard/registry.rb +136 -0
- data/lib/yard/serializers/base.rb +16 -0
- data/lib/yard/serializers/file_system_serializer.rb +48 -0
- data/lib/yard/serializers/process_serializer.rb +14 -0
- data/lib/yard/serializers/stdout_serializer.rb +21 -0
- data/lib/yard/tags/default_factory.rb +98 -0
- data/lib/yard/tags/library.rb +109 -0
- data/lib/yard/tags/merbdoc_factory.rb +47 -0
- data/lib/yard/tags/tag.rb +35 -0
- data/spec/code_objects/base_spec.rb +219 -0
- data/spec/code_objects/class_object_spec.rb +176 -0
- data/spec/code_objects/code_object_list_spec.rb +33 -0
- data/spec/code_objects/constants_spec.rb +79 -0
- data/spec/code_objects/method_object_spec.rb +30 -0
- data/spec/code_objects/module_object_spec.rb +73 -0
- data/spec/code_objects/namespace_object_spec.rb +129 -0
- data/spec/code_objects/proxy_spec.rb +80 -0
- data/spec/code_objects/spec_helper.rb +3 -0
- data/spec/core_ext/file_spec.rb +20 -0
- data/spec/core_ext/string_spec.rb +4 -0
- data/spec/core_ext/symbol_hash_spec.rb +80 -0
- data/spec/generators/base_spec.rb +64 -0
- data/spec/generators/helpers/base_helper_spec.rb +15 -0
- data/spec/generators/helpers/html_helper_spec.rb +56 -0
- data/spec/generators/quick_doc_generator_spec.rb +13 -0
- data/spec/handlers/alias_handler_spec.rb +50 -0
- data/spec/handlers/attribute_handler_spec.rb +78 -0
- data/spec/handlers/base_spec.rb +165 -0
- data/spec/handlers/class_handler_spec.rb +68 -0
- data/spec/handlers/class_variable_handler_spec.rb +9 -0
- data/spec/handlers/constant_handler_spec.rb +13 -0
- data/spec/handlers/examples/alias_handler_001.rb.txt +24 -0
- data/spec/handlers/examples/attribute_handler_001.rb.txt +19 -0
- data/spec/handlers/examples/class_handler_001.rb.txt +39 -0
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -0
- data/spec/handlers/examples/constant_handler_001.rb.txt +10 -0
- data/spec/handlers/examples/exception_handler_001.rb.txt +42 -0
- data/spec/handlers/examples/method_handler_001.rb.txt +35 -0
- data/spec/handlers/examples/mixin_handler_001.rb.txt +12 -0
- data/spec/handlers/examples/module_handler_001.rb.txt +16 -0
- data/spec/handlers/examples/visibility_handler_001.rb.txt +20 -0
- data/spec/handlers/examples/yield_handler_001.rb.txt +55 -0
- data/spec/handlers/exception_handler_spec.rb +35 -0
- data/spec/handlers/method_handler_spec.rb +35 -0
- data/spec/handlers/mixin_handler_spec.rb +30 -0
- data/spec/handlers/module_handler_spec.rb +25 -0
- data/spec/handlers/spec_helper.rb +21 -0
- data/spec/handlers/visibility_handler_spec.rb +24 -0
- data/spec/handlers/yield_handler_spec.rb +51 -0
- data/spec/parser/examples/example1.rb.txt +8 -0
- data/spec/parser/examples/tag_handler_001.rb.txt +8 -0
- data/spec/parser/source_parser_spec.rb +43 -0
- data/spec/parser/tag_parsing_spec.rb +18 -0
- data/spec/parser/token_list_spec.rb +35 -0
- data/spec/registry_spec.rb +70 -0
- data/spec/serializers/file_system_serializer_spec.rb +91 -0
- data/spec/serializers/spec_helper.rb +2 -0
- data/spec/spec_helper.rb +77 -0
- data/templates/default/attributes/html/header.erb +35 -0
- data/templates/default/attributes/text/header.erb +10 -0
- data/templates/default/class/html/header.erb +4 -0
- data/templates/default/constants/html/constants.erb +9 -0
- data/templates/default/constants/html/header.erb +3 -0
- data/templates/default/constants/html/included.erb +9 -0
- data/templates/default/constants/html/inherited.erb +9 -0
- data/templates/default/constructor/html/header.erb +10 -0
- data/templates/default/deprecated/html/main.erb +4 -0
- data/templates/default/deprecated/text/main.erb +3 -0
- data/templates/default/docstring/html/main.erb +3 -0
- data/templates/default/docstring/text/main.erb +3 -0
- data/templates/default/fulldoc/html/all_methods.erb +25 -0
- data/templates/default/fulldoc/html/all_namespaces.erb +19 -0
- data/templates/default/fulldoc/html/app.js +18 -0
- data/templates/default/fulldoc/html/header.erb +15 -0
- data/templates/default/fulldoc/html/html_head.erb +3 -0
- data/templates/default/fulldoc/html/index.erb +18 -0
- data/templates/default/fulldoc/html/jquery.js +11 -0
- data/templates/default/fulldoc/html/readme.erb +15 -0
- data/templates/default/fulldoc/html/style.css +65 -0
- data/templates/default/fulldoc/html/syntax_highlight.css +21 -0
- data/templates/default/inheritance/html/header.erb +8 -0
- data/templates/default/inheritance/text/header.erb +3 -0
- data/templates/default/method/html/aliases.erb +6 -0
- data/templates/default/method/html/header.erb +3 -0
- data/templates/default/method/html/title.erb +3 -0
- data/templates/default/methoddetails/html/header.erb +8 -0
- data/templates/default/methoddetails/html/method_header.erb +3 -0
- data/templates/default/methodmissing/html/header.erb +12 -0
- data/templates/default/methodsignature/html/main.erb +8 -0
- data/templates/default/methodsignature/text/main.erb +5 -0
- data/templates/default/methodsummary/html/header.erb +5 -0
- data/templates/default/methodsummary/html/included.erb +9 -0
- data/templates/default/methodsummary/html/inherited.erb +9 -0
- data/templates/default/methodsummary/html/summary.erb +25 -0
- data/templates/default/methodsummary/text/header.erb +5 -0
- data/templates/default/methodsummary/text/included.erb +0 -0
- data/templates/default/methodsummary/text/inherited.erb +0 -0
- data/templates/default/methodsummary/text/summary.erb +3 -0
- data/templates/default/mixins/html/header.erb +4 -0
- data/templates/default/module/html/header.erb +4 -0
- data/templates/default/quickdoc/html/header.erb +15 -0
- data/templates/default/quickdoc/text/header.erb +12 -0
- data/templates/default/source/html/main.erb +15 -0
- data/templates/default/source/text/main.erb +4 -0
- data/templates/default/tags/html/header.erb +4 -0
- data/templates/default/tags/html/see.erb +13 -0
- data/templates/default/tags/html/tags.erb +20 -0
- data/templates/default/tags/text/header.erb +3 -0
- data/templates/default/tags/text/see.erb +5 -0
- data/templates/default/tags/text/tags.erb +7 -0
- data/templates/default/uml/dot/child.erb +1 -0
- data/templates/default/uml/dot/dependencies.erb +10 -0
- data/templates/default/uml/dot/header.erb +6 -0
- data/templates/default/uml/dot/info.erb +14 -0
- data/templates/default/uml/dot/subgraph.erb +6 -0
- data/templates/default/uml/dot/superclasses.erb +9 -0
- data/templates/default/uml/dot/unknown.erb +3 -0
- data/templates/default/uml/dot/unknown_child.erb +1 -0
- data/templates/default/visibilitygroup/html/header.erb +6 -0
- data/templates/javadoc/attributes/html/header.erb +16 -0
- data/templates/javadoc/class/html/header.erb +4 -0
- data/templates/javadoc/constants/html/constants.erb +9 -0
- data/templates/javadoc/constants/html/header.erb +3 -0
- data/templates/javadoc/constants/html/included.erb +12 -0
- data/templates/javadoc/constants/html/inherited.erb +12 -0
- data/templates/javadoc/constructor/html/header.erb +10 -0
- data/templates/javadoc/deprecated/html/main.erb +0 -0
- data/templates/javadoc/docstring/html/main.erb +6 -0
- data/templates/javadoc/fulldoc/html/all_methods.erb +25 -0
- data/templates/javadoc/fulldoc/html/all_namespaces.erb +19 -0
- data/templates/javadoc/fulldoc/html/app.js +18 -0
- data/templates/javadoc/fulldoc/html/header.erb +15 -0
- data/templates/javadoc/fulldoc/html/html_head.erb +3 -0
- data/templates/javadoc/fulldoc/html/index.erb +18 -0
- data/templates/javadoc/fulldoc/html/jquery.js +11 -0
- data/templates/javadoc/fulldoc/html/readme.erb +15 -0
- data/templates/javadoc/fulldoc/html/style.css +22 -0
- data/templates/javadoc/fulldoc/html/syntax_highlight.css +21 -0
- data/templates/javadoc/inheritance/html/header.erb +6 -0
- data/templates/javadoc/method/html/aliases.erb +6 -0
- data/templates/javadoc/method/html/header.erb +4 -0
- data/templates/javadoc/method/html/title.erb +4 -0
- data/templates/javadoc/methoddetails/html/header.erb +8 -0
- data/templates/javadoc/methoddetails/html/method_header.erb +0 -0
- data/templates/javadoc/methodmissing/html/header.erb +12 -0
- data/templates/javadoc/methodsignature/html/main.erb +8 -0
- data/templates/javadoc/methodsummary/html/header.erb +5 -0
- data/templates/javadoc/methodsummary/html/included.erb +12 -0
- data/templates/javadoc/methodsummary/html/inherited.erb +12 -0
- data/templates/javadoc/methodsummary/html/summary.erb +25 -0
- data/templates/javadoc/mixins/html/header.erb +5 -0
- data/templates/javadoc/module/html/header.erb +4 -0
- data/templates/javadoc/source/html/main.erb +15 -0
- data/templates/javadoc/tags/html/header.erb +5 -0
- data/templates/javadoc/tags/html/see.erb +8 -0
- data/templates/javadoc/tags/html/tags.erb +19 -0
- data/templates/javadoc/visibilitygroup/html/header.erb +5 -0
- metadata +352 -50
- data/README.pdf +0 -0
- data/lib/code_object.rb +0 -337
- data/lib/extra.rb +0 -8
- data/lib/formatter.rb +0 -90
- data/lib/handlers/all_handlers.rb +0 -2
- data/lib/handlers/attribute_handler.rb +0 -51
- data/lib/handlers/class_handler.rb +0 -30
- data/lib/handlers/class_variable_handler.rb +0 -9
- data/lib/handlers/code_object_handler.rb +0 -104
- data/lib/handlers/constant_handler.rb +0 -11
- data/lib/handlers/exception_handler.rb +0 -20
- data/lib/handlers/method_handler.rb +0 -28
- data/lib/handlers/mixin_handler.rb +0 -15
- data/lib/handlers/module_handler.rb +0 -9
- data/lib/handlers/visibility_handler.rb +0 -7
- data/lib/handlers/yield_handler.rb +0 -33
- data/lib/logger.rb +0 -19
- data/lib/namespace.rb +0 -98
- data/lib/quick_doc.rb +0 -104
- data/lib/ruby_lex.rb +0 -1321
- data/lib/source_parser.rb +0 -253
- data/lib/tag_library.rb +0 -175
- data/lib/tag_type.rb +0 -155
- data/templates/default/html/_fulldoc.erb +0 -64
- data/templates/default/html/class.erb +0 -226
- data/templates/default/html/method.erb +0 -20
- data/templates/default/html/module.erb +0 -126
- data/test/fixtures/docstring.txt +0 -23
- data/test/fixtures/docstring2.txt +0 -4
- data/test/test_code_object.rb +0 -66
- data/test/test_namespace.rb +0 -10
@@ -0,0 +1,89 @@
|
|
1
|
+
module YARD::CodeObjects
|
2
|
+
class ClassObject < NamespaceObject
|
3
|
+
attr_accessor :superclass
|
4
|
+
|
5
|
+
def initialize(namespace, name, *args, &block)
|
6
|
+
super
|
7
|
+
|
8
|
+
if is_exception?
|
9
|
+
self.superclass ||= :Exception
|
10
|
+
else
|
11
|
+
self.superclass ||= :Object unless P(namespace, name) == P(:Object)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def is_exception?
|
16
|
+
inheritance_tree.reverse.any? {|o| BUILTIN_EXCEPTIONS_HASH.has_key? o.path }
|
17
|
+
end
|
18
|
+
|
19
|
+
def inheritance_tree(include_mods = false)
|
20
|
+
list = [self] + (include_mods ? mixins : [])
|
21
|
+
if superclass.is_a? Proxy
|
22
|
+
list << superclass unless superclass == P(:Object)
|
23
|
+
elsif superclass.respond_to? :inheritance_tree
|
24
|
+
list += superclass.inheritance_tree
|
25
|
+
end
|
26
|
+
list
|
27
|
+
end
|
28
|
+
|
29
|
+
def meths(opts = {})
|
30
|
+
opts = SymbolHash[:inherited => true].update(opts)
|
31
|
+
super(opts) + (opts[:inherited] ? inherited_meths(opts) : [])
|
32
|
+
end
|
33
|
+
|
34
|
+
def inherited_meths(opts = {})
|
35
|
+
inheritance_tree[1..-1].inject([]) do |list, superclass|
|
36
|
+
if superclass.is_a?(Proxy)
|
37
|
+
list
|
38
|
+
else
|
39
|
+
list += superclass.meths(opts).reject do |o|
|
40
|
+
child(:name => o.name, :scope => o.scope) ||
|
41
|
+
list.find {|o2| o2.name == o.name && o2.scope == o.scope }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def constants(opts = {})
|
48
|
+
opts = SymbolHash[:inherited => true].update(opts)
|
49
|
+
super(opts) + (opts[:inherited] ? inherited_constants : [])
|
50
|
+
end
|
51
|
+
|
52
|
+
def inherited_constants
|
53
|
+
inheritance_tree[1..-1].inject([]) do |list, superclass|
|
54
|
+
if superclass.is_a?(Proxy)
|
55
|
+
list
|
56
|
+
else
|
57
|
+
list += superclass.constants.reject do |o|
|
58
|
+
child(:name => o.name) || list.find {|o2| o2.name == o.name }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# Sets the superclass of the object
|
66
|
+
#
|
67
|
+
# @param [Base, Proxy, String, Symbol, nil] object the superclass value
|
68
|
+
def superclass=(object)
|
69
|
+
case object
|
70
|
+
when Base, Proxy, NilClass
|
71
|
+
@superclass = object
|
72
|
+
when String, Symbol
|
73
|
+
@superclass = Proxy.new(namespace, object)
|
74
|
+
else
|
75
|
+
raise ArgumentError, "superclass must be CodeObject, Proxy, String or Symbol"
|
76
|
+
end
|
77
|
+
|
78
|
+
if name == @superclass.name && namespace != YARD::Registry.root
|
79
|
+
@superclass = Proxy.new(namespace.namespace, object)
|
80
|
+
end
|
81
|
+
|
82
|
+
if @superclass == self
|
83
|
+
msg = "superclass #{@superclass.inspect} cannot be the same as the subclass #{self}"
|
84
|
+
@superclass = P(:Object)
|
85
|
+
raise ArgumentError, msg
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module YARD::CodeObjects
|
2
|
+
class MethodObject < Base
|
3
|
+
attr_accessor :visibility, :scope, :explicit
|
4
|
+
|
5
|
+
def initialize(namespace, name, scope = :instance)
|
6
|
+
self.visibility = :public
|
7
|
+
self.scope = scope
|
8
|
+
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
def scope=(v) @scope = v.to_sym end
|
13
|
+
def visibility=(v) @visibility = v.to_sym end
|
14
|
+
|
15
|
+
def is_attribute?
|
16
|
+
namespace.attributes[scope].has_key? name.to_s.gsub(/=$/, '')
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_alias?
|
20
|
+
namespace.aliases.has_key? self
|
21
|
+
end
|
22
|
+
|
23
|
+
def is_explicit?
|
24
|
+
explicit ? true : false
|
25
|
+
end
|
26
|
+
|
27
|
+
def aliases
|
28
|
+
list = []
|
29
|
+
namespace.aliases.each do |o, aname|
|
30
|
+
list << o if aname == name && o.scope == scope
|
31
|
+
end
|
32
|
+
list
|
33
|
+
end
|
34
|
+
|
35
|
+
def path
|
36
|
+
if !namespace || namespace.path == ""
|
37
|
+
sep + super
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def name(prefix = false)
|
44
|
+
prefix && sep == ISEP ? sep + super().to_s : super()
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def sep; scope == :class ? super : ISEP end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module YARD::CodeObjects
|
2
|
+
class NamespaceObject < Base
|
3
|
+
attr_reader :children, :cvars, :meths, :constants, :mixins, :attributes, :aliases
|
4
|
+
|
5
|
+
def initialize(namespace, name, *args, &block)
|
6
|
+
@children = CodeObjectList.new(self)
|
7
|
+
@mixins = CodeObjectList.new(self)
|
8
|
+
@attributes = SymbolHash[:class => SymbolHash.new, :instance => SymbolHash.new]
|
9
|
+
@aliases = {}
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def class_attributes
|
14
|
+
attributes[:class]
|
15
|
+
end
|
16
|
+
|
17
|
+
def instance_attributes
|
18
|
+
attributes[:instance]
|
19
|
+
end
|
20
|
+
|
21
|
+
def child(opts = {})
|
22
|
+
if !opts.is_a?(Hash)
|
23
|
+
children.find {|o| o.name == opts.to_sym }
|
24
|
+
else
|
25
|
+
opts = SymbolHash[opts]
|
26
|
+
children.find do |obj|
|
27
|
+
opts.each do |meth, value|
|
28
|
+
break false if obj[meth] != value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def meths(opts = {})
|
35
|
+
opts = SymbolHash[
|
36
|
+
:visibility => [:public, :private, :protected],
|
37
|
+
:scope => [:class, :instance],
|
38
|
+
:included => true
|
39
|
+
].update(opts)
|
40
|
+
|
41
|
+
opts[:visibility] = [opts[:visibility]].flatten
|
42
|
+
opts[:scope] = [opts[:scope]].flatten
|
43
|
+
|
44
|
+
ourmeths = children.select do |o|
|
45
|
+
o.is_a?(MethodObject) &&
|
46
|
+
opts[:visibility].include?(o.visibility) &&
|
47
|
+
opts[:scope].include?(o.scope)
|
48
|
+
end
|
49
|
+
|
50
|
+
ourmeths + (opts[:included] ? included_meths(opts) : [])
|
51
|
+
end
|
52
|
+
|
53
|
+
def included_meths(opts = {})
|
54
|
+
mixins.reverse.inject([]) do |list, mixin|
|
55
|
+
if mixin.is_a?(Proxy)
|
56
|
+
list
|
57
|
+
else
|
58
|
+
list += mixin.meths(opts).reject do |o|
|
59
|
+
child(:name => o.name, :scope => o.scope) ||
|
60
|
+
list.find {|o2| o2.name == o.name && o2.scope == o.scope }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def constants(opts = {})
|
67
|
+
opts = SymbolHash[:included => true].update(opts)
|
68
|
+
consts = children.select {|o| o.is_a? ConstantObject }
|
69
|
+
consts + (opts[:included] ? included_constants : [])
|
70
|
+
end
|
71
|
+
|
72
|
+
def included_constants
|
73
|
+
mixins.reverse.inject([]) do |list, mixin|
|
74
|
+
if mixin.is_a?(Proxy)
|
75
|
+
list
|
76
|
+
else
|
77
|
+
list += mixin.constants.reject do |o|
|
78
|
+
child(:name => o.name) || list.find {|o2| o2.name == o.name }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def cvars
|
85
|
+
children.select {|o| o.is_a? ClassVariableObject }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
module YARD
|
2
|
+
module CodeObjects
|
3
|
+
class ProxyMethodError < NoMethodError; end
|
4
|
+
|
5
|
+
class Proxy
|
6
|
+
def self.===(other) other.is_a?(self) end
|
7
|
+
|
8
|
+
attr_reader :namespace, :name
|
9
|
+
alias_method :parent, :namespace
|
10
|
+
|
11
|
+
# @raise ArgumentError if namespace is not a NamespaceObject
|
12
|
+
def initialize(namespace, name)
|
13
|
+
namespace = Registry.root if !namespace || namespace == :root
|
14
|
+
|
15
|
+
if name =~ /^#{NSEP}/
|
16
|
+
namespace = Registry.root
|
17
|
+
name = name[2..-1]
|
18
|
+
end
|
19
|
+
|
20
|
+
if name =~ /(?:#{NSEP}|#{ISEP})([^#{NSEP}#{ISEP}]+)$/
|
21
|
+
@orignamespace, @origname = namespace, name
|
22
|
+
@imethod = true if name.include? ISEP
|
23
|
+
namespace = $`.empty? ? Registry.root : Proxy.new(namespace, $`)
|
24
|
+
name = $1
|
25
|
+
end
|
26
|
+
|
27
|
+
@name = name.to_sym
|
28
|
+
@namespace = namespace
|
29
|
+
|
30
|
+
unless @namespace.is_a?(NamespaceObject) or @namespace.is_a?(Proxy)
|
31
|
+
raise ArgumentError, "Invalid namespace object: #{namespace}"
|
32
|
+
end
|
33
|
+
|
34
|
+
# If the name begins with "::" (like "::String")
|
35
|
+
# this is definitely a root level object, so
|
36
|
+
# remove the namespace and attach it to the root
|
37
|
+
if @name =~ /^#{NSEP}/
|
38
|
+
@name.gsub!(/^#{NSEP}/, '')
|
39
|
+
@namespace = Registry.root
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def inspect
|
44
|
+
if obj = to_obj
|
45
|
+
obj.inspect
|
46
|
+
else
|
47
|
+
"P(#{path})"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def path
|
52
|
+
if obj = to_obj
|
53
|
+
obj.path
|
54
|
+
else
|
55
|
+
if @namespace == Registry.root
|
56
|
+
(@imethod ? ISEP : "") + name.to_s
|
57
|
+
else
|
58
|
+
@origname || name.to_s
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
alias to_s path
|
63
|
+
|
64
|
+
def is_a?(klass)
|
65
|
+
if obj = to_obj
|
66
|
+
obj.is_a?(klass)
|
67
|
+
else
|
68
|
+
self.class <= klass
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def ===(other)
|
73
|
+
if obj = to_obj
|
74
|
+
obj === other
|
75
|
+
else
|
76
|
+
self.class <= other.class
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def <=>(other)
|
81
|
+
if other.respond_to? :path
|
82
|
+
path <=> other.path
|
83
|
+
else
|
84
|
+
false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def ==(other)
|
89
|
+
if other.respond_to? :path
|
90
|
+
path == other.path
|
91
|
+
else
|
92
|
+
false
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def class
|
97
|
+
if obj = to_obj
|
98
|
+
obj.class
|
99
|
+
else
|
100
|
+
Proxy
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def type
|
105
|
+
if obj = to_obj
|
106
|
+
obj.type
|
107
|
+
else
|
108
|
+
Registry.proxy_types[path] || :proxy
|
109
|
+
end
|
110
|
+
end
|
111
|
+
def type=(type) Registry.proxy_types[path] = type.to_sym end
|
112
|
+
|
113
|
+
def instance_of?(klass)
|
114
|
+
self.class == klass
|
115
|
+
end
|
116
|
+
|
117
|
+
def kind_of?(klass)
|
118
|
+
self.class <= klass
|
119
|
+
end
|
120
|
+
|
121
|
+
def object_id
|
122
|
+
if obj = to_obj
|
123
|
+
obj.object_id
|
124
|
+
else
|
125
|
+
nil
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def respond_to?(meth)
|
130
|
+
if obj = to_obj
|
131
|
+
obj.respond_to?(meth)
|
132
|
+
else
|
133
|
+
super
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Dispatches the method to the resolved object
|
138
|
+
#
|
139
|
+
# @raise NoMethodError if the proxy cannot find the real object
|
140
|
+
def method_missing(meth, *args, &block)
|
141
|
+
if obj = to_obj
|
142
|
+
obj.__send__(meth, *args, &block)
|
143
|
+
else
|
144
|
+
log.warn "Load Order / Name Resolution Problem on #{path}:"
|
145
|
+
log.warn "-"
|
146
|
+
log.warn "Something is trying to access the object #{path} before it has been recognized."
|
147
|
+
log.warn "This error usually means that you need to modify the order in which you parse files"
|
148
|
+
log.warn "so that #{path} is parsed before methods or other objects attempt to access it."
|
149
|
+
log.warn "-"
|
150
|
+
log.warn "YARD will recover from this error and continue to parse but you *may* have problems"
|
151
|
+
log.warn "with your generated documentation. You should probably fix this."
|
152
|
+
log.warn "-"
|
153
|
+
begin
|
154
|
+
super
|
155
|
+
rescue NoMethodError
|
156
|
+
raise ProxyMethodError, "Proxy cannot call method ##{meth} on object '#{path}'"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
# Attempts to find the object that this unresolved object
|
164
|
+
# references by checking if any objects by this name are
|
165
|
+
# registered all the way up the namespace tree.
|
166
|
+
#
|
167
|
+
# @return [Base, nil] the registered code object or nil
|
168
|
+
def to_obj
|
169
|
+
@obj ||= Registry.resolve(@namespace, @name)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# Shortcut for creating a YARD::CodeObjects::Proxy
|
176
|
+
# via a path
|
177
|
+
#
|
178
|
+
# @see YARD::CodeObjects::Proxy
|
179
|
+
# @see YARD::Registry::resolve
|
180
|
+
def P(namespace, name = nil)
|
181
|
+
namespace, name = nil, namespace if name.nil?
|
182
|
+
YARD::Registry.resolve(namespace, name, true)
|
183
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class File
|
2
|
+
RELATIVE_PARENTDIR = '..'
|
3
|
+
|
4
|
+
# Turns a path +to+ into a relative path from starting
|
5
|
+
# point +from+. The argument +from+ is assumed to be
|
6
|
+
# a filename. To treat it as a directory, make sure it
|
7
|
+
# ends in {File::SEPARATOR} ('/' on UNIX filesystems).
|
8
|
+
#
|
9
|
+
# @param [String] from the starting filename
|
10
|
+
# (or directory with +from_isdir+ set to +true+).
|
11
|
+
#
|
12
|
+
# @param [String] to the final path that should be made relative.
|
13
|
+
#
|
14
|
+
# @return [String] the relative path from +from+ to +to+.
|
15
|
+
#
|
16
|
+
def self.relative_path(from, to)
|
17
|
+
from = expand_path(from).split(SEPARATOR)
|
18
|
+
to = expand_path(to).split(SEPARATOR)
|
19
|
+
from.length.times do
|
20
|
+
break if from[0] != to[0]
|
21
|
+
from.shift; to.shift
|
22
|
+
end
|
23
|
+
fname = from.pop
|
24
|
+
join *(from.map { RELATIVE_PARENTDIR } + to)
|
25
|
+
end
|
26
|
+
end
|