brakeman 6.2.2 → 8.0.6

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 (626) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +110 -0
  3. data/README.md +4 -4
  4. data/bundle/load.rb +16 -14
  5. data/bundle/ruby/3.2.0/gems/csv-3.3.6/LICENSE.txt +33 -0
  6. data/bundle/ruby/3.2.0/gems/csv-3.3.6/NEWS.md +1047 -0
  7. data/bundle/ruby/3.2.0/gems/csv-3.3.6/README.md +55 -0
  8. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/core_ext/array.rb +9 -0
  9. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/core_ext/string.rb +9 -0
  10. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/fields_converter.rb +96 -0
  11. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/input_record_separator.rb +18 -0
  12. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/parser.rb +1307 -0
  13. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/row.rb +781 -0
  14. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/table.rb +1055 -0
  15. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/version.rb +6 -0
  16. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv/writer.rb +209 -0
  17. data/bundle/ruby/3.2.0/gems/csv-3.3.6/lib/csv.rb +2989 -0
  18. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/CHANGELOG +111 -0
  19. data/bundle/ruby/{3.1.0/gems/erubis-2.7.0 → 3.2.0/gems/erubi-1.13.1}/MIT-LICENSE +1 -0
  20. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/README.rdoc +151 -0
  21. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi/capture_block.rb +91 -0
  22. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi/capture_end.rb +58 -0
  23. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi.rb +299 -0
  24. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/CHANGELOG.md +180 -4
  25. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/FAQ.md +1 -1
  26. data/bundle/ruby/3.2.0/gems/haml-6.4.0/Gemfile +34 -0
  27. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/MIT-LICENSE +1 -1
  28. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/README.md +23 -34
  29. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/REFERENCE.md +100 -171
  30. data/bundle/ruby/3.2.0/gems/haml-6.4.0/exe/haml +6 -0
  31. data/bundle/ruby/3.2.0/gems/haml-6.4.0/haml.gemspec +45 -0
  32. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/ambles.rb +20 -0
  33. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/attribute_builder.rb +162 -0
  34. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/attribute_compiler.rb +133 -0
  35. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/attribute_parser.rb +116 -0
  36. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/cli.rb +154 -0
  37. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/compiler/children_compiler.rb +155 -0
  38. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/compiler/comment_compiler.rb +51 -0
  39. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/compiler/doctype_compiler.rb +52 -0
  40. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/compiler/script_compiler.rb +114 -0
  41. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/compiler/silent_script_compiler.rb +24 -0
  42. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/compiler/tag_compiler.rb +76 -0
  43. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/compiler.rb +97 -0
  44. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/dynamic_merger.rb +67 -0
  45. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/engine.rb +59 -0
  46. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/lib/haml/error.rb +5 -4
  47. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/escape.rb +13 -0
  48. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/escape_any.rb +21 -0
  49. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/base.rb +12 -0
  50. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/cdata.rb +20 -0
  51. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/coffee.rb +17 -0
  52. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/css.rb +33 -0
  53. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/erb.rb +10 -0
  54. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/escaped.rb +22 -0
  55. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/javascript.rb +33 -0
  56. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/less.rb +20 -0
  57. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/markdown.rb +11 -0
  58. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/plain.rb +29 -0
  59. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/preserve.rb +22 -0
  60. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/ruby.rb +10 -0
  61. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/sass.rb +15 -0
  62. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/scss.rb +15 -0
  63. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/text_base.rb +25 -0
  64. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters/tilt_base.rb +59 -0
  65. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/filters.rb +75 -0
  66. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/force_escape.rb +29 -0
  67. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/helpers.rb +15 -0
  68. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/html.rb +22 -0
  69. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/identity.rb +13 -0
  70. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/object_ref.rb +35 -0
  71. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/lib/haml/parser.rb +159 -24
  72. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/rails_helpers.rb +53 -0
  73. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/rails_template.rb +62 -0
  74. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/railtie.rb +10 -0
  75. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/ruby_expression.rb +32 -0
  76. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/string_splitter.rb +140 -0
  77. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/template.rb +20 -0
  78. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/lib/haml/temple_line_counter.rb +2 -1
  79. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/lib/haml/util.rb +19 -15
  80. data/bundle/ruby/{3.1.0/gems/haml-5.2.2 → 3.2.0/gems/haml-6.4.0}/lib/haml/version.rb +1 -2
  81. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml/whitespace.rb +8 -0
  82. data/bundle/ruby/3.2.0/gems/haml-6.4.0/lib/haml.rb +13 -0
  83. data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/Changelog.md +4 -0
  84. data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/Gemfile +1 -0
  85. data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/list_renderer.rb +2 -2
  86. data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/menu.rb +7 -5
  87. data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/version.rb +1 -1
  88. data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline.rb +17 -12
  89. data/bundle/ruby/3.2.0/gems/parallel-1.28.0/lib/parallel/version.rb +4 -0
  90. data/bundle/ruby/{3.1.0/gems/parallel-1.26.3 → 3.2.0/gems/parallel-1.28.0}/lib/parallel.rb +12 -1
  91. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/config.rb +27 -26
  92. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/history.rb +3 -3
  93. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/io/ansi.rb +82 -142
  94. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/io/dumb.rb +16 -2
  95. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/io/windows.rb +120 -77
  96. data/bundle/ruby/3.2.0/gems/reline-0.7.0/lib/reline/io.rb +61 -0
  97. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/key_actor/base.rb +10 -4
  98. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/key_actor/emacs.rb +97 -97
  99. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/key_actor/vi_command.rb +182 -182
  100. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/key_actor/vi_insert.rb +137 -137
  101. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/key_stroke.rb +26 -16
  102. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/line_editor.rb +373 -537
  103. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/unicode/east_asian_width.rb +48 -23
  104. data/bundle/ruby/3.2.0/gems/reline-0.7.0/lib/reline/unicode.rb +421 -0
  105. data/bundle/ruby/3.2.0/gems/reline-0.7.0/lib/reline/version.rb +3 -0
  106. data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline.rb +49 -40
  107. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/NEWS.md +219 -1
  108. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/attribute.rb +7 -8
  109. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/cdata.rb +1 -1
  110. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/child.rb +2 -3
  111. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/comment.rb +1 -1
  112. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/doctype.rb +3 -8
  113. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/document.rb +21 -5
  114. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/element.rb +53 -59
  115. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/encoding.rb +3 -6
  116. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/functions.rb +3 -3
  117. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/instruction.rb +1 -1
  118. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/namespace.rb +4 -4
  119. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/node.rb +2 -2
  120. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/baseparser.rb +208 -116
  121. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/pullparser.rb +4 -0
  122. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/xpathparser.rb +4 -4
  123. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/quickpath.rb +19 -18
  124. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/rexml.rb +1 -1
  125. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/security.rb +2 -2
  126. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/source.rb +68 -8
  127. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/text.rb +29 -57
  128. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/validation/relaxng.rb +27 -26
  129. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/validation/validation.rb +8 -8
  130. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/xpath.rb +2 -13
  131. data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/xpath_parser.rb +44 -42
  132. data/bundle/ruby/{3.1.0/gems/ruby2ruby-2.5.1 → 3.2.0/gems/ruby2ruby-2.5.2}/History.rdoc +6 -0
  133. data/bundle/ruby/{3.1.0/gems/ruby2ruby-2.5.1 → 3.2.0/gems/ruby2ruby-2.5.2}/lib/ruby2ruby.rb +7 -4
  134. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/History.rdoc +67 -0
  135. data/bundle/ruby/3.2.0/gems/ruby_parser-3.22.0/Manifest.txt +39 -0
  136. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/README.rdoc +15 -3
  137. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/compare/normalize.rb +19 -3
  138. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/gauntlet.md +35 -5
  139. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/ruby_lexer.rb +9 -18
  140. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/ruby_lexer.rex.rb +1 -2
  141. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/ruby_parser.rb +18 -14
  142. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby_parser.yy → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser2.yy} +15 -22
  143. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser20.rb} +19 -22
  144. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser21.rb} +19 -22
  145. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser22.rb} +19 -22
  146. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser23.rb} +19 -22
  147. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser24.rb} +19 -22
  148. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser25.rb} +19 -22
  149. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser26.rb} +19 -22
  150. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser27.rb} +21 -24
  151. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby3_parser.yy → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser3.yy} +214 -79
  152. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser30.rb} +3339 -3351
  153. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.rb → 3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser31.rb} +3772 -3808
  154. data/bundle/ruby/3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser32.rb +13565 -0
  155. data/bundle/ruby/3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser33.rb +13653 -0
  156. data/bundle/ruby/3.2.0/gems/ruby_parser-3.22.0/lib/ruby_parser34.rb +13653 -0
  157. data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/ruby_parser_extras.rb +109 -60
  158. data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/History.rdoc +20 -0
  159. data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/lib/pt_testcase.rb +1 -1
  160. data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/lib/sexp.rb +1 -1
  161. data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/lib/sexp_processor.rb +1 -1
  162. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/CHANGES +8 -2
  163. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/Gemfile +5 -2
  164. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/LICENSE +1 -1
  165. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/README.jp.md +10 -12
  166. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/README.md +21 -26
  167. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/embedded.rb +1 -1
  168. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/logic_less/context.rb +4 -3
  169. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/splat/builder.rb +18 -19
  170. data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/version.rb +1 -1
  171. data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/CHANGES +12 -0
  172. data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/README.md +1 -1
  173. data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/encoding.rb +1 -1
  174. data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/static_analyzer.rb +1 -1
  175. data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/string_splitter.rb +61 -5
  176. data/bundle/ruby/3.2.0/gems/temple-0.10.6/lib/temple/parser_engine.rb +34 -0
  177. data/bundle/ruby/3.2.0/gems/temple-0.10.6/lib/temple/static_analyzer.rb +148 -0
  178. data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/version.rb +1 -1
  179. data/bundle/ruby/3.2.0/gems/terminal-table-4.0.0/History.rdoc +149 -0
  180. data/bundle/ruby/3.2.0/gems/terminal-table-4.0.0/README.md +417 -0
  181. data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/lib/terminal-table/cell.rb +9 -9
  182. data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/lib/terminal-table/row.rb +18 -4
  183. data/bundle/ruby/3.2.0/gems/terminal-table-4.0.0/lib/terminal-table/separator.rb +66 -0
  184. data/bundle/ruby/3.2.0/gems/terminal-table-4.0.0/lib/terminal-table/style.rb +284 -0
  185. data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/lib/terminal-table/table.rb +49 -18
  186. data/bundle/ruby/3.2.0/gems/terminal-table-4.0.0/lib/terminal-table/util.rb +13 -0
  187. data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/lib/terminal-table/version.rb +1 -1
  188. data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/lib/terminal-table.rb +2 -2
  189. data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/terminal-table.gemspec +3 -4
  190. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/COPYING +1 -1
  191. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/asciidoc.rb +12 -5
  192. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/babel.rb +5 -0
  193. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/builder.rb +4 -0
  194. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/coffee.rb +14 -4
  195. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/commonmarker.rb +65 -0
  196. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/csv.rb +63 -0
  197. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/erb.rb +130 -0
  198. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/erubi.rb +41 -8
  199. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/etanni.rb +7 -0
  200. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/haml.rb +67 -1
  201. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/kramdown.rb +59 -0
  202. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/liquid.rb +93 -0
  203. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/livescript.rb +11 -4
  204. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/mapping.rb +9 -9
  205. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/markaby.rb +11 -2
  206. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/nokogiri.rb +13 -2
  207. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/pandoc.rb +81 -0
  208. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/pipeline.rb +6 -1
  209. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/plain.rb +5 -1
  210. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/prawn.rb +17 -6
  211. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/radius.rb +96 -0
  212. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rdiscount.rb +82 -0
  213. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rdoc.rb +41 -0
  214. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/redcarpet.rb +73 -0
  215. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/redcloth.rb +40 -0
  216. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rst-pandoc.rb +33 -0
  217. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/sass.rb +16 -3
  218. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/slim.rb +18 -0
  219. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/string.rb +10 -2
  220. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/template.rb +189 -33
  221. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/typescript.rb +5 -0
  222. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/yajl.rb +91 -0
  223. data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt.rb +9 -5
  224. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/CHANGELOG.md +299 -0
  225. data/bundle/ruby/{3.1.0/gems/unicode-display_width-1.8.0 → 3.2.0/gems/unicode-display_width-3.2.0}/MIT-LICENSE.txt +1 -1
  226. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/README.md +194 -0
  227. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/data/display_width.marshal.gz +0 -0
  228. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/constants.rb +10 -0
  229. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/emoji_support.rb +55 -0
  230. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/index.rb +34 -0
  231. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/no_string_ext.rb +8 -0
  232. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/reline_ext.rb +14 -0
  233. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width/string_ext.rb +9 -0
  234. data/bundle/ruby/3.2.0/gems/unicode-display_width-3.2.0/lib/unicode/display_width.rb +247 -0
  235. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/CHANGELOG.md +202 -0
  236. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/CODE_OF_CONDUCT.md +74 -0
  237. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/Gemfile +9 -0
  238. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/Gemfile.lock +37 -0
  239. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/MIT-LICENSE.txt +20 -0
  240. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/README.md +205 -0
  241. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/data/emoji.marshal.gz +0 -0
  242. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/data/generate_constants.rb +344 -0
  243. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/constants.rb +50 -0
  244. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex.rb +8 -0
  245. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_basic.rb +8 -0
  246. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_emoji_keycap.rb +8 -0
  247. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_include_mqe.rb +8 -0
  248. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_include_mqe_uqe.rb +8 -0
  249. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_include_text.rb +8 -0
  250. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_picto.rb +8 -0
  251. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_picto_no_emoji.rb +8 -0
  252. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_possible.rb +8 -0
  253. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_prop_component.rb +8 -0
  254. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_prop_emoji.rb +8 -0
  255. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_prop_modifier.rb +8 -0
  256. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_prop_modifier_base.rb +8 -0
  257. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_prop_presentation.rb +8 -0
  258. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_text.rb +8 -0
  259. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_text_presentation.rb +8 -0
  260. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_valid.rb +8 -0
  261. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_valid_include_text.rb +8 -0
  262. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_well_formed.rb +8 -0
  263. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated/regex_well_formed_include_text.rb +8 -0
  264. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex.rb +8 -0
  265. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_basic.rb +8 -0
  266. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_emoji_keycap.rb +8 -0
  267. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_include_mqe.rb +8 -0
  268. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_include_mqe_uqe.rb +8 -0
  269. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_include_text.rb +8 -0
  270. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_picto.rb +8 -0
  271. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_picto_no_emoji.rb +8 -0
  272. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_possible.rb +8 -0
  273. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_prop_component.rb +8 -0
  274. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_prop_emoji.rb +8 -0
  275. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_prop_modifier.rb +8 -0
  276. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_prop_modifier_base.rb +8 -0
  277. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_prop_presentation.rb +8 -0
  278. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_text.rb +8 -0
  279. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_text_presentation.rb +8 -0
  280. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_valid.rb +8 -0
  281. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_valid_include_text.rb +8 -0
  282. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_well_formed.rb +8 -0
  283. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/generated_native/regex_well_formed_include_text.rb +8 -0
  284. data/bundle/ruby/{3.1.0/gems/unicode-display_width-1.8.0/lib/unicode/display_width → 3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji}/index.rb +5 -3
  285. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/lazy_constants.rb +56 -0
  286. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji/list.rb +13 -0
  287. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/lib/unicode/emoji.rb +111 -0
  288. data/bundle/ruby/3.2.0/gems/unicode-emoji-4.2.0/unicode-emoji.gemspec +22 -0
  289. data/lib/brakeman/app_tree.rb +87 -25
  290. data/lib/brakeman/checks/base_check.rb +5 -2
  291. data/lib/brakeman/checks/check_deserialize.rb +4 -1
  292. data/lib/brakeman/checks/check_eol_rails.rb +2 -0
  293. data/lib/brakeman/checks/check_eol_ruby.rb +2 -0
  294. data/lib/brakeman/checks/check_evaluation.rb +45 -8
  295. data/lib/brakeman/checks/check_execute.rb +23 -19
  296. data/lib/brakeman/checks/check_model_attr_accessible.rb +1 -0
  297. data/lib/brakeman/checks/check_model_attributes.rb +1 -1
  298. data/lib/brakeman/checks/check_render.rb +6 -27
  299. data/lib/brakeman/checks/check_render_rce.rb +43 -0
  300. data/lib/brakeman/checks/check_session_settings.rb +1 -1
  301. data/lib/brakeman/checks/check_sql.rb +17 -7
  302. data/lib/brakeman/checks/check_weak_rsa_key.rb +1 -1
  303. data/lib/brakeman/checks.rb +31 -25
  304. data/lib/brakeman/commandline.rb +22 -5
  305. data/lib/brakeman/file_parser.rb +2 -0
  306. data/lib/brakeman/file_path.rb +4 -0
  307. data/lib/brakeman/logger.rb +265 -0
  308. data/lib/brakeman/messages.rb +1 -1
  309. data/lib/brakeman/options.rb +22 -16
  310. data/lib/brakeman/parsers/haml6_embedded.rb +23 -0
  311. data/lib/brakeman/parsers/rails_erubi.rb +82 -0
  312. data/lib/brakeman/parsers/template_parser.rb +39 -22
  313. data/lib/brakeman/processor.rb +4 -2
  314. data/lib/brakeman/processors/alias_processor.rb +18 -4
  315. data/lib/brakeman/processors/base_processor.rb +15 -6
  316. data/lib/brakeman/processors/controller_alias_processor.rb +1 -1
  317. data/lib/brakeman/processors/controller_processor.rb +3 -3
  318. data/lib/brakeman/processors/{erubis_template_processor.rb → erubi_template_procesor.rb} +3 -3
  319. data/lib/brakeman/processors/gem_processor.rb +1 -1
  320. data/lib/brakeman/processors/haml6_template_processor.rb +92 -0
  321. data/lib/brakeman/processors/haml_template_processor.rb +20 -3
  322. data/lib/brakeman/processors/lib/file_type_detector.rb +9 -7
  323. data/lib/brakeman/processors/lib/rails2_config_processor.rb +5 -4
  324. data/lib/brakeman/processors/lib/rails2_route_processor.rb +1 -1
  325. data/lib/brakeman/processors/lib/rails3_config_processor.rb +11 -2
  326. data/lib/brakeman/processors/lib/render_helper.rb +42 -3
  327. data/lib/brakeman/processors/lib/render_path.rb +1 -1
  328. data/lib/brakeman/processors/model_processor.rb +1 -1
  329. data/lib/brakeman/processors/template_processor.rb +1 -1
  330. data/lib/brakeman/report/ignore/config.rb +1 -2
  331. data/lib/brakeman/report/pager.rb +1 -1
  332. data/lib/brakeman/report/report_html.rb +1 -1
  333. data/lib/brakeman/report/report_junit.rb +4 -57
  334. data/lib/brakeman/report/report_sarif.rb +122 -2
  335. data/lib/brakeman/report/templates/header.html.erb +8 -3
  336. data/lib/brakeman/report/templates/ignored_warnings.html.erb +3 -3
  337. data/lib/brakeman/rescanner.rb +40 -390
  338. data/lib/brakeman/scanner.rb +113 -98
  339. data/lib/brakeman/tracker/collection.rb +12 -2
  340. data/lib/brakeman/tracker/config.rb +17 -13
  341. data/lib/brakeman/tracker/constants.rb +17 -2
  342. data/lib/brakeman/tracker/controller.rb +1 -1
  343. data/lib/brakeman/tracker/file_cache.rb +83 -0
  344. data/lib/brakeman/tracker.rb +32 -17
  345. data/lib/brakeman/version.rb +1 -1
  346. data/lib/brakeman.rb +130 -55
  347. data/lib/ruby_parser/bm_sexp.rb +14 -0
  348. metadata +460 -410
  349. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/CHANGES.txt +0 -828
  350. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/README.txt +0 -102
  351. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis +0 -3468
  352. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/erubis-run.rb +0 -132
  353. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/contrib/inline-require +0 -179
  354. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/context.rb +0 -83
  355. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/converter.rb +0 -357
  356. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ec.rb +0 -117
  357. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ecpp.rb +0 -113
  358. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejava.rb +0 -110
  359. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ejavascript.rb +0 -119
  360. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/enhanced.rb +0 -126
  361. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eperl.rb +0 -95
  362. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/ephp.rb +0 -99
  363. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/eruby.rb +0 -125
  364. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/escheme.rb +0 -114
  365. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine/optimized.rb +0 -127
  366. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/engine.rb +0 -120
  367. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/enhancer.rb +0 -723
  368. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/error.rb +0 -23
  369. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb +0 -88
  370. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/generator.rb +0 -85
  371. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helper.rb +0 -47
  372. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_form_helper.rb +0 -197
  373. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_helper.rb +0 -353
  374. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/local-setting.rb +0 -9
  375. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/main.rb +0 -516
  376. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/preprocessing.rb +0 -58
  377. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/tiny.rb +0 -144
  378. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis/util.rb +0 -22
  379. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/lib/erubis.rb +0 -73
  380. data/bundle/ruby/3.1.0/gems/erubis-2.7.0/setup.rb +0 -1331
  381. data/bundle/ruby/3.1.0/gems/haml-5.2.2/Gemfile +0 -16
  382. data/bundle/ruby/3.1.0/gems/haml-5.2.2/TODO +0 -24
  383. data/bundle/ruby/3.1.0/gems/haml-5.2.2/haml.gemspec +0 -45
  384. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/attribute_builder.rb +0 -219
  385. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/attribute_compiler.rb +0 -237
  386. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/attribute_parser.rb +0 -150
  387. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/buffer.rb +0 -182
  388. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/compiler.rb +0 -330
  389. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/engine.rb +0 -238
  390. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/escapable.rb +0 -77
  391. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/exec.rb +0 -347
  392. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/filters.rb +0 -399
  393. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/generator.rb +0 -42
  394. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/helpers/action_view_extensions.rb +0 -60
  395. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/helpers/action_view_mods.rb +0 -132
  396. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/helpers/action_view_xss_mods.rb +0 -60
  397. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/helpers/safe_erubi_template.rb +0 -20
  398. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/helpers/safe_erubis_template.rb +0 -33
  399. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/helpers/xss_mods.rb +0 -114
  400. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/helpers.rb +0 -709
  401. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/options.rb +0 -273
  402. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/plugin.rb +0 -54
  403. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/railtie.rb +0 -53
  404. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/sass_rails_filter.rb +0 -47
  405. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/template/options.rb +0 -27
  406. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/template.rb +0 -39
  407. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml/temple_engine.rb +0 -124
  408. data/bundle/ruby/3.1.0/gems/haml-5.2.2/lib/haml.rb +0 -25
  409. data/bundle/ruby/3.1.0/gems/haml-5.2.2/yard/default/fulldoc/html/css/common.sass +0 -15
  410. data/bundle/ruby/3.1.0/gems/haml-5.2.2/yard/default/layout/html/footer.erb +0 -12
  411. data/bundle/ruby/3.1.0/gems/parallel-1.26.3/lib/parallel/version.rb +0 -4
  412. data/bundle/ruby/3.1.0/gems/reline-0.5.10/lib/reline/io.rb +0 -41
  413. data/bundle/ruby/3.1.0/gems/reline-0.5.10/lib/reline/terminfo.rb +0 -158
  414. data/bundle/ruby/3.1.0/gems/reline-0.5.10/lib/reline/unicode.rb +0 -671
  415. data/bundle/ruby/3.1.0/gems/reline-0.5.10/lib/reline/version.rb +0 -3
  416. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/Manifest.txt +0 -48
  417. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby20_parser.y +0 -2707
  418. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby21_parser.y +0 -2724
  419. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby22_parser.y +0 -2735
  420. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby23_parser.y +0 -2737
  421. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby24_parser.y +0 -2745
  422. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby25_parser.y +0 -2745
  423. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby26_parser.y +0 -2760
  424. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby27_parser.y +0 -3360
  425. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby30_parser.y +0 -3508
  426. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby31_parser.y +0 -3542
  427. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.rb +0 -13601
  428. data/bundle/ruby/3.1.0/gems/ruby_parser-3.20.3/lib/ruby32_parser.y +0 -3543
  429. data/bundle/ruby/3.1.0/gems/temple-0.10.3/lib/temple/static_analyzer.rb +0 -78
  430. data/bundle/ruby/3.1.0/gems/terminal-table-1.8.0/History.rdoc +0 -85
  431. data/bundle/ruby/3.1.0/gems/terminal-table-1.8.0/README.rdoc +0 -247
  432. data/bundle/ruby/3.1.0/gems/terminal-table-1.8.0/lib/terminal-table/separator.rb +0 -14
  433. data/bundle/ruby/3.1.0/gems/terminal-table-1.8.0/lib/terminal-table/style.rb +0 -79
  434. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/creole.rb +0 -14
  435. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/csv.rb +0 -53
  436. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/erb.rb +0 -65
  437. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/erubis.rb +0 -51
  438. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/kramdown.rb +0 -13
  439. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/liquid.rb +0 -40
  440. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/maruku.rb +0 -10
  441. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/pandoc.rb +0 -39
  442. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/radius.rb +0 -41
  443. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/rdiscount.rb +0 -23
  444. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/rdoc.rb +0 -19
  445. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/redcarpet.rb +0 -31
  446. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/redcloth.rb +0 -13
  447. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/rst-pandoc.rb +0 -10
  448. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/slim.rb +0 -5
  449. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/wikicloth.rb +0 -12
  450. data/bundle/ruby/3.1.0/gems/tilt-2.4.0/lib/tilt/yajl.rb +0 -81
  451. data/bundle/ruby/3.1.0/gems/unicode-display_width-1.8.0/CHANGELOG.md +0 -137
  452. data/bundle/ruby/3.1.0/gems/unicode-display_width-1.8.0/README.md +0 -124
  453. data/bundle/ruby/3.1.0/gems/unicode-display_width-1.8.0/data/display_width.marshal.gz +0 -0
  454. data/bundle/ruby/3.1.0/gems/unicode-display_width-1.8.0/lib/unicode/display_width/constants.rb +0 -8
  455. data/bundle/ruby/3.1.0/gems/unicode-display_width-1.8.0/lib/unicode/display_width/no_string_ext.rb +0 -7
  456. data/bundle/ruby/3.1.0/gems/unicode-display_width-1.8.0/lib/unicode/display_width/string_ext.rb +0 -17
  457. data/bundle/ruby/3.1.0/gems/unicode-display_width-1.8.0/lib/unicode/display_width.rb +0 -51
  458. data/lib/brakeman/parsers/erubis_patch.rb +0 -11
  459. data/lib/brakeman/parsers/rails2_erubis.rb +0 -9
  460. data/lib/brakeman/parsers/rails2_xss_plugin_erubis.rb +0 -52
  461. data/lib/brakeman/parsers/rails3_erubis.rb +0 -85
  462. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/AUTHORS +0 -0
  463. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/COPYING +0 -0
  464. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/LICENSE +0 -0
  465. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/README.md +0 -0
  466. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/TODO +0 -0
  467. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/highline.gemspec +0 -0
  468. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/builtin_styles.rb +0 -0
  469. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/color_scheme.rb +0 -0
  470. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/compatibility.rb +0 -0
  471. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/custom_errors.rb +0 -0
  472. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/import.rb +0 -0
  473. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/io_console_compatible.rb +0 -0
  474. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/list.rb +0 -0
  475. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/menu/item.rb +0 -0
  476. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/paginator.rb +0 -0
  477. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/question/answer_converter.rb +0 -0
  478. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/question.rb +0 -0
  479. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/question_asker.rb +0 -0
  480. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/simulate.rb +0 -0
  481. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/statement.rb +0 -0
  482. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/string.rb +0 -0
  483. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/string_extensions.rb +0 -0
  484. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/style.rb +0 -0
  485. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/template_renderer.rb +0 -0
  486. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/terminal/io_console.rb +0 -0
  487. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/terminal/ncurses.rb +0 -0
  488. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/terminal/unix_stty.rb +0 -0
  489. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/terminal.rb +0 -0
  490. /data/bundle/ruby/{3.1.0/gems/highline-3.1.1 → 3.2.0/gems/highline-3.1.2}/lib/highline/wrapper.rb +0 -0
  491. /data/bundle/ruby/{3.1.0/gems/parallel-1.26.3 → 3.2.0/gems/parallel-1.28.0}/MIT-LICENSE.txt +0 -0
  492. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/BSDL +0 -0
  493. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/COPYING +0 -0
  494. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/README.md +0 -0
  495. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/face.rb +0 -0
  496. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/key_actor/composite.rb +0 -0
  497. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/key_actor.rb +0 -0
  498. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/lib/reline/kill_ring.rb +0 -0
  499. /data/bundle/ruby/{3.1.0/gems/reline-0.5.10 → 3.2.0/gems/reline-0.7.0}/license_of_rb-readline +0 -0
  500. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/LICENSE.txt +0 -0
  501. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/README.md +0 -0
  502. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/attlistdecl.rb +0 -0
  503. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/dtd/attlistdecl.rb +0 -0
  504. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/dtd/dtd.rb +0 -0
  505. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/dtd/elementdecl.rb +0 -0
  506. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/dtd/entitydecl.rb +0 -0
  507. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/dtd/notationdecl.rb +0 -0
  508. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/entity.rb +0 -0
  509. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/formatters/default.rb +0 -0
  510. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/formatters/pretty.rb +0 -0
  511. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/formatters/transitive.rb +0 -0
  512. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/light/node.rb +0 -0
  513. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/output.rb +0 -0
  514. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parent.rb +0 -0
  515. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parseexception.rb +0 -0
  516. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/lightparser.rb +0 -0
  517. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/sax2parser.rb +0 -0
  518. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/streamparser.rb +0 -0
  519. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/treeparser.rb +0 -0
  520. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/parsers/ultralightparser.rb +0 -0
  521. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/sax2listener.rb +0 -0
  522. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/streamlistener.rb +0 -0
  523. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/undefinednamespaceexception.rb +0 -0
  524. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/validation/validationexception.rb +0 -0
  525. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/xmldecl.rb +0 -0
  526. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml/xmltokens.rb +0 -0
  527. /data/bundle/ruby/{3.1.0/gems/rexml-3.3.8 → 3.2.0/gems/rexml-3.4.4}/lib/rexml.rb +0 -0
  528. /data/bundle/ruby/{3.1.0/gems/ruby2ruby-2.5.1 → 3.2.0/gems/ruby2ruby-2.5.2}/Manifest.txt +0 -0
  529. /data/bundle/ruby/{3.1.0/gems/ruby2ruby-2.5.1 → 3.2.0/gems/ruby2ruby-2.5.2}/README.rdoc +0 -0
  530. /data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/debugging.md +0 -0
  531. /data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/rp_extensions.rb +0 -0
  532. /data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/rp_stringscanner.rb +0 -0
  533. /data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/ruby_lexer.rex +0 -0
  534. /data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/lib/ruby_lexer_strings.rb +0 -0
  535. /data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/tools/munge.rb +0 -0
  536. /data/bundle/ruby/{3.1.0/gems/ruby_parser-3.20.3 → 3.2.0/gems/ruby_parser-3.22.0}/tools/ripper.rb +0 -0
  537. /data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/Manifest.txt +0 -0
  538. /data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/README.rdoc +0 -0
  539. /data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/lib/composite_sexp_processor.rb +0 -0
  540. /data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/lib/sexp_matcher.rb +0 -0
  541. /data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/lib/strict_sexp.rb +0 -0
  542. /data/bundle/ruby/{3.1.0/gems/sexp_processor-4.17.2 → 3.2.0/gems/sexp_processor-4.17.5}/lib/unique.rb +0 -0
  543. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/code_attributes.rb +0 -0
  544. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/command.rb +0 -0
  545. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/controls.rb +0 -0
  546. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/do_inserter.rb +0 -0
  547. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/end_inserter.rb +0 -0
  548. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/engine.rb +0 -0
  549. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/erb_converter.rb +0 -0
  550. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/filter.rb +0 -0
  551. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/grammar.rb +0 -0
  552. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/include.rb +0 -0
  553. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/interpolation.rb +0 -0
  554. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/logic_less/filter.rb +0 -0
  555. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/logic_less.rb +0 -0
  556. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/parser.rb +0 -0
  557. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/railtie.rb +0 -0
  558. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/smart/escaper.rb +0 -0
  559. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/smart/filter.rb +0 -0
  560. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/smart/parser.rb +0 -0
  561. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/smart.rb +0 -0
  562. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/splat/filter.rb +0 -0
  563. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/template.rb +0 -0
  564. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim/translator.rb +0 -0
  565. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/lib/slim.rb +0 -0
  566. /data/bundle/ruby/{3.1.0/gems/slim-5.2.1 → 3.2.0/gems/slim-5.2.2}/slim.gemspec +0 -0
  567. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/EXPRESSIONS.md +0 -0
  568. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/Gemfile +0 -0
  569. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/LICENSE +0 -0
  570. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/engine.rb +0 -0
  571. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/erb/engine.rb +0 -0
  572. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/erb/parser.rb +0 -0
  573. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/erb/template.rb +0 -0
  574. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/erb/trimming.rb +0 -0
  575. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/exceptions.rb +0 -0
  576. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filter.rb +0 -0
  577. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/ambles.rb +0 -0
  578. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/code_merger.rb +0 -0
  579. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/control_flow.rb +0 -0
  580. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/dynamic_inliner.rb +0 -0
  581. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/dynamic_merger.rb +0 -0
  582. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/eraser.rb +0 -0
  583. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/escapable.rb +0 -0
  584. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/multi_flattener.rb +0 -0
  585. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/remove_bom.rb +0 -0
  586. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/static_merger.rb +0 -0
  587. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/filters/validator.rb +0 -0
  588. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/generator.rb +0 -0
  589. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/generators/array.rb +0 -0
  590. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/generators/array_buffer.rb +0 -0
  591. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/generators/erb.rb +0 -0
  592. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/generators/rails_output_buffer.rb +0 -0
  593. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/generators/string_buffer.rb +0 -0
  594. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/grammar.rb +0 -0
  595. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/attribute_merger.rb +0 -0
  596. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/attribute_remover.rb +0 -0
  597. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/attribute_sorter.rb +0 -0
  598. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/dispatcher.rb +0 -0
  599. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/fast.rb +0 -0
  600. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/filter.rb +0 -0
  601. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/pretty.rb +0 -0
  602. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/html/safe.rb +0 -0
  603. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/map.rb +0 -0
  604. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/mixins/dispatcher.rb +0 -0
  605. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/mixins/engine_dsl.rb +0 -0
  606. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/mixins/grammar_dsl.rb +0 -0
  607. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/mixins/options.rb +0 -0
  608. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/mixins/template.rb +0 -0
  609. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/parser.rb +0 -0
  610. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/templates/rails.rb +0 -0
  611. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/templates/tilt.rb +0 -0
  612. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/templates.rb +0 -0
  613. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple/utils.rb +0 -0
  614. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/lib/temple.rb +0 -0
  615. /data/bundle/ruby/{3.1.0/gems/temple-0.10.3 → 3.2.0/gems/temple-0.10.6}/temple.gemspec +0 -0
  616. /data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/Gemfile +0 -0
  617. /data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/LICENSE.txt +0 -0
  618. /data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/Manifest +0 -0
  619. /data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/Todo.rdoc +0 -0
  620. /data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/lib/terminal-table/import.rb +0 -0
  621. /data/bundle/ruby/{3.1.0/gems/terminal-table-1.8.0 → 3.2.0/gems/terminal-table-4.0.0}/lib/terminal-table/table_helper.rb +0 -0
  622. /data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/_emacs_org.rb +0 -0
  623. /data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/_handlebars.rb +0 -0
  624. /data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/_jbuilder.rb +0 -0
  625. /data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/_org.rb +0 -0
  626. /data/bundle/ruby/{3.1.0/gems/tilt-2.4.0 → 3.2.0/gems/tilt-2.8.0}/lib/tilt/cli.rb +0 -0
@@ -0,0 +1,1307 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "strscan"
4
+
5
+ require_relative "input_record_separator"
6
+ require_relative "row"
7
+ require_relative "table"
8
+
9
+ class CSV
10
+ # Note: Don't use this class directly. This is an internal class.
11
+ class Parser
12
+ #
13
+ # A CSV::Parser is m17n aware. The parser works in the Encoding of the IO
14
+ # or String object being read from or written to. Your data is never transcoded
15
+ # (unless you ask Ruby to transcode it for you) and will literally be parsed in
16
+ # the Encoding it is in. Thus CSV will return Arrays or Rows of Strings in the
17
+ # Encoding of your data. This is accomplished by transcoding the parser itself
18
+ # into your Encoding.
19
+ #
20
+
21
+ class << self
22
+ ARGF_OBJECT_ID = ARGF.object_id
23
+ # Convenient method to check whether the give input reached EOF
24
+ # or not.
25
+ def eof?(input)
26
+ # We can't use input != ARGF in Ractor. Because ARGF isn't a
27
+ # shareable object.
28
+ input.object_id != ARGF_OBJECT_ID and
29
+ input.respond_to?(:eof) and
30
+ input.eof?
31
+ end
32
+ end
33
+
34
+ # Raised when encoding is invalid.
35
+ class InvalidEncoding < StandardError
36
+ end
37
+
38
+ # Raised when unexpected case is happen.
39
+ class UnexpectedError < StandardError
40
+ end
41
+
42
+ #
43
+ # CSV::Scanner receives a CSV output, scans it and return the content.
44
+ # It also controls the life cycle of the object with its methods +keep_start+,
45
+ # +keep_end+, +keep_back+, +keep_drop+.
46
+ #
47
+ # Uses StringScanner (the official strscan gem). Strscan provides lexical
48
+ # scanning operations on a String. We inherit its object and take advantage
49
+ # on the methods. For more information, please visit:
50
+ # https://docs.ruby-lang.org/en/master/StringScanner.html
51
+ #
52
+ class Scanner < StringScanner
53
+ alias_method :scan_all, :scan
54
+
55
+ def initialize(*args)
56
+ super
57
+ @keeps = []
58
+ end
59
+
60
+ def each_line(row_separator)
61
+ position = pos
62
+ rest.each_line(row_separator) do |line|
63
+ position += line.bytesize
64
+ self.pos = position
65
+ yield(line)
66
+ end
67
+ end
68
+
69
+ def keep_start
70
+ @keeps.push(pos)
71
+ end
72
+
73
+ def keep_end
74
+ start = @keeps.pop
75
+ string.byteslice(start, pos - start)
76
+ end
77
+
78
+ def keep_back
79
+ self.pos = @keeps.pop
80
+ end
81
+
82
+ def keep_drop
83
+ @keeps.pop
84
+ end
85
+ end
86
+
87
+ #
88
+ # CSV::InputsScanner receives IO inputs, encoding and the chunk_size.
89
+ # It also controls the life cycle of the object with its methods +keep_start+,
90
+ # +keep_end+, +keep_back+, +keep_drop+.
91
+ #
92
+ # CSV::InputsScanner.scan() tries to match with pattern at the current position.
93
+ # If there's a match, the scanner advances the "scan pointer" and returns the matched string.
94
+ # Otherwise, the scanner returns nil.
95
+ #
96
+ # CSV::InputsScanner.rest() returns the "rest" of the string (i.e. everything after the scan pointer).
97
+ # If there is no more data (eos? = true), it returns "".
98
+ #
99
+ class InputsScanner
100
+ def initialize(inputs, encoding, row_separator, chunk_size: 8192)
101
+ @inputs = inputs.dup
102
+ @encoding = encoding
103
+ @row_separator = row_separator
104
+ @chunk_size = chunk_size
105
+ @last_scanner = @inputs.empty?
106
+ @keeps = []
107
+ read_chunk
108
+ end
109
+
110
+ def each_line(row_separator)
111
+ return enum_for(__method__, row_separator) unless block_given?
112
+ buffer = nil
113
+ input = @scanner.rest
114
+ position = @scanner.pos
115
+ offset = 0
116
+ n_row_separator_chars = row_separator.size
117
+ # trace(__method__, :start, input)
118
+ while true
119
+ input.each_line(row_separator) do |line|
120
+ @scanner.pos += line.bytesize
121
+ if buffer
122
+ if n_row_separator_chars == 2 and
123
+ buffer.end_with?(row_separator[0]) and
124
+ line.start_with?(row_separator[1])
125
+ buffer << line[0]
126
+ line = line[1..-1]
127
+ position += buffer.bytesize + offset
128
+ @scanner.pos = position
129
+ offset = 0
130
+ yield(buffer)
131
+ buffer = nil
132
+ next if line.empty?
133
+ else
134
+ buffer << line
135
+ line = buffer
136
+ buffer = nil
137
+ end
138
+ end
139
+ if line.end_with?(row_separator)
140
+ position += line.bytesize + offset
141
+ @scanner.pos = position
142
+ offset = 0
143
+ yield(line)
144
+ else
145
+ buffer = line
146
+ end
147
+ end
148
+ break unless read_chunk
149
+ input = @scanner.rest
150
+ position = @scanner.pos
151
+ offset = -buffer.bytesize if buffer
152
+ end
153
+ yield(buffer) if buffer
154
+ end
155
+
156
+ def scan(pattern)
157
+ # trace(__method__, pattern, :start)
158
+ value = @scanner.scan(pattern)
159
+ # trace(__method__, pattern, :done, :last, value) if @last_scanner
160
+ return value if @last_scanner
161
+
162
+ read_chunk if value and @scanner.eos?
163
+ # trace(__method__, pattern, :done, value)
164
+ value
165
+ end
166
+
167
+ def scan_all(pattern)
168
+ # trace(__method__, pattern, :start)
169
+ value = @scanner.scan(pattern)
170
+ # trace(__method__, pattern, :done, :last, value) if @last_scanner
171
+ return value if @last_scanner
172
+
173
+ # trace(__method__, pattern, :done, :nil) if value.nil?
174
+ return nil if value.nil?
175
+ while @scanner.eos? and read_chunk and (sub_value = @scanner.scan(pattern))
176
+ # trace(__method__, pattern, :sub, sub_value)
177
+ value << sub_value
178
+ end
179
+ # trace(__method__, pattern, :done, value)
180
+ value
181
+ end
182
+
183
+ def eos?
184
+ @last_scanner and @scanner.eos?
185
+ end
186
+
187
+ def keep_start
188
+ # trace(__method__, :start)
189
+ adjust_last_keep
190
+ @keeps.push([@scanner, @scanner.pos, nil])
191
+ # trace(__method__, :done)
192
+ end
193
+
194
+ def keep_end
195
+ # trace(__method__, :start)
196
+ scanner, start, buffer = @keeps.pop
197
+ if scanner == @scanner
198
+ keep = @scanner.string.byteslice(start, @scanner.pos - start)
199
+ else
200
+ keep = @scanner.string.byteslice(0, @scanner.pos)
201
+ end
202
+ if buffer
203
+ buffer << keep
204
+ keep = buffer
205
+ end
206
+ # trace(__method__, :done, keep)
207
+ keep
208
+ end
209
+
210
+ def keep_back
211
+ # trace(__method__, :start)
212
+ scanner, start, buffer = @keeps.pop
213
+ if buffer
214
+ # trace(__method__, :rescan, start, buffer)
215
+ string = @scanner.string
216
+ if scanner == @scanner
217
+ keep = string.byteslice(start,
218
+ string.bytesize - @scanner.pos - start)
219
+ else
220
+ keep = string
221
+ end
222
+ if keep and not keep.empty?
223
+ @inputs.unshift(StringIO.new(keep))
224
+ @last_scanner = false
225
+ end
226
+ @scanner = StringScanner.new(buffer)
227
+ else
228
+ if @scanner != scanner
229
+ message = "scanners are different but no buffer: "
230
+ message += "#{@scanner.inspect}(#{@scanner.object_id}): "
231
+ message += "#{scanner.inspect}(#{scanner.object_id})"
232
+ raise UnexpectedError, message
233
+ end
234
+ # trace(__method__, :repos, start, buffer)
235
+ @scanner.pos = start
236
+ last_scanner, last_start, last_buffer = @keeps.last
237
+ # Drop the last buffer when the last buffer is the same data
238
+ # in the last keep. If we keep it, we have duplicated data
239
+ # by the next keep_back.
240
+ if last_scanner == @scanner and
241
+ last_buffer and
242
+ last_buffer == last_scanner.string.byteslice(last_start, start)
243
+ @keeps.last[2] = nil
244
+ end
245
+ end
246
+ read_chunk if @scanner.eos?
247
+ end
248
+
249
+ def keep_drop
250
+ _, _, buffer = @keeps.pop
251
+ # trace(__method__, :done, :empty) unless buffer
252
+ return unless buffer
253
+
254
+ last_keep = @keeps.last
255
+ # trace(__method__, :done, :no_last_keep) unless last_keep
256
+ return unless last_keep
257
+
258
+ if last_keep[2]
259
+ last_keep[2] << buffer
260
+ else
261
+ last_keep[2] = buffer
262
+ end
263
+ # trace(__method__, :done)
264
+ end
265
+
266
+ def rest
267
+ @scanner.rest
268
+ end
269
+
270
+ def check(pattern)
271
+ @scanner.check(pattern)
272
+ end
273
+
274
+ private
275
+ def trace(*args)
276
+ pp([*args, @scanner, @scanner&.string, @scanner&.pos, @keeps])
277
+ end
278
+
279
+ def adjust_last_keep
280
+ # trace(__method__, :start)
281
+
282
+ keep = @keeps.last
283
+ # trace(__method__, :done, :empty) if keep.nil?
284
+ return if keep.nil?
285
+
286
+ scanner, start, buffer = keep
287
+ string = @scanner.string
288
+ if @scanner != scanner
289
+ start = 0
290
+ end
291
+ if start == 0 and @scanner.eos?
292
+ keep_data = string
293
+ else
294
+ keep_data = string.byteslice(start, @scanner.pos - start)
295
+ end
296
+ if keep_data
297
+ if buffer
298
+ buffer << keep_data
299
+ else
300
+ keep[2] = keep_data.dup
301
+ end
302
+ end
303
+
304
+ # trace(__method__, :done)
305
+ end
306
+
307
+ def read_chunk
308
+ return false if @last_scanner
309
+
310
+ adjust_last_keep
311
+
312
+ input = @inputs.first
313
+ case input
314
+ when StringIO
315
+ string = input.read
316
+ raise InvalidEncoding unless string.valid_encoding?
317
+ # trace(__method__, :stringio, string)
318
+ @scanner = StringScanner.new(string)
319
+ @inputs.shift
320
+ @last_scanner = @inputs.empty?
321
+ true
322
+ else
323
+ chunk = input.gets(@row_separator, @chunk_size)
324
+ if chunk
325
+ raise InvalidEncoding unless chunk.valid_encoding?
326
+ # trace(__method__, :chunk, chunk)
327
+ @scanner = StringScanner.new(chunk)
328
+ if Parser.eof?(input)
329
+ @inputs.shift
330
+ @last_scanner = @inputs.empty?
331
+ end
332
+ true
333
+ else
334
+ # trace(__method__, :no_chunk)
335
+ @scanner = StringScanner.new("".encode(@encoding))
336
+ @inputs.shift
337
+ @last_scanner = @inputs.empty?
338
+ if @last_scanner
339
+ false
340
+ else
341
+ read_chunk
342
+ end
343
+ end
344
+ end
345
+ end
346
+ end
347
+
348
+ def initialize(input, options)
349
+ @input = input
350
+ @options = options
351
+ @samples = []
352
+
353
+ prepare
354
+ end
355
+
356
+ def column_separator
357
+ @column_separator
358
+ end
359
+
360
+ def row_separator
361
+ @row_separator
362
+ end
363
+
364
+ def quote_character
365
+ @quote_character
366
+ end
367
+
368
+ def field_size_limit
369
+ @max_field_size&.succ
370
+ end
371
+
372
+ def max_field_size
373
+ @max_field_size
374
+ end
375
+
376
+ def skip_lines
377
+ @skip_lines
378
+ end
379
+
380
+ def unconverted_fields?
381
+ @unconverted_fields
382
+ end
383
+
384
+ def headers
385
+ @headers
386
+ end
387
+
388
+ def header_row?
389
+ @use_headers and @headers.nil?
390
+ end
391
+
392
+ def return_headers?
393
+ @return_headers
394
+ end
395
+
396
+ def skip_blanks?
397
+ @skip_blanks
398
+ end
399
+
400
+ def liberal_parsing?
401
+ @liberal_parsing
402
+ end
403
+
404
+ def lineno
405
+ @lineno
406
+ end
407
+
408
+ def line
409
+ last_line
410
+ end
411
+
412
+ def parse(&block)
413
+ return to_enum(__method__) unless block_given?
414
+
415
+ if @return_headers and @headers and @raw_headers
416
+ headers = Row.new(@headers, @raw_headers, true)
417
+ if @unconverted_fields
418
+ headers = add_unconverted_fields(headers, [])
419
+ end
420
+ yield headers
421
+ end
422
+
423
+ begin
424
+ @scanner ||= build_scanner
425
+ __send__(@parse_method, &block)
426
+ rescue InvalidEncoding
427
+ if @scanner
428
+ ignore_broken_line
429
+ lineno = @lineno
430
+ else
431
+ lineno = @lineno + 1
432
+ end
433
+ raise InvalidEncodingError.new(@encoding, lineno)
434
+ rescue UnexpectedError => error
435
+ if @scanner
436
+ ignore_broken_line
437
+ lineno = @lineno
438
+ else
439
+ lineno = @lineno + 1
440
+ end
441
+ message = "This should not be happen: #{error.message}: "
442
+ message += "Please report this to https://github.com/ruby/csv/issues"
443
+ raise MalformedCSVError.new(message, lineno)
444
+ end
445
+ end
446
+
447
+ def eof?
448
+ return false if @scanner.nil?
449
+ @scanner.eos?
450
+ end
451
+
452
+ def use_headers?
453
+ @use_headers
454
+ end
455
+
456
+ private
457
+ # A set of tasks to prepare the file in order to parse it
458
+ def prepare
459
+ prepare_variable
460
+ prepare_quote_character
461
+ prepare_backslash
462
+ prepare_skip_lines
463
+ prepare_strip
464
+ prepare_separators
465
+ validate_strip_and_col_sep_options
466
+ prepare_quoted
467
+ prepare_unquoted
468
+ prepare_line
469
+ prepare_header
470
+ prepare_parser
471
+ end
472
+
473
+ def prepare_variable
474
+ @encoding = @options[:encoding]
475
+ liberal_parsing = @options[:liberal_parsing]
476
+ if liberal_parsing
477
+ @liberal_parsing = true
478
+ if liberal_parsing.is_a?(Hash)
479
+ @double_quote_outside_quote =
480
+ liberal_parsing[:double_quote_outside_quote]
481
+ @backslash_quote = liberal_parsing[:backslash_quote]
482
+ else
483
+ @double_quote_outside_quote = false
484
+ @backslash_quote = false
485
+ end
486
+ else
487
+ @liberal_parsing = false
488
+ @backslash_quote = false
489
+ end
490
+ @unconverted_fields = @options[:unconverted_fields]
491
+ @max_field_size = @options[:max_field_size]
492
+ @skip_blanks = @options[:skip_blanks]
493
+ @fields_converter = @options[:fields_converter]
494
+ @header_fields_converter = @options[:header_fields_converter]
495
+ end
496
+
497
+ def prepare_quote_character
498
+ @quote_character = @options[:quote_character]
499
+ if @quote_character.nil?
500
+ @escaped_quote_character = nil
501
+ @escaped_quote = nil
502
+ else
503
+ @quote_character = @quote_character.to_s.encode(@encoding)
504
+ if @quote_character.length != 1
505
+ message = ":quote_char has to be nil or a single character String"
506
+ raise ArgumentError, message
507
+ end
508
+ @escaped_quote_character = Regexp.escape(@quote_character)
509
+ @escaped_quote = Regexp.new(@escaped_quote_character)
510
+ end
511
+ end
512
+
513
+ def prepare_backslash
514
+ return unless @backslash_quote
515
+
516
+ @backslash_character = "\\".encode(@encoding)
517
+
518
+ @escaped_backslash_character = Regexp.escape(@backslash_character)
519
+ @escaped_backslash = Regexp.new(@escaped_backslash_character)
520
+ if @quote_character.nil?
521
+ @backslash_quote_character = nil
522
+ else
523
+ @backslash_quote_character =
524
+ @backslash_character + @escaped_quote_character
525
+ end
526
+ end
527
+
528
+ def prepare_skip_lines
529
+ skip_lines = @options[:skip_lines]
530
+ case skip_lines
531
+ when String
532
+ @skip_lines = skip_lines.encode(@encoding)
533
+ when Regexp, nil
534
+ @skip_lines = skip_lines
535
+ else
536
+ unless skip_lines.respond_to?(:match)
537
+ message =
538
+ ":skip_lines has to respond to \#match: #{skip_lines.inspect}"
539
+ raise ArgumentError, message
540
+ end
541
+ @skip_lines = skip_lines
542
+ end
543
+ end
544
+
545
+ def prepare_strip
546
+ @strip = @options[:strip]
547
+ @escaped_strip = nil
548
+ @strip_value = nil
549
+ @rstrip_value = nil
550
+ if @strip.is_a?(String)
551
+ case @strip.length
552
+ when 0
553
+ raise ArgumentError, ":strip must not be an empty String"
554
+ when 1
555
+ # ok
556
+ else
557
+ raise ArgumentError, ":strip doesn't support 2 or more characters yet"
558
+ end
559
+ @strip = @strip.encode(@encoding)
560
+ @escaped_strip = Regexp.escape(@strip)
561
+ if @quote_character
562
+ @strip_value = Regexp.new(@escaped_strip +
563
+ "+".encode(@encoding))
564
+ @rstrip_value = Regexp.new(@escaped_strip +
565
+ "+\\z".encode(@encoding))
566
+ end
567
+ elsif @strip
568
+ strip_values = " \t\f\v"
569
+ @escaped_strip = strip_values.encode(@encoding)
570
+ if @quote_character
571
+ @strip_value = Regexp.new("[#{strip_values}]+".encode(@encoding))
572
+ @rstrip_value = Regexp.new("[#{strip_values}]+\\z".encode(@encoding))
573
+ end
574
+ end
575
+ end
576
+
577
+ begin
578
+ StringScanner.new("x").scan("x")
579
+ rescue TypeError
580
+ STRING_SCANNER_SCAN_ACCEPT_STRING = false
581
+ else
582
+ STRING_SCANNER_SCAN_ACCEPT_STRING = true
583
+ end
584
+
585
+ def prepare_separators
586
+ column_separator = @options[:column_separator]
587
+ @column_separator = column_separator.to_s.encode(@encoding)
588
+ if @column_separator.size < 1
589
+ message = ":col_sep must be 1 or more characters: "
590
+ message += column_separator.inspect
591
+ raise ArgumentError, message
592
+ end
593
+ @row_separator =
594
+ resolve_row_separator(@options[:row_separator]).encode(@encoding)
595
+
596
+ @escaped_column_separator = Regexp.escape(@column_separator)
597
+ @escaped_first_column_separator = Regexp.escape(@column_separator[0])
598
+ if @column_separator.size > 1
599
+ @column_end = Regexp.new(@escaped_column_separator)
600
+ @column_ends = @column_separator.each_char.collect do |char|
601
+ Regexp.new(Regexp.escape(char))
602
+ end
603
+ @first_column_separators = Regexp.new(@escaped_first_column_separator +
604
+ "+".encode(@encoding))
605
+ else
606
+ if STRING_SCANNER_SCAN_ACCEPT_STRING
607
+ @column_end = @column_separator
608
+ else
609
+ @column_end = Regexp.new(@escaped_column_separator)
610
+ end
611
+ @column_ends = nil
612
+ @first_column_separators = nil
613
+ end
614
+
615
+ escaped_row_separator = Regexp.escape(@row_separator)
616
+ @row_end = Regexp.new(escaped_row_separator)
617
+ if @row_separator.size > 1
618
+ @row_ends = @row_separator.each_char.collect do |char|
619
+ Regexp.new(Regexp.escape(char))
620
+ end
621
+ else
622
+ @row_ends = nil
623
+ end
624
+
625
+ @cr = "\r".encode(@encoding)
626
+ @lf = "\n".encode(@encoding)
627
+ @line_end = Regexp.new("\r\n|\n|\r".encode(@encoding))
628
+ @not_line_end = Regexp.new("[^\r\n]+".encode(@encoding))
629
+ end
630
+
631
+ # This method verifies that there are no (obvious) ambiguities with the
632
+ # provided +col_sep+ and +strip+ parsing options. For example, if +col_sep+
633
+ # and +strip+ were both equal to +\t+, then there would be no clear way to
634
+ # parse the input.
635
+ def validate_strip_and_col_sep_options
636
+ return unless @strip
637
+
638
+ if @strip.is_a?(String)
639
+ if @column_separator.start_with?(@strip) || @column_separator.end_with?(@strip)
640
+ raise ArgumentError,
641
+ "The provided strip (#{@escaped_strip}) and " \
642
+ "col_sep (#{@escaped_column_separator}) options are incompatible."
643
+ end
644
+ else
645
+ if Regexp.new("\\A[#{@escaped_strip}]|[#{@escaped_strip}]\\z").match?(@column_separator)
646
+ raise ArgumentError,
647
+ "The provided strip (true) and " \
648
+ "col_sep (#{@escaped_column_separator}) options are incompatible."
649
+ end
650
+ end
651
+ end
652
+
653
+ def prepare_quoted
654
+ if @quote_character
655
+ @quotes = Regexp.new(@escaped_quote_character +
656
+ "+".encode(@encoding))
657
+ no_quoted_values = @escaped_quote_character.dup
658
+ if @backslash_quote
659
+ no_quoted_values << @escaped_backslash_character
660
+ end
661
+ @quoted_value = Regexp.new("[^".encode(@encoding) +
662
+ no_quoted_values +
663
+ "]+".encode(@encoding))
664
+ end
665
+ if @escaped_strip
666
+ @split_column_separator = Regexp.new(@escaped_strip +
667
+ "*".encode(@encoding) +
668
+ @escaped_column_separator +
669
+ @escaped_strip +
670
+ "*".encode(@encoding))
671
+ else
672
+ if @column_separator == " ".encode(@encoding)
673
+ @split_column_separator = Regexp.new(@escaped_column_separator)
674
+ else
675
+ @split_column_separator = @column_separator
676
+ end
677
+ end
678
+ end
679
+
680
+ def prepare_unquoted
681
+ return if @quote_character.nil?
682
+
683
+ no_unquoted_values = Regexp.escape(@row_separator).encode(@encoding)
684
+ no_unquoted_values << @escaped_first_column_separator
685
+ unless @liberal_parsing
686
+ no_unquoted_values << @escaped_quote_character
687
+ end
688
+ @unquoted_value = Regexp.new("[^".encode(@encoding) +
689
+ no_unquoted_values +
690
+ "]+".encode(@encoding))
691
+ end
692
+
693
+ def resolve_row_separator(separator)
694
+ if separator == :auto
695
+ cr = "\r".encode(@encoding)
696
+ lf = "\n".encode(@encoding)
697
+ if @input.is_a?(StringIO)
698
+ pos = @input.pos
699
+ separator = detect_row_separator(@input.read, cr, lf)
700
+ @input.seek(pos)
701
+ elsif @input.respond_to?(:gets)
702
+ if @input.is_a?(File)
703
+ chunk_size = 32 * 1024
704
+ else
705
+ chunk_size = 1024
706
+ end
707
+ begin
708
+ while separator == :auto
709
+ #
710
+ # if we run out of data, it's probably a single line
711
+ # (ensure will set default value)
712
+ #
713
+ break unless sample = @input.gets(nil, chunk_size)
714
+
715
+ # extend sample if we're unsure of the line ending
716
+ if sample.end_with?(cr)
717
+ sample << (@input.gets(nil, 1) || "")
718
+ end
719
+
720
+ @samples << sample
721
+
722
+ separator = detect_row_separator(sample, cr, lf)
723
+ end
724
+ rescue IOError
725
+ # do nothing: ensure will set default
726
+ end
727
+ end
728
+ separator = InputRecordSeparator.value if separator == :auto
729
+ end
730
+ separator.to_s.encode(@encoding)
731
+ end
732
+
733
+ def detect_row_separator(sample, cr, lf)
734
+ lf_index = sample.index(lf)
735
+ if lf_index
736
+ cr_index = sample[0, lf_index].index(cr)
737
+ else
738
+ cr_index = sample.index(cr)
739
+ end
740
+ if cr_index and lf_index
741
+ if cr_index + 1 == lf_index
742
+ cr + lf
743
+ elsif cr_index < lf_index
744
+ cr
745
+ else
746
+ lf
747
+ end
748
+ elsif cr_index
749
+ cr
750
+ elsif lf_index
751
+ lf
752
+ else
753
+ :auto
754
+ end
755
+ end
756
+
757
+ def prepare_line
758
+ @lineno = 0
759
+ @last_line = nil
760
+ @scanner = nil
761
+ end
762
+
763
+ def last_line
764
+ if @scanner
765
+ @last_line ||= @scanner.keep_end
766
+ else
767
+ @last_line
768
+ end
769
+ end
770
+
771
+ def prepare_header
772
+ @return_headers = @options[:return_headers]
773
+
774
+ headers = @options[:headers]
775
+ case headers
776
+ when Array
777
+ @raw_headers = headers
778
+ quoted_fields = FieldsConverter::NO_QUOTED_FIELDS
779
+ @use_headers = true
780
+ when String
781
+ @raw_headers, quoted_fields = parse_headers(headers)
782
+ @use_headers = true
783
+ when nil, false
784
+ @raw_headers = nil
785
+ @use_headers = false
786
+ else
787
+ @raw_headers = nil
788
+ @use_headers = true
789
+ end
790
+ if @raw_headers
791
+ @headers = adjust_headers(@raw_headers, quoted_fields)
792
+ else
793
+ @headers = nil
794
+ end
795
+ end
796
+
797
+ def parse_headers(row)
798
+ quoted_fields = []
799
+ converter = lambda do |field, info|
800
+ quoted_fields << info.quoted?
801
+ field
802
+ end
803
+ headers = CSV.parse_line(row,
804
+ col_sep: @column_separator,
805
+ row_sep: @row_separator,
806
+ quote_char: @quote_character,
807
+ converters: [converter])
808
+ [headers, quoted_fields]
809
+ end
810
+
811
+ def adjust_headers(headers, quoted_fields)
812
+ adjusted_headers = @header_fields_converter.convert(headers, nil, @lineno, quoted_fields)
813
+ adjusted_headers.each {|h| h.freeze if h.is_a? String}
814
+ adjusted_headers
815
+ end
816
+
817
+ def prepare_parser
818
+ @may_quoted = may_quoted?
819
+ if @quote_character.nil?
820
+ @parse_method = :parse_no_quote
821
+ elsif @liberal_parsing or @strip
822
+ @parse_method = :parse_quotable_robust
823
+ else
824
+ @parse_method = :parse_quotable_loose
825
+ end
826
+ end
827
+
828
+ def may_quoted?
829
+ return false if @quote_character.nil?
830
+
831
+ if @input.is_a?(StringIO)
832
+ pos = @input.pos
833
+ sample = @input.read
834
+ @input.seek(pos)
835
+ else
836
+ return false if @samples.empty?
837
+ sample = @samples.first
838
+ end
839
+ sample[0, 128].index(@quote_character)
840
+ end
841
+
842
+ class UnoptimizedStringIO # :nodoc:
843
+ def initialize(string)
844
+ @io = StringIO.new(string, "rb:#{string.encoding}")
845
+ end
846
+
847
+ def gets(*args)
848
+ @io.gets(*args)
849
+ end
850
+
851
+ def each_line(*args, &block)
852
+ @io.each_line(*args, &block)
853
+ end
854
+
855
+ def eof?
856
+ @io.eof?
857
+ end
858
+ end
859
+
860
+ SCANNER_TEST = (ENV["CSV_PARSER_SCANNER_TEST"] == "yes")
861
+ if SCANNER_TEST
862
+ SCANNER_TEST_CHUNK_SIZE_NAME = "CSV_PARSER_SCANNER_TEST_CHUNK_SIZE"
863
+ SCANNER_TEST_CHUNK_SIZE_VALUE = ENV[SCANNER_TEST_CHUNK_SIZE_NAME]
864
+ def build_scanner
865
+ inputs = @samples.collect do |sample|
866
+ UnoptimizedStringIO.new(sample)
867
+ end
868
+ if @input.is_a?(StringIO)
869
+ inputs << UnoptimizedStringIO.new(@input.read)
870
+ else
871
+ inputs << @input
872
+ end
873
+ begin
874
+ chunk_size_value = ENV[SCANNER_TEST_CHUNK_SIZE_NAME]
875
+ rescue # Ractor::IsolationError
876
+ # Ractor on Ruby 3.0 can't read ENV value.
877
+ chunk_size_value = SCANNER_TEST_CHUNK_SIZE_VALUE
878
+ end
879
+ chunk_size = Integer((chunk_size_value || "1"), 10)
880
+ InputsScanner.new(inputs,
881
+ @encoding,
882
+ @row_separator,
883
+ chunk_size: chunk_size)
884
+ end
885
+ else
886
+ def build_scanner
887
+ string = nil
888
+ if @samples.empty? and @input.is_a?(StringIO)
889
+ string = @input.read
890
+ elsif @samples.size == 1 and Parser.eof?(@input)
891
+ string = @samples[0]
892
+ end
893
+ if string
894
+ unless string.valid_encoding?
895
+ index = string.lines(@row_separator).index do |line|
896
+ !line.valid_encoding?
897
+ end
898
+ if index
899
+ raise InvalidEncodingError.new(@encoding, @lineno + index + 1)
900
+ end
901
+ end
902
+ Scanner.new(string)
903
+ else
904
+ inputs = @samples.collect do |sample|
905
+ StringIO.new(sample)
906
+ end
907
+ inputs << @input
908
+ InputsScanner.new(inputs, @encoding, @row_separator)
909
+ end
910
+ end
911
+ end
912
+
913
+ def skip_needless_lines
914
+ return unless @skip_lines
915
+
916
+ until @scanner.eos?
917
+ @scanner.keep_start
918
+ line = @scanner.scan_all(@not_line_end) || "".encode(@encoding)
919
+ line << @row_separator if parse_row_end
920
+ if skip_line?(line)
921
+ @lineno += 1
922
+ @scanner.keep_drop
923
+ else
924
+ @scanner.keep_back
925
+ return
926
+ end
927
+ end
928
+ end
929
+
930
+ def skip_line?(line)
931
+ line = line.delete_suffix(@row_separator)
932
+ case @skip_lines
933
+ when String
934
+ line.include?(@skip_lines)
935
+ when Regexp
936
+ @skip_lines.match?(line)
937
+ else
938
+ @skip_lines.match(line)
939
+ end
940
+ end
941
+
942
+ def validate_field_size(field)
943
+ return unless @max_field_size
944
+ return if field.size <= @max_field_size
945
+ ignore_broken_line
946
+ message = "Field size exceeded: #{field.size} > #{@max_field_size}"
947
+ raise MalformedCSVError.new(message, @lineno)
948
+ end
949
+
950
+ def parse_no_quote(&block)
951
+ @scanner.each_line(@row_separator) do |line|
952
+ next if @skip_lines and skip_line?(line)
953
+ original_line = line
954
+ line = line.delete_suffix(@row_separator)
955
+
956
+ if line.empty?
957
+ next if @skip_blanks
958
+ row = []
959
+ else
960
+ line = strip_value(line)
961
+ row = line.split(@split_column_separator, -1)
962
+ if @max_field_size
963
+ row.each do |column|
964
+ validate_field_size(column)
965
+ end
966
+ end
967
+ n_columns = row.size
968
+ i = 0
969
+ while i < n_columns
970
+ row[i] = nil if row[i].empty?
971
+ i += 1
972
+ end
973
+ end
974
+ @last_line = original_line
975
+ emit_row(row, &block)
976
+ end
977
+ end
978
+
979
+ def parse_quotable_loose(&block)
980
+ @scanner.keep_start
981
+ @scanner.each_line(@row_separator) do |line|
982
+ if @skip_lines and skip_line?(line)
983
+ @scanner.keep_drop
984
+ @scanner.keep_start
985
+ next
986
+ end
987
+ original_line = line
988
+ line = line.delete_suffix(@row_separator)
989
+
990
+ if line.empty?
991
+ if @skip_blanks
992
+ @scanner.keep_drop
993
+ @scanner.keep_start
994
+ next
995
+ end
996
+ row = []
997
+ quoted_fields = FieldsConverter::NO_QUOTED_FIELDS
998
+ elsif line.include?(@cr) or line.include?(@lf)
999
+ @scanner.keep_back
1000
+ @parse_method = :parse_quotable_robust
1001
+ return parse_quotable_robust(&block)
1002
+ else
1003
+ row = line.split(@split_column_separator, -1)
1004
+ quoted_fields = []
1005
+ n_columns = row.size
1006
+ i = 0
1007
+ while i < n_columns
1008
+ column = row[i]
1009
+ if column.empty?
1010
+ quoted_fields << false
1011
+ row[i] = nil
1012
+ else
1013
+ n_quotes = column.count(@quote_character)
1014
+ if n_quotes.zero?
1015
+ quoted_fields << false
1016
+ # no quote
1017
+ elsif n_quotes == 2 and
1018
+ column.start_with?(@quote_character) and
1019
+ column.end_with?(@quote_character)
1020
+ quoted_fields << true
1021
+ row[i] = column[1..-2]
1022
+ else
1023
+ @scanner.keep_back
1024
+ @parse_method = :parse_quotable_robust
1025
+ return parse_quotable_robust(&block)
1026
+ end
1027
+ validate_field_size(row[i])
1028
+ end
1029
+ i += 1
1030
+ end
1031
+ end
1032
+ @scanner.keep_drop
1033
+ @scanner.keep_start
1034
+ @last_line = original_line
1035
+ emit_row(row, quoted_fields, &block)
1036
+ end
1037
+ @scanner.keep_drop
1038
+ end
1039
+
1040
+ def parse_quotable_robust(&block)
1041
+ row = []
1042
+ quoted_fields = []
1043
+ skip_needless_lines
1044
+ start_row
1045
+ while true
1046
+ @quoted_column_value = false
1047
+ @unquoted_column_value = false
1048
+ @scanner.scan_all(@strip_value) if @strip_value
1049
+ value = parse_column_value
1050
+ if value
1051
+ @scanner.scan_all(@strip_value) if @strip_value
1052
+ validate_field_size(value)
1053
+ end
1054
+ if parse_column_end
1055
+ row << value
1056
+ quoted_fields << @quoted_column_value
1057
+ elsif parse_row_end
1058
+ if row.empty? and value.nil?
1059
+ emit_row([], &block) unless @skip_blanks
1060
+ else
1061
+ row << value
1062
+ quoted_fields << @quoted_column_value
1063
+ emit_row(row, quoted_fields, &block)
1064
+ row = []
1065
+ quoted_fields.clear
1066
+ end
1067
+ skip_needless_lines
1068
+ start_row
1069
+ elsif @scanner.eos?
1070
+ break if row.empty? and value.nil?
1071
+ row << value
1072
+ quoted_fields << @quoted_column_value
1073
+ emit_row(row, quoted_fields, &block)
1074
+ break
1075
+ else
1076
+ if @quoted_column_value
1077
+ if liberal_parsing? and (new_line = @scanner.check(@line_end))
1078
+ message =
1079
+ "Illegal end-of-line sequence outside of a quoted field " +
1080
+ "<#{new_line.inspect}>"
1081
+ else
1082
+ message = "Any value after quoted field isn't allowed"
1083
+ end
1084
+ ignore_broken_line
1085
+ raise MalformedCSVError.new(message, @lineno)
1086
+ elsif @unquoted_column_value and
1087
+ (new_line = @scanner.scan(@line_end))
1088
+ ignore_broken_line
1089
+ message = "Unquoted fields do not allow new line " +
1090
+ "<#{new_line.inspect}>"
1091
+ raise MalformedCSVError.new(message, @lineno)
1092
+ elsif @scanner.rest.start_with?(@quote_character)
1093
+ ignore_broken_line
1094
+ message = "Illegal quoting"
1095
+ raise MalformedCSVError.new(message, @lineno)
1096
+ elsif (new_line = @scanner.scan(@line_end))
1097
+ ignore_broken_line
1098
+ message = "New line must be <#{@row_separator.inspect}> " +
1099
+ "not <#{new_line.inspect}>"
1100
+ raise MalformedCSVError.new(message, @lineno)
1101
+ else
1102
+ ignore_broken_line
1103
+ raise MalformedCSVError.new("TODO: Meaningful message",
1104
+ @lineno)
1105
+ end
1106
+ end
1107
+ end
1108
+ end
1109
+
1110
+ def parse_column_value
1111
+ if @liberal_parsing
1112
+ quoted_value = parse_quoted_column_value
1113
+ if quoted_value
1114
+ @scanner.scan_all(@strip_value) if @strip_value
1115
+ unquoted_value = parse_unquoted_column_value
1116
+ if unquoted_value
1117
+ if @double_quote_outside_quote
1118
+ unquoted_value = unquoted_value.gsub(@quote_character * 2,
1119
+ @quote_character)
1120
+ if quoted_value.empty? # %Q{""...} case
1121
+ return @quote_character + unquoted_value
1122
+ end
1123
+ end
1124
+ @quote_character + quoted_value + @quote_character + unquoted_value
1125
+ else
1126
+ quoted_value
1127
+ end
1128
+ else
1129
+ parse_unquoted_column_value
1130
+ end
1131
+ elsif @may_quoted
1132
+ parse_quoted_column_value ||
1133
+ parse_unquoted_column_value
1134
+ else
1135
+ parse_unquoted_column_value ||
1136
+ parse_quoted_column_value
1137
+ end
1138
+ end
1139
+
1140
+ def parse_unquoted_column_value
1141
+ value = @scanner.scan_all(@unquoted_value)
1142
+ return nil unless value
1143
+
1144
+ @unquoted_column_value = true
1145
+ if @first_column_separators
1146
+ while true
1147
+ @scanner.keep_start
1148
+ is_column_end = @column_ends.all? do |column_end|
1149
+ @scanner.scan(column_end)
1150
+ end
1151
+ @scanner.keep_back
1152
+ break if is_column_end
1153
+ sub_separator = @scanner.scan_all(@first_column_separators)
1154
+ break if sub_separator.nil?
1155
+ value << sub_separator
1156
+ sub_value = @scanner.scan_all(@unquoted_value)
1157
+ break if sub_value.nil?
1158
+ value << sub_value
1159
+ end
1160
+ end
1161
+ value.gsub!(@backslash_quote_character, @quote_character) if @backslash_quote
1162
+ if @rstrip_value
1163
+ value.gsub!(@rstrip_value, "")
1164
+ end
1165
+ value
1166
+ end
1167
+
1168
+ def parse_quoted_column_value
1169
+ quotes = @scanner.scan_all(@quotes)
1170
+ return nil unless quotes
1171
+
1172
+ @quoted_column_value = true
1173
+ n_quotes = quotes.size
1174
+ if (n_quotes % 2).zero?
1175
+ quotes[0, (n_quotes - 2) / 2]
1176
+ else
1177
+ value = quotes[0, n_quotes / 2]
1178
+ while true
1179
+ quoted_value = @scanner.scan_all(@quoted_value)
1180
+ value << quoted_value if quoted_value
1181
+ if @backslash_quote
1182
+ if @scanner.scan(@escaped_backslash)
1183
+ if @scanner.scan(@escaped_quote)
1184
+ value << @quote_character
1185
+ else
1186
+ value << @backslash_character
1187
+ end
1188
+ next
1189
+ end
1190
+ end
1191
+
1192
+ quotes = @scanner.scan_all(@quotes)
1193
+ unless quotes
1194
+ ignore_broken_line
1195
+ message = "Unclosed quoted field"
1196
+ raise MalformedCSVError.new(message, @lineno)
1197
+ end
1198
+ n_quotes = quotes.size
1199
+ if n_quotes == 1
1200
+ break
1201
+ else
1202
+ value << quotes[0, n_quotes / 2]
1203
+ break if (n_quotes % 2) == 1
1204
+ end
1205
+ end
1206
+ value
1207
+ end
1208
+ end
1209
+
1210
+ def parse_column_end
1211
+ return true if @scanner.scan(@column_end)
1212
+ return false unless @column_ends
1213
+
1214
+ @scanner.keep_start
1215
+ if @column_ends.all? {|column_end| @scanner.scan(column_end)}
1216
+ @scanner.keep_drop
1217
+ true
1218
+ else
1219
+ @scanner.keep_back
1220
+ false
1221
+ end
1222
+ end
1223
+
1224
+ def parse_row_end
1225
+ return true if @scanner.scan(@row_end)
1226
+ return false unless @row_ends
1227
+ @scanner.keep_start
1228
+ if @row_ends.all? {|row_end| @scanner.scan(row_end)}
1229
+ @scanner.keep_drop
1230
+ true
1231
+ else
1232
+ @scanner.keep_back
1233
+ false
1234
+ end
1235
+ end
1236
+
1237
+ def strip_value(value)
1238
+ return value unless @strip
1239
+ return value if value.nil?
1240
+
1241
+ case @strip
1242
+ when String
1243
+ while value.delete_prefix!(@strip)
1244
+ # do nothing
1245
+ end
1246
+ while value.delete_suffix!(@strip)
1247
+ # do nothing
1248
+ end
1249
+ else
1250
+ value.strip!
1251
+ end
1252
+ value
1253
+ end
1254
+
1255
+ def ignore_broken_line
1256
+ @scanner.scan_all(@not_line_end)
1257
+ @scanner.scan_all(@line_end)
1258
+ @lineno += 1
1259
+ end
1260
+
1261
+ def start_row
1262
+ if @last_line
1263
+ @last_line = nil
1264
+ else
1265
+ @scanner.keep_drop
1266
+ end
1267
+ @scanner.keep_start
1268
+ end
1269
+
1270
+ def emit_row(row, quoted_fields=FieldsConverter::NO_QUOTED_FIELDS, &block)
1271
+ @lineno += 1
1272
+
1273
+ raw_row = row
1274
+ if @use_headers
1275
+ if @headers.nil?
1276
+ @headers = adjust_headers(row, quoted_fields)
1277
+ return unless @return_headers
1278
+ row = Row.new(@headers, row, true)
1279
+ else
1280
+ row = Row.new(@headers,
1281
+ @fields_converter.convert(raw_row, @headers, @lineno, quoted_fields))
1282
+ end
1283
+ else
1284
+ # convert fields, if needed...
1285
+ row = @fields_converter.convert(raw_row, nil, @lineno, quoted_fields)
1286
+ end
1287
+
1288
+ # inject unconverted fields and accessor, if requested...
1289
+ if @unconverted_fields and not row.respond_to?(:unconverted_fields)
1290
+ add_unconverted_fields(row, raw_row)
1291
+ end
1292
+
1293
+ yield(row)
1294
+ end
1295
+
1296
+ # This method injects an instance variable <tt>unconverted_fields</tt> into
1297
+ # +row+ and an accessor method for +row+ called unconverted_fields(). The
1298
+ # variable is set to the contents of +fields+.
1299
+ def add_unconverted_fields(row, fields)
1300
+ class << row
1301
+ attr_reader :unconverted_fields
1302
+ end
1303
+ row.instance_variable_set(:@unconverted_fields, fields)
1304
+ row
1305
+ end
1306
+ end
1307
+ end