yard 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
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
|