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.

Files changed (264) hide show
  1. data/{LICENSE.txt → LICENSE} +1 -1
  2. data/README +211 -0
  3. data/Rakefile +31 -0
  4. data/benchmarks/builtins_vs_eval.rb +23 -0
  5. data/benchmarks/erb_vs_erubis.rb +53 -0
  6. data/benchmarks/generation.rb +37 -0
  7. data/benchmarks/parsing.rb +33 -0
  8. data/bin/view_generator +17 -0
  9. data/bin/yard-graph +4 -0
  10. data/bin/yardoc +1 -93
  11. data/bin/yri +12 -3
  12. data/lib/yard.rb +10 -5
  13. data/lib/yard/autoload.rb +116 -0
  14. data/lib/yard/cli/yard_graph.rb +86 -0
  15. data/lib/yard/cli/yardoc.rb +131 -0
  16. data/lib/yard/code_objects/base.rb +321 -0
  17. data/lib/yard/code_objects/class_object.rb +89 -0
  18. data/lib/yard/code_objects/class_variable_object.rb +4 -0
  19. data/lib/yard/code_objects/constant_object.rb +4 -0
  20. data/lib/yard/code_objects/method_object.rb +51 -0
  21. data/lib/yard/code_objects/module_object.rb +4 -0
  22. data/lib/yard/code_objects/namespace_object.rb +88 -0
  23. data/lib/yard/code_objects/proxy.rb +183 -0
  24. data/lib/yard/code_objects/root_object.rb +8 -0
  25. data/lib/yard/core_ext/file.rb +26 -0
  26. data/lib/yard/core_ext/logger.rb +5 -0
  27. data/lib/yard/core_ext/module.rb +9 -0
  28. data/lib/yard/core_ext/string.rb +13 -0
  29. data/lib/yard/core_ext/symbol_hash.rb +24 -0
  30. data/lib/yard/generators/attributes_generator.rb +22 -0
  31. data/lib/yard/generators/base.rb +285 -0
  32. data/lib/yard/generators/class_generator.rb +25 -0
  33. data/lib/yard/generators/constants_generator.rb +73 -0
  34. data/lib/yard/generators/constructor_generator.rb +25 -0
  35. data/lib/yard/generators/deprecated_generator.rb +15 -0
  36. data/lib/yard/generators/docstring_generator.rb +15 -0
  37. data/lib/yard/generators/full_doc_generator.rb +59 -0
  38. data/lib/yard/generators/helpers/base_helper.rb +52 -0
  39. data/lib/yard/generators/helpers/filter_helper.rb +21 -0
  40. data/lib/yard/generators/helpers/html_helper.rb +137 -0
  41. data/lib/yard/generators/helpers/method_helper.rb +27 -0
  42. data/lib/yard/generators/helpers/uml_helper.rb +16 -0
  43. data/lib/yard/generators/inheritance_generator.rb +16 -0
  44. data/lib/yard/generators/method_details_generator.rb +18 -0
  45. data/lib/yard/generators/method_generator.rb +31 -0
  46. data/lib/yard/generators/method_listing_generator.rb +105 -0
  47. data/lib/yard/generators/method_missing_generator.rb +25 -0
  48. data/lib/yard/generators/method_signature_generator.rb +19 -0
  49. data/lib/yard/generators/method_summary_generator.rb +21 -0
  50. data/lib/yard/generators/mixins_generator.rb +15 -0
  51. data/lib/yard/generators/module_generator.rb +22 -0
  52. data/lib/yard/generators/quick_doc_generator.rb +31 -0
  53. data/lib/yard/generators/source_generator.rb +26 -0
  54. data/lib/yard/generators/tags_generator.rb +50 -0
  55. data/lib/yard/generators/uml_generator.rb +92 -0
  56. data/lib/yard/generators/visibility_group_generator.rb +26 -0
  57. data/lib/yard/handlers/alias_handler.rb +32 -0
  58. data/lib/yard/handlers/attribute_handler.rb +54 -0
  59. data/lib/yard/handlers/base.rb +509 -0
  60. data/lib/yard/handlers/class_handler.rb +44 -0
  61. data/lib/yard/handlers/class_variable_handler.rb +13 -0
  62. data/lib/yard/handlers/constant_handler.rb +13 -0
  63. data/lib/yard/handlers/exception_handler.rb +12 -0
  64. data/lib/yard/handlers/method_handler.rb +27 -0
  65. data/lib/yard/handlers/mixin_handler.rb +16 -0
  66. data/lib/yard/handlers/module_handler.rb +9 -0
  67. data/lib/yard/handlers/visibility_handler.rb +14 -0
  68. data/lib/yard/handlers/yield_handler.rb +26 -0
  69. data/lib/yard/logging.rb +27 -0
  70. data/lib/yard/parser/ruby_lex.rb +1344 -0
  71. data/lib/yard/parser/source_parser.rb +109 -0
  72. data/lib/yard/parser/statement.rb +36 -0
  73. data/lib/yard/parser/statement_list.rb +167 -0
  74. data/lib/yard/parser/token_list.rb +58 -0
  75. data/lib/yard/rake/yardoc_task.rb +30 -0
  76. data/lib/yard/registry.rb +136 -0
  77. data/lib/yard/serializers/base.rb +16 -0
  78. data/lib/yard/serializers/file_system_serializer.rb +48 -0
  79. data/lib/yard/serializers/process_serializer.rb +14 -0
  80. data/lib/yard/serializers/stdout_serializer.rb +21 -0
  81. data/lib/yard/tags/default_factory.rb +98 -0
  82. data/lib/yard/tags/library.rb +109 -0
  83. data/lib/yard/tags/merbdoc_factory.rb +47 -0
  84. data/lib/yard/tags/tag.rb +35 -0
  85. data/spec/code_objects/base_spec.rb +219 -0
  86. data/spec/code_objects/class_object_spec.rb +176 -0
  87. data/spec/code_objects/code_object_list_spec.rb +33 -0
  88. data/spec/code_objects/constants_spec.rb +79 -0
  89. data/spec/code_objects/method_object_spec.rb +30 -0
  90. data/spec/code_objects/module_object_spec.rb +73 -0
  91. data/spec/code_objects/namespace_object_spec.rb +129 -0
  92. data/spec/code_objects/proxy_spec.rb +80 -0
  93. data/spec/code_objects/spec_helper.rb +3 -0
  94. data/spec/core_ext/file_spec.rb +20 -0
  95. data/spec/core_ext/string_spec.rb +4 -0
  96. data/spec/core_ext/symbol_hash_spec.rb +80 -0
  97. data/spec/generators/base_spec.rb +64 -0
  98. data/spec/generators/helpers/base_helper_spec.rb +15 -0
  99. data/spec/generators/helpers/html_helper_spec.rb +56 -0
  100. data/spec/generators/quick_doc_generator_spec.rb +13 -0
  101. data/spec/handlers/alias_handler_spec.rb +50 -0
  102. data/spec/handlers/attribute_handler_spec.rb +78 -0
  103. data/spec/handlers/base_spec.rb +165 -0
  104. data/spec/handlers/class_handler_spec.rb +68 -0
  105. data/spec/handlers/class_variable_handler_spec.rb +9 -0
  106. data/spec/handlers/constant_handler_spec.rb +13 -0
  107. data/spec/handlers/examples/alias_handler_001.rb.txt +24 -0
  108. data/spec/handlers/examples/attribute_handler_001.rb.txt +19 -0
  109. data/spec/handlers/examples/class_handler_001.rb.txt +39 -0
  110. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -0
  111. data/spec/handlers/examples/constant_handler_001.rb.txt +10 -0
  112. data/spec/handlers/examples/exception_handler_001.rb.txt +42 -0
  113. data/spec/handlers/examples/method_handler_001.rb.txt +35 -0
  114. data/spec/handlers/examples/mixin_handler_001.rb.txt +12 -0
  115. data/spec/handlers/examples/module_handler_001.rb.txt +16 -0
  116. data/spec/handlers/examples/visibility_handler_001.rb.txt +20 -0
  117. data/spec/handlers/examples/yield_handler_001.rb.txt +55 -0
  118. data/spec/handlers/exception_handler_spec.rb +35 -0
  119. data/spec/handlers/method_handler_spec.rb +35 -0
  120. data/spec/handlers/mixin_handler_spec.rb +30 -0
  121. data/spec/handlers/module_handler_spec.rb +25 -0
  122. data/spec/handlers/spec_helper.rb +21 -0
  123. data/spec/handlers/visibility_handler_spec.rb +24 -0
  124. data/spec/handlers/yield_handler_spec.rb +51 -0
  125. data/spec/parser/examples/example1.rb.txt +8 -0
  126. data/spec/parser/examples/tag_handler_001.rb.txt +8 -0
  127. data/spec/parser/source_parser_spec.rb +43 -0
  128. data/spec/parser/tag_parsing_spec.rb +18 -0
  129. data/spec/parser/token_list_spec.rb +35 -0
  130. data/spec/registry_spec.rb +70 -0
  131. data/spec/serializers/file_system_serializer_spec.rb +91 -0
  132. data/spec/serializers/spec_helper.rb +2 -0
  133. data/spec/spec_helper.rb +77 -0
  134. data/templates/default/attributes/html/header.erb +35 -0
  135. data/templates/default/attributes/text/header.erb +10 -0
  136. data/templates/default/class/html/header.erb +4 -0
  137. data/templates/default/constants/html/constants.erb +9 -0
  138. data/templates/default/constants/html/header.erb +3 -0
  139. data/templates/default/constants/html/included.erb +9 -0
  140. data/templates/default/constants/html/inherited.erb +9 -0
  141. data/templates/default/constructor/html/header.erb +10 -0
  142. data/templates/default/deprecated/html/main.erb +4 -0
  143. data/templates/default/deprecated/text/main.erb +3 -0
  144. data/templates/default/docstring/html/main.erb +3 -0
  145. data/templates/default/docstring/text/main.erb +3 -0
  146. data/templates/default/fulldoc/html/all_methods.erb +25 -0
  147. data/templates/default/fulldoc/html/all_namespaces.erb +19 -0
  148. data/templates/default/fulldoc/html/app.js +18 -0
  149. data/templates/default/fulldoc/html/header.erb +15 -0
  150. data/templates/default/fulldoc/html/html_head.erb +3 -0
  151. data/templates/default/fulldoc/html/index.erb +18 -0
  152. data/templates/default/fulldoc/html/jquery.js +11 -0
  153. data/templates/default/fulldoc/html/readme.erb +15 -0
  154. data/templates/default/fulldoc/html/style.css +65 -0
  155. data/templates/default/fulldoc/html/syntax_highlight.css +21 -0
  156. data/templates/default/inheritance/html/header.erb +8 -0
  157. data/templates/default/inheritance/text/header.erb +3 -0
  158. data/templates/default/method/html/aliases.erb +6 -0
  159. data/templates/default/method/html/header.erb +3 -0
  160. data/templates/default/method/html/title.erb +3 -0
  161. data/templates/default/methoddetails/html/header.erb +8 -0
  162. data/templates/default/methoddetails/html/method_header.erb +3 -0
  163. data/templates/default/methodmissing/html/header.erb +12 -0
  164. data/templates/default/methodsignature/html/main.erb +8 -0
  165. data/templates/default/methodsignature/text/main.erb +5 -0
  166. data/templates/default/methodsummary/html/header.erb +5 -0
  167. data/templates/default/methodsummary/html/included.erb +9 -0
  168. data/templates/default/methodsummary/html/inherited.erb +9 -0
  169. data/templates/default/methodsummary/html/summary.erb +25 -0
  170. data/templates/default/methodsummary/text/header.erb +5 -0
  171. data/templates/default/methodsummary/text/included.erb +0 -0
  172. data/templates/default/methodsummary/text/inherited.erb +0 -0
  173. data/templates/default/methodsummary/text/summary.erb +3 -0
  174. data/templates/default/mixins/html/header.erb +4 -0
  175. data/templates/default/module/html/header.erb +4 -0
  176. data/templates/default/quickdoc/html/header.erb +15 -0
  177. data/templates/default/quickdoc/text/header.erb +12 -0
  178. data/templates/default/source/html/main.erb +15 -0
  179. data/templates/default/source/text/main.erb +4 -0
  180. data/templates/default/tags/html/header.erb +4 -0
  181. data/templates/default/tags/html/see.erb +13 -0
  182. data/templates/default/tags/html/tags.erb +20 -0
  183. data/templates/default/tags/text/header.erb +3 -0
  184. data/templates/default/tags/text/see.erb +5 -0
  185. data/templates/default/tags/text/tags.erb +7 -0
  186. data/templates/default/uml/dot/child.erb +1 -0
  187. data/templates/default/uml/dot/dependencies.erb +10 -0
  188. data/templates/default/uml/dot/header.erb +6 -0
  189. data/templates/default/uml/dot/info.erb +14 -0
  190. data/templates/default/uml/dot/subgraph.erb +6 -0
  191. data/templates/default/uml/dot/superclasses.erb +9 -0
  192. data/templates/default/uml/dot/unknown.erb +3 -0
  193. data/templates/default/uml/dot/unknown_child.erb +1 -0
  194. data/templates/default/visibilitygroup/html/header.erb +6 -0
  195. data/templates/javadoc/attributes/html/header.erb +16 -0
  196. data/templates/javadoc/class/html/header.erb +4 -0
  197. data/templates/javadoc/constants/html/constants.erb +9 -0
  198. data/templates/javadoc/constants/html/header.erb +3 -0
  199. data/templates/javadoc/constants/html/included.erb +12 -0
  200. data/templates/javadoc/constants/html/inherited.erb +12 -0
  201. data/templates/javadoc/constructor/html/header.erb +10 -0
  202. data/templates/javadoc/deprecated/html/main.erb +0 -0
  203. data/templates/javadoc/docstring/html/main.erb +6 -0
  204. data/templates/javadoc/fulldoc/html/all_methods.erb +25 -0
  205. data/templates/javadoc/fulldoc/html/all_namespaces.erb +19 -0
  206. data/templates/javadoc/fulldoc/html/app.js +18 -0
  207. data/templates/javadoc/fulldoc/html/header.erb +15 -0
  208. data/templates/javadoc/fulldoc/html/html_head.erb +3 -0
  209. data/templates/javadoc/fulldoc/html/index.erb +18 -0
  210. data/templates/javadoc/fulldoc/html/jquery.js +11 -0
  211. data/templates/javadoc/fulldoc/html/readme.erb +15 -0
  212. data/templates/javadoc/fulldoc/html/style.css +22 -0
  213. data/templates/javadoc/fulldoc/html/syntax_highlight.css +21 -0
  214. data/templates/javadoc/inheritance/html/header.erb +6 -0
  215. data/templates/javadoc/method/html/aliases.erb +6 -0
  216. data/templates/javadoc/method/html/header.erb +4 -0
  217. data/templates/javadoc/method/html/title.erb +4 -0
  218. data/templates/javadoc/methoddetails/html/header.erb +8 -0
  219. data/templates/javadoc/methoddetails/html/method_header.erb +0 -0
  220. data/templates/javadoc/methodmissing/html/header.erb +12 -0
  221. data/templates/javadoc/methodsignature/html/main.erb +8 -0
  222. data/templates/javadoc/methodsummary/html/header.erb +5 -0
  223. data/templates/javadoc/methodsummary/html/included.erb +12 -0
  224. data/templates/javadoc/methodsummary/html/inherited.erb +12 -0
  225. data/templates/javadoc/methodsummary/html/summary.erb +25 -0
  226. data/templates/javadoc/mixins/html/header.erb +5 -0
  227. data/templates/javadoc/module/html/header.erb +4 -0
  228. data/templates/javadoc/source/html/main.erb +15 -0
  229. data/templates/javadoc/tags/html/header.erb +5 -0
  230. data/templates/javadoc/tags/html/see.erb +8 -0
  231. data/templates/javadoc/tags/html/tags.erb +19 -0
  232. data/templates/javadoc/visibilitygroup/html/header.erb +5 -0
  233. metadata +352 -50
  234. data/README.pdf +0 -0
  235. data/lib/code_object.rb +0 -337
  236. data/lib/extra.rb +0 -8
  237. data/lib/formatter.rb +0 -90
  238. data/lib/handlers/all_handlers.rb +0 -2
  239. data/lib/handlers/attribute_handler.rb +0 -51
  240. data/lib/handlers/class_handler.rb +0 -30
  241. data/lib/handlers/class_variable_handler.rb +0 -9
  242. data/lib/handlers/code_object_handler.rb +0 -104
  243. data/lib/handlers/constant_handler.rb +0 -11
  244. data/lib/handlers/exception_handler.rb +0 -20
  245. data/lib/handlers/method_handler.rb +0 -28
  246. data/lib/handlers/mixin_handler.rb +0 -15
  247. data/lib/handlers/module_handler.rb +0 -9
  248. data/lib/handlers/visibility_handler.rb +0 -7
  249. data/lib/handlers/yield_handler.rb +0 -33
  250. data/lib/logger.rb +0 -19
  251. data/lib/namespace.rb +0 -98
  252. data/lib/quick_doc.rb +0 -104
  253. data/lib/ruby_lex.rb +0 -1321
  254. data/lib/source_parser.rb +0 -253
  255. data/lib/tag_library.rb +0 -175
  256. data/lib/tag_type.rb +0 -155
  257. data/templates/default/html/_fulldoc.erb +0 -64
  258. data/templates/default/html/class.erb +0 -226
  259. data/templates/default/html/method.erb +0 -20
  260. data/templates/default/html/module.erb +0 -126
  261. data/test/fixtures/docstring.txt +0 -23
  262. data/test/fixtures/docstring2.txt +0 -4
  263. data/test/test_code_object.rb +0 -66
  264. 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,4 @@
1
+ module YARD::CodeObjects
2
+ class ClassVariableObject < Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module YARD::CodeObjects
2
+ class ConstantObject < Base
3
+ end
4
+ 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,4 @@
1
+ module YARD::CodeObjects
2
+ class ModuleObject < NamespaceObject
3
+ end
4
+ 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,8 @@
1
+ module YARD
2
+ module CodeObjects
3
+ class RootObject < ModuleObject
4
+ def path; "" end
5
+ def inspect; "#<yardoc root>" end
6
+ end
7
+ end
8
+ 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