yard 0.7.5 → 0.8.0

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 (339) hide show
  1. data/.yardopts +10 -2
  2. data/ChangeLog +1263 -38
  3. data/LEGAL +5 -5
  4. data/LICENSE +1 -1
  5. data/README.md +91 -82
  6. data/Rakefile +6 -6
  7. data/benchmarks/builtins_vs_eval.rb +1 -1
  8. data/benchmarks/erb_vs_erubis.rb +4 -4
  9. data/benchmarks/generation.rb +5 -5
  10. data/benchmarks/parsing.rb +2 -2
  11. data/benchmarks/registry_store_types.rb +48 -0
  12. data/bin/yard +9 -1
  13. data/bin/yardoc +9 -1
  14. data/bin/yri +10 -2
  15. data/docs/CodeObjects.md +10 -10
  16. data/docs/GettingStarted.md +85 -83
  17. data/docs/Handlers.md +21 -21
  18. data/docs/Overview.md +7 -7
  19. data/docs/Parser.md +30 -30
  20. data/docs/Tags.md +250 -554
  21. data/docs/TagsArch.md +123 -0
  22. data/docs/Templates.md +58 -80
  23. data/docs/WhatsNew.md +378 -133
  24. data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  25. data/docs/templates/default/fulldoc/html/setup.rb +6 -0
  26. data/docs/templates/default/layout/html/setup.rb +8 -0
  27. data/docs/templates/default/layout/html/tag_list.erb +11 -0
  28. data/docs/templates/default/yard_tags/html/list.erb +18 -0
  29. data/docs/templates/default/yard_tags/html/setup.rb +27 -0
  30. data/docs/templates/plugin.rb +65 -0
  31. data/lib/yard.rb +1 -10
  32. data/lib/yard/autoload.rb +75 -27
  33. data/lib/yard/cli/command.rb +5 -2
  34. data/lib/yard/cli/command_parser.rb +3 -2
  35. data/lib/yard/cli/diff.rb +1 -1
  36. data/lib/yard/cli/i18n.rb +69 -0
  37. data/lib/yard/cli/list.rb +1 -1
  38. data/lib/yard/cli/server.rb +30 -7
  39. data/lib/yard/cli/stats.rb +5 -6
  40. data/lib/yard/cli/yardoc.rb +95 -45
  41. data/lib/yard/cli/yri.rb +24 -3
  42. data/lib/yard/code_objects/base.rb +35 -4
  43. data/lib/yard/code_objects/extra_file_object.rb +1 -1
  44. data/lib/yard/code_objects/macro_object.rb +56 -99
  45. data/lib/yard/code_objects/method_object.rb +44 -6
  46. data/lib/yard/config.rb +18 -8
  47. data/lib/yard/core_ext/symbol_hash.rb +1 -1
  48. data/lib/yard/docstring.rb +45 -85
  49. data/lib/yard/docstring_parser.rb +269 -0
  50. data/lib/yard/handlers/base.rb +129 -118
  51. data/lib/yard/handlers/c/alias_handler.rb +15 -0
  52. data/lib/yard/handlers/c/attribute_handler.rb +13 -0
  53. data/lib/yard/handlers/c/base.rb +110 -0
  54. data/lib/yard/handlers/c/class_handler.rb +26 -0
  55. data/lib/yard/handlers/c/constant_handler.rb +12 -0
  56. data/lib/yard/handlers/c/handler_methods.rb +165 -0
  57. data/lib/yard/handlers/c/init_handler.rb +16 -0
  58. data/lib/yard/handlers/c/method_handler.rb +35 -0
  59. data/lib/yard/handlers/c/mixin_handler.rb +13 -0
  60. data/lib/yard/handlers/c/module_handler.rb +16 -0
  61. data/lib/yard/handlers/c/override_comment_handler.rb +22 -0
  62. data/lib/yard/handlers/c/path_handler.rb +10 -0
  63. data/lib/yard/handlers/c/struct_handler.rb +12 -0
  64. data/lib/yard/handlers/c/symbol_handler.rb +7 -0
  65. data/lib/yard/handlers/processor.rb +41 -30
  66. data/lib/yard/handlers/ruby/alias_handler.rb +0 -2
  67. data/lib/yard/handlers/ruby/attribute_handler.rb +16 -17
  68. data/lib/yard/handlers/ruby/base.rb +10 -6
  69. data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  70. data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  71. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +71 -0
  72. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +0 -3
  73. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +16 -17
  74. data/lib/yard/handlers/ruby/legacy/base.rb +28 -6
  75. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  76. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  77. data/lib/yard/handlers/ruby/legacy/method_handler.rb +0 -2
  78. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +1 -1
  79. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  80. data/lib/yard/handlers/ruby/method_handler.rb +10 -15
  81. data/lib/yard/handlers/ruby/mixin_handler.rb +1 -1
  82. data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  83. data/lib/yard/handlers/ruby/struct_handler_methods.rb +3 -2
  84. data/lib/yard/i18n/pot_generator.rb +281 -0
  85. data/lib/yard/i18n/text.rb +72 -0
  86. data/lib/yard/logging.rb +3 -7
  87. data/lib/yard/options.rb +216 -0
  88. data/lib/yard/parser/c/c_parser.rb +225 -0
  89. data/lib/yard/parser/c/comment_parser.rb +131 -0
  90. data/lib/yard/parser/c/statement.rb +63 -0
  91. data/lib/yard/parser/ruby/ast_node.rb +91 -1
  92. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +1 -0
  93. data/lib/yard/parser/ruby/legacy/statement.rb +7 -2
  94. data/lib/yard/parser/ruby/legacy/statement_list.rb +13 -22
  95. data/lib/yard/parser/ruby/ruby_parser.rb +87 -26
  96. data/lib/yard/parser/source_parser.rb +89 -88
  97. data/lib/yard/rake/yardoc_task.rb +1 -1
  98. data/lib/yard/registry.rb +21 -10
  99. data/lib/yard/registry_store.rb +48 -0
  100. data/lib/yard/serializers/file_system_serializer.rb +18 -20
  101. data/lib/yard/serializers/yardoc_serializer.rb +1 -0
  102. data/lib/yard/server/adapter.rb +2 -2
  103. data/lib/yard/server/commands/base.rb +1 -1
  104. data/lib/yard/server/commands/display_object_command.rb +13 -6
  105. data/lib/yard/server/commands/frames_command.rb +4 -21
  106. data/lib/yard/server/commands/library_command.rb +57 -11
  107. data/lib/yard/server/commands/list_command.rb +10 -34
  108. data/lib/yard/server/commands/search_command.rb +8 -2
  109. data/lib/yard/server/doc_server_helper.rb +34 -0
  110. data/lib/yard/server/rack_adapter.rb +5 -1
  111. data/lib/yard/server/router.rb +4 -10
  112. data/lib/yard/server/static_caching.rb +2 -2
  113. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +2 -2
  114. data/lib/yard/server/templates/default/fulldoc/html/js/live.js +0 -15
  115. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +3 -3
  116. data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  117. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +1 -1
  118. data/lib/yard/server/templates/doc_server/search/html/setup.rb +1 -1
  119. data/lib/yard/tags/default_factory.rb +31 -4
  120. data/lib/yard/tags/directives.rb +593 -0
  121. data/lib/yard/tags/library.rb +437 -35
  122. data/lib/yard/templates/engine.rb +17 -12
  123. data/lib/yard/templates/helpers/base_helper.rb +8 -2
  124. data/lib/yard/templates/helpers/html_helper.rb +57 -14
  125. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +1 -1
  126. data/lib/yard/templates/helpers/markup_helper.rb +9 -9
  127. data/lib/yard/templates/helpers/text_helper.rb +2 -2
  128. data/lib/yard/templates/template.rb +42 -13
  129. data/lib/yard/templates/template_options.rb +81 -0
  130. data/spec/cli/command_parser_spec.rb +4 -4
  131. data/spec/cli/command_spec.rb +3 -3
  132. data/spec/cli/config_spec.rb +13 -13
  133. data/spec/cli/diff_spec.rb +13 -10
  134. data/spec/cli/gems_spec.rb +12 -12
  135. data/spec/cli/help_spec.rb +2 -2
  136. data/spec/cli/i18n_spec.rb +111 -0
  137. data/spec/cli/server_spec.rb +66 -18
  138. data/spec/cli/stats_spec.rb +15 -15
  139. data/spec/cli/yardoc_spec.rb +124 -97
  140. data/spec/cli/yri_spec.rb +14 -12
  141. data/spec/code_objects/base_spec.rb +104 -46
  142. data/spec/code_objects/class_object_spec.rb +33 -33
  143. data/spec/code_objects/code_object_list_spec.rb +5 -5
  144. data/spec/code_objects/constants_spec.rb +4 -3
  145. data/spec/code_objects/extra_file_object_spec.rb +19 -19
  146. data/spec/code_objects/macro_object_spec.rb +31 -37
  147. data/spec/code_objects/method_object_spec.rb +46 -23
  148. data/spec/code_objects/module_object_spec.rb +16 -16
  149. data/spec/code_objects/namespace_object_spec.rb +6 -6
  150. data/spec/code_objects/proxy_spec.rb +19 -19
  151. data/spec/config_spec.rb +33 -24
  152. data/spec/core_ext/array_spec.rb +1 -1
  153. data/spec/core_ext/file_spec.rb +8 -8
  154. data/spec/core_ext/hash_spec.rb +1 -1
  155. data/spec/core_ext/insertion_spec.rb +3 -3
  156. data/spec/core_ext/module_spec.rb +1 -1
  157. data/spec/core_ext/string_spec.rb +6 -6
  158. data/spec/core_ext/symbol_hash_spec.rb +11 -11
  159. data/spec/docstring_parser_spec.rb +207 -0
  160. data/spec/docstring_spec.rb +33 -146
  161. data/spec/handlers/alias_handler_spec.rb +14 -14
  162. data/spec/handlers/attribute_handler_spec.rb +20 -20
  163. data/spec/handlers/base_spec.rb +16 -16
  164. data/spec/handlers/c/alias_handler_spec.rb +33 -0
  165. data/spec/handlers/c/attribute_handler_spec.rb +40 -0
  166. data/spec/handlers/c/class_handler_spec.rb +64 -0
  167. data/spec/handlers/c/constant_handler_spec.rb +68 -0
  168. data/spec/handlers/c/init_handler_spec.rb +36 -0
  169. data/spec/handlers/c/method_handler_spec.rb +228 -0
  170. data/spec/handlers/c/mixin_handler_spec.rb +27 -0
  171. data/spec/handlers/c/module_handler_spec.rb +38 -0
  172. data/spec/handlers/c/override_comment_handler_spec.rb +43 -0
  173. data/spec/handlers/c/path_handler_spec.rb +35 -0
  174. data/spec/handlers/c/spec_helper.rb +11 -0
  175. data/spec/handlers/c/struct_handler_spec.rb +15 -0
  176. data/spec/handlers/class_condition_handler_spec.rb +10 -10
  177. data/spec/handlers/class_handler_spec.rb +38 -38
  178. data/spec/handlers/class_variable_handler_spec.rb +1 -1
  179. data/spec/handlers/constant_handler_spec.rb +7 -7
  180. data/spec/handlers/{macro_handler_spec.rb → dsl_handler_spec.rb} +72 -53
  181. data/spec/handlers/examples/alias_handler_001.rb.txt +5 -5
  182. data/spec/handlers/examples/class_condition_handler_001.rb.txt +9 -9
  183. data/spec/handlers/examples/class_handler_001.rb.txt +1 -1
  184. data/spec/handlers/examples/dsl_handler_001.rb.txt +110 -0
  185. data/spec/handlers/examples/exception_handler_001.rb.txt +14 -14
  186. data/spec/handlers/examples/method_condition_handler_001.rb.txt +2 -2
  187. data/spec/handlers/examples/method_handler_001.rb.txt +16 -16
  188. data/spec/handlers/examples/mixin_handler_001.rb.txt +8 -4
  189. data/spec/handlers/examples/private_constant_handler_001.rb.txt +1 -1
  190. data/spec/handlers/examples/visibility_handler_001.rb.txt +3 -3
  191. data/spec/handlers/examples/yield_handler_001.rb.txt +13 -14
  192. data/spec/handlers/exception_handler_spec.rb +9 -9
  193. data/spec/handlers/extend_handler_spec.rb +2 -2
  194. data/spec/handlers/legacy_base_spec.rb +34 -34
  195. data/spec/handlers/method_condition_handler_spec.rb +2 -2
  196. data/spec/handlers/method_handler_spec.rb +33 -33
  197. data/spec/handlers/mixin_handler_spec.rb +13 -9
  198. data/spec/handlers/module_function_handler_spec.rb +82 -0
  199. data/spec/handlers/module_handler_spec.rb +6 -6
  200. data/spec/handlers/private_constant_handler_spec.rb +3 -3
  201. data/spec/handlers/processor_spec.rb +5 -5
  202. data/spec/handlers/ruby/base_spec.rb +10 -6
  203. data/spec/handlers/ruby/legacy/base_spec.rb +11 -7
  204. data/spec/handlers/spec_helper.rb +2 -3
  205. data/spec/handlers/visibility_handler_spec.rb +6 -6
  206. data/spec/handlers/yield_handler_spec.rb +8 -8
  207. data/spec/i18n/pot_generator_spec.rb +244 -0
  208. data/spec/i18n/text_spec.rb +69 -0
  209. data/spec/options_spec.rb +160 -0
  210. data/spec/parser/base_spec.rb +3 -3
  211. data/spec/parser/c_parser_spec.rb +31 -257
  212. data/spec/parser/examples/array.c.txt +187 -187
  213. data/spec/parser/examples/extrafile.c.txt +1 -1
  214. data/spec/parser/examples/override.c.txt +1 -1
  215. data/spec/parser/ruby/ast_node_spec.rb +1 -1
  216. data/spec/parser/ruby/legacy/statement_list_spec.rb +24 -24
  217. data/spec/parser/ruby/legacy/token_list_spec.rb +7 -7
  218. data/spec/parser/ruby/ruby_parser_spec.rb +56 -34
  219. data/spec/parser/source_parser_spec.rb +125 -65
  220. data/spec/parser/tag_parsing_spec.rb +4 -4
  221. data/spec/rake/yardoc_task_spec.rb +10 -8
  222. data/spec/registry_spec.rb +65 -36
  223. data/spec/registry_store_spec.rb +90 -40
  224. data/spec/serializers/file_system_serializer_spec.rb +12 -12
  225. data/spec/serializers/yardoc_serializer_spec.rb +2 -2
  226. data/spec/server/adapter_spec.rb +3 -3
  227. data/spec/server/commands/base_spec.rb +8 -8
  228. data/spec/server/commands/library_command_spec.rb +3 -3
  229. data/spec/server/commands/static_file_command_spec.rb +7 -7
  230. data/spec/server/doc_server_helper_spec.rb +1 -1
  231. data/spec/server/doc_server_serializer_spec.rb +6 -6
  232. data/spec/server/rack_adapter_spec.rb +3 -3
  233. data/spec/server/router_spec.rb +19 -19
  234. data/spec/server/static_caching_spec.rb +4 -4
  235. data/spec/spec_helper.rb +7 -7
  236. data/spec/tags/default_factory_spec.rb +24 -16
  237. data/spec/tags/directives_spec.rb +422 -0
  238. data/spec/tags/library_spec.rb +15 -4
  239. data/spec/tags/overload_tag_spec.rb +6 -6
  240. data/spec/tags/ref_tag_list_spec.rb +8 -8
  241. data/spec/templates/class_spec.rb +7 -7
  242. data/spec/templates/constant_spec.rb +7 -7
  243. data/spec/templates/engine_spec.rb +28 -36
  244. data/spec/templates/examples/class001.html +108 -108
  245. data/spec/templates/examples/class002.html +17 -17
  246. data/spec/templates/examples/constant001.txt +1 -1
  247. data/spec/templates/examples/method001.html +45 -45
  248. data/spec/templates/examples/method002.html +25 -25
  249. data/spec/templates/examples/method003.html +60 -60
  250. data/spec/templates/examples/method004.html +7 -7
  251. data/spec/templates/examples/method005.html +28 -28
  252. data/spec/templates/examples/module001.html +321 -321
  253. data/spec/templates/examples/module001.txt +1 -1
  254. data/spec/templates/examples/module002.html +130 -130
  255. data/spec/templates/examples/module003.html +74 -74
  256. data/spec/templates/examples/module004.html +388 -0
  257. data/spec/templates/helpers/base_helper_spec.rb +32 -32
  258. data/spec/templates/helpers/html_helper_spec.rb +87 -68
  259. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +9 -9
  260. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +16 -16
  261. data/spec/templates/helpers/markup_helper_spec.rb +31 -28
  262. data/spec/templates/helpers/method_helper_spec.rb +7 -7
  263. data/spec/templates/helpers/shared_signature_examples.rb +9 -7
  264. data/spec/templates/helpers/text_helper_spec.rb +3 -3
  265. data/spec/templates/method_spec.rb +13 -13
  266. data/spec/templates/module_spec.rb +70 -24
  267. data/spec/templates/onefile_spec.rb +32 -15
  268. data/spec/templates/section_spec.rb +23 -23
  269. data/spec/templates/spec_helper.rb +31 -1
  270. data/spec/templates/tag_spec.rb +5 -5
  271. data/spec/templates/template_spec.rb +54 -46
  272. data/spec/verifier_spec.rb +5 -5
  273. data/templates/default/class/setup.rb +2 -2
  274. data/templates/default/docstring/html/abstract.erb +1 -1
  275. data/templates/default/docstring/html/note.erb +1 -1
  276. data/templates/default/docstring/html/private.erb +1 -1
  277. data/templates/default/docstring/html/todo.erb +1 -1
  278. data/templates/default/docstring/setup.rb +2 -2
  279. data/templates/default/fulldoc/html/css/full_list.css +4 -2
  280. data/templates/default/fulldoc/html/css/style.css +50 -44
  281. data/templates/default/fulldoc/html/frames.erb +21 -6
  282. data/templates/default/fulldoc/html/full_list.erb +5 -3
  283. data/templates/default/fulldoc/html/{full_list_files.erb → full_list_file.erb} +0 -0
  284. data/templates/default/fulldoc/html/js/app.js +29 -26
  285. data/templates/default/fulldoc/html/js/full_list.js +9 -9
  286. data/templates/default/fulldoc/html/js/jquery.js +4 -16
  287. data/templates/default/fulldoc/html/setup.rb +42 -38
  288. data/templates/default/layout/dot/header.erb +1 -1
  289. data/templates/default/layout/html/breadcrumb.erb +6 -6
  290. data/templates/default/layout/html/files.erb +1 -1
  291. data/templates/default/layout/html/footer.erb +1 -1
  292. data/templates/default/layout/html/headers.erb +3 -6
  293. data/templates/default/layout/html/index.erb +1 -1
  294. data/templates/default/layout/html/layout.erb +3 -7
  295. data/templates/default/layout/html/objects.erb +1 -1
  296. data/templates/default/layout/html/script_setup.erb +5 -0
  297. data/templates/default/layout/html/search.erb +4 -1
  298. data/templates/default/layout/html/setup.rb +8 -8
  299. data/templates/default/method_details/html/method_signature.erb +10 -3
  300. data/templates/default/method_details/setup.rb +1 -0
  301. data/templates/default/module/dot/info.erb +1 -1
  302. data/templates/default/module/dot/setup.rb +2 -2
  303. data/templates/default/module/html/attribute_details.erb +1 -1
  304. data/templates/default/module/html/children.erb +1 -1
  305. data/templates/default/module/html/defines.erb +1 -1
  306. data/templates/default/module/html/inherited_methods.erb +5 -4
  307. data/templates/default/module/html/item_summary.erb +15 -5
  308. data/templates/default/module/html/method_details_list.erb +2 -2
  309. data/templates/default/module/setup.rb +25 -12
  310. data/templates/default/module/text/setup.rb +1 -1
  311. data/templates/default/onefile/html/layout.erb +1 -1
  312. data/templates/default/onefile/html/setup.rb +2 -2
  313. data/templates/default/tags/html/example.erb +4 -2
  314. data/templates/default/tags/html/option.erb +1 -1
  315. data/templates/default/tags/html/overload.erb +1 -1
  316. data/templates/default/tags/html/see.erb +1 -1
  317. data/templates/default/tags/html/tag.erb +1 -1
  318. data/templates/default/tags/setup.rb +4 -3
  319. data/templates/guide/fulldoc/html/css/style.css +8 -8
  320. data/templates/guide/fulldoc/html/js/app.js +6 -6
  321. data/templates/guide/fulldoc/html/setup.rb +12 -12
  322. data/templates/guide/layout/html/layout.erb +11 -11
  323. data/templates/guide/layout/html/setup.rb +9 -9
  324. data/templates/guide/method/html/header.erb +2 -2
  325. data/templates/guide/method/html/setup.rb +1 -1
  326. metadata +68 -18
  327. data/bin/yard-graph +0 -4
  328. data/bin/yard-server +0 -4
  329. data/docs/Glossary.md +0 -12
  330. data/lib/yard/handlers/ruby/legacy/macro_handler.rb +0 -39
  331. data/lib/yard/handlers/ruby/macro_handler.rb +0 -40
  332. data/lib/yard/handlers/ruby/macro_handler_methods.rb +0 -131
  333. data/lib/yard/parser/c_parser.rb +0 -497
  334. data/lib/yard/server/templates/default/layout/html/headers.erb +0 -16
  335. data/lib/yard/server/templates/doc_server/frames/html/frames.erb +0 -13
  336. data/lib/yard/server/templates/doc_server/frames/html/setup.rb +0 -3
  337. data/lib/yard/server/templates/doc_server/full_list/html/full_list.erb +0 -34
  338. data/lib/yard/server/templates/doc_server/full_list/html/setup.rb +0 -20
  339. data/spec/handlers/examples/macro_handler_001.rb.txt +0 -83
@@ -31,7 +31,7 @@ module YARD
31
31
  # @return [Proc] a proc to call after running the task
32
32
  attr_accessor :after
33
33
 
34
- # @return [Verifier, Proc] an optional {Verifier} to run against all objects
34
+ # @return [Verifier, Proc] an optional {Verifier} to run against all objects
35
35
  # being generated. Any object that the verifier returns false for will be
36
36
  # excluded from documentation. This attribute can also be a lambda.
37
37
  # @see Verifier
data/lib/yard/registry.rb CHANGED
@@ -70,6 +70,7 @@ module YARD
70
70
  # @return [String] the yardoc filename
71
71
  # @see DEFAULT_YARDOC_FILE
72
72
  attr_accessor :yardoc_file
73
+ undef yardoc_file, yardoc_file=
73
74
  def yardoc_file=(v) Thread.current[:__yard_yardoc_file__] = v end
74
75
  def yardoc_file
75
76
  Thread.current[:__yard_yardoc_file__] ||= DEFAULT_YARDOC_FILE
@@ -207,16 +208,15 @@ module YARD
207
208
  # @return [Array<CodeObjects::Base>] the list of objects found
208
209
  # @see CodeObjects::Base#type
209
210
  def all(*types)
210
- thread_local_store.values.select do |obj|
211
- if types.empty?
212
- obj != root
213
- else
214
- obj != root &&
215
- types.any? do |type|
216
- type.is_a?(Symbol) ? obj.type == type : obj.is_a?(type)
217
- end
211
+ if types.empty?
212
+ thread_local_store.values.select {|obj| obj != root }
213
+ else
214
+ list = []
215
+ types.each do |type|
216
+ list += thread_local_store.values_for_type(type)
218
217
  end
219
- end + (types.include?(:root) ? [root] : [])
218
+ list
219
+ end
220
220
  end
221
221
 
222
222
  # Returns the paths of all of the objects in the registry.
@@ -284,7 +284,17 @@ module YARD
284
284
  else
285
285
  while namespace
286
286
  if namespace.is_a?(CodeObjects::NamespaceObject)
287
- nss = inheritance ? namespace.inheritance_tree(true) : [namespace]
287
+ if inheritance
288
+ nss = namespace.inheritance_tree(true)
289
+ if namespace.respond_to?(:superclass)
290
+ if namespace.superclass != P('BasicObject')
291
+ nss |= [P('Object')]
292
+ end
293
+ nss |= [P('BasicObject')]
294
+ end
295
+ else
296
+ nss = [namespace]
297
+ end
288
298
  nss.each do |ns|
289
299
  next if ns.is_a?(CodeObjects::Proxy)
290
300
  found = partial_resolve(ns, name)
@@ -321,6 +331,7 @@ module YARD
321
331
  # @return [Boolean, nil] if this value is set to nil, the storage
322
332
  # adapter will decide how to store the data.
323
333
  attr_accessor :single_object_db
334
+ undef single_object_db, single_object_db=
324
335
  def single_object_db=(v) Thread.current[:__yard_single_db__] = v end
325
336
  def single_object_db; Thread.current[:__yard_single_db__] end
326
337
 
@@ -13,6 +13,7 @@ module YARD
13
13
  @checksums = {}
14
14
  @store = {}
15
15
  @proxy_types = {}
16
+ @object_types = {:root => [:root]}
16
17
  @notfound = {}
17
18
  @loaded_objects = 0
18
19
  @available_objects = 0
@@ -48,9 +49,14 @@ module YARD
48
49
  # @return [CodeObjects::Base] returns +value+
49
50
  def put(key, value)
50
51
  if key == ''
52
+ @object_types[:root] = [:root]
51
53
  @store[:root] = value
52
54
  else
53
55
  @notfound.delete(key.to_sym)
56
+ (@object_types[value.type] ||= []) << key.to_s
57
+ if @store[key.to_sym]
58
+ @object_types[@store[key.to_sym].type].delete(key.to_s)
59
+ end
54
60
  @store[key.to_sym] = value
55
61
  end
56
62
  end
@@ -58,6 +64,9 @@ module YARD
58
64
  alias [] get
59
65
  alias []= put
60
66
 
67
+ # Deletes an object at a given path
68
+ # @param [#to_sym] key the key to delete
69
+ # @return [void]
61
70
  def delete(key) @store.delete(key.to_sym) end
62
71
 
63
72
  # Gets all path names from the store. Loads the entire database
@@ -76,6 +85,24 @@ module YARD
76
85
  # @return [Array<CodeObjects::Base>] all the code objects
77
86
  def values(reload = false) load_all if reload; @store.values end
78
87
 
88
+ # @param [Symbol] type the type to look for
89
+ # @return [Array<String>] a list of object paths with a given
90
+ # {CodeObjects::Base#type}
91
+ # @since 0.8.0
92
+ def paths_for_type(type, reload = false)
93
+ load_all if reload
94
+ @object_types[type] || []
95
+ end
96
+
97
+ # @param [Symbol] type the type to look for
98
+ # @return [Array<CodeObjects::Base>] a list of objects with a given
99
+ # {CodeObjects::Base#type}
100
+ # @since 0.8.0
101
+ def values_for_type(type, reload = false)
102
+ load_all if reload
103
+ paths_for_type(type).map {|t| @store[t.to_sym] }
104
+ end
105
+
79
106
  # @return [CodeObjects::RootObject] the root object
80
107
  def root; @store[:root] end
81
108
 
@@ -85,6 +112,7 @@ module YARD
85
112
  @file = file
86
113
  @store = {}
87
114
  @proxy_types = {}
115
+ @object_types = {}
88
116
  @notfound = {}
89
117
  @serializer = Serializers::YardocSerializer.new(@file)
90
118
  load_yardoc
@@ -147,6 +175,7 @@ module YARD
147
175
  end
148
176
  end
149
177
  write_proxy_types
178
+ write_object_types
150
179
  write_checksums
151
180
  true
152
181
  end
@@ -186,6 +215,10 @@ module YARD
186
215
  @serializer.checksums_path
187
216
  end
188
217
 
218
+ def object_types_path
219
+ @serializer.object_types_path
220
+ end
221
+
189
222
  def load_yardoc
190
223
  return false unless @file
191
224
  if File.directory?(@file) # new format
@@ -194,6 +227,7 @@ module YARD
194
227
  load_proxy_types
195
228
  load_checksums
196
229
  load_root
230
+ load_object_types
197
231
  true
198
232
  elsif File.file?(@file) # old format
199
233
  load_yardoc_old
@@ -214,6 +248,16 @@ module YARD
214
248
  @proxy_types = Marshal.load(File.read_binary(proxy_types_path))
215
249
  end
216
250
 
251
+ def load_object_types
252
+ if File.file?(object_types_path)
253
+ @object_types = Marshal.load(File.read_binary(object_types_path))
254
+ else # migrate db without object_types
255
+ values.each do |object|
256
+ (@object_types[object.type] ||= []) << object.path
257
+ end
258
+ end
259
+ end
260
+
217
261
  def load_checksums
218
262
  return unless File.file?(checksums_path)
219
263
  lines = File.readlines(checksums_path).map do |line|
@@ -243,6 +287,10 @@ module YARD
243
287
  File.open!(proxy_types_path, 'wb') {|f| f.write(Marshal.dump(@proxy_types)) }
244
288
  end
245
289
 
290
+ def write_object_types
291
+ File.open!(object_types_path, 'wb') {|f| f.write(Marshal.dump(@object_types)) }
292
+ end
293
+
246
294
  def write_checksums
247
295
  File.open!(checksums_path, 'w') do |f|
248
296
  @checksums.each {|k, v| f.puts("#{k} #{v}") }
@@ -34,7 +34,7 @@ module YARD
34
34
  #
35
35
  # @return [String] the written data (for chaining)
36
36
  def serialize(object, data)
37
- path = File.join(basepath, *serialized_path(object))
37
+ path = File.join(basepath, serialized_path(object))
38
38
  log.debug "Serializing to #{path}"
39
39
  File.open!(path, "wb") {|f| f.write data }
40
40
  end
@@ -59,25 +59,7 @@ module YARD
59
59
  end
60
60
  end
61
61
 
62
- # Don't change the filenames, it just makes it more complicated
63
- # to figure out the original name.
64
- #fspath.map! do |p|
65
- # p.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
66
- #end
67
-
68
- # Remove special chars from filenames.
69
- # Windows disallows \ / : * ? " < > | but we will just remove any
70
- # non alphanumeric (plus period, underscore and dash).
71
- fspath.map! do |p|
72
- p.gsub(/[^\w\.-]/) do |x|
73
- encoded = '_'
74
-
75
- x.each_byte { |b| encoded << ("%X" % b) }
76
- encoded
77
- end
78
- end
79
-
80
- File.join(fspath)
62
+ File.join(encode_path_components(*fspath))
81
63
  end
82
64
 
83
65
  # Checks the disk for an object and returns whether it was serialized.
@@ -87,6 +69,22 @@ module YARD
87
69
  def exists?(object)
88
70
  File.exist?(File.join(basepath, serialized_path(object)))
89
71
  end
72
+
73
+ private
74
+
75
+ # Remove special chars from filenames.
76
+ # Windows disallows \ / : * ? " < > | but we will just remove any
77
+ # non alphanumeric (plus period, underscore and dash).
78
+ def encode_path_components(*components)
79
+ components.map! do |p|
80
+ p.gsub(/[^\w\.-]/) do |x|
81
+ encoded = '_'
82
+
83
+ x.each_byte { |b| encoded << ("%X" % b) }
84
+ encoded
85
+ end
86
+ end
87
+ end
90
88
  end
91
89
  end
92
90
  end
@@ -34,6 +34,7 @@ module YARD
34
34
  def objects_path; File.join(basepath, 'objects') end
35
35
  def proxy_types_path; File.join(basepath, 'proxy_types') end
36
36
  def checksums_path; File.join(basepath, 'checksums') end
37
+ def object_types_path; File.join(basepath, 'object_types') end
37
38
 
38
39
  def serialized_path(object)
39
40
  path = case object
@@ -2,7 +2,7 @@ module YARD
2
2
  module Server
3
3
 
4
4
  # Short circuits a request by raising an error. This exception is caught
5
- # by {Commands::Base#call} to immedaitely end a request and return a response.
5
+ # by {Commands::Base#call} to immediately end a request and return a response.
6
6
  class FinishRequest < RuntimeError; end
7
7
 
8
8
  # Raises an error if a resource is not found. This exception is caught by
@@ -97,4 +97,4 @@ module YARD
97
97
  end
98
98
  end
99
99
  end
100
- end
100
+ end
@@ -83,7 +83,7 @@ module YARD
83
83
  # @note This command should not be overridden by subclasses. Implement
84
84
  # the callback method {#run} instead.
85
85
  # @param [Adapter Dependent] request the request object
86
- # @return [Array(Number,Hash,Array<String>)] a Rack-style response
86
+ # @return [Array(Numeric,Hash,Array<String>)] a Rack-style response
87
87
  # of status, headers, and body wrapped in an array.
88
88
  def call(request)
89
89
  self.request = request
@@ -3,8 +3,20 @@ module YARD
3
3
  module Commands
4
4
  # Displays documentation for a specific object identified by the path
5
5
  class DisplayObjectCommand < LibraryCommand
6
+ include DocServerHelper
7
+
6
8
  def run
7
- return index if path.empty?
9
+ if path.empty?
10
+ if options.readme
11
+ url = url_for_file(options.readme)
12
+ self.status, self.headers, self.body = *router.send(:route, url)
13
+ cache(body.first)
14
+ return
15
+ else
16
+ self.path = 'index'
17
+ end
18
+ end
19
+ return index if path == 'index'
8
20
 
9
21
  if object = Registry.at(object_path)
10
22
  options.update(:type => :layout)
@@ -17,14 +29,9 @@ module YARD
17
29
  def index
18
30
  Registry.load_all
19
31
 
20
- title = options[:title]
21
- unless title
22
- title = "Documentation for #{library.name} #{library.version ? '(' + library.version + ')' : ''}"
23
- end
24
32
  options.update(
25
33
  :object => '_index.html',
26
34
  :objects => Registry.all(:module, :class),
27
- :title => title,
28
35
  :type => :layout
29
36
  )
30
37
  render
@@ -3,28 +3,11 @@ module YARD
3
3
  module Commands
4
4
  # Displays an object wrapped in frames
5
5
  class FramesCommand < DisplayObjectCommand
6
- include DocServerHelper
7
-
8
6
  def run
9
- main_url = request.path.gsub(/^(.+)?\/frames(?:\/(#{path}))?$/, '\1/\2')
10
- if path =~ %r{^file/}
11
- page_title = "File: #{$'}"
12
- elsif !path.empty?
13
- page_title = "Object: #{object_path}"
14
- elsif options[:files] && options[:files].size > 0
15
- page_title = "File: #{File.basename(options[:files].first.path)}"
16
- main_url = url_for_file(options[:files].first)
17
- elsif !path || path.empty?
18
- page_title = "Documentation for #{library.name} #{library.version ? '(' + library.version + ')' : ''}"
19
- end
20
-
21
- options.update(
22
- :page_title => page_title,
23
- :main_url => main_url,
24
- :template => :doc_server,
25
- :type => :frames
26
- )
27
- render
7
+ options.update(:frames => true, :type => :fulldoc)
8
+ tpl = fulldoc_template
9
+ tpl.generate_frameset
10
+ cache(tpl.contents)
28
11
  end
29
12
  end
30
13
  end
@@ -3,6 +3,25 @@ require 'thread'
3
3
  module YARD
4
4
  module Server
5
5
  module Commands
6
+ class LibraryOptions < CLI::YardocOptions
7
+ def adapter; @command.adapter end
8
+ def library; @command.library end
9
+ def single_library; @command.single_library end
10
+ def serializer; @command.serializer end
11
+ default_attr :serialize, false
12
+
13
+ attr_accessor :command
14
+ attr_accessor :frames
15
+
16
+ def each(&block)
17
+ super(&block)
18
+ yield(:adapter, adapter)
19
+ yield(:library, library)
20
+ yield(:single_library, single_library)
21
+ yield(:serializer, serializer)
22
+ end
23
+ end
24
+
6
25
  # This is the base command for all commands that deal directly with libraries.
7
26
  # Some commands do not, but most (like {DisplayObjectCommand}) do. If your
8
27
  # command deals with libraries directly, subclass this class instead.
@@ -13,7 +32,7 @@ module YARD
13
32
  # @return [LibraryVersion] the object containing library information
14
33
  attr_accessor :library
15
34
 
16
- # @return [Hash{Symbol => Object}] default options for the library
35
+ # @return [LibraryOptions] default options for the library
17
36
  attr_accessor :options
18
37
 
19
38
  # @return [Serializers::Base] the serializer used to perform file linking
@@ -35,24 +54,33 @@ module YARD
35
54
  end
36
55
 
37
56
  def call(request)
57
+ save_default_template_info
38
58
  self.request = request
39
- self.options = SymbolHash.new(false).update(
40
- :serialize => false,
41
- :serializer => serializer,
42
- :library => library,
43
- :adapter => adapter,
44
- :single_library => single_library,
45
- :markup => :rdoc,
46
- :format => :html
47
- )
59
+ self.options = LibraryOptions.new
60
+ self.options.reset_defaults
61
+ self.options.command = self
48
62
  setup_library
63
+ self.options.title = "Documentation for #{library.name} " +
64
+ (library.version ? '(' + library.version + ')' : '')
49
65
  super
50
66
  rescue LibraryNotPreparedError
51
67
  not_prepared
68
+ ensure
69
+ restore_template_info
52
70
  end
53
71
 
54
72
  private
55
73
 
74
+ def save_default_template_info
75
+ @old_template_paths = Templates::Engine.template_paths.dup
76
+ @old_extra_includes = Templates::Template.extra_includes.dup
77
+ end
78
+
79
+ def restore_template_info
80
+ Templates::Engine.template_paths = @old_template_paths
81
+ Templates::Template.extra_includes = @old_extra_includes
82
+ end
83
+
56
84
  def setup_library
57
85
  library.prepare! if request.xhr? && request.query['process']
58
86
  load_yardoc
@@ -83,16 +111,34 @@ module YARD
83
111
  return
84
112
  end
85
113
  Registry.clear
114
+ Templates::ErbCache.clear!
86
115
  Registry.load_yardoc(library.yardoc_file)
87
116
  Thread.current[:__yard_last_yardoc__] = library.yardoc_file
88
117
  end
89
118
 
90
119
  def not_prepared
91
120
  self.caching = false
92
- options.update(:path => request.path, :template => :doc_server, :type => :processing)
121
+ options.update(:template => :doc_server, :type => :processing)
93
122
  [202, {'Content-Type' => 'text/html'}, [render]]
94
123
  end
95
124
 
125
+ # Hack to load a custom fulldoc template object that does
126
+ # not do any rendering/generation. We need this to access the
127
+ # generate_*_list methods.
128
+ def fulldoc_template
129
+ tplopts = [options.template, :fulldoc, options.format]
130
+ tplclass = Templates::Engine.template(*tplopts)
131
+ obj = Object.new.extend(tplclass)
132
+ class << obj; def init; end end
133
+ obj.class = tplclass
134
+ obj.send(:initialize, options)
135
+ class << obj
136
+ attr_reader :contents
137
+ def asset(file, contents) @contents = contents end
138
+ end
139
+ obj
140
+ end
141
+
96
142
  # @private
97
143
  @@last_yardoc = nil
98
144
  end