yard 0.9.17 → 0.9.22

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