yard 0.9.27 → 0.9.29

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/LEGAL +29 -1
  3. data/LICENSE +1 -1
  4. data/lib/yard/autoload.rb +2 -1
  5. data/lib/yard/cli/command.rb +1 -1
  6. data/lib/yard/cli/stats.rb +2 -1
  7. data/lib/yard/cli/yardoc.rb +3 -2
  8. data/lib/yard/code_objects/base.rb +4 -1
  9. data/lib/yard/config.rb +5 -1
  10. data/lib/yard/docstring_parser.rb +1 -1
  11. data/lib/yard/handlers/ruby/attribute_handler.rb +1 -1
  12. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +1 -1
  13. data/lib/yard/handlers/ruby/method_handler.rb +1 -1
  14. data/lib/yard/handlers/ruby/mixin_handler.rb +13 -6
  15. data/lib/yard/i18n/locale.rb +1 -1
  16. data/lib/yard/i18n/message.rb +2 -2
  17. data/lib/yard/i18n/messages.rb +1 -1
  18. data/lib/yard/i18n/pot_generator.rb +1 -1
  19. data/lib/yard/options.rb +1 -1
  20. data/lib/yard/parser/ruby/ast_node.rb +7 -0
  21. data/lib/yard/parser/ruby/ruby_parser.rb +8 -2
  22. data/lib/yard/registry_resolver.rb +2 -1
  23. data/lib/yard/server/commands/base.rb +1 -1
  24. data/lib/yard/server/http_utils.rb +512 -0
  25. data/lib/yard/server/rack_adapter.rb +24 -12
  26. data/lib/yard/tags/tag.rb +2 -2
  27. data/lib/yard/tags/types_explainer.rb +1 -1
  28. data/lib/yard/templates/helpers/html_helper.rb +1 -1
  29. data/lib/yard/templates/helpers/method_helper.rb +3 -1
  30. data/lib/yard/templates/template.rb +3 -1
  31. data/lib/yard/version.rb +1 -1
  32. data/lib/yard.rb +3 -0
  33. metadata +5 -208
  34. data/.dockerignore +0 -2
  35. data/.gitattributes +0 -4
  36. data/.github/FUNDING.yml +0 -3
  37. data/.github/ISSUE_TEMPLATE.md +0 -33
  38. data/.github/PULL_REQUEST_TEMPLATE.md +0 -12
  39. data/.github/workflows/ci.yml +0 -30
  40. data/.github/workflows/gem.yml +0 -19
  41. data/.gitignore +0 -14
  42. data/.rspec +0 -2
  43. data/.rubocop.yml +0 -112
  44. data/.yardopts +0 -26
  45. data/.yardopts_guide +0 -19
  46. data/.yardopts_i18n +0 -23
  47. data/CHANGELOG.md +0 -827
  48. data/CODE_OF_CONDUCT.md +0 -15
  49. data/CONTRIBUTING.md +0 -140
  50. data/Dockerfile.samus +0 -28
  51. data/Gemfile +0 -34
  52. data/Rakefile +0 -36
  53. data/SECURITY.md +0 -26
  54. data/benchmarks/builtins_vs_eval.rb +0 -24
  55. data/benchmarks/concat_vs_join.rb +0 -13
  56. data/benchmarks/erb_vs_erubis.rb +0 -54
  57. data/benchmarks/format_args.rb +0 -47
  58. data/benchmarks/generation.rb +0 -38
  59. data/benchmarks/marshal_vs_dbm.rb +0 -64
  60. data/benchmarks/parsing.rb +0 -46
  61. data/benchmarks/pathname_vs_string.rb +0 -51
  62. data/benchmarks/rdoc_vs_yardoc.rb +0 -11
  63. data/benchmarks/registry_store_types.rb +0 -49
  64. data/benchmarks/ri_vs_yri.rb +0 -19
  65. data/benchmarks/ripper_parser.rb +0 -13
  66. data/benchmarks/splat_vs_flatten.rb +0 -13
  67. data/benchmarks/template_erb.rb +0 -23
  68. data/benchmarks/template_format.rb +0 -7
  69. data/benchmarks/template_profile.rb +0 -18
  70. data/benchmarks/yri_cache.rb +0 -20
  71. data/docs/CodeObjects.md +0 -115
  72. data/docs/GettingStarted.md +0 -679
  73. data/docs/Handlers.md +0 -152
  74. data/docs/Overview.md +0 -61
  75. data/docs/Parser.md +0 -191
  76. data/docs/Tags.md +0 -283
  77. data/docs/TagsArch.md +0 -123
  78. data/docs/Templates.md +0 -496
  79. data/docs/WhatsNew.md +0 -1245
  80. data/docs/images/code-objects-class-diagram.png +0 -0
  81. data/docs/images/handlers-class-diagram.png +0 -0
  82. data/docs/images/overview-class-diagram.png +0 -0
  83. data/docs/images/parser-class-diagram.png +0 -0
  84. data/docs/images/tags-class-diagram.png +0 -0
  85. data/docs/templates/default/fulldoc/html/full_list_tag.erb +0 -9
  86. data/docs/templates/default/fulldoc/html/setup.rb +0 -6
  87. data/docs/templates/default/layout/html/setup.rb +0 -9
  88. data/docs/templates/default/layout/html/tag_list.erb +0 -11
  89. data/docs/templates/default/yard_tags/html/list.erb +0 -18
  90. data/docs/templates/default/yard_tags/html/setup.rb +0 -26
  91. data/docs/templates/plugin.rb +0 -70
  92. data/po/ja.po +0 -31108
  93. data/samus.json +0 -49
  94. data/tasks/prepare_tag.rake +0 -45
  95. data/tasks/update_error_map.rake +0 -53
  96. data/templates/default/class/dot/setup.rb +0 -7
  97. data/templates/default/class/dot/superklass.erb +0 -3
  98. data/templates/default/class/html/constructor_details.erb +0 -8
  99. data/templates/default/class/html/setup.rb +0 -2
  100. data/templates/default/class/html/subclasses.erb +0 -4
  101. data/templates/default/class/setup.rb +0 -36
  102. data/templates/default/class/text/setup.rb +0 -12
  103. data/templates/default/class/text/subclasses.erb +0 -5
  104. data/templates/default/constant/text/header.erb +0 -11
  105. data/templates/default/constant/text/setup.rb +0 -4
  106. data/templates/default/docstring/html/abstract.erb +0 -4
  107. data/templates/default/docstring/html/deprecated.erb +0 -1
  108. data/templates/default/docstring/html/index.erb +0 -5
  109. data/templates/default/docstring/html/note.erb +0 -6
  110. data/templates/default/docstring/html/private.erb +0 -4
  111. data/templates/default/docstring/html/returns_void.erb +0 -1
  112. data/templates/default/docstring/html/text.erb +0 -1
  113. data/templates/default/docstring/html/todo.erb +0 -6
  114. data/templates/default/docstring/setup.rb +0 -52
  115. data/templates/default/docstring/text/abstract.erb +0 -2
  116. data/templates/default/docstring/text/deprecated.erb +0 -2
  117. data/templates/default/docstring/text/index.erb +0 -2
  118. data/templates/default/docstring/text/note.erb +0 -4
  119. data/templates/default/docstring/text/private.erb +0 -2
  120. data/templates/default/docstring/text/returns_void.erb +0 -1
  121. data/templates/default/docstring/text/text.erb +0 -1
  122. data/templates/default/docstring/text/todo.erb +0 -4
  123. data/templates/default/fulldoc/html/css/common.css +0 -1
  124. data/templates/default/fulldoc/html/css/full_list.css +0 -58
  125. data/templates/default/fulldoc/html/css/style.css +0 -497
  126. data/templates/default/fulldoc/html/frames.erb +0 -17
  127. data/templates/default/fulldoc/html/full_list.erb +0 -37
  128. data/templates/default/fulldoc/html/full_list_class.erb +0 -2
  129. data/templates/default/fulldoc/html/full_list_file.erb +0 -7
  130. data/templates/default/fulldoc/html/full_list_method.erb +0 -10
  131. data/templates/default/fulldoc/html/js/app.js +0 -314
  132. data/templates/default/fulldoc/html/js/full_list.js +0 -216
  133. data/templates/default/fulldoc/html/js/jquery.js +0 -4
  134. data/templates/default/fulldoc/html/setup.rb +0 -241
  135. data/templates/default/layout/dot/header.erb +0 -6
  136. data/templates/default/layout/dot/setup.rb +0 -15
  137. data/templates/default/layout/html/breadcrumb.erb +0 -11
  138. data/templates/default/layout/html/files.erb +0 -11
  139. data/templates/default/layout/html/footer.erb +0 -5
  140. data/templates/default/layout/html/headers.erb +0 -15
  141. data/templates/default/layout/html/index.erb +0 -2
  142. data/templates/default/layout/html/layout.erb +0 -24
  143. data/templates/default/layout/html/listing.erb +0 -4
  144. data/templates/default/layout/html/objects.erb +0 -32
  145. data/templates/default/layout/html/script_setup.erb +0 -4
  146. data/templates/default/layout/html/search.erb +0 -13
  147. data/templates/default/layout/html/setup.rb +0 -89
  148. data/templates/default/method/html/header.erb +0 -17
  149. data/templates/default/method/setup.rb +0 -4
  150. data/templates/default/method/text/header.erb +0 -1
  151. data/templates/default/method_details/html/header.erb +0 -3
  152. data/templates/default/method_details/html/method_signature.erb +0 -25
  153. data/templates/default/method_details/html/source.erb +0 -10
  154. data/templates/default/method_details/setup.rb +0 -11
  155. data/templates/default/method_details/text/header.erb +0 -10
  156. data/templates/default/method_details/text/method_signature.erb +0 -12
  157. data/templates/default/method_details/text/setup.rb +0 -11
  158. data/templates/default/module/dot/child.erb +0 -1
  159. data/templates/default/module/dot/dependencies.erb +0 -3
  160. data/templates/default/module/dot/header.erb +0 -6
  161. data/templates/default/module/dot/info.erb +0 -14
  162. data/templates/default/module/dot/setup.rb +0 -15
  163. data/templates/default/module/html/attribute_details.erb +0 -10
  164. data/templates/default/module/html/attribute_summary.erb +0 -8
  165. data/templates/default/module/html/box_info.erb +0 -43
  166. data/templates/default/module/html/children.erb +0 -8
  167. data/templates/default/module/html/constant_summary.erb +0 -17
  168. data/templates/default/module/html/defines.erb +0 -3
  169. data/templates/default/module/html/header.erb +0 -5
  170. data/templates/default/module/html/inherited_attributes.erb +0 -14
  171. data/templates/default/module/html/inherited_constants.erb +0 -8
  172. data/templates/default/module/html/inherited_methods.erb +0 -19
  173. data/templates/default/module/html/item_summary.erb +0 -40
  174. data/templates/default/module/html/method_details_list.erb +0 -9
  175. data/templates/default/module/html/method_summary.erb +0 -14
  176. data/templates/default/module/html/methodmissing.erb +0 -12
  177. data/templates/default/module/html/pre_docstring.erb +0 -1
  178. data/templates/default/module/setup.rb +0 -167
  179. data/templates/default/module/text/children.erb +0 -10
  180. data/templates/default/module/text/class_meths_list.erb +0 -8
  181. data/templates/default/module/text/extends.erb +0 -8
  182. data/templates/default/module/text/header.erb +0 -7
  183. data/templates/default/module/text/includes.erb +0 -8
  184. data/templates/default/module/text/instance_meths_list.erb +0 -8
  185. data/templates/default/module/text/setup.rb +0 -13
  186. data/templates/default/onefile/html/files.erb +0 -5
  187. data/templates/default/onefile/html/headers.erb +0 -6
  188. data/templates/default/onefile/html/layout.erb +0 -17
  189. data/templates/default/onefile/html/readme.erb +0 -3
  190. data/templates/default/onefile/html/setup.rb +0 -62
  191. data/templates/default/root/dot/child.erb +0 -3
  192. data/templates/default/root/dot/setup.rb +0 -6
  193. data/templates/default/root/html/setup.rb +0 -2
  194. data/templates/default/tags/html/example.erb +0 -11
  195. data/templates/default/tags/html/index.erb +0 -3
  196. data/templates/default/tags/html/option.erb +0 -24
  197. data/templates/default/tags/html/overload.erb +0 -14
  198. data/templates/default/tags/html/see.erb +0 -8
  199. data/templates/default/tags/html/tag.erb +0 -20
  200. data/templates/default/tags/setup.rb +0 -57
  201. data/templates/default/tags/text/example.erb +0 -12
  202. data/templates/default/tags/text/index.erb +0 -1
  203. data/templates/default/tags/text/option.erb +0 -20
  204. data/templates/default/tags/text/overload.erb +0 -19
  205. data/templates/default/tags/text/see.erb +0 -11
  206. data/templates/default/tags/text/tag.erb +0 -13
  207. data/templates/guide/class/html/setup.rb +0 -2
  208. data/templates/guide/docstring/html/setup.rb +0 -2
  209. data/templates/guide/fulldoc/html/css/style.css +0 -108
  210. data/templates/guide/fulldoc/html/js/app.js +0 -33
  211. data/templates/guide/fulldoc/html/setup.rb +0 -74
  212. data/templates/guide/layout/html/layout.erb +0 -81
  213. data/templates/guide/layout/html/setup.rb +0 -25
  214. data/templates/guide/method/html/header.erb +0 -18
  215. data/templates/guide/method/html/setup.rb +0 -22
  216. data/templates/guide/module/html/header.erb +0 -7
  217. data/templates/guide/module/html/method_list.erb +0 -5
  218. data/templates/guide/module/html/setup.rb +0 -27
  219. data/templates/guide/onefile/html/files.erb +0 -4
  220. data/templates/guide/onefile/html/setup.rb +0 -6
  221. data/templates/guide/onefile/html/toc.erb +0 -3
  222. data/templates/guide/tags/html/setup.rb +0 -9
  223. data/yard.gemspec +0 -25
@@ -0,0 +1,512 @@
1
+ # frozen_string_literal: false
2
+ #
3
+ # httputils.rb -- HTTPUtils Module
4
+ #
5
+ # Author: IPR -- Internet Programming with Ruby -- writers
6
+ # Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
7
+ # Copyright (c) 2002 Internet Programming with Ruby writers. All rights
8
+ # reserved.
9
+ #
10
+ # $IPR: httputils.rb,v 1.34 2003/06/05 21:34:08 gotoyuzo Exp $
11
+
12
+ require 'socket'
13
+ require 'tempfile'
14
+
15
+ module YARD::Server
16
+ CR = "\x0d" # :nodoc:
17
+ LF = "\x0a" # :nodoc:
18
+ CRLF = "\x0d\x0a" # :nodoc:
19
+
20
+ ##
21
+ # HTTPUtils provides utility methods for working with the HTTP protocol.
22
+ #
23
+ # This module is generally used internally by WEBrick
24
+
25
+ module HTTPUtils
26
+
27
+ ##
28
+ # Normalizes a request path. Raises an exception if the path cannot be
29
+ # normalized.
30
+
31
+ def normalize_path(path)
32
+ raise "abnormal path `#{path}'" if path[0] != ?/
33
+ ret = path.dup
34
+
35
+ ret.gsub!(%r{/+}o, '/') # // => /
36
+ while ret.sub!(%r'/\.(?:/|\Z)', '/'); end # /. => /
37
+ while ret.sub!(%r'/(?!\.\./)[^/]+/\.\.(?:/|\Z)', '/'); end # /foo/.. => /foo
38
+
39
+ raise "abnormal path `#{path}'" if %r{/\.\.(/|\Z)} =~ ret
40
+ ret
41
+ end
42
+ module_function :normalize_path
43
+
44
+ ##
45
+ # Default mime types
46
+
47
+ DefaultMimeTypes = {
48
+ "ai" => "application/postscript",
49
+ "asc" => "text/plain",
50
+ "avi" => "video/x-msvideo",
51
+ "bin" => "application/octet-stream",
52
+ "bmp" => "image/bmp",
53
+ "class" => "application/octet-stream",
54
+ "cer" => "application/pkix-cert",
55
+ "crl" => "application/pkix-crl",
56
+ "crt" => "application/x-x509-ca-cert",
57
+ #"crl" => "application/x-pkcs7-crl",
58
+ "css" => "text/css",
59
+ "dms" => "application/octet-stream",
60
+ "doc" => "application/msword",
61
+ "dvi" => "application/x-dvi",
62
+ "eps" => "application/postscript",
63
+ "etx" => "text/x-setext",
64
+ "exe" => "application/octet-stream",
65
+ "gif" => "image/gif",
66
+ "htm" => "text/html",
67
+ "html" => "text/html",
68
+ "jpe" => "image/jpeg",
69
+ "jpeg" => "image/jpeg",
70
+ "jpg" => "image/jpeg",
71
+ "js" => "application/javascript",
72
+ "json" => "application/json",
73
+ "lha" => "application/octet-stream",
74
+ "lzh" => "application/octet-stream",
75
+ "mjs" => "application/javascript",
76
+ "mov" => "video/quicktime",
77
+ "mpe" => "video/mpeg",
78
+ "mpeg" => "video/mpeg",
79
+ "mpg" => "video/mpeg",
80
+ "pbm" => "image/x-portable-bitmap",
81
+ "pdf" => "application/pdf",
82
+ "pgm" => "image/x-portable-graymap",
83
+ "png" => "image/png",
84
+ "pnm" => "image/x-portable-anymap",
85
+ "ppm" => "image/x-portable-pixmap",
86
+ "ppt" => "application/vnd.ms-powerpoint",
87
+ "ps" => "application/postscript",
88
+ "qt" => "video/quicktime",
89
+ "ras" => "image/x-cmu-raster",
90
+ "rb" => "text/plain",
91
+ "rd" => "text/plain",
92
+ "rtf" => "application/rtf",
93
+ "sgm" => "text/sgml",
94
+ "sgml" => "text/sgml",
95
+ "svg" => "image/svg+xml",
96
+ "tif" => "image/tiff",
97
+ "tiff" => "image/tiff",
98
+ "txt" => "text/plain",
99
+ "wasm" => "application/wasm",
100
+ "xbm" => "image/x-xbitmap",
101
+ "xhtml" => "text/html",
102
+ "xls" => "application/vnd.ms-excel",
103
+ "xml" => "text/xml",
104
+ "xpm" => "image/x-xpixmap",
105
+ "xwd" => "image/x-xwindowdump",
106
+ "zip" => "application/zip",
107
+ }
108
+
109
+ ##
110
+ # Loads Apache-compatible mime.types in +file+.
111
+
112
+ def load_mime_types(file)
113
+ # note: +file+ may be a "| command" for now; some people may
114
+ # rely on this, but currently we do not use this method by default.
115
+ open(file){ |io|
116
+ hash = Hash.new
117
+ io.each{ |line|
118
+ next if /^#/ =~ line
119
+ line.chomp!
120
+ mimetype, ext0 = line.split(/\s+/, 2)
121
+ next unless ext0
122
+ next if ext0.empty?
123
+ ext0.split(/\s+/).each{ |ext| hash[ext] = mimetype }
124
+ }
125
+ hash
126
+ }
127
+ end
128
+ module_function :load_mime_types
129
+
130
+ ##
131
+ # Returns the mime type of +filename+ from the list in +mime_tab+. If no
132
+ # mime type was found application/octet-stream is returned.
133
+
134
+ def mime_type(filename, mime_tab)
135
+ suffix1 = (/\.(\w+)$/ =~ filename && $1.downcase)
136
+ suffix2 = (/\.(\w+)\.[\w\-]+$/ =~ filename && $1.downcase)
137
+ mime_tab[suffix1] || mime_tab[suffix2] || "application/octet-stream"
138
+ end
139
+ module_function :mime_type
140
+
141
+ ##
142
+ # Parses an HTTP header +raw+ into a hash of header fields with an Array
143
+ # of values.
144
+
145
+ def parse_header(raw)
146
+ header = Hash.new([].freeze)
147
+ field = nil
148
+ raw.each_line{|line|
149
+ case line
150
+ when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+):\s*(.*?)\s*\z/om
151
+ field, value = $1, $2
152
+ field.downcase!
153
+ header[field] = [] unless header.has_key?(field)
154
+ header[field] << value
155
+ when /^\s+(.*?)\s*\z/om
156
+ value = $1
157
+ unless field
158
+ raise HTTPStatus::BadRequest, "bad header '#{line}'."
159
+ end
160
+ header[field][-1] << " " << value
161
+ else
162
+ raise HTTPStatus::BadRequest, "bad header '#{line}'."
163
+ end
164
+ }
165
+ header.each{|key, values|
166
+ values.each(&:strip!)
167
+ }
168
+ header
169
+ end
170
+ module_function :parse_header
171
+
172
+ ##
173
+ # Splits a header value +str+ according to HTTP specification.
174
+
175
+ def split_header_value(str)
176
+ str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+)
177
+ (?:,\s*|\Z)'xn).flatten
178
+ end
179
+ module_function :split_header_value
180
+
181
+ ##
182
+ # Parses a Range header value +ranges_specifier+
183
+
184
+ def parse_range_header(ranges_specifier)
185
+ if /^bytes=(.*)/ =~ ranges_specifier
186
+ byte_range_set = split_header_value($1)
187
+ byte_range_set.collect{|range_spec|
188
+ case range_spec
189
+ when /^(\d+)-(\d+)/ then $1.to_i .. $2.to_i
190
+ when /^(\d+)-/ then $1.to_i .. -1
191
+ when /^-(\d+)/ then -($1.to_i) .. -1
192
+ else return nil
193
+ end
194
+ }
195
+ end
196
+ end
197
+ module_function :parse_range_header
198
+
199
+ ##
200
+ # Parses q values in +value+ as used in Accept headers.
201
+
202
+ def parse_qvalues(value)
203
+ tmp = []
204
+ if value
205
+ parts = value.split(/,\s*/)
206
+ parts.each {|part|
207
+ if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part)
208
+ val = m[1]
209
+ q = (m[2] or 1).to_f
210
+ tmp.push([val, q])
211
+ end
212
+ }
213
+ tmp = tmp.sort_by{|val, q| -q}
214
+ tmp.collect!{|val, q| val}
215
+ end
216
+ return tmp
217
+ end
218
+ module_function :parse_qvalues
219
+
220
+ ##
221
+ # Removes quotes and escapes from +str+
222
+
223
+ def dequote(str)
224
+ ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup
225
+ ret.gsub!(/\\(.)/, "\\1")
226
+ ret
227
+ end
228
+ module_function :dequote
229
+
230
+ ##
231
+ # Quotes and escapes quotes in +str+
232
+
233
+ def quote(str)
234
+ '"' << str.gsub(/[\\\"]/o, "\\\1") << '"'
235
+ end
236
+ module_function :quote
237
+
238
+ ##
239
+ # Stores multipart form data. FormData objects are created when
240
+ # WEBrick::HTTPUtils.parse_form_data is called.
241
+
242
+ class FormData < String
243
+ EmptyRawHeader = [].freeze # :nodoc:
244
+ EmptyHeader = {}.freeze # :nodoc:
245
+
246
+ ##
247
+ # The name of the form data part
248
+
249
+ attr_accessor :name
250
+
251
+ ##
252
+ # The filename of the form data part
253
+
254
+ attr_accessor :filename
255
+
256
+ attr_accessor :next_data # :nodoc:
257
+ protected :next_data
258
+
259
+ ##
260
+ # Creates a new FormData object.
261
+ #
262
+ # +args+ is an Array of form data entries. One FormData will be created
263
+ # for each entry.
264
+ #
265
+ # This is called by WEBrick::HTTPUtils.parse_form_data for you
266
+
267
+ def initialize(*args)
268
+ @name = @filename = @next_data = nil
269
+ if args.empty?
270
+ @raw_header = []
271
+ @header = nil
272
+ super("")
273
+ else
274
+ @raw_header = EmptyRawHeader
275
+ @header = EmptyHeader
276
+ super(args.shift)
277
+ unless args.empty?
278
+ @next_data = self.class.new(*args)
279
+ end
280
+ end
281
+ end
282
+
283
+ ##
284
+ # Retrieves the header at the first entry in +key+
285
+
286
+ def [](*key)
287
+ begin
288
+ @header[key[0].downcase].join(", ")
289
+ rescue StandardError, NameError
290
+ super
291
+ end
292
+ end
293
+
294
+ ##
295
+ # Adds +str+ to this FormData which may be the body, a header or a
296
+ # header entry.
297
+ #
298
+ # This is called by WEBrick::HTTPUtils.parse_form_data for you
299
+
300
+ def <<(str)
301
+ if @header
302
+ super
303
+ elsif str == CRLF
304
+ @header = HTTPUtils::parse_header(@raw_header.join)
305
+ if cd = self['content-disposition']
306
+ if /\s+name="(.*?)"/ =~ cd then @name = $1 end
307
+ if /\s+filename="(.*?)"/ =~ cd then @filename = $1 end
308
+ end
309
+ else
310
+ @raw_header << str
311
+ end
312
+ self
313
+ end
314
+
315
+ ##
316
+ # Adds +data+ at the end of the chain of entries
317
+ #
318
+ # This is called by WEBrick::HTTPUtils.parse_form_data for you.
319
+
320
+ def append_data(data)
321
+ tmp = self
322
+ while tmp
323
+ unless tmp.next_data
324
+ tmp.next_data = data
325
+ break
326
+ end
327
+ tmp = tmp.next_data
328
+ end
329
+ self
330
+ end
331
+
332
+ ##
333
+ # Yields each entry in this FormData
334
+
335
+ def each_data
336
+ tmp = self
337
+ while tmp
338
+ next_data = tmp.next_data
339
+ yield(tmp)
340
+ tmp = next_data
341
+ end
342
+ end
343
+
344
+ ##
345
+ # Returns all the FormData as an Array
346
+
347
+ def list
348
+ ret = []
349
+ each_data{|data|
350
+ ret << data.to_s
351
+ }
352
+ ret
353
+ end
354
+
355
+ ##
356
+ # A FormData will behave like an Array
357
+
358
+ alias :to_ary :list
359
+
360
+ ##
361
+ # This FormData's body
362
+
363
+ def to_s
364
+ String.new(self)
365
+ end
366
+ end
367
+
368
+ ##
369
+ # Parses the query component of a URI in +str+
370
+
371
+ def parse_query(str)
372
+ query = Hash.new
373
+ if str
374
+ str.split(/[&;]/).each{|x|
375
+ next if x.empty?
376
+ key, val = x.split(/=/,2)
377
+ key = unescape_form(key)
378
+ val = unescape_form(val.to_s)
379
+ val = FormData.new(val)
380
+ val.name = key
381
+ if query.has_key?(key)
382
+ query[key].append_data(val)
383
+ next
384
+ end
385
+ query[key] = val
386
+ }
387
+ end
388
+ query
389
+ end
390
+ module_function :parse_query
391
+
392
+ ##
393
+ # Parses form data in +io+ with the given +boundary+
394
+
395
+ def parse_form_data(io, boundary)
396
+ boundary_regexp = /\A--#{Regexp.quote(boundary)}(--)?#{CRLF}\z/
397
+ form_data = Hash.new
398
+ return form_data unless io
399
+ data = nil
400
+ io.each_line{|line|
401
+ if boundary_regexp =~ line
402
+ if data
403
+ data.chop!
404
+ key = data.name
405
+ if form_data.has_key?(key)
406
+ form_data[key].append_data(data)
407
+ else
408
+ form_data[key] = data
409
+ end
410
+ end
411
+ data = FormData.new
412
+ next
413
+ else
414
+ if data
415
+ data << line
416
+ end
417
+ end
418
+ }
419
+ return form_data
420
+ end
421
+ module_function :parse_form_data
422
+
423
+ #####
424
+
425
+ reserved = ';/?:@&=+$,'
426
+ num = '0123456789'
427
+ lowalpha = 'abcdefghijklmnopqrstuvwxyz'
428
+ upalpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
429
+ mark = '-_.!~*\'()'
430
+ unreserved = num + lowalpha + upalpha + mark
431
+ control = (0x0..0x1f).collect{|c| c.chr }.join + "\x7f"
432
+ space = " "
433
+ delims = '<>#%"'
434
+ unwise = '{}|\\^[]`'
435
+ nonascii = (0x80..0xff).collect{|c| c.chr }.join
436
+
437
+ module_function
438
+
439
+ # :stopdoc:
440
+
441
+ def _make_regex(str) /([#{Regexp.escape(str)}])/n end
442
+ def _make_regex!(str) /([^#{Regexp.escape(str)}])/n end
443
+ def _escape(str, regex)
444
+ str = str.b
445
+ str.gsub!(regex) {"%%%02X" % $1.ord}
446
+ # %-escaped string should contain US-ASCII only
447
+ str.force_encoding(Encoding::US_ASCII)
448
+ end
449
+ def _unescape(str, regex)
450
+ str = str.b
451
+ str.gsub!(regex) {$1.hex.chr}
452
+ # encoding of %-unescaped string is unknown
453
+ str
454
+ end
455
+
456
+ UNESCAPED = _make_regex(control+space+delims+unwise+nonascii)
457
+ UNESCAPED_FORM = _make_regex(reserved+control+delims+unwise+nonascii)
458
+ NONASCII = _make_regex(nonascii)
459
+ ESCAPED = /%([0-9a-fA-F]{2})/
460
+ UNESCAPED_PCHAR = _make_regex!(unreserved+":@&=+$,")
461
+
462
+ # :startdoc:
463
+
464
+ ##
465
+ # Escapes HTTP reserved and unwise characters in +str+
466
+
467
+ def escape(str)
468
+ _escape(str, UNESCAPED)
469
+ end
470
+
471
+ ##
472
+ # Unescapes HTTP reserved and unwise characters in +str+
473
+
474
+ def unescape(str)
475
+ _unescape(str, ESCAPED)
476
+ end
477
+
478
+ ##
479
+ # Escapes form reserved characters in +str+
480
+
481
+ def escape_form(str)
482
+ ret = _escape(str, UNESCAPED_FORM)
483
+ ret.gsub!(/ /, "+")
484
+ ret
485
+ end
486
+
487
+ ##
488
+ # Unescapes form reserved characters in +str+
489
+
490
+ def unescape_form(str)
491
+ _unescape(str.gsub(/\+/, " "), ESCAPED)
492
+ end
493
+
494
+ ##
495
+ # Escapes path +str+
496
+
497
+ def escape_path(str)
498
+ result = ""
499
+ str.scan(%r{/([^/]*)}).each{|i|
500
+ result << "/" << _escape(i[0], UNESCAPED_PCHAR)
501
+ }
502
+ return result
503
+ end
504
+
505
+ ##
506
+ # Escapes 8 bit characters in +str+
507
+
508
+ def escape8bit(str)
509
+ _escape(str, NONASCII)
510
+ end
511
+ end
512
+ end
@@ -1,9 +1,27 @@
1
1
  # frozen_string_literal: true
2
- require 'rack'
3
- require 'webrick/httputils'
4
2
 
5
3
  module YARD
6
4
  module Server
5
+ begin
6
+ require 'rackup'
7
+ # @private
8
+ RackServer = Rackup::Server
9
+ rescue LoadError
10
+ require 'rack'
11
+ # @private
12
+ RackServer = Rack::Server
13
+ end
14
+
15
+ # Safely use refinements since Rack requires 2.4+
16
+ # @private
17
+ module RackRefinements
18
+ refine Rack::Request do
19
+ attr_accessor :version_supplied
20
+ alias query params
21
+ def xhr?; (env['HTTP_X_REQUESTED_WITH'] || "").casecmp("xmlhttprequest") == 0 end
22
+ end
23
+ end
24
+
7
25
  # This class wraps the {RackAdapter} into a Rack-compatible middleware.
8
26
  # See {#initialize} for a list of options to pass via Rack's +#use+ method.
9
27
  #
@@ -42,7 +60,8 @@ module YARD
42
60
 
43
61
  # A server adapter to respond to requests using the Rack server infrastructure.
44
62
  class RackAdapter < Adapter
45
- include WEBrick::HTTPUtils
63
+ include YARD::Server::HTTPUtils
64
+ using RackRefinements
46
65
 
47
66
  # Responds to Rack requests and builds a response with the {Router}.
48
67
  # @return [Array(Numeric,Hash,Array)] the Rack-style response
@@ -56,11 +75,11 @@ module YARD
56
75
  [ex.message + "\n" + ex.backtrace.join("\n")]]
57
76
  end
58
77
 
59
- # Starts the +Rack::Server+. This method will pass control to the server and
78
+ # Starts the Rack server. This method will pass control to the server and
60
79
  # block.
61
80
  # @return [void]
62
81
  def start
63
- server = Rack::Server.new(server_options)
82
+ server = RackServer.new(server_options)
64
83
  server.instance_variable_set("@app", self)
65
84
  print_start_message(server)
66
85
  server.start
@@ -80,10 +99,3 @@ module YARD
80
99
  end
81
100
  end
82
101
  end
83
-
84
- # @private
85
- class Rack::Request
86
- attr_accessor :version_supplied
87
- alias query params
88
- def xhr?; (env['HTTP_X_REQUESTED_WITH'] || "").casecmp("xmlhttprequest") == 0 end
89
- end
data/lib/yard/tags/tag.rb CHANGED
@@ -58,10 +58,10 @@ module YARD
58
58
  end
59
59
 
60
60
  # Provides a plain English summary of the type specification, or nil
61
- # if no types are provided or parseable.
61
+ # if no types are provided or parsable.
62
62
  #
63
63
  # @return [String] a plain English description of the associated types
64
- # @return [nil] if no types are provided or not parseable
64
+ # @return [nil] if no types are provided or not parsable
65
65
  def explain_types
66
66
  return nil if !types || types.empty?
67
67
  TypesExplainer.explain(*types)
@@ -13,7 +13,7 @@ module YARD
13
13
  end
14
14
 
15
15
  # (see explain)
16
- # @raise [SyntaxError] if the types are not parseable
16
+ # @raise [SyntaxError] if the types are not parsable
17
17
  def self.explain!(*types)
18
18
  Parser.parse(types.join(", ")).join("; ")
19
19
  end
@@ -90,7 +90,7 @@ module YARD
90
90
  :with_toc_data,
91
91
  :no_intraemphasis).to_html
92
92
  when 'CommonMarker'
93
- CommonMarker.render_html(text, %i[DEFAULT GITHUB_PRE_LANG], %i[autolink])
93
+ CommonMarker.render_html(text, %i[DEFAULT GITHUB_PRE_LANG], %i[autolink table])
94
94
  else
95
95
  provider.new(text).to_html
96
96
  end
@@ -66,7 +66,9 @@ module YARD
66
66
 
67
67
  # @return [String] formats source code of a constant value
68
68
  def format_constant(value)
69
- sp = value.split("\n").last[/^(\s+)/, 1]
69
+ # last can return nil, so default to empty string
70
+ sp = value.split("\n").last || ""
71
+ sp = sp[/^(\s+)/, 1]
70
72
  num = sp ? sp.size : 0
71
73
  html_syntax_highlight value.gsub(/^\s{#{num}}/, '')
72
74
  end
@@ -176,7 +176,9 @@ module YARD
176
176
  def load_setup_rb
177
177
  setup_file = File.join(full_path, 'setup.rb')
178
178
  if File.file? setup_file
179
- module_eval(File.read(setup_file).taint, setup_file, 1)
179
+ setup_code = File.read(setup_file)
180
+ setup_code.taint if setup_code.respond_to?(:taint)
181
+ module_eval(setup_code, setup_file, 1)
180
182
  end
181
183
  end
182
184
  end
data/lib/yard/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module YARD
5
- VERSION = '0.9.27'
5
+ VERSION = '0.9.29'
6
6
  end
data/lib/yard.rb CHANGED
@@ -51,6 +51,9 @@ module YARD
51
51
 
52
52
  # @return [Boolean] whether YARD is being run in Ruby 3.0
53
53
  def self.ruby3?; @ruby3 ||= (RUBY_VERSION >= '3.0.0') end
54
+
55
+ # @return [Boolean] whether YARD is being run in Ruby 3.1
56
+ def self.ruby31?; @ruby31 ||= (RUBY_VERSION >= '3.1.0') end
54
57
  end
55
58
 
56
59
  # Keep track of Ruby version for compatibility code