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,5 @@
1
+ class Logger::Formatter
2
+ def call(sev, time, prog, msg)
3
+ "[#{sev.downcase}]: #{msg}\n"
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class Module
2
+ def class_name
3
+ name.split("::").last
4
+ end
5
+
6
+ def namespace
7
+ name.split("::")[0..-2].join("::")
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class String
2
+ # @it should turn hello_world into HelloWorld
3
+ # "hello_world".camelcase.should == "HelloWorld"
4
+ def underscore
5
+ gsub(/([a-z])([A-Z])/, '\1_\2').downcase
6
+ end
7
+
8
+ # @it should turn HelloWorld into hello_world
9
+ # "HelloWorld".underscore.should == "hello_world"
10
+ def camelcase
11
+ gsub(/([a-z])_([a-z])/i) { $1 + $2.upcase }.sub(/^(.)/) { $1.upcase }
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ class SymbolHash < Hash
2
+ def initialize(symbolize_value = true)
3
+ @symbolize_value = symbolize_value
4
+ end
5
+
6
+ def self.[](*hsh)
7
+ obj = new;
8
+ if hsh.size == 1 && hsh.first.is_a?(Hash)
9
+ hsh.first.each {|k,v| obj[k] = v }
10
+ else
11
+ 0.step(hsh.size, 2) {|n| obj[hsh[n]] = hsh[n+1] }
12
+ end
13
+ obj
14
+ end
15
+
16
+ def []=(key, value)
17
+ super(key.to_sym, value.instance_of?(String) && @symbolize_value ? value.to_sym : value)
18
+ end
19
+ def [](key) super(key.to_sym) end
20
+ def delete(key) super(key.to_sym) end
21
+ def has_key?(key) super(key.to_sym) end
22
+ def update(hsh) hsh.each {|k,v| self[k] = v }; self end
23
+ alias_method :merge, :update
24
+ end
@@ -0,0 +1,22 @@
1
+ module YARD
2
+ module Generators
3
+ class AttributesGenerator < Base
4
+ include Helpers::MethodHelper
5
+
6
+ before_generate :has_attributes?
7
+ before_list :includes
8
+
9
+ def sections_for(object) [:header] end
10
+
11
+ protected
12
+
13
+ def includes
14
+ extend Helpers::UMLHelper if format == :text
15
+ end
16
+
17
+ def has_attributes?
18
+ current_object.class_attributes.size + current_object.instance_attributes.size > 0
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,285 @@
1
+ require 'erb'
2
+
3
+ module YARD
4
+ module Generators
5
+ class Base
6
+ include Helpers::BaseHelper
7
+ include Helpers::FilterHelper
8
+
9
+ class << self
10
+ def template_paths
11
+ @@template_paths ||= [TEMPLATE_ROOT]
12
+ end
13
+
14
+ ##
15
+ # Convenience method to registering a template path.
16
+ # Equivalent to calling:
17
+ # GeneratorName.template_paths.unshift(path)
18
+ #
19
+ # @param [String] path
20
+ # the pathname to look for the template
21
+ #
22
+ # @see template_paths
23
+ def register_template_path(path)
24
+ template_paths.unshift(path)
25
+ end
26
+
27
+ def before_section(*args)
28
+ if args.size == 1
29
+ before_section_filters.push [nil, args.first]
30
+ elsif args.size == 2
31
+ before_section_filters.push(args)
32
+ else
33
+ raise ArgumentError, "before_section takes a generator followed by a Proc/lambda or Symbol referencing the method name"
34
+ end
35
+ end
36
+
37
+ def before_section_filters
38
+ @before_section_filters ||= []
39
+ end
40
+
41
+ def before_generate(meth)
42
+ before_generate_filters.push(meth)
43
+ end
44
+
45
+ def before_generate_filters
46
+ @before_generate_filters ||= []
47
+ end
48
+
49
+ def before_list(meth)
50
+ before_list_filters.push(meth)
51
+ end
52
+
53
+ def before_list_filters
54
+ @before_list_filters ||= []
55
+ end
56
+ end
57
+
58
+ # Creates a generator by adding extra options
59
+ # to the options hash.
60
+ #
61
+ # @example [Creates a new MethodSummaryGenerator for public class methods]
62
+ # G(MethodSummaryGenerator, :scope => :class, :visibility => :public)
63
+ #
64
+ # @param [Class] generator
65
+ # the generator class to use.
66
+ #
67
+ # @options opts
68
+ # :ignore_serializer -> true => value
69
+ #
70
+ #
71
+ def G(generator, opts = {})
72
+ opts = SymbolHash[:ignore_serializer => true].update(opts)
73
+ generator.new(options, opts)
74
+ end
75
+
76
+ attr_reader :format, :template, :verifier
77
+ attr_reader :serializer, :ignore_serializer
78
+ attr_reader :options
79
+ attr_reader :current_object
80
+
81
+ def initialize(opts = {}, extra_opts = {})
82
+ opts = SymbolHash[
83
+ :format => :html,
84
+ :template => :default,
85
+ :serializer => nil,
86
+ :verifier => nil
87
+ ].update(opts).update(extra_opts)
88
+
89
+ @options = opts
90
+ @format = options[:format]
91
+ @template = options[:template]
92
+ @serializer = options[:serializer]
93
+ @ignore_serializer = options[:ignore_serializer]
94
+ @verifier = options[:verifier]
95
+
96
+ extend Helpers::HtmlHelper if format == :html
97
+ end
98
+
99
+ def generator_name
100
+ self.class.to_s.split("::").last.gsub(/Generator$/, '').downcase
101
+ end
102
+
103
+ def generate(*list, &block)
104
+ output = ""
105
+
106
+ list = list.flatten
107
+ @current_object = Registry.root
108
+ return output if FalseClass === run_before_list(list)
109
+
110
+ serializer.before_serialize if serializer && !ignore_serializer
111
+
112
+ list.each do |object|
113
+ next unless object && object.is_a?(CodeObjects::Base)
114
+
115
+ objout = ""
116
+ @current_object = object
117
+
118
+ next if call_verifier(object).is_a?(FalseClass)
119
+ next if run_before_generate(object).is_a?(FalseClass)
120
+
121
+ objout << render_sections(object, &block)
122
+
123
+ if serializer && !ignore_serializer && !objout.empty?
124
+ serializer.serialize(object, objout)
125
+ end
126
+ output << objout
127
+ end
128
+
129
+ if serializer && !ignore_serializer
130
+ serializer.after_serialize(output)
131
+ end
132
+ output
133
+ end
134
+
135
+ protected
136
+
137
+ def call_verifier(object)
138
+ if verifier.is_a?(Symbol)
139
+ send(verifier, object)
140
+ elsif verifier.respond_to?(:call)
141
+ verifier.call(self, object)
142
+ end
143
+ end
144
+
145
+ def run_before_list(list)
146
+ self.class.before_list_filters.each do |meth|
147
+ meth = method(meth) if meth.is_a?(Symbol)
148
+ result = meth.call *(meth.arity == 0 ? [] : [list])
149
+ return result if result.is_a?(FalseClass)
150
+ end
151
+ end
152
+
153
+ def run_before_generate(object)
154
+ self.class.before_generate_filters.each do |meth|
155
+ meth = method(meth) if meth.is_a?(Symbol)
156
+ result = meth.call *(meth.arity == 0 ? [] : [object])
157
+ return result if result.is_a?(FalseClass)
158
+ end
159
+ end
160
+
161
+ def run_before_sections(section, object)
162
+ result = before_section(section, object)
163
+ return result if result.is_a?(FalseClass)
164
+
165
+ self.class.before_section_filters.each do |info|
166
+ result, sec, meth = nil, *info
167
+ if sec.nil? || sec == section
168
+ meth = method(meth) if meth.is_a?(Symbol)
169
+ args = [section, object]
170
+ if meth.arity == 1
171
+ args = [object]
172
+ elsif meth.arity == 0
173
+ args = []
174
+ end
175
+
176
+ result = meth.call(*args)
177
+ log.debug("Calling before section filter for %s%s with `%s`, result = %s" % [
178
+ self.class.class_name, section.inspect, object,
179
+ result.is_a?(FalseClass) ? 'fail' : 'pass'
180
+ ])
181
+ end
182
+
183
+ return result if result.is_a?(FalseClass)
184
+ end
185
+ end
186
+
187
+ def sections_for(object); [] end
188
+
189
+ def before_section(section, object); end
190
+
191
+ def render_sections(object, sections = nil)
192
+ sections ||= sections_for(object) || []
193
+
194
+ data = ""
195
+ sections.each_with_index do |section, index|
196
+ next if section.is_a?(Array)
197
+
198
+ data << if sections[index+1].is_a?(Array)
199
+ render_section(section, object) do |obj|
200
+ tmp, @current_object = @current_object, obj
201
+ out = render_sections(obj, sections[index+1])
202
+ @current_object = tmp
203
+ out
204
+ end
205
+ else
206
+ render_section(section, object)
207
+ end
208
+ end
209
+ data
210
+ end
211
+
212
+ def render_section(section, object, &block)
213
+ begin
214
+ if section.is_a?(Class) && section <= Generators::Base
215
+ opts = options.dup
216
+ opts.update(:ignore_serializer => true)
217
+ sobj = section.new(opts)
218
+ sobj.generate(object, &block)
219
+ elsif section.is_a?(Generators::Base)
220
+ section.generate(object, &block)
221
+ elsif section.is_a?(Symbol) || section.is_a?(String)
222
+ return "" if run_before_sections(section, object).is_a?(FalseClass)
223
+
224
+ if section.is_a?(Symbol)
225
+ if respond_to?(section)
226
+ if method(section).arity != 1
227
+ send(section, &block)
228
+ else
229
+ send(section, object, &block)
230
+ end || ""
231
+ else # treat it as a String
232
+ render(object, section, &block)
233
+ end
234
+ else
235
+ render(object, section, &block)
236
+ end
237
+ else
238
+ type = section.is_a?(String) || section.is_a?(Symbol) ? 'section' : 'generator'
239
+ log.warn "Ignoring invalid #{type} '#{section}' in #{self.class}"
240
+ ""
241
+ end
242
+ end
243
+ end
244
+
245
+ def render(object, file = nil, locals = {}, &block)
246
+ if object.is_a?(Symbol)
247
+ object, file, locals = current_object, object, (file||{})
248
+ end
249
+
250
+ __path = template_path(file.to_s + '.erb', generator_name)
251
+ __f = find_template(__path)
252
+ if __f
253
+ __l = locals.map {|k,v| "#{k} = #{v.inspect}" unless k.to_s == "__f" }.join(";")
254
+ begin
255
+ erb("<% #{__l} %>" + File.read(__f)).result(binding)
256
+ rescue => e
257
+ log.error "#{e.class.class_name}: #{e.message}"
258
+ log.error "in generator #{self.class} section #{file} on '#{object}'"
259
+ log.error e.backtrace[0..10].join("\n")
260
+ exit
261
+ end
262
+ else
263
+ log.warn "Cannot find template `#{__path}`"
264
+ ""
265
+ end
266
+ end
267
+
268
+ def erb(str)
269
+ ERB.new(str, nil, '<>')
270
+ end
271
+
272
+ def template_path(file, generator = generator_name)
273
+ File.join(template.to_s, generator, format.to_s, file.to_s)
274
+ end
275
+
276
+ def find_template(path)
277
+ self.class.template_paths.each do |basepath|
278
+ f = File.join(basepath, path)
279
+ return f if File.file?(f)
280
+ end
281
+ nil
282
+ end
283
+ end
284
+ end
285
+ end
@@ -0,0 +1,25 @@
1
+ module YARD
2
+ module Generators
3
+ class ClassGenerator < Base
4
+ before_generate :is_class?
5
+
6
+ def sections_for(object)
7
+ [
8
+ :header,
9
+ [
10
+ G(InheritanceGenerator),
11
+ G(MixinsGenerator),
12
+ G(DocstringGenerator),
13
+ G(AttributesGenerator),
14
+ G(ConstantsGenerator),
15
+ G(ConstructorGenerator),
16
+ G(MethodMissingGenerator),
17
+ G(VisibilityGroupGenerator, :visibility => :public),
18
+ G(VisibilityGroupGenerator, :visibility => :protected),
19
+ G(VisibilityGroupGenerator, :visibility => :private)
20
+ ]
21
+ ]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,73 @@
1
+ module YARD
2
+ module Generators
3
+ class ConstantsGenerator < Base
4
+ before_section :constants, :has_constants?
5
+ before_section :inherited, :has_inherited_constants?
6
+ before_section :included, :has_included_constants?
7
+
8
+ def sections_for(object)
9
+ if object.is_a?(CodeObjects::ClassObject)
10
+ [:header, [:constants, :inherited, :included]]
11
+ elsif object.is_a?(CodeObjects::ModuleObject)
12
+ [:header, [:constants]]
13
+ end
14
+ end
15
+
16
+ protected
17
+
18
+ def has_constants?(object)
19
+ object.constants(:included => false, :inherited => false).size > 0
20
+ end
21
+
22
+ def has_inherited_constants?(object)
23
+ return false unless object.is_a?(CodeObjects::ClassObject)
24
+ object.inherited_constants.size > 0
25
+ end
26
+
27
+ def has_included_constants?(object)
28
+ object.included_constants.size > 0
29
+ end
30
+
31
+ # @yield a the list of methods pertaining to a superclass
32
+ # in the inheritance order.
33
+ #
34
+ # @yieldparam [CodeObjects::ClassObject] superclass
35
+ # The superclass the constants belong to
36
+ #
37
+ # @yieldparam [Array<CodeObjects::ConstantObject>] consts
38
+ # The list of constants inherited from the superclass
39
+ #
40
+ def inherited_constants_by_class
41
+ all_consts = current_object.inherited_constants
42
+ current_object.inheritance_tree[1..-1].each do |superclass|
43
+ next if superclass.is_a?(CodeObjects::Proxy)
44
+ opts = { :included => false, :inherited => false }
45
+ consts = superclass.constants(opts).select {|c| all_consts.include?(c) }
46
+ next if consts.empty?
47
+ yield(superclass, consts)
48
+ end
49
+ end
50
+
51
+ # @yield [module, constlist]
52
+ # Yields a the list of methods pertaining to a module
53
+ # in the module order.
54
+ #
55
+ # @yieldparam [CodeObjects::ModuleObject] module
56
+ # The module the constants belong to
57
+ #
58
+ # @yieldparam [Array<CodeObjects::ConstantObject>] consts
59
+ # The list of constants included from the module
60
+ #
61
+ def included_constants_by_module
62
+ all_consts = current_object.included_constants
63
+ current_object.mixins.each do |superclass|
64
+ next if superclass.is_a?(CodeObjects::Proxy)
65
+ opts = { :included => false, :inherited => false }
66
+ consts = superclass.constants(opts).select {|c| all_consts.include?(c) }
67
+ next if consts.empty?
68
+ yield(superclass, consts)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end