yard 0.9.16 → 0.9.17

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 (566) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +26 -26
  3. data/CHANGELOG.md +728 -728
  4. data/LEGAL +66 -66
  5. data/LICENSE +22 -22
  6. data/README.md +328 -328
  7. data/Rakefile +53 -47
  8. data/benchmarks/builtins_vs_eval.rb +24 -24
  9. data/benchmarks/concat_vs_join.rb +13 -13
  10. data/benchmarks/erb_vs_erubis.rb +54 -54
  11. data/benchmarks/format_args.rb +47 -47
  12. data/benchmarks/generation.rb +38 -38
  13. data/benchmarks/marshal_vs_dbm.rb +64 -64
  14. data/benchmarks/parsing.rb +46 -46
  15. data/benchmarks/pathname_vs_string.rb +50 -50
  16. data/benchmarks/rdoc_vs_yardoc.rb +11 -11
  17. data/benchmarks/registry_store_types.rb +49 -49
  18. data/benchmarks/ri_vs_yri.rb +19 -19
  19. data/benchmarks/ripper_parser.rb +13 -13
  20. data/benchmarks/splat_vs_flatten.rb +13 -13
  21. data/benchmarks/template_erb.rb +23 -23
  22. data/benchmarks/template_format.rb +7 -7
  23. data/benchmarks/template_profile.rb +18 -18
  24. data/benchmarks/yri_cache.rb +20 -20
  25. data/bin/yard +13 -13
  26. data/bin/yardoc +13 -13
  27. data/bin/yri +13 -13
  28. data/docs/CodeObjects.md +115 -115
  29. data/docs/GettingStarted.md +679 -679
  30. data/docs/Handlers.md +152 -152
  31. data/docs/Overview.md +61 -61
  32. data/docs/Parser.md +191 -191
  33. data/docs/Tags.md +283 -283
  34. data/docs/TagsArch.md +123 -123
  35. data/docs/Templates.md +496 -496
  36. data/docs/WhatsNew.md +1245 -1245
  37. data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
  38. data/docs/templates/default/fulldoc/html/setup.rb +6 -6
  39. data/docs/templates/default/layout/html/setup.rb +9 -9
  40. data/docs/templates/default/layout/html/tag_list.erb +11 -11
  41. data/docs/templates/default/yard_tags/html/list.erb +18 -18
  42. data/docs/templates/default/yard_tags/html/setup.rb +26 -26
  43. data/docs/templates/plugin.rb +70 -70
  44. data/lib/rubygems_plugin.rb +9 -9
  45. data/lib/yard.rb +69 -69
  46. data/lib/yard/autoload.rb +303 -303
  47. data/lib/yard/cli/command.rb +85 -85
  48. data/lib/yard/cli/command_parser.rb +93 -93
  49. data/lib/yard/cli/config.rb +198 -198
  50. data/lib/yard/cli/diff.rb +270 -270
  51. data/lib/yard/cli/display.rb +69 -69
  52. data/lib/yard/cli/gems.rb +84 -84
  53. data/lib/yard/cli/graph.rb +125 -125
  54. data/lib/yard/cli/help.rb +20 -20
  55. data/lib/yard/cli/i18n.rb +70 -70
  56. data/lib/yard/cli/list.rb +23 -23
  57. data/lib/yard/cli/markup_types.rb +32 -32
  58. data/lib/yard/cli/server.rb +257 -257
  59. data/lib/yard/cli/stats.rb +231 -231
  60. data/lib/yard/cli/yardoc.rb +788 -788
  61. data/lib/yard/cli/yardopts_command.rb +110 -110
  62. data/lib/yard/cli/yri.rb +215 -215
  63. data/lib/yard/code_objects/base.rb +615 -610
  64. data/lib/yard/code_objects/class_object.rb +146 -146
  65. data/lib/yard/code_objects/class_variable_object.rb +11 -11
  66. data/lib/yard/code_objects/constant_object.rb +16 -16
  67. data/lib/yard/code_objects/extended_method_object.rb +24 -24
  68. data/lib/yard/code_objects/extra_file_object.rb +131 -131
  69. data/lib/yard/code_objects/macro_object.rb +172 -172
  70. data/lib/yard/code_objects/method_object.rb +196 -196
  71. data/lib/yard/code_objects/module_object.rb +21 -21
  72. data/lib/yard/code_objects/namespace_mapper.rb +114 -114
  73. data/lib/yard/code_objects/namespace_object.rb +200 -200
  74. data/lib/yard/code_objects/proxy.rb +240 -240
  75. data/lib/yard/code_objects/root_object.rb +19 -19
  76. data/lib/yard/config.rb +270 -270
  77. data/lib/yard/core_ext/array.rb +16 -16
  78. data/lib/yard/core_ext/file.rb +69 -69
  79. data/lib/yard/core_ext/hash.rb +16 -16
  80. data/lib/yard/core_ext/insertion.rb +63 -63
  81. data/lib/yard/core_ext/module.rb +20 -20
  82. data/lib/yard/core_ext/string.rb +68 -68
  83. data/lib/yard/core_ext/symbol_hash.rb +75 -75
  84. data/lib/yard/docstring.rb +386 -378
  85. data/lib/yard/docstring_parser.rb +345 -345
  86. data/lib/yard/gem_index.rb +29 -29
  87. data/lib/yard/globals.rb +22 -22
  88. data/lib/yard/handlers/base.rb +595 -595
  89. data/lib/yard/handlers/c/alias_handler.rb +16 -16
  90. data/lib/yard/handlers/c/attribute_handler.rb +13 -13
  91. data/lib/yard/handlers/c/base.rb +129 -129
  92. data/lib/yard/handlers/c/class_handler.rb +27 -27
  93. data/lib/yard/handlers/c/constant_handler.rb +13 -13
  94. data/lib/yard/handlers/c/handler_methods.rb +211 -211
  95. data/lib/yard/handlers/c/init_handler.rb +20 -20
  96. data/lib/yard/handlers/c/method_handler.rb +45 -36
  97. data/lib/yard/handlers/c/mixin_handler.rb +21 -21
  98. data/lib/yard/handlers/c/module_handler.rb +17 -17
  99. data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
  100. data/lib/yard/handlers/c/path_handler.rb +11 -11
  101. data/lib/yard/handlers/c/struct_handler.rb +13 -13
  102. data/lib/yard/handlers/c/symbol_handler.rb +8 -8
  103. data/lib/yard/handlers/processor.rb +200 -200
  104. data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
  105. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  106. data/lib/yard/handlers/ruby/base.rb +165 -165
  107. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  108. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  109. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  110. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  111. data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
  112. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  113. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  114. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -95
  115. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  116. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  117. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  118. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  119. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  120. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  121. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  122. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  123. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  124. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  125. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  126. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  127. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  128. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  129. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  130. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  131. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  132. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  133. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  134. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  135. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  136. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  137. data/lib/yard/handlers/ruby/method_handler.rb +118 -118
  138. data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
  139. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  140. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  141. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  142. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  143. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  146. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  147. data/lib/yard/i18n/locale.rb +67 -67
  148. data/lib/yard/i18n/message.rb +57 -57
  149. data/lib/yard/i18n/messages.rb +56 -56
  150. data/lib/yard/i18n/po_parser.rb +61 -61
  151. data/lib/yard/i18n/pot_generator.rb +290 -290
  152. data/lib/yard/i18n/text.rb +173 -173
  153. data/lib/yard/logging.rb +205 -205
  154. data/lib/yard/options.rb +217 -217
  155. data/lib/yard/parser/base.rb +57 -57
  156. data/lib/yard/parser/c/c_parser.rb +235 -235
  157. data/lib/yard/parser/c/comment_parser.rb +134 -134
  158. data/lib/yard/parser/c/statement.rb +64 -64
  159. data/lib/yard/parser/ruby/ast_node.rb +540 -540
  160. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
  161. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  162. data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
  163. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  164. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  165. data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
  166. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  167. data/lib/yard/parser/source_parser.rb +526 -526
  168. data/lib/yard/rake/yardoc_task.rb +81 -81
  169. data/lib/yard/registry.rb +439 -439
  170. data/lib/yard/registry_resolver.rb +189 -189
  171. data/lib/yard/registry_store.rb +337 -337
  172. data/lib/yard/rubygems/backports.rb +10 -10
  173. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  174. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  175. data/lib/yard/rubygems/backports/gem.rb +10 -10
  176. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  177. data/lib/yard/rubygems/doc_manager.rb +90 -90
  178. data/lib/yard/rubygems/hook.rb +197 -197
  179. data/lib/yard/rubygems/specification.rb +50 -50
  180. data/lib/yard/serializers/base.rb +83 -83
  181. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  182. data/lib/yard/serializers/process_serializer.rb +24 -24
  183. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  184. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  185. data/lib/yard/server.rb +13 -13
  186. data/lib/yard/server/adapter.rb +100 -100
  187. data/lib/yard/server/commands/base.rb +209 -209
  188. data/lib/yard/server/commands/display_file_command.rb +29 -29
  189. data/lib/yard/server/commands/display_object_command.rb +65 -65
  190. data/lib/yard/server/commands/frames_command.rb +16 -16
  191. data/lib/yard/server/commands/library_command.rb +187 -187
  192. data/lib/yard/server/commands/library_index_command.rb +28 -28
  193. data/lib/yard/server/commands/list_command.rb +25 -25
  194. data/lib/yard/server/commands/root_request_command.rb +15 -15
  195. data/lib/yard/server/commands/search_command.rb +79 -79
  196. data/lib/yard/server/commands/static_file_command.rb +23 -23
  197. data/lib/yard/server/commands/static_file_helpers.rb +62 -62
  198. data/lib/yard/server/doc_server_helper.rb +91 -91
  199. data/lib/yard/server/doc_server_serializer.rb +39 -39
  200. data/lib/yard/server/library_version.rb +277 -277
  201. data/lib/yard/server/rack_adapter.rb +89 -89
  202. data/lib/yard/server/router.rb +187 -187
  203. data/lib/yard/server/static_caching.rb +46 -46
  204. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  205. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  206. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  207. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  208. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  209. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  210. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  211. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  212. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  213. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  214. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  215. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  216. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  217. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  218. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  219. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  220. data/lib/yard/server/webrick_adapter.rb +45 -45
  221. data/lib/yard/tags/default_factory.rb +191 -191
  222. data/lib/yard/tags/default_tag.rb +13 -13
  223. data/lib/yard/tags/directives.rb +616 -616
  224. data/lib/yard/tags/library.rb +633 -633
  225. data/lib/yard/tags/option_tag.rb +13 -13
  226. data/lib/yard/tags/overload_tag.rb +71 -71
  227. data/lib/yard/tags/ref_tag.rb +8 -8
  228. data/lib/yard/tags/ref_tag_list.rb +28 -28
  229. data/lib/yard/tags/tag.rb +71 -71
  230. data/lib/yard/tags/tag_format_error.rb +7 -7
  231. data/lib/yard/tags/types_explainer.rb +162 -162
  232. data/lib/yard/templates/engine.rb +186 -186
  233. data/lib/yard/templates/erb_cache.rb +23 -23
  234. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  235. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  236. data/lib/yard/templates/helpers/html_helper.rb +646 -642
  237. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  238. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  239. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  240. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  241. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  242. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  243. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  244. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  245. data/lib/yard/templates/section.rb +105 -105
  246. data/lib/yard/templates/template.rb +418 -418
  247. data/lib/yard/templates/template_options.rb +92 -92
  248. data/lib/yard/verifier.rb +151 -151
  249. data/lib/yard/version.rb +3 -1
  250. data/spec/cli/command_parser_spec.rb +43 -43
  251. data/spec/cli/command_spec.rb +36 -36
  252. data/spec/cli/config_spec.rb +148 -148
  253. data/spec/cli/diff_spec.rb +254 -254
  254. data/spec/cli/display_spec.rb +30 -30
  255. data/spec/cli/gems_spec.rb +81 -81
  256. data/spec/cli/graph_spec.rb +18 -18
  257. data/spec/cli/help_spec.rb +22 -22
  258. data/spec/cli/i18n_spec.rb +107 -107
  259. data/spec/cli/list_spec.rb +8 -8
  260. data/spec/cli/markup_types_spec.rb +22 -22
  261. data/spec/cli/server_spec.rb +324 -324
  262. data/spec/cli/stats_spec.rb +96 -96
  263. data/spec/cli/yard_on_yard_spec.rb +38 -38
  264. data/spec/cli/yardoc_spec.rb +862 -849
  265. data/spec/cli/yri_spec.rb +101 -101
  266. data/spec/code_objects/base_spec.rb +470 -460
  267. data/spec/code_objects/class_object_spec.rb +226 -226
  268. data/spec/code_objects/code_object_list_spec.rb +36 -36
  269. data/spec/code_objects/constants_spec.rb +116 -116
  270. data/spec/code_objects/extra_file_object_spec.rb +160 -160
  271. data/spec/code_objects/macro_object_spec.rb +150 -150
  272. data/spec/code_objects/method_object_spec.rb +184 -184
  273. data/spec/code_objects/module_object_spec.rb +142 -142
  274. data/spec/code_objects/namespace_object_spec.rb +171 -171
  275. data/spec/code_objects/proxy_spec.rb +141 -141
  276. data/spec/code_objects/spec_helper.rb +3 -3
  277. data/spec/config_spec.rb +171 -171
  278. data/spec/core_ext/array_spec.rb +13 -13
  279. data/spec/core_ext/file_spec.rb +72 -72
  280. data/spec/core_ext/hash_spec.rb +14 -14
  281. data/spec/core_ext/insertion_spec.rb +37 -37
  282. data/spec/core_ext/module_spec.rb +15 -15
  283. data/spec/core_ext/string_spec.rb +42 -42
  284. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  285. data/spec/docstring_parser_spec.rb +280 -262
  286. data/spec/docstring_spec.rb +373 -364
  287. data/spec/examples.txt +1875 -1871
  288. data/spec/handlers/alias_handler_spec.rb +82 -82
  289. data/spec/handlers/attribute_handler_spec.rb +96 -96
  290. data/spec/handlers/base_spec.rb +216 -216
  291. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  292. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  293. data/spec/handlers/c/class_handler_spec.rb +78 -78
  294. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  295. data/spec/handlers/c/init_handler_spec.rb +48 -48
  296. data/spec/handlers/c/method_handler_spec.rb +325 -325
  297. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  298. data/spec/handlers/c/module_handler_spec.rb +71 -71
  299. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  300. data/spec/handlers/c/path_handler_spec.rb +36 -36
  301. data/spec/handlers/c/spec_helper.rb +23 -23
  302. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  303. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  304. data/spec/handlers/class_handler_spec.rb +247 -247
  305. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  306. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  307. data/spec/handlers/constant_handler_spec.rb +112 -112
  308. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  309. data/spec/handlers/dsl_handler_spec.rb +219 -219
  310. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  311. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  312. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  313. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  314. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  315. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  316. data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
  317. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  318. data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
  319. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  320. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  321. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
  322. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  323. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  324. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  325. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  326. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  327. data/spec/handlers/exception_handler_spec.rb +49 -49
  328. data/spec/handlers/extend_handler_spec.rb +24 -24
  329. data/spec/handlers/legacy_base_spec.rb +128 -128
  330. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  331. data/spec/handlers/method_handler_spec.rb +190 -190
  332. data/spec/handlers/mixin_handler_spec.rb +56 -56
  333. data/spec/handlers/module_function_handler_spec.rb +106 -106
  334. data/spec/handlers/module_handler_spec.rb +35 -35
  335. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  336. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  337. data/spec/handlers/processor_spec.rb +35 -35
  338. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  339. data/spec/handlers/ruby/base_spec.rb +95 -95
  340. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  341. data/spec/handlers/spec_helper.rb +33 -33
  342. data/spec/handlers/visibility_handler_spec.rb +44 -44
  343. data/spec/handlers/yield_handler_spec.rb +52 -52
  344. data/spec/i18n/locale_spec.rb +81 -81
  345. data/spec/i18n/message_spec.rb +52 -52
  346. data/spec/i18n/messages_spec.rb +67 -67
  347. data/spec/i18n/pot_generator_spec.rb +295 -295
  348. data/spec/i18n/text_spec.rb +184 -184
  349. data/spec/logging_spec.rb +44 -44
  350. data/spec/options_spec.rb +171 -171
  351. data/spec/parser/base_spec.rb +24 -24
  352. data/spec/parser/c_parser_spec.rb +236 -223
  353. data/spec/parser/examples/array.c.txt +6267 -6267
  354. data/spec/parser/examples/example1.rb.txt +7 -7
  355. data/spec/parser/examples/extrafile.c.txt +8 -8
  356. data/spec/parser/examples/file.c.txt +28 -0
  357. data/spec/parser/examples/multifile.c.txt +22 -22
  358. data/spec/parser/examples/namespace.cpp.txt +68 -68
  359. data/spec/parser/examples/override.c.txt +424 -424
  360. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  361. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  362. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  363. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  364. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  365. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  366. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  367. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  368. data/spec/parser/source_parser_spec.rb +727 -727
  369. data/spec/parser/tag_parsing_spec.rb +17 -17
  370. data/spec/rake/yardoc_task_spec.rb +118 -118
  371. data/spec/registry_spec.rb +463 -463
  372. data/spec/registry_store_spec.rb +316 -316
  373. data/spec/rubygems/doc_manager_spec.rb +112 -112
  374. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  375. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  376. data/spec/serializers/spec_helper.rb +2 -2
  377. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  378. data/spec/server/adapter_spec.rb +39 -39
  379. data/spec/server/commands/base_spec.rb +91 -91
  380. data/spec/server/commands/library_command_spec.rb +39 -39
  381. data/spec/server/doc_server_helper_spec.rb +72 -72
  382. data/spec/server/doc_server_serializer_spec.rb +60 -60
  383. data/spec/server/rack_adapter_spec.rb +21 -21
  384. data/spec/server/router_spec.rb +123 -123
  385. data/spec/server/spec_helper.rb +22 -22
  386. data/spec/server/static_caching_spec.rb +47 -47
  387. data/spec/server/webrick_servlet_spec.rb +20 -20
  388. data/spec/server_spec.rb +19 -19
  389. data/spec/spec_helper.rb +212 -212
  390. data/spec/tags/default_factory_spec.rb +168 -168
  391. data/spec/tags/default_tag_spec.rb +11 -11
  392. data/spec/tags/directives_spec.rb +463 -463
  393. data/spec/tags/library_spec.rb +48 -48
  394. data/spec/tags/overload_tag_spec.rb +53 -53
  395. data/spec/tags/ref_tag_list_spec.rb +53 -53
  396. data/spec/tags/types_explainer_spec.rb +203 -203
  397. data/spec/templates/class_spec.rb +45 -45
  398. data/spec/templates/constant_spec.rb +41 -41
  399. data/spec/templates/engine_spec.rb +131 -131
  400. data/spec/templates/examples/class001.html +308 -308
  401. data/spec/templates/examples/class001.txt +36 -36
  402. data/spec/templates/examples/class002.html +39 -39
  403. data/spec/templates/examples/constant001.txt +24 -24
  404. data/spec/templates/examples/constant002.txt +6 -6
  405. data/spec/templates/examples/constant003.txt +10 -10
  406. data/spec/templates/examples/method001.html +137 -137
  407. data/spec/templates/examples/method001.txt +35 -35
  408. data/spec/templates/examples/method002.html +91 -91
  409. data/spec/templates/examples/method002.txt +20 -20
  410. data/spec/templates/examples/method003.html +165 -165
  411. data/spec/templates/examples/method003.txt +45 -45
  412. data/spec/templates/examples/method004.html +48 -48
  413. data/spec/templates/examples/method004.txt +10 -10
  414. data/spec/templates/examples/method005.html +105 -105
  415. data/spec/templates/examples/method005.txt +33 -33
  416. data/spec/templates/examples/method006.html +107 -107
  417. data/spec/templates/examples/method006.txt +20 -20
  418. data/spec/templates/examples/module001.dot +33 -33
  419. data/spec/templates/examples/module001.html +833 -833
  420. data/spec/templates/examples/module001.txt +33 -33
  421. data/spec/templates/examples/module002.html +341 -341
  422. data/spec/templates/examples/module003.html +202 -202
  423. data/spec/templates/examples/module004.html +394 -394
  424. data/spec/templates/examples/module005.html +81 -81
  425. data/spec/templates/examples/tag001.txt +82 -82
  426. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  427. data/spec/templates/helpers/html_helper_spec.rb +668 -653
  428. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  429. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  430. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  431. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  432. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  433. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  434. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  435. data/spec/templates/method_spec.rb +118 -118
  436. data/spec/templates/module_spec.rb +203 -203
  437. data/spec/templates/onefile_spec.rb +66 -66
  438. data/spec/templates/section_spec.rb +144 -144
  439. data/spec/templates/spec_helper.rb +76 -76
  440. data/spec/templates/tag_spec.rb +52 -52
  441. data/spec/templates/template_spec.rb +410 -410
  442. data/spec/verifier_spec.rb +106 -106
  443. data/templates/default/class/dot/setup.rb +7 -7
  444. data/templates/default/class/dot/superklass.erb +2 -2
  445. data/templates/default/class/html/constructor_details.erb +8 -8
  446. data/templates/default/class/html/setup.rb +2 -2
  447. data/templates/default/class/html/subclasses.erb +4 -4
  448. data/templates/default/class/setup.rb +36 -36
  449. data/templates/default/class/text/setup.rb +12 -12
  450. data/templates/default/class/text/subclasses.erb +5 -5
  451. data/templates/default/constant/text/header.erb +11 -11
  452. data/templates/default/constant/text/setup.rb +4 -4
  453. data/templates/default/docstring/html/abstract.erb +4 -4
  454. data/templates/default/docstring/html/deprecated.erb +1 -1
  455. data/templates/default/docstring/html/index.erb +5 -5
  456. data/templates/default/docstring/html/note.erb +6 -6
  457. data/templates/default/docstring/html/private.erb +4 -4
  458. data/templates/default/docstring/html/text.erb +1 -1
  459. data/templates/default/docstring/html/todo.erb +6 -6
  460. data/templates/default/docstring/setup.rb +52 -52
  461. data/templates/default/docstring/text/abstract.erb +2 -2
  462. data/templates/default/docstring/text/deprecated.erb +2 -2
  463. data/templates/default/docstring/text/index.erb +2 -2
  464. data/templates/default/docstring/text/note.erb +3 -3
  465. data/templates/default/docstring/text/private.erb +2 -2
  466. data/templates/default/docstring/text/text.erb +1 -1
  467. data/templates/default/docstring/text/todo.erb +3 -3
  468. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  469. data/templates/default/fulldoc/html/css/style.css +496 -496
  470. data/templates/default/fulldoc/html/frames.erb +17 -17
  471. data/templates/default/fulldoc/html/full_list.erb +37 -37
  472. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  473. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  474. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  475. data/templates/default/fulldoc/html/js/app.js +292 -292
  476. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  477. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  478. data/templates/default/fulldoc/html/setup.rb +241 -241
  479. data/templates/default/layout/dot/header.erb +5 -5
  480. data/templates/default/layout/dot/setup.rb +15 -15
  481. data/templates/default/layout/html/breadcrumb.erb +11 -11
  482. data/templates/default/layout/html/files.erb +11 -11
  483. data/templates/default/layout/html/footer.erb +5 -5
  484. data/templates/default/layout/html/headers.erb +15 -15
  485. data/templates/default/layout/html/index.erb +2 -2
  486. data/templates/default/layout/html/layout.erb +23 -23
  487. data/templates/default/layout/html/listing.erb +4 -4
  488. data/templates/default/layout/html/objects.erb +32 -32
  489. data/templates/default/layout/html/script_setup.erb +4 -4
  490. data/templates/default/layout/html/search.erb +12 -12
  491. data/templates/default/layout/html/setup.rb +89 -89
  492. data/templates/default/method/html/header.erb +16 -16
  493. data/templates/default/method/setup.rb +4 -4
  494. data/templates/default/method_details/html/header.erb +2 -2
  495. data/templates/default/method_details/html/method_signature.erb +24 -24
  496. data/templates/default/method_details/html/source.erb +9 -9
  497. data/templates/default/method_details/setup.rb +11 -11
  498. data/templates/default/method_details/text/header.erb +10 -10
  499. data/templates/default/method_details/text/method_signature.erb +12 -12
  500. data/templates/default/method_details/text/setup.rb +11 -11
  501. data/templates/default/module/dot/child.erb +1 -1
  502. data/templates/default/module/dot/dependencies.erb +2 -2
  503. data/templates/default/module/dot/header.erb +6 -6
  504. data/templates/default/module/dot/info.erb +13 -13
  505. data/templates/default/module/dot/setup.rb +15 -15
  506. data/templates/default/module/html/attribute_details.erb +10 -10
  507. data/templates/default/module/html/attribute_summary.erb +8 -8
  508. data/templates/default/module/html/box_info.erb +43 -43
  509. data/templates/default/module/html/children.erb +8 -8
  510. data/templates/default/module/html/constant_summary.erb +17 -17
  511. data/templates/default/module/html/defines.erb +2 -2
  512. data/templates/default/module/html/header.erb +5 -5
  513. data/templates/default/module/html/inherited_attributes.erb +14 -14
  514. data/templates/default/module/html/inherited_constants.erb +8 -8
  515. data/templates/default/module/html/inherited_methods.erb +18 -18
  516. data/templates/default/module/html/item_summary.erb +40 -40
  517. data/templates/default/module/html/method_details_list.erb +9 -9
  518. data/templates/default/module/html/method_summary.erb +13 -13
  519. data/templates/default/module/html/methodmissing.erb +12 -12
  520. data/templates/default/module/setup.rb +167 -167
  521. data/templates/default/module/text/children.erb +9 -9
  522. data/templates/default/module/text/class_meths_list.erb +7 -7
  523. data/templates/default/module/text/extends.erb +7 -7
  524. data/templates/default/module/text/header.erb +7 -7
  525. data/templates/default/module/text/includes.erb +7 -7
  526. data/templates/default/module/text/instance_meths_list.erb +7 -7
  527. data/templates/default/module/text/setup.rb +13 -13
  528. data/templates/default/onefile/html/files.erb +4 -4
  529. data/templates/default/onefile/html/headers.erb +6 -6
  530. data/templates/default/onefile/html/layout.erb +17 -17
  531. data/templates/default/onefile/html/readme.erb +2 -2
  532. data/templates/default/onefile/html/setup.rb +62 -62
  533. data/templates/default/root/dot/child.erb +2 -2
  534. data/templates/default/root/dot/setup.rb +6 -6
  535. data/templates/default/root/html/setup.rb +2 -2
  536. data/templates/default/tags/html/example.erb +10 -10
  537. data/templates/default/tags/html/index.erb +2 -2
  538. data/templates/default/tags/html/option.erb +24 -24
  539. data/templates/default/tags/html/overload.erb +13 -13
  540. data/templates/default/tags/html/see.erb +7 -7
  541. data/templates/default/tags/html/tag.erb +20 -20
  542. data/templates/default/tags/setup.rb +57 -57
  543. data/templates/default/tags/text/example.erb +12 -12
  544. data/templates/default/tags/text/index.erb +1 -1
  545. data/templates/default/tags/text/option.erb +20 -20
  546. data/templates/default/tags/text/overload.erb +19 -19
  547. data/templates/default/tags/text/see.erb +11 -11
  548. data/templates/default/tags/text/tag.erb +13 -13
  549. data/templates/guide/class/html/setup.rb +2 -2
  550. data/templates/guide/docstring/html/setup.rb +2 -2
  551. data/templates/guide/fulldoc/html/css/style.css +108 -108
  552. data/templates/guide/fulldoc/html/js/app.js +33 -33
  553. data/templates/guide/fulldoc/html/setup.rb +74 -74
  554. data/templates/guide/layout/html/layout.erb +81 -81
  555. data/templates/guide/layout/html/setup.rb +25 -25
  556. data/templates/guide/method/html/header.erb +17 -17
  557. data/templates/guide/method/html/setup.rb +22 -22
  558. data/templates/guide/module/html/header.erb +6 -6
  559. data/templates/guide/module/html/method_list.erb +4 -4
  560. data/templates/guide/module/html/setup.rb +27 -27
  561. data/templates/guide/onefile/html/files.erb +4 -4
  562. data/templates/guide/onefile/html/setup.rb +6 -6
  563. data/templates/guide/onefile/html/toc.erb +3 -3
  564. data/templates/guide/tags/html/setup.rb +9 -9
  565. data/yard.gemspec +43 -43
  566. metadata +4 -4
@@ -1,788 +1,788 @@
1
- # frozen_string_literal: true
2
- require 'digest/sha1'
3
- require 'fileutils'
4
-
5
- module YARD
6
- module CLI
7
- # Default options used in +yard doc+ command.
8
- class YardocOptions < Templates::TemplateOptions
9
- # @return [Array<CodeObjects::ExtraFileObject>]
10
- # the list of extra files rendered along with objects
11
- default_attr :files, lambda { [] }
12
-
13
- # @return [String] the default title appended to each generated page
14
- default_attr :title, "Documentation by YARD #{YARD::VERSION}"
15
-
16
- # @return [Verifier] the default verifier object to filter queries
17
- default_attr :verifier, lambda { Verifier.new }
18
-
19
- # @return [Serializers::Base] the default serializer for generating output
20
- # to disk.
21
- default_attr :serializer, lambda { Serializers::FileSystemSerializer.new }
22
-
23
- # @return [Symbol] the default output format (:html).
24
- default_attr :format, :html
25
-
26
- # @return [Boolean] whether the data should be rendered in a single page,
27
- # if the template supports it.
28
- default_attr :onefile, false
29
-
30
- # @return [CodeObjects::ExtraFileObject] the README file object rendered
31
- # along with objects
32
- attr_accessor :readme
33
-
34
- # @return [Array<CodeObjects::Base>] the list of code objects to render
35
- # the templates with.
36
- attr_accessor :objects
37
-
38
- # @return [Numeric] An index value for rendering sequentially related templates
39
- attr_accessor :index
40
-
41
- # @return [CodeObjects::Base] an extra item to send to a template that is not
42
- # the main rendered object
43
- attr_accessor :item
44
-
45
- # @return [CodeObjects::ExtraFileObject] the file object being rendered.
46
- # The +object+ key is not used so that a file may be rendered in the context
47
- # of an object's namespace (for generating links).
48
- attr_accessor :file
49
-
50
- # @return [String] the current locale
51
- attr_accessor :locale
52
- end
53
-
54
- # Yardoc is the default YARD CLI command (+yard doc+ and historic +yardoc+
55
- # executable) used to generate and output (mainly) HTML documentation given
56
- # a set of source files.
57
- #
58
- # == Usage
59
- #
60
- # Main usage for this command is:
61
- #
62
- # $ yardoc [options] [source_files [- extra_files]]
63
- #
64
- # See +yardoc --help+ for details on valid options.
65
- #
66
- # == Options File (+.yardopts+)
67
- #
68
- # If a +.yardopts+ file is found in the source directory being processed,
69
- # YARD will use the contents of the file as arguments to the command,
70
- # treating newlines as spaces. You can use shell-style quotations to
71
- # group space delimited arguments, just like on the command line.
72
- #
73
- # A valid +.yardopts+ file might look like:
74
- #
75
- # --no-private
76
- # --title "My Title"
77
- # --exclude foo --exclude bar
78
- # lib/**/*.erb
79
- # lib/**/*.rb -
80
- # HACKING.rdoc LEGAL COPYRIGHT
81
- #
82
- # Note that Yardoc also supports the legacy RDoc style +.document+ file,
83
- # though this file can only specify source globs to parse, not options.
84
- #
85
- # == Queries (+--query+)
86
- #
87
- # Yardoc supports queries to select specific code objects for which to
88
- # generate documentation. For example, you might want to generate
89
- # documentation only for your public API. If you've documented your public
90
- # methods with +@api public+, you can use the following query to select
91
- # all of these objects:
92
- #
93
- # --query '@api.text == "public"'
94
- #
95
- # Note that the syntax for queries is mostly Ruby with a few syntactic
96
- # simplifications for meta-data tags. See the {Verifier} class for an
97
- # overview of this syntax.
98
- #
99
- # == Adding Custom Ad-Hoc Meta-data Tags (+--tag+)
100
- #
101
- # YARD allows specification of {file:docs/Tags.md meta-data tags}
102
- # programmatically via the {YARD::Tags::Library} class, but often this is not
103
- # practical for users writing documentation. To make adding custom tags
104
- # easier, Yardoc has a few command-line switches for creating basic tags
105
- # and displaying them in generated HTML output.
106
- #
107
- # To specify a custom tag to be displayed in output, use any of the
108
- # following:
109
- #
110
- # * +--tag+ TAG:TITLE
111
- # * +--name-tag+ TAG:TITLE
112
- # * +--type-tag+ TAG:TITLE
113
- # * +--type-name-tag+ TAG:TITLE
114
- # * +--title-tag+ TAG:TITLE
115
- #
116
- # "TAG:TITLE" is of the form: name:"Display Title", for example:
117
- #
118
- # --tag overload:"Overloaded Method"
119
- #
120
- # See +yard help doc+ for a description of the various options.
121
- #
122
- # Tags added in this way are automatically displayed in output. To add
123
- # a meta-data tag that does not show up in output, use +--hide-tag TAG+.
124
- # Note that you can also use this option on existing tags to hide
125
- # builtin tags, for instance.
126
- #
127
- # == Processed Data Storage (+.yardoc+ directory)
128
- #
129
- # When Yardoc parses a source directory, it creates a +.yardoc+ directory
130
- # (by default, override with +-b+) at the root of the project. This directory
131
- # contains marshal dumps for all raw object data in the source, so that
132
- # you can access it later for various commands (+stats+, +graph+, etc.).
133
- # This directory is also used as a cache for any future calls to +yardoc+
134
- # so as to process only the files which have changed since the last call.
135
- #
136
- # When Yardoc uses the cache in subsequent calls to +yardoc+, methods
137
- # or classes that have been deleted from source since the last parsing
138
- # will not be erased from the cache (YARD never deletes objects). In such
139
- # a case, you should wipe the cache and do a clean parsing of the source tree.
140
- # You can do this by deleting the +.yardoc+ directory manually, or running
141
- # Yardoc without +--use-cache+ (+-c+).
142
- #
143
- # @since 0.2.1
144
- # @see Verifier
145
- class Yardoc < YardoptsCommand
146
- # @return [Hash] the hash of options passed to the template.
147
- # @see Templates::Engine#render
148
- attr_reader :options
149
-
150
- # @return [Array<String>] list of Ruby source files to process
151
- attr_accessor :files
152
-
153
- # @return [Array<String>] list of excluded paths (regexp matches)
154
- # @since 0.5.3
155
- attr_accessor :excluded
156
-
157
- # @return [Boolean] whether to use the existing yardoc db if the
158
- # .yardoc already exists. Also makes use of file checksums to
159
- # parse only changed files.
160
- attr_accessor :use_cache
161
-
162
- # @return [Boolean] whether objects should be serialized to .yardoc db
163
- attr_accessor :save_yardoc
164
-
165
- # @return [Boolean] whether to generate output
166
- attr_accessor :generate
167
-
168
- # @return [Boolean] whether to print a list of objects
169
- # @since 0.5.5
170
- attr_accessor :list
171
-
172
- # Keep track of which visibilities are to be shown
173
- # @return [Array<Symbol>] a list of visibilities
174
- # @since 0.5.6
175
- attr_accessor :visibilities
176
-
177
- # Keep track of which APIs are to be shown
178
- # @return [Array<String>] a list of APIs
179
- # @since 0.8.1
180
- attr_accessor :apis
181
-
182
- # Keep track of which APIs are to be hidden
183
- # @return [Array<String>] a list of APIs to be hidden
184
- # @since 0.8.7
185
- attr_accessor :hidden_apis
186
-
187
- # @return [Array<Symbol>] a list of tags to hide from templates
188
- # @since 0.6.0
189
- attr_accessor :hidden_tags
190
-
191
- # @return [Boolean] whether to print statistics after parsing
192
- # @since 0.6.0
193
- attr_accessor :statistics
194
-
195
- # @return [Array<String>] a list of assets to copy after generation
196
- # @since 0.6.0
197
- attr_accessor :assets
198
-
199
- # @return [Boolean] whether markup option was specified
200
- # @since 0.7.0
201
- attr_accessor :has_markup
202
-
203
- # @return [Boolean] whether yard exits with error status code if a warning occurs
204
- attr_accessor :fail_on_warning
205
-
206
- # Creates a new instance of the commandline utility
207
- def initialize
208
- super
209
- @options = YardocOptions.new
210
- @options.reset_defaults
211
- @visibilities = [:public]
212
- @apis = []
213
- @hidden_apis = []
214
- @assets = {}
215
- @excluded = []
216
- @files = []
217
- @hidden_tags = []
218
- @use_cache = false
219
- @generate = true
220
- @statistics = true
221
- @list = false
222
- @save_yardoc = true
223
- @has_markup = false
224
- @fail_on_warning = false
225
-
226
- if defined?(::Encoding) && ::Encoding.respond_to?(:default_external=)
227
- utf8 = ::Encoding.find('utf-8')
228
-
229
- ::Encoding.default_external = utf8 unless ::Encoding.default_external == utf8
230
- ::Encoding.default_internal = utf8 unless ::Encoding.default_internal == utf8
231
- end
232
- end
233
-
234
- def description
235
- "Generates documentation"
236
- end
237
-
238
- # Runs the commandline utility, parsing arguments and generating
239
- # output if set.
240
- #
241
- # @param [Array<String>] args the list of arguments. If the list only
242
- # contains a single nil value, skip calling of {#parse_arguments}
243
- # @return [void]
244
- def run(*args)
245
- log.show_progress = true
246
- if args.empty? || !args.first.nil?
247
- # fail early if arguments are not valid
248
- return unless parse_arguments(*args)
249
- end
250
-
251
- checksums = nil
252
- if use_cache
253
- Registry.load
254
- checksums = Registry.checksums.dup
255
- end
256
-
257
- if save_yardoc
258
- Registry.lock_for_writing do
259
- YARD.parse(files, excluded)
260
- Registry.save(use_cache)
261
- end
262
- else
263
- YARD.parse(files, excluded)
264
- end
265
-
266
- if generate
267
- run_generate(checksums)
268
- copy_assets
269
- elsif list
270
- print_list
271
- end
272
-
273
- if !list && statistics && log.level < Logger::ERROR
274
- Registry.load_all
275
- log.enter_level(Logger::ERROR) do
276
- Stats.new(false).run(*args)
277
- end
278
- end
279
-
280
- abort if fail_on_warning && log.warned
281
-
282
- true
283
- ensure
284
- log.show_progress = false
285
- end
286
-
287
- # Parses commandline arguments
288
- # @param [Array<String>] args the list of arguments
289
- # @return [Boolean] whether or not arguments are valid
290
- # @since 0.5.6
291
- def parse_arguments(*args)
292
- super(*args)
293
-
294
- # Last minute modifications
295
- self.files = Parser::SourceParser::DEFAULT_PATH_GLOB if files.empty?
296
- files.delete_if {|x| x =~ /\A\s*\Z/ } # remove empty ones
297
- readme = Dir.glob('README{,*[^~]}').first
298
- readme ||= Dir.glob(files.first).first if options.onefile
299
- options.readme ||= CodeObjects::ExtraFileObject.new(readme) if readme
300
- options.files.unshift(options.readme).uniq! if options.readme
301
-
302
- Tags::Library.visible_tags -= hidden_tags
303
- add_visibility_verifier
304
- add_api_verifier
305
-
306
- apply_locale
307
-
308
- # US-ASCII is invalid encoding for onefile
309
- if defined?(::Encoding) && options.onefile
310
- if ::Encoding.default_internal == ::Encoding::US_ASCII
311
- log.warn "--one-file is not compatible with US-ASCII encoding, using ASCII-8BIT"
312
- ::Encoding.default_external, ::Encoding.default_internal = ['ascii-8bit'] * 2
313
- end
314
- end
315
-
316
- if generate && !verify_markup_options
317
- false
318
- else
319
- true
320
- end
321
- end
322
-
323
- # The list of all objects to process. Override this method to change
324
- # which objects YARD should generate documentation for.
325
- #
326
- # @deprecated To hide methods use the +@private+ tag instead.
327
- # @return [Array<CodeObjects::Base>] a list of code objects to process
328
- def all_objects
329
- Registry.all(:root, :module, :class)
330
- end
331
-
332
- private
333
-
334
- # Generates output for objects
335
- # @param [Hash, nil] checksums if supplied, a list of checkums for files.
336
- # @return [void]
337
- # @since 0.5.1
338
- def run_generate(checksums)
339
- if checksums
340
- changed_files = []
341
- Registry.checksums.each do |file, hash|
342
- changed_files << file if checksums[file] != hash
343
- end
344
- end
345
- Registry.load_all if use_cache
346
- objects = run_verifier(all_objects).reject do |object|
347
- serialized = !options.serializer || options.serializer.exists?(object)
348
- if checksums && serialized && !object.files.any? {|f, _line| changed_files.include?(f) }
349
- true
350
- else
351
- log.debug "Re-generating object #{object.path}..."
352
- false
353
- end
354
- end
355
- Templates::Engine.generate(objects, options)
356
- end
357
-
358
- # Verifies that the markup options are valid before parsing any code.
359
- # Failing early is better than failing late.
360
- #
361
- # @return (see YARD::Templates::Helpers::MarkupHelper#load_markup_provider)
362
- def verify_markup_options
363
- result = false
364
- lvl = has_markup ? log.level : Logger::FATAL
365
- obj = Struct.new(:options).new(options)
366
- obj.extend(Templates::Helpers::MarkupHelper)
367
- options.files.each do |file|
368
- markup = file.attributes[:markup] || obj.markup_for_file('', file.filename)
369
- result = obj.load_markup_provider(markup)
370
- return false if !result && markup != :rdoc
371
- end
372
- options.markup = :rdoc unless has_markup
373
- log.enter_level(lvl) { result = obj.load_markup_provider }
374
- if !result && !has_markup
375
- log.warn "Could not load default RDoc formatter, " \
376
- "ignoring any markup (install RDoc to get default formatting)."
377
- options.markup = :none
378
- true
379
- else
380
- result
381
- end
382
- end
383
-
384
- # Copies any assets to the output directory
385
- # @return [void]
386
- # @since 0.6.0
387
- def copy_assets
388
- return unless options.serializer
389
- outpath = options.serializer.basepath
390
- assets.each do |from, to|
391
- to = File.join(outpath, to)
392
- log.debug "Copying asset '#{from}' to '#{to}'"
393
- from += '/.' if File.directory?(from)
394
- FileUtils.cp_r(from, to)
395
- end
396
- end
397
-
398
- # Prints a list of all objects
399
- # @return [void]
400
- # @since 0.5.5
401
- def print_list
402
- Registry.load_all
403
- run_verifier(Registry.all).
404
- sort_by {|item| [item.file || '', item.line || 0] }.each do |item|
405
- log.puts "#{item.file}:#{item.line}: #{item.path}"
406
- end
407
- end
408
-
409
- # Adds a set of extra documentation files to be processed
410
- # @param [Array<String>] files the set of documentation files
411
- def add_extra_files(*files)
412
- files.map! {|f| f.include?("*") ? Dir.glob(f) : f }.flatten!
413
- files.each do |file|
414
- if extra_file_valid?(file)
415
- options.files << CodeObjects::ExtraFileObject.new(file)
416
- end
417
- end
418
- end
419
-
420
- # @param file [String] the filename to validate
421
- # @param check_exists [Boolean] whether the file should exist on disk
422
- # @return [Boolean] whether the file is allowed to be used
423
- def extra_file_valid?(file, check_exists = true)
424
- if file =~ %r{^(?:\.\./|/)}
425
- log.warn "Invalid file: #{file}"
426
- false
427
- elsif check_exists && !File.file?(file)
428
- log.warn "Could not find file: #{file}"
429
- false
430
- else
431
- true
432
- end
433
- end
434
-
435
- # Parses the file arguments into Ruby files and extra files, which are
436
- # separated by a '-' element.
437
- #
438
- # @example Parses a set of Ruby source files
439
- # parse_files %w(file1 file2 file3)
440
- # @example Parses a set of Ruby files with a separator and extra files
441
- # parse_files %w(file1 file2 - extrafile1 extrafile2)
442
- # @param [Array<String>] files the list of files to parse
443
- # @return [void]
444
- def parse_files(*files)
445
- seen_extra_files_marker = false
446
-
447
- files.each do |file|
448
- if file == "-"
449
- seen_extra_files_marker = true
450
- next
451
- end
452
-
453
- if seen_extra_files_marker
454
- add_extra_files(file)
455
- else
456
- self.files << file
457
- end
458
- end
459
- end
460
-
461
- # Adds verifier rule for visibilities
462
- # @return [void]
463
- # @since 0.5.6
464
- def add_visibility_verifier
465
- vis_expr = "#{visibilities.uniq.inspect}.include?(object.visibility)"
466
- options.verifier.add_expressions(vis_expr)
467
- end
468
-
469
- # Adds verifier rule for APIs
470
- # @return [void]
471
- # @since 0.8.1
472
- def add_api_verifier
473
- no_api = true if apis.delete('')
474
- exprs = []
475
-
476
- exprs << "#{apis.uniq.inspect}.include?(@api.text)" unless apis.empty?
477
-
478
- unless hidden_apis.empty?
479
- exprs << "!#{hidden_apis.uniq.inspect}.include?(@api.text)"
480
- end
481
-
482
- exprs = !exprs.empty? ? [exprs.join(' && ')] : []
483
- exprs << "!@api" if no_api
484
-
485
- expr = exprs.join(' || ')
486
- options.verifier.add_expressions(expr) unless expr.empty?
487
- end
488
-
489
- # Applies the specified locale to collected objects
490
- # @return [void]
491
- # @since 0.8.3
492
- def apply_locale
493
- YARD::I18n::Locale.default = options.locale
494
- options.files.each do |file|
495
- file.locale = options.locale
496
- end
497
- end
498
-
499
- # (see Templates::Helpers::BaseHelper#run_verifier)
500
- def run_verifier(list)
501
- options.verifier ? options.verifier.run(list) : list
502
- end
503
-
504
- # @since 0.6.0
505
- def add_tag(tag_data, factory_method = nil)
506
- tag, title = *tag_data.split(':')
507
- title ||= tag.capitalize
508
- Tags::Library.define_tag(title, tag.to_sym, factory_method)
509
- Tags::Library.visible_tags |= [tag.to_sym]
510
- end
511
-
512
- # Parses commandline options.
513
- # @param [Array<String>] args each tokenized argument
514
- def optparse(*args)
515
- opts = OptionParser.new
516
- opts.banner = "Usage: yard doc [options] [source_files [- extra_files]]"
517
-
518
- opts.separator "(if a list of source files is omitted, "
519
- opts.separator " {lib,app}/**/*.rb ext/**/*.c is used.)"
520
- opts.separator ""
521
- opts.separator "Example: yardoc -o documentation/ - FAQ LICENSE"
522
- opts.separator " The above example outputs documentation for files in"
523
- opts.separator " lib/**/*.rb to documentation/ including the extra files"
524
- opts.separator " FAQ and LICENSE."
525
- opts.separator ""
526
- opts.separator "A base set of options can be specified by adding a .yardopts"
527
- opts.separator "file to your base path containing all extra options separated"
528
- opts.separator "by whitespace."
529
-
530
- general_options(opts)
531
- output_options(opts)
532
- tag_options(opts)
533
- common_options(opts)
534
- parse_options(opts, args)
535
- parse_files(*args) unless args.empty?
536
- end
537
-
538
- # Adds general options
539
- def general_options(opts)
540
- opts.separator ""
541
- opts.separator "General Options:"
542
-
543
- opts.on('-b', '--db FILE', 'Use a specified .yardoc db to load from or save to',
544
- ' (defaults to .yardoc)') do |yfile|
545
- YARD::Registry.yardoc_file = yfile
546
- end
547
-
548
- opts.on('--[no-]single-db', 'Whether code objects should be stored to single',
549
- ' database file (advanced)') do |use_single_db|
550
- Registry.single_object_db = use_single_db
551
- end
552
-
553
- opts.on('-n', '--no-output', 'Only generate .yardoc database, no documentation.') do
554
- self.generate = false
555
- end
556
-
557
- opts.on('-c', '--use-cache [FILE]',
558
- "Use the cached .yardoc db to generate documentation.",
559
- " (defaults to no cache)") do |file|
560
- YARD::Registry.yardoc_file = file if file
561
- self.use_cache = true
562
- end
563
-
564
- opts.on('--no-cache', "Clear .yardoc db before parsing source.") do
565
- self.use_cache = false
566
- end
567
-
568
- yardopts_options(opts)
569
-
570
- opts.on('--no-save', 'Do not save the parsed data to the yardoc db') do
571
- self.save_yardoc = false
572
- end
573
-
574
- opts.on('--exclude REGEXP', 'Ignores a file if it matches path match (regexp)') do |path|
575
- excluded << path
576
- end
577
-
578
- opts.on('--fail-on-warning', 'Exit with error status code if a warning occurs') do
579
- self.fail_on_warning = true
580
- end
581
- end
582
-
583
- # Adds output options
584
- def output_options(opts)
585
- opts.separator ""
586
- opts.separator "Output options:"
587
-
588
- opts.on('--one-file', 'Generates output as a single file') do
589
- options.onefile = true
590
- end
591
-
592
- opts.on('--list', 'List objects to standard out (implies -n)') do |_format|
593
- self.generate = false
594
- self.list = true
595
- end
596
-
597
- opts.on('--no-public', "Don't show public methods. (default shows public)") do
598
- visibilities.delete(:public)
599
- end
600
-
601
- opts.on('--protected', "Show protected methods. (default hides protected)") do
602
- visibilities.push(:protected)
603
- end
604
-
605
- opts.on('--private', "Show private methods. (default hides private)") do
606
- visibilities.push(:private)
607
- end
608
-
609
- opts.on('--no-private', "Hide objects with @private tag") do
610
- options.verifier.add_expressions '!object.tag(:private) &&
611
- (object.namespace.is_a?(CodeObjects::Proxy) || !object.namespace.tag(:private))'
612
- end
613
-
614
- opts.on('--[no-]api API', 'Generates documentation for a given API',
615
- '(objects which define the correct @api tag).',
616
- 'If --no-api is given, displays objects with',
617
- 'no @api tag.') do |api|
618
- api = '' if api == false
619
- apis.push(api)
620
- end
621
-
622
- opts.on('--hide-api API', 'Hides given @api tag from documentation') do |api|
623
- hidden_apis.push(api)
624
- end
625
-
626
- opts.on('--embed-mixins', "Embeds mixin methods into class documentation") do
627
- options.embed_mixins << '*'
628
- end
629
-
630
- opts.on('--embed-mixin [MODULE]', "Embeds mixin methods from a particular",
631
- " module into class documentation") do |mod|
632
- options.embed_mixins << mod
633
- end
634
-
635
- opts.on('--no-highlight', "Don't highlight code blocks in output.") do
636
- options.highlight = false
637
- end
638
-
639
- opts.on('--default-return TYPE', "Shown if method has no return type. ",
640
- " (defaults to 'Object')") do |type|
641
- options.default_return = type
642
- end
643
-
644
- opts.on('--hide-void-return', "Hides return types specified as 'void'. ",
645
- " (default is shown)") do
646
- options.hide_void_return = true
647
- end
648
-
649
- opts.on('--query QUERY', "Only show objects that match a specific query") do |query|
650
- next if YARD::Config.options[:safe_mode]
651
- options.verifier.add_expressions(query.taint)
652
- end
653
-
654
- opts.on('--title TITLE', 'Add a specific title to HTML documents') do |title|
655
- options.title = title
656
- end
657
-
658
- opts.on('-r', '--readme FILE', '--main FILE', 'The readme file used as the title page',
659
- ' of documentation.') do |readme|
660
- if extra_file_valid?(readme)
661
- options.readme = CodeObjects::ExtraFileObject.new(readme)
662
- end
663
- end
664
-
665
- opts.on('--files FILE1,FILE2,...', 'Any extra comma separated static files to be ',
666
- ' included (eg. FAQ)') do |files|
667
- add_extra_files(*files.split(","))
668
- end
669
-
670
- opts.on('--asset FROM[:TO]', 'A file or directory to copy over to output ',
671
- ' directory after generating') do |asset|
672
- from, to = *asset.split(':').map {|f| File.cleanpath(f, true) }
673
- to ||= from
674
- if extra_file_valid?(from, false) && extra_file_valid?(to, false)
675
- assets[from] = to
676
- end
677
- end
678
-
679
- opts.on('-o', '--output-dir PATH',
680
- 'The output directory. (defaults to ./doc)') do |dir|
681
- options.serializer.basepath = dir
682
- end
683
-
684
- opts.on('-m', '--markup MARKUP',
685
- 'Markup style used in documentation, like textile, ',
686
- ' markdown or rdoc. (defaults to rdoc)') do |markup|
687
- self.has_markup = true
688
- options.markup = markup.to_sym
689
- end
690
-
691
- opts.on('-M', '--markup-provider MARKUP_PROVIDER',
692
- 'Overrides the library used to process markup ',
693
- ' formatting (specify the gem name)') do |markup_provider|
694
- options.markup_provider = markup_provider.to_sym
695
- end
696
-
697
- opts.on('--charset ENC', 'Character set to use when parsing files ',
698
- ' (default is system locale)') do |encoding|
699
- begin
700
- if defined?(Encoding) && Encoding.respond_to?(:default_external=)
701
- Encoding.default_external = encoding
702
- Encoding.default_internal = encoding
703
- end
704
- rescue ArgumentError => e
705
- raise OptionParser::InvalidOption, e
706
- end
707
- end
708
-
709
- opts.on('-t', '--template TEMPLATE',
710
- 'The template to use. (defaults to "default")') do |template|
711
- options.template = template.to_sym
712
- end
713
-
714
- opts.on('-p', '--template-path PATH',
715
- 'The template path to look for templates in.',
716
- ' (used with -t).') do |path|
717
- next if YARD::Config.options[:safe_mode]
718
- YARD::Templates::Engine.register_template_path(File.expand_path(path))
719
- end
720
-
721
- opts.on('-f', '--format FORMAT',
722
- 'The output format for the template.',
723
- ' (defaults to html)') do |format|
724
- options.format = format.to_sym
725
- end
726
-
727
- opts.on('--no-stats', 'Don\'t print statistics') do
728
- self.statistics = false
729
- end
730
-
731
- opts.on('--no-progress', 'Don\'t show progress bar') do
732
- log.show_progress = false
733
- end
734
-
735
- opts.on('--locale LOCALE',
736
- 'The locale for generated documentation.',
737
- ' (defaults to en)') do |locale|
738
- options.locale = locale
739
- end
740
-
741
- opts.on('--po-dir DIR',
742
- 'The directory that has .po files.',
743
- " (defaults to #{YARD::Registry.po_dir})") do |dir|
744
- YARD::Registry.po_dir = dir
745
- end
746
- end
747
-
748
- # Adds tag options
749
- # @since 0.6.0
750
- def tag_options(opts)
751
- opts.separator ""
752
- opts.separator "Tag options: (TAG:TITLE looks like: 'overload:Overloaded Method')"
753
-
754
- opts.on('--tag TAG:TITLE', 'Registers a new free-form metadata @tag') do |tag|
755
- add_tag(tag)
756
- end
757
-
758
- opts.on('--type-tag TAG:TITLE', 'Tag with an optional types field') do |tag|
759
- add_tag(tag, :with_types)
760
- end
761
-
762
- opts.on('--type-name-tag TAG:TITLE', 'Tag with optional types and a name field') do |tag|
763
- add_tag(tag, :with_types_and_name)
764
- end
765
-
766
- opts.on('--name-tag TAG:TITLE', 'Tag with a name field') do |tag|
767
- add_tag(tag, :with_name)
768
- end
769
-
770
- opts.on('--title-tag TAG:TITLE', 'Tag with first line as title field') do |tag|
771
- add_tag(tag, :with_title_and_text)
772
- end
773
-
774
- opts.on('--hide-tag TAG', 'Hides a previously defined tag from templates') do |tag|
775
- self.hidden_tags |= [tag.to_sym]
776
- end
777
-
778
- opts.on('--transitive-tag TAG', 'Marks a tag as transitive') do |tag|
779
- Tags::Library.transitive_tags |= [tag.to_sym]
780
- end
781
-
782
- opts.on('--non-transitive-tag TAG', 'Marks a tag as not transitive') do |tag|
783
- Tags::Library.transitive_tags -= [tag.to_sym]
784
- end
785
- end
786
- end
787
- end
788
- end
1
+ # frozen_string_literal: true
2
+ require 'digest/sha1'
3
+ require 'fileutils'
4
+
5
+ module YARD
6
+ module CLI
7
+ # Default options used in +yard doc+ command.
8
+ class YardocOptions < Templates::TemplateOptions
9
+ # @return [Array<CodeObjects::ExtraFileObject>]
10
+ # the list of extra files rendered along with objects
11
+ default_attr :files, lambda { [] }
12
+
13
+ # @return [String] the default title appended to each generated page
14
+ default_attr :title, "Documentation by YARD #{YARD::VERSION}"
15
+
16
+ # @return [Verifier] the default verifier object to filter queries
17
+ default_attr :verifier, lambda { Verifier.new }
18
+
19
+ # @return [Serializers::Base] the default serializer for generating output
20
+ # to disk.
21
+ default_attr :serializer, lambda { Serializers::FileSystemSerializer.new }
22
+
23
+ # @return [Symbol] the default output format (:html).
24
+ default_attr :format, :html
25
+
26
+ # @return [Boolean] whether the data should be rendered in a single page,
27
+ # if the template supports it.
28
+ default_attr :onefile, false
29
+
30
+ # @return [CodeObjects::ExtraFileObject] the README file object rendered
31
+ # along with objects
32
+ attr_accessor :readme
33
+
34
+ # @return [Array<CodeObjects::Base>] the list of code objects to render
35
+ # the templates with.
36
+ attr_accessor :objects
37
+
38
+ # @return [Numeric] An index value for rendering sequentially related templates
39
+ attr_accessor :index
40
+
41
+ # @return [CodeObjects::Base] an extra item to send to a template that is not
42
+ # the main rendered object
43
+ attr_accessor :item
44
+
45
+ # @return [CodeObjects::ExtraFileObject] the file object being rendered.
46
+ # The +object+ key is not used so that a file may be rendered in the context
47
+ # of an object's namespace (for generating links).
48
+ attr_accessor :file
49
+
50
+ # @return [String] the current locale
51
+ attr_accessor :locale
52
+ end
53
+
54
+ # Yardoc is the default YARD CLI command (+yard doc+ and historic +yardoc+
55
+ # executable) used to generate and output (mainly) HTML documentation given
56
+ # a set of source files.
57
+ #
58
+ # == Usage
59
+ #
60
+ # Main usage for this command is:
61
+ #
62
+ # $ yardoc [options] [source_files [- extra_files]]
63
+ #
64
+ # See +yardoc --help+ for details on valid options.
65
+ #
66
+ # == Options File (+.yardopts+)
67
+ #
68
+ # If a +.yardopts+ file is found in the source directory being processed,
69
+ # YARD will use the contents of the file as arguments to the command,
70
+ # treating newlines as spaces. You can use shell-style quotations to
71
+ # group space delimited arguments, just like on the command line.
72
+ #
73
+ # A valid +.yardopts+ file might look like:
74
+ #
75
+ # --no-private
76
+ # --title "My Title"
77
+ # --exclude foo --exclude bar
78
+ # lib/**/*.erb
79
+ # lib/**/*.rb -
80
+ # HACKING.rdoc LEGAL COPYRIGHT
81
+ #
82
+ # Note that Yardoc also supports the legacy RDoc style +.document+ file,
83
+ # though this file can only specify source globs to parse, not options.
84
+ #
85
+ # == Queries (+--query+)
86
+ #
87
+ # Yardoc supports queries to select specific code objects for which to
88
+ # generate documentation. For example, you might want to generate
89
+ # documentation only for your public API. If you've documented your public
90
+ # methods with +@api public+, you can use the following query to select
91
+ # all of these objects:
92
+ #
93
+ # --query '@api.text == "public"'
94
+ #
95
+ # Note that the syntax for queries is mostly Ruby with a few syntactic
96
+ # simplifications for meta-data tags. See the {Verifier} class for an
97
+ # overview of this syntax.
98
+ #
99
+ # == Adding Custom Ad-Hoc Meta-data Tags (+--tag+)
100
+ #
101
+ # YARD allows specification of {file:docs/Tags.md meta-data tags}
102
+ # programmatically via the {YARD::Tags::Library} class, but often this is not
103
+ # practical for users writing documentation. To make adding custom tags
104
+ # easier, Yardoc has a few command-line switches for creating basic tags
105
+ # and displaying them in generated HTML output.
106
+ #
107
+ # To specify a custom tag to be displayed in output, use any of the
108
+ # following:
109
+ #
110
+ # * +--tag+ TAG:TITLE
111
+ # * +--name-tag+ TAG:TITLE
112
+ # * +--type-tag+ TAG:TITLE
113
+ # * +--type-name-tag+ TAG:TITLE
114
+ # * +--title-tag+ TAG:TITLE
115
+ #
116
+ # "TAG:TITLE" is of the form: name:"Display Title", for example:
117
+ #
118
+ # --tag overload:"Overloaded Method"
119
+ #
120
+ # See +yard help doc+ for a description of the various options.
121
+ #
122
+ # Tags added in this way are automatically displayed in output. To add
123
+ # a meta-data tag that does not show up in output, use +--hide-tag TAG+.
124
+ # Note that you can also use this option on existing tags to hide
125
+ # builtin tags, for instance.
126
+ #
127
+ # == Processed Data Storage (+.yardoc+ directory)
128
+ #
129
+ # When Yardoc parses a source directory, it creates a +.yardoc+ directory
130
+ # (by default, override with +-b+) at the root of the project. This directory
131
+ # contains marshal dumps for all raw object data in the source, so that
132
+ # you can access it later for various commands (+stats+, +graph+, etc.).
133
+ # This directory is also used as a cache for any future calls to +yardoc+
134
+ # so as to process only the files which have changed since the last call.
135
+ #
136
+ # When Yardoc uses the cache in subsequent calls to +yardoc+, methods
137
+ # or classes that have been deleted from source since the last parsing
138
+ # will not be erased from the cache (YARD never deletes objects). In such
139
+ # a case, you should wipe the cache and do a clean parsing of the source tree.
140
+ # You can do this by deleting the +.yardoc+ directory manually, or running
141
+ # Yardoc without +--use-cache+ (+-c+).
142
+ #
143
+ # @since 0.2.1
144
+ # @see Verifier
145
+ class Yardoc < YardoptsCommand
146
+ # @return [Hash] the hash of options passed to the template.
147
+ # @see Templates::Engine#render
148
+ attr_reader :options
149
+
150
+ # @return [Array<String>] list of Ruby source files to process
151
+ attr_accessor :files
152
+
153
+ # @return [Array<String>] list of excluded paths (regexp matches)
154
+ # @since 0.5.3
155
+ attr_accessor :excluded
156
+
157
+ # @return [Boolean] whether to use the existing yardoc db if the
158
+ # .yardoc already exists. Also makes use of file checksums to
159
+ # parse only changed files.
160
+ attr_accessor :use_cache
161
+
162
+ # @return [Boolean] whether objects should be serialized to .yardoc db
163
+ attr_accessor :save_yardoc
164
+
165
+ # @return [Boolean] whether to generate output
166
+ attr_accessor :generate
167
+
168
+ # @return [Boolean] whether to print a list of objects
169
+ # @since 0.5.5
170
+ attr_accessor :list
171
+
172
+ # Keep track of which visibilities are to be shown
173
+ # @return [Array<Symbol>] a list of visibilities
174
+ # @since 0.5.6
175
+ attr_accessor :visibilities
176
+
177
+ # Keep track of which APIs are to be shown
178
+ # @return [Array<String>] a list of APIs
179
+ # @since 0.8.1
180
+ attr_accessor :apis
181
+
182
+ # Keep track of which APIs are to be hidden
183
+ # @return [Array<String>] a list of APIs to be hidden
184
+ # @since 0.8.7
185
+ attr_accessor :hidden_apis
186
+
187
+ # @return [Array<Symbol>] a list of tags to hide from templates
188
+ # @since 0.6.0
189
+ attr_accessor :hidden_tags
190
+
191
+ # @return [Boolean] whether to print statistics after parsing
192
+ # @since 0.6.0
193
+ attr_accessor :statistics
194
+
195
+ # @return [Array<String>] a list of assets to copy after generation
196
+ # @since 0.6.0
197
+ attr_accessor :assets
198
+
199
+ # @return [Boolean] whether markup option was specified
200
+ # @since 0.7.0
201
+ attr_accessor :has_markup
202
+
203
+ # @return [Boolean] whether yard exits with error status code if a warning occurs
204
+ attr_accessor :fail_on_warning
205
+
206
+ # Creates a new instance of the commandline utility
207
+ def initialize
208
+ super
209
+ @options = YardocOptions.new
210
+ @options.reset_defaults
211
+ @visibilities = [:public]
212
+ @apis = []
213
+ @hidden_apis = []
214
+ @assets = {}
215
+ @excluded = []
216
+ @files = []
217
+ @hidden_tags = []
218
+ @use_cache = false
219
+ @generate = true
220
+ @statistics = true
221
+ @list = false
222
+ @save_yardoc = true
223
+ @has_markup = false
224
+ @fail_on_warning = false
225
+
226
+ if defined?(::Encoding) && ::Encoding.respond_to?(:default_external=)
227
+ utf8 = ::Encoding.find('utf-8')
228
+
229
+ ::Encoding.default_external = utf8 unless ::Encoding.default_external == utf8
230
+ ::Encoding.default_internal = utf8 unless ::Encoding.default_internal == utf8
231
+ end
232
+ end
233
+
234
+ def description
235
+ "Generates documentation"
236
+ end
237
+
238
+ # Runs the commandline utility, parsing arguments and generating
239
+ # output if set.
240
+ #
241
+ # @param [Array<String>] args the list of arguments. If the list only
242
+ # contains a single nil value, skip calling of {#parse_arguments}
243
+ # @return [void]
244
+ def run(*args)
245
+ log.show_progress = true
246
+ if args.empty? || !args.first.nil?
247
+ # fail early if arguments are not valid
248
+ return unless parse_arguments(*args)
249
+ end
250
+
251
+ checksums = nil
252
+ if use_cache
253
+ Registry.load
254
+ checksums = Registry.checksums.dup
255
+ end
256
+
257
+ if save_yardoc
258
+ Registry.lock_for_writing do
259
+ YARD.parse(files, excluded)
260
+ Registry.save(use_cache)
261
+ end
262
+ else
263
+ YARD.parse(files, excluded)
264
+ end
265
+
266
+ if generate
267
+ run_generate(checksums)
268
+ copy_assets
269
+ elsif list
270
+ print_list
271
+ end
272
+
273
+ if !list && statistics && log.level < Logger::ERROR
274
+ Registry.load_all
275
+ log.enter_level(Logger::ERROR) do
276
+ Stats.new(false).run(*args)
277
+ end
278
+ end
279
+
280
+ abort if fail_on_warning && log.warned
281
+
282
+ true
283
+ ensure
284
+ log.show_progress = false
285
+ end
286
+
287
+ # Parses commandline arguments
288
+ # @param [Array<String>] args the list of arguments
289
+ # @return [Boolean] whether or not arguments are valid
290
+ # @since 0.5.6
291
+ def parse_arguments(*args)
292
+ super(*args)
293
+
294
+ # Last minute modifications
295
+ self.files = Parser::SourceParser::DEFAULT_PATH_GLOB if files.empty?
296
+ files.delete_if {|x| x =~ /\A\s*\Z/ } # remove empty ones
297
+ readme = Dir.glob('README{,*[^~]}').first
298
+ readme ||= Dir.glob(files.first).first if options.onefile
299
+ options.readme ||= CodeObjects::ExtraFileObject.new(readme) if readme
300
+ options.files.unshift(options.readme).uniq! if options.readme
301
+
302
+ Tags::Library.visible_tags -= hidden_tags
303
+ add_visibility_verifier
304
+ add_api_verifier
305
+
306
+ apply_locale
307
+
308
+ # US-ASCII is invalid encoding for onefile
309
+ if defined?(::Encoding) && options.onefile
310
+ if ::Encoding.default_internal == ::Encoding::US_ASCII
311
+ log.warn "--one-file is not compatible with US-ASCII encoding, using ASCII-8BIT"
312
+ ::Encoding.default_external, ::Encoding.default_internal = ['ascii-8bit'] * 2
313
+ end
314
+ end
315
+
316
+ if generate && !verify_markup_options
317
+ false
318
+ else
319
+ true
320
+ end
321
+ end
322
+
323
+ # The list of all objects to process. Override this method to change
324
+ # which objects YARD should generate documentation for.
325
+ #
326
+ # @deprecated To hide methods use the +@private+ tag instead.
327
+ # @return [Array<CodeObjects::Base>] a list of code objects to process
328
+ def all_objects
329
+ Registry.all(:root, :module, :class)
330
+ end
331
+
332
+ private
333
+
334
+ # Generates output for objects
335
+ # @param [Hash, nil] checksums if supplied, a list of checkums for files.
336
+ # @return [void]
337
+ # @since 0.5.1
338
+ def run_generate(checksums)
339
+ if checksums
340
+ changed_files = []
341
+ Registry.checksums.each do |file, hash|
342
+ changed_files << file if checksums[file] != hash
343
+ end
344
+ end
345
+ Registry.load_all if use_cache
346
+ objects = run_verifier(all_objects).reject do |object|
347
+ serialized = !options.serializer || options.serializer.exists?(object)
348
+ if checksums && serialized && !object.files.any? {|f, _line| changed_files.include?(f) }
349
+ true
350
+ else
351
+ log.debug "Re-generating object #{object.path}..."
352
+ false
353
+ end
354
+ end
355
+ Templates::Engine.generate(objects, options)
356
+ end
357
+
358
+ # Verifies that the markup options are valid before parsing any code.
359
+ # Failing early is better than failing late.
360
+ #
361
+ # @return (see YARD::Templates::Helpers::MarkupHelper#load_markup_provider)
362
+ def verify_markup_options
363
+ result = false
364
+ lvl = has_markup ? log.level : Logger::FATAL
365
+ obj = Struct.new(:options).new(options)
366
+ obj.extend(Templates::Helpers::MarkupHelper)
367
+ options.files.each do |file|
368
+ markup = file.attributes[:markup] || obj.markup_for_file('', file.filename)
369
+ result = obj.load_markup_provider(markup)
370
+ return false if !result && markup != :rdoc
371
+ end
372
+ options.markup = :rdoc unless has_markup
373
+ log.enter_level(lvl) { result = obj.load_markup_provider }
374
+ if !result && !has_markup
375
+ log.warn "Could not load default RDoc formatter, " \
376
+ "ignoring any markup (install RDoc to get default formatting)."
377
+ options.markup = :none
378
+ true
379
+ else
380
+ result
381
+ end
382
+ end
383
+
384
+ # Copies any assets to the output directory
385
+ # @return [void]
386
+ # @since 0.6.0
387
+ def copy_assets
388
+ return unless options.serializer
389
+ outpath = options.serializer.basepath
390
+ assets.each do |from, to|
391
+ to = File.join(outpath, to)
392
+ log.debug "Copying asset '#{from}' to '#{to}'"
393
+ from += '/.' if File.directory?(from)
394
+ FileUtils.cp_r(from, to)
395
+ end
396
+ end
397
+
398
+ # Prints a list of all objects
399
+ # @return [void]
400
+ # @since 0.5.5
401
+ def print_list
402
+ Registry.load_all
403
+ run_verifier(Registry.all).
404
+ sort_by {|item| [item.file || '', item.line || 0] }.each do |item|
405
+ log.puts "#{item.file}:#{item.line}: #{item.path}"
406
+ end
407
+ end
408
+
409
+ # Adds a set of extra documentation files to be processed
410
+ # @param [Array<String>] files the set of documentation files
411
+ def add_extra_files(*files)
412
+ files.map! {|f| f.include?("*") ? Dir.glob(f) : f }.flatten!
413
+ files.each do |file|
414
+ if extra_file_valid?(file)
415
+ options.files << CodeObjects::ExtraFileObject.new(file)
416
+ end
417
+ end
418
+ end
419
+
420
+ # @param file [String] the filename to validate
421
+ # @param check_exists [Boolean] whether the file should exist on disk
422
+ # @return [Boolean] whether the file is allowed to be used
423
+ def extra_file_valid?(file, check_exists = true)
424
+ if file =~ %r{^(?:\.\./|/)}
425
+ log.warn "Invalid file: #{file}"
426
+ false
427
+ elsif check_exists && !File.file?(file)
428
+ log.warn "Could not find file: #{file}"
429
+ false
430
+ else
431
+ true
432
+ end
433
+ end
434
+
435
+ # Parses the file arguments into Ruby files and extra files, which are
436
+ # separated by a '-' element.
437
+ #
438
+ # @example Parses a set of Ruby source files
439
+ # parse_files %w(file1 file2 file3)
440
+ # @example Parses a set of Ruby files with a separator and extra files
441
+ # parse_files %w(file1 file2 - extrafile1 extrafile2)
442
+ # @param [Array<String>] files the list of files to parse
443
+ # @return [void]
444
+ def parse_files(*files)
445
+ seen_extra_files_marker = false
446
+
447
+ files.each do |file|
448
+ if file == "-"
449
+ seen_extra_files_marker = true
450
+ next
451
+ end
452
+
453
+ if seen_extra_files_marker
454
+ add_extra_files(file)
455
+ else
456
+ self.files << file
457
+ end
458
+ end
459
+ end
460
+
461
+ # Adds verifier rule for visibilities
462
+ # @return [void]
463
+ # @since 0.5.6
464
+ def add_visibility_verifier
465
+ vis_expr = "#{visibilities.uniq.inspect}.include?(object.visibility)"
466
+ options.verifier.add_expressions(vis_expr)
467
+ end
468
+
469
+ # Adds verifier rule for APIs
470
+ # @return [void]
471
+ # @since 0.8.1
472
+ def add_api_verifier
473
+ no_api = true if apis.delete('')
474
+ exprs = []
475
+
476
+ exprs << "#{apis.uniq.inspect}.include?(@api.text)" unless apis.empty?
477
+
478
+ unless hidden_apis.empty?
479
+ exprs << "!#{hidden_apis.uniq.inspect}.include?(@api.text)"
480
+ end
481
+
482
+ exprs = !exprs.empty? ? [exprs.join(' && ')] : []
483
+ exprs << "!@api" if no_api
484
+
485
+ expr = exprs.join(' || ')
486
+ options.verifier.add_expressions(expr) unless expr.empty?
487
+ end
488
+
489
+ # Applies the specified locale to collected objects
490
+ # @return [void]
491
+ # @since 0.8.3
492
+ def apply_locale
493
+ YARD::I18n::Locale.default = options.locale
494
+ options.files.each do |file|
495
+ file.locale = options.locale
496
+ end
497
+ end
498
+
499
+ # (see Templates::Helpers::BaseHelper#run_verifier)
500
+ def run_verifier(list)
501
+ options.verifier ? options.verifier.run(list) : list
502
+ end
503
+
504
+ # @since 0.6.0
505
+ def add_tag(tag_data, factory_method = nil)
506
+ tag, title = *tag_data.split(':')
507
+ title ||= tag.capitalize
508
+ Tags::Library.define_tag(title, tag.to_sym, factory_method)
509
+ Tags::Library.visible_tags |= [tag.to_sym]
510
+ end
511
+
512
+ # Parses commandline options.
513
+ # @param [Array<String>] args each tokenized argument
514
+ def optparse(*args)
515
+ opts = OptionParser.new
516
+ opts.banner = "Usage: yard doc [options] [source_files [- extra_files]]"
517
+
518
+ opts.separator "(if a list of source files is omitted, "
519
+ opts.separator " {lib,app}/**/*.rb ext/**/*.{c,rb} is used.)"
520
+ opts.separator ""
521
+ opts.separator "Example: yardoc -o documentation/ - FAQ LICENSE"
522
+ opts.separator " The above example outputs documentation for files in"
523
+ opts.separator " lib/**/*.rb to documentation/ including the extra files"
524
+ opts.separator " FAQ and LICENSE."
525
+ opts.separator ""
526
+ opts.separator "A base set of options can be specified by adding a .yardopts"
527
+ opts.separator "file to your base path containing all extra options separated"
528
+ opts.separator "by whitespace."
529
+
530
+ general_options(opts)
531
+ output_options(opts)
532
+ tag_options(opts)
533
+ common_options(opts)
534
+ parse_options(opts, args)
535
+ parse_files(*args) unless args.empty?
536
+ end
537
+
538
+ # Adds general options
539
+ def general_options(opts)
540
+ opts.separator ""
541
+ opts.separator "General Options:"
542
+
543
+ opts.on('-b', '--db FILE', 'Use a specified .yardoc db to load from or save to',
544
+ ' (defaults to .yardoc)') do |yfile|
545
+ YARD::Registry.yardoc_file = yfile
546
+ end
547
+
548
+ opts.on('--[no-]single-db', 'Whether code objects should be stored to single',
549
+ ' database file (advanced)') do |use_single_db|
550
+ Registry.single_object_db = use_single_db
551
+ end
552
+
553
+ opts.on('-n', '--no-output', 'Only generate .yardoc database, no documentation.') do
554
+ self.generate = false
555
+ end
556
+
557
+ opts.on('-c', '--use-cache [FILE]',
558
+ "Use the cached .yardoc db to generate documentation.",
559
+ " (defaults to no cache)") do |file|
560
+ YARD::Registry.yardoc_file = file if file
561
+ self.use_cache = true
562
+ end
563
+
564
+ opts.on('--no-cache', "Clear .yardoc db before parsing source.") do
565
+ self.use_cache = false
566
+ end
567
+
568
+ yardopts_options(opts)
569
+
570
+ opts.on('--no-save', 'Do not save the parsed data to the yardoc db') do
571
+ self.save_yardoc = false
572
+ end
573
+
574
+ opts.on('--exclude REGEXP', 'Ignores a file if it matches path match (regexp)') do |path|
575
+ excluded << path
576
+ end
577
+
578
+ opts.on('--fail-on-warning', 'Exit with error status code if a warning occurs') do
579
+ self.fail_on_warning = true
580
+ end
581
+ end
582
+
583
+ # Adds output options
584
+ def output_options(opts)
585
+ opts.separator ""
586
+ opts.separator "Output options:"
587
+
588
+ opts.on('--one-file', 'Generates output as a single file') do
589
+ options.onefile = true
590
+ end
591
+
592
+ opts.on('--list', 'List objects to standard out (implies -n)') do |_format|
593
+ self.generate = false
594
+ self.list = true
595
+ end
596
+
597
+ opts.on('--no-public', "Don't show public methods. (default shows public)") do
598
+ visibilities.delete(:public)
599
+ end
600
+
601
+ opts.on('--protected', "Show protected methods. (default hides protected)") do
602
+ visibilities.push(:protected)
603
+ end
604
+
605
+ opts.on('--private', "Show private methods. (default hides private)") do
606
+ visibilities.push(:private)
607
+ end
608
+
609
+ opts.on('--no-private', "Hide objects with @private tag") do
610
+ options.verifier.add_expressions '!object.tag(:private) &&
611
+ (object.namespace.is_a?(CodeObjects::Proxy) || !object.namespace.tag(:private))'
612
+ end
613
+
614
+ opts.on('--[no-]api API', 'Generates documentation for a given API',
615
+ '(objects which define the correct @api tag).',
616
+ 'If --no-api is given, displays objects with',
617
+ 'no @api tag.') do |api|
618
+ api = '' if api == false
619
+ apis.push(api)
620
+ end
621
+
622
+ opts.on('--hide-api API', 'Hides given @api tag from documentation') do |api|
623
+ hidden_apis.push(api)
624
+ end
625
+
626
+ opts.on('--embed-mixins', "Embeds mixin methods into class documentation") do
627
+ options.embed_mixins << '*'
628
+ end
629
+
630
+ opts.on('--embed-mixin [MODULE]', "Embeds mixin methods from a particular",
631
+ " module into class documentation") do |mod|
632
+ options.embed_mixins << mod
633
+ end
634
+
635
+ opts.on('--no-highlight', "Don't highlight code blocks in output.") do
636
+ options.highlight = false
637
+ end
638
+
639
+ opts.on('--default-return TYPE', "Shown if method has no return type. ",
640
+ " (defaults to 'Object')") do |type|
641
+ options.default_return = type
642
+ end
643
+
644
+ opts.on('--hide-void-return', "Hides return types specified as 'void'. ",
645
+ " (default is shown)") do
646
+ options.hide_void_return = true
647
+ end
648
+
649
+ opts.on('--query QUERY', "Only show objects that match a specific query") do |query|
650
+ next if YARD::Config.options[:safe_mode]
651
+ options.verifier.add_expressions(query.taint)
652
+ end
653
+
654
+ opts.on('--title TITLE', 'Add a specific title to HTML documents') do |title|
655
+ options.title = title
656
+ end
657
+
658
+ opts.on('-r', '--readme FILE', '--main FILE', 'The readme file used as the title page',
659
+ ' of documentation.') do |readme|
660
+ if extra_file_valid?(readme)
661
+ options.readme = CodeObjects::ExtraFileObject.new(readme)
662
+ end
663
+ end
664
+
665
+ opts.on('--files FILE1,FILE2,...', 'Any extra comma separated static files to be ',
666
+ ' included (eg. FAQ)') do |files|
667
+ add_extra_files(*files.split(","))
668
+ end
669
+
670
+ opts.on('--asset FROM[:TO]', 'A file or directory to copy over to output ',
671
+ ' directory after generating') do |asset|
672
+ from, to = *asset.split(':').map {|f| File.cleanpath(f, true) }
673
+ to ||= from
674
+ if extra_file_valid?(from, false) && extra_file_valid?(to, false)
675
+ assets[from] = to
676
+ end
677
+ end
678
+
679
+ opts.on('-o', '--output-dir PATH',
680
+ 'The output directory. (defaults to ./doc)') do |dir|
681
+ options.serializer.basepath = dir
682
+ end
683
+
684
+ opts.on('-m', '--markup MARKUP',
685
+ 'Markup style used in documentation, like textile, ',
686
+ ' markdown or rdoc. (defaults to rdoc)') do |markup|
687
+ self.has_markup = true
688
+ options.markup = markup.to_sym
689
+ end
690
+
691
+ opts.on('-M', '--markup-provider MARKUP_PROVIDER',
692
+ 'Overrides the library used to process markup ',
693
+ ' formatting (specify the gem name)') do |markup_provider|
694
+ options.markup_provider = markup_provider.to_sym
695
+ end
696
+
697
+ opts.on('--charset ENC', 'Character set to use when parsing files ',
698
+ ' (default is system locale)') do |encoding|
699
+ begin
700
+ if defined?(Encoding) && Encoding.respond_to?(:default_external=)
701
+ Encoding.default_external = encoding
702
+ Encoding.default_internal = encoding
703
+ end
704
+ rescue ArgumentError => e
705
+ raise OptionParser::InvalidOption, e
706
+ end
707
+ end
708
+
709
+ opts.on('-t', '--template TEMPLATE',
710
+ 'The template to use. (defaults to "default")') do |template|
711
+ options.template = template.to_sym
712
+ end
713
+
714
+ opts.on('-p', '--template-path PATH',
715
+ 'The template path to look for templates in.',
716
+ ' (used with -t).') do |path|
717
+ next if YARD::Config.options[:safe_mode]
718
+ YARD::Templates::Engine.register_template_path(File.expand_path(path))
719
+ end
720
+
721
+ opts.on('-f', '--format FORMAT',
722
+ 'The output format for the template.',
723
+ ' (defaults to html)') do |format|
724
+ options.format = format.to_sym
725
+ end
726
+
727
+ opts.on('--no-stats', 'Don\'t print statistics') do
728
+ self.statistics = false
729
+ end
730
+
731
+ opts.on('--no-progress', 'Don\'t show progress bar') do
732
+ log.show_progress = false
733
+ end
734
+
735
+ opts.on('--locale LOCALE',
736
+ 'The locale for generated documentation.',
737
+ ' (defaults to en)') do |locale|
738
+ options.locale = locale
739
+ end
740
+
741
+ opts.on('--po-dir DIR',
742
+ 'The directory that has .po files.',
743
+ " (defaults to #{YARD::Registry.po_dir})") do |dir|
744
+ YARD::Registry.po_dir = dir
745
+ end
746
+ end
747
+
748
+ # Adds tag options
749
+ # @since 0.6.0
750
+ def tag_options(opts)
751
+ opts.separator ""
752
+ opts.separator "Tag options: (TAG:TITLE looks like: 'overload:Overloaded Method')"
753
+
754
+ opts.on('--tag TAG:TITLE', 'Registers a new free-form metadata @tag') do |tag|
755
+ add_tag(tag)
756
+ end
757
+
758
+ opts.on('--type-tag TAG:TITLE', 'Tag with an optional types field') do |tag|
759
+ add_tag(tag, :with_types)
760
+ end
761
+
762
+ opts.on('--type-name-tag TAG:TITLE', 'Tag with optional types and a name field') do |tag|
763
+ add_tag(tag, :with_types_and_name)
764
+ end
765
+
766
+ opts.on('--name-tag TAG:TITLE', 'Tag with a name field') do |tag|
767
+ add_tag(tag, :with_name)
768
+ end
769
+
770
+ opts.on('--title-tag TAG:TITLE', 'Tag with first line as title field') do |tag|
771
+ add_tag(tag, :with_title_and_text)
772
+ end
773
+
774
+ opts.on('--hide-tag TAG', 'Hides a previously defined tag from templates') do |tag|
775
+ self.hidden_tags |= [tag.to_sym]
776
+ end
777
+
778
+ opts.on('--transitive-tag TAG', 'Marks a tag as transitive') do |tag|
779
+ Tags::Library.transitive_tags |= [tag.to_sym]
780
+ end
781
+
782
+ opts.on('--non-transitive-tag TAG', 'Marks a tag as not transitive') do |tag|
783
+ Tags::Library.transitive_tags -= [tag.to_sym]
784
+ end
785
+ end
786
+ end
787
+ end
788
+ end