tdiary 5.4.0 → 5.5.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (641) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +25 -2
  3. data/Gemfile.lock +211 -61
  4. data/README.md +4 -4
  5. data/doc/HOWTO-make-plugin.md +1 -1
  6. data/doc/HOWTO-testing-tDiary.md +2 -2
  7. data/doc/INSTALL-cgi.md +7 -0
  8. data/doc/INSTALL-paas.md +11 -11
  9. data/doc/INSTALL.md +2 -2
  10. data/doc/README.en.md +1 -1
  11. data/doc/README.md +1 -1
  12. data/lib/aws/pa_api.rb +6 -2
  13. data/lib/tdiary/admin.rb +6 -4
  14. data/lib/tdiary/application.rb +17 -17
  15. data/lib/tdiary/author_only_base.rb +6 -13
  16. data/lib/tdiary/base.rb +52 -16
  17. data/lib/tdiary/cgi_adapter.rb +86 -0
  18. data/lib/tdiary/cgi_compat.rb +189 -0
  19. data/lib/tdiary/configuration.rb +1 -1
  20. data/lib/tdiary/core_ext.rb +4 -53
  21. data/lib/tdiary/diary_container.rb +23 -11
  22. data/lib/tdiary/dispatcher/index_main.rb +16 -16
  23. data/lib/tdiary/dispatcher/update_main.rb +16 -16
  24. data/lib/tdiary/dispatcher.rb +4 -28
  25. data/lib/tdiary/environment.rb +12 -0
  26. data/lib/tdiary/filter.rb +5 -2
  27. data/lib/tdiary/io/pstore.rb +6 -3
  28. data/lib/tdiary/plugin/00default.rb +10 -14
  29. data/lib/tdiary/plugin/05referer.rb +6 -6
  30. data/lib/tdiary/plugin/60sf.rb +1 -1
  31. data/lib/tdiary/plugin.rb +76 -16
  32. data/lib/tdiary/request.rb +11 -353
  33. data/lib/tdiary/tasks/db.rake +17 -4
  34. data/lib/tdiary/tasks/heroku.rake +9 -0
  35. data/lib/tdiary/tasks/release.rake +126 -146
  36. data/lib/tdiary/version.rb +1 -1
  37. data/lib/tdiary/view.rb +3 -3
  38. data/lib/tdiary.rb +3 -1
  39. data/misc/convert2.rb +3 -0
  40. data/misc/migrate.rb +3 -0
  41. data/misc/plugin/a.rb +1 -6
  42. data/misc/plugin/amazon.rb +5 -4
  43. data/misc/plugin/calendar2.rb +1 -1
  44. data/misc/plugin/en/disp_referrer.rb +1 -1
  45. data/misc/plugin/ja/disp_referrer.rb +1 -1
  46. data/misc/plugin/kw.rb +2 -21
  47. data/misc/plugin/makelirs.rb +1 -4
  48. data/tdiary.conf.sample +8 -0
  49. data/theme/base.css +15 -0
  50. data/vendor/bundle/ruby/3.4.0/bin/emot +29 -0
  51. data/vendor/bundle/ruby/3.4.0/bin/hikidoc +29 -0
  52. data/vendor/bundle/ruby/3.4.0/bin/rackup +29 -0
  53. data/vendor/bundle/ruby/3.4.0/bin/rake +29 -0
  54. data/vendor/bundle/ruby/3.4.0/bin/thor +29 -0
  55. data/vendor/bundle/ruby/3.4.0/cache/base64-0.3.0.gem +0 -0
  56. data/vendor/bundle/ruby/3.4.0/cache/cgi-0.5.2.gem +0 -0
  57. data/vendor/bundle/ruby/3.4.0/cache/date-3.5.1.gem +0 -0
  58. data/vendor/bundle/ruby/3.4.0/cache/emot-0.0.4.gem +0 -0
  59. data/vendor/bundle/ruby/3.4.0/cache/fastimage-2.4.1.gem +0 -0
  60. data/vendor/bundle/ruby/3.4.0/cache/hikidoc-0.1.1.gem +0 -0
  61. data/vendor/bundle/ruby/3.4.0/cache/logger-1.7.0.gem +0 -0
  62. data/vendor/bundle/ruby/3.4.0/cache/mail-2.9.1.gem +0 -0
  63. data/vendor/bundle/ruby/3.4.0/cache/mini_mime-1.1.5.gem +0 -0
  64. data/vendor/bundle/ruby/3.4.0/cache/net-imap-0.5.15.gem +0 -0
  65. data/vendor/bundle/ruby/3.4.0/cache/net-pop-0.1.2.gem +0 -0
  66. data/vendor/bundle/ruby/3.4.0/cache/net-protocol-0.2.2.gem +0 -0
  67. data/vendor/bundle/ruby/3.4.0/cache/net-smtp-0.5.1.gem +0 -0
  68. data/vendor/bundle/ruby/3.4.0/cache/pstore-0.2.1.gem +0 -0
  69. data/vendor/bundle/ruby/3.4.0/cache/rack-3.2.6.gem +0 -0
  70. data/vendor/bundle/ruby/3.4.0/cache/rack-session-2.1.2.gem +0 -0
  71. data/vendor/bundle/ruby/3.4.0/cache/rackup-2.3.1.gem +0 -0
  72. data/vendor/bundle/ruby/3.4.0/cache/rake-13.4.2.gem +0 -0
  73. data/vendor/bundle/ruby/3.4.0/cache/thor-1.5.0.gem +0 -0
  74. data/vendor/bundle/ruby/3.4.0/cache/timeout-0.6.1.gem +0 -0
  75. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/cgi-0.5.2/cgi/escape.so +0 -0
  76. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/cgi-0.5.2/gem.build_complete +0 -0
  77. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/cgi-0.5.2/gem_make.out +18 -0
  78. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/date_core.so +0 -0
  79. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/gem.build_complete +0 -0
  80. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/gem_make.out +24 -0
  81. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/mkmf.log +93 -0
  82. data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/BSDL +22 -0
  83. data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/COPYING +56 -0
  84. data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/LEGAL +60 -0
  85. data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/README.md +48 -0
  86. data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/lib/base64.rb +381 -0
  87. data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/sig/base64.rbs +355 -0
  88. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/BSDL +22 -0
  89. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/COPYING +56 -0
  90. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/README.md +98 -0
  91. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/Makefile +275 -0
  92. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/depend +2 -0
  93. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/escape.c +487 -0
  94. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/extconf.rb +7 -0
  95. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/cookie.rb +212 -0
  96. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/core.rb +1273 -0
  97. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/escape.rb +227 -0
  98. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/escape.so +0 -0
  99. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/html.rb +1040 -0
  100. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/session/pstore.rb +91 -0
  101. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/session.rb +574 -0
  102. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/util.rb +48 -0
  103. data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi.rb +310 -0
  104. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/BSDL +22 -0
  105. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/COPYING +56 -0
  106. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/README.md +102 -0
  107. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/Makefile +273 -0
  108. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_core.c +10065 -0
  109. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_parse.c +3086 -0
  110. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_strftime.c +638 -0
  111. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_strptime.c +704 -0
  112. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_tmx.h +56 -0
  113. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/extconf.rb +13 -0
  114. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/prereq.mk +19 -0
  115. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/zonetab.h +1564 -0
  116. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/zonetab.list +330 -0
  117. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/lib/date.rb +70 -0
  118. data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/lib/date_core.so +0 -0
  119. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/Gemfile +4 -0
  120. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/LICENSE.txt +22 -0
  121. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/README.md +87 -0
  122. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/Rakefile +7 -0
  123. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/bin/emot +5 -0
  124. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/emot.gemspec +26 -0
  125. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/cli.rb +62 -0
  126. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/map.rb +894 -0
  127. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/symbol_ext.rb +11 -0
  128. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/version.rb +3 -0
  129. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot.rb +34 -0
  130. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/spec/cli_spec.rb +56 -0
  131. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/spec/emot_spec.rb +50 -0
  132. data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/spec/spec_helper.rb +2 -0
  133. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/MIT-LICENSE +20 -0
  134. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/README.md +209 -0
  135. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage.rb +471 -0
  136. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/avif.rb +12 -0
  137. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/bmp.rb +17 -0
  138. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/exif.rb +76 -0
  139. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/fiber_stream.rb +58 -0
  140. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/gif.rb +63 -0
  141. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/heic.rb +8 -0
  142. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/ico.rb +9 -0
  143. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/image_base.rb +17 -0
  144. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/iso_bmff.rb +176 -0
  145. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/jpeg.rb +52 -0
  146. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/jxl.rb +13 -0
  147. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/jxlc.rb +75 -0
  148. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/png.rb +26 -0
  149. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/psd.rb +7 -0
  150. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/stream_util.rb +19 -0
  151. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/svg.rb +69 -0
  152. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/tiff.rb +16 -0
  153. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/type_parser.rb +74 -0
  154. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/webp.rb +60 -0
  155. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/version.rb +5 -0
  156. data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage.rb +73 -0
  157. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/COPYING +28 -0
  158. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/Gemfile +4 -0
  159. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/NEWS +36 -0
  160. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/NEWS.ja +36 -0
  161. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README +95 -0
  162. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README.ja +92 -0
  163. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README.ja.md +112 -0
  164. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README.md +114 -0
  165. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/Rakefile +18 -0
  166. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules +320 -0
  167. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules.ja +318 -0
  168. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules.ja.md +385 -0
  169. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules.md +388 -0
  170. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/bin/hikidoc +70 -0
  171. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/hikidoc.gemspec +24 -0
  172. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/lib/hikidoc.rb +912 -0
  173. data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/test/hikidoc_test.rb +514 -0
  174. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/BSDL +22 -0
  175. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/COPYING +56 -0
  176. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/README.md +104 -0
  177. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/errors.rb +9 -0
  178. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/formatter.rb +36 -0
  179. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/log_device.rb +265 -0
  180. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/period.rb +47 -0
  181. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/severity.rb +38 -0
  182. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/version.rb +5 -0
  183. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger.rb +789 -0
  184. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/MIT-LICENSE +20 -0
  185. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/README.md +771 -0
  186. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/attachments_list.rb +109 -0
  187. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/body.rb +305 -0
  188. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/configuration.rb +78 -0
  189. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/constants.rb +79 -0
  190. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/address.rb +258 -0
  191. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/address_list.rb +34 -0
  192. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_disposition_element.rb +20 -0
  193. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_location_element.rb +17 -0
  194. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_transfer_encoding_element.rb +13 -0
  195. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_type_element.rb +25 -0
  196. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/date_time_element.rb +15 -0
  197. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/envelope_from_element.rb +39 -0
  198. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/message_ids_element.rb +31 -0
  199. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/mime_version_element.rb +15 -0
  200. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/phrase_list.rb +19 -0
  201. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/received_element.rb +35 -0
  202. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements.rb +15 -0
  203. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/7bit.rb +27 -0
  204. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/8bit.rb +18 -0
  205. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/base64.rb +38 -0
  206. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/binary.rb +13 -0
  207. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/identity.rb +24 -0
  208. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/quoted_printable.rb +45 -0
  209. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/transfer_encoding.rb +77 -0
  210. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/unix_to_unix.rb +20 -0
  211. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings.rb +314 -0
  212. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/envelope.rb +28 -0
  213. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/field.rb +313 -0
  214. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/field_list.rb +87 -0
  215. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/bcc_field.rb +49 -0
  216. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/cc_field.rb +33 -0
  217. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/comments_field.rb +31 -0
  218. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_address_field.rb +162 -0
  219. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_date_field.rb +56 -0
  220. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_field.rb +77 -0
  221. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_message_id_field.rb +41 -0
  222. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_description_field.rb +12 -0
  223. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_disposition_field.rb +44 -0
  224. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_id_field.rb +35 -0
  225. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_location_field.rb +28 -0
  226. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_transfer_encoding_field.rb +44 -0
  227. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_type_field.rb +171 -0
  228. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/date_field.rb +28 -0
  229. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/from_field.rb +33 -0
  230. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/in_reply_to_field.rb +45 -0
  231. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/keywords_field.rb +30 -0
  232. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/message_id_field.rb +36 -0
  233. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/mime_version_field.rb +42 -0
  234. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/named_structured_field.rb +10 -0
  235. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/named_unstructured_field.rb +10 -0
  236. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/optional_field.rb +15 -0
  237. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/parameter_hash.rb +61 -0
  238. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/received_field.rb +61 -0
  239. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/references_field.rb +42 -0
  240. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/reply_to_field.rb +33 -0
  241. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_bcc_field.rb +33 -0
  242. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_cc_field.rb +33 -0
  243. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_date_field.rb +10 -0
  244. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_from_field.rb +33 -0
  245. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_message_id_field.rb +10 -0
  246. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_sender_field.rb +32 -0
  247. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_to_field.rb +33 -0
  248. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/return_path_field.rb +60 -0
  249. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/sender_field.rb +45 -0
  250. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/structured_field.rb +24 -0
  251. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/subject_field.rb +14 -0
  252. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/to_field.rb +33 -0
  253. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/unstructured_field.rb +189 -0
  254. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields.rb +45 -0
  255. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/header.rb +237 -0
  256. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/indifferent_hash.rb +147 -0
  257. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/mail.rb +267 -0
  258. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/matchers/attachment_matchers.rb +44 -0
  259. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/matchers/has_sent_mail.rb +201 -0
  260. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/message.rb +2159 -0
  261. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte/chars.rb +318 -0
  262. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte/unicode.rb +405 -0
  263. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte/utils.rb +44 -0
  264. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte.rb +82 -0
  265. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/exim.rb +50 -0
  266. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/file_delivery.rb +43 -0
  267. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
  268. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/sendmail.rb +87 -0
  269. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/smtp.rb +200 -0
  270. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/smtp_connection.rb +57 -0
  271. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/test_mailer.rb +44 -0
  272. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/base.rb +64 -0
  273. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/imap.rb +190 -0
  274. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/pop3.rb +143 -0
  275. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/test_retriever.rb +45 -0
  276. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network.rb +16 -0
  277. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parser_tools.rb +15 -0
  278. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/address_lists_parser.rb +33245 -0
  279. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/address_lists_parser.rl +183 -0
  280. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_disposition_parser.rb +904 -0
  281. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_disposition_parser.rl +93 -0
  282. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_location_parser.rb +825 -0
  283. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_location_parser.rl +82 -0
  284. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_transfer_encoding_parser.rb +525 -0
  285. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_transfer_encoding_parser.rl +75 -0
  286. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_type_parser.rb +1051 -0
  287. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_type_parser.rl +94 -0
  288. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/date_time_parser.rb +894 -0
  289. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/date_time_parser.rl +73 -0
  290. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/envelope_from_parser.rb +3678 -0
  291. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/envelope_from_parser.rl +93 -0
  292. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/message_ids_parser.rb +5164 -0
  293. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/message_ids_parser.rl +97 -0
  294. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/mime_version_parser.rb +516 -0
  295. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/mime_version_parser.rl +72 -0
  296. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/phrase_lists_parser.rb +887 -0
  297. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/phrase_lists_parser.rl +94 -0
  298. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/received_parser.rb +8785 -0
  299. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/received_parser.rl +95 -0
  300. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  301. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  302. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2045_mime.rl +16 -0
  303. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  304. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  305. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  306. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322.rl +74 -0
  307. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322_address.rl +72 -0
  308. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322_date_time.rl +37 -0
  309. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  310. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers.rb +13 -0
  311. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/part.rb +119 -0
  312. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parts_list.rb +131 -0
  313. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/smtp_envelope.rb +57 -0
  314. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/utilities.rb +576 -0
  315. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/values/unicode_tables.dat +0 -0
  316. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/version.rb +17 -0
  317. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/yaml.rb +30 -0
  318. data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail.rb +65 -0
  319. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/CHANGELOG +65 -0
  320. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/CODE_OF_CONDUCT.md +74 -0
  321. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/Gemfile +9 -0
  322. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/LICENSE.txt +21 -0
  323. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/README.md +114 -0
  324. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/Rakefile +97 -0
  325. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bench/bench.rb +51 -0
  326. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bin/console +15 -0
  327. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bin/db_pull_request +20 -0
  328. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bin/setup +8 -0
  329. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/db/content_type_mime.db +880 -0
  330. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/db/ext_mime.db +1201 -0
  331. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/mini_mime/version.rb +4 -0
  332. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/mini_mime.rb +186 -0
  333. data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/mini_mime.gemspec +31 -0
  334. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/BSDL +22 -0
  335. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/COPYING +56 -0
  336. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/Gemfile +25 -0
  337. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/LICENSE.txt +65 -0
  338. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/README.md +77 -0
  339. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/Rakefile +13 -0
  340. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/docs/styles.css +85 -0
  341. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/authenticators.rb +37 -0
  342. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/command_data.rb +507 -0
  343. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_accessors.rb +75 -0
  344. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_inheritance.rb +90 -0
  345. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_type_coercion.rb +74 -0
  346. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_version_defaults.rb +93 -0
  347. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config.rb +500 -0
  348. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/connection_state.rb +48 -0
  349. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/data_encoding.rb +214 -0
  350. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/data_lite.rb +226 -0
  351. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/deprecated_client_options.rb +142 -0
  352. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/errors.rb +118 -0
  353. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/esearch_result.rb +219 -0
  354. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/fetch_data.rb +597 -0
  355. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/flags.rb +262 -0
  356. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_data.rb +1113 -0
  357. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_parser/parser_utils.rb +245 -0
  358. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_parser.rb +2282 -0
  359. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_reader.rb +92 -0
  360. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/anonymous_authenticator.rb +69 -0
  361. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/authentication_exchange.rb +139 -0
  362. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/authenticators.rb +122 -0
  363. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/client_adapter.rb +123 -0
  364. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/cram_md5_authenticator.rb +61 -0
  365. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/digest_md5_authenticator.rb +342 -0
  366. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/external_authenticator.rb +83 -0
  367. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/gs2_header.rb +80 -0
  368. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/login_authenticator.rb +56 -0
  369. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/oauthbearer_authenticator.rb +199 -0
  370. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/plain_authenticator.rb +101 -0
  371. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/protocol_adapters.rb +101 -0
  372. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/scram_algorithm.rb +58 -0
  373. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/scram_authenticator.rb +361 -0
  374. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/stringprep.rb +12 -0
  375. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/xoauth2_authenticator.rb +106 -0
  376. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl.rb +182 -0
  377. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl_adapter.rb +20 -0
  378. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/search_result.rb +145 -0
  379. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sequence_set.rb +1952 -0
  380. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/nameprep.rb +70 -0
  381. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/saslprep.rb +69 -0
  382. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/saslprep_tables.rb +96 -0
  383. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/tables.rb +146 -0
  384. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/trace.rb +85 -0
  385. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep.rb +159 -0
  386. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/uidplus_data.rb +244 -0
  387. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/vanished_data.rb +65 -0
  388. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap.rb +3968 -0
  389. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/net-imap.gemspec +38 -0
  390. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/benchmarks.rake +91 -0
  391. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/rdoc.rake +70 -0
  392. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/rfcs.rake +170 -0
  393. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/saslprep.rake +30 -0
  394. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/string_prep_tables_generator.rb +449 -0
  395. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/sample/net-imap.rb +167 -0
  396. data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/Gemfile +7 -0
  397. data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/LICENSE.txt +22 -0
  398. data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/README.md +66 -0
  399. data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/Rakefile +17 -0
  400. data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/lib/net/pop.rb +1025 -0
  401. data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/net-pop.gemspec +32 -0
  402. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/Gemfile +7 -0
  403. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/LICENSE.txt +22 -0
  404. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/README.md +29 -0
  405. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/Rakefile +10 -0
  406. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/bin/console +14 -0
  407. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/bin/setup +8 -0
  408. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/lib/net/protocol.rb +544 -0
  409. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/net-protocol.gemspec +33 -0
  410. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/LICENSE.txt +2 -0
  411. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/NEWS.md +133 -0
  412. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/README.md +97 -0
  413. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_cram_md5.rb +48 -0
  414. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_login.rb +11 -0
  415. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_plain.rb +9 -0
  416. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_xoauth2.rb +17 -0
  417. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/authenticator.rb +57 -0
  418. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp.rb +1164 -0
  419. data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/net-smtp.gemspec +31 -0
  420. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/BSDL +22 -0
  421. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/COPYING +56 -0
  422. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/Gemfile +10 -0
  423. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/README.md +95 -0
  424. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/Rakefile +10 -0
  425. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/bin/console +14 -0
  426. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/bin/setup +8 -0
  427. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/lib/pstore.rb +736 -0
  428. data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/pstore.gemspec +32 -0
  429. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/CHANGELOG.md +1346 -0
  430. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/CONTRIBUTING.md +144 -0
  431. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/MIT-LICENSE +20 -0
  432. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/README.md +384 -0
  433. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/SPEC.rdoc +258 -0
  434. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/auth/abstract/handler.rb +41 -0
  435. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/auth/abstract/request.rb +51 -0
  436. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/auth/basic.rb +58 -0
  437. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/bad_request.rb +8 -0
  438. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/body_proxy.rb +63 -0
  439. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/builder.rb +296 -0
  440. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/cascade.rb +67 -0
  441. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/common_logger.rb +89 -0
  442. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/conditional_get.rb +87 -0
  443. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/config.rb +22 -0
  444. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/constants.rb +68 -0
  445. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/content_length.rb +34 -0
  446. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/content_type.rb +33 -0
  447. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/deflater.rb +158 -0
  448. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/directory.rb +208 -0
  449. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/etag.rb +71 -0
  450. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/events.rb +172 -0
  451. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/files.rb +216 -0
  452. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/head.rb +25 -0
  453. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/headers.rb +238 -0
  454. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/lint.rb +964 -0
  455. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/lock.rb +29 -0
  456. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/media_type.rb +52 -0
  457. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/method_override.rb +56 -0
  458. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mime.rb +694 -0
  459. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mock.rb +3 -0
  460. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mock_request.rb +161 -0
  461. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mock_response.rb +156 -0
  462. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart/generator.rb +99 -0
  463. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart/parser.rb +621 -0
  464. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart/uploaded_file.rb +82 -0
  465. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart.rb +77 -0
  466. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/null_logger.rb +48 -0
  467. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/query_parser.rb +261 -0
  468. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/recursive.rb +66 -0
  469. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/reloader.rb +112 -0
  470. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/request.rb +790 -0
  471. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/response.rb +403 -0
  472. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/rewindable_input.rb +116 -0
  473. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/runtime.rb +35 -0
  474. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/sendfile.rb +197 -0
  475. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/show_exceptions.rb +409 -0
  476. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/show_status.rb +121 -0
  477. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/static.rb +192 -0
  478. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/tempfile_reaper.rb +33 -0
  479. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/urlmap.rb +99 -0
  480. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/utils.rb +714 -0
  481. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/version.rb +17 -0
  482. data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack.rb +64 -0
  483. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/abstract/id.rb +535 -0
  484. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/constants.rb +13 -0
  485. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/cookie.rb +315 -0
  486. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/encryptor.rb +415 -0
  487. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/pool.rb +82 -0
  488. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/version.rb +10 -0
  489. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session.rb +12 -0
  490. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/license.md +72 -0
  491. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/readme.md +47 -0
  492. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/releases.md +31 -0
  493. data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/security.md +3 -0
  494. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/bin/rackup +5 -0
  495. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/cgi.rb +61 -0
  496. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/webrick.rb +196 -0
  497. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler.rb +113 -0
  498. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/lobster.rb +81 -0
  499. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/server.rb +462 -0
  500. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/stream.rb +199 -0
  501. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/version.rb +8 -0
  502. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup.rb +21 -0
  503. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/license.md +80 -0
  504. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/readme.md +82 -0
  505. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/releases.md +28 -0
  506. data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/security.md +3 -0
  507. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/History.rdoc +2454 -0
  508. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
  509. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/README.rdoc +155 -0
  510. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
  511. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
  512. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
  513. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/a.c +6 -0
  514. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/b.c +6 -0
  515. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/main.c +11 -0
  516. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
  517. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
  518. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
  519. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rake.1 +156 -0
  520. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
  521. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
  522. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/exe/rake +27 -0
  523. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
  524. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
  525. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
  526. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
  527. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
  528. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
  529. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
  530. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
  531. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
  532. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
  533. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
  534. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
  535. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
  536. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
  537. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
  538. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
  539. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
  540. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
  541. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
  542. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
  543. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
  544. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
  545. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
  546. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
  547. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
  548. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
  549. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
  550. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
  551. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
  552. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
  553. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  554. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
  555. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
  556. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
  557. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
  558. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
  559. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
  560. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
  561. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
  562. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
  563. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
  564. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
  565. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
  566. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake.rb +69 -0
  567. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/rake.gemspec +102 -0
  568. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/CONTRIBUTING.md +32 -0
  569. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/LICENSE.md +20 -0
  570. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/README.md +44 -0
  571. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/bin/thor +6 -0
  572. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/create_file.rb +105 -0
  573. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/create_link.rb +61 -0
  574. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/directory.rb +108 -0
  575. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/empty_directory.rb +143 -0
  576. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/file_manipulation.rb +407 -0
  577. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/inject_into_file.rb +163 -0
  578. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions.rb +340 -0
  579. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/base.rb +826 -0
  580. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/command.rb +151 -0
  581. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
  582. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/error.rb +106 -0
  583. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/group.rb +292 -0
  584. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/invocation.rb +178 -0
  585. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/line_editor/basic.rb +37 -0
  586. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/line_editor/readline.rb +88 -0
  587. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/line_editor.rb +17 -0
  588. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/nested_context.rb +29 -0
  589. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/argument.rb +86 -0
  590. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/arguments.rb +195 -0
  591. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/option.rb +178 -0
  592. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/options.rb +294 -0
  593. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser.rb +4 -0
  594. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/rake_compat.rb +72 -0
  595. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/runner.rb +335 -0
  596. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/basic.rb +392 -0
  597. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/color.rb +117 -0
  598. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/column_printer.rb +29 -0
  599. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/html.rb +84 -0
  600. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/lcs_diff.rb +49 -0
  601. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/table_printer.rb +118 -0
  602. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/terminal.rb +42 -0
  603. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/wrapped_printer.rb +38 -0
  604. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell.rb +81 -0
  605. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/util.rb +285 -0
  606. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/version.rb +3 -0
  607. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor.rb +707 -0
  608. data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/thor.gemspec +33 -0
  609. data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/BSDL +22 -0
  610. data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/COPYING +56 -0
  611. data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/Gemfile +10 -0
  612. data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/README.md +39 -0
  613. data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/lib/timeout.rb +314 -0
  614. data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/timeout.gemspec +33 -0
  615. data/vendor/bundle/ruby/3.4.0/specifications/base64-0.3.0.gemspec +23 -0
  616. data/vendor/bundle/ruby/3.4.0/specifications/cgi-0.5.2.gemspec +25 -0
  617. data/vendor/bundle/ruby/3.4.0/specifications/date-3.5.1.gemspec +25 -0
  618. data/vendor/bundle/ruby/3.4.0/specifications/emot-0.0.4.gemspec +30 -0
  619. data/vendor/bundle/ruby/3.4.0/specifications/fastimage-2.4.1.gemspec +32 -0
  620. data/vendor/bundle/ruby/3.4.0/specifications/hikidoc-0.1.1.gemspec +28 -0
  621. data/vendor/bundle/ruby/3.4.0/specifications/logger-1.7.0.gemspec +22 -0
  622. data/vendor/bundle/ruby/3.4.0/specifications/mail-2.9.1.gemspec +38 -0
  623. data/vendor/bundle/ruby/3.4.0/specifications/mini_mime-1.1.5.gemspec +30 -0
  624. data/vendor/bundle/ruby/3.4.0/specifications/net-imap-0.5.15.gemspec +28 -0
  625. data/vendor/bundle/ruby/3.4.0/specifications/net-pop-0.1.2.gemspec +26 -0
  626. data/vendor/bundle/ruby/3.4.0/specifications/net-protocol-0.2.2.gemspec +26 -0
  627. data/vendor/bundle/ruby/3.4.0/specifications/net-smtp-0.5.1.gemspec +26 -0
  628. data/vendor/bundle/ruby/3.4.0/specifications/pstore-0.2.1.gemspec +22 -0
  629. data/vendor/bundle/ruby/3.4.0/specifications/rack-3.2.6.gemspec +31 -0
  630. data/vendor/bundle/ruby/3.4.0/specifications/rack-session-2.1.2.gemspec +30 -0
  631. data/vendor/bundle/ruby/3.4.0/specifications/rackup-2.3.1.gemspec +26 -0
  632. data/vendor/bundle/ruby/3.4.0/specifications/rake-13.4.2.gemspec +26 -0
  633. data/vendor/bundle/ruby/3.4.0/specifications/thor-1.5.0.gemspec +28 -0
  634. data/vendor/bundle/ruby/3.4.0/specifications/timeout-0.6.1.gemspec +22 -0
  635. metadata +595 -20
  636. data/js/02edit.js +0 -15
  637. data/lib/tdiary/compatible.rb +0 -56
  638. data/misc/lib/fcgi_patch.rb +0 -89
  639. data/misc/paas/heroku/Gemfile.local +0 -12
  640. data/misc/paas/heroku/Gemfile.lock +0 -287
  641. data/public/index.rdf +0 -22
@@ -0,0 +1,1952 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "set" unless defined?(::Set)
4
+
5
+ module Net
6
+ class IMAP
7
+
8
+ ##
9
+ # An \IMAP sequence set is a set of message sequence numbers or unique
10
+ # identifier numbers ("UIDs"). It contains numbers and ranges of numbers.
11
+ # The numbers are all non-zero unsigned 32-bit integers and one special
12
+ # value (<tt>"*"</tt>) that represents the largest value in the mailbox.
13
+ #
14
+ # Certain types of \IMAP responses will contain a SequenceSet, for example
15
+ # the data for a <tt>"MODIFIED"</tt> ResponseCode. Some \IMAP commands may
16
+ # receive a SequenceSet as an argument, for example IMAP#search, IMAP#fetch,
17
+ # and IMAP#store.
18
+ #
19
+ # == Creating sequence sets
20
+ #
21
+ # SequenceSet.new may receive a single optional argument: a non-zero 32 bit
22
+ # unsigned integer, a range, a <tt>sequence-set</tt> formatted string,
23
+ # another SequenceSet, a Set (containing only numbers or <tt>*</tt>), or an
24
+ # Array containing any of these (array inputs may be nested).
25
+ #
26
+ # set = Net::IMAP::SequenceSet.new(1)
27
+ # set.valid_string #=> "1"
28
+ # set = Net::IMAP::SequenceSet.new(1..100)
29
+ # set.valid_string #=> "1:100"
30
+ # set = Net::IMAP::SequenceSet.new(1...100)
31
+ # set.valid_string #=> "1:99"
32
+ # set = Net::IMAP::SequenceSet.new([1, 2, 5..])
33
+ # set.valid_string #=> "1:2,5:*"
34
+ # set = Net::IMAP::SequenceSet.new("1,2,3:7,5,6:10,2048,1024")
35
+ # set.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
36
+ # set = Net::IMAP::SequenceSet.new(1, 2, 3..7, 5, 6..10, 2048, 1024)
37
+ # set.valid_string #=> "1:10,55,1024:2048"
38
+ #
39
+ # SequenceSet.new with no arguments creates an empty sequence set. Note
40
+ # that an empty sequence set is invalid in the \IMAP grammar.
41
+ #
42
+ # set = Net::IMAP::SequenceSet.new
43
+ # set.empty? #=> true
44
+ # set.valid? #=> false
45
+ # set.valid_string #!> raises DataFormatError
46
+ # set << 1..10
47
+ # set.empty? #=> false
48
+ # set.valid? #=> true
49
+ # set.valid_string #=> "1:10"
50
+ #
51
+ # Using SequenceSet.new with another SequenceSet input behaves the same as
52
+ # calling #dup on the other set. The input's #string will be preserved.
53
+ #
54
+ # input = Net::IMAP::SequenceSet.new("1,2,3:7,5,6:10,2048,1024")
55
+ # copy = Net::IMAP::SequenceSet.new(input)
56
+ # input.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
57
+ # copy.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
58
+ # copy2 = input.dup # same as calling new with a SequenceSet input
59
+ # copy == input #=> true, same set membership
60
+ # copy.eql? input #=> true, same string value
61
+ # copy.equal? input #=> false, different objects
62
+ #
63
+ # copy.normalize!
64
+ # copy.valid_string #=> "1:10,1024,2048"
65
+ # copy == input #=> true, same set membership
66
+ # copy.eql? input #=> false, different string value
67
+ #
68
+ # copy << 999
69
+ # copy.valid_string #=> "1:10,999,1024,2048"
70
+ # copy == input #=> false, different set membership
71
+ # copy.eql? input #=> false, different string value
72
+ #
73
+ # Use Net::IMAP::SequenceSet() to coerce a single (optional) input.
74
+ # A SequenceSet input is returned without duplication, even when frozen.
75
+ #
76
+ # set = Net::IMAP::SequenceSet()
77
+ # set.string #=> nil
78
+ # set.frozen? #=> false
79
+ #
80
+ # # String order is preserved
81
+ # set = Net::IMAP::SequenceSet("1,2,3:7,5,6:10,2048,1024")
82
+ # set.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
83
+ # set.frozen? #=> false
84
+ #
85
+ # # Other inputs are normalized
86
+ # set = Net::IMAP::SequenceSet([1, 2, [3..7, 5], 6..10, 2048, 1024])
87
+ # set.valid_string #=> "1:10,1024,2048"
88
+ # set.frozen? #=> false
89
+ #
90
+ # unfrozen = set
91
+ # frozen = set.dup.freeze
92
+ # unfrozen.equal? Net::IMAP::SequenceSet(unfrozen) #=> true
93
+ # frozen.equal? Net::IMAP::SequenceSet(frozen) #=> true
94
+ #
95
+ # Use ::[] to coerce one or more arguments into a valid frozen SequenceSet.
96
+ # A valid frozen SequenceSet is returned directly, without allocating a new
97
+ # object. ::[] will not create an invalid (empty) set.
98
+ #
99
+ # Net::IMAP::SequenceSet[] #!> raises ArgumentError
100
+ # Net::IMAP::SequenceSet[nil] #!> raises DataFormatError
101
+ # Net::IMAP::SequenceSet[""] #!> raises DataFormatError
102
+ #
103
+ # # String order is preserved
104
+ # set = Net::IMAP::SequenceSet["1,2,3:7,5,6:10,2048,1024"]
105
+ # set.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
106
+ # set.frozen? #=> true
107
+ #
108
+ # # Other inputs are normalized
109
+ # set = Net::IMAP::SequenceSet[1, 2, [3..7, 5], 6..10, 2048, 1024]
110
+ # set.valid_string #=> "1:10,1024,2048"
111
+ # set.frozen? #=> true
112
+ #
113
+ # frozen = set
114
+ # unfrozen = set.dup
115
+ # frozen.equal? Net::IMAP::SequenceSet[frozen] #=> true
116
+ # unfrozen.equal? Net::IMAP::SequenceSet[unfrozen] #=> false
117
+ #
118
+ # Objects which respond to +to_sequence_set+ (such as SearchResult and
119
+ # ThreadMember) can be coerced to a SequenceSet with ::new, ::try_convert,
120
+ # ::[], or Net::IMAP::SequenceSet.
121
+ #
122
+ # search = imap.uid_search(["SUBJECT", "hello", "NOT", "SEEN"])
123
+ # seqset = Net::IMAP::SequenceSet(search) - already_fetched
124
+ # fetch = imap.uid_fetch(seqset, "FAST")
125
+ #
126
+ # == Ordered and Normalized sets
127
+ #
128
+ # Sometimes the order of the set's members is significant, such as with the
129
+ # +ESORT+, <tt>CONTEXT=SORT</tt>, and +UIDPLUS+ extensions. So, when a
130
+ # sequence set is created from a single string (such as by the parser), that
131
+ # #string representation is preserved. Assigning a string with #string= or
132
+ # #replace will also preserve that string. Use #each_entry, #entries, or
133
+ # #each_ordered_number to enumerate the entries in their #string order.
134
+ # Hash equality (using #eql?) is based on the string representation.
135
+ #
136
+ # Internally, SequenceSet uses a normalized uint32 set representation which
137
+ # sorts and de-duplicates all numbers and coalesces adjacent or overlapping
138
+ # entries. Many methods use this sorted set representation for <tt>O(lg
139
+ # n)</tt> searches. Use #each_element, #elements, #each_range, #ranges,
140
+ # #each_number, or #numbers to enumerate the set in sorted order. Basic
141
+ # object equality (using #==) is based on set membership, without regard to
142
+ # #entry order or #string normalization.
143
+ #
144
+ # Most modification methods reset #string to its #normalized form, so that
145
+ # #entries and #elements are identical. Use #append to preserve #entries
146
+ # order while modifying a set.
147
+ #
148
+ # == Using <tt>*</tt>
149
+ #
150
+ # \IMAP sequence sets may contain a special value <tt>"*"</tt>, which
151
+ # represents the largest number in use. From +seq-number+ in
152
+ # {RFC9051 §9}[https://www.rfc-editor.org/rfc/rfc9051.html#section-9-5]:
153
+ # >>>
154
+ # In the case of message sequence numbers, it is the number of messages
155
+ # in a non-empty mailbox. In the case of unique identifiers, it is the
156
+ # unique identifier of the last message in the mailbox or, if the
157
+ # mailbox is empty, the mailbox's current UIDNEXT value.
158
+ #
159
+ # When creating a SequenceSet, <tt>*</tt> may be input as <tt>-1</tt>,
160
+ # <tt>"*"</tt>, <tt>:*</tt>, an endless range, or a range ending in
161
+ # <tt>-1</tt>. When converting to #elements, #ranges, or #numbers, it will
162
+ # output as either <tt>:*</tt> or an endless range. For example:
163
+ #
164
+ # Net::IMAP::SequenceSet["1,3,*"].to_a #=> [1, 3, :*]
165
+ # Net::IMAP::SequenceSet["1,234:*"].to_a #=> [1, 234..]
166
+ # Net::IMAP::SequenceSet[1234..-1].to_a #=> [1234..]
167
+ # Net::IMAP::SequenceSet[1234..].to_a #=> [1234..]
168
+ #
169
+ # Net::IMAP::SequenceSet[1234..].to_s #=> "1234:*"
170
+ # Net::IMAP::SequenceSet[1234..-1].to_s #=> "1234:*"
171
+ #
172
+ # Use #limit to convert <tt>"*"</tt> to a maximum value. When a range
173
+ # includes <tt>"*"</tt>, the maximum value will always be matched:
174
+ #
175
+ # Net::IMAP::SequenceSet["9999:*"].limit(max: 25)
176
+ # #=> Net::IMAP::SequenceSet["25"]
177
+ #
178
+ # === Surprising <tt>*</tt> behavior
179
+ #
180
+ # When a set includes <tt>*</tt>, some methods may have surprising behavior.
181
+ #
182
+ # For example, #complement treats <tt>*</tt> as its own number. This way,
183
+ # the #intersection of a set and its #complement will always be empty. And
184
+ # <tt>*</tt> is sorted as greater than any other number in the set. This is
185
+ # not how an \IMAP server interprets the set: it will convert <tt>*</tt> to
186
+ # the number of messages in the mailbox, the +UID+ of the last message in
187
+ # the mailbox, or +UIDNEXT+, as appropriate. Several methods have an
188
+ # argument for how <tt>*</tt> should be interpreted.
189
+ #
190
+ # But, for example, this means that there may be overlap between a set and
191
+ # its complement after #limit is applied to each:
192
+ #
193
+ # ~Net::IMAP::SequenceSet["*"] == Net::IMAP::SequenceSet[1..(2**32-1)]
194
+ # ~Net::IMAP::SequenceSet[1..5] == Net::IMAP::SequenceSet["6:*"]
195
+ #
196
+ # set = Net::IMAP::SequenceSet[1..5]
197
+ # (set & ~set).empty? => true
198
+ #
199
+ # (set.limit(max: 4) & (~set).limit(max: 4)).to_a => [4]
200
+ #
201
+ # When counting the number of numbers in a set, <tt>*</tt> will be counted
202
+ # _except_ when UINT32_MAX is also in the set:
203
+ # UINT32_MAX = 2**32 - 1
204
+ # Net::IMAP::SequenceSet["*"].count => 1
205
+ # Net::IMAP::SequenceSet[1..UINT32_MAX - 1, :*].count => UINT32_MAX
206
+ #
207
+ # Net::IMAP::SequenceSet["1:*"].count => UINT32_MAX
208
+ # Net::IMAP::SequenceSet[UINT32_MAX, :*].count => 1
209
+ # Net::IMAP::SequenceSet[UINT32_MAX..].count => 1
210
+ #
211
+ # == What's here?
212
+ #
213
+ # SequenceSet provides methods for:
214
+ # * {Creating a SequenceSet}[rdoc-ref:SequenceSet@Methods+for+Creating+a+SequenceSet]
215
+ # * {Comparing}[rdoc-ref:SequenceSet@Methods+for+Comparing]
216
+ # * {Querying}[rdoc-ref:SequenceSet@Methods+for+Querying]
217
+ # * {Iterating}[rdoc-ref:SequenceSet@Methods+for+Iterating]
218
+ # * {Set Operations}[rdoc-ref:SequenceSet@Methods+for+Set+Operations]
219
+ # * {Assigning}[rdoc-ref:SequenceSet@Methods+for+Assigning]
220
+ # * {Deleting}[rdoc-ref:SequenceSet@Methods+for+Deleting]
221
+ # * {IMAP String Formatting}[rdoc-ref:SequenceSet@Methods+for+IMAP+String+Formatting]
222
+ #
223
+ # === Methods for Creating a \SequenceSet
224
+ # * ::[]: Creates a validated frozen sequence set from one or more inputs.
225
+ # * ::new: Creates a new mutable sequence set, which may be empty (invalid).
226
+ # * ::try_convert: Calls +to_sequence_set+ on an object and verifies that
227
+ # the result is a SequenceSet.
228
+ # * Net::IMAP::SequenceSet(): Coerce an input using ::try_convert or ::new.
229
+ # * ::empty: Returns a frozen empty (invalid) SequenceSet.
230
+ # * ::full: Returns a frozen SequenceSet containing every possible number.
231
+ #
232
+ # === Methods for Comparing
233
+ #
234
+ # <i>Comparison to another \SequenceSet:</i>
235
+ # - #==: Returns whether a given set contains the same numbers as +self+.
236
+ # - #eql?: Returns whether a given set uses the same #string as +self+.
237
+ #
238
+ # <i>Comparison to objects which are convertible to \SequenceSet:</i>
239
+ # - #===:
240
+ # Returns whether a given object is fully contained within +self+, or
241
+ # +nil+ if the object cannot be converted to a compatible type.
242
+ # - #cover?:
243
+ # Returns whether a given object is fully contained within +self+.
244
+ # - #intersect? (aliased as #overlap?):
245
+ # Returns whether +self+ and a given object have any common elements.
246
+ # - #disjoint?:
247
+ # Returns whether +self+ and a given object have no common elements.
248
+ #
249
+ # === Methods for Querying
250
+ # These methods do not modify +self+.
251
+ #
252
+ # <i>Set membership:</i>
253
+ # - #include? (aliased as #member?):
254
+ # Returns whether a given element is contained by the set.
255
+ # - #include_star?: Returns whether the set contains <tt>*</tt>.
256
+ #
257
+ # <i>Minimum and maximum value elements:</i>
258
+ # - #min: Returns one or more of the lowest numbers in the set.
259
+ # - #max: Returns one or more of the highest numbers in the set.
260
+ # - #minmax: Returns the lowest and highest numbers in the set.
261
+ #
262
+ # <i>Accessing value by offset in sorted set:</i>
263
+ # - #[] (aliased as #slice): Returns the number or consecutive subset at a
264
+ # given offset or range of offsets in the sorted set.
265
+ # - #at: Returns the number at a given offset in the sorted set.
266
+ # - #find_index: Returns the given number's offset in the sorted set.
267
+ #
268
+ # <i>Accessing value by offset in ordered entries</i>
269
+ # - #ordered_at: Returns the number at a given offset in the ordered entries.
270
+ # - #find_ordered_index: Returns the index of the given number's first
271
+ # occurrence in entries.
272
+ #
273
+ # <i>Set cardinality:</i>
274
+ # - #count (aliased as #size): Returns the count of numbers in the set.
275
+ # Duplicated numbers are not counted.
276
+ # - #empty?: Returns whether the set has no members. \IMAP syntax does not
277
+ # allow empty sequence sets.
278
+ # - #valid?: Returns whether the set has any members.
279
+ # - #full?: Returns whether the set contains every possible value, including
280
+ # <tt>*</tt>.
281
+ #
282
+ # <i>Denormalized properties:</i>
283
+ # - #has_duplicates?: Returns whether the ordered entries repeat any
284
+ # numbers.
285
+ # - #count_duplicates: Returns the count of repeated numbers in the ordered
286
+ # entries.
287
+ # - #count_with_duplicates: Returns the count of numbers in the ordered
288
+ # entries, including any repeated numbers.
289
+ #
290
+ # === Methods for Iterating
291
+ #
292
+ # <i>Normalized (sorted and coalesced):</i>
293
+ # - #each_element: Yields each number and range in the set, sorted and
294
+ # coalesced, and returns +self+.
295
+ # - #elements (aliased as #to_a): Returns an Array of every number and range
296
+ # in the set, sorted and coalesced.
297
+ # - #each_range:
298
+ # Yields each element in the set as a Range and returns +self+.
299
+ # - #ranges: Returns an Array of every element in the set, converting
300
+ # numbers into ranges of a single value.
301
+ # - #each_number: Yields each number in the set and returns +self+.
302
+ # - #numbers: Returns an Array with every number in the set, expanding
303
+ # ranges into all of their contained numbers.
304
+ # - #to_set: Returns a Set containing all of the #numbers in the set.
305
+ #
306
+ # <i>Order preserving:</i>
307
+ # - #each_entry: Yields each number and range in the set, unsorted and
308
+ # without deduplicating numbers or coalescing ranges, and returns +self+.
309
+ # - #entries: Returns an Array of every number and range in the set,
310
+ # unsorted and without deduplicating numbers or coalescing ranges.
311
+ # - #each_ordered_number: Yields each number in the ordered entries and
312
+ # returns +self+.
313
+ #
314
+ # === Methods for \Set Operations
315
+ # These methods do not modify +self+.
316
+ #
317
+ # - #| (aliased as #union and #+): Returns a new set combining all members
318
+ # from +self+ with all members from the other set.
319
+ # - #& (aliased as #intersection): Returns a new set containing all members
320
+ # common to +self+ and the other set.
321
+ # - #- (aliased as #difference): Returns a copy of +self+ with all members
322
+ # in the other set removed.
323
+ # - #^ (aliased as #xor): Returns a new set containing all members from
324
+ # +self+ and the other set except those common to both.
325
+ # - #~ (aliased as #complement): Returns a new set containing all members
326
+ # that are not in +self+
327
+ # - #above: Return a copy of +self+ which only contains numbers above a
328
+ # given number.
329
+ # - #below: Return a copy of +self+ which only contains numbers below a
330
+ # given value.
331
+ # - #limit: Returns a copy of +self+ which has replaced <tt>*</tt> with a
332
+ # given maximum value and removed all members over that maximum.
333
+ #
334
+ # === Methods for Assigning
335
+ # These methods add or replace elements in +self+.
336
+ #
337
+ # <i>Normalized (sorted and coalesced):</i>
338
+ #
339
+ # These methods always update #string to be fully sorted and coalesced.
340
+ #
341
+ # - #add (aliased as #<<): Adds a given element to the set; returns +self+.
342
+ # - #add?: If the given element is not fully included the set, adds it and
343
+ # returns +self+; otherwise, returns +nil+.
344
+ # - #merge: Adds all members of the given sets into this set; returns +self+.
345
+ # - #complement!: Replaces the contents of the set with its own #complement.
346
+ #
347
+ # <i>Order preserving:</i>
348
+ #
349
+ # These methods _may_ cause #string to not be sorted or coalesced.
350
+ #
351
+ # - #append: Adds the given entry to the set, appending it to the existing
352
+ # string, and returns +self+.
353
+ # - #string=: Assigns a new #string value and replaces #elements to match.
354
+ # - #replace: Replaces the contents of the set with the contents
355
+ # of a given object.
356
+ #
357
+ # === Methods for Deleting
358
+ # These methods remove elements from +self+, and update #string to be fully
359
+ # sorted and coalesced.
360
+ #
361
+ # - #clear: Removes all elements in the set; returns +self+.
362
+ # - #delete: Removes a given element from the set; returns +self+.
363
+ # - #delete?: If the given element is included in the set, removes it and
364
+ # returns it; otherwise, returns +nil+.
365
+ # - #delete_at: Removes the number at a given offset.
366
+ # - #slice!: Removes the number or consecutive numbers at a given offset or
367
+ # range of offsets.
368
+ # - #subtract: Removes all members of the given sets from this set; returns
369
+ # +self+.
370
+ # - #limit!: Replaces <tt>*</tt> with a given maximum value and removes all
371
+ # members over that maximum; returns +self+.
372
+ #
373
+ # === Methods for \IMAP String Formatting
374
+ #
375
+ # - #to_s: Returns the +sequence-set+ string, or an empty string when the
376
+ # set is empty.
377
+ # - #string: Returns the +sequence-set+ string, or nil when empty.
378
+ # - #valid_string: Returns the +sequence-set+ string, or raises
379
+ # DataFormatError when the set is empty.
380
+ # - #normalized_string: Returns a <tt>sequence-set</tt> string with its
381
+ # elements sorted and coalesced, or nil when the set is empty.
382
+ # - #normalize: Returns a new set with this set's normalized +sequence-set+
383
+ # representation.
384
+ # - #normalize!: Updates #string to its normalized +sequence-set+
385
+ # representation and returns +self+.
386
+ #
387
+ class SequenceSet
388
+ # The largest possible non-zero unsigned 32-bit integer
389
+ UINT32_MAX = 2**32 - 1
390
+
391
+ # represents "*" internally, to simplify sorting (etc)
392
+ STAR_INT = UINT32_MAX + 1
393
+ private_constant :STAR_INT
394
+
395
+ # valid inputs for "*"
396
+ STARS = [:*, ?*, -1].freeze
397
+ private_constant :STARS
398
+
399
+ INSPECT_MAX_LEN = 512
400
+ INSPECT_TRUNCATE_LEN = 16
401
+ private_constant :INSPECT_MAX_LEN, :INSPECT_TRUNCATE_LEN
402
+
403
+ # /(,\d+){100}\z/ is shockingly slow on huge strings.
404
+ # /(,\d{0,10}){100}\z/ is ok, but ironically, Regexp.linear_time? is false.
405
+ #
406
+ # This unrolls all nested quantifiers. It's much harder to read, but it's
407
+ # also the fastest out of all the versions I tested.
408
+ nz_uint32 = /[1-9](?:\d(?:\d(?:\d(?:\d(?:\d(?:\d(?:\d(?:\d(?:\d)?)?)?)?)?)?)?)?)?/
409
+ num_or_star = /#{nz_uint32}|\*/
410
+ entry = /#{num_or_star}(?::#{num_or_star})?/
411
+ entries = ([entry] * INSPECT_TRUNCATE_LEN).join(",")
412
+ INSPECT_ABRIDGED_HEAD_RE = /\A#{entries},/
413
+ INSPECT_ABRIDGED_TAIL_RE = /,#{entries}\z/
414
+ private_constant :INSPECT_ABRIDGED_HEAD_RE, :INSPECT_ABRIDGED_TAIL_RE
415
+
416
+ class << self
417
+
418
+ # :call-seq:
419
+ # SequenceSet[*inputs] -> valid frozen sequence set
420
+ #
421
+ # Returns a frozen SequenceSet, constructed from +inputs+.
422
+ #
423
+ # When only a single valid frozen SequenceSet is given, that same set is
424
+ # returned.
425
+ #
426
+ # An empty SequenceSet is invalid and will raise a DataFormatError.
427
+ #
428
+ # Use ::new to create a mutable or empty SequenceSet.
429
+ #
430
+ # Related: ::new, Net::IMAP::SequenceSet(), ::try_convert
431
+ def [](first, *rest)
432
+ if rest.empty?
433
+ set = try_convert(first)&.validate
434
+ set&.frozen? ? set : (set&.dup || new(first).validate).freeze
435
+ else
436
+ new(first).merge(*rest).validate.freeze
437
+ end
438
+ end
439
+
440
+ # :call-seq:
441
+ # SequenceSet.try_convert(obj) -> sequence set or nil
442
+ #
443
+ # If +obj+ is a SequenceSet, returns +obj+. If +obj+ responds_to
444
+ # +to_sequence_set+, calls +obj.to_sequence_set+ and returns the result.
445
+ # Otherwise returns +nil+.
446
+ #
447
+ # If +obj.to_sequence_set+ doesn't return a SequenceSet or +nil+, an
448
+ # exception is raised.
449
+ #
450
+ # Related: Net::IMAP::SequenceSet(), ::new, ::[]
451
+ def try_convert(obj)
452
+ return obj if obj.is_a?(SequenceSet)
453
+ return nil unless obj.respond_to?(:to_sequence_set)
454
+ return nil unless obj = obj.to_sequence_set
455
+ return obj if obj.is_a?(SequenceSet)
456
+ raise DataFormatError, "invalid object returned from to_sequence_set"
457
+ end
458
+
459
+ # Returns a frozen empty set singleton. Note that valid \IMAP sequence
460
+ # sets cannot be empty, so this set is _invalid_.
461
+ def empty; EMPTY end
462
+
463
+ # Returns a frozen full set singleton: <tt>"1:*"</tt>
464
+ def full; FULL end
465
+
466
+ end
467
+
468
+ # Create a new SequenceSet object from +input+, which may be another
469
+ # SequenceSet, an IMAP formatted +sequence-set+ string, a non-zero 32 bit
470
+ # unsigned integer, a range, <tt>:*</tt>, a Set of numbers or <tt>*</tt>,
471
+ # an object that responds to +to_sequence_set+ (such as SearchResult) or
472
+ # an Array of these (array inputs may be nested).
473
+ #
474
+ # set = Net::IMAP::SequenceSet.new(1)
475
+ # set.valid_string #=> "1"
476
+ # set = Net::IMAP::SequenceSet.new(1..100)
477
+ # set.valid_string #=> "1:100"
478
+ # set = Net::IMAP::SequenceSet.new(1...100)
479
+ # set.valid_string #=> "1:99"
480
+ # set = Net::IMAP::SequenceSet.new([1, 2, 5..])
481
+ # set.valid_string #=> "1:2,5:*"
482
+ # set = Net::IMAP::SequenceSet.new("1,2,3:7,5,6:10,2048,1024")
483
+ # set.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
484
+ # set = Net::IMAP::SequenceSet.new(1, 2, 3..7, 5, 6..10, 2048, 1024)
485
+ # set.valid_string #=> "1:10,1024,2048"
486
+ #
487
+ # With no arguments (or +nil+) creates an empty sequence set. Note that
488
+ # an empty sequence set is invalid in the \IMAP grammar.
489
+ #
490
+ # set = Net::IMAP::SequenceSet.new
491
+ # set.empty? #=> true
492
+ # set.valid? #=> false
493
+ # set.valid_string #!> raises DataFormatError
494
+ # set << 1..10
495
+ # set.empty? #=> false
496
+ # set.valid? #=> true
497
+ # set.valid_string #=> "1:10"
498
+ #
499
+ # When +input+ is a SequenceSet, ::new behaves the same as calling #dup on
500
+ # that other set. The input's #string will be preserved.
501
+ #
502
+ # input = Net::IMAP::SequenceSet.new("1,2,3:7,5,6:10,2048,1024")
503
+ # copy = Net::IMAP::SequenceSet.new(input)
504
+ # input.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
505
+ # copy.valid_string #=> "1,2,3:7,5,6:10,2048,1024"
506
+ # copy2 = input.dup # same as calling new with a SequenceSet input
507
+ # copy == input #=> true, same set membership
508
+ # copy.eql? input #=> true, same string value
509
+ # copy.equal? input #=> false, different objects
510
+ #
511
+ # copy.normalize!
512
+ # copy.valid_string #=> "1:10,1024,2048"
513
+ # copy == input #=> true, same set membership
514
+ # copy.eql? input #=> false, different string value
515
+ #
516
+ # copy << 999
517
+ # copy.valid_string #=> "1:10,999,1024,2048"
518
+ # copy == input #=> false, different set membership
519
+ # copy.eql? input #=> false, different string value
520
+ #
521
+ # === Alternative set creation methods
522
+ #
523
+ # * ::[] returns a frozen validated (non-empty) SequenceSet, without
524
+ # allocating a new object when the input is already a valid frozen
525
+ # SequenceSet.
526
+ # * Net::IMAP::SequenceSet() coerces an input to SequenceSet, without
527
+ # allocating a new object when the input is already a SequenceSet.
528
+ # * ::try_convert calls +to_sequence_set+ on inputs that support it and
529
+ # returns +nil+ for inputs that don't.
530
+ # * ::empty and ::full both return frozen singleton sets which can be
531
+ # combined with set operations (#|, #&, #^, #-, etc) to make new sets.
532
+ #
533
+ # See SequenceSet@Creating+sequence+sets.
534
+ def initialize(input = nil) input ? replace(input) : clear end
535
+
536
+ # Removes all elements and returns self.
537
+ def clear
538
+ modifying! # redundant check, to normalize the error message for JRuby
539
+ @tuples, @string = [], nil
540
+ self
541
+ end
542
+
543
+ # Replace the contents of the set with the contents of +other+ and returns
544
+ # +self+.
545
+ #
546
+ # +other+ may be another SequenceSet or any other object that would be
547
+ # accepted by ::new.
548
+ def replace(other)
549
+ case other
550
+ when SequenceSet then
551
+ modifying! # short circuit before doing any work
552
+ @tuples = other.deep_copy_tuples
553
+ @string = other.instance_variable_get(:@string)
554
+ when String then self.string = other
555
+ else clear; merge other
556
+ end
557
+ self
558
+ end
559
+
560
+ # Returns the \IMAP +sequence-set+ string representation, or raises a
561
+ # DataFormatError when the set is empty.
562
+ #
563
+ # Use #string to return +nil+ or #to_s to return an empty string without
564
+ # error.
565
+ #
566
+ # Related: #string, #normalized_string, #to_s
567
+ def valid_string
568
+ raise DataFormatError, "empty sequence-set" if empty?
569
+ string
570
+ end
571
+
572
+ # Returns the \IMAP +sequence-set+ string representation, or +nil+ when
573
+ # the set is empty. Note that an empty set is invalid in the \IMAP
574
+ # syntax.
575
+ #
576
+ # Use #valid_string to raise an exception when the set is empty, or #to_s
577
+ # to return an empty string.
578
+ #
579
+ # If the set was created from a single string, it is not normalized. If
580
+ # the set is updated the string will be normalized.
581
+ #
582
+ # Related: #valid_string, #normalized_string, #to_s, #inspect
583
+ def string; @string ||= normalized_string if valid? end
584
+
585
+ # Returns an array with #normalized_string when valid and an empty array
586
+ # otherwise.
587
+ def deconstruct; valid? ? [normalized_string] : [] end
588
+
589
+ # Assigns a new string to #string and resets #elements to match.
590
+ # Assigning +nil+ or an empty string are equivalent to calling #clear.
591
+ #
592
+ # Non-empty strings are validated but not normalized.
593
+ #
594
+ # Use #add, #merge, or #append to add a string to an existing set.
595
+ #
596
+ # Related: #replace, #clear
597
+ def string=(input)
598
+ if input.nil?
599
+ clear
600
+ elsif (str = String.try_convert(input))
601
+ modifying! # short-circuit before parsing the string
602
+ tuples = str_to_tuples str
603
+ @tuples, @string = [], -str
604
+ tuples_add tuples
605
+ else
606
+ raise ArgumentError, "expected a string or nil, got #{input.class}"
607
+ end
608
+ str
609
+ end
610
+
611
+ # Returns the \IMAP +sequence-set+ string representation, or an empty
612
+ # string when the set is empty. Note that an empty set is invalid in the
613
+ # \IMAP syntax.
614
+ #
615
+ # Related: #string, #valid_string, #normalized_string, #inspect
616
+ def to_s; string || "" end
617
+
618
+ # Freezes and returns the set. A frozen SequenceSet is Ractor-safe.
619
+ def freeze
620
+ return self if frozen?
621
+ string
622
+ @tuples.each(&:freeze).freeze
623
+ super
624
+ end
625
+
626
+ # :call-seq: self == other -> true or false
627
+ #
628
+ # Returns true when the other SequenceSet represents the same message
629
+ # identifiers. Encoding difference—such as order, overlaps, or
630
+ # duplicates—are ignored.
631
+ #
632
+ # Net::IMAP::SequenceSet["1:3"] == Net::IMAP::SequenceSet["1:3"]
633
+ # #=> true
634
+ # Net::IMAP::SequenceSet["1,2,3"] == Net::IMAP::SequenceSet["1:3"]
635
+ # #=> true
636
+ # Net::IMAP::SequenceSet["1,3"] == Net::IMAP::SequenceSet["3,1"]
637
+ # #=> true
638
+ # Net::IMAP::SequenceSet["9,1:*"] == Net::IMAP::SequenceSet["1:*"]
639
+ # #=> true
640
+ #
641
+ # Related: #eql?, #normalize
642
+ def ==(other)
643
+ self.class == other.class &&
644
+ (to_s == other.to_s || tuples == other.tuples)
645
+ end
646
+
647
+ # :call-seq: eql?(other) -> true or false
648
+ #
649
+ # Hash equality requires the same encoded #string representation.
650
+ #
651
+ # Net::IMAP::SequenceSet["1:3"] .eql? Net::IMAP::SequenceSet["1:3"]
652
+ # #=> true
653
+ # Net::IMAP::SequenceSet["1,2,3"].eql? Net::IMAP::SequenceSet["1:3"]
654
+ # #=> false
655
+ # Net::IMAP::SequenceSet["1,3"] .eql? Net::IMAP::SequenceSet["3,1"]
656
+ # #=> false
657
+ # Net::IMAP::SequenceSet["9,1:*"].eql? Net::IMAP::SequenceSet["1:*"]
658
+ # #=> false
659
+ #
660
+ # Related: #==, #normalize
661
+ def eql?(other) self.class == other.class && string == other.string end
662
+
663
+ # See #eql?
664
+ def hash; [self.class, string].hash end
665
+
666
+ # :call-seq: self === other -> true | false | nil
667
+ #
668
+ # Returns whether +other+ is contained within the set. +other+ may be any
669
+ # object that would be accepted by ::new. Returns +nil+ if StandardError
670
+ # is raised while converting +other+ to a comparable type.
671
+ #
672
+ # Related: #cover?, #include?, #include_star?
673
+ def ===(other)
674
+ cover?(other)
675
+ rescue
676
+ nil
677
+ end
678
+
679
+ # :call-seq: cover?(other) -> true | false | nil
680
+ #
681
+ # Returns whether +other+ is contained within the set. +other+ may be any
682
+ # object that would be accepted by ::new.
683
+ #
684
+ # Related: #===, #include?, #include_star?, #intersect?
685
+ def cover?(other) input_to_tuples(other).none? { !include_tuple?(_1) } end
686
+
687
+ # Returns +true+ when a given number or range is in +self+, and +false+
688
+ # otherwise. Returns +nil+ when +number+ isn't a valid SequenceSet
689
+ # element (Integer, Range, <tt>*</tt>, +sequence-set+ string).
690
+ #
691
+ # set = Net::IMAP::SequenceSet["5:10,100,111:115"]
692
+ # set.include? 1 #=> false
693
+ # set.include? 5..10 #=> true
694
+ # set.include? 11..20 #=> false
695
+ # set.include? 100 #=> true
696
+ # set.include? 6 #=> true, covered by "5:10"
697
+ # set.include? 6..9 #=> true, covered by "5:10"
698
+ # set.include? "6:9" #=> true, strings are parsed
699
+ # set.include? 4..9 #=> false, intersection is not sufficient
700
+ # set.include? "*" #=> false, use #limit to re-interpret "*"
701
+ # set.include? -1 #=> false, -1 is interpreted as "*"
702
+ #
703
+ # set = Net::IMAP::SequenceSet["5:10,100,111:*"]
704
+ # set.include? :* #=> true
705
+ # set.include? "*" #=> true
706
+ # set.include? -1 #=> true
707
+ # set.include?(200..) #=> true
708
+ # set.include?(100..) #=> false
709
+ #
710
+ # Related: #include_star?, #cover?, #===, #intersect?
711
+ def include?(element)
712
+ tuple = input_to_tuple element rescue nil
713
+ !!include_tuple?(tuple) if tuple
714
+ end
715
+
716
+ alias member? include?
717
+
718
+ # Returns +true+ when the set contains <tt>*</tt>.
719
+ def include_star?; @tuples.last&.last == STAR_INT end
720
+
721
+ # Returns +true+ if the set and a given object have any common elements,
722
+ # +false+ otherwise.
723
+ #
724
+ # Net::IMAP::SequenceSet["5:10"].intersect? "7,9,11" #=> true
725
+ # Net::IMAP::SequenceSet["5:10"].intersect? "11:33" #=> false
726
+ #
727
+ # Related: #intersection, #disjoint?, #cover?, #include?
728
+ def intersect?(other)
729
+ valid? && input_to_tuples(other).any? { intersect_tuple? _1 }
730
+ end
731
+ alias overlap? intersect?
732
+
733
+ # Returns +true+ if the set and a given object have no common elements,
734
+ # +false+ otherwise.
735
+ #
736
+ # Net::IMAP::SequenceSet["5:10"].disjoint? "7,9,11" #=> false
737
+ # Net::IMAP::SequenceSet["5:10"].disjoint? "11:33" #=> true
738
+ #
739
+ # Related: #intersection, #intersect?
740
+ def disjoint?(other)
741
+ empty? || input_to_tuples(other).none? { intersect_tuple? _1 }
742
+ end
743
+
744
+ # :call-seq:
745
+ # max(star: :*) => integer or star or nil
746
+ # max(count) => SequenceSet
747
+ #
748
+ # Returns the maximum value in +self+, +star+ when the set includes
749
+ # <tt>*</tt>, or +nil+ when the set is empty.
750
+ #
751
+ # When +count+ is given, a new SequenceSet is returned, containing only
752
+ # the last +count+ numbers. An empty SequenceSet is returned when +self+
753
+ # is empty. (+star+ is ignored when +count+ is given.)
754
+ #
755
+ # Related: #min, #minmax, #slice
756
+ def max(count = nil, star: :*)
757
+ if count
758
+ # n.b: #cardinality has not been backported to 0.5
759
+ cardinality = @tuples.sum(@tuples.count) { _2 - _1 }
760
+ if cardinality <= count
761
+ frozen? ? self : dup
762
+ else
763
+ slice(-count..) || remain_frozen_empty
764
+ end
765
+ elsif (val = @tuples.last&.last)
766
+ val == STAR_INT ? star : val
767
+ end
768
+ end
769
+
770
+ # :call-seq:
771
+ # min(star: :*) => integer or star or nil
772
+ # min(count) => SequenceSet
773
+ #
774
+ # Returns the minimum value in +self+, +star+ when the only value in the
775
+ # set is <tt>*</tt>, or +nil+ when the set is empty.
776
+ #
777
+ # When +count+ is given, a new SequenceSet is returned, containing only
778
+ # the first +count+ numbers. An empty SequenceSet is returned when +self+
779
+ # is empty. (+star+ is ignored when +count+ is given.)
780
+ #
781
+ # Related: #max, #minmax, #slice
782
+ def min(count = nil, star: :*)
783
+ if count
784
+ slice(0...count) || remain_frozen_empty
785
+ elsif (val = @tuples.first&.first)
786
+ val != STAR_INT ? val : star
787
+ end
788
+ end
789
+
790
+ # :call-seq: minmax(star: :*) => [min, max] or nil
791
+ #
792
+ # Returns a 2-element array containing the minimum and maximum numbers in
793
+ # +self+, or +nil+ when the set is empty. +star+ is handled the same way
794
+ # as by #min and #max.
795
+ #
796
+ # Related: #min, #max
797
+ def minmax(star: :*); [min(star: star), max(star: star)] unless empty? end
798
+
799
+ # Returns false when the set is empty.
800
+ def valid?; !empty? end
801
+
802
+ # Returns true if the set contains no elements
803
+ def empty?; @tuples.empty? end
804
+
805
+ # Returns true if the set contains every possible element.
806
+ def full?; @tuples == [[1, STAR_INT]] end
807
+
808
+ # :call-seq:
809
+ # self + other -> sequence set
810
+ # self | other -> sequence set
811
+ # union(other) -> sequence set
812
+ #
813
+ # Returns a new sequence set that has every number in the +other+ object
814
+ # added.
815
+ #
816
+ # +other+ may be any object that would be accepted by ::new.
817
+ #
818
+ # Net::IMAP::SequenceSet["1:5"] | 2 | [4..6, 99]
819
+ # #=> Net::IMAP::SequenceSet["1:6,99"]
820
+ #
821
+ # Related: #add, #merge, #&, #-, #^, #~
822
+ #
823
+ # ==== Set identities
824
+ #
825
+ # <tt>lhs | rhs</tt> is equivalent to:
826
+ # * <tt>rhs | lhs</tt> (commutative)
827
+ # * <tt>~(~lhs & ~rhs)</tt> (De Morgan's Law)
828
+ # * <tt>(lhs & rhs) ^ (lhs ^ rhs)</tt>
829
+ def |(other) remain_frozen dup.merge other end
830
+ alias :+ :|
831
+ alias union :|
832
+
833
+ # :call-seq:
834
+ # self - other -> sequence set
835
+ # difference(other) -> sequence set
836
+ #
837
+ # Returns a new sequence set built by duplicating this set and removing
838
+ # every number that appears in +other+.
839
+ #
840
+ # +other+ may be any object that would be accepted by ::new.
841
+ #
842
+ # Net::IMAP::SequenceSet[1..5] - 2 - 4 - 6
843
+ # #=> Net::IMAP::SequenceSet["1,3,5"]
844
+ #
845
+ # Related: #subtract, #|, #&, #^, #~
846
+ #
847
+ # ==== Set identities
848
+ #
849
+ # <tt>lhs - rhs</tt> is equivalent to:
850
+ # * <tt>~rhs - ~lhs</tt>
851
+ # * <tt>lhs & ~rhs</tt>
852
+ # * <tt>~(~lhs | rhs)</tt>
853
+ # * <tt>lhs & (lhs ^ rhs)</tt>
854
+ # * <tt>lhs ^ (lhs & rhs)</tt>
855
+ # * <tt>rhs ^ (lhs | rhs)</tt>
856
+ def -(other) remain_frozen dup.subtract other end
857
+ alias difference :-
858
+
859
+ # :call-seq:
860
+ # self & other -> sequence set
861
+ # intersection(other) -> sequence set
862
+ #
863
+ # Returns a new sequence set containing only the numbers common to this
864
+ # set and +other+.
865
+ #
866
+ # +other+ may be any object that would be accepted by ::new.
867
+ #
868
+ # Net::IMAP::SequenceSet[1..5] & [2, 4, 6]
869
+ # #=> Net::IMAP::SequenceSet["2,4"]
870
+ #
871
+ # Related: #intersect?, #|, #-, #^, #~
872
+ #
873
+ # ==== Set identities
874
+ #
875
+ # <tt>lhs & rhs</tt> is equivalent to:
876
+ # * <tt>rhs & lhs</tt> (commutative)
877
+ # * <tt>~(~lhs | ~rhs)</tt> (De Morgan's Law)
878
+ # * <tt>lhs - ~rhs</tt>
879
+ # * <tt>lhs - (lhs - rhs)</tt>
880
+ # * <tt>lhs - (lhs ^ rhs)</tt>
881
+ # * <tt>lhs ^ (lhs - rhs)</tt>
882
+ def &(other)
883
+ remain_frozen dup.subtract SequenceSet.new(other).complement!
884
+ end
885
+ alias intersection :&
886
+
887
+ # :call-seq:
888
+ # self ^ other -> sequence set
889
+ # xor(other) -> sequence set
890
+ #
891
+ # Returns a new sequence set containing numbers that are exclusive between
892
+ # this set and +other+.
893
+ #
894
+ # +other+ may be any object that would be accepted by ::new.
895
+ #
896
+ # Net::IMAP::SequenceSet[1..5] ^ [2, 4, 6]
897
+ # #=> Net::IMAP::SequenceSet["1,3,5:6"]
898
+ #
899
+ # Related: #|, #&, #-, #~
900
+ #
901
+ # ==== Set identities
902
+ #
903
+ # <tt>lhs ^ rhs</tt> is equivalent to:
904
+ # * <tt>rhs ^ lhs</tt> (commutative)
905
+ # * <tt>~lhs ^ ~rhs</tt>
906
+ # * <tt>(lhs | rhs) - (lhs & rhs)</tt>
907
+ # * <tt>(lhs - rhs) | (rhs - lhs)</tt>
908
+ # * <tt>(lhs ^ other) ^ (other ^ rhs)</tt>
909
+ def ^(other) remain_frozen (dup | other).subtract(self & other) end
910
+ alias xor :^
911
+
912
+ # :call-seq:
913
+ # ~ self -> sequence set
914
+ # complement -> sequence set
915
+ #
916
+ # Returns the complement of self, a SequenceSet which contains all numbers
917
+ # _except_ for those in this set.
918
+ #
919
+ # ~Net::IMAP::SequenceSet.full #=> Net::IMAP::SequenceSet.empty
920
+ # ~Net::IMAP::SequenceSet.empty #=> Net::IMAP::SequenceSet.full
921
+ # ~Net::IMAP::SequenceSet["1:5,100:222"]
922
+ # #=> Net::IMAP::SequenceSet["6:99,223:*"]
923
+ # ~Net::IMAP::SequenceSet["6:99,223:*"]
924
+ # #=> Net::IMAP::SequenceSet["1:5,100:222"]
925
+ #
926
+ # Related: #complement!, #|, #&, #-, #^
927
+ #
928
+ # ==== Set identities
929
+ #
930
+ # <tt>~set</tt> is equivalent to:
931
+ # * <tt>full - set</tt>, where "full" is Net::IMAP::SequenceSet.full
932
+ def ~; remain_frozen dup.complement! end
933
+ alias complement :~
934
+
935
+ # :call-seq:
936
+ # add(element) -> self
937
+ # self << other -> self
938
+ #
939
+ # Adds a range or number to the set and returns +self+.
940
+ #
941
+ # #string will be regenerated. Use #merge to add many elements at once.
942
+ #
943
+ # Use #append to append new elements to #string. See
944
+ # SequenceSet@Ordered+and+Normalized+sets.
945
+ #
946
+ # Related: #add?, #merge, #union, #append
947
+ def add(element)
948
+ modifying! # short-circuit before input_to_tuple
949
+ tuple_add input_to_tuple element
950
+ normalize!
951
+ end
952
+ alias << add
953
+
954
+ # Adds a range or number to the set and returns +self+.
955
+ #
956
+ # Unlike #add, #merge, or #union, the new value is appended to #string.
957
+ # This may result in a #string which has duplicates or is out-of-order.
958
+ #
959
+ # See SequenceSet@Ordered+and+Normalized+sets.
960
+ #
961
+ # Related: #add, #merge, #union
962
+ def append(entry)
963
+ modifying! # short-circuit before input_to_tuple
964
+ tuple = input_to_tuple entry
965
+ entry = tuple_to_str tuple
966
+ string unless empty? # write @string before tuple_add
967
+ tuple_add tuple
968
+ @string = -(@string ? "#{@string},#{entry}" : entry)
969
+ self
970
+ end
971
+
972
+ # :call-seq: add?(element) -> self or nil
973
+ #
974
+ # Adds a range or number to the set and returns +self+. Returns +nil+
975
+ # when the element is already included in the set.
976
+ #
977
+ # #string will be regenerated. Use #merge to add many elements at once.
978
+ #
979
+ # Related: #add, #merge, #union, #include?
980
+ def add?(element)
981
+ modifying! # short-circuit before include?
982
+ add element unless include? element
983
+ end
984
+
985
+ # :call-seq: delete(element) -> self
986
+ #
987
+ # Deletes the given range or number from the set and returns +self+.
988
+ #
989
+ # #string will be regenerated after deletion. Use #subtract to remove
990
+ # many elements at once.
991
+ #
992
+ # Related: #delete?, #delete_at, #subtract, #difference
993
+ def delete(element)
994
+ modifying! # short-circuit before input_to_tuple
995
+ tuple_subtract input_to_tuple element
996
+ normalize!
997
+ end
998
+
999
+ # :call-seq:
1000
+ # delete?(number) -> integer or nil
1001
+ # delete?(star) -> :* or nil
1002
+ # delete?(range) -> sequence set or nil
1003
+ #
1004
+ # Removes a specified value from the set, and returns the removed value.
1005
+ # Returns +nil+ if nothing was removed.
1006
+ #
1007
+ # Returns an integer when the specified +number+ argument was removed:
1008
+ # set = Net::IMAP::SequenceSet.new [5..10, 20]
1009
+ # set.delete?(7) #=> 7
1010
+ # set #=> #<Net::IMAP::SequenceSet "5:6,8:10,20">
1011
+ # set.delete?("20") #=> 20
1012
+ # set #=> #<Net::IMAP::SequenceSet "5:6,8:10">
1013
+ # set.delete?(30) #=> nil
1014
+ #
1015
+ # Returns <tt>:*</tt> when <tt>*</tt> or <tt>-1</tt> is specified and
1016
+ # removed:
1017
+ # set = Net::IMAP::SequenceSet.new "5:9,20,35,*"
1018
+ # set.delete?(-1) #=> :*
1019
+ # set #=> #<Net::IMAP::SequenceSet "5:9,20,35">
1020
+ #
1021
+ # And returns a new SequenceSet when a range is specified:
1022
+ #
1023
+ # set = Net::IMAP::SequenceSet.new [5..10, 20]
1024
+ # set.delete?(9..) #=> #<Net::IMAP::SequenceSet "9:10,20">
1025
+ # set #=> #<Net::IMAP::SequenceSet "5:8">
1026
+ # set.delete?(21..) #=> nil
1027
+ #
1028
+ # #string will be regenerated after deletion.
1029
+ #
1030
+ # Related: #delete, #delete_at, #subtract, #difference, #disjoint?
1031
+ def delete?(element)
1032
+ modifying! # short-circuit before input_to_tuple
1033
+ element = input_try_convert(element)
1034
+ tuple = input_to_tuple element
1035
+ if number_input?(element)
1036
+ return unless include_tuple? tuple
1037
+ tuple_subtract tuple
1038
+ normalize!
1039
+ from_tuple_int tuple.first
1040
+ else
1041
+ copy = dup
1042
+ tuple_subtract tuple
1043
+ normalize!
1044
+ copy if copy.subtract(self).valid?
1045
+ end
1046
+ end
1047
+
1048
+ # :call-seq: delete_at(index) -> number or :* or nil
1049
+ #
1050
+ # Deletes a number the set, indicated by the given +index+. Returns the
1051
+ # number that was removed, or +nil+ if nothing was removed.
1052
+ #
1053
+ # #string will be regenerated after deletion.
1054
+ #
1055
+ # Related: #delete, #delete?, #slice!, #subtract, #difference
1056
+ def delete_at(index)
1057
+ slice! Integer(index.to_int)
1058
+ end
1059
+
1060
+ # :call-seq:
1061
+ # slice!(index) -> integer or :* or nil
1062
+ # slice!(start, length) -> sequence set or nil
1063
+ # slice!(range) -> sequence set or nil
1064
+ #
1065
+ # Deletes a number or consecutive numbers from the set, indicated by the
1066
+ # given +index+, +start+ and +length+, or +range+ of offsets. Returns the
1067
+ # number or sequence set that was removed, or +nil+ if nothing was
1068
+ # removed. Arguments are interpreted the same as for #slice or #[].
1069
+ #
1070
+ # #string will be regenerated after deletion.
1071
+ #
1072
+ # Related: #slice, #delete_at, #delete, #delete?, #subtract, #difference
1073
+ def slice!(index, length = nil)
1074
+ modifying! # short-circuit before slice
1075
+ deleted = slice(index, length) and subtract deleted
1076
+ deleted
1077
+ end
1078
+
1079
+ # Merges all of the elements that appear in any of the +sets+ into the
1080
+ # set, and returns +self+.
1081
+ #
1082
+ # The +sets+ may be any objects that would be accepted by ::new.
1083
+ #
1084
+ # #string will be regenerated after all sets have been merged.
1085
+ #
1086
+ # Related: #add, #add?, #union
1087
+ def merge(*sets)
1088
+ modifying! # short-circuit before input_to_tuples
1089
+ tuples_add input_to_tuples sets
1090
+ normalize!
1091
+ end
1092
+
1093
+ # Removes all of the elements that appear in any of the given +sets+ from
1094
+ # the set, and returns +self+.
1095
+ #
1096
+ # The +sets+ may be any objects that would be accepted by ::new.
1097
+ #
1098
+ # Related: #difference
1099
+ def subtract(*sets)
1100
+ tuples_subtract input_to_tuples sets
1101
+ normalize!
1102
+ end
1103
+
1104
+ # Returns an array of ranges and integers and <tt>:*</tt>.
1105
+ #
1106
+ # The entries are in the same order they appear in #string, with no
1107
+ # sorting, deduplication, or coalescing. When #string is in its
1108
+ # normalized form, this will return the same result as #elements.
1109
+ # This is useful when the given order is significant, for example in a
1110
+ # ESEARCH response to IMAP#sort.
1111
+ #
1112
+ # See SequenceSet@Ordered+and+Normalized+sets.
1113
+ #
1114
+ # Related: #each_entry, #elements
1115
+ def entries; each_entry.to_a end
1116
+
1117
+ # Returns an array of ranges and integers and <tt>:*</tt>.
1118
+ #
1119
+ # The returned elements are sorted and coalesced, even when the input
1120
+ # #string is not. <tt>*</tt> will sort last. See #normalize,
1121
+ # SequenceSet@Ordered+and+Normalized+sets.
1122
+ #
1123
+ # By itself, <tt>*</tt> translates to <tt>:*</tt>. A range containing
1124
+ # <tt>*</tt> translates to an endless range. Use #limit to translate both
1125
+ # cases to a maximum value.
1126
+ #
1127
+ # Net::IMAP::SequenceSet["2,5:9,6,*,12:11"].elements
1128
+ # #=> [2, 5..9, 11..12, :*]
1129
+ #
1130
+ # Related: #each_element, #ranges, #numbers
1131
+ def elements; each_element.to_a end
1132
+ alias to_a elements
1133
+
1134
+ # Returns an array of ranges
1135
+ #
1136
+ # The returned elements are sorted and coalesced, even when the input
1137
+ # #string is not. <tt>*</tt> will sort last. See #normalize,
1138
+ # SequenceSet@Ordered+and+Normalized+sets.
1139
+ #
1140
+ # <tt>*</tt> translates to an endless range. By itself, <tt>*</tt>
1141
+ # translates to <tt>:*..</tt>. Use #limit to set <tt>*</tt> to a maximum
1142
+ # value.
1143
+ #
1144
+ # Net::IMAP::SequenceSet["2,5:9,6,*,12:11"].ranges
1145
+ # #=> [2..2, 5..9, 11..12, :*..]
1146
+ # Net::IMAP::SequenceSet["123,999:*,456:789"].ranges
1147
+ # #=> [123..123, 456..789, 999..]
1148
+ #
1149
+ # Related: #each_range, #elements, #numbers, #to_set
1150
+ def ranges; each_range.to_a end
1151
+
1152
+ # Returns a sorted array of all of the number values in the sequence set.
1153
+ #
1154
+ # The returned numbers are sorted and de-duplicated, even when the input
1155
+ # #string is not. See #normalize, SequenceSet@Ordered+and+Normalized+sets.
1156
+ #
1157
+ # Net::IMAP::SequenceSet["2,5:9,6,12:11"].numbers
1158
+ # #=> [2, 5, 6, 7, 8, 9, 11, 12]
1159
+ #
1160
+ # If the set contains a <tt>*</tt>, RangeError is raised. See #limit.
1161
+ #
1162
+ # Net::IMAP::SequenceSet["10000:*"].numbers
1163
+ # #!> RangeError
1164
+ #
1165
+ # *WARNING:* Even excluding sets with <tt>*</tt>, an enormous result can
1166
+ # easily be created. An array with over 4 billion integers could be
1167
+ # returned, requiring up to 32GiB of memory on a 64-bit architecture.
1168
+ #
1169
+ # Net::IMAP::SequenceSet[10000..2**32-1].numbers
1170
+ # # ...probably freezes the process for a while...
1171
+ # #!> NoMemoryError (probably)
1172
+ #
1173
+ # For safety, consider using #limit or #intersection to set an upper
1174
+ # bound. Alternatively, use #each_element, #each_range, or even
1175
+ # #each_number to avoid allocation of a result array.
1176
+ #
1177
+ # Related: #elements, #ranges, #to_set
1178
+ def numbers; each_number.to_a end
1179
+
1180
+ # Yields each number or range in #string to the block and returns +self+.
1181
+ # Returns an enumerator when called without a block.
1182
+ #
1183
+ # The entries are yielded in the same order they appear in #string, with
1184
+ # no sorting, deduplication, or coalescing. When #string is in its
1185
+ # normalized form, this will yield the same values as #each_element.
1186
+ #
1187
+ # See SequenceSet@Ordered+and+Normalized+sets.
1188
+ #
1189
+ # Related: #entries, #each_element
1190
+ def each_entry(&block) # :yields: integer or range or :*
1191
+ return to_enum(__method__) unless block_given?
1192
+ each_entry_tuple do yield tuple_to_entry _1 end
1193
+ end
1194
+
1195
+ # Yields each number or range (or <tt>:*</tt>) in #elements to the block
1196
+ # and returns self. Returns an enumerator when called without a block.
1197
+ #
1198
+ # The returned numbers are sorted and de-duplicated, even when the input
1199
+ # #string is not. See #normalize, SequenceSet@Ordered+and+Normalized+sets.
1200
+ #
1201
+ # Related: #elements, #each_entry
1202
+ def each_element # :yields: integer or range or :*
1203
+ return to_enum(__method__) unless block_given?
1204
+ @tuples.each do yield tuple_to_entry _1 end
1205
+ self
1206
+ end
1207
+
1208
+ private
1209
+
1210
+ def each_entry_tuple(&block)
1211
+ return to_enum(__method__) unless block_given?
1212
+ if @string
1213
+ @string.split(",") do block.call str_to_tuple _1 end
1214
+ else
1215
+ @tuples.each(&block)
1216
+ end
1217
+ self
1218
+ end
1219
+
1220
+ def tuple_to_entry((min, max))
1221
+ if min == STAR_INT then :*
1222
+ elsif max == STAR_INT then min..
1223
+ elsif min == max then min
1224
+ else min..max
1225
+ end
1226
+ end
1227
+
1228
+ public
1229
+
1230
+ # Yields each range in #ranges to the block and returns self.
1231
+ # Returns an enumerator when called without a block.
1232
+ #
1233
+ # Related: #ranges
1234
+ def each_range # :yields: range
1235
+ return to_enum(__method__) unless block_given?
1236
+ @tuples.each do |min, max|
1237
+ if min == STAR_INT then yield :*..
1238
+ elsif max == STAR_INT then yield min..
1239
+ else yield min..max
1240
+ end
1241
+ end
1242
+ self
1243
+ end
1244
+
1245
+ # Yields each number in #numbers to the block and returns self.
1246
+ # If the set contains a <tt>*</tt>, RangeError will be raised.
1247
+ #
1248
+ # Returns an enumerator when called without a block (even if the set
1249
+ # contains <tt>*</tt>).
1250
+ #
1251
+ # Related: #numbers, #each_ordered_number
1252
+ def each_number(&block) # :yields: integer
1253
+ return to_enum(__method__) unless block_given?
1254
+ raise RangeError, '%s contains "*"' % [self.class] if include_star?
1255
+ @tuples.each do each_number_in_tuple _1, _2, &block end
1256
+ self
1257
+ end
1258
+
1259
+ # Yields each number in #entries to the block and returns self.
1260
+ # If the set contains a <tt>*</tt>, RangeError will be raised.
1261
+ #
1262
+ # Returns an enumerator when called without a block (even if the set
1263
+ # contains <tt>*</tt>).
1264
+ #
1265
+ # Related: #entries, #each_number
1266
+ def each_ordered_number(&block)
1267
+ return to_enum(__method__) unless block_given?
1268
+ raise RangeError, '%s contains "*"' % [self.class] if include_star?
1269
+ each_entry_tuple do each_number_in_tuple _1, _2, &block end
1270
+ end
1271
+
1272
+ private def each_number_in_tuple(min, max, &block)
1273
+ if min == STAR_INT then yield :*
1274
+ elsif min == max then yield min
1275
+ elsif max != STAR_INT then (min..max).each(&block)
1276
+ else
1277
+ raise RangeError, "#{SequenceSet} cannot enumerate range with '*'"
1278
+ end
1279
+ end
1280
+
1281
+ # Returns a Set with all of the #numbers in the sequence set.
1282
+ #
1283
+ # If the set contains a <tt>*</tt>, RangeError will be raised.
1284
+ #
1285
+ # See #numbers for the warning about very large sets.
1286
+ #
1287
+ # Related: #elements, #ranges, #numbers
1288
+ def to_set; Set.new(numbers) end
1289
+
1290
+ # Returns the count of #numbers in the set.
1291
+ #
1292
+ # <tt>*</tt> will be counted as <tt>2**32 - 1</tt> (the maximum 32-bit
1293
+ # unsigned integer value).
1294
+ #
1295
+ # Related: #count_with_duplicates
1296
+ def count
1297
+ @tuples.sum(@tuples.count) { _2 - _1 } +
1298
+ (include_star? && include?(UINT32_MAX) ? -1 : 0)
1299
+ end
1300
+
1301
+ alias size count
1302
+
1303
+ # Returns the count of numbers in the ordered #entries, including any
1304
+ # repeated numbers.
1305
+ #
1306
+ # <tt>*</tt> will be counted as <tt>2**32 - 1</tt> (the maximum 32-bit
1307
+ # unsigned integer value).
1308
+ #
1309
+ # When #string is normalized, this behaves the same as #count.
1310
+ #
1311
+ # Related: #entries, #count_duplicates, #has_duplicates?
1312
+ def count_with_duplicates
1313
+ return count unless @string
1314
+ each_entry_tuple.sum {|min, max|
1315
+ max - min + ((max == STAR_INT && min != STAR_INT) ? 0 : 1)
1316
+ }
1317
+ end
1318
+
1319
+ # Returns the count of repeated numbers in the ordered #entries, the
1320
+ # difference between #count_with_duplicates and #count.
1321
+ #
1322
+ # When #string is normalized, this is zero.
1323
+ #
1324
+ # Related: #entries, #count_with_duplicates, #has_duplicates?
1325
+ def count_duplicates
1326
+ return 0 unless @string
1327
+ count_with_duplicates - count
1328
+ end
1329
+
1330
+ # :call-seq: has_duplicates? -> true | false
1331
+ #
1332
+ # Returns whether or not the ordered #entries repeat any numbers.
1333
+ #
1334
+ # Always returns +false+ when #string is normalized.
1335
+ #
1336
+ # Related: #entries, #count_with_duplicates, #count_duplicates?
1337
+ def has_duplicates?
1338
+ return false unless @string
1339
+ count_with_duplicates != count
1340
+ end
1341
+
1342
+ # Returns the (sorted and deduplicated) index of +number+ in the set, or
1343
+ # +nil+ if +number+ isn't in the set.
1344
+ #
1345
+ # Related: #[], #at, #find_ordered_index
1346
+ def find_index(number)
1347
+ number = to_tuple_int number
1348
+ each_tuple_with_index(@tuples) do |min, max, idx_min|
1349
+ number < min and return nil
1350
+ number <= max and return from_tuple_int(idx_min + (number - min))
1351
+ end
1352
+ nil
1353
+ end
1354
+
1355
+ # Returns the first index of +number+ in the ordered #entries, or
1356
+ # +nil+ if +number+ isn't in the set.
1357
+ #
1358
+ # Related: #find_index
1359
+ def find_ordered_index(number)
1360
+ number = to_tuple_int number
1361
+ each_tuple_with_index(each_entry_tuple) do |min, max, idx_min|
1362
+ if min <= number && number <= max
1363
+ return from_tuple_int(idx_min + (number - min))
1364
+ end
1365
+ end
1366
+ nil
1367
+ end
1368
+
1369
+ private
1370
+
1371
+ def each_tuple_with_index(tuples)
1372
+ idx_min = 0
1373
+ tuples.each do |min, max|
1374
+ idx_max = idx_min + (max - min)
1375
+ yield min, max, idx_min, idx_max
1376
+ idx_min = idx_max + 1
1377
+ end
1378
+ idx_min
1379
+ end
1380
+
1381
+ def reverse_each_tuple_with_index(tuples)
1382
+ idx_max = -1
1383
+ tuples.reverse_each do |min, max|
1384
+ yield min, max, (idx_min = idx_max - (max - min)), idx_max
1385
+ idx_max = idx_min - 1
1386
+ end
1387
+ idx_max
1388
+ end
1389
+
1390
+ public
1391
+
1392
+ # :call-seq: at(index) -> integer or nil
1393
+ #
1394
+ # Returns the number at the given +index+ in the sorted set, without
1395
+ # modifying the set.
1396
+ #
1397
+ # +index+ is interpreted the same as in #[], except that #at only allows a
1398
+ # single integer argument.
1399
+ #
1400
+ # Related: #[], #slice, #ordered_at
1401
+ def at(index)
1402
+ lookup_number_by_tuple_index(tuples, index)
1403
+ end
1404
+
1405
+ # :call-seq: ordered_at(index) -> integer or nil
1406
+ #
1407
+ # Returns the number at the given +index+ in the ordered #entries, without
1408
+ # modifying the set.
1409
+ #
1410
+ # +index+ is interpreted the same as in #at (and #[]), except that
1411
+ # #ordered_at applies to the ordered #entries, not the sorted set.
1412
+ #
1413
+ # Related: #[], #slice, #ordered_at
1414
+ def ordered_at(index)
1415
+ lookup_number_by_tuple_index(each_entry_tuple, index)
1416
+ end
1417
+
1418
+ private def lookup_number_by_tuple_index(tuples, index)
1419
+ index = Integer(index.to_int)
1420
+ if index.negative?
1421
+ reverse_each_tuple_with_index(tuples) do |min, max, idx_min, idx_max|
1422
+ idx_min <= index and return from_tuple_int(min + (index - idx_min))
1423
+ end
1424
+ else
1425
+ each_tuple_with_index(tuples) do |min, _, idx_min, idx_max|
1426
+ index <= idx_max and return from_tuple_int(min + (index - idx_min))
1427
+ end
1428
+ end
1429
+ nil
1430
+ end
1431
+
1432
+ # :call-seq:
1433
+ # seqset[index] -> integer or :* or nil
1434
+ # slice(index) -> integer or :* or nil
1435
+ # seqset[start, length] -> sequence set or nil
1436
+ # slice(start, length) -> sequence set or nil
1437
+ # seqset[range] -> sequence set or nil
1438
+ # slice(range) -> sequence set or nil
1439
+ #
1440
+ # Returns a number or a subset from the _sorted_ set, without modifying
1441
+ # the set.
1442
+ #
1443
+ # When an Integer argument +index+ is given, the number at offset +index+
1444
+ # in the sorted set is returned:
1445
+ #
1446
+ # set = Net::IMAP::SequenceSet["10:15,20:23,26"]
1447
+ # set[0] #=> 10
1448
+ # set[5] #=> 15
1449
+ # set[10] #=> 26
1450
+ #
1451
+ # If +index+ is negative, it counts relative to the end of the sorted set:
1452
+ # set = Net::IMAP::SequenceSet["10:15,20:23,26"]
1453
+ # set[-1] #=> 26
1454
+ # set[-3] #=> 22
1455
+ # set[-6] #=> 15
1456
+ #
1457
+ # If +index+ is out of range, +nil+ is returned.
1458
+ #
1459
+ # set = Net::IMAP::SequenceSet["10:15,20:23,26"]
1460
+ # set[11] #=> nil
1461
+ # set[-12] #=> nil
1462
+ #
1463
+ # The result is based on the sorted and de-duplicated set, not on the
1464
+ # ordered #entries in #string.
1465
+ #
1466
+ # set = Net::IMAP::SequenceSet["12,20:23,11:16,21"]
1467
+ # set[0] #=> 11
1468
+ # set[-1] #=> 23
1469
+ #
1470
+ # Related: #at
1471
+ def [](index, length = nil)
1472
+ if length then slice_length(index, length)
1473
+ elsif index.is_a?(Range) then slice_range(index)
1474
+ else at(index)
1475
+ end
1476
+ end
1477
+
1478
+ alias slice :[]
1479
+
1480
+ private
1481
+
1482
+ def slice_length(start, length)
1483
+ start = Integer(start.to_int)
1484
+ length = Integer(length.to_int)
1485
+ raise ArgumentError, "length must be positive" unless length.positive?
1486
+ last = start + length - 1 unless start.negative? && start.abs <= length
1487
+ slice_range(start..last)
1488
+ end
1489
+
1490
+ def slice_range(range)
1491
+ first = range.begin || 0
1492
+ last = range.end || -1
1493
+ if range.exclude_end?
1494
+ return remain_frozen_empty if last.zero?
1495
+ last -= 1 if range.end && last != STAR_INT
1496
+ end
1497
+ if (first * last).positive? && last < first
1498
+ remain_frozen_empty
1499
+ elsif (min = at(first))
1500
+ max = at(last)
1501
+ max = :* if max.nil?
1502
+ if max == :* then self & (min..)
1503
+ elsif min <= max then self & (min..max)
1504
+ else remain_frozen_empty
1505
+ end
1506
+ end
1507
+ end
1508
+
1509
+ public
1510
+
1511
+ # Returns a copy of +self+ which only contains the numbers above +num+.
1512
+ #
1513
+ # Net::IMAP::SequenceSet["5,10:22,50"].above(10) # to_s => "11:22,50"
1514
+ # Net::IMAP::SequenceSet["5,10:22,50"].above(20) # to_s => "21:22,50
1515
+ # Net::IMAP::SequenceSet["5,10:22,50"].above(30) # to_s => "50"
1516
+ #
1517
+ # This returns the same result as #intersection with <tt>((num+1)..)</tt>
1518
+ # or #difference with <tt>(..num)</tt>.
1519
+ #
1520
+ # Net::IMAP::SequenceSet["5,10:22,50"] & (11..) # to_s => "11:22,50"
1521
+ # Net::IMAP::SequenceSet["5,10:22,50"] - (..10) # to_s => "11:22,50"
1522
+ # Net::IMAP::SequenceSet["5,10:22,50"] & (21..) # to_s => "21:22,50"
1523
+ # Net::IMAP::SequenceSet["5,10:22,50"] - (..20) # to_s => "21:22,50"
1524
+ #
1525
+ # Related: #above, #-, #&
1526
+ def above(num)
1527
+ NumValidator.valid_nz_number?(num) or
1528
+ raise ArgumentError, "not a valid sequence set number"
1529
+ difference(..num)
1530
+ end
1531
+
1532
+ # Returns a copy of +self+ which only contains numbers below +num+.
1533
+ #
1534
+ # Net::IMAP::SequenceSet["5,10:22,50"].below(10) # to_s => "5"
1535
+ # Net::IMAP::SequenceSet["5,10:22,50"].below(20) # to_s => "5,10:19"
1536
+ # Net::IMAP::SequenceSet["5,10:22,50"].below(30) # to_s => "5,10:22"
1537
+ #
1538
+ # This returns the same result as #intersection with <tt>(..(num-1))</tt>
1539
+ # or #difference with <tt>(num..)</tt>.
1540
+ #
1541
+ # Net::IMAP::SequenceSet["5,10:22,50"] & (..9) # to_s => "5"
1542
+ # Net::IMAP::SequenceSet["5,10:22,50"] - (10..) # to_s => "5"
1543
+ # Net::IMAP::SequenceSet["5,10:22,50"] & (..19) # to_s => "5,10:19"
1544
+ # Net::IMAP::SequenceSet["5,10:22,50"] - (20..) # to_s => "5,10:19"
1545
+ #
1546
+ # When the set does not contain <tt>*</tt>, #below is identical to #limit
1547
+ # with <tt>max: num - 1</tt>. When the set does contain <tt>*</tt>,
1548
+ # #below always drops it from the result. Use #limit when the IMAP
1549
+ # semantics for <tt>*</tt> must be enforced.
1550
+ #
1551
+ # Net::IMAP::SequenceSet["5,10:22,50"].below(30) # to_s => "5,10:22"
1552
+ # Net::IMAP::SequenceSet["5,10:22,50"].limit(max: 29) # to_s => "5,10:22"
1553
+ # Net::IMAP::SequenceSet["5,10:22,*"].below(30) # to_s => "5,10:22"
1554
+ # Net::IMAP::SequenceSet["5,10:22,*"].limit(max: 29) # to_s => "5,10:22,29"
1555
+ #
1556
+ # Related: #above, #-, #&, #limit
1557
+ def below(num)
1558
+ NumValidator.valid_nz_number?(num) or
1559
+ raise ArgumentError, "not a valid sequence set number"
1560
+ difference(num..)
1561
+ end
1562
+
1563
+ # Returns a frozen SequenceSet with <tt>*</tt> converted to +max+, numbers
1564
+ # and ranges over +max+ removed, and ranges containing +max+ converted to
1565
+ # end at +max+.
1566
+ #
1567
+ # Net::IMAP::SequenceSet["5,10:22,50"].limit(max: 20).to_s
1568
+ # #=> "5,10:20"
1569
+ #
1570
+ # <tt>*</tt> is always interpreted as the maximum value. When the set
1571
+ # contains <tt>*</tt>, it will be set equal to the limit.
1572
+ #
1573
+ # Net::IMAP::SequenceSet["*"].limit(max: 37)
1574
+ # #=> Net::IMAP::SequenceSet["37"]
1575
+ # Net::IMAP::SequenceSet["5:*"].limit(max: 37)
1576
+ # #=> Net::IMAP::SequenceSet["5:37"]
1577
+ # Net::IMAP::SequenceSet["500:*"].limit(max: 37)
1578
+ # #=> Net::IMAP::SequenceSet["37"]
1579
+ #
1580
+ # Related: #limit!
1581
+ def limit(max:)
1582
+ max = to_tuple_int(max)
1583
+ if empty? then self.class.empty
1584
+ elsif !include_star? && max < min then self.class.empty
1585
+ elsif max(star: STAR_INT) <= max then frozen? ? self : dup.freeze
1586
+ else dup.limit!(max: max).freeze
1587
+ end
1588
+ end
1589
+
1590
+ # Removes all members over +max+ and returns self. If <tt>*</tt> is a
1591
+ # member, it will be converted to +max+.
1592
+ #
1593
+ # Related: #limit
1594
+ def limit!(max:)
1595
+ modifying! # short-circuit, and normalize the error message for JRuby
1596
+ star = include_star?
1597
+ max = to_tuple_int(max)
1598
+ tuple_subtract [max + 1, STAR_INT]
1599
+ tuple_add [max, max ] if star
1600
+ normalize!
1601
+ end
1602
+
1603
+ # :call-seq: complement! -> self
1604
+ #
1605
+ # Converts the SequenceSet to its own #complement. It will contain all
1606
+ # possible values _except_ for those currently in the set.
1607
+ #
1608
+ # Related: #complement
1609
+ def complement!
1610
+ modifying! # short-circuit, and normalize the error message for JRuby
1611
+ return replace(self.class.full) if empty?
1612
+ return clear if full?
1613
+ flat = @tuples.flat_map { [_1 - 1, _2 + 1] }
1614
+ if flat.first < 1 then flat.shift else flat.unshift 1 end
1615
+ if STAR_INT < flat.last then flat.pop else flat.push STAR_INT end
1616
+ @tuples = flat.each_slice(2).to_a
1617
+ normalize!
1618
+ end
1619
+
1620
+ # Returns a new SequenceSet with a normalized string representation.
1621
+ #
1622
+ # The returned set's #string is sorted and deduplicated. Adjacent or
1623
+ # overlapping elements will be merged into a single larger range.
1624
+ # See SequenceSet@Ordered+and+Normalized+sets.
1625
+ #
1626
+ # Net::IMAP::SequenceSet["1:5,3:7,10:9,10:11"].normalize
1627
+ # #=> Net::IMAP::SequenceSet["1:7,9:11"]
1628
+ #
1629
+ # Related: #normalize!, #normalized_string
1630
+ def normalize
1631
+ str = normalized_string
1632
+ return self if frozen? && str == string
1633
+ remain_frozen dup.instance_exec { @string = str&.-@; self }
1634
+ end
1635
+
1636
+ # Resets #string to be sorted, deduplicated, and coalesced. Returns
1637
+ # +self+. See SequenceSet@Ordered+and+Normalized+sets.
1638
+ #
1639
+ # Related: #normalize, #normalized_string
1640
+ def normalize!
1641
+ modifying! # redundant check, to normalize the error message for JRuby
1642
+ @string = nil
1643
+ self
1644
+ end
1645
+
1646
+ # Returns a normalized +sequence-set+ string representation, sorted
1647
+ # and deduplicated. Adjacent or overlapping elements will be merged into
1648
+ # a single larger range. See SequenceSet@Ordered+and+Normalized+sets.
1649
+ #
1650
+ # Net::IMAP::SequenceSet["1:5,3:7,10:9,10:11"].normalized_string
1651
+ # #=> "1:7,9:11"
1652
+ #
1653
+ # Returns +nil+ when the set is empty.
1654
+ #
1655
+ # Related: #normalize!, #normalize, #string, #to_s
1656
+ def normalized_string
1657
+ @tuples.empty? ? nil : -@tuples.map { tuple_to_str _1 }.join(",")
1658
+ end
1659
+
1660
+ # Returns an inspection string for the SequenceSet.
1661
+ #
1662
+ # Net::IMAP::SequenceSet.new.inspect
1663
+ # #=> "Net::IMAP::SequenceSet()"
1664
+ #
1665
+ # Net::IMAP::SequenceSet(1..5, 1024, 15, 2000).inspect
1666
+ # #=> 'Net::IMAP::SequenceSet("1:5,15,1024,2000")'
1667
+ #
1668
+ # Frozen sets have slightly different output:
1669
+ #
1670
+ # Net::IMAP::SequenceSet.empty.inspect
1671
+ # #=> "Net::IMAP::SequenceSet.empty"
1672
+ #
1673
+ # Net::IMAP::SequenceSet[1..5, 1024, 15, 2000].inspect
1674
+ # #=> 'Net::IMAP::SequenceSet["1:5,15,1024,2000"]'
1675
+ #
1676
+ # Large sets (by number of #entries) have abridged output, with only the
1677
+ # first and last entries:
1678
+ #
1679
+ # Net::IMAP::SequenceSet(((1..5000) % 2).to_a).inspect
1680
+ # #=> #<Net::IMAP::SequenceSet 2500 entries "1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,...(2468 entries omitted)...,4969,4971,4973,4975,4977,4979,4981,4983,4985,4987,4989,4991,4993,4995,4997,4999">
1681
+ #
1682
+ # Related: #to_s, #string
1683
+ def inspect
1684
+ case (count = count_entries)
1685
+ when 0
1686
+ (frozen? ? "%s.empty" : "%s()") % [self.class]
1687
+ when ..INSPECT_MAX_LEN
1688
+ (frozen? ? "%s[%p]" : "%s(%p)") % [self.class, to_s]
1689
+ else
1690
+ if @string
1691
+ head = @string[INSPECT_ABRIDGED_HEAD_RE]
1692
+ tail = @string[INSPECT_ABRIDGED_TAIL_RE]
1693
+ else
1694
+ head = export_string_entries(@tuples.first(INSPECT_TRUNCATE_LEN)) + ","
1695
+ tail = "," + export_string_entries(@tuples.last(INSPECT_TRUNCATE_LEN))
1696
+ end
1697
+ '#<%s %d entries "%s...(%d entries omitted)...%s"%s>' % [
1698
+ self.class, count,
1699
+ head, count - INSPECT_TRUNCATE_LEN * 2, tail,
1700
+ frozen? ? " (frozen)" : "",
1701
+ ]
1702
+ end
1703
+ end
1704
+
1705
+ private def count_entries
1706
+ @string ? @string.count(",") + 1 : @tuples.count
1707
+ end
1708
+
1709
+ ##
1710
+ # :method: to_sequence_set
1711
+ # :call-seq: to_sequence_set -> self
1712
+ #
1713
+ # Returns +self+
1714
+ #
1715
+ # Related: ::try_convert
1716
+
1717
+ # :nodoc: (work around rdoc bug)
1718
+ alias to_sequence_set itself
1719
+
1720
+ # Unstable API: currently for internal use only (Net::IMAP#validate_data)
1721
+ def validate # :nodoc:
1722
+ empty? and raise DataFormatError, "empty sequence-set is invalid"
1723
+ self
1724
+ end
1725
+
1726
+ # Unstable API: for internal use only (Net::IMAP#send_data)
1727
+ def send_data(imap, tag) # :nodoc:
1728
+ imap.__send__(:put_string, valid_string)
1729
+ end
1730
+
1731
+ # For YAML serialization
1732
+ def encode_with(coder) # :nodoc:
1733
+ # we can perfectly reconstruct from the string
1734
+ coder['string'] = to_s
1735
+ end
1736
+
1737
+ # For YAML deserialization
1738
+ def init_with(coder) # :nodoc:
1739
+ @tuples = []
1740
+ self.string = coder['string']
1741
+ end
1742
+
1743
+ protected
1744
+
1745
+ attr_reader :tuples # :nodoc:
1746
+
1747
+ def deep_copy_tuples; @tuples.map { _1.dup } end # :nodoc:
1748
+
1749
+ private
1750
+
1751
+ def remain_frozen(set) frozen? ? set.freeze : set end
1752
+ def remain_frozen_empty; frozen? ? SequenceSet.empty : SequenceSet.new end
1753
+
1754
+ # frozen clones are shallow copied
1755
+ def initialize_clone(other)
1756
+ @tuples = other.deep_copy_tuples unless other.frozen?
1757
+ super
1758
+ end
1759
+
1760
+ def initialize_dup(other)
1761
+ @tuples = other.deep_copy_tuples
1762
+ super
1763
+ end
1764
+
1765
+ def input_to_tuple(entry)
1766
+ entry = input_try_convert entry
1767
+ case entry
1768
+ when *STARS, Integer then [int = to_tuple_int(entry), int]
1769
+ when Range then range_to_tuple(entry)
1770
+ when String then str_to_tuple(entry)
1771
+ else
1772
+ raise DataFormatError, "expected number or range, got %p" % [entry]
1773
+ end
1774
+ end
1775
+
1776
+ def input_to_tuples(set)
1777
+ set = input_try_convert set
1778
+ case set
1779
+ when *STARS, Integer, Range then [input_to_tuple(set)]
1780
+ when String then str_to_tuples set
1781
+ when SequenceSet then set.tuples
1782
+ when Set then set.map { [to_tuple_int(_1)] * 2 }
1783
+ when Array then set.flat_map { input_to_tuples _1 }
1784
+ when nil then []
1785
+ else
1786
+ raise DataFormatError, "expected nz-number, range, '*', Set, Array; " \
1787
+ "got %p" % [set]
1788
+ end
1789
+ end
1790
+
1791
+ # unlike SequenceSet#try_convert, this returns an Integer, Range,
1792
+ # String, Set, Array, or... any type of object.
1793
+ def input_try_convert(input)
1794
+ SequenceSet.try_convert(input) ||
1795
+ Integer.try_convert(input) ||
1796
+ String.try_convert(input) ||
1797
+ input
1798
+ end
1799
+
1800
+ # NOTE: input_try_convert must be called on input first
1801
+ def number_input?(input)
1802
+ case input
1803
+ when *STARS, Integer then true
1804
+ when String then !input.include?(/[:,]/)
1805
+ end
1806
+ end
1807
+
1808
+ def range_to_tuple(range)
1809
+ first = to_tuple_int(range.begin || 1)
1810
+ last = to_tuple_int(range.end || :*)
1811
+ last -= 1 if range.exclude_end? && range.end && last != STAR_INT
1812
+ unless first <= last
1813
+ raise DataFormatError, "invalid range for sequence-set: %p" % [range]
1814
+ end
1815
+ [first, last]
1816
+ end
1817
+
1818
+ def to_tuple_int(obj) STARS.include?(obj) ? STAR_INT : nz_number(obj) end
1819
+ def from_tuple_int(num) num == STAR_INT ? :* : num end
1820
+
1821
+ def export_string_entries(entries)
1822
+ -entries.map { tuple_to_str _1 }.join(",")
1823
+ end
1824
+
1825
+ def tuple_to_str(tuple) tuple.uniq.map{ from_tuple_int _1 }.join(":") end
1826
+ def str_to_tuples(str) str.split(",", -1).map! { str_to_tuple _1 } end
1827
+ def str_to_tuple(str)
1828
+ raise DataFormatError, "invalid sequence set string" if str.empty?
1829
+ str.split(":", 2).map! { to_tuple_int _1 }.minmax
1830
+ end
1831
+
1832
+ def include_tuple?((min, max)) range_gte_to(min)&.cover?(min..max) end
1833
+
1834
+ def intersect_tuple?((min, max))
1835
+ range = range_gte_to(min) and
1836
+ range.include?(min) || range.include?(max) || (min..max).cover?(range)
1837
+ end
1838
+
1839
+ def modifying!
1840
+ if frozen?
1841
+ raise FrozenError, "can't modify frozen #{self.class}: %p" % [self]
1842
+ end
1843
+ end
1844
+
1845
+ def tuples_add(tuples) tuples.each do tuple_add _1 end; self end
1846
+ def tuples_subtract(tuples) tuples.each do tuple_subtract _1 end; self end
1847
+
1848
+ #
1849
+ # --|=====| |=====new tuple=====| append
1850
+ # ?????????-|=====new tuple=====|-|===lower===|-- insert
1851
+ #
1852
+ # |=====new tuple=====|
1853
+ # ---------??=======lower=======??--------------- noop
1854
+ #
1855
+ # ---------??===lower==|--|==| join remaining
1856
+ # ---------??===lower==|--|==|----|===upper===|-- join until upper
1857
+ # ---------??===lower==|--|==|--|=====upper===|-- join to upper
1858
+ def tuple_add(tuple)
1859
+ modifying!
1860
+ min, max = tuple
1861
+ lower, lower_idx = tuple_gte_with_index(min - 1)
1862
+ if lower.nil? then tuples << [min, max]
1863
+ elsif (max + 1) < lower.first then tuples.insert(lower_idx, [min, max])
1864
+ else tuple_coalesce(lower, lower_idx, min, max)
1865
+ end
1866
+ end
1867
+
1868
+ def tuple_coalesce(lower, lower_idx, min, max)
1869
+ return if lower.first <= min && max <= lower.last
1870
+ lower[0] = [min, lower.first].min
1871
+ lower[1] = [max, lower.last].max
1872
+ lower_idx += 1
1873
+ return if lower_idx == tuples.count
1874
+ tmax_adj = lower.last + 1
1875
+ upper, upper_idx = tuple_gte_with_index(tmax_adj)
1876
+ if upper
1877
+ tmax_adj < upper.first ? (upper_idx -= 1) : (lower[1] = upper.last)
1878
+ end
1879
+ tuples.slice!(lower_idx..upper_idx)
1880
+ end
1881
+
1882
+ # |====tuple================|
1883
+ # --|====| no more 1. noop
1884
+ # --|====|---------------------------|====lower====|-- 2. noop
1885
+ # -------|======lower================|---------------- 3. split
1886
+ # --------|=====lower================|---------------- 4. trim beginning
1887
+ #
1888
+ # -------|======lower====????????????----------------- trim lower
1889
+ # --------|=====lower====????????????----------------- delete lower
1890
+ #
1891
+ # -------??=====lower===============|----------------- 5. trim/delete one
1892
+ # -------??=====lower====|--|====| no more 6. delete rest
1893
+ # -------??=====lower====|--|====|---|====upper====|-- 7. delete until
1894
+ # -------??=====lower====|--|====|--|=====upper====|-- 8. delete and trim
1895
+ def tuple_subtract(tuple)
1896
+ modifying!
1897
+ min, max = tuple
1898
+ lower, idx = tuple_gte_with_index(min)
1899
+ if lower.nil? then nil # case 1.
1900
+ elsif max < lower.first then nil # case 2.
1901
+ elsif max < lower.last then tuple_trim_or_split lower, idx, min, max
1902
+ else tuples_trim_or_delete lower, idx, min, max
1903
+ end
1904
+ end
1905
+
1906
+ def tuple_trim_or_split(lower, idx, tmin, tmax)
1907
+ if lower.first < tmin # split
1908
+ tuples.insert(idx, [lower.first, tmin - 1])
1909
+ end
1910
+ lower[0] = tmax + 1
1911
+ end
1912
+
1913
+ def tuples_trim_or_delete(lower, lower_idx, tmin, tmax)
1914
+ if lower.first < tmin # trim lower
1915
+ lower[1] = tmin - 1
1916
+ lower_idx += 1
1917
+ end
1918
+ if tmax == lower.last # case 5
1919
+ upper_idx = lower_idx
1920
+ elsif (upper, upper_idx = tuple_gte_with_index(tmax + 1))
1921
+ upper_idx -= 1 # cases 7 and 8
1922
+ upper[0] = tmax + 1 if upper.first <= tmax # case 8 (else case 7)
1923
+ end
1924
+ tuples.slice!(lower_idx..upper_idx)
1925
+ end
1926
+
1927
+ def tuple_gte_with_index(num)
1928
+ idx = tuples.bsearch_index { _2 >= num } and [tuples[idx], idx]
1929
+ end
1930
+
1931
+ def range_gte_to(num)
1932
+ first, last = tuples.bsearch { _2 >= num }
1933
+ first..last if first
1934
+ end
1935
+
1936
+ def nz_number(num)
1937
+ String === num && !/\A[1-9]\d*\z/.match?(num) and
1938
+ raise DataFormatError, "%p is not a valid nz-number" % [num]
1939
+ NumValidator.ensure_nz_number Integer num
1940
+ rescue TypeError # To catch errors from Integer()
1941
+ raise DataFormatError, $!.message
1942
+ end
1943
+
1944
+ # intentionally defined after the class implementation
1945
+
1946
+ EMPTY = new.freeze
1947
+ FULL = self["1:*"]
1948
+ private_constant :EMPTY, :FULL
1949
+
1950
+ end
1951
+ end
1952
+ end