yard 0.9.18 → 0.9.23

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 +781 -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 -1875
@@ -1,345 +1,345 @@
1
- # frozen_string_literal: true
2
- require 'ostruct'
3
-
4
- module YARD
5
- # Parses text and creates a {Docstring} object to represent documentation
6
- # for a {CodeObjects::Base}. To create a new docstring, you should initialize
7
- # the parser and call {#parse} followed by {#to_docstring}.
8
- #
9
- # == Subclassing Notes
10
- #
11
- # The DocstringParser can be subclassed and subtituted during parsing by
12
- # setting the {Docstring.default_parser} attribute with the name of the
13
- # subclass. This allows developers to change the way docstrings are
14
- # parsed, allowing for completely different docstring syntaxes.
15
- #
16
- # @example Creating a Docstring with a DocstringParser
17
- # DocstringParser.new.parse("text here").to_docstring
18
- # @example Creating a Custom DocstringParser
19
- # # Parses docstrings backwards!
20
- # class ReverseDocstringParser
21
- # def parse_content(content)
22
- # super(content.reverse)
23
- # end
24
- # end
25
- #
26
- # # Set the parser as default when parsing
27
- # YARD::Docstring.default_parser = ReverseDocstringParser
28
- # @see #parse_content
29
- # @since 0.8.0
30
- class DocstringParser
31
- # @return [String] the parsed text portion of the docstring,
32
- # with tags removed.
33
- attr_accessor :text
34
-
35
- # @return [String] the complete input string to the parser.
36
- attr_accessor :raw_text
37
-
38
- # @return [Array<Tags::Tag>] the list of meta-data tags identified
39
- # by the parser
40
- attr_accessor :tags
41
-
42
- # @return [Array<Tags::Directive>] a list of directives identified
43
- # by the parser. This list will not be passed on to the
44
- # Docstring object.
45
- attr_accessor :directives
46
-
47
- # @return [OpenStruct] any arbitrary state to be passed between
48
- # tags during parsing. Mainly used by directives to coordinate
49
- # behaviour (so that directives can be aware of other directives
50
- # used in a docstring).
51
- attr_accessor :state
52
-
53
- # @return [CodeObjects::Base, nil] the object associated with
54
- # the docstring being parsed. May be nil if the docstring is
55
- # not attached to any object.
56
- attr_accessor :object
57
-
58
- # @return [CodeObjects::Base, nil] the object referenced by
59
- # the docstring being parsed. May be nil if the docstring doesn't
60
- # refer to any object.
61
- attr_accessor :reference
62
-
63
- # @return [Handlers::Base, nil] the handler parsing this
64
- # docstring. May be nil if this docstring parser is not
65
- # initialized through
66
- attr_accessor :handler
67
-
68
- # @return [Tags::Library] the tag library being used to
69
- # identify registered tags in the docstring.
70
- attr_accessor :library
71
-
72
- # The regular expression to match the tag syntax
73
- META_MATCH = /^@(!)?((?:\w\.?)+)(?:\s+(.*))?$/i
74
-
75
- # @!group Creation and Conversion Methods
76
-
77
- # Creates a new parser to parse docstring data
78
- #
79
- # @param [Tags::Library] library a tag library for recognizing
80
- # tags.
81
- def initialize(library = Tags::Library.instance)
82
- @text = ""
83
- @raw_text = ""
84
- @tags = []
85
- @directives = []
86
- @library = library
87
- @object = nil
88
- @reference = nil
89
- @handler = nil
90
- @state = OpenStruct.new
91
- end
92
-
93
- # @return [Docstring] translates parsed text into
94
- # a Docstring object.
95
- def to_docstring
96
- Docstring.new!(text, tags, object, raw_text, reference)
97
- end
98
-
99
- # @!group Parsing Methods
100
-
101
- # Parses all content and returns itself.
102
- #
103
- # @param [String] content the docstring text to parse
104
- # @param [CodeObjects::Base] object the object that the docstring
105
- # is attached to. Will be passed to directives to act on
106
- # this object.
107
- # @param [Handlers::Base, nil] handler the handler object that is
108
- # parsing this object. May be nil if this parser is not being
109
- # called from a {Parser::SourceParser} context.
110
- # @return [self] the parser object. To get the docstring,
111
- # call {#to_docstring}.
112
- # @see #to_docstring
113
- def parse(content, object = nil, handler = nil)
114
- @object = object
115
- @handler = handler
116
- @reference, @raw_text = detect_reference(content)
117
- text = parse_content(@raw_text)
118
- @text = text.strip
119
- call_directives_after_parse
120
- post_process
121
- self
122
- end
123
-
124
- # Parses a given block of text.
125
- #
126
- # @param [String] content the content to parse
127
- # @note Subclasses can override this method to perform custom
128
- # parsing of content data.
129
- def parse_content(content)
130
- content = content.split(/\r?\n/) if content.is_a?(String)
131
- return '' if !content || content.empty?
132
- docstring = String.new("")
133
-
134
- indent = content.first[/^\s*/].length
135
- last_indent = 0
136
- orig_indent = 0
137
- directive = false
138
- last_line = ""
139
- tag_name = nil
140
- tag_buf = []
141
-
142
- (content + ['']).each_with_index do |line, index|
143
- indent = line[/^\s*/].length
144
- empty = (line =~ /^\s*$/ ? true : false)
145
- done = content.size == index
146
-
147
- if tag_name && (((indent < orig_indent && !empty) || done ||
148
- (indent == 0 && !empty)) || (indent <= last_indent && line =~ META_MATCH))
149
- buf = tag_buf.join("\n")
150
- if directive || tag_is_directive?(tag_name)
151
- directive = create_directive(tag_name, buf)
152
- if directive
153
- docstring << parse_content(directive.expanded_text).chomp
154
- end
155
- else
156
- create_tag(tag_name, buf)
157
- end
158
- tag_name = nil
159
- tag_buf = []
160
- directive = false
161
- orig_indent = 0
162
- end
163
-
164
- # Found a meta tag
165
- if line =~ META_MATCH
166
- directive = $1
167
- tag_name = $2
168
- tag_buf = [($3 || '')]
169
- elsif tag_name && indent >= orig_indent && !empty
170
- orig_indent = indent if orig_indent == 0
171
- # Extra data added to the tag on the next line
172
- last_empty = last_line =~ /^[ \t]*$/ ? true : false
173
-
174
- tag_buf << '' if last_empty
175
- tag_buf << line.gsub(/^[ \t]{#{orig_indent}}/, '')
176
- elsif !tag_name
177
- # Regular docstring text
178
- docstring << line
179
- docstring << "\n"
180
- end
181
-
182
- last_indent = indent
183
- last_line = line
184
- end
185
-
186
- docstring
187
- end
188
-
189
- # @!group Parser Callback Methods
190
-
191
- # Call post processing callbacks on parser.
192
- # This is called implicitly by parser. Use this when
193
- # manually configuring a {Docstring} object.
194
- #
195
- # @return [void]
196
- def post_process
197
- call_after_parse_callbacks
198
- end
199
-
200
- # @!group Tag Manipulation Methods
201
-
202
- # Creates a tag from the {Tags::DefaultFactory tag factory}.
203
- #
204
- # To add an already created tag object, append it to {#tags}.
205
- #
206
- # @param [String] tag_name the tag name
207
- # @param [String] tag_buf the text attached to the tag with newlines removed.
208
- # @return [Tags::Tag, Tags::RefTag] a tag
209
- def create_tag(tag_name, tag_buf = '')
210
- if tag_buf =~ /\A\s*(?:(\S+)\s+)?\(\s*see\s+(\S+)\s*\)\s*\Z/
211
- return create_ref_tag(tag_name, $1, $2)
212
- end
213
-
214
- if library.has_tag?(tag_name)
215
- @tags += [library.tag_create(tag_name, tag_buf)].flatten
216
- else
217
- log.warn "Unknown tag @#{tag_name}" +
218
- (object ? " in file `#{object.file}` near line #{object.line}" : "")
219
- end
220
- rescue Tags::TagFormatError
221
- log.warn "Invalid tag format for @#{tag_name}" +
222
- (object ? " in file `#{object.file}` near line #{object.line}" : "")
223
- end
224
-
225
- # Creates a {Tags::RefTag}
226
- def create_ref_tag(tag_name, name, object_name)
227
- @tags << Tags::RefTagList.new(tag_name, P(object, object_name), name)
228
- end
229
-
230
- # Creates a new directive using the registered {#library}
231
- # @return [Tags::Directive] the directive object that is created
232
- def create_directive(tag_name, tag_buf)
233
- if library.has_directive?(tag_name)
234
- dir = library.directive_create(tag_name, tag_buf, self)
235
- if dir.is_a?(Tags::Directive)
236
- @directives << dir
237
- dir
238
- end
239
- else
240
- log.warn "Unknown directive @!#{tag_name}" +
241
- (object ? " in file `#{object.file}` near line #{object.line}" : "")
242
- nil
243
- end
244
- rescue Tags::TagFormatError
245
- log.warn "Invalid directive format for @!#{tag_name}" +
246
- (object ? " in file `#{object.file}` near line #{object.line}" : "")
247
- nil
248
- end
249
-
250
- # Backward compatibility to detect old tags that should be specified
251
- # as directives in 0.8 and onward.
252
- def tag_is_directive?(tag_name)
253
- list = %w(attribute endgroup group macro method scope visibility)
254
- list.include?(tag_name)
255
- end
256
-
257
- # Creates a callback that is called after a docstring is successfully
258
- # parsed. Use this method to perform sanity checks on a docstring's
259
- # tag data, or add any extra tags automatically to a docstring.
260
- #
261
- # @yield [parser] a block to be called after a docstring is parsed
262
- # @yieldparam [DocstringParser] parser the docstring parser object
263
- # with all directives and tags created.
264
- # @yieldreturn [void]
265
- # @return [void]
266
- def self.after_parse(&block)
267
- after_parse_callbacks << block
268
- end
269
-
270
- # @return [Array<Proc>] the {after_parse} callback proc objects
271
- def self.after_parse_callbacks
272
- @after_parse_callbacks ||= []
273
- end
274
-
275
- # Define a callback to check that @param tags are properly named
276
- after_parse do |parser|
277
- next unless parser.object
278
- next unless parser.object.is_a?(CodeObjects::MethodObject)
279
- next if parser.object.is_alias?
280
- names = parser.object.parameters.map {|l| l.first.gsub(/\W/, '') }
281
- seen_names = []
282
- infile_info = "\n in file `#{parser.object.file}' " \
283
- "near line #{parser.object.line}"
284
- parser.tags.each do |tag|
285
- next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
286
- next unless tag.tag_name == "param"
287
- if seen_names.include?(tag.name)
288
- log.warn "@param tag has duplicate parameter name: " \
289
- "#{tag.name} #{infile_info}"
290
- elsif names.include?(tag.name)
291
- seen_names << tag.name
292
- else
293
- log.warn "@param tag has unknown parameter name: " \
294
- "#{tag.name} #{infile_info}"
295
- end
296
- end
297
- end
298
-
299
- private
300
-
301
- def namespace
302
- object && object.namespace
303
- end
304
-
305
- def detect_reference(content)
306
- if content =~ /\A\s*\(see (\S+)\s*\)(?:\s|$)/
307
- path = $1
308
- extra = $'
309
- [CodeObjects::Proxy.new(namespace, path), extra]
310
- else
311
- [nil, content]
312
- end
313
- end
314
-
315
- # @!group Parser Callback Methods
316
-
317
- # Calls the {Tags::Directive#after_parse} callback on all the
318
- # created directives.
319
- def call_directives_after_parse
320
- directives.each(&:after_parse)
321
- end
322
-
323
- # Calls all {after_parse} callbacks
324
- def call_after_parse_callbacks
325
- self.class.after_parse_callbacks.each do |cb|
326
- cb.call(self)
327
- end
328
- end
329
-
330
- # Define a callback to check that @see tags do not use {}.
331
- after_parse do |parser|
332
- next unless parser.object
333
-
334
- parser.tags.each_with_index do |tag, i|
335
- next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
336
- next unless tag.tag_name == "see"
337
- next unless "#{tag.name}#{tag.text}" =~ /\A\{.*\}\Z/
338
- infile_info = "\n in file `#{parser.object.file}' " \
339
- "near line #{parser.object.line}"
340
- log.warn "@see tag (##{i + 1}) should not be wrapped in {} " \
341
- "(causes rendering issues): #{infile_info}"
342
- end
343
- end
344
- end
345
- end
1
+ # frozen_string_literal: true
2
+ require 'ostruct'
3
+
4
+ module YARD
5
+ # Parses text and creates a {Docstring} object to represent documentation
6
+ # for a {CodeObjects::Base}. To create a new docstring, you should initialize
7
+ # the parser and call {#parse} followed by {#to_docstring}.
8
+ #
9
+ # == Subclassing Notes
10
+ #
11
+ # The DocstringParser can be subclassed and subtituted during parsing by
12
+ # setting the {Docstring.default_parser} attribute with the name of the
13
+ # subclass. This allows developers to change the way docstrings are
14
+ # parsed, allowing for completely different docstring syntaxes.
15
+ #
16
+ # @example Creating a Docstring with a DocstringParser
17
+ # DocstringParser.new.parse("text here").to_docstring
18
+ # @example Creating a Custom DocstringParser
19
+ # # Parses docstrings backwards!
20
+ # class ReverseDocstringParser
21
+ # def parse_content(content)
22
+ # super(content.reverse)
23
+ # end
24
+ # end
25
+ #
26
+ # # Set the parser as default when parsing
27
+ # YARD::Docstring.default_parser = ReverseDocstringParser
28
+ # @see #parse_content
29
+ # @since 0.8.0
30
+ class DocstringParser
31
+ # @return [String] the parsed text portion of the docstring,
32
+ # with tags removed.
33
+ attr_accessor :text
34
+
35
+ # @return [String] the complete input string to the parser.
36
+ attr_accessor :raw_text
37
+
38
+ # @return [Array<Tags::Tag>] the list of meta-data tags identified
39
+ # by the parser
40
+ attr_accessor :tags
41
+
42
+ # @return [Array<Tags::Directive>] a list of directives identified
43
+ # by the parser. This list will not be passed on to the
44
+ # Docstring object.
45
+ attr_accessor :directives
46
+
47
+ # @return [OpenStruct] any arbitrary state to be passed between
48
+ # tags during parsing. Mainly used by directives to coordinate
49
+ # behaviour (so that directives can be aware of other directives
50
+ # used in a docstring).
51
+ attr_accessor :state
52
+
53
+ # @return [CodeObjects::Base, nil] the object associated with
54
+ # the docstring being parsed. May be nil if the docstring is
55
+ # not attached to any object.
56
+ attr_accessor :object
57
+
58
+ # @return [CodeObjects::Base, nil] the object referenced by
59
+ # the docstring being parsed. May be nil if the docstring doesn't
60
+ # refer to any object.
61
+ attr_accessor :reference
62
+
63
+ # @return [Handlers::Base, nil] the handler parsing this
64
+ # docstring. May be nil if this docstring parser is not
65
+ # initialized through
66
+ attr_accessor :handler
67
+
68
+ # @return [Tags::Library] the tag library being used to
69
+ # identify registered tags in the docstring.
70
+ attr_accessor :library
71
+
72
+ # The regular expression to match the tag syntax
73
+ META_MATCH = /^@(!)?((?:\w\.?)+)(?:\s+(.*))?$/i
74
+
75
+ # @!group Creation and Conversion Methods
76
+
77
+ # Creates a new parser to parse docstring data
78
+ #
79
+ # @param [Tags::Library] library a tag library for recognizing
80
+ # tags.
81
+ def initialize(library = Tags::Library.instance)
82
+ @text = ""
83
+ @raw_text = ""
84
+ @tags = []
85
+ @directives = []
86
+ @library = library
87
+ @object = nil
88
+ @reference = nil
89
+ @handler = nil
90
+ @state = OpenStruct.new
91
+ end
92
+
93
+ # @return [Docstring] translates parsed text into
94
+ # a Docstring object.
95
+ def to_docstring
96
+ Docstring.new!(text, tags, object, raw_text, reference)
97
+ end
98
+
99
+ # @!group Parsing Methods
100
+
101
+ # Parses all content and returns itself.
102
+ #
103
+ # @param [String] content the docstring text to parse
104
+ # @param [CodeObjects::Base] object the object that the docstring
105
+ # is attached to. Will be passed to directives to act on
106
+ # this object.
107
+ # @param [Handlers::Base, nil] handler the handler object that is
108
+ # parsing this object. May be nil if this parser is not being
109
+ # called from a {Parser::SourceParser} context.
110
+ # @return [self] the parser object. To get the docstring,
111
+ # call {#to_docstring}.
112
+ # @see #to_docstring
113
+ def parse(content, object = nil, handler = nil)
114
+ @object = object
115
+ @handler = handler
116
+ @reference, @raw_text = detect_reference(content)
117
+ text = parse_content(@raw_text)
118
+ @text = text.strip
119
+ call_directives_after_parse
120
+ post_process
121
+ self
122
+ end
123
+
124
+ # Parses a given block of text.
125
+ #
126
+ # @param [String] content the content to parse
127
+ # @note Subclasses can override this method to perform custom
128
+ # parsing of content data.
129
+ def parse_content(content)
130
+ content = content.split(/\r?\n/) if content.is_a?(String)
131
+ return '' if !content || content.empty?
132
+ docstring = String.new("")
133
+
134
+ indent = content.first[/^\s*/].length
135
+ last_indent = 0
136
+ orig_indent = 0
137
+ directive = false
138
+ last_line = ""
139
+ tag_name = nil
140
+ tag_buf = []
141
+
142
+ (content + ['']).each_with_index do |line, index|
143
+ indent = line[/^\s*/].length
144
+ empty = (line =~ /^\s*$/ ? true : false)
145
+ done = content.size == index
146
+
147
+ if tag_name && (((indent < orig_indent && !empty) || done ||
148
+ (indent == 0 && !empty)) || (indent <= last_indent && line =~ META_MATCH))
149
+ buf = tag_buf.join("\n")
150
+ if directive || tag_is_directive?(tag_name)
151
+ directive = create_directive(tag_name, buf)
152
+ if directive
153
+ docstring << parse_content(directive.expanded_text).chomp
154
+ end
155
+ else
156
+ create_tag(tag_name, buf)
157
+ end
158
+ tag_name = nil
159
+ tag_buf = []
160
+ directive = false
161
+ orig_indent = 0
162
+ end
163
+
164
+ # Found a meta tag
165
+ if line =~ META_MATCH
166
+ directive = $1
167
+ tag_name = $2
168
+ tag_buf = [($3 || '')]
169
+ elsif tag_name && indent >= orig_indent && !empty
170
+ orig_indent = indent if orig_indent == 0
171
+ # Extra data added to the tag on the next line
172
+ last_empty = last_line =~ /^[ \t]*$/ ? true : false
173
+
174
+ tag_buf << '' if last_empty
175
+ tag_buf << line.gsub(/^[ \t]{#{orig_indent}}/, '')
176
+ elsif !tag_name
177
+ # Regular docstring text
178
+ docstring << line
179
+ docstring << "\n"
180
+ end
181
+
182
+ last_indent = indent
183
+ last_line = line
184
+ end
185
+
186
+ docstring
187
+ end
188
+
189
+ # @!group Parser Callback Methods
190
+
191
+ # Call post processing callbacks on parser.
192
+ # This is called implicitly by parser. Use this when
193
+ # manually configuring a {Docstring} object.
194
+ #
195
+ # @return [void]
196
+ def post_process
197
+ call_after_parse_callbacks
198
+ end
199
+
200
+ # @!group Tag Manipulation Methods
201
+
202
+ # Creates a tag from the {Tags::DefaultFactory tag factory}.
203
+ #
204
+ # To add an already created tag object, append it to {#tags}.
205
+ #
206
+ # @param [String] tag_name the tag name
207
+ # @param [String] tag_buf the text attached to the tag with newlines removed.
208
+ # @return [Tags::Tag, Tags::RefTag] a tag
209
+ def create_tag(tag_name, tag_buf = '')
210
+ if tag_buf =~ /\A\s*(?:(\S+)\s+)?\(\s*see\s+(\S+)\s*\)\s*\Z/
211
+ return create_ref_tag(tag_name, $1, $2)
212
+ end
213
+
214
+ if library.has_tag?(tag_name)
215
+ @tags += [library.tag_create(tag_name, tag_buf)].flatten
216
+ else
217
+ log.warn "Unknown tag @#{tag_name}" +
218
+ (object ? " in file `#{object.file}` near line #{object.line}" : "")
219
+ end
220
+ rescue Tags::TagFormatError
221
+ log.warn "Invalid tag format for @#{tag_name}" +
222
+ (object ? " in file `#{object.file}` near line #{object.line}" : "")
223
+ end
224
+
225
+ # Creates a {Tags::RefTag}
226
+ def create_ref_tag(tag_name, name, object_name)
227
+ @tags << Tags::RefTagList.new(tag_name, P(object, object_name), name)
228
+ end
229
+
230
+ # Creates a new directive using the registered {#library}
231
+ # @return [Tags::Directive] the directive object that is created
232
+ def create_directive(tag_name, tag_buf)
233
+ if library.has_directive?(tag_name)
234
+ dir = library.directive_create(tag_name, tag_buf, self)
235
+ if dir.is_a?(Tags::Directive)
236
+ @directives << dir
237
+ dir
238
+ end
239
+ else
240
+ log.warn "Unknown directive @!#{tag_name}" +
241
+ (object ? " in file `#{object.file}` near line #{object.line}" : "")
242
+ nil
243
+ end
244
+ rescue Tags::TagFormatError
245
+ log.warn "Invalid directive format for @!#{tag_name}" +
246
+ (object ? " in file `#{object.file}` near line #{object.line}" : "")
247
+ nil
248
+ end
249
+
250
+ # Backward compatibility to detect old tags that should be specified
251
+ # as directives in 0.8 and onward.
252
+ def tag_is_directive?(tag_name)
253
+ list = %w(attribute endgroup group macro method scope visibility)
254
+ list.include?(tag_name)
255
+ end
256
+
257
+ # Creates a callback that is called after a docstring is successfully
258
+ # parsed. Use this method to perform sanity checks on a docstring's
259
+ # tag data, or add any extra tags automatically to a docstring.
260
+ #
261
+ # @yield [parser] a block to be called after a docstring is parsed
262
+ # @yieldparam [DocstringParser] parser the docstring parser object
263
+ # with all directives and tags created.
264
+ # @yieldreturn [void]
265
+ # @return [void]
266
+ def self.after_parse(&block)
267
+ after_parse_callbacks << block
268
+ end
269
+
270
+ # @return [Array<Proc>] the {after_parse} callback proc objects
271
+ def self.after_parse_callbacks
272
+ @after_parse_callbacks ||= []
273
+ end
274
+
275
+ # Define a callback to check that @param tags are properly named
276
+ after_parse do |parser|
277
+ next unless parser.object
278
+ next unless parser.object.is_a?(CodeObjects::MethodObject)
279
+ next if parser.object.is_alias?
280
+ names = parser.object.parameters.map {|l| l.first.gsub(/\W/, '') }
281
+ seen_names = []
282
+ infile_info = "\n in file `#{parser.object.file}' " \
283
+ "near line #{parser.object.line}"
284
+ parser.tags.each do |tag|
285
+ next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
286
+ next unless tag.tag_name == "param"
287
+ if seen_names.include?(tag.name)
288
+ log.warn "@param tag has duplicate parameter name: " \
289
+ "#{tag.name} #{infile_info}"
290
+ elsif names.include?(tag.name)
291
+ seen_names << tag.name
292
+ else
293
+ log.warn "@param tag has unknown parameter name: " \
294
+ "#{tag.name} #{infile_info}"
295
+ end
296
+ end
297
+ end
298
+
299
+ private
300
+
301
+ def namespace
302
+ object && object.namespace
303
+ end
304
+
305
+ def detect_reference(content)
306
+ if content =~ /\A\s*\(see (\S+)\s*\)(?:\s|$)/
307
+ path = $1
308
+ extra = $'
309
+ [CodeObjects::Proxy.new(namespace, path), extra]
310
+ else
311
+ [nil, content]
312
+ end
313
+ end
314
+
315
+ # @!group Parser Callback Methods
316
+
317
+ # Calls the {Tags::Directive#after_parse} callback on all the
318
+ # created directives.
319
+ def call_directives_after_parse
320
+ directives.each(&:after_parse)
321
+ end
322
+
323
+ # Calls all {after_parse} callbacks
324
+ def call_after_parse_callbacks
325
+ self.class.after_parse_callbacks.each do |cb|
326
+ cb.call(self)
327
+ end
328
+ end
329
+
330
+ # Define a callback to check that @see tags do not use {}.
331
+ after_parse do |parser|
332
+ next unless parser.object
333
+
334
+ parser.tags.each_with_index do |tag, i|
335
+ next if tag.is_a?(Tags::RefTagList) # we don't handle this yet
336
+ next unless tag.tag_name == "see"
337
+ next unless "#{tag.name}#{tag.text}" =~ /\A\{.*\}\Z/
338
+ infile_info = "\n in file `#{parser.object.file}' " \
339
+ "near line #{parser.object.line}"
340
+ log.warn "@see tag (##{i + 1}) should not be wrapped in {} " \
341
+ "(causes rendering issues): #{infile_info}"
342
+ end
343
+ end
344
+ end
345
+ end