tdiary 5.2.2 → 5.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1533) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +5 -1
  3. data/Gemfile.lock +18 -18
  4. data/README.md +0 -2
  5. data/lib/tdiary/version.rb +1 -1
  6. data/misc/paas/heroku/Gemfile.local +1 -1
  7. data/misc/paas/heroku/Gemfile.lock +34 -32
  8. data/vendor/bundle/ruby/3.1.0/build_info/{nokogiri-1.13.6-x86_64-linux.info → nokogiri-1.13.8-x86_64-linux.info} +0 -0
  9. data/vendor/bundle/ruby/3.1.0/cache/addressable-2.8.1.gem +0 -0
  10. data/vendor/bundle/ruby/3.1.0/cache/debug-1.6.2.gem +0 -0
  11. data/vendor/bundle/ruby/3.1.0/cache/faraday-2.5.2.gem +0 -0
  12. data/vendor/bundle/ruby/3.1.0/cache/faraday-net_http-3.0.0.gem +0 -0
  13. data/vendor/bundle/ruby/3.1.0/cache/nokogiri-1.13.8-x86_64-linux.gem +0 -0
  14. data/vendor/bundle/ruby/3.1.0/cache/octokit-5.3.0.gem +0 -0
  15. data/vendor/bundle/ruby/3.1.0/cache/public_suffix-5.0.0.gem +0 -0
  16. data/vendor/bundle/ruby/3.1.0/cache/rack-2.2.4.gem +0 -0
  17. data/vendor/bundle/ruby/3.1.0/cache/rack-test-2.0.2.gem +0 -0
  18. data/vendor/bundle/ruby/3.1.0/cache/sawyer-0.9.2.gem +0 -0
  19. data/vendor/bundle/ruby/3.1.0/cache/selenium-webdriver-4.4.0.gem +0 -0
  20. data/vendor/bundle/ruby/3.1.0/cache/sequel-5.59.0.gem +0 -0
  21. data/vendor/bundle/ruby/3.1.0/cache/sqlite3-1.4.4.gem +0 -0
  22. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/debug-1.6.2/debug/debug.so +0 -0
  23. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/{debug-1.5.0 → debug-1.6.2}/gem.build_complete +0 -0
  24. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/debug-1.6.2/gem_make.out +16 -0
  25. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/json-2.6.2/gem_make.out +1 -1
  26. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/redcarpet-3.5.1/gem_make.out +2 -2
  27. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/{sqlite3-1.4.2 → sqlite3-1.4.4}/gem.build_complete +0 -0
  28. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/sqlite3-1.4.4/gem_make.out +90 -0
  29. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/{sqlite3-1.4.2 → sqlite3-1.4.4}/mkmf.log +0 -0
  30. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/sqlite3-1.4.4/sqlite3/sqlite3_native.so +0 -0
  31. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/CHANGELOG.md +262 -0
  32. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/Gemfile +30 -0
  33. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/LICENSE.txt +0 -0
  34. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/README.md +0 -0
  35. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/Rakefile +0 -0
  36. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/data/unicode.data +0 -0
  37. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/lib/addressable/idna/native.rb +60 -0
  38. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/lib/addressable/idna/pure.rb +677 -0
  39. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/lib/addressable/idna.rb +26 -0
  40. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/lib/addressable/template.rb +1030 -0
  41. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/lib/addressable/uri.rb +2560 -0
  42. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/lib/addressable/version.rb +31 -0
  43. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/lib/addressable.rb +0 -0
  44. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/spec/addressable/idna_spec.rb +301 -0
  45. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/spec/addressable/net_http_compat_spec.rb +29 -0
  46. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/spec/addressable/security_spec.rb +58 -0
  47. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/spec/addressable/template_spec.rb +1468 -0
  48. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/spec/addressable/uri_spec.rb +6745 -0
  49. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/spec/spec_helper.rb +0 -0
  50. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/tasks/clobber.rake +0 -0
  51. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.1/tasks/gem.rake +95 -0
  52. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/tasks/git.rake +0 -0
  53. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/tasks/metrics.rake +0 -0
  54. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/tasks/profile.rake +0 -0
  55. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/tasks/rspec.rake +0 -0
  56. data/vendor/bundle/ruby/3.1.0/gems/{addressable-2.8.0 → addressable-2.8.1}/tasks/yard.rake +0 -0
  57. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/CONTRIBUTING.md +561 -0
  58. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/Gemfile +0 -0
  59. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/LICENSE.txt +0 -0
  60. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/README.md +913 -0
  61. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/Rakefile +52 -0
  62. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/TODO.md +0 -0
  63. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/debug.gemspec +32 -0
  64. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/exe/rdbg +38 -0
  65. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/ext/debug/Makefile +267 -0
  66. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/ext/debug/debug.c +200 -0
  67. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/ext/debug/debug.o +0 -0
  68. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/ext/debug/debug.so +0 -0
  69. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/ext/debug/debug_version.h +1 -0
  70. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/ext/debug/extconf.rb +26 -0
  71. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/ext/debug/iseq_collector.c +0 -0
  72. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/ext/debug/iseq_collector.o +0 -0
  73. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/breakpoint.rb +552 -0
  74. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/client.rb +245 -0
  75. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/lib/debug/color.rb +0 -0
  76. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/config.rb +524 -0
  77. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/console.rb +234 -0
  78. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/debug.so +0 -0
  79. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/frame_info.rb +179 -0
  80. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/lib/debug/local.rb +0 -0
  81. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/lib/debug/open.rb +0 -0
  82. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/lib/debug/open_nonstop.rb +0 -0
  83. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/prelude.rb +50 -0
  84. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/server.rb +520 -0
  85. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/server_cdp.rb +1144 -0
  86. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/server_dap.rb +975 -0
  87. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/session.rb +2422 -0
  88. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/source_repository.rb +130 -0
  89. data/vendor/bundle/ruby/3.1.0/gems/{debug-1.5.0 → debug-1.6.2}/lib/debug/start.rb +0 -0
  90. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/thread_client.rb +1299 -0
  91. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/tracer.rb +242 -0
  92. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug/version.rb +5 -0
  93. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/lib/debug.rb +5 -0
  94. data/vendor/bundle/ruby/3.1.0/gems/debug-1.6.2/misc/README.md.erb +604 -0
  95. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/CHANGELOG.md +0 -0
  96. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/LICENSE.md +20 -0
  97. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/README.md +55 -0
  98. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/Rakefile +0 -0
  99. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/examples/client_spec.rb +119 -0
  100. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/examples/client_test.rb +144 -0
  101. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/lib/faraday/adapter/test.rb +298 -0
  102. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/lib/faraday/adapter.rb +102 -0
  103. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/adapter_registry.rb +0 -0
  104. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/lib/faraday/connection.rb +561 -0
  105. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/encoders/flat_params_encoder.rb +0 -0
  106. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/encoders/nested_params_encoder.rb +0 -0
  107. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/error.rb +0 -0
  108. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/logging/formatter.rb +0 -0
  109. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/methods.rb +0 -0
  110. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/middleware.rb +0 -0
  111. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/middleware_registry.rb +0 -0
  112. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/options/connection_options.rb +0 -0
  113. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/lib/faraday/options/env.rb +199 -0
  114. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/options/proxy_options.rb +0 -0
  115. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/options/request_options.rb +0 -0
  116. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/lib/faraday/options/ssl_options.rb +69 -0
  117. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/options.rb +0 -0
  118. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/parameters.rb +0 -0
  119. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/rack_builder.rb +0 -0
  120. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/request/authorization.rb +0 -0
  121. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/request/instrumentation.rb +0 -0
  122. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/request/json.rb +0 -0
  123. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/request/url_encoded.rb +0 -0
  124. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/request.rb +0 -0
  125. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/response/json.rb +0 -0
  126. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/response/logger.rb +0 -0
  127. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/response/raise_error.rb +0 -0
  128. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/response.rb +0 -0
  129. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/utils/headers.rb +0 -0
  130. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/utils/params_hash.rb +0 -0
  131. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday/utils.rb +0 -0
  132. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/lib/faraday/version.rb +5 -0
  133. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/lib/faraday.rb +0 -0
  134. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/external_adapters/faraday_specs_setup.rb +0 -0
  135. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/spec/faraday/adapter/test_spec.rb +413 -0
  136. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/adapter_registry_spec.rb +0 -0
  137. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/adapter_spec.rb +0 -0
  138. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/spec/faraday/connection_spec.rb +793 -0
  139. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/error_spec.rb +0 -0
  140. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/middleware_registry_spec.rb +0 -0
  141. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/middleware_spec.rb +0 -0
  142. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/spec/faraday/options/env_spec.rb +76 -0
  143. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/options/options_spec.rb +0 -0
  144. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/options/proxy_options_spec.rb +0 -0
  145. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/options/request_options_spec.rb +0 -0
  146. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/params_encoders/flat_spec.rb +0 -0
  147. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/params_encoders/nested_spec.rb +0 -0
  148. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/rack_builder_spec.rb +0 -0
  149. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/request/authorization_spec.rb +0 -0
  150. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/request/instrumentation_spec.rb +0 -0
  151. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/request/json_spec.rb +0 -0
  152. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/request/url_encoded_spec.rb +0 -0
  153. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/spec/faraday/request_spec.rb +110 -0
  154. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/response/json_spec.rb +0 -0
  155. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/response/logger_spec.rb +0 -0
  156. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/response/raise_error_spec.rb +0 -0
  157. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/response_spec.rb +0 -0
  158. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday/utils/headers_spec.rb +0 -0
  159. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/spec/faraday/utils_spec.rb +118 -0
  160. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/faraday_spec.rb +0 -0
  161. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/spec_helper.rb +0 -0
  162. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/support/disabling_stub.rb +0 -0
  163. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/support/fake_safe_buffer.rb +0 -0
  164. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/support/helper_methods.rb +0 -0
  165. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/spec/support/shared_examples/adapter.rb +105 -0
  166. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/support/shared_examples/params_encoder.rb +0 -0
  167. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.5.2/spec/support/shared_examples/request_method.rb +263 -0
  168. data/vendor/bundle/ruby/3.1.0/gems/{faraday-2.3.0 → faraday-2.5.2}/spec/support/streaming_response_checker.rb +0 -0
  169. data/vendor/bundle/ruby/3.1.0/gems/{faraday-net_http-2.0.3 → faraday-net_http-3.0.0}/LICENSE.md +0 -0
  170. data/vendor/bundle/ruby/3.1.0/gems/{faraday-net_http-2.0.3 → faraday-net_http-3.0.0}/README.md +0 -0
  171. data/vendor/bundle/ruby/3.1.0/gems/faraday-net_http-3.0.0/lib/faraday/adapter/net_http.rb +208 -0
  172. data/vendor/bundle/ruby/3.1.0/gems/faraday-net_http-3.0.0/lib/faraday/net_http/version.rb +7 -0
  173. data/vendor/bundle/ruby/3.1.0/gems/{faraday-net_http-2.0.3 → faraday-net_http-3.0.0}/lib/faraday/net_http.rb +0 -0
  174. data/vendor/bundle/ruby/3.1.0/gems/json-2.6.2/ext/json/Makefile +2 -2
  175. data/vendor/bundle/ruby/3.1.0/gems/json-2.6.2/ext/json/ext/generator/Makefile +2 -2
  176. data/vendor/bundle/ruby/3.1.0/gems/json-2.6.2/ext/json/ext/parser/Makefile +2 -2
  177. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/Gemfile +0 -0
  178. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/LICENSE-DEPENDENCIES.md +0 -0
  179. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/LICENSE.md +0 -0
  180. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/README.md +0 -0
  181. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/bin/nokogiri +0 -0
  182. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/dependencies.yml +0 -0
  183. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/depend +0 -0
  184. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/extconf.rb +1010 -0
  185. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/gumbo.c +584 -0
  186. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/html4_document.c +0 -0
  187. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/html4_element_description.c +0 -0
  188. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/html4_entity_lookup.c +0 -0
  189. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/html4_sax_parser_context.c +0 -0
  190. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/html4_sax_push_parser.c +0 -0
  191. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libexslt/exslt.h +0 -0
  192. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libexslt/exsltconfig.h +0 -0
  193. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libexslt/exsltexports.h +0 -0
  194. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/DOCBparser.h +0 -0
  195. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +0 -0
  196. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/HTMLtree.h +0 -0
  197. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/SAX.h +0 -0
  198. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/SAX2.h +0 -0
  199. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/c14n.h +0 -0
  200. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/catalog.h +0 -0
  201. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/chvalid.h +0 -0
  202. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/debugXML.h +0 -0
  203. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/dict.h +0 -0
  204. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/encoding.h +0 -0
  205. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/entities.h +0 -0
  206. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/globals.h +0 -0
  207. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/hash.h +0 -0
  208. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/list.h +0 -0
  209. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/nanoftp.h +0 -0
  210. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/nanohttp.h +0 -0
  211. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/parser.h +0 -0
  212. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/parserInternals.h +0 -0
  213. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/pattern.h +0 -0
  214. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/relaxng.h +0 -0
  215. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/schemasInternals.h +0 -0
  216. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/schematron.h +0 -0
  217. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/threads.h +0 -0
  218. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/tree.h +0 -0
  219. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/uri.h +0 -0
  220. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/valid.h +0 -0
  221. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xinclude.h +0 -0
  222. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xlink.h +0 -0
  223. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlIO.h +0 -0
  224. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlautomata.h +0 -0
  225. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlerror.h +0 -0
  226. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlexports.h +0 -0
  227. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +0 -0
  228. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlmodule.h +0 -0
  229. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlreader.h +0 -0
  230. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlregexp.h +0 -0
  231. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlsave.h +0 -0
  232. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlschemas.h +0 -0
  233. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h +0 -0
  234. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlstring.h +0 -0
  235. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +0 -0
  236. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlversion.h +0 -0
  237. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +0 -0
  238. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xpath.h +0 -0
  239. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xpathInternals.h +0 -0
  240. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxml2/libxml/xpointer.h +0 -0
  241. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/attributes.h +0 -0
  242. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/documents.h +0 -0
  243. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/extensions.h +0 -0
  244. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/extra.h +0 -0
  245. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/functions.h +0 -0
  246. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/imports.h +0 -0
  247. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/keys.h +0 -0
  248. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/namespaces.h +0 -0
  249. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/numbersInternals.h +0 -0
  250. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/pattern.h +0 -0
  251. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/preproc.h +0 -0
  252. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/security.h +0 -0
  253. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/templates.h +0 -0
  254. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/transform.h +0 -0
  255. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/variables.h +0 -0
  256. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/xslt.h +0 -0
  257. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/xsltInternals.h +0 -0
  258. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/include/libxslt/xsltconfig.h +180 -0
  259. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/xsltexports.h +0 -0
  260. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/xsltlocale.h +0 -0
  261. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/include/libxslt/xsltutils.h +0 -0
  262. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/libxml2_backwards_compat.c +0 -0
  263. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/nokogiri.c +0 -0
  264. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/nokogiri.h +231 -0
  265. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/test_global_handlers.c +0 -0
  266. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_attr.c +103 -0
  267. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_attribute_decl.c +70 -0
  268. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_cdata.c +57 -0
  269. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_comment.c +0 -0
  270. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_document.c +680 -0
  271. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_document_fragment.c +0 -0
  272. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_dtd.c +208 -0
  273. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_element_content.c +0 -0
  274. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_element_decl.c +69 -0
  275. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_encoding_handler.c +0 -0
  276. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_entity_decl.c +112 -0
  277. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_entity_reference.c +0 -0
  278. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_namespace.c +0 -0
  279. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_node.c +2165 -0
  280. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_node_set.c +498 -0
  281. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_processing_instruction.c +0 -0
  282. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_reader.c +770 -0
  283. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_relax_ng.c +0 -0
  284. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_sax_parser.c +0 -0
  285. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_sax_parser_context.c +0 -0
  286. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_sax_push_parser.c +0 -0
  287. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_schema.c +284 -0
  288. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xml_syntax_error.c +0 -0
  289. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_text.c +48 -0
  290. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/ext/nokogiri/xml_xpath_context.c +406 -0
  291. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/ext/nokogiri/xslt_stylesheet.c +0 -0
  292. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/gumbo-parser/CHANGES.md +0 -0
  293. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/gumbo-parser/Makefile +0 -0
  294. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/gumbo-parser/THANKS +0 -0
  295. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/2.6/nokogiri.so +0 -0
  296. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/2.7/nokogiri.so +0 -0
  297. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/3.0/nokogiri.so +0 -0
  298. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/3.1/nokogiri.so +0 -0
  299. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/class_resolver.rb +0 -0
  300. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/node.rb +0 -0
  301. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/parser.rb +0 -0
  302. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/parser.y +0 -0
  303. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/parser_extras.rb +0 -0
  304. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/syntax_error.rb +0 -0
  305. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/tokenizer.rb +0 -0
  306. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/tokenizer.rex +0 -0
  307. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css/xpath_visitor.rb +0 -0
  308. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/css.rb +0 -0
  309. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/decorators/slop.rb +0 -0
  310. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/extension.rb +0 -0
  311. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/gumbo.rb +0 -0
  312. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html.rb +0 -0
  313. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/builder.rb +0 -0
  314. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/document.rb +0 -0
  315. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/document_fragment.rb +0 -0
  316. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/element_description.rb +0 -0
  317. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/element_description_defaults.rb +0 -0
  318. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/entity_lookup.rb +0 -0
  319. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/sax/parser.rb +0 -0
  320. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/sax/parser_context.rb +0 -0
  321. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4/sax/push_parser.rb +0 -0
  322. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html4.rb +0 -0
  323. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html5/document.rb +0 -0
  324. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html5/document_fragment.rb +0 -0
  325. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html5/node.rb +0 -0
  326. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/html5.rb +0 -0
  327. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/jruby/dependencies.rb +0 -0
  328. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/syntax_error.rb +0 -0
  329. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/version/constant.rb +6 -0
  330. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/version/info.rb +0 -0
  331. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/version.rb +0 -0
  332. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/attr.rb +0 -0
  333. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/attribute_decl.rb +0 -0
  334. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/builder.rb +0 -0
  335. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/cdata.rb +0 -0
  336. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/character_data.rb +0 -0
  337. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/document.rb +0 -0
  338. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/document_fragment.rb +0 -0
  339. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/dtd.rb +0 -0
  340. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/element_content.rb +0 -0
  341. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/element_decl.rb +0 -0
  342. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/entity_decl.rb +0 -0
  343. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/entity_reference.rb +0 -0
  344. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/namespace.rb +0 -0
  345. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/node/save_options.rb +0 -0
  346. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/node.rb +0 -0
  347. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/node_set.rb +0 -0
  348. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/notation.rb +0 -0
  349. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/parse_options.rb +0 -0
  350. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/pp/character_data.rb +0 -0
  351. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/pp/node.rb +0 -0
  352. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/pp.rb +0 -0
  353. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/processing_instruction.rb +0 -0
  354. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/xml/reader.rb +105 -0
  355. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/relax_ng.rb +0 -0
  356. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/sax/document.rb +0 -0
  357. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/sax/parser.rb +0 -0
  358. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/sax/parser_context.rb +0 -0
  359. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/sax/push_parser.rb +0 -0
  360. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/sax.rb +0 -0
  361. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/schema.rb +0 -0
  362. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/searchable.rb +0 -0
  363. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/syntax_error.rb +0 -0
  364. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/text.rb +0 -0
  365. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/xpath/syntax_error.rb +0 -0
  366. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/xpath.rb +0 -0
  367. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml/xpath_context.rb +0 -0
  368. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xml.rb +0 -0
  369. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xslt/stylesheet.rb +0 -0
  370. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri/xslt.rb +0 -0
  371. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/nokogiri.rb +0 -0
  372. data/vendor/bundle/ruby/3.1.0/gems/{nokogiri-1.13.6-x86_64-linux → nokogiri-1.13.8-x86_64-linux}/lib/xsd/xmlparser/nokogiri.rb +0 -0
  373. data/vendor/bundle/ruby/3.1.0/gems/{octokit-4.23.0 → octokit-5.3.0}/CONTRIBUTING.md +0 -0
  374. data/vendor/bundle/ruby/3.1.0/gems/{octokit-4.23.0 → octokit-5.3.0}/LICENSE.md +0 -0
  375. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/README.md +821 -0
  376. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/Rakefile +24 -0
  377. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/ext/sawyer/relation.rb +12 -0
  378. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/arguments.rb +14 -0
  379. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/authentication.rb +80 -0
  380. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/actions_secrets.rb +57 -0
  381. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/actions_workflow_jobs.rb +61 -0
  382. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/actions_workflow_runs.rb +121 -0
  383. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/actions_workflows.rb +66 -0
  384. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/apps.rb +222 -0
  385. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/authorizations.rb +185 -0
  386. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/checks.rb +200 -0
  387. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/commit_branches.rb +20 -0
  388. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/commit_comments.rb +95 -0
  389. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/commit_pulls.rb +20 -0
  390. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/commits.rb +236 -0
  391. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/community_profile.rb +21 -0
  392. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/contents.rb +167 -0
  393. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/deployments.rb +82 -0
  394. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/downloads.rb +49 -0
  395. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/emojis.rb +18 -0
  396. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/events.rb +151 -0
  397. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/feeds.rb +32 -0
  398. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/gists.rb +234 -0
  399. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/gitignore.rb +43 -0
  400. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/hooks.rb +297 -0
  401. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/issues.rb +367 -0
  402. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/labels.rb +156 -0
  403. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/legacy_search.rb +42 -0
  404. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/licenses.rb +42 -0
  405. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/markdown.rb +27 -0
  406. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/marketplace.rb +56 -0
  407. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/meta.rb +20 -0
  408. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/milestones.rb +87 -0
  409. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/notifications.rb +167 -0
  410. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/oauth_applications.rb +116 -0
  411. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/objects.rb +141 -0
  412. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/organizations.rb +807 -0
  413. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/pages.rb +61 -0
  414. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/projects.rb +294 -0
  415. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/pub_sub_hubbub.rb +111 -0
  416. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/pull_requests.rb +313 -0
  417. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/rate_limit.rb +52 -0
  418. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/reactions.rb +153 -0
  419. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/refs.rb +133 -0
  420. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/releases.rb +164 -0
  421. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/repositories.rb +779 -0
  422. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/repository_invitations.rb +96 -0
  423. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/reviews.rb +227 -0
  424. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/say.rb +18 -0
  425. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/search.rb +104 -0
  426. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/service_status.rb +48 -0
  427. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/source_import.rb +156 -0
  428. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/stats.rb +108 -0
  429. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/statuses.rb +47 -0
  430. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/traffic.rb +64 -0
  431. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client/users.rb +435 -0
  432. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/client.rb +268 -0
  433. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/configurable.rb +155 -0
  434. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/connection.rb +210 -0
  435. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/default.rb +187 -0
  436. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_admin_client/admin_stats.rb +119 -0
  437. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_admin_client/license.rb +17 -0
  438. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_admin_client/orgs.rb +26 -0
  439. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_admin_client/search_indexing.rb +82 -0
  440. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_admin_client/users.rb +129 -0
  441. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_admin_client.rb +46 -0
  442. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_management_console_client/management_console.rb +176 -0
  443. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/enterprise_management_console_client.rb +56 -0
  444. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/error.rb +363 -0
  445. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/gist.rb +35 -0
  446. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/middleware/follow_redirects.rb +135 -0
  447. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/organization.rb +19 -0
  448. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/rate_limit.rb +33 -0
  449. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/repo_arguments.rb +18 -0
  450. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/repository.rb +95 -0
  451. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/response/base_middleware.rb +10 -0
  452. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/response/feed_parser.rb +17 -0
  453. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/response/raise_error.rb +19 -0
  454. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/user.rb +21 -0
  455. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/version.rb +19 -0
  456. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit/warnable.rb +16 -0
  457. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/lib/octokit.rb +66 -0
  458. data/vendor/bundle/ruby/3.1.0/gems/octokit-5.3.0/octokit.gemspec +25 -0
  459. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/2.0-Upgrade.md +0 -0
  460. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/CHANGELOG.md +426 -0
  461. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/Gemfile +14 -0
  462. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/LICENSE.txt +0 -0
  463. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/README.md +217 -0
  464. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/Rakefile +52 -0
  465. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/SECURITY.md +0 -0
  466. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/bin/console +0 -0
  467. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/data/list.txt +14066 -0
  468. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/lib/public_suffix/domain.rb +0 -0
  469. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/lib/public_suffix/errors.rb +0 -0
  470. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/lib/public_suffix/list.rb +247 -0
  471. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/lib/public_suffix/rule.rb +350 -0
  472. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/lib/public_suffix/version.rb +15 -0
  473. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/lib/public_suffix.rb +177 -0
  474. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/public_suffix.gemspec +29 -0
  475. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/test/acceptance_test.rb +131 -0
  476. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/benchmarks/bm_find.rb +0 -0
  477. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/benchmarks/bm_find_all.rb +0 -0
  478. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/benchmarks/bm_names.rb +0 -0
  479. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/benchmarks/bm_select.rb +0 -0
  480. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/benchmarks/bm_select_incremental.rb +0 -0
  481. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/benchmarks/bm_valid.rb +0 -0
  482. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/profilers/domain_profiler.rb +0 -0
  483. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/profilers/find_profiler.rb +0 -0
  484. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/profilers/find_profiler_jp.rb +0 -0
  485. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/profilers/initialization_profiler.rb +0 -0
  486. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/profilers/list_profsize.rb +0 -0
  487. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/profilers/object_binsize.rb +0 -0
  488. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/test/psl_test.rb +52 -0
  489. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/test_helper.rb +0 -0
  490. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/tests.txt +0 -0
  491. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/test/unit/domain_test.rb +106 -0
  492. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/unit/errors_test.rb +0 -0
  493. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/test/unit/list_test.rb +241 -0
  494. data/vendor/bundle/ruby/3.1.0/gems/{public_suffix-4.0.7 → public_suffix-5.0.0}/test/unit/public_suffix_test.rb +0 -0
  495. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-5.0.0/test/unit/rule_test.rb +222 -0
  496. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.4/CHANGELOG.md +708 -0
  497. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/CONTRIBUTING.md +0 -0
  498. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/MIT-LICENSE +0 -0
  499. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/README.rdoc +0 -0
  500. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/Rakefile +0 -0
  501. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/SPEC.rdoc +0 -0
  502. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/bin/rackup +0 -0
  503. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/contrib/rack.png +0 -0
  504. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/contrib/rack.svg +0 -0
  505. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/contrib/rack_logo.svg +0 -0
  506. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/contrib/rdoc.css +0 -0
  507. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/example/lobster.ru +0 -0
  508. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/example/protectedlobster.rb +0 -0
  509. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/example/protectedlobster.ru +0 -0
  510. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/auth/abstract/handler.rb +0 -0
  511. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/auth/abstract/request.rb +0 -0
  512. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/auth/basic.rb +0 -0
  513. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/auth/digest/md5.rb +0 -0
  514. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/auth/digest/nonce.rb +0 -0
  515. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/auth/digest/params.rb +0 -0
  516. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/auth/digest/request.rb +0 -0
  517. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/body_proxy.rb +0 -0
  518. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/builder.rb +0 -0
  519. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/cascade.rb +0 -0
  520. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/chunked.rb +0 -0
  521. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/common_logger.rb +0 -0
  522. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/conditional_get.rb +0 -0
  523. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/config.rb +0 -0
  524. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/content_length.rb +0 -0
  525. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/content_type.rb +0 -0
  526. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/core_ext/regexp.rb +0 -0
  527. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/deflater.rb +0 -0
  528. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/directory.rb +0 -0
  529. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.4/lib/rack/etag.rb +77 -0
  530. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/events.rb +0 -0
  531. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/file.rb +0 -0
  532. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/files.rb +0 -0
  533. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/handler/cgi.rb +0 -0
  534. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/handler/fastcgi.rb +0 -0
  535. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/handler/lsws.rb +0 -0
  536. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/handler/scgi.rb +0 -0
  537. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/handler/thin.rb +0 -0
  538. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/handler/webrick.rb +0 -0
  539. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/handler.rb +0 -0
  540. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/head.rb +0 -0
  541. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.4/lib/rack/lint.rb +806 -0
  542. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/lobster.rb +0 -0
  543. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/lock.rb +0 -0
  544. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/logger.rb +0 -0
  545. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/media_type.rb +0 -0
  546. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/method_override.rb +0 -0
  547. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/mime.rb +0 -0
  548. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/mock.rb +0 -0
  549. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/multipart/generator.rb +0 -0
  550. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/multipart/parser.rb +0 -0
  551. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/multipart/uploaded_file.rb +0 -0
  552. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/multipart.rb +0 -0
  553. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/null_logger.rb +0 -0
  554. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.4/lib/rack/query_parser.rb +221 -0
  555. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/recursive.rb +0 -0
  556. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/reloader.rb +0 -0
  557. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/request.rb +0 -0
  558. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/response.rb +0 -0
  559. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/rewindable_input.rb +0 -0
  560. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/runtime.rb +0 -0
  561. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/sendfile.rb +0 -0
  562. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/server.rb +0 -0
  563. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/session/abstract/id.rb +0 -0
  564. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/session/cookie.rb +0 -0
  565. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/session/memcache.rb +0 -0
  566. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/session/pool.rb +0 -0
  567. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/show_exceptions.rb +0 -0
  568. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/show_status.rb +0 -0
  569. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/static.rb +0 -0
  570. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/tempfile_reaper.rb +0 -0
  571. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack/urlmap.rb +0 -0
  572. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.4/lib/rack/utils.rb +616 -0
  573. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.4/lib/rack/version.rb +29 -0
  574. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/lib/rack.rb +0 -0
  575. data/vendor/bundle/ruby/3.1.0/gems/{rack-2.2.3.1 → rack-2.2.4}/rack.gemspec +0 -0
  576. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/History.md +349 -0
  577. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/MIT-LICENSE.txt +20 -0
  578. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/README.md +139 -0
  579. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/mock_session.rb +2 -0
  580. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/test/cookie_jar.rb +246 -0
  581. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/test/methods.rb +95 -0
  582. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/test/mock_digest_request.rb +35 -0
  583. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/test/uploaded_file.rb +109 -0
  584. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/test/utils.rb +156 -0
  585. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/test/version.rb +5 -0
  586. data/vendor/bundle/ruby/3.1.0/gems/rack-test-2.0.2/lib/rack/test.rb +414 -0
  587. data/vendor/bundle/ruby/3.1.0/gems/redcarpet-3.5.1/ext/redcarpet/Makefile +2 -2
  588. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/Gemfile +0 -0
  589. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/LICENSE.md +0 -0
  590. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/README.md +0 -0
  591. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/Rakefile +0 -0
  592. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/lib/sawyer/agent.rb +0 -0
  593. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/lib/sawyer/link_parsers/hal.rb +0 -0
  594. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/lib/sawyer/link_parsers/simple.rb +0 -0
  595. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/lib/sawyer/relation.rb +0 -0
  596. data/vendor/bundle/ruby/3.1.0/gems/sawyer-0.9.2/lib/sawyer/resource.rb +160 -0
  597. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/lib/sawyer/response.rb +0 -0
  598. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/lib/sawyer/serializer.rb +0 -0
  599. data/vendor/bundle/ruby/3.1.0/gems/sawyer-0.9.2/lib/sawyer.rb +17 -0
  600. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/sawyer.gemspec +0 -0
  601. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/script/bootstrap +0 -0
  602. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/script/console +0 -0
  603. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/script/package +0 -0
  604. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/script/release +0 -0
  605. data/vendor/bundle/ruby/3.1.0/gems/{sawyer-0.9.1 → sawyer-0.9.2}/script/test +0 -0
  606. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/CHANGES +2089 -0
  607. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/Gemfile +0 -0
  608. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/LICENSE +0 -0
  609. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/NOTICE +0 -0
  610. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/README.md +0 -0
  611. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/server.rb +283 -0
  612. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/atoms/findElements.js +0 -0
  613. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/atoms/getAttribute.js +0 -0
  614. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/atoms/isDisplayed.js +0 -0
  615. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/atoms/mutationListener.js +0 -0
  616. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/atoms.rb +0 -0
  617. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/bidi/session.rb +0 -0
  618. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/bidi.rb +0 -0
  619. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/chrome/driver.rb +0 -0
  620. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/chrome/features.rb +0 -0
  621. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/chrome/options.rb +275 -0
  622. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/chrome/profile.rb +0 -0
  623. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/chrome/service.rb +0 -0
  624. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/chrome.rb +41 -0
  625. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/action_builder.rb +0 -0
  626. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/alert.rb +0 -0
  627. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/driver.rb +364 -0
  628. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -0
  629. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +0 -0
  630. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -0
  631. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +0 -0
  632. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +0 -0
  633. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_bidi.rb +0 -0
  634. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +0 -0
  635. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +0 -0
  636. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_context.rb +0 -0
  637. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -0
  638. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +0 -0
  639. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +0 -0
  640. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_location.rb +0 -0
  641. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +0 -0
  642. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_logs.rb +0 -0
  643. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +0 -0
  644. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +0 -0
  645. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +71 -0
  646. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +0 -0
  647. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +0 -0
  648. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -0
  649. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -0
  650. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/prints_page.rb +0 -0
  651. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +0 -0
  652. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/element.rb +0 -0
  653. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/error.rb +0 -0
  654. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/file_reaper.rb +0 -0
  655. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/html5/local_storage.rb +0 -0
  656. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/html5/session_storage.rb +0 -0
  657. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/html5/shared_web_storage.rb +0 -0
  658. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/input_device.rb +0 -0
  659. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/interaction.rb +0 -0
  660. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/interactions.rb +0 -0
  661. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/key_actions.rb +0 -0
  662. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/key_input.rb +0 -0
  663. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/none_input.rb +0 -0
  664. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/pause.rb +0 -0
  665. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/interactions/pointer_actions.rb +352 -0
  666. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/pointer_cancel.rb +0 -0
  667. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/pointer_event_properties.rb +0 -0
  668. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/pointer_input.rb +0 -0
  669. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/pointer_move.rb +0 -0
  670. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/pointer_press.rb +0 -0
  671. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/scroll.rb +0 -0
  672. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/scroll_origin.rb +0 -0
  673. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/typing_interaction.rb +0 -0
  674. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/interactions/wheel_actions.rb +113 -0
  675. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/interactions/wheel_input.rb +0 -0
  676. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/keys.rb +0 -0
  677. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/log_entry.rb +0 -0
  678. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/logger.rb +0 -0
  679. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/logs.rb +0 -0
  680. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/manager.rb +150 -0
  681. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/navigation.rb +0 -0
  682. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/options.rb +177 -0
  683. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/platform.rb +0 -0
  684. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/port_prober.rb +0 -0
  685. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/profile_helper.rb +0 -0
  686. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/proxy.rb +0 -0
  687. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/search_context.rb +0 -0
  688. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/service.rb +0 -0
  689. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/service_manager.rb +0 -0
  690. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/shadow_root.rb +0 -0
  691. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/socket_lock.rb +0 -0
  692. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/socket_poller.rb +0 -0
  693. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/takes_screenshot.rb +66 -0
  694. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/target_locator.rb +0 -0
  695. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/timeouts.rb +0 -0
  696. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +83 -0
  697. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +73 -0
  698. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +62 -0
  699. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/common/wait.rb +0 -0
  700. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/websocket_connection.rb +156 -0
  701. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/window.rb +159 -0
  702. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common/zipper.rb +91 -0
  703. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/common.rb +97 -0
  704. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/devtools/console_event.rb +0 -0
  705. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/devtools/exception_event.rb +0 -0
  706. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/devtools/mutation_event.rb +0 -0
  707. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/devtools/network_interceptor.rb +176 -0
  708. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/devtools/pinned_script.rb +0 -0
  709. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/devtools/request.rb +0 -0
  710. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/devtools/response.rb +0 -0
  711. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/devtools.rb +87 -0
  712. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/edge/driver.rb +0 -0
  713. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/edge/features.rb +0 -0
  714. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/edge/options.rb +0 -0
  715. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/edge/profile.rb +0 -0
  716. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/edge/service.rb +0 -0
  717. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/edge.rb +0 -0
  718. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/driver.rb +0 -0
  719. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/extension.rb +0 -0
  720. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/features.rb +0 -0
  721. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/options.rb +0 -0
  722. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/profile.rb +0 -0
  723. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/profiles_ini.rb +0 -0
  724. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/service.rb +0 -0
  725. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/firefox/util.rb +0 -0
  726. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/firefox.rb +55 -0
  727. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/ie/driver.rb +0 -0
  728. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/ie/options.rb +0 -0
  729. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/ie/service.rb +0 -0
  730. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/ie.rb +28 -0
  731. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/remote/bridge.rb +705 -0
  732. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/remote/capabilities.rb +0 -0
  733. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/remote/commands.rb +172 -0
  734. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/remote/driver.rb +60 -0
  735. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/remote/http/common.rb +0 -0
  736. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/remote/http/curb.rb +0 -0
  737. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/remote/http/default.rb +0 -0
  738. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/remote/response.rb +0 -0
  739. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/remote/server_error.rb +0 -0
  740. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/remote.rb +0 -0
  741. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/safari/driver.rb +0 -0
  742. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/safari/features.rb +0 -0
  743. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/safari/options.rb +0 -0
  744. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/safari/service.rb +0 -0
  745. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/safari.rb +59 -0
  746. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/abstract_event_listener.rb +0 -0
  747. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/block_event_listener.rb +0 -0
  748. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/cdp/domain.rb.erb +0 -0
  749. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/cdp_client_generator.rb +0 -0
  750. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/color.rb +0 -0
  751. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/escaper.rb +0 -0
  752. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/event_firing_bridge.rb +0 -0
  753. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/guards/guard.rb +0 -0
  754. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/guards/guard_condition.rb +0 -0
  755. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/guards.rb +0 -0
  756. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/relative_locator.rb +0 -0
  757. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support/select.rb +0 -0
  758. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver/support.rb +0 -0
  759. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/lib/selenium/webdriver/version.rb +24 -0
  760. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium/webdriver.rb +0 -0
  761. data/vendor/bundle/ruby/3.1.0/gems/{selenium-webdriver-4.2.0 → selenium-webdriver-4.4.0}/lib/selenium-webdriver.rb +0 -0
  762. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.4.0/selenium-webdriver.gemspec +66 -0
  763. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/CHANGELOG +1069 -0
  764. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/MIT-LICENSE +0 -0
  765. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/README.rdoc +933 -0
  766. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/bin/sequel +0 -0
  767. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/advanced_associations.rdoc +0 -0
  768. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/association_basics.rdoc +0 -0
  769. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/bin_sequel.rdoc +0 -0
  770. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/doc/cheat_sheet.rdoc +255 -0
  771. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/code_order.rdoc +0 -0
  772. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/core_extensions.rdoc +0 -0
  773. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/dataset_basics.rdoc +0 -0
  774. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/dataset_filtering.rdoc +0 -0
  775. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/extensions.rdoc +0 -0
  776. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/fork_safety.rdoc +0 -0
  777. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/mass_assignment.rdoc +0 -0
  778. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/migration.rdoc +0 -0
  779. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/model_dataset_method_design.rdoc +0 -0
  780. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/model_hooks.rdoc +0 -0
  781. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/model_plugins.rdoc +0 -0
  782. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/mssql_stored_procedures.rdoc +0 -0
  783. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/object_model.rdoc +0 -0
  784. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/doc/opening_databases.rdoc +425 -0
  785. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/postgresql.rdoc +0 -0
  786. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/prepared_statements.rdoc +0 -0
  787. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/querying.rdoc +0 -0
  788. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/reflection.rdoc +0 -0
  789. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.0.0.txt +0 -0
  790. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.1.0.txt +0 -0
  791. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.10.0.txt +0 -0
  792. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.11.0.txt +0 -0
  793. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.12.0.txt +0 -0
  794. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.13.0.txt +0 -0
  795. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.14.0.txt +0 -0
  796. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.15.0.txt +0 -0
  797. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.16.0.txt +0 -0
  798. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.17.0.txt +0 -0
  799. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.18.0.txt +0 -0
  800. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.19.0.txt +0 -0
  801. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.2.0.txt +0 -0
  802. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.20.0.txt +0 -0
  803. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.21.0.txt +0 -0
  804. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.22.0.txt +0 -0
  805. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.23.0.txt +0 -0
  806. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.24.0.txt +0 -0
  807. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.25.0.txt +0 -0
  808. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.26.0.txt +0 -0
  809. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.27.0.txt +0 -0
  810. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.28.0.txt +0 -0
  811. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.29.0.txt +0 -0
  812. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.3.0.txt +0 -0
  813. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.30.0.txt +0 -0
  814. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.31.0.txt +0 -0
  815. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.32.0.txt +0 -0
  816. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.33.0.txt +0 -0
  817. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.34.0.txt +0 -0
  818. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.35.0.txt +0 -0
  819. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.36.0.txt +0 -0
  820. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.37.0.txt +0 -0
  821. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.38.0.txt +0 -0
  822. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.39.0.txt +0 -0
  823. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.4.0.txt +0 -0
  824. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.40.0.txt +0 -0
  825. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.41.0.txt +0 -0
  826. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.42.0.txt +0 -0
  827. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.43.0.txt +0 -0
  828. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.44.0.txt +0 -0
  829. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.45.0.txt +0 -0
  830. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.46.0.txt +0 -0
  831. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.47.0.txt +0 -0
  832. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.48.0.txt +0 -0
  833. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.49.0.txt +0 -0
  834. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.5.0.txt +0 -0
  835. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.50.0.txt +0 -0
  836. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.51.0.txt +0 -0
  837. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.52.0.txt +0 -0
  838. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.53.0.txt +0 -0
  839. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.54.0.txt +0 -0
  840. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.55.0.txt +0 -0
  841. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.56.0.txt +0 -0
  842. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/doc/release_notes/5.57.0.txt +23 -0
  843. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/doc/release_notes/5.58.0.txt +31 -0
  844. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/doc/release_notes/5.59.0.txt +73 -0
  845. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.6.0.txt +0 -0
  846. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.7.0.txt +0 -0
  847. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.8.0.txt +0 -0
  848. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/release_notes/5.9.0.txt +0 -0
  849. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/schema_modification.rdoc +0 -0
  850. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/security.rdoc +0 -0
  851. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/sharding.rdoc +0 -0
  852. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/sql.rdoc +0 -0
  853. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/doc/testing.rdoc +186 -0
  854. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/thread_safety.rdoc +0 -0
  855. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/transactions.rdoc +0 -0
  856. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/validations.rdoc +0 -0
  857. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/doc/virtual_rows.rdoc +0 -0
  858. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/ado/access.rb +0 -0
  859. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/ado/mssql.rb +0 -0
  860. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/ado.rb +0 -0
  861. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/amalgalite.rb +0 -0
  862. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/ibmdb.rb +0 -0
  863. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/db2.rb +0 -0
  864. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/jdbc/derby.rb +318 -0
  865. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/jdbc/h2.rb +287 -0
  866. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/jdbc/hsqldb.rb +226 -0
  867. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/jtds.rb +0 -0
  868. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/mssql.rb +0 -0
  869. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/mysql.rb +0 -0
  870. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/oracle.rb +0 -0
  871. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/postgresql.rb +0 -0
  872. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -0
  873. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/sqlite.rb +0 -0
  874. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/sqlserver.rb +0 -0
  875. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc/transactions.rb +0 -0
  876. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/jdbc.rb +0 -0
  877. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/mock.rb +0 -0
  878. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/mysql.rb +0 -0
  879. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/mysql2.rb +0 -0
  880. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/odbc/db2.rb +0 -0
  881. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/odbc/mssql.rb +0 -0
  882. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/odbc/oracle.rb +0 -0
  883. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/odbc.rb +0 -0
  884. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/oracle.rb +0 -0
  885. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/postgres.rb +822 -0
  886. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/postgresql.rb +0 -0
  887. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/shared/access.rb +0 -0
  888. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/shared/db2.rb +492 -0
  889. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/shared/mssql.rb +1163 -0
  890. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/shared/mysql.rb +1092 -0
  891. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/shared/oracle.rb +721 -0
  892. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/adapters/shared/postgres.rb +2298 -0
  893. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/shared/sqlanywhere.rb +0 -0
  894. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/shared/sqlite.rb +0 -0
  895. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/sqlanywhere.rb +0 -0
  896. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/sqlite.rb +0 -0
  897. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/tinytds.rb +0 -0
  898. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/columns_limit_1.rb +0 -0
  899. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +0 -0
  900. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +0 -0
  901. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/mysql_mysql2.rb +0 -0
  902. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/mysql_prepared_statements.rb +0 -0
  903. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/replace.rb +0 -0
  904. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/split_alter_table.rb +0 -0
  905. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/stored_procedures.rb +0 -0
  906. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/adapters/utils/unmodified_identifiers.rb +0 -0
  907. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/ast_transformer.rb +0 -0
  908. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/connection_pool/sharded_single.rb +0 -0
  909. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/connection_pool/sharded_threaded.rb +0 -0
  910. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/connection_pool/single.rb +0 -0
  911. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/connection_pool/threaded.rb +0 -0
  912. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/connection_pool.rb +0 -0
  913. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/core.rb +0 -0
  914. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/connecting.rb +0 -0
  915. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/dataset.rb +0 -0
  916. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/dataset_defaults.rb +0 -0
  917. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/features.rb +0 -0
  918. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/logging.rb +0 -0
  919. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/misc.rb +0 -0
  920. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/query.rb +0 -0
  921. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/database/schema_generator.rb +650 -0
  922. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/database/schema_methods.rb +1081 -0
  923. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database/transactions.rb +0 -0
  924. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/database.rb +0 -0
  925. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/dataset/actions.rb +1293 -0
  926. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/dataset/dataset_module.rb +0 -0
  927. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/dataset/features.rb +270 -0
  928. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/dataset/graph.rb +0 -0
  929. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/dataset/misc.rb +0 -0
  930. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/dataset/placeholder_literalizer.rb +0 -0
  931. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/dataset/prepared_statements.rb +0 -0
  932. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/dataset/query.rb +1485 -0
  933. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/dataset/sql.rb +1811 -0
  934. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/dataset.rb +0 -0
  935. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/deprecated.rb +0 -0
  936. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/exceptions.rb +0 -0
  937. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/_model_constraint_validations.rb +0 -0
  938. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/_model_pg_row.rb +0 -0
  939. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/_pretty_table.rb +0 -0
  940. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/any_not_empty.rb +0 -0
  941. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/arbitrary_servers.rb +0 -0
  942. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/async_thread_pool.rb +0 -0
  943. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/auto_literal_strings.rb +0 -0
  944. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/blank.rb +0 -0
  945. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/caller_logging.rb +0 -0
  946. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/columns_introspection.rb +0 -0
  947. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/connection_expiration.rb +0 -0
  948. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/connection_validator.rb +0 -0
  949. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/constant_sql_override.rb +0 -0
  950. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/constraint_validations.rb +0 -0
  951. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/core_extensions.rb +0 -0
  952. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/core_refinements.rb +0 -0
  953. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/current_datetime_timestamp.rb +0 -0
  954. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/dataset_source_alias.rb +0 -0
  955. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/date_arithmetic.rb +0 -0
  956. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/date_parse_input_handler.rb +0 -0
  957. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/datetime_parse_to_time.rb +0 -0
  958. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/duplicate_columns_handler.rb +0 -0
  959. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/empty_array_consider_nulls.rb +0 -0
  960. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/error_sql.rb +0 -0
  961. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/escaped_like.rb +0 -0
  962. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/eval_inspect.rb +0 -0
  963. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/exclude_or_null.rb +0 -0
  964. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/fiber_concurrency.rb +0 -0
  965. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/freeze_datasets.rb +0 -0
  966. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/from_block.rb +0 -0
  967. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/graph_each.rb +0 -0
  968. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/identifier_mangling.rb +0 -0
  969. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/implicit_subquery.rb +0 -0
  970. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/index_caching.rb +0 -0
  971. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/inflector.rb +0 -0
  972. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/integer64.rb +0 -0
  973. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/extensions/is_distinct_from.rb +139 -0
  974. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/looser_typecasting.rb +0 -0
  975. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/migration.rb +0 -0
  976. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +0 -0
  977. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/named_timezones.rb +0 -0
  978. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/no_auto_literal_strings.rb +0 -0
  979. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/null_dataset.rb +0 -0
  980. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pagination.rb +0 -0
  981. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_array.rb +0 -0
  982. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_array_ops.rb +0 -0
  983. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_enum.rb +0 -0
  984. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_extended_date_support.rb +0 -0
  985. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/extensions/pg_hstore.rb +348 -0
  986. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_hstore_ops.rb +0 -0
  987. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_inet.rb +0 -0
  988. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_inet_ops.rb +0 -0
  989. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_interval.rb +0 -0
  990. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_json.rb +0 -0
  991. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/extensions/pg_json_ops.rb +804 -0
  992. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_loose_count.rb +0 -0
  993. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_multirange.rb +0 -0
  994. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_range.rb +0 -0
  995. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_range_ops.rb +0 -0
  996. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_row.rb +0 -0
  997. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_row_ops.rb +0 -0
  998. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_static_cache_updater.rb +0 -0
  999. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pg_timestamptz.rb +0 -0
  1000. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/pretty_table.rb +0 -0
  1001. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/query.rb +0 -0
  1002. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/round_timestamps.rb +0 -0
  1003. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/run_transaction_hooks.rb +0 -0
  1004. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/s.rb +0 -0
  1005. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/schema_caching.rb +0 -0
  1006. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/schema_dumper.rb +0 -0
  1007. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/select_remove.rb +0 -0
  1008. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/sequel_4_dataset_methods.rb +0 -0
  1009. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/server_block.rb +0 -0
  1010. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/server_logging.rb +0 -0
  1011. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/split_array_nil.rb +0 -0
  1012. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/sql_comments.rb +0 -0
  1013. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/sql_expr.rb +0 -0
  1014. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/sql_log_normalizer.rb +0 -0
  1015. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/sqlite_json_ops.rb +0 -0
  1016. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/string_agg.rb +0 -0
  1017. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/string_date_time.rb +0 -0
  1018. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/symbol_aref.rb +0 -0
  1019. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/symbol_aref_refinement.rb +0 -0
  1020. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/symbol_as.rb +0 -0
  1021. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/symbol_as_refinement.rb +0 -0
  1022. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/synchronize_sql.rb +0 -0
  1023. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/thread_local_timezones.rb +0 -0
  1024. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/to_dot.rb +0 -0
  1025. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/extensions/virtual_row_method_block.rb +0 -0
  1026. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/model/associations.rb +4014 -0
  1027. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/model/base.rb +2270 -0
  1028. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/model/dataset_module.rb +0 -0
  1029. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/model/default_inflections.rb +0 -0
  1030. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/model/errors.rb +0 -0
  1031. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/model/exceptions.rb +0 -0
  1032. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/model/inflections.rb +0 -0
  1033. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/model/plugins.rb +0 -0
  1034. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/model.rb +0 -0
  1035. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/accessed_columns.rb +0 -0
  1036. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/active_model.rb +0 -0
  1037. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/after_initialize.rb +0 -0
  1038. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/association_dependencies.rb +0 -0
  1039. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/association_lazy_eager_option.rb +0 -0
  1040. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/association_multi_add_remove.rb +0 -0
  1041. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/association_pks.rb +0 -0
  1042. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/association_proxies.rb +0 -0
  1043. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/async_thread_pool.rb +0 -0
  1044. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/auto_restrict_eager_graph.rb +0 -0
  1045. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/auto_validations.rb +0 -0
  1046. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +0 -0
  1047. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/before_after_save.rb +0 -0
  1048. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/blacklist_security.rb +0 -0
  1049. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/boolean_readers.rb +0 -0
  1050. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/boolean_subsets.rb +0 -0
  1051. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/caching.rb +0 -0
  1052. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/class_table_inheritance.rb +0 -0
  1053. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/column_conflicts.rb +0 -0
  1054. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/column_encryption.rb +0 -0
  1055. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/column_select.rb +0 -0
  1056. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/columns_updated.rb +0 -0
  1057. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/composition.rb +0 -0
  1058. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/concurrent_eager_loading.rb +0 -0
  1059. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/constraint_validations.rb +0 -0
  1060. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/csv_serializer.rb +0 -0
  1061. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/dataset_associations.rb +0 -0
  1062. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/def_dataset_method.rb +0 -0
  1063. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/defaults_setter.rb +0 -0
  1064. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/delay_add_association.rb +0 -0
  1065. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/dirty.rb +0 -0
  1066. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/eager_each.rb +0 -0
  1067. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/eager_graph_eager.rb +0 -0
  1068. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/empty_failure_backtraces.rb +0 -0
  1069. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/enum.rb +0 -0
  1070. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/error_splitter.rb +0 -0
  1071. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/finder.rb +0 -0
  1072. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/forbid_lazy_load.rb +0 -0
  1073. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/force_encoding.rb +0 -0
  1074. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/hook_class_methods.rb +0 -0
  1075. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/input_transformer.rb +0 -0
  1076. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/plugins/insert_conflict.rb +76 -0
  1077. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/insert_returning_select.rb +0 -0
  1078. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/instance_filters.rb +0 -0
  1079. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/instance_hooks.rb +0 -0
  1080. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/instance_specific_default.rb +0 -0
  1081. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/inverted_subsets.rb +0 -0
  1082. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/json_serializer.rb +0 -0
  1083. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/lazy_attributes.rb +0 -0
  1084. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/plugins/list.rb +205 -0
  1085. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/many_through_many.rb +0 -0
  1086. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/modification_detection.rb +0 -0
  1087. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/mssql_optimistic_locking.rb +0 -0
  1088. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/nested_attributes.rb +0 -0
  1089. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/optimistic_locking.rb +0 -0
  1090. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/pg_array_associations.rb +0 -0
  1091. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/pg_auto_constraint_validations.rb +0 -0
  1092. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/pg_row.rb +0 -0
  1093. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/prepared_statements.rb +0 -0
  1094. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/prepared_statements_safe.rb +0 -0
  1095. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/rcte_tree.rb +0 -0
  1096. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/plugins/require_valid_schema.rb +67 -0
  1097. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/serialization.rb +0 -0
  1098. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/serialization_modification_detection.rb +0 -0
  1099. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/sharding.rb +0 -0
  1100. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/single_table_inheritance.rb +0 -0
  1101. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/singular_table_names.rb +0 -0
  1102. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/skip_create_refresh.rb +0 -0
  1103. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/skip_saving_columns.rb +0 -0
  1104. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/split_values.rb +0 -0
  1105. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/sql_comments.rb +0 -0
  1106. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/static_cache.rb +0 -0
  1107. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/static_cache_cache.rb +0 -0
  1108. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/string_stripper.rb +0 -0
  1109. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/subclasses.rb +0 -0
  1110. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/subset_conditions.rb +0 -0
  1111. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/table_select.rb +0 -0
  1112. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/plugins/tactical_eager_loading.rb +212 -0
  1113. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/throw_failures.rb +0 -0
  1114. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/timestamps.rb +0 -0
  1115. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/touch.rb +0 -0
  1116. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/tree.rb +0 -0
  1117. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/typecast_on_load.rb +0 -0
  1118. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/unlimited_update.rb +0 -0
  1119. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/unused_associations.rb +0 -0
  1120. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/update_or_create.rb +0 -0
  1121. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/update_primary_key.rb +0 -0
  1122. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/update_refresh.rb +0 -0
  1123. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/uuid.rb +0 -0
  1124. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/validate_associated.rb +0 -0
  1125. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/validation_class_methods.rb +0 -0
  1126. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/validation_contexts.rb +0 -0
  1127. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/validation_helpers.rb +0 -0
  1128. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/whitelist_security.rb +0 -0
  1129. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/plugins/xml_serializer.rb +0 -0
  1130. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/sql.rb +0 -0
  1131. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel/timezones.rb +0 -0
  1132. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.59.0/lib/sequel/version.rb +25 -0
  1133. data/vendor/bundle/ruby/3.1.0/gems/{sequel-5.56.0 → sequel-5.59.0}/lib/sequel.rb +0 -0
  1134. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/API_CHANGES.rdoc +0 -0
  1135. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/CHANGELOG.rdoc +333 -0
  1136. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ChangeLog.cvs +0 -0
  1137. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/Gemfile +20 -0
  1138. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/LICENSE +0 -0
  1139. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/Manifest.txt +59 -0
  1140. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/README.rdoc +118 -0
  1141. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/Rakefile +0 -0
  1142. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/appveyor.yml +0 -0
  1143. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/Makefile +267 -0
  1144. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/aggregator.c +273 -0
  1145. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/aggregator.h +0 -0
  1146. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/aggregator.o +0 -0
  1147. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/backup.c +0 -0
  1148. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/backup.h +0 -0
  1149. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/backup.o +0 -0
  1150. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/database.c +854 -0
  1151. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/database.h +0 -0
  1152. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/database.o +0 -0
  1153. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/exception.c +0 -0
  1154. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/exception.h +0 -0
  1155. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/exception.o +0 -0
  1156. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/extconf.rb +0 -0
  1157. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/sqlite3.c +0 -0
  1158. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/sqlite3.o +0 -0
  1159. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/sqlite3_native.so +0 -0
  1160. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/sqlite3_ruby.h +0 -0
  1161. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/statement.c +442 -0
  1162. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/ext/sqlite3/statement.h +0 -0
  1163. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/ext/sqlite3/statement.o +0 -0
  1164. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/faq/faq.rb +0 -0
  1165. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/faq/faq.yml +426 -0
  1166. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/lib/sqlite3/constants.rb +50 -0
  1167. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/lib/sqlite3/database.rb +741 -0
  1168. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/lib/sqlite3/errors.rb +0 -0
  1169. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/lib/sqlite3/pragmas.rb +595 -0
  1170. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/lib/sqlite3/resultset.rb +0 -0
  1171. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/lib/sqlite3/sqlite3_native.so +0 -0
  1172. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/lib/sqlite3/statement.rb +145 -0
  1173. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/lib/sqlite3/translator.rb +118 -0
  1174. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/lib/sqlite3/value.rb +0 -0
  1175. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/lib/sqlite3/version.rb +25 -0
  1176. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/lib/sqlite3.rb +0 -0
  1177. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/rakelib/faq.rake +0 -0
  1178. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/rakelib/gem.rake +40 -0
  1179. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/rakelib/native.rake +59 -0
  1180. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/rakelib/vendor_sqlite3.rake +108 -0
  1181. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/setup.rb +0 -0
  1182. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/test/helper.rb +25 -0
  1183. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_backup.rb +0 -0
  1184. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_collation.rb +0 -0
  1185. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/test/test_database.rb +531 -0
  1186. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_database_flags.rb +0 -0
  1187. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_database_readonly.rb +0 -0
  1188. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_database_readwrite.rb +0 -0
  1189. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_deprecated.rb +0 -0
  1190. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_encoding.rb +0 -0
  1191. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_integration.rb +0 -0
  1192. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_integration_aggregate.rb +0 -0
  1193. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_integration_open_close.rb +0 -0
  1194. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_integration_pending.rb +0 -0
  1195. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_integration_resultset.rb +0 -0
  1196. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_integration_statement.rb +0 -0
  1197. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_result_set.rb +0 -0
  1198. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_sqlite3.rb +0 -0
  1199. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.4/test/test_statement.rb +263 -0
  1200. data/vendor/bundle/ruby/3.1.0/gems/{sqlite3-1.4.2 → sqlite3-1.4.4}/test/test_statement_execute.rb +0 -0
  1201. data/vendor/bundle/ruby/3.1.0/specifications/addressable-2.8.1.gemspec +37 -0
  1202. data/vendor/bundle/ruby/3.1.0/specifications/debug-1.6.2.gemspec +39 -0
  1203. data/vendor/bundle/ruby/3.1.0/specifications/faraday-2.5.2.gemspec +0 -0
  1204. data/vendor/bundle/ruby/3.1.0/specifications/faraday-net_http-3.0.0.gemspec +32 -0
  1205. data/vendor/bundle/ruby/3.1.0/specifications/nokogiri-1.13.8-x86_64-linux.gemspec +69 -0
  1206. data/vendor/bundle/ruby/3.1.0/specifications/octokit-5.3.0.gemspec +36 -0
  1207. data/vendor/bundle/ruby/3.1.0/specifications/public_suffix-5.0.0.gemspec +24 -0
  1208. data/vendor/bundle/ruby/3.1.0/specifications/rack-2.2.4.gemspec +41 -0
  1209. data/vendor/bundle/ruby/3.1.0/specifications/rack-test-2.0.2.gemspec +38 -0
  1210. data/vendor/bundle/ruby/3.1.0/specifications/sawyer-0.9.2.gemspec +31 -0
  1211. data/vendor/bundle/ruby/3.1.0/specifications/selenium-webdriver-4.4.0.gemspec +62 -0
  1212. data/vendor/bundle/ruby/3.1.0/specifications/sequel-5.59.0.gemspec +46 -0
  1213. data/vendor/bundle/ruby/3.1.0/specifications/sqlite3-1.4.4.gemspec +51 -0
  1214. metadata +1202 -1198
  1215. data/vendor/bundle/ruby/3.1.0/cache/addressable-2.8.0.gem +0 -0
  1216. data/vendor/bundle/ruby/3.1.0/cache/debug-1.5.0.gem +0 -0
  1217. data/vendor/bundle/ruby/3.1.0/cache/faraday-2.3.0.gem +0 -0
  1218. data/vendor/bundle/ruby/3.1.0/cache/faraday-net_http-2.0.3.gem +0 -0
  1219. data/vendor/bundle/ruby/3.1.0/cache/nokogiri-1.13.6-x86_64-linux.gem +0 -0
  1220. data/vendor/bundle/ruby/3.1.0/cache/octokit-4.23.0.gem +0 -0
  1221. data/vendor/bundle/ruby/3.1.0/cache/public_suffix-4.0.7.gem +0 -0
  1222. data/vendor/bundle/ruby/3.1.0/cache/rack-2.2.3.1.gem +0 -0
  1223. data/vendor/bundle/ruby/3.1.0/cache/rack-test-1.1.0.gem +0 -0
  1224. data/vendor/bundle/ruby/3.1.0/cache/sawyer-0.9.1.gem +0 -0
  1225. data/vendor/bundle/ruby/3.1.0/cache/selenium-webdriver-4.2.0.gem +0 -0
  1226. data/vendor/bundle/ruby/3.1.0/cache/sequel-5.56.0.gem +0 -0
  1227. data/vendor/bundle/ruby/3.1.0/cache/sqlite3-1.4.2.gem +0 -0
  1228. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/debug-1.5.0/debug/debug.so +0 -0
  1229. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/debug-1.5.0/gem_make.out +0 -19
  1230. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/debug-1.5.0/mkmf.log +0 -86
  1231. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/sqlite3-1.4.2/gem_make.out +0 -84
  1232. data/vendor/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/sqlite3-1.4.2/sqlite3/sqlite3_native.so +0 -0
  1233. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/CHANGELOG.md +0 -246
  1234. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/Gemfile +0 -28
  1235. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/addressable.gemspec +0 -37
  1236. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/native.rb +0 -61
  1237. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna/pure.rb +0 -678
  1238. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/idna.rb +0 -27
  1239. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/template.rb +0 -1031
  1240. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/uri.rb +0 -2556
  1241. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/lib/addressable/version.rb +0 -32
  1242. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/idna_spec.rb +0 -302
  1243. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/net_http_compat_spec.rb +0 -30
  1244. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/security_spec.rb +0 -59
  1245. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/template_spec.rb +0 -1460
  1246. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/spec/addressable/uri_spec.rb +0 -6665
  1247. data/vendor/bundle/ruby/3.1.0/gems/addressable-2.8.0/tasks/gem.rake +0 -92
  1248. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/CONTRIBUTING.md +0 -493
  1249. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/README.md +0 -890
  1250. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/Rakefile +0 -34
  1251. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/debug.gemspec +0 -32
  1252. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/exe/rdbg +0 -34
  1253. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/ext/debug/Makefile +0 -267
  1254. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/ext/debug/debug.c +0 -222
  1255. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/ext/debug/debug.o +0 -0
  1256. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/ext/debug/debug.so +0 -0
  1257. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/ext/debug/debug_version.h +0 -1
  1258. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/ext/debug/extconf.rb +0 -15
  1259. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/ext/debug/iseq_collector.o +0 -0
  1260. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/bp.vim +0 -68
  1261. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/breakpoint.rb +0 -517
  1262. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/client.rb +0 -235
  1263. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/config.rb +0 -493
  1264. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/console.rb +0 -228
  1265. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/debug.so +0 -0
  1266. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/frame_info.rb +0 -172
  1267. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/prelude.rb +0 -49
  1268. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/server.rb +0 -493
  1269. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/server_cdp.rb +0 -1144
  1270. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/server_dap.rb +0 -869
  1271. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/session.rb +0 -2312
  1272. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/source_repository.rb +0 -117
  1273. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/thread_client.rb +0 -1202
  1274. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/tracer.rb +0 -241
  1275. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug/version.rb +0 -5
  1276. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/lib/debug.rb +0 -4
  1277. data/vendor/bundle/ruby/3.1.0/gems/debug-1.5.0/misc/README.md.erb +0 -584
  1278. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/LICENSE.md +0 -20
  1279. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/README.md +0 -55
  1280. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/examples/client_spec.rb +0 -97
  1281. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/examples/client_test.rb +0 -118
  1282. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/lib/faraday/adapter/test.rb +0 -268
  1283. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/lib/faraday/adapter.rb +0 -102
  1284. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/lib/faraday/connection.rb +0 -561
  1285. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/lib/faraday/options/env.rb +0 -181
  1286. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/lib/faraday/options/ssl_options.rb +0 -59
  1287. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/lib/faraday/version.rb +0 -5
  1288. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/spec/faraday/adapter/test_spec.rb +0 -377
  1289. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/spec/faraday/connection_spec.rb +0 -787
  1290. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/spec/faraday/options/env_spec.rb +0 -70
  1291. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/spec/faraday/request_spec.rb +0 -109
  1292. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/spec/faraday/utils_spec.rb +0 -117
  1293. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/spec/support/shared_examples/adapter.rb +0 -104
  1294. data/vendor/bundle/ruby/3.1.0/gems/faraday-2.3.0/spec/support/shared_examples/request_method.rb +0 -249
  1295. data/vendor/bundle/ruby/3.1.0/gems/faraday-net_http-2.0.3/lib/faraday/adapter/net_http.rb +0 -224
  1296. data/vendor/bundle/ruby/3.1.0/gems/faraday-net_http-2.0.3/lib/faraday/net_http/version.rb +0 -7
  1297. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/extconf.rb +0 -1008
  1298. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/gumbo.c +0 -584
  1299. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/include/libxslt/xsltconfig.h +0 -180
  1300. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/nokogiri.h +0 -223
  1301. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_attr.c +0 -103
  1302. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_attribute_decl.c +0 -70
  1303. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_cdata.c +0 -57
  1304. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_document.c +0 -680
  1305. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_dtd.c +0 -208
  1306. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_element_decl.c +0 -69
  1307. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_entity_decl.c +0 -112
  1308. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_node.c +0 -2144
  1309. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_node_set.c +0 -498
  1310. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_reader.c +0 -719
  1311. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_schema.c +0 -284
  1312. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_text.c +0 -48
  1313. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/ext/nokogiri/xml_xpath_context.c +0 -406
  1314. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/lib/nokogiri/2.6/nokogiri.so +0 -0
  1315. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/lib/nokogiri/2.7/nokogiri.so +0 -0
  1316. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/lib/nokogiri/3.0/nokogiri.so +0 -0
  1317. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/lib/nokogiri/3.1/nokogiri.so +0 -0
  1318. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/lib/nokogiri/version/constant.rb +0 -6
  1319. data/vendor/bundle/ruby/3.1.0/gems/nokogiri-1.13.6-x86_64-linux/lib/nokogiri/xml/reader.rb +0 -107
  1320. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/README.md +0 -820
  1321. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/Rakefile +0 -22
  1322. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/ext/sawyer/relation.rb +0 -10
  1323. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/arguments.rb +0 -14
  1324. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/authentication.rb +0 -81
  1325. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/actions_secrets.rb +0 -58
  1326. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/actions_workflow_runs.rb +0 -105
  1327. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/actions_workflows.rb +0 -43
  1328. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/apps.rb +0 -222
  1329. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/authorizations.rb +0 -182
  1330. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/checks.rb +0 -200
  1331. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/commit_branches.rb +0 -20
  1332. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/commit_comments.rb +0 -95
  1333. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/commit_pulls.rb +0 -20
  1334. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/commits.rb +0 -244
  1335. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/community_profile.rb +0 -22
  1336. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/contents.rb +0 -168
  1337. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/deployments.rb +0 -82
  1338. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/downloads.rb +0 -50
  1339. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/emojis.rb +0 -18
  1340. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/events.rb +0 -152
  1341. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/feeds.rb +0 -33
  1342. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/gists.rb +0 -234
  1343. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/gitignore.rb +0 -43
  1344. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/hooks.rb +0 -297
  1345. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/issues.rb +0 -368
  1346. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/labels.rb +0 -156
  1347. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/legacy_search.rb +0 -42
  1348. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/licenses.rb +0 -45
  1349. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/markdown.rb +0 -27
  1350. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/marketplace.rb +0 -56
  1351. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/meta.rb +0 -21
  1352. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/milestones.rb +0 -87
  1353. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/notifications.rb +0 -167
  1354. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/oauth_applications.rb +0 -122
  1355. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/objects.rb +0 -141
  1356. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/organizations.rb +0 -820
  1357. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/pages.rb +0 -63
  1358. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/projects.rb +0 -314
  1359. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/pub_sub_hubbub.rb +0 -111
  1360. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/pull_requests.rb +0 -303
  1361. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/rate_limit.rb +0 -54
  1362. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/reactions.rb +0 -158
  1363. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/refs.rb +0 -134
  1364. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/releases.rb +0 -164
  1365. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/repositories.rb +0 -799
  1366. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/repository_invitations.rb +0 -96
  1367. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/reviews.rb +0 -227
  1368. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/say.rb +0 -19
  1369. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/search.rb +0 -91
  1370. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/service_status.rb +0 -48
  1371. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/source_import.rb +0 -161
  1372. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/stats.rb +0 -107
  1373. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/statuses.rb +0 -47
  1374. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/traffic.rb +0 -69
  1375. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client/users.rb +0 -441
  1376. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/client.rb +0 -253
  1377. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/configurable.rb +0 -151
  1378. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/connection.rb +0 -211
  1379. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/default.rb +0 -186
  1380. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_admin_client/admin_stats.rb +0 -120
  1381. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_admin_client/license.rb +0 -18
  1382. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_admin_client/orgs.rb +0 -27
  1383. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_admin_client/search_indexing.rb +0 -83
  1384. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_admin_client/users.rb +0 -128
  1385. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_admin_client.rb +0 -40
  1386. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_management_console_client/management_console.rb +0 -176
  1387. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/enterprise_management_console_client.rb +0 -50
  1388. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/error.rb +0 -354
  1389. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/gist.rb +0 -36
  1390. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/middleware/follow_redirects.rb +0 -134
  1391. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/organization.rb +0 -17
  1392. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/preview.rb +0 -46
  1393. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/rate_limit.rb +0 -33
  1394. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/repo_arguments.rb +0 -19
  1395. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/repository.rb +0 -95
  1396. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/response/base_middleware.rb +0 -8
  1397. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/response/feed_parser.rb +0 -19
  1398. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/response/raise_error.rb +0 -19
  1399. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/user.rb +0 -19
  1400. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/version.rb +0 -17
  1401. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit/warnable.rb +0 -19
  1402. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/lib/octokit.rb +0 -60
  1403. data/vendor/bundle/ruby/3.1.0/gems/octokit-4.23.0/octokit.gemspec +0 -23
  1404. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/CHANGELOG.md +0 -417
  1405. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Gemfile +0 -14
  1406. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/README.md +0 -217
  1407. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/Rakefile +0 -52
  1408. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/data/list.txt +0 -14035
  1409. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/list.rb +0 -247
  1410. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/rule.rb +0 -350
  1411. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix/version.rb +0 -15
  1412. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/lib/public_suffix.rb +0 -177
  1413. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/public_suffix.gemspec +0 -29
  1414. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/acceptance_test.rb +0 -131
  1415. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/psl_test.rb +0 -52
  1416. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/domain_test.rb +0 -106
  1417. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/list_test.rb +0 -241
  1418. data/vendor/bundle/ruby/3.1.0/gems/public_suffix-4.0.7/test/unit/rule_test.rb +0 -222
  1419. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.3.1/CHANGELOG.md +0 -699
  1420. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.3.1/lib/rack/etag.rb +0 -75
  1421. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.3.1/lib/rack/lint.rb +0 -806
  1422. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.3.1/lib/rack/query_parser.rb +0 -217
  1423. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.3.1/lib/rack/utils.rb +0 -613
  1424. data/vendor/bundle/ruby/3.1.0/gems/rack-2.2.3.1/lib/rack/version.rb +0 -29
  1425. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/History.md +0 -256
  1426. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/MIT-LICENSE.txt +0 -19
  1427. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/README.md +0 -150
  1428. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/mock_session.rb +0 -63
  1429. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/test/cookie_jar.rb +0 -194
  1430. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/test/methods.rb +0 -83
  1431. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/test/mock_digest_request.rb +0 -25
  1432. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/test/uploaded_file.rb +0 -85
  1433. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/test/utils.rb +0 -144
  1434. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/test/version.rb +0 -5
  1435. data/vendor/bundle/ruby/3.1.0/gems/rack-test-1.1.0/lib/rack/test.rb +0 -334
  1436. data/vendor/bundle/ruby/3.1.0/gems/sawyer-0.9.1/lib/sawyer/resource.rb +0 -155
  1437. data/vendor/bundle/ruby/3.1.0/gems/sawyer-0.9.1/lib/sawyer.rb +0 -17
  1438. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/CHANGES +0 -2050
  1439. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/server.rb +0 -283
  1440. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/chrome/options.rb +0 -261
  1441. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/chrome.rb +0 -55
  1442. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/driver.rb +0 -397
  1443. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +0 -136
  1444. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -31
  1445. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/interactions/pointer_actions.rb +0 -369
  1446. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/interactions/wheel_actions.rb +0 -113
  1447. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/manager.rb +0 -177
  1448. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/options.rb +0 -184
  1449. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/takes_screenshot.rb +0 -66
  1450. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/websocket_connection.rb +0 -149
  1451. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/window.rb +0 -159
  1452. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common/zipper.rb +0 -91
  1453. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/common.rb +0 -95
  1454. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/devtools.rb +0 -86
  1455. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/firefox.rb +0 -69
  1456. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/ie.rb +0 -42
  1457. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/remote/bridge.rb +0 -672
  1458. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/remote/commands.rb +0 -158
  1459. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/remote/driver.rb +0 -61
  1460. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/remote/http/persistent.rb +0 -65
  1461. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/safari.rb +0 -73
  1462. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/lib/selenium/webdriver/version.rb +0 -24
  1463. data/vendor/bundle/ruby/3.1.0/gems/selenium-webdriver-4.2.0/selenium-webdriver.gemspec +0 -66
  1464. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/CHANGELOG +0 -1037
  1465. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/README.rdoc +0 -908
  1466. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/doc/cheat_sheet.rdoc +0 -247
  1467. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/doc/opening_databases.rdoc +0 -421
  1468. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/doc/testing.rdoc +0 -186
  1469. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/jdbc/derby.rb +0 -313
  1470. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/jdbc/h2.rb +0 -282
  1471. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/jdbc/hsqldb.rb +0 -220
  1472. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/postgres.rb +0 -816
  1473. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/shared/db2.rb +0 -464
  1474. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/shared/mssql.rb +0 -1129
  1475. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/shared/mysql.rb +0 -1080
  1476. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/shared/oracle.rb +0 -652
  1477. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/adapters/shared/postgres.rb +0 -2232
  1478. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/database/schema_generator.rb +0 -646
  1479. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/database/schema_methods.rb +0 -1078
  1480. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/dataset/actions.rb +0 -1244
  1481. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/dataset/features.rb +0 -265
  1482. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/dataset/query.rb +0 -1423
  1483. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/dataset/sql.rb +0 -1724
  1484. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/extensions/pg_hstore.rb +0 -348
  1485. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/extensions/pg_json_ops.rb +0 -752
  1486. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/model/associations.rb +0 -4002
  1487. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/model/base.rb +0 -2260
  1488. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/plugins/insert_conflict.rb +0 -72
  1489. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/plugins/list.rb +0 -203
  1490. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/plugins/tactical_eager_loading.rb +0 -205
  1491. data/vendor/bundle/ruby/3.1.0/gems/sequel-5.56.0/lib/sequel/version.rb +0 -25
  1492. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/CHANGELOG.rdoc +0 -318
  1493. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/Gemfile +0 -17
  1494. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/Manifest.txt +0 -60
  1495. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/README.rdoc +0 -118
  1496. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/Makefile +0 -267
  1497. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/aggregator.c +0 -273
  1498. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/aggregator.o +0 -0
  1499. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/backup.o +0 -0
  1500. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/database.c +0 -827
  1501. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/database.o +0 -0
  1502. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/exception.o +0 -0
  1503. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/sqlite3.o +0 -0
  1504. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/sqlite3_native.so +0 -0
  1505. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/statement.c +0 -442
  1506. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/ext/sqlite3/statement.o +0 -0
  1507. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/faq/faq.yml +0 -426
  1508. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/lib/sqlite3/constants.rb +0 -50
  1509. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/lib/sqlite3/database.rb +0 -736
  1510. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/lib/sqlite3/pragmas.rb +0 -588
  1511. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/lib/sqlite3/sqlite3_native.so +0 -0
  1512. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/lib/sqlite3/statement.rb +0 -144
  1513. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/lib/sqlite3/translator.rb +0 -118
  1514. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/lib/sqlite3/version.rb +0 -25
  1515. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/rakelib/gem.rake +0 -40
  1516. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/rakelib/native.rake +0 -56
  1517. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/rakelib/vendor_sqlite3.rake +0 -97
  1518. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/test/helper.rb +0 -18
  1519. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/test/test_database.rb +0 -503
  1520. data/vendor/bundle/ruby/3.1.0/gems/sqlite3-1.4.2/test/test_statement.rb +0 -263
  1521. data/vendor/bundle/ruby/3.1.0/specifications/addressable-2.8.0.gemspec +0 -36
  1522. data/vendor/bundle/ruby/3.1.0/specifications/debug-1.5.0.gemspec +0 -39
  1523. data/vendor/bundle/ruby/3.1.0/specifications/faraday-2.3.0.gemspec +0 -0
  1524. data/vendor/bundle/ruby/3.1.0/specifications/faraday-net_http-2.0.3.gemspec +0 -32
  1525. data/vendor/bundle/ruby/3.1.0/specifications/nokogiri-1.13.6-x86_64-linux.gemspec +0 -69
  1526. data/vendor/bundle/ruby/3.1.0/specifications/octokit-4.23.0.gemspec +0 -35
  1527. data/vendor/bundle/ruby/3.1.0/specifications/public_suffix-4.0.7.gemspec +0 -24
  1528. data/vendor/bundle/ruby/3.1.0/specifications/rack-2.2.3.1.gemspec +0 -41
  1529. data/vendor/bundle/ruby/3.1.0/specifications/rack-test-1.1.0.gemspec +0 -45
  1530. data/vendor/bundle/ruby/3.1.0/specifications/sawyer-0.9.1.gemspec +0 -31
  1531. data/vendor/bundle/ruby/3.1.0/specifications/selenium-webdriver-4.2.0.gemspec +0 -62
  1532. data/vendor/bundle/ruby/3.1.0/specifications/sequel-5.56.0.gemspec +0 -48
  1533. data/vendor/bundle/ruby/3.1.0/specifications/sqlite3-1.4.2.gemspec +0 -51
@@ -0,0 +1,4014 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Sequel
4
+ class Model
5
+ # Associations are used in order to specify relationships between model classes
6
+ # that reflect relations between tables in the database using foreign keys.
7
+ module Associations
8
+ # Map of association type symbols to association reflection classes.
9
+ ASSOCIATION_TYPES = {}
10
+
11
+ # Set an empty association reflection hash in the model
12
+ def self.apply(model)
13
+ model.instance_exec do
14
+ @association_reflections = {}
15
+ @autoreloading_associations = {}
16
+ @cache_associations = true
17
+ @default_eager_limit_strategy = true
18
+ @default_association_options = {}
19
+ @default_association_type_options = {}
20
+ @dataset_module_class = DatasetModule
21
+ end
22
+ end
23
+
24
+ # The dataset module to use for classes using the associations plugin.
25
+ class DatasetModule < Model::DatasetModule
26
+ def_dataset_caching_method(self, :eager)
27
+ end
28
+
29
+ # AssociationReflection is a Hash subclass that keeps information on Sequel::Model associations. It
30
+ # provides methods to reduce internal code duplication. It should not
31
+ # be instantiated by the user.
32
+ class AssociationReflection < Hash
33
+ include Sequel::Inflections
34
+
35
+ # Name symbol for the _add internal association method
36
+ def _add_method
37
+ self[:_add_method]
38
+ end
39
+
40
+ # Name symbol for the _remove_all internal association method
41
+ def _remove_all_method
42
+ self[:_remove_all_method]
43
+ end
44
+
45
+ # Name symbol for the _remove internal association method
46
+ def _remove_method
47
+ self[:_remove_method]
48
+ end
49
+
50
+ # Name symbol for the _setter association method
51
+ def _setter_method
52
+ self[:_setter_method]
53
+ end
54
+
55
+ # Name symbol for the add association method
56
+ def add_method
57
+ self[:add_method]
58
+ end
59
+
60
+ # Name symbol for association method, the same as the name of the association.
61
+ def association_method
62
+ self[:name]
63
+ end
64
+
65
+ # The class associated to the current model class via this association
66
+ def associated_class
67
+ cached_fetch(:class) do
68
+ begin
69
+ constantize(self[:class_name])
70
+ rescue NameError => e
71
+ raise NameError, "#{e.message} (this happened when attempting to find the associated class for #{inspect})", e.backtrace
72
+ end
73
+ end
74
+ end
75
+
76
+ # The dataset associated via this association, with the non-instance specific
77
+ # changes already applied. This will be a joined dataset if the association
78
+ # requires joining tables.
79
+ def associated_dataset
80
+ cached_fetch(:_dataset){apply_dataset_changes(_associated_dataset)}
81
+ end
82
+
83
+ # Apply all non-instance specific changes to the given dataset and return it.
84
+ def apply_dataset_changes(ds)
85
+ ds = ds.with_extend(AssociationDatasetMethods).clone(:association_reflection => self)
86
+ if exts = self[:reverse_extend]
87
+ ds = ds.with_extend(*exts)
88
+ end
89
+ ds = ds.select(*select) if select
90
+ if c = self[:conditions]
91
+ ds = (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
92
+ end
93
+ ds = ds.order(*self[:order]) if self[:order]
94
+ ds = ds.limit(*self[:limit]) if self[:limit]
95
+ ds = ds.limit(1).skip_limit_check if limit_to_single_row?
96
+ ds = ds.eager(self[:eager]) if self[:eager]
97
+ ds = ds.distinct if self[:distinct]
98
+ ds
99
+ end
100
+
101
+ # Apply all non-instance specific changes and the eager_block option to the given
102
+ # dataset and return it.
103
+ def apply_eager_dataset_changes(ds)
104
+ ds = apply_dataset_changes(ds)
105
+ if block = self[:eager_block]
106
+ ds = block.call(ds)
107
+ end
108
+ ds
109
+ end
110
+
111
+ # Apply the eager graph limit strategy to the dataset to graph into the current dataset, or return
112
+ # the dataset unmodified if no SQL limit strategy is needed.
113
+ def apply_eager_graph_limit_strategy(strategy, ds)
114
+ case strategy
115
+ when :distinct_on
116
+ apply_distinct_on_eager_limit_strategy(ds.order_prepend(*self[:order]))
117
+ when :window_function
118
+ apply_window_function_eager_limit_strategy(ds.order_prepend(*self[:order])).select(*ds.columns)
119
+ else
120
+ ds
121
+ end
122
+ end
123
+
124
+ # Apply an eager limit strategy to the dataset, or return the dataset
125
+ # unmodified if it doesn't need an eager limit strategy.
126
+ def apply_eager_limit_strategy(ds, strategy=eager_limit_strategy, limit_and_offset=limit_and_offset())
127
+ case strategy
128
+ when :distinct_on
129
+ apply_distinct_on_eager_limit_strategy(ds)
130
+ when :window_function
131
+ apply_window_function_eager_limit_strategy(ds, limit_and_offset)
132
+ else
133
+ ds
134
+ end
135
+ end
136
+
137
+ # Use DISTINCT ON and ORDER BY clauses to limit the results to the first record with matching keys.
138
+ def apply_distinct_on_eager_limit_strategy(ds)
139
+ keys = predicate_key
140
+ ds.distinct(*keys).order_prepend(*keys)
141
+ end
142
+
143
+ # Use a window function to limit the results of the eager loading dataset.
144
+ def apply_window_function_eager_limit_strategy(ds, limit_and_offset=limit_and_offset())
145
+ rn = ds.row_number_column
146
+ limit, offset = limit_and_offset
147
+ ds = ds.unordered.select_append{|o| o.row_number.function.over(:partition=>predicate_key, :order=>ds.opts[:order]).as(rn)}.from_self
148
+ ds = ds.order(rn) if ds.db.database_type == :mysql
149
+ ds = if !returns_array?
150
+ ds.where(rn => offset ? offset+1 : 1)
151
+ elsif offset
152
+ offset += 1
153
+ if limit
154
+ ds.where(rn => (offset...(offset+limit)))
155
+ else
156
+ ds.where{SQL::Identifier.new(rn) >= offset}
157
+ end
158
+ else
159
+ ds.where{SQL::Identifier.new(rn) <= limit}
160
+ end
161
+ end
162
+
163
+ # If the ruby eager limit strategy is being used, slice the array using the slice
164
+ # range to return the object(s) at the correct offset/limit.
165
+ def apply_ruby_eager_limit_strategy(rows, limit_and_offset = limit_and_offset())
166
+ name = self[:name]
167
+ return unless range = slice_range(limit_and_offset)
168
+ if returns_array?
169
+ rows.each{|o| o.associations[name] = o.associations[name][range] || []}
170
+ else
171
+ offset = range.begin
172
+ rows.each{|o| o.associations[name] = o.associations[name][offset]}
173
+ end
174
+ end
175
+
176
+ # Whether the associations cache should use an array when storing the
177
+ # associated records during eager loading.
178
+ def assign_singular?
179
+ !returns_array?
180
+ end
181
+
182
+ # Whether this association can have associated objects, given the current
183
+ # object. Should be false if obj cannot have associated objects because
184
+ # the necessary key columns are NULL.
185
+ def can_have_associated_objects?(obj)
186
+ true
187
+ end
188
+
189
+ # Whether you are able to clone from the given association type to the current
190
+ # association type, true by default only if the types match.
191
+ def cloneable?(ref)
192
+ ref[:type] == self[:type]
193
+ end
194
+
195
+ # Name symbol for the dataset association method
196
+ def dataset_method
197
+ self[:dataset_method]
198
+ end
199
+
200
+ # Whether the dataset needs a primary key to function, true by default.
201
+ def dataset_need_primary_key?
202
+ true
203
+ end
204
+
205
+ # Return the symbol used for the row number column if the window function
206
+ # eager limit strategy is being used, or nil otherwise.
207
+ def delete_row_number_column(ds=associated_dataset)
208
+ if eager_limit_strategy == :window_function
209
+ ds.row_number_column
210
+ end
211
+ end
212
+
213
+ # Return an dataset that will load the appropriate associated objects for
214
+ # the given object using this association.
215
+ def association_dataset_for(object)
216
+ condition = if can_have_associated_objects?(object)
217
+ predicate_keys.zip(predicate_key_values(object))
218
+ else
219
+ false
220
+ end
221
+
222
+ associated_dataset.where(condition)
223
+ end
224
+
225
+ ASSOCIATION_DATASET_PROC = proc{|r| r.association_dataset_for(self)}
226
+ # Proc used to create the association dataset method.
227
+ def association_dataset_proc
228
+ ASSOCIATION_DATASET_PROC
229
+ end
230
+
231
+ # The eager_graph limit strategy to use for this dataset
232
+ def eager_graph_limit_strategy(strategy)
233
+ if self[:limit] || !returns_array?
234
+ strategy = strategy[self[:name]] if strategy.is_a?(Hash)
235
+ case strategy
236
+ when true
237
+ true_eager_graph_limit_strategy
238
+ when Symbol
239
+ strategy
240
+ else
241
+ if returns_array? || offset
242
+ :ruby
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ # The eager limit strategy to use for this dataset.
249
+ def eager_limit_strategy
250
+ cached_fetch(:_eager_limit_strategy) do
251
+ if self[:limit] || !returns_array?
252
+ case s = cached_fetch(:eager_limit_strategy){default_eager_limit_strategy}
253
+ when true
254
+ true_eager_limit_strategy
255
+ else
256
+ s
257
+ end
258
+ end
259
+ end
260
+ end
261
+
262
+ # Eager load the associated objects using the hash of eager options,
263
+ # yielding each row to the block.
264
+ def eager_load_results(eo, &block)
265
+ rows = eo[:rows]
266
+ unless eo[:initialize_rows] == false
267
+ Sequel.synchronize_with(eo[:mutex]){initialize_association_cache(rows)}
268
+ end
269
+ if eo[:id_map]
270
+ ids = eo[:id_map].keys
271
+ return ids if ids.empty?
272
+ end
273
+ strategy = eager_limit_strategy
274
+ cascade = eo[:associations]
275
+ eager_limit = nil
276
+
277
+ if eo[:no_results]
278
+ no_results = true
279
+ elsif eo[:eager_block] || eo[:loader] == false
280
+ ds = eager_loading_dataset(eo)
281
+
282
+ strategy = ds.opts[:eager_limit_strategy] || strategy
283
+
284
+ eager_limit =
285
+ if el = ds.opts[:eager_limit]
286
+ raise Error, "The :eager_limit dataset option is not supported for associations returning a single record" unless returns_array?
287
+ strategy ||= true_eager_graph_limit_strategy
288
+ if el.is_a?(Array)
289
+ el
290
+ else
291
+ [el, nil]
292
+ end
293
+ else
294
+ limit_and_offset
295
+ end
296
+
297
+ strategy = true_eager_graph_limit_strategy if strategy == :union
298
+ # Correlated subqueries are not supported for regular eager loading
299
+ strategy = :ruby if strategy == :correlated_subquery
300
+ strategy = nil if strategy == :ruby && assign_singular?
301
+ objects = apply_eager_limit_strategy(ds, strategy, eager_limit).all
302
+ elsif strategy == :union
303
+ objects = []
304
+ ds = associated_dataset
305
+ loader = union_eager_loader
306
+ joiner = " UNION ALL "
307
+ ids.each_slice(subqueries_per_union).each do |slice|
308
+ objects.concat(ds.with_sql(slice.map{|k| loader.sql(*k)}.join(joiner)).to_a)
309
+ end
310
+ ds = ds.eager(cascade) if cascade
311
+ ds.send(:post_load, objects)
312
+ else
313
+ loader = placeholder_eager_loader
314
+ loader = loader.with_dataset{|dataset| dataset.eager(cascade)} if cascade
315
+ objects = loader.all(ids)
316
+ end
317
+
318
+ Sequel.synchronize_with(eo[:mutex]){objects.each(&block)} unless no_results
319
+
320
+ if strategy == :ruby
321
+ apply_ruby_eager_limit_strategy(rows, eager_limit || limit_and_offset)
322
+ end
323
+ end
324
+
325
+ # The key to use for the key hash when eager loading
326
+ def eager_loader_key
327
+ self[:eager_loader_key]
328
+ end
329
+
330
+ # By default associations do not need to select a key in an associated table
331
+ # to eagerly load.
332
+ def eager_loading_use_associated_key?
333
+ false
334
+ end
335
+
336
+ # Whether to eagerly graph a lazy dataset, true by default. If this
337
+ # is false, the association won't respect the :eager_graph option
338
+ # when loading the association for a single record.
339
+ def eager_graph_lazy_dataset?
340
+ true
341
+ end
342
+
343
+ # Whether additional conditions should be added when using the filter
344
+ # by associations support.
345
+ def filter_by_associations_add_conditions?
346
+ self[:conditions] || self[:eager_block] || self[:limit]
347
+ end
348
+
349
+ # The expression to use for the additional conditions to be added for
350
+ # the filter by association support, when the association itself is
351
+ # filtered. Works by using a subquery to test that the objects passed
352
+ # also meet the association filter criteria.
353
+ def filter_by_associations_conditions_expression(obj)
354
+ ds = filter_by_associations_conditions_dataset.where(filter_by_associations_conditions_subquery_conditions(obj))
355
+ {filter_by_associations_conditions_key=>ds}
356
+ end
357
+
358
+ # Finalize the association by first attempting to populate the thread-safe cache,
359
+ # and then transfering the thread-safe cache value to the association itself,
360
+ # so that a mutex is not needed to get the value.
361
+ def finalize
362
+ return unless cache = self[:cache]
363
+
364
+ finalizer = proc do |meth, key|
365
+ next if has_key?(key)
366
+
367
+ # Allow calling private methods to make sure caching is done appropriately
368
+ send(meth)
369
+ self[key] = cache.delete(key) if cache.has_key?(key)
370
+ end
371
+
372
+ finalize_settings.each(&finalizer)
373
+
374
+ unless self[:instance_specific]
375
+ finalizer.call(:associated_eager_dataset, :associated_eager_dataset)
376
+ finalizer.call(:filter_by_associations_conditions_dataset, :filter_by_associations_conditions_dataset)
377
+ end
378
+
379
+ nil
380
+ end
381
+
382
+ # Map of methods to cache keys used for finalizing associations.
383
+ FINALIZE_SETTINGS = {
384
+ :associated_class=>:class,
385
+ :associated_dataset=>:_dataset,
386
+ :eager_limit_strategy=>:_eager_limit_strategy,
387
+ :placeholder_loader=>:placeholder_loader,
388
+ :predicate_key=>:predicate_key,
389
+ :predicate_keys=>:predicate_keys,
390
+ :reciprocal=>:reciprocal,
391
+ }.freeze
392
+ def finalize_settings
393
+ FINALIZE_SETTINGS
394
+ end
395
+
396
+ # Whether to handle silent modification failure when adding/removing
397
+ # associated records, false by default.
398
+ def handle_silent_modification_failure?
399
+ false
400
+ end
401
+
402
+ # Initialize the associations cache for the current association for the given objects.
403
+ def initialize_association_cache(objects)
404
+ name = self[:name]
405
+ if assign_singular?
406
+ objects.each{|object| object.associations[name] = nil}
407
+ else
408
+ objects.each{|object| object.associations[name] = []}
409
+ end
410
+ end
411
+
412
+ # Show which type of reflection this is, and a guess at what code was used to create the
413
+ # association.
414
+ def inspect
415
+ o = self[:orig_opts].dup
416
+ o.delete(:class)
417
+ o.delete(:class_name)
418
+ o.delete(:block) unless o[:block]
419
+ o[:class] = self[:orig_class] if self[:orig_class]
420
+
421
+ "#<#{self.class} #{self[:model]}.#{self[:type]} #{self[:name].inspect}#{", #{o.inspect[1...-1]}" unless o.empty?}>"
422
+ end
423
+
424
+ # The limit and offset for this association (returned as a two element array).
425
+ def limit_and_offset
426
+ if (v = self[:limit]).is_a?(Array)
427
+ v
428
+ else
429
+ [v, nil]
430
+ end
431
+ end
432
+
433
+ # Whether the associated object needs a primary key to be added/removed,
434
+ # false by default.
435
+ def need_associated_primary_key?
436
+ false
437
+ end
438
+
439
+ # A placeholder literalizer that can be used to lazily load the association. If
440
+ # one can't be used, returns nil.
441
+ def placeholder_loader
442
+ if use_placeholder_loader?
443
+ cached_fetch(:placeholder_loader) do
444
+ Sequel::Dataset::PlaceholderLiteralizer.loader(associated_dataset) do |pl, ds|
445
+ ds = ds.where(Sequel.&(*predicate_keys.map{|k| SQL::BooleanExpression.new(:'=', k, pl.arg)}))
446
+ if self[:block]
447
+ ds = self[:block].call(ds)
448
+ end
449
+ ds
450
+ end
451
+ end
452
+ end
453
+ end
454
+
455
+ # The keys to use for loading of the regular dataset, as an array.
456
+ def predicate_keys
457
+ cached_fetch(:predicate_keys){Array(predicate_key)}
458
+ end
459
+
460
+ # The values that predicate_keys should match for objects to be associated.
461
+ def predicate_key_values(object)
462
+ predicate_key_methods.map{|k| object.get_column_value(k)}
463
+ end
464
+
465
+ # Qualify +col+ with the given table name.
466
+ def qualify(table, col)
467
+ transform(col) do |k|
468
+ case k
469
+ when Symbol, SQL::Identifier
470
+ SQL::QualifiedIdentifier.new(table, k)
471
+ else
472
+ Sequel::Qualifier.new(table).transform(k)
473
+ end
474
+ end
475
+ end
476
+
477
+ # Qualify col with the associated model's table name.
478
+ def qualify_assoc(col)
479
+ qualify(associated_class.table_name, col)
480
+ end
481
+
482
+ # Qualify col with the current model's table name.
483
+ def qualify_cur(col)
484
+ qualify(self[:model].table_name, col)
485
+ end
486
+
487
+ # Returns the reciprocal association variable, if one exists. The reciprocal
488
+ # association is the association in the associated class that is the opposite
489
+ # of the current association. For example, Album.many_to_one :artist and
490
+ # Artist.one_to_many :albums are reciprocal associations. This information is
491
+ # to populate reciprocal associations. For example, when you do this_artist.add_album(album)
492
+ # it sets album.artist to this_artist.
493
+ def reciprocal
494
+ cached_fetch(:reciprocal) do
495
+ possible_recips = []
496
+
497
+ associated_class.all_association_reflections.each do |assoc_reflect|
498
+ if reciprocal_association?(assoc_reflect)
499
+ possible_recips << assoc_reflect
500
+ end
501
+ end
502
+
503
+ if possible_recips.length == 1
504
+ cached_set(:reciprocal_type, possible_recips.first[:type]) if ambiguous_reciprocal_type?
505
+ possible_recips.first[:name]
506
+ end
507
+ end
508
+ end
509
+
510
+ # Whether the reciprocal of this association returns an array of objects instead of a single object,
511
+ # true by default.
512
+ def reciprocal_array?
513
+ true
514
+ end
515
+
516
+ # Name symbol for the remove_all_ association method
517
+ def remove_all_method
518
+ self[:remove_all_method]
519
+ end
520
+
521
+ # Whether associated objects need to be removed from the association before
522
+ # being destroyed in order to preserve referential integrity.
523
+ def remove_before_destroy?
524
+ true
525
+ end
526
+
527
+ # Name symbol for the remove_ association method
528
+ def remove_method
529
+ self[:remove_method]
530
+ end
531
+
532
+ # Whether to check that an object to be disassociated is already associated to this object, false by default.
533
+ def remove_should_check_existing?
534
+ false
535
+ end
536
+
537
+ # Whether this association returns an array of objects instead of a single object,
538
+ # true by default.
539
+ def returns_array?
540
+ true
541
+ end
542
+
543
+ # The columns to select when loading the association.
544
+ def select
545
+ self[:select]
546
+ end
547
+
548
+ # Whether to set the reciprocal association to self when loading associated
549
+ # records, false by default.
550
+ def set_reciprocal_to_self?
551
+ false
552
+ end
553
+
554
+ # Name symbol for the setter association method
555
+ def setter_method
556
+ self[:setter_method]
557
+ end
558
+
559
+ # The range used for slicing when using the :ruby eager limit strategy.
560
+ def slice_range(limit_and_offset = limit_and_offset())
561
+ limit, offset = limit_and_offset
562
+ if limit || offset
563
+ (offset||0)..(limit ? (offset||0)+limit-1 : -1)
564
+ end
565
+ end
566
+
567
+ private
568
+
569
+ # If the key exists in the reflection hash, return it.
570
+ # If the key doesn't exist and association reflections are uncached, then yield to get the value.
571
+ # If the key doesn't exist and association reflection are cached, check the cache and return
572
+ # the value if present, or yield to get the value, cache the value, and return it.
573
+ def cached_fetch(key)
574
+ fetch(key) do
575
+ return yield unless h = self[:cache]
576
+ Sequel.synchronize{return h[key] if h.has_key?(key)}
577
+ value = yield
578
+ Sequel.synchronize{h[key] = value}
579
+ end
580
+ end
581
+
582
+ # Cache the value at the given key if caching.
583
+ def cached_set(key, value)
584
+ return unless h = self[:cache]
585
+ Sequel.synchronize{h[key] = value}
586
+ end
587
+
588
+ # The base dataset used for the association, before any order/conditions
589
+ # options have been applied.
590
+ def _associated_dataset
591
+ associated_class.dataset
592
+ end
593
+
594
+ # Whether for the reciprocal type for the given association cannot be
595
+ # known in advantage, false by default.
596
+ def ambiguous_reciprocal_type?
597
+ false
598
+ end
599
+
600
+ # Apply a limit strategy to the given dataset so that filter by
601
+ # associations works with a limited dataset.
602
+ def apply_filter_by_associations_limit_strategy(ds)
603
+ case filter_by_associations_limit_strategy
604
+ when :distinct_on
605
+ apply_filter_by_associations_distinct_on_limit_strategy(ds)
606
+ when :window_function
607
+ apply_filter_by_associations_window_function_limit_strategy(ds)
608
+ else
609
+ ds
610
+ end
611
+ end
612
+
613
+ # Apply a distinct on eager limit strategy using IN with a subquery
614
+ # that uses DISTINCT ON to ensure only the first matching record for
615
+ # each key is included.
616
+ def apply_filter_by_associations_distinct_on_limit_strategy(ds)
617
+ k = filter_by_associations_limit_key
618
+ ds.where(k=>apply_distinct_on_eager_limit_strategy(associated_eager_dataset.select(*k)))
619
+ end
620
+
621
+ # Apply a distinct on eager limit strategy using IN with a subquery
622
+ # that uses a filter on the row_number window function to ensure
623
+ # that only rows inside the limit are returned.
624
+ def apply_filter_by_associations_window_function_limit_strategy(ds)
625
+ ds.where(filter_by_associations_limit_key=>apply_window_function_eager_limit_strategy(associated_eager_dataset.select(*filter_by_associations_limit_alias_key)).select(*filter_by_associations_limit_aliases))
626
+ end
627
+
628
+ # The associated_dataset with the eager_block callback already applied.
629
+ def associated_eager_dataset
630
+ cached_fetch(:associated_eager_dataset) do
631
+ ds = associated_dataset.unlimited
632
+ if block = self[:eager_block]
633
+ ds = block.call(ds)
634
+ end
635
+ ds
636
+ end
637
+ end
638
+
639
+ # The dataset to use for eager loading associated objects for multiple current objects,
640
+ # given the hash passed to the eager loader.
641
+ def eager_loading_dataset(eo=OPTS)
642
+ ds = eo[:dataset] || associated_eager_dataset
643
+ ds = eager_loading_set_predicate_condition(ds, eo)
644
+ if associations = eo[:associations]
645
+ ds = ds.eager(associations)
646
+ end
647
+ if block = eo[:eager_block]
648
+ orig_ds = ds
649
+ ds = block.call(ds)
650
+ end
651
+ if eager_loading_use_associated_key?
652
+ ds = if ds.opts[:eager_graph] && !orig_ds.opts[:eager_graph]
653
+ block.call(orig_ds.select_append(*associated_key_array))
654
+ else
655
+ ds.select_append(*associated_key_array)
656
+ end
657
+ end
658
+ if self[:eager_graph]
659
+ raise(Error, "cannot eagerly load a #{self[:type]} association that uses :eager_graph") if eager_loading_use_associated_key?
660
+ ds = ds.eager_graph(self[:eager_graph])
661
+ end
662
+ ds
663
+ end
664
+
665
+ # The default eager limit strategy to use for this association
666
+ def default_eager_limit_strategy
667
+ self[:model].default_eager_limit_strategy || :ruby
668
+ end
669
+
670
+ # Set the predicate condition for the eager loading dataset based on the id map
671
+ # in the eager loading options.
672
+ def eager_loading_set_predicate_condition(ds, eo)
673
+ if id_map = eo[:id_map]
674
+ ds = ds.where(eager_loading_predicate_condition(id_map.keys))
675
+ end
676
+ ds
677
+ end
678
+
679
+ # The predicate condition to use for the eager_loader.
680
+ def eager_loading_predicate_condition(keys)
681
+ {predicate_key=>keys}
682
+ end
683
+
684
+ # Add conditions to the dataset to not include NULL values for
685
+ # the associated keys, and select those keys.
686
+ def filter_by_associations_add_conditions_dataset_filter(ds)
687
+ k = filter_by_associations_conditions_associated_keys
688
+ ds.select(*k).where(Sequel.negate(k.zip([])))
689
+ end
690
+
691
+ # The conditions to add to the filter by associations conditions
692
+ # subquery to restrict it to to the object(s) that was used as the
693
+ # filter value.
694
+ def filter_by_associations_conditions_subquery_conditions(obj)
695
+ key = qualify(associated_class.table_name, associated_class.primary_key)
696
+ case obj
697
+ when Array
698
+ {key=>obj.map(&:pk)}
699
+ when Sequel::Dataset
700
+ {key=>obj.select(*Array(qualify(associated_class.table_name, associated_class.primary_key)))}
701
+ else
702
+ Array(key).zip(Array(obj.pk))
703
+ end
704
+ end
705
+
706
+ # The base dataset to use for the filter by associations conditions
707
+ # subquery, regardless of the objects that are passed in as filter
708
+ # values.
709
+ def filter_by_associations_conditions_dataset
710
+ cached_fetch(:filter_by_associations_conditions_dataset) do
711
+ ds = associated_eager_dataset.unordered
712
+ ds = filter_by_associations_add_conditions_dataset_filter(ds)
713
+ ds = apply_filter_by_associations_limit_strategy(ds)
714
+ ds
715
+ end
716
+ end
717
+
718
+ # The strategy to use to filter by a limited association
719
+ def filter_by_associations_limit_strategy
720
+ v = fetch(:filter_limit_strategy, self[:eager_limit_strategy])
721
+ if v || self[:limit] || !returns_array?
722
+ case v ||= self[:model].default_eager_limit_strategy
723
+ when true, :union, :ruby
724
+ # Can't use a union or ruby-based strategy for filtering by associations, switch to default eager graph limit
725
+ # strategy.
726
+ true_eager_graph_limit_strategy
727
+ when Symbol
728
+ v
729
+ end
730
+ end
731
+ end
732
+
733
+ # Whether to limit the associated dataset to a single row.
734
+ def limit_to_single_row?
735
+ !returns_array?
736
+ end
737
+
738
+ # Any offset to use for this association (or nil if there is no offset).
739
+ def offset
740
+ limit_and_offset.last
741
+ end
742
+
743
+ # A placeholder literalizer used to speed up eager loading.
744
+ def placeholder_eager_loader
745
+ cached_fetch(:placeholder_eager_loader) do
746
+ Sequel::Dataset::PlaceholderLiteralizer.loader(associated_dataset) do |pl, ds|
747
+ apply_eager_limit_strategy(eager_loading_dataset.where(predicate_key=>pl.arg), eager_limit_strategy)
748
+ end
749
+ end
750
+ end
751
+
752
+ # The reciprocal type as an array, should be overridden in reflection subclasses that
753
+ # have ambiguous reciprocal types.
754
+ def possible_reciprocal_types
755
+ [reciprocal_type]
756
+ end
757
+
758
+ # Whether the given association reflection is possible reciprocal
759
+ # association for the current association reflection.
760
+ def reciprocal_association?(assoc_reflect)
761
+ possible_reciprocal_types.include?(assoc_reflect[:type]) &&
762
+ (begin; assoc_reflect.associated_class; rescue NameError; end) == self[:model] &&
763
+ assoc_reflect[:conditions].nil? &&
764
+ assoc_reflect[:block].nil?
765
+ end
766
+
767
+ # The number of subqueries to use in each union query, used to eagerly load
768
+ # limited associations. Defaults to 40, the optimal number depends on the
769
+ # latency between the database and the application.
770
+ def subqueries_per_union
771
+ self[:subqueries_per_union] || 40
772
+ end
773
+
774
+ # If +s+ is an array, map +s+ over the block. Otherwise, just call the
775
+ # block with +s+.
776
+ def transform(s, &block)
777
+ s.is_a?(Array) ? s.map(&block) : (yield s)
778
+ end
779
+
780
+ # What eager limit strategy should be used when true is given as the value,
781
+ # defaults to UNION as that is the fastest strategy if the appropriate keys are indexed.
782
+ def true_eager_limit_strategy
783
+ if self[:eager_graph] || (offset && !associated_dataset.supports_offsets_in_correlated_subqueries?)
784
+ # An SQL-based approach won't work if you are also eager graphing,
785
+ # so use a ruby based approach in that case.
786
+ :ruby
787
+ else
788
+ :union
789
+ end
790
+ end
791
+
792
+ # The eager_graph limit strategy used when true is given as the value, choosing the
793
+ # best strategy based on what the database supports.
794
+ def true_eager_graph_limit_strategy
795
+ if associated_class.dataset.supports_window_functions?
796
+ :window_function
797
+ else
798
+ :ruby
799
+ end
800
+ end
801
+
802
+ # A placeholder literalizer used to speed up the creation of union queries when eager
803
+ # loading a limited association.
804
+ def union_eager_loader
805
+ cached_fetch(:union_eager_loader) do
806
+ Sequel::Dataset::PlaceholderLiteralizer.loader(associated_dataset) do |pl, ds|
807
+ ds = self[:eager_block].call(ds) if self[:eager_block]
808
+ keys = predicate_keys
809
+ ds = ds.where(keys.map{pl.arg}.zip(keys))
810
+ if eager_loading_use_associated_key?
811
+ ds = ds.select_append(*associated_key_array)
812
+ end
813
+ ds.from_self
814
+ end
815
+ end
816
+ end
817
+
818
+ # Whether the placeholder loader can be used to load the association.
819
+ def use_placeholder_loader?
820
+ self[:use_placeholder_loader]
821
+ end
822
+ end
823
+
824
+ class ManyToOneAssociationReflection < AssociationReflection
825
+ ASSOCIATION_TYPES[:many_to_one] = self
826
+
827
+ # many_to_one associations can only have associated objects if none of
828
+ # the :keys options have a nil value.
829
+ def can_have_associated_objects?(obj)
830
+ !self[:keys].any?{|k| obj.get_column_value(k).nil?}
831
+ end
832
+
833
+ # Whether the dataset needs a primary key to function, false for many_to_one associations.
834
+ def dataset_need_primary_key?
835
+ false
836
+ end
837
+
838
+ # Default foreign key name symbol for foreign key in current model's table that points to
839
+ # the given association's table's primary key.
840
+ def default_key
841
+ :"#{self[:name]}_id"
842
+ end
843
+
844
+ # Whether to eagerly graph a lazy dataset, true for many_to_one associations
845
+ # only if the key is nil.
846
+ def eager_graph_lazy_dataset?
847
+ self[:key].nil?
848
+ end
849
+
850
+ # many_to_one associations don't need an eager_graph limit strategy
851
+ def eager_graph_limit_strategy(_)
852
+ nil
853
+ end
854
+
855
+ # many_to_one associations don't need an eager limit strategy
856
+ def eager_limit_strategy
857
+ nil
858
+ end
859
+
860
+ # many_to_one associations don't need a filter by associations limit strategy
861
+ def filter_by_associations_limit_strategy
862
+ nil
863
+ end
864
+
865
+ FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
866
+ :primary_key=>:primary_key,
867
+ :primary_keys=>:primary_keys,
868
+ :primary_key_method=>:primary_key_method,
869
+ :primary_key_methods=>:primary_key_methods,
870
+ :qualified_primary_key=>:qualified_primary_key,
871
+ :reciprocal_type=>:reciprocal_type
872
+ ).freeze
873
+ def finalize_settings
874
+ FINALIZE_SETTINGS
875
+ end
876
+
877
+ # The expression to use on the left hand side of the IN lookup when eager loading
878
+ def predicate_key
879
+ cached_fetch(:predicate_key){qualified_primary_key}
880
+ end
881
+
882
+ # The column(s) in the associated table that the key in the current table references (either a symbol or an array).
883
+ def primary_key
884
+ cached_fetch(:primary_key){associated_class.primary_key || raise(Error, "no primary key specified for #{associated_class.inspect}")}
885
+ end
886
+
887
+ # The columns in the associated table that the key in the current table references (always an array).
888
+ def primary_keys
889
+ cached_fetch(:primary_keys){Array(primary_key)}
890
+ end
891
+ alias associated_object_keys primary_keys
892
+
893
+ # The method symbol or array of method symbols to call on the associated object
894
+ # to get the value to use for the foreign keys.
895
+ def primary_key_method
896
+ cached_fetch(:primary_key_method){primary_key}
897
+ end
898
+
899
+ # The array of method symbols to call on the associated object
900
+ # to get the value to use for the foreign keys.
901
+ def primary_key_methods
902
+ cached_fetch(:primary_key_methods){Array(primary_key_method)}
903
+ end
904
+
905
+ # #primary_key qualified by the associated table
906
+ def qualified_primary_key
907
+ cached_fetch(:qualified_primary_key){self[:qualify] == false ? primary_key : qualify_assoc(primary_key)}
908
+ end
909
+
910
+ # True only if the reciprocal is a one_to_many association.
911
+ def reciprocal_array?
912
+ !set_reciprocal_to_self?
913
+ end
914
+
915
+ # Whether this association returns an array of objects instead of a single object,
916
+ # false for a many_to_one association.
917
+ def returns_array?
918
+ false
919
+ end
920
+
921
+ # True only if the reciprocal is a one_to_one association.
922
+ def set_reciprocal_to_self?
923
+ reciprocal
924
+ reciprocal_type == :one_to_one
925
+ end
926
+
927
+ private
928
+
929
+ # Reciprocals of many_to_one associations could be either one_to_many or one_to_one,
930
+ # and which is not known in advance.
931
+ def ambiguous_reciprocal_type?
932
+ true
933
+ end
934
+
935
+ def filter_by_associations_conditions_associated_keys
936
+ qualify(associated_class.table_name, primary_keys)
937
+ end
938
+
939
+ def filter_by_associations_conditions_key
940
+ qualify(self[:model].table_name, self[:key_column])
941
+ end
942
+
943
+ # many_to_one associations do not need to be limited to a single row if they
944
+ # explicitly do not have a key.
945
+ def limit_to_single_row?
946
+ super && self[:key]
947
+ end
948
+
949
+ def predicate_key_methods
950
+ self[:keys]
951
+ end
952
+
953
+ # The reciprocal type of a many_to_one association is either
954
+ # a one_to_many or a one_to_one association.
955
+ def possible_reciprocal_types
956
+ [:one_to_many, :one_to_one]
957
+ end
958
+
959
+ # Whether the given association reflection is possible reciprocal
960
+ def reciprocal_association?(assoc_reflect)
961
+ super && self[:keys] == assoc_reflect[:keys] && primary_key == assoc_reflect.primary_key
962
+ end
963
+
964
+ # The reciprocal type of a many_to_one association is either
965
+ # a one_to_many or a one_to_one association, look in the associated class
966
+ # to try to figure out which.
967
+ def reciprocal_type
968
+ cached_fetch(:reciprocal_type) do
969
+ possible_recips = []
970
+
971
+ associated_class.all_association_reflections.each do |assoc_reflect|
972
+ if reciprocal_association?(assoc_reflect)
973
+ possible_recips << assoc_reflect
974
+ end
975
+ end
976
+
977
+ if possible_recips.length == 1
978
+ possible_recips.first[:type]
979
+ else
980
+ possible_reciprocal_types
981
+ end
982
+ end
983
+ end
984
+ end
985
+
986
+ class OneToManyAssociationReflection < AssociationReflection
987
+ ASSOCIATION_TYPES[:one_to_many] = self
988
+
989
+ # Support a correlated subquery limit strategy when using eager_graph.
990
+ def apply_eager_graph_limit_strategy(strategy, ds)
991
+ case strategy
992
+ when :correlated_subquery
993
+ apply_correlated_subquery_limit_strategy(ds)
994
+ else
995
+ super
996
+ end
997
+ end
998
+
999
+ # The keys in the associated model's table related to this association
1000
+ def associated_object_keys
1001
+ self[:keys]
1002
+ end
1003
+
1004
+ # one_to_many associations can only have associated objects if none of
1005
+ # the :keys options have a nil value.
1006
+ def can_have_associated_objects?(obj)
1007
+ !self[:primary_keys].any?{|k| obj.get_column_value(k).nil?}
1008
+ end
1009
+
1010
+ # one_to_many and one_to_one associations can be clones
1011
+ def cloneable?(ref)
1012
+ ref[:type] == :one_to_many || ref[:type] == :one_to_one
1013
+ end
1014
+
1015
+ # Default foreign key name symbol for key in associated table that points to
1016
+ # current table's primary key.
1017
+ def default_key
1018
+ :"#{underscore(demodulize(self[:model].name))}_id"
1019
+ end
1020
+
1021
+ FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
1022
+ :qualified_primary_key=>:qualified_primary_key
1023
+ ).freeze
1024
+ def finalize_settings
1025
+ FINALIZE_SETTINGS
1026
+ end
1027
+
1028
+ # Handle silent failure of add/remove methods if raise_on_save_failure is false.
1029
+ def handle_silent_modification_failure?
1030
+ self[:raise_on_save_failure] == false
1031
+ end
1032
+
1033
+ # The hash key to use for the eager loading predicate (left side of IN (1, 2, 3))
1034
+ def predicate_key
1035
+ cached_fetch(:predicate_key){qualify_assoc(self[:key])}
1036
+ end
1037
+ alias qualified_key predicate_key
1038
+
1039
+ # The column in the current table that the key in the associated table references.
1040
+ def primary_key
1041
+ self[:primary_key]
1042
+ end
1043
+
1044
+ # #primary_key qualified by the current table
1045
+ def qualified_primary_key
1046
+ cached_fetch(:qualified_primary_key){qualify_cur(primary_key)}
1047
+ end
1048
+
1049
+ # Whether the reciprocal of this association returns an array of objects instead of a single object,
1050
+ # false for a one_to_many association.
1051
+ def reciprocal_array?
1052
+ false
1053
+ end
1054
+
1055
+ # Destroying one_to_many associated objects automatically deletes the foreign key.
1056
+ def remove_before_destroy?
1057
+ false
1058
+ end
1059
+
1060
+ # The one_to_many association needs to check that an object to be removed already is associated.
1061
+ def remove_should_check_existing?
1062
+ true
1063
+ end
1064
+
1065
+ # One to many associations set the reciprocal to self when loading associated records.
1066
+ def set_reciprocal_to_self?
1067
+ true
1068
+ end
1069
+
1070
+ private
1071
+
1072
+ # Use a correlated subquery to limit the dataset. Note that this will not
1073
+ # work correctly if the associated dataset uses qualified identifers in the WHERE clause,
1074
+ # as they would reference the containing query instead of the subquery.
1075
+ def apply_correlated_subquery_limit_strategy(ds)
1076
+ table = ds.first_source_table
1077
+ table_alias = ds.first_source_alias
1078
+ primary_key = associated_class.primary_key
1079
+ key = self[:key]
1080
+ cs_alias = :t1
1081
+ cs = associated_dataset.
1082
+ from(Sequel.as(table, :t1)).
1083
+ select(*qualify(cs_alias, primary_key)).
1084
+ where(Array(qualify(cs_alias, key)).zip(Array(qualify(table_alias, key)))).
1085
+ limit(*limit_and_offset)
1086
+ ds.where(qualify(table_alias, primary_key)=>cs)
1087
+ end
1088
+
1089
+ # Support correlated subquery strategy when filtering by limited associations.
1090
+ def apply_filter_by_associations_limit_strategy(ds)
1091
+ case filter_by_associations_limit_strategy
1092
+ when :correlated_subquery
1093
+ apply_correlated_subquery_limit_strategy(ds)
1094
+ else
1095
+ super
1096
+ end
1097
+ end
1098
+
1099
+ def filter_by_associations_conditions_associated_keys
1100
+ qualify(associated_class.table_name, self[:keys])
1101
+ end
1102
+
1103
+ def filter_by_associations_conditions_key
1104
+ qualify(self[:model].table_name, self[:primary_key_column])
1105
+ end
1106
+
1107
+ def filter_by_associations_limit_alias_key
1108
+ Array(filter_by_associations_limit_key)
1109
+ end
1110
+
1111
+ def filter_by_associations_limit_aliases
1112
+ filter_by_associations_limit_alias_key.map(&:column)
1113
+ end
1114
+
1115
+ def filter_by_associations_limit_key
1116
+ qualify(associated_class.table_name, associated_class.primary_key)
1117
+ end
1118
+
1119
+ def predicate_key_methods
1120
+ self[:primary_keys]
1121
+ end
1122
+
1123
+ def reciprocal_association?(assoc_reflect)
1124
+ super && self[:keys] == assoc_reflect[:keys] && primary_key == assoc_reflect.primary_key
1125
+ end
1126
+
1127
+ # The reciprocal type of a one_to_many association is a many_to_one association.
1128
+ def reciprocal_type
1129
+ :many_to_one
1130
+ end
1131
+
1132
+ # Support automatic use of correlated subqueries if :ruby option is best available option,
1133
+ # the database supports them, and either the associated class has a non-composite primary key
1134
+ # or the database supports multiple columns in IN.
1135
+ def true_eager_graph_limit_strategy
1136
+ r = super
1137
+ ds = associated_dataset
1138
+ if r == :ruby && ds.supports_limits_in_correlated_subqueries? && (Array(associated_class.primary_key).length == 1 || ds.supports_multiple_column_in?) && (!offset || ds.supports_offsets_in_correlated_subqueries?)
1139
+ :correlated_subquery
1140
+ else
1141
+ r
1142
+ end
1143
+ end
1144
+ end
1145
+
1146
+ # Methods that turn an association that returns multiple objects into an association that
1147
+ # returns a single object.
1148
+ module SingularAssociationReflection
1149
+ # Singular associations do not assign singular if they are using the ruby eager limit strategy
1150
+ # and have a slice range, since they need to store the array of associated objects in order to
1151
+ # pick the correct one with an offset.
1152
+ def assign_singular?
1153
+ super && (eager_limit_strategy != :ruby || !slice_range)
1154
+ end
1155
+
1156
+ # Add conditions when filtering by singular associations with orders, since the
1157
+ # underlying relationship is probably not one-to-one.
1158
+ def filter_by_associations_add_conditions?
1159
+ super || self[:order] || self[:eager_limit_strategy] || self[:filter_limit_strategy]
1160
+ end
1161
+
1162
+ # Make sure singular associations always have 1 as the limit
1163
+ def limit_and_offset
1164
+ r = super
1165
+ if r.first == 1
1166
+ r
1167
+ else
1168
+ [1, r[1]]
1169
+ end
1170
+ end
1171
+
1172
+ # Singular associations always return a single object, not an array.
1173
+ def returns_array?
1174
+ false
1175
+ end
1176
+
1177
+ private
1178
+
1179
+ # Only use a eager limit strategy by default if there is an offset or an order.
1180
+ def default_eager_limit_strategy
1181
+ super if self[:order] || offset
1182
+ end
1183
+
1184
+ # Use a strategy for filtering by associations if there is an order or an offset,
1185
+ # or a specific limiting strategy has been specified.
1186
+ def filter_by_associations_limit_strategy
1187
+ super if self[:order] || offset || self[:eager_limit_strategy] || self[:filter_limit_strategy]
1188
+ end
1189
+
1190
+ # Use the DISTINCT ON eager limit strategy for true if the database supports it.
1191
+ def true_eager_graph_limit_strategy
1192
+ if associated_class.dataset.supports_ordered_distinct_on? && !offset
1193
+ :distinct_on
1194
+ else
1195
+ super
1196
+ end
1197
+ end
1198
+ end
1199
+
1200
+ class OneToOneAssociationReflection < OneToManyAssociationReflection
1201
+ ASSOCIATION_TYPES[:one_to_one] = self
1202
+ include SingularAssociationReflection
1203
+ end
1204
+
1205
+ class ManyToManyAssociationReflection < AssociationReflection
1206
+ ASSOCIATION_TYPES[:many_to_many] = self
1207
+
1208
+ # The alias to use for the associated key when eagerly loading
1209
+ def associated_key_alias
1210
+ self[:left_key_alias]
1211
+ end
1212
+
1213
+ # Array of associated keys used when eagerly loading.
1214
+ def associated_key_array
1215
+ cached_fetch(:associated_key_array) do
1216
+ if self[:uses_left_composite_keys]
1217
+ associated_key_alias.zip(predicate_keys).map{|a, k| SQL::AliasedExpression.new(k, a)}
1218
+ else
1219
+ [SQL::AliasedExpression.new(predicate_key, associated_key_alias)]
1220
+ end
1221
+ end
1222
+ end
1223
+
1224
+ # The column to use for the associated key when eagerly loading
1225
+ def associated_key_column
1226
+ self[:left_key]
1227
+ end
1228
+
1229
+ # Alias of right_primary_keys
1230
+ def associated_object_keys
1231
+ right_primary_keys
1232
+ end
1233
+
1234
+ # many_to_many associations can only have associated objects if none of
1235
+ # the :left_primary_keys options have a nil value.
1236
+ def can_have_associated_objects?(obj)
1237
+ !self[:left_primary_keys].any?{|k| obj.get_column_value(k).nil?}
1238
+ end
1239
+
1240
+ # one_through_one and many_to_many associations can be clones
1241
+ def cloneable?(ref)
1242
+ ref[:type] == :many_to_many || ref[:type] == :one_through_one
1243
+ end
1244
+
1245
+ # The default associated key alias(es) to use when eager loading
1246
+ # associations via eager.
1247
+ def default_associated_key_alias
1248
+ self[:uses_left_composite_keys] ? (0...self[:left_keys].length).map{|i| :"x_foreign_key_#{i}_x"} : :x_foreign_key_x
1249
+ end
1250
+
1251
+ # The default eager loader used if the user doesn't override it. Extracted
1252
+ # to a method so the code can be shared with the many_through_many plugin.
1253
+ def default_eager_loader(eo)
1254
+ h = eo[:id_map]
1255
+ assign_singular = assign_singular?
1256
+ delete_rn = delete_row_number_column
1257
+ uses_lcks = self[:uses_left_composite_keys]
1258
+ left_key_alias = self[:left_key_alias]
1259
+ name = self[:name]
1260
+
1261
+ self[:model].eager_load_results(self, eo) do |assoc_record|
1262
+ assoc_record.values.delete(delete_rn) if delete_rn
1263
+ hash_key = if uses_lcks
1264
+ left_key_alias.map{|k| assoc_record.values.delete(k)}
1265
+ else
1266
+ assoc_record.values.delete(left_key_alias)
1267
+ end
1268
+
1269
+ objects = h[hash_key]
1270
+
1271
+ if assign_singular
1272
+ objects.each do |object|
1273
+ object.associations[name] ||= assoc_record
1274
+ end
1275
+ else
1276
+ objects.each do |object|
1277
+ object.associations[name].push(assoc_record)
1278
+ end
1279
+ end
1280
+ end
1281
+ end
1282
+
1283
+ # Default name symbol for the join table.
1284
+ def default_join_table
1285
+ [self[:class_name], self[:model].name].map{|i| underscore(pluralize(demodulize(i)))}.sort.join('_').to_sym
1286
+ end
1287
+
1288
+ # Default foreign key name symbol for key in join table that points to
1289
+ # current table's primary key (or :left_primary_key column).
1290
+ def default_left_key
1291
+ :"#{underscore(demodulize(self[:model].name))}_id"
1292
+ end
1293
+
1294
+ # Default foreign key name symbol for foreign key in join table that points to
1295
+ # the association's table's primary key (or :right_primary_key column).
1296
+ def default_right_key
1297
+ :"#{singularize(self[:name])}_id"
1298
+ end
1299
+
1300
+ FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
1301
+ :associated_key_array=>:associated_key_array,
1302
+ :qualified_right_key=>:qualified_right_key,
1303
+ :join_table_source=>:join_table_source,
1304
+ :join_table_alias=>:join_table_alias,
1305
+ :qualified_right_primary_key=>:qualified_right_primary_key,
1306
+ :right_primary_key=>:right_primary_key,
1307
+ :right_primary_keys=>:right_primary_keys,
1308
+ :right_primary_key_method=>:right_primary_key_method,
1309
+ :right_primary_key_methods=>:right_primary_key_methods,
1310
+ :select=>:select
1311
+ ).freeze
1312
+ def finalize_settings
1313
+ FINALIZE_SETTINGS
1314
+ end
1315
+
1316
+ # The hash key to use for the eager loading predicate (left side of IN (1, 2, 3)).
1317
+ # The left key qualified by the join table.
1318
+ def predicate_key
1319
+ cached_fetch(:predicate_key){qualify(join_table_alias, self[:left_key])}
1320
+ end
1321
+ alias qualified_left_key predicate_key
1322
+
1323
+ # The right key qualified by the join table.
1324
+ def qualified_right_key
1325
+ cached_fetch(:qualified_right_key){qualify(join_table_alias, self[:right_key])}
1326
+ end
1327
+
1328
+ # many_to_many associations need to select a key in an associated table to eagerly load
1329
+ def eager_loading_use_associated_key?
1330
+ !separate_query_per_table?
1331
+ end
1332
+
1333
+ # The source of the join table. This is the join table itself, unless it
1334
+ # is aliased, in which case it is the unaliased part.
1335
+ def join_table_source
1336
+ cached_fetch(:join_table_source){split_join_table_alias[0]}
1337
+ end
1338
+
1339
+ # The join table itself, unless it is aliased, in which case this
1340
+ # is the alias.
1341
+ def join_table_alias
1342
+ cached_fetch(:join_table_alias) do
1343
+ s, a = split_join_table_alias
1344
+ a || s
1345
+ end
1346
+ end
1347
+ alias associated_key_table join_table_alias
1348
+
1349
+ # Whether the associated object needs a primary key to be added/removed,
1350
+ # true for many_to_many associations.
1351
+ def need_associated_primary_key?
1352
+ true
1353
+ end
1354
+
1355
+ # #right_primary_key qualified by the associated table
1356
+ def qualified_right_primary_key
1357
+ cached_fetch(:qualified_right_primary_key){qualify_assoc(right_primary_key)}
1358
+ end
1359
+
1360
+ # The primary key column(s) to use in the associated table (can be symbol or array).
1361
+ def right_primary_key
1362
+ cached_fetch(:right_primary_key){associated_class.primary_key || raise(Error, "no primary key specified for #{associated_class.inspect}")}
1363
+ end
1364
+
1365
+ # The primary key columns to use in the associated table (always array).
1366
+ def right_primary_keys
1367
+ cached_fetch(:right_primary_keys){Array(right_primary_key)}
1368
+ end
1369
+
1370
+ # The method symbol or array of method symbols to call on the associated objects
1371
+ # to get the foreign key values for the join table.
1372
+ def right_primary_key_method
1373
+ cached_fetch(:right_primary_key_method){right_primary_key}
1374
+ end
1375
+
1376
+ # The array of method symbols to call on the associated objects
1377
+ # to get the foreign key values for the join table.
1378
+ def right_primary_key_methods
1379
+ cached_fetch(:right_primary_key_methods){Array(right_primary_key_method)}
1380
+ end
1381
+
1382
+ # The columns to select when loading the association, associated_class.table_name.* by default.
1383
+ def select
1384
+ cached_fetch(:select){default_select}
1385
+ end
1386
+
1387
+ # Whether a separate query should be used for the join table.
1388
+ def separate_query_per_table?
1389
+ self[:join_table_db]
1390
+ end
1391
+
1392
+ private
1393
+
1394
+ # Join to the the join table, unless using a separate query per table.
1395
+ def _associated_dataset
1396
+ if separate_query_per_table?
1397
+ super
1398
+ else
1399
+ super.inner_join(self[:join_table], self[:right_keys].zip(right_primary_keys), :qualify=>:deep)
1400
+ end
1401
+ end
1402
+
1403
+ # Use the right_keys from the eager loading options if
1404
+ # using a separate query per table.
1405
+ def eager_loading_set_predicate_condition(ds, eo)
1406
+ if separate_query_per_table?
1407
+ ds.where(right_primary_key=>eo[:right_keys])
1408
+ else
1409
+ super
1410
+ end
1411
+ end
1412
+
1413
+ # The default selection for associations that require joins. These do not use the default
1414
+ # model selection unless all entries in the select are explicitly qualified identifiers, as
1415
+ # other it can include unqualified columns which would be made ambiguous by joining.
1416
+ def default_select
1417
+ if (sel = associated_class.dataset.opts[:select]) && sel.all?{|c| selection_is_qualified?(c)}
1418
+ sel
1419
+ else
1420
+ Sequel::SQL::ColumnAll.new(associated_class.table_name)
1421
+ end
1422
+ end
1423
+
1424
+ def filter_by_associations_conditions_associated_keys
1425
+ qualify(join_table_alias, self[:left_keys])
1426
+ end
1427
+
1428
+ def filter_by_associations_conditions_key
1429
+ qualify(self[:model].table_name, self[:left_primary_key_column])
1430
+ end
1431
+
1432
+ def filter_by_associations_limit_alias_key
1433
+ aliaz = 'a'
1434
+ filter_by_associations_limit_key.map{|c| c.as(Sequel.identifier(aliaz = aliaz.next))}
1435
+ end
1436
+
1437
+ def filter_by_associations_limit_aliases
1438
+ filter_by_associations_limit_alias_key.map(&:alias)
1439
+ end
1440
+
1441
+ def filter_by_associations_limit_key
1442
+ qualify(join_table_alias, self[:left_keys]) + Array(qualify(associated_class.table_name, associated_class.primary_key))
1443
+ end
1444
+
1445
+ def predicate_key_methods
1446
+ self[:left_primary_keys]
1447
+ end
1448
+
1449
+ def reciprocal_association?(assoc_reflect)
1450
+ super && assoc_reflect[:left_keys] == self[:right_keys] &&
1451
+ assoc_reflect[:right_keys] == self[:left_keys] &&
1452
+ assoc_reflect[:join_table] == self[:join_table] &&
1453
+ right_primary_keys == assoc_reflect[:left_primary_key_columns] &&
1454
+ self[:left_primary_key_columns] == assoc_reflect.right_primary_keys
1455
+ end
1456
+
1457
+ def reciprocal_type
1458
+ :many_to_many
1459
+ end
1460
+
1461
+ # Whether the given expression represents a qualified identifier. Used to determine if it is
1462
+ # OK to use directly when joining.
1463
+ def selection_is_qualified?(c)
1464
+ case c
1465
+ when Symbol
1466
+ Sequel.split_symbol(c)[0]
1467
+ when Sequel::SQL::QualifiedIdentifier
1468
+ true
1469
+ when Sequel::SQL::AliasedExpression
1470
+ selection_is_qualified?(c.expression)
1471
+ else
1472
+ false
1473
+ end
1474
+ end
1475
+
1476
+ # Split the join table into source and alias parts.
1477
+ def split_join_table_alias
1478
+ associated_class.dataset.split_alias(self[:join_table])
1479
+ end
1480
+ end
1481
+
1482
+ class OneThroughOneAssociationReflection < ManyToManyAssociationReflection
1483
+ ASSOCIATION_TYPES[:one_through_one] = self
1484
+ include SingularAssociationReflection
1485
+
1486
+ # one_through_one associations should not singularize the association name when
1487
+ # creating the foreign key.
1488
+ def default_right_key
1489
+ :"#{self[:name]}_id"
1490
+ end
1491
+
1492
+ # one_through_one associations have no reciprocals
1493
+ def reciprocal
1494
+ nil
1495
+ end
1496
+ end
1497
+
1498
+ # This module contains methods added to all association datasets
1499
+ module AssociationDatasetMethods
1500
+ # The model object that created the association dataset
1501
+ def model_object
1502
+ @opts[:model_object]
1503
+ end
1504
+
1505
+ # The association reflection related to the association dataset
1506
+ def association_reflection
1507
+ @opts[:association_reflection]
1508
+ end
1509
+
1510
+ private
1511
+
1512
+ def non_sql_option?(key)
1513
+ super || key == :model_object || key == :association_reflection
1514
+ end
1515
+ end
1516
+
1517
+ # Each kind of association adds a number of instance methods to the model class which
1518
+ # are specialized according to the association type and optional parameters
1519
+ # given in the definition. Example:
1520
+ #
1521
+ # class Project < Sequel::Model
1522
+ # many_to_one :portfolio
1523
+ # # or: one_to_one :portfolio
1524
+ # one_to_many :milestones
1525
+ # # or: many_to_many :milestones
1526
+ # end
1527
+ #
1528
+ # The project class now has the following instance methods:
1529
+ # portfolio :: Returns the associated portfolio.
1530
+ # portfolio=(obj) :: Sets the associated portfolio to the object,
1531
+ # but the change is not persisted until you save the record (for many_to_one associations).
1532
+ # portfolio_dataset :: Returns a dataset that would return the associated
1533
+ # portfolio, only useful in fairly specific circumstances.
1534
+ # milestones :: Returns an array of associated milestones
1535
+ # add_milestone(obj) :: Associates the passed milestone with this object.
1536
+ # remove_milestone(obj) :: Removes the association with the passed milestone.
1537
+ # remove_all_milestones :: Removes associations with all associated milestones.
1538
+ # milestones_dataset :: Returns a dataset that would return the associated
1539
+ # milestones, allowing for further filtering/limiting/etc.
1540
+ #
1541
+ # If you want to override the behavior of the add_/remove_/remove_all_/ methods
1542
+ # or the association setter method, use the :adder, :remover, :clearer, and/or :setter
1543
+ # options. These options override the default behavior.
1544
+ #
1545
+ # By default the classes for the associations are inferred from the association
1546
+ # name, so for example the Project#portfolio will return an instance of
1547
+ # Portfolio, and Project#milestones will return an array of Milestone
1548
+ # instances. You can use the :class option to change which class is used.
1549
+ #
1550
+ # Association definitions are also reflected by the class, e.g.:
1551
+ #
1552
+ # Project.associations
1553
+ # => [:portfolio, :milestones]
1554
+ # Project.association_reflection(:portfolio)
1555
+ # => #<Sequel::Model::Associations::ManyToOneAssociationReflection Project.many_to_one :portfolio>
1556
+ #
1557
+ # Associations should not have the same names as any of the columns in the
1558
+ # model's current table they reference. If you are dealing with an existing schema that
1559
+ # has a column named status, you can't name the association status, you'd
1560
+ # have to name it foo_status or something else. If you give an association the same name
1561
+ # as a column, you will probably end up with an association that doesn't work, or a SystemStackError.
1562
+ #
1563
+ # For a more in depth general overview, as well as a reference guide,
1564
+ # see the {Association Basics guide}[rdoc-ref:doc/association_basics.rdoc].
1565
+ # For examples of advanced usage, see the {Advanced Associations guide}[rdoc-ref:doc/advanced_associations.rdoc].
1566
+ module ClassMethods
1567
+ # All association reflections defined for this model (default: {}).
1568
+ attr_reader :association_reflections
1569
+
1570
+ # Hash with column symbol keys and arrays of many_to_one
1571
+ # association symbols that should be cleared when the column
1572
+ # value changes.
1573
+ attr_reader :autoreloading_associations
1574
+
1575
+ # Whether association metadata should be cached in the association reflection. If not cached, it will be computed
1576
+ # on demand. In general you only want to set this to false when using code reloading. When using code reloading,
1577
+ # setting this will make sure that if an associated class is removed or modified, this class will not have a reference to
1578
+ # the previous class.
1579
+ attr_accessor :cache_associations
1580
+
1581
+ # The default options to use for all associations. This hash is merged into the association reflection hash for
1582
+ # all association reflections.
1583
+ attr_accessor :default_association_options
1584
+
1585
+ # The default options to use for all associations of a given type. This is a hash keyed by association type
1586
+ # symbol. If there is a value for the association type symbol key, the resulting hash will be merged into the
1587
+ # association reflection hash for all association reflections of that type.
1588
+ attr_accessor :default_association_type_options
1589
+
1590
+ # The default :eager_limit_strategy option to use for limited or offset associations (default: true, causing Sequel
1591
+ # to use what it considers the most appropriate strategy).
1592
+ attr_accessor :default_eager_limit_strategy
1593
+
1594
+ # Array of all association reflections for this model class
1595
+ def all_association_reflections
1596
+ association_reflections.values
1597
+ end
1598
+
1599
+ # Associates a related model with the current model. The following types are
1600
+ # supported:
1601
+ #
1602
+ # :many_to_one :: Foreign key in current model's table points to
1603
+ # associated model's primary key. Each associated model object can
1604
+ # be associated with more than one current model objects. Each current
1605
+ # model object can be associated with only one associated model object.
1606
+ # :one_to_many :: Foreign key in associated model's table points to this
1607
+ # model's primary key. Each current model object can be associated with
1608
+ # more than one associated model objects. Each associated model object
1609
+ # can be associated with only one current model object.
1610
+ # :one_through_one :: Similar to many_to_many in terms of foreign keys, but only one object
1611
+ # is associated to the current object through the association.
1612
+ # Provides only getter methods, no setter or modification methods.
1613
+ # :one_to_one :: Similar to one_to_many in terms of foreign keys, but
1614
+ # only one object is associated to the current object through the
1615
+ # association. The methods created are similar to many_to_one, except
1616
+ # that the one_to_one setter method saves the passed object.
1617
+ # :many_to_many :: A join table is used that has a foreign key that points
1618
+ # to this model's primary key and a foreign key that points to the
1619
+ # associated model's primary key. Each current model object can be
1620
+ # associated with many associated model objects, and each associated
1621
+ # model object can be associated with many current model objects.
1622
+ #
1623
+ # The following options can be supplied:
1624
+ # === Multiple Types
1625
+ # :adder :: Proc used to define the private _add_* method for doing the database work
1626
+ # to associate the given object to the current object (*_to_many assocations).
1627
+ # Set to nil to not define a add_* method for the association.
1628
+ # :after_add :: Symbol, Proc, or array of both/either specifying a callback to call
1629
+ # after a new item is added to the association.
1630
+ # :after_load :: Symbol, Proc, or array of both/either specifying a callback to call
1631
+ # after the associated record(s) have been retrieved from the database.
1632
+ # :after_remove :: Symbol, Proc, or array of both/either specifying a callback to call
1633
+ # after an item is removed from the association.
1634
+ # :after_set :: Symbol, Proc, or array of both/either specifying a callback to call
1635
+ # after an item is set using the association setter method.
1636
+ # :allow_eager :: If set to false, you cannot load the association eagerly
1637
+ # via eager or eager_graph
1638
+ # :allow_eager_graph :: If set to false, you cannot load the association eagerly via eager_graph.
1639
+ # :allow_filtering_by :: If set to false, you cannot use the association when filtering
1640
+ # :before_add :: Symbol, Proc, or array of both/either specifying a callback to call
1641
+ # before a new item is added to the association.
1642
+ # :before_remove :: Symbol, Proc, or array of both/either specifying a callback to call
1643
+ # before an item is removed from the association.
1644
+ # :before_set :: Symbol, Proc, or array of both/either specifying a callback to call
1645
+ # before an item is set using the association setter method.
1646
+ # :cartesian_product_number :: the number of joins completed by this association that could cause more
1647
+ # than one row for each row in the current table (default: 0 for
1648
+ # many_to_one, one_to_one, and one_through_one associations, 1
1649
+ # for one_to_many and many_to_many associations).
1650
+ # :class :: The associated class or its name as a string or symbol. If not
1651
+ # given, uses the association's name, which is camelized (and
1652
+ # singularized unless the type is :many_to_one, :one_to_one, or one_through_one). If this is specified
1653
+ # as a string or symbol, you must specify the full class name (e.g. "::SomeModule::MyModel").
1654
+ # :class_namespace :: If :class is given as a string or symbol, sets the default namespace in which to look for
1655
+ # the class. <tt>class: 'Foo', class_namespace: 'Bar'</tt> looks for <tt>::Bar::Foo</tt>.)
1656
+ # :clearer :: Proc used to define the private _remove_all_* method for doing the database work
1657
+ # to remove all objects associated to the current object (*_to_many assocations).
1658
+ # Set to nil to not define a remove_all_* method for the association.
1659
+ # :clone :: Merge the current options and block into the options and block used in defining
1660
+ # the given association. Can be used to DRY up a bunch of similar associations that
1661
+ # all share the same options such as :class and :key, while changing the order and block used.
1662
+ # :conditions :: The conditions to use to filter the association, can be any argument passed to where.
1663
+ # This option is not respected when using eager_graph or association_join, unless it
1664
+ # is hash or array of two element arrays. Consider also specifying the :graph_block
1665
+ # option if the value for this option is not a hash or array of two element arrays
1666
+ # and you plan to use this association in eager_graph or association_join.
1667
+ # :dataset :: A proc that is used to define the method to get the base dataset to use (before the other
1668
+ # options are applied). If the proc accepts an argument, it is passed the related
1669
+ # association reflection. It is a best practice to always have the dataset accept an argument
1670
+ # and use the argument to return the appropriate dataset.
1671
+ # :distinct :: Use the DISTINCT clause when selecting associating object, both when
1672
+ # lazy loading and eager loading via .eager (but not when using .eager_graph).
1673
+ # :eager :: The associations to eagerly load via +eager+ when loading the associated object(s).
1674
+ # :eager_block :: If given, use the block instead of the default block when
1675
+ # eagerly loading. To not use a block when eager loading (when one is used normally),
1676
+ # set to nil.
1677
+ # :eager_graph :: The associations to eagerly load via +eager_graph+ when loading the associated object(s).
1678
+ # many_to_many associations with this option cannot be eagerly loaded via +eager+.
1679
+ # :eager_grapher :: A proc to use to implement eager loading via +eager_graph+, overriding the default.
1680
+ # Takes an options hash with at least the entries :self (the receiver of the eager_graph call),
1681
+ # :table_alias (the alias to use for table to graph into the association), and :implicit_qualifier
1682
+ # (the alias that was used for the current table).
1683
+ # Should return a copy of the dataset with the association graphed into it.
1684
+ # :eager_limit_strategy :: Determines the strategy used for enforcing limits and offsets when eager loading
1685
+ # associations via the +eager+ method.
1686
+ # :eager_loader :: A proc to use to implement eager loading, overriding the default. Takes a single hash argument,
1687
+ # with at least the keys: :rows, which is an array of current model instances, :associations,
1688
+ # which is a hash of dependent associations, :self, which is the dataset doing the eager loading,
1689
+ # :eager_block, which is a dynamic callback that should be called with the dataset, and :id_map,
1690
+ # which is a mapping of key values to arrays of current model instances. In the proc, the
1691
+ # associated records should be queried from the database and the associations cache for each
1692
+ # record should be populated.
1693
+ # :eager_loader_key :: A symbol for the key column to use to populate the key_hash
1694
+ # for the eager loader. Can be set to nil to not populate the key_hash.
1695
+ # :extend :: A module or array of modules to extend the dataset with.
1696
+ # :filter_limit_strategy :: Determines the strategy used for enforcing limits and offsets when filtering by
1697
+ # limited associations. Possible options are :window_function, :distinct_on, or
1698
+ # :correlated_subquery depending on association type and database type.
1699
+ # :graph_alias_base :: The base name to use for the table alias when eager graphing. Defaults to the name
1700
+ # of the association. If the alias name has already been used in the query, Sequel will create
1701
+ # a unique alias by appending a numeric suffix (e.g. alias_0, alias_1, ...) until the alias is
1702
+ # unique.
1703
+ # :graph_block :: The block to pass to join_table when eagerly loading
1704
+ # the association via +eager_graph+.
1705
+ # :graph_conditions :: The additional conditions to use on the SQL join when eagerly loading
1706
+ # the association via +eager_graph+. Should be a hash or an array of two element arrays. If not
1707
+ # specified, the :conditions option is used if it is a hash or array of two element arrays.
1708
+ # :graph_join_type :: The type of SQL join to use when eagerly loading the association via
1709
+ # eager_graph. Defaults to :left_outer.
1710
+ # :graph_only_conditions :: The conditions to use on the SQL join when eagerly loading
1711
+ # the association via +eager_graph+, instead of the default conditions specified by the
1712
+ # foreign/primary keys. This option causes the :graph_conditions option to be ignored.
1713
+ # :graph_order :: the order to use when using eager_graph, instead of the default order. This should be used
1714
+ # in the case where :order contains an identifier qualified by the table's name, which may not match
1715
+ # the alias used when eager graphing. By setting this to the unqualified identifier, it will be
1716
+ # automatically qualified when using eager_graph.
1717
+ # :graph_select :: A column or array of columns to select from the associated table
1718
+ # when eagerly loading the association via +eager_graph+. Defaults to all
1719
+ # columns in the associated table.
1720
+ # :instance_specific :: Marks the association as instance specific. Should be used if the association block
1721
+ # uses instance specific state, or transient state (accessing current date/time, etc.).
1722
+ # :limit :: Limit the number of records to the provided value. Use
1723
+ # an array with two elements for the value to specify a
1724
+ # limit (first element) and an offset (second element).
1725
+ # :methods_module :: The module that methods the association creates will be placed into. Defaults
1726
+ # to the module containing the model's columns.
1727
+ # :no_association_method :: Do not add a method for the association. This can save memory if the association
1728
+ # method is never used.
1729
+ # :no_dataset_method :: Do not add a method for the association dataset. This can save memory if the dataset
1730
+ # method is never used.
1731
+ # :order :: the column(s) by which to order the association dataset. Can be a
1732
+ # singular column symbol or an array of column symbols.
1733
+ # :order_eager_graph :: Whether to add the association's order to the graphed dataset's order when graphing
1734
+ # via +eager_graph+. Defaults to true, so set to false to disable.
1735
+ # :read_only :: Do not add a setter method (for many_to_one or one_to_one associations),
1736
+ # or add_/remove_/remove_all_ methods (for one_to_many and many_to_many associations).
1737
+ # :reciprocal :: the symbol name of the reciprocal association,
1738
+ # if it exists. By default, Sequel will try to determine it by looking at the
1739
+ # associated model's assocations for a association that matches
1740
+ # the current association's key(s). Set to nil to not use a reciprocal.
1741
+ # :remover :: Proc used to define the private _remove_* method for doing the database work
1742
+ # to remove the association between the given object and the current object (*_to_many assocations).
1743
+ # Set to nil to not define a remove_* method for the association.
1744
+ # :select :: the columns to select. Defaults to the associated class's table_name.* in an association
1745
+ # that uses joins, which means it doesn't include the attributes from the
1746
+ # join table. If you want to include the join table attributes, you can
1747
+ # use this option, but beware that the join table attributes can clash with
1748
+ # attributes from the model table, so you should alias any attributes that have
1749
+ # the same name in both the join table and the associated table.
1750
+ # :setter :: Proc used to define the private _*= method for doing the work to setup the assocation
1751
+ # between the given object and the current object (*_to_one associations).
1752
+ # Set to nil to not define a setter method for the association.
1753
+ # :subqueries_per_union :: The number of subqueries to use in each UNION query, for eager
1754
+ # loading limited associations using the default :union strategy.
1755
+ # :validate :: Set to false to not validate when implicitly saving any associated object.
1756
+ # === :many_to_one
1757
+ # :key :: foreign key in current model's table that references
1758
+ # associated model's primary key, as a symbol. Defaults to :"#{name}_id". Can use an
1759
+ # array of symbols for a composite key association.
1760
+ # :key_column :: Similar to, and usually identical to, :key, but :key refers to the model method
1761
+ # to call, where :key_column refers to the underlying column. Should only be
1762
+ # used if the model method differs from the foreign key column, in conjunction
1763
+ # with defining a model alias method for the key column.
1764
+ # :primary_key :: column in the associated table that :key option references, as a symbol.
1765
+ # Defaults to the primary key of the associated table. Can use an
1766
+ # array of symbols for a composite key association.
1767
+ # :primary_key_method :: the method symbol or array of method symbols to call on the associated
1768
+ # object to get the foreign key values. Defaults to :primary_key option.
1769
+ # :qualify :: Whether to use qualified primary keys when loading the association. The default
1770
+ # is true, so you must set to false to not qualify. Qualification rarely causes
1771
+ # problems, but it's necessary to disable in some cases, such as when you are doing
1772
+ # a JOIN USING operation on the column on Oracle.
1773
+ # === :one_to_many and :one_to_one
1774
+ # :key :: foreign key in associated model's table that references
1775
+ # current model's primary key, as a symbol. Defaults to
1776
+ # :"#{self.name.underscore}_id". Can use an
1777
+ # array of symbols for a composite key association.
1778
+ # :key_method :: the method symbol or array of method symbols to call on the associated
1779
+ # object to get the foreign key values. Defaults to :key option.
1780
+ # :primary_key :: column in the current table that :key option references, as a symbol.
1781
+ # Defaults to primary key of the current table. Can use an
1782
+ # array of symbols for a composite key association.
1783
+ # :primary_key_column :: Similar to, and usually identical to, :primary_key, but :primary_key refers
1784
+ # to the model method call, where :primary_key_column refers to the underlying column.
1785
+ # Should only be used if the model method differs from the primary key column, in
1786
+ # conjunction with defining a model alias method for the primary key column.
1787
+ # :raise_on_save_failure :: Do not raise exceptions for hook or validation failures when saving associated
1788
+ # objects in the add/remove methods (return nil instead) [one_to_many only].
1789
+ # === :many_to_many and :one_through_one
1790
+ # :graph_join_table_block :: The block to pass to +join_table+ for
1791
+ # the join table when eagerly loading the association via +eager_graph+.
1792
+ # :graph_join_table_conditions :: The additional conditions to use on the SQL join for
1793
+ # the join table when eagerly loading the association via +eager_graph+.
1794
+ # Should be a hash or an array of two element arrays.
1795
+ # :graph_join_table_join_type :: The type of SQL join to use for the join table when eagerly
1796
+ # loading the association via +eager_graph+. Defaults to the
1797
+ # :graph_join_type option or :left_outer.
1798
+ # :graph_join_table_only_conditions :: The conditions to use on the SQL join for the join
1799
+ # table when eagerly loading the association via +eager_graph+,
1800
+ # instead of the default conditions specified by the
1801
+ # foreign/primary keys. This option causes the
1802
+ # :graph_join_table_conditions option to be ignored.
1803
+ # :join_table :: name of table that includes the foreign keys to both
1804
+ # the current model and the associated model, as a symbol. Defaults to the name
1805
+ # of current model and name of associated model, pluralized,
1806
+ # underscored, sorted, and joined with '_'.
1807
+ # :join_table_block :: proc that can be used to modify the dataset used in the add/remove/remove_all
1808
+ # methods. Should accept a dataset argument and return a modified dataset if present.
1809
+ # :join_table_db :: When retrieving records when using lazy loading or eager loading via +eager+, instead of
1810
+ # a join between to the join table and the associated table, use a separate query for the
1811
+ # join table using the given Database object.
1812
+ # :left_key :: foreign key in join table that points to current model's
1813
+ # primary key, as a symbol. Defaults to :"#{self.name.underscore}_id".
1814
+ # Can use an array of symbols for a composite key association.
1815
+ # :left_primary_key :: column in current table that :left_key points to, as a symbol.
1816
+ # Defaults to primary key of current table. Can use an
1817
+ # array of symbols for a composite key association.
1818
+ # :left_primary_key_column :: Similar to, and usually identical to, :left_primary_key, but :left_primary_key refers to
1819
+ # the model method to call, where :left_primary_key_column refers to the underlying column. Should only
1820
+ # be used if the model method differs from the left primary key column, in conjunction
1821
+ # with defining a model alias method for the left primary key column.
1822
+ # :right_key :: foreign key in join table that points to associated
1823
+ # model's primary key, as a symbol. Defaults to :"#{name.to_s.singularize}_id".
1824
+ # Can use an array of symbols for a composite key association.
1825
+ # :right_primary_key :: column in associated table that :right_key points to, as a symbol.
1826
+ # Defaults to primary key of the associated table. Can use an
1827
+ # array of symbols for a composite key association.
1828
+ # :right_primary_key_method :: the method symbol or array of method symbols to call on the associated
1829
+ # object to get the foreign key values for the join table.
1830
+ # Defaults to :right_primary_key option.
1831
+ # :uniq :: Adds a after_load callback that makes the array of objects unique.
1832
+ def associate(type, name, opts = OPTS, &block)
1833
+ raise(Error, 'invalid association type') unless assoc_class = Sequel.synchronize{ASSOCIATION_TYPES[type]}
1834
+ raise(Error, 'Model.associate name argument must be a symbol') unless name.is_a?(Symbol)
1835
+
1836
+ # dup early so we don't modify opts
1837
+ orig_opts = opts.dup
1838
+
1839
+ if opts[:clone]
1840
+ cloned_assoc = association_reflection(opts[:clone])
1841
+ remove_class_name = orig_opts[:class] && !orig_opts[:class_name]
1842
+ orig_opts = cloned_assoc[:orig_opts].merge(orig_opts)
1843
+ orig_opts.delete(:class_name) if remove_class_name
1844
+ end
1845
+
1846
+ opts = Hash[default_association_options]
1847
+ if type_options = default_association_type_options[type]
1848
+ opts.merge!(type_options)
1849
+ end
1850
+ opts.merge!(orig_opts)
1851
+ opts.merge!(:type => type, :name => name, :cache=>({} if cache_associations), :model => self)
1852
+
1853
+ opts[:block] = block if block
1854
+ opts[:instance_specific] = true if orig_opts[:dataset]
1855
+ if !opts.has_key?(:instance_specific) && (block || orig_opts[:block])
1856
+ # It's possible the association is instance specific, in that it depends on
1857
+ # values other than the foreign key value. This needs to be checked for
1858
+ # in certain places to disable optimizations.
1859
+ opts[:instance_specific] = _association_instance_specific_default(name)
1860
+ end
1861
+ if (orig_opts[:instance_specific] || orig_opts[:dataset]) && !opts.has_key?(:allow_eager) && !opts[:eager_loader]
1862
+ # For associations explicitly marked as instance specific, or that use the
1863
+ # :dataset option, where :allow_eager is not set, and no :eager_loader is
1864
+ # provided, disallow eager loading. In these cases, eager loading is
1865
+ # unlikely to work. This is not done for implicit setting of :instance_specific,
1866
+ # because implicit use is done by default for all associations with blocks,
1867
+ # and the vast majority of associations with blocks use the block for filtering
1868
+ # in a manner compatible with eager loading.
1869
+ opts[:allow_eager] = false
1870
+ end
1871
+ opts = assoc_class.new.merge!(opts)
1872
+
1873
+ if opts[:clone] && !opts.cloneable?(cloned_assoc)
1874
+ raise(Error, "cannot clone an association to an association of different type (association #{name} with type #{type} cloning #{opts[:clone]} with type #{cloned_assoc[:type]})")
1875
+ end
1876
+
1877
+ opts[:use_placeholder_loader] = !opts[:instance_specific] && !opts[:eager_graph]
1878
+ opts[:eager_block] = opts[:block] unless opts.include?(:eager_block)
1879
+ opts[:graph_join_type] ||= :left_outer
1880
+ opts[:order_eager_graph] = true unless opts.include?(:order_eager_graph)
1881
+ conds = opts[:conditions]
1882
+ opts[:graph_alias_base] ||= name
1883
+ opts[:graph_conditions] = conds if !opts.include?(:graph_conditions) and Sequel.condition_specifier?(conds)
1884
+ opts[:graph_conditions] = opts.fetch(:graph_conditions, []).to_a
1885
+ opts[:graph_select] = Array(opts[:graph_select]) if opts[:graph_select]
1886
+ [:before_add, :before_remove, :after_add, :after_remove, :after_load, :before_set, :after_set].each do |cb_type|
1887
+ opts[cb_type] = Array(opts[cb_type]) if opts[cb_type]
1888
+ end
1889
+
1890
+ if opts[:extend]
1891
+ opts[:extend] = Array(opts[:extend])
1892
+ opts[:reverse_extend] = opts[:extend].reverse
1893
+ end
1894
+
1895
+ late_binding_class_option(opts, opts.returns_array? ? singularize(name) : name)
1896
+
1897
+ # Remove :class entry if it exists and is nil, to work with cached_fetch
1898
+ opts.delete(:class) unless opts[:class]
1899
+
1900
+ def_association(opts)
1901
+
1902
+ orig_opts.delete(:clone)
1903
+ opts[:orig_class] = orig_opts[:class] || orig_opts[:class_name]
1904
+ orig_opts.merge!(:class_name=>opts[:class_name], :class=>opts[:class], :block=>opts[:block])
1905
+ opts[:orig_opts] = orig_opts
1906
+ # don't add to association_reflections until we are sure there are no errors
1907
+ association_reflections[name] = opts
1908
+ end
1909
+
1910
+ # The association reflection hash for the association of the given name.
1911
+ def association_reflection(name)
1912
+ association_reflections[name]
1913
+ end
1914
+
1915
+ # Array of association name symbols
1916
+ def associations
1917
+ association_reflections.keys
1918
+ end
1919
+
1920
+ # Eager load the association with the given eager loader options.
1921
+ def eager_load_results(opts, eo, &block)
1922
+ opts.eager_load_results(eo, &block)
1923
+ end
1924
+
1925
+ # Freeze association related metadata when freezing model class.
1926
+ def freeze
1927
+ @association_reflections.freeze.each_value(&:freeze)
1928
+ @autoreloading_associations.freeze.each_value(&:freeze)
1929
+ @default_association_options.freeze
1930
+ @default_association_type_options.freeze
1931
+ @default_association_type_options.each_value(&:freeze)
1932
+
1933
+ super
1934
+ end
1935
+
1936
+ # Finalize all associations such that values that are looked up
1937
+ # dynamically in associated classes are set statically.
1938
+ # As this modifies the associations, it must be done before
1939
+ # calling freeze.
1940
+ def finalize_associations
1941
+ @association_reflections.each_value(&:finalize)
1942
+ end
1943
+
1944
+ # Shortcut for adding a many_to_many association, see #associate
1945
+ def many_to_many(name, opts=OPTS, &block)
1946
+ associate(:many_to_many, name, opts, &block)
1947
+ end
1948
+
1949
+ # Shortcut for adding a many_to_one association, see #associate
1950
+ def many_to_one(name, opts=OPTS, &block)
1951
+ associate(:many_to_one, name, opts, &block)
1952
+ end
1953
+
1954
+ # Shortcut for adding a one_through_one association, see #associate
1955
+ def one_through_one(name, opts=OPTS, &block)
1956
+ associate(:one_through_one, name, opts, &block)
1957
+ end
1958
+
1959
+ # Shortcut for adding a one_to_many association, see #associate
1960
+ def one_to_many(name, opts=OPTS, &block)
1961
+ associate(:one_to_many, name, opts, &block)
1962
+ end
1963
+
1964
+ # Shortcut for adding a one_to_one association, see #associate
1965
+ def one_to_one(name, opts=OPTS, &block)
1966
+ associate(:one_to_one, name, opts, &block)
1967
+ end
1968
+
1969
+ Plugins.inherited_instance_variables(self, :@association_reflections=>:dup, :@autoreloading_associations=>:hash_dup, :@default_association_options=>:dup, :@default_association_type_options=>:hash_dup, :@cache_associations=>nil, :@default_eager_limit_strategy=>nil)
1970
+ Plugins.def_dataset_methods(self, [:eager, :eager_graph, :eager_graph_with_options, :association_join, :association_full_join, :association_inner_join, :association_left_join, :association_right_join])
1971
+
1972
+ private
1973
+
1974
+ # The default value for the instance_specific option, if the association
1975
+ # could be instance specific and the :instance_specific option is not specified.
1976
+ def _association_instance_specific_default(_)
1977
+ true
1978
+ end
1979
+
1980
+ # The module to use for the association's methods. Defaults to
1981
+ # the overridable_methods_module.
1982
+ def association_module(opts=OPTS)
1983
+ opts.fetch(:methods_module, overridable_methods_module)
1984
+ end
1985
+
1986
+ # Add a method to the module included in the class, so the method
1987
+ # can be easily overridden in the class itself while allowing for
1988
+ # super to be called.
1989
+ def association_module_def(name, opts=OPTS, &block)
1990
+ mod = association_module(opts)
1991
+ mod.send(:define_method, name, &block)
1992
+ mod.send(:alias_method, name, name)
1993
+ end
1994
+
1995
+ # Add a method to the module included in the class, so the method
1996
+ # can be easily overridden in the class itself while allowing for
1997
+ # super to be called. This method allows passing keywords through
1998
+ # the defined methods.
1999
+ def association_module_delegate_def(name, opts, &block)
2000
+ mod = association_module(opts)
2001
+ mod.send(:define_method, name, &block)
2002
+ # :nocov:
2003
+ mod.send(:ruby2_keywords, name) if mod.respond_to?(:ruby2_keywords, true)
2004
+ # :nocov:
2005
+ mod.send(:alias_method, name, name)
2006
+ end
2007
+
2008
+ # Add a private method to the module included in the class.
2009
+ def association_module_private_def(name, opts=OPTS, &block)
2010
+ association_module_def(name, opts, &block)
2011
+ association_module(opts).send(:private, name)
2012
+ end
2013
+
2014
+ # Delegate to the type-specific association method to setup the
2015
+ # association, and define the association instance methods.
2016
+ def def_association(opts)
2017
+ send(:"def_#{opts[:type]}", opts)
2018
+ def_association_instance_methods(opts)
2019
+ end
2020
+
2021
+ # Adds the association method to the association methods module.
2022
+ def def_association_method(opts)
2023
+ association_module_def(opts.association_method, opts) do |dynamic_opts=OPTS, &block|
2024
+ load_associated_objects(opts, dynamic_opts, &block)
2025
+ end
2026
+ end
2027
+
2028
+ # Define all of the association instance methods for this association.
2029
+ def def_association_instance_methods(opts)
2030
+ # Always set the method names in the association reflection, even if they
2031
+ # are not used, for backwards compatibility.
2032
+ opts[:dataset_method] = :"#{opts[:name]}_dataset"
2033
+ if opts.returns_array?
2034
+ sname = singularize(opts[:name])
2035
+ opts[:_add_method] = :"_add_#{sname}"
2036
+ opts[:add_method] = :"add_#{sname}"
2037
+ opts[:_remove_method] = :"_remove_#{sname}"
2038
+ opts[:remove_method] = :"remove_#{sname}"
2039
+ opts[:_remove_all_method] = :"_remove_all_#{opts[:name]}"
2040
+ opts[:remove_all_method] = :"remove_all_#{opts[:name]}"
2041
+ else
2042
+ opts[:_setter_method] = :"_#{opts[:name]}="
2043
+ opts[:setter_method] = :"#{opts[:name]}="
2044
+ end
2045
+
2046
+ association_module_def(opts.dataset_method, opts){_dataset(opts)} unless opts[:no_dataset_method]
2047
+ if opts[:block]
2048
+ opts[:block_method] = Plugins.def_sequel_method(association_module(opts), "#{opts[:name]}_block", 1, &opts[:block])
2049
+ end
2050
+ opts[:dataset_opt_arity] = opts[:dataset].arity == 0 ? 0 : 1
2051
+ opts[:dataset_opt_method] = Plugins.def_sequel_method(association_module(opts), "#{opts[:name]}_dataset_opt", opts[:dataset_opt_arity], &opts[:dataset])
2052
+ def_association_method(opts) unless opts[:no_association_method]
2053
+
2054
+ return if opts[:read_only]
2055
+
2056
+ if opts[:setter] && opts[:_setter]
2057
+ # This is backwards due to backwards compatibility
2058
+ association_module_private_def(opts[:_setter_method], opts, &opts[:setter])
2059
+ association_module_def(opts[:setter_method], opts, &opts[:_setter])
2060
+ end
2061
+
2062
+ if adder = opts[:adder]
2063
+ association_module_private_def(opts[:_add_method], opts, &adder)
2064
+ association_module_delegate_def(opts[:add_method], opts){|o,*args| add_associated_object(opts, o, *args)}
2065
+ end
2066
+
2067
+ if remover = opts[:remover]
2068
+ association_module_private_def(opts[:_remove_method], opts, &remover)
2069
+ association_module_delegate_def(opts[:remove_method], opts){|o,*args| remove_associated_object(opts, o, *args)}
2070
+ end
2071
+
2072
+ if clearer = opts[:clearer]
2073
+ association_module_private_def(opts[:_remove_all_method], opts, &clearer)
2074
+ association_module_delegate_def(opts[:remove_all_method], opts){|*args| remove_all_associated_objects(opts, *args)}
2075
+ end
2076
+ end
2077
+
2078
+ # Configures many_to_many and one_through_one association reflection and adds the related association methods
2079
+ def def_many_to_many(opts)
2080
+ one_through_one = opts[:type] == :one_through_one
2081
+ left = (opts[:left_key] ||= opts.default_left_key)
2082
+ lcks = opts[:left_keys] = Array(left)
2083
+ right = (opts[:right_key] ||= opts.default_right_key)
2084
+ rcks = opts[:right_keys] = Array(right)
2085
+ left_pk = (opts[:left_primary_key] ||= self.primary_key)
2086
+ opts[:eager_loader_key] = left_pk unless opts.has_key?(:eager_loader_key)
2087
+ lcpks = opts[:left_primary_keys] = Array(left_pk)
2088
+ lpkc = opts[:left_primary_key_column] ||= left_pk
2089
+ lpkcs = opts[:left_primary_key_columns] ||= Array(lpkc)
2090
+ raise(Error, "mismatched number of left keys: #{lcks.inspect} vs #{lcpks.inspect}") unless lcks.length == lcpks.length
2091
+ if opts[:right_primary_key]
2092
+ rcpks = Array(opts[:right_primary_key])
2093
+ raise(Error, "mismatched number of right keys: #{rcks.inspect} vs #{rcpks.inspect}") unless rcks.length == rcpks.length
2094
+ end
2095
+ opts[:uses_left_composite_keys] = lcks.length > 1
2096
+ uses_rcks = opts[:uses_right_composite_keys] = rcks.length > 1
2097
+ opts[:cartesian_product_number] ||= one_through_one ? 0 : 1
2098
+ join_table = (opts[:join_table] ||= opts.default_join_table)
2099
+ opts[:left_key_alias] ||= opts.default_associated_key_alias
2100
+ opts[:graph_join_table_join_type] ||= opts[:graph_join_type]
2101
+ if opts[:uniq]
2102
+ opts[:after_load] ||= []
2103
+ opts[:after_load].unshift(:array_uniq!)
2104
+ end
2105
+ if join_table_db = opts[:join_table_db]
2106
+ opts[:use_placeholder_loader] = false
2107
+ opts[:allow_eager_graph] = false
2108
+ opts[:allow_filtering_by] = false
2109
+ opts[:eager_limit_strategy] = nil
2110
+ join_table_ds = join_table_db.from(join_table)
2111
+ opts[:dataset] ||= proc do |r|
2112
+ vals = join_table_ds.where(lcks.zip(lcpks.map{|k| get_column_value(k)})).select_map(right)
2113
+ ds = r.associated_dataset.where(opts.right_primary_key => vals)
2114
+ if uses_rcks
2115
+ vals.delete_if{|v| v.any?(&:nil?)}
2116
+ else
2117
+ vals.delete(nil)
2118
+ end
2119
+ ds = ds.clone(:no_results=>true) if vals.empty?
2120
+ ds
2121
+ end
2122
+ opts[:eager_loader] ||= proc do |eo|
2123
+ h = eo[:id_map]
2124
+ assign_singular = opts.assign_singular?
2125
+ rpk = opts.right_primary_key
2126
+ name = opts[:name]
2127
+
2128
+ join_map = join_table_ds.where(left=>h.keys).select_hash_groups(right, left)
2129
+
2130
+ if uses_rcks
2131
+ join_map.delete_if{|v,| v.any?(&:nil?)}
2132
+ else
2133
+ join_map.delete(nil)
2134
+ end
2135
+
2136
+ eo = Hash[eo]
2137
+
2138
+ if join_map.empty?
2139
+ eo[:no_results] = true
2140
+ else
2141
+ join_map.each_value do |vs|
2142
+ vs.replace(vs.flat_map{|v| h[v]})
2143
+ vs.uniq!
2144
+ end
2145
+
2146
+ eo[:loader] = false
2147
+ eo[:right_keys] = join_map.keys
2148
+ end
2149
+
2150
+ opts[:model].eager_load_results(opts, eo) do |assoc_record|
2151
+ rpkv = if uses_rcks
2152
+ assoc_record.values.values_at(*rpk)
2153
+ else
2154
+ assoc_record.values[rpk]
2155
+ end
2156
+
2157
+ objects = join_map[rpkv]
2158
+
2159
+ if assign_singular
2160
+ objects.each do |object|
2161
+ object.associations[name] ||= assoc_record
2162
+ end
2163
+ else
2164
+ objects.each do |object|
2165
+ object.associations[name].push(assoc_record)
2166
+ end
2167
+ end
2168
+ end
2169
+ end
2170
+ else
2171
+ opts[:dataset] ||= opts.association_dataset_proc
2172
+ opts[:eager_loader] ||= opts.method(:default_eager_loader)
2173
+ end
2174
+
2175
+ join_type = opts[:graph_join_type]
2176
+ select = opts[:graph_select]
2177
+ use_only_conditions = opts.include?(:graph_only_conditions)
2178
+ only_conditions = opts[:graph_only_conditions]
2179
+ conditions = opts[:graph_conditions]
2180
+ graph_block = opts[:graph_block]
2181
+ graph_jt_conds = opts[:graph_join_table_conditions] = opts.fetch(:graph_join_table_conditions, []).to_a
2182
+ use_jt_only_conditions = opts.include?(:graph_join_table_only_conditions)
2183
+ jt_only_conditions = opts[:graph_join_table_only_conditions]
2184
+ jt_join_type = opts[:graph_join_table_join_type]
2185
+ jt_graph_block = opts[:graph_join_table_block]
2186
+ opts[:eager_grapher] ||= proc do |eo|
2187
+ ds = eo[:self]
2188
+ egls = eo[:limit_strategy]
2189
+ if egls && egls != :ruby
2190
+ associated_key_array = opts.associated_key_array
2191
+ orig_egds = egds = eager_graph_dataset(opts, eo)
2192
+ egds = egds.
2193
+ inner_join(join_table, rcks.zip(opts.right_primary_keys) + graph_jt_conds, :qualify=>:deep).
2194
+ select_all(egds.first_source).
2195
+ select_append(*associated_key_array)
2196
+ egds = opts.apply_eager_graph_limit_strategy(egls, egds)
2197
+ ds.graph(egds, associated_key_array.map(&:alias).zip(lpkcs) + conditions, :qualify=>:deep, :table_alias=>eo[:table_alias], :implicit_qualifier=>eo[:implicit_qualifier], :join_type=>eo[:join_type]||join_type, :from_self_alias=>eo[:from_self_alias], :join_only=>eo[:join_only], :select=>select||orig_egds.columns, &graph_block)
2198
+ else
2199
+ ds = ds.graph(join_table, use_jt_only_conditions ? jt_only_conditions : lcks.zip(lpkcs) + graph_jt_conds, :select=>false, :table_alias=>ds.unused_table_alias(join_table, [eo[:table_alias]]), :join_type=>eo[:join_type]||jt_join_type, :join_only=>eo[:join_only], :implicit_qualifier=>eo[:implicit_qualifier], :qualify=>:deep, :from_self_alias=>eo[:from_self_alias], &jt_graph_block)
2200
+ ds.graph(eager_graph_dataset(opts, eo), use_only_conditions ? only_conditions : opts.right_primary_keys.zip(rcks) + conditions, :select=>select, :table_alias=>eo[:table_alias], :qualify=>:deep, :join_type=>eo[:join_type]||join_type, :join_only=>eo[:join_only], &graph_block)
2201
+ end
2202
+ end
2203
+
2204
+ return if opts[:read_only]
2205
+
2206
+ if one_through_one
2207
+ unless opts.has_key?(:setter)
2208
+ opts[:setter] = proc do |o|
2209
+ h = {}
2210
+ lh = lcks.zip(lcpks.map{|k| get_column_value(k)})
2211
+ jtds = _join_table_dataset(opts).where(lh)
2212
+
2213
+ checked_transaction do
2214
+ current = jtds.first
2215
+
2216
+ if o
2217
+ new_values = []
2218
+ rcks.zip(opts.right_primary_key_methods).each{|k, pk| new_values << (h[k] = o.get_column_value(pk))}
2219
+ end
2220
+
2221
+ if current
2222
+ current_values = rcks.map{|k| current[k]}
2223
+ jtds = jtds.where(rcks.zip(current_values))
2224
+ if o
2225
+ if current_values != new_values
2226
+ jtds.update(h)
2227
+ end
2228
+ else
2229
+ jtds.delete
2230
+ end
2231
+ elsif o
2232
+ lh.each{|k,v| h[k] = v}
2233
+ jtds.insert(h)
2234
+ end
2235
+ end
2236
+ end
2237
+ end
2238
+ if opts.fetch(:setter, true)
2239
+ opts[:_setter] = proc{|o| set_one_through_one_associated_object(opts, o)}
2240
+ end
2241
+ else
2242
+ unless opts.has_key?(:adder)
2243
+ opts[:adder] = proc do |o|
2244
+ h = {}
2245
+ lcks.zip(lcpks).each{|k, pk| h[k] = get_column_value(pk)}
2246
+ rcks.zip(opts.right_primary_key_methods).each{|k, pk| h[k] = o.get_column_value(pk)}
2247
+ _join_table_dataset(opts).insert(h)
2248
+ end
2249
+ end
2250
+
2251
+ unless opts.has_key?(:remover)
2252
+ opts[:remover] = proc do |o|
2253
+ _join_table_dataset(opts).where(lcks.zip(lcpks.map{|k| get_column_value(k)}) + rcks.zip(opts.right_primary_key_methods.map{|k| o.get_column_value(k)})).delete
2254
+ end
2255
+ end
2256
+
2257
+ unless opts.has_key?(:clearer)
2258
+ opts[:clearer] = proc do
2259
+ _join_table_dataset(opts).where(lcks.zip(lcpks.map{|k| get_column_value(k)})).delete
2260
+ end
2261
+ end
2262
+ end
2263
+ end
2264
+
2265
+ # Configures many_to_one association reflection and adds the related association methods
2266
+ def def_many_to_one(opts)
2267
+ name = opts[:name]
2268
+ opts[:key] = opts.default_key unless opts.has_key?(:key)
2269
+ key = opts[:key]
2270
+ opts[:eager_loader_key] = key unless opts.has_key?(:eager_loader_key)
2271
+ cks = opts[:graph_keys] = opts[:keys] = Array(key)
2272
+ opts[:key_column] ||= key
2273
+ opts[:graph_keys] = opts[:key_columns] = Array(opts[:key_column])
2274
+ opts[:qualified_key] = opts.qualify_cur(key)
2275
+ if opts[:primary_key]
2276
+ cpks = Array(opts[:primary_key])
2277
+ raise(Error, "mismatched number of keys: #{cks.inspect} vs #{cpks.inspect}") unless cks.length == cpks.length
2278
+ end
2279
+ uses_cks = opts[:uses_composite_keys] = cks.length > 1
2280
+ opts[:cartesian_product_number] ||= 0
2281
+
2282
+ if !opts.has_key?(:many_to_one_pk_lookup) &&
2283
+ (opts[:dataset] || opts[:conditions] || opts[:block] || opts[:select] ||
2284
+ (opts.has_key?(:key) && opts[:key] == nil))
2285
+ opts[:many_to_one_pk_lookup] = false
2286
+ end
2287
+ auto_assocs = @autoreloading_associations
2288
+ cks.each do |k|
2289
+ (auto_assocs[k] ||= []) << name
2290
+ end
2291
+
2292
+ opts[:dataset] ||= opts.association_dataset_proc
2293
+ opts[:eager_loader] ||= proc do |eo|
2294
+ h = eo[:id_map]
2295
+ pk_meths = opts.primary_key_methods
2296
+
2297
+ eager_load_results(opts, eo) do |assoc_record|
2298
+ hash_key = uses_cks ? pk_meths.map{|k| assoc_record.get_column_value(k)} : assoc_record.get_column_value(opts.primary_key_method)
2299
+ h[hash_key].each{|object| object.associations[name] = assoc_record}
2300
+ end
2301
+ end
2302
+
2303
+ join_type = opts[:graph_join_type]
2304
+ select = opts[:graph_select]
2305
+ use_only_conditions = opts.include?(:graph_only_conditions)
2306
+ only_conditions = opts[:graph_only_conditions]
2307
+ conditions = opts[:graph_conditions]
2308
+ graph_block = opts[:graph_block]
2309
+ graph_cks = opts[:graph_keys]
2310
+ opts[:eager_grapher] ||= proc do |eo|
2311
+ ds = eo[:self]
2312
+ ds.graph(eager_graph_dataset(opts, eo), use_only_conditions ? only_conditions : opts.primary_keys.zip(graph_cks) + conditions, eo.merge(:select=>select, :join_type=>eo[:join_type]||join_type, :qualify=>:deep), &graph_block)
2313
+ end
2314
+
2315
+ return if opts[:read_only]
2316
+
2317
+ unless opts.has_key?(:setter)
2318
+ opts[:setter] = proc{|o| cks.zip(opts.primary_key_methods).each{|k, pk| set_column_value(:"#{k}=", (o.get_column_value(pk) if o))}}
2319
+ end
2320
+ if opts.fetch(:setter, true)
2321
+ opts[:_setter] = proc{|o| set_associated_object(opts, o)}
2322
+ end
2323
+ end
2324
+
2325
+ # Configures one_to_many and one_to_one association reflections and adds the related association methods
2326
+ def def_one_to_many(opts)
2327
+ one_to_one = opts[:type] == :one_to_one
2328
+ name = opts[:name]
2329
+ key = (opts[:key] ||= opts.default_key)
2330
+ km = opts[:key_method] ||= opts[:key]
2331
+ cks = opts[:keys] = Array(key)
2332
+ opts[:key_methods] = Array(opts[:key_method])
2333
+ primary_key = (opts[:primary_key] ||= self.primary_key)
2334
+ opts[:eager_loader_key] = primary_key unless opts.has_key?(:eager_loader_key)
2335
+ cpks = opts[:primary_keys] = Array(primary_key)
2336
+ pkc = opts[:primary_key_column] ||= primary_key
2337
+ pkcs = opts[:primary_key_columns] ||= Array(pkc)
2338
+ raise(Error, "mismatched number of keys: #{cks.inspect} vs #{cpks.inspect}") unless cks.length == cpks.length
2339
+ uses_cks = opts[:uses_composite_keys] = cks.length > 1
2340
+ opts[:dataset] ||= opts.association_dataset_proc
2341
+ opts[:eager_loader] ||= proc do |eo|
2342
+ h = eo[:id_map]
2343
+ reciprocal = opts.reciprocal
2344
+ assign_singular = opts.assign_singular?
2345
+ delete_rn = opts.delete_row_number_column
2346
+
2347
+ eager_load_results(opts, eo) do |assoc_record|
2348
+ assoc_record.values.delete(delete_rn) if delete_rn
2349
+ hash_key = uses_cks ? km.map{|k| assoc_record.get_column_value(k)} : assoc_record.get_column_value(km)
2350
+ objects = h[hash_key]
2351
+ if assign_singular
2352
+ objects.each do |object|
2353
+ unless object.associations[name]
2354
+ object.associations[name] = assoc_record
2355
+ assoc_record.associations[reciprocal] = object if reciprocal
2356
+ end
2357
+ end
2358
+ else
2359
+ objects.each do |object|
2360
+ object.associations[name].push(assoc_record)
2361
+ assoc_record.associations[reciprocal] = object if reciprocal
2362
+ end
2363
+ end
2364
+ end
2365
+ end
2366
+
2367
+ join_type = opts[:graph_join_type]
2368
+ select = opts[:graph_select]
2369
+ use_only_conditions = opts.include?(:graph_only_conditions)
2370
+ only_conditions = opts[:graph_only_conditions]
2371
+ conditions = opts[:graph_conditions]
2372
+ opts[:cartesian_product_number] ||= one_to_one ? 0 : 1
2373
+ graph_block = opts[:graph_block]
2374
+ opts[:eager_grapher] ||= proc do |eo|
2375
+ ds = eo[:self]
2376
+ ds = ds.graph(opts.apply_eager_graph_limit_strategy(eo[:limit_strategy], eager_graph_dataset(opts, eo)), use_only_conditions ? only_conditions : cks.zip(pkcs) + conditions, eo.merge(:select=>select, :join_type=>eo[:join_type]||join_type, :qualify=>:deep), &graph_block)
2377
+ # We only load reciprocals for one_to_many associations, as other reciprocals don't make sense
2378
+ ds.opts[:eager_graph][:reciprocals][eo[:table_alias]] = opts.reciprocal
2379
+ ds
2380
+ end
2381
+
2382
+ return if opts[:read_only]
2383
+
2384
+ save_opts = {:validate=>opts[:validate]}
2385
+ ck_nil_hash ={}
2386
+ cks.each{|k| ck_nil_hash[k] = nil}
2387
+
2388
+ if one_to_one
2389
+ unless opts.has_key?(:setter)
2390
+ opts[:setter] = proc do |o|
2391
+ up_ds = _apply_association_options(opts, opts.associated_dataset.where(cks.zip(cpks.map{|k| get_column_value(k)})))
2392
+
2393
+ if (froms = up_ds.opts[:from]) && (from = froms[0]) && (from.is_a?(Sequel::Dataset) || (from.is_a?(Sequel::SQL::AliasedExpression) && from.expression.is_a?(Sequel::Dataset)))
2394
+ if old = up_ds.first
2395
+ cks.each{|k| old.set_column_value(:"#{k}=", nil)}
2396
+ end
2397
+ save_old = true
2398
+ end
2399
+
2400
+ if o
2401
+ if !o.new? && !save_old
2402
+ up_ds = up_ds.exclude(o.pk_hash)
2403
+ end
2404
+ cks.zip(cpks).each{|k, pk| o.set_column_value(:"#{k}=", get_column_value(pk))}
2405
+ end
2406
+
2407
+ checked_transaction do
2408
+ if save_old
2409
+ old.save(save_opts) || raise(Sequel::Error, "invalid previously associated object, cannot save") if old
2410
+ else
2411
+ up_ds.skip_limit_check.update(ck_nil_hash)
2412
+ end
2413
+
2414
+ o.save(save_opts) || raise(Sequel::Error, "invalid associated object, cannot save") if o
2415
+ end
2416
+ end
2417
+ end
2418
+ if opts.fetch(:setter, true)
2419
+ opts[:_setter] = proc{|o| set_one_to_one_associated_object(opts, o)}
2420
+ end
2421
+ else
2422
+ save_opts[:raise_on_failure] = opts[:raise_on_save_failure] != false
2423
+
2424
+ unless opts.has_key?(:adder)
2425
+ opts[:adder] = proc do |o|
2426
+ cks.zip(cpks).each{|k, pk| o.set_column_value(:"#{k}=", get_column_value(pk))}
2427
+ o.save(save_opts)
2428
+ end
2429
+ end
2430
+
2431
+ unless opts.has_key?(:remover)
2432
+ opts[:remover] = proc do |o|
2433
+ cks.each{|k| o.set_column_value(:"#{k}=", nil)}
2434
+ o.save(save_opts)
2435
+ end
2436
+ end
2437
+
2438
+ unless opts.has_key?(:clearer)
2439
+ opts[:clearer] = proc do
2440
+ _apply_association_options(opts, opts.associated_dataset.where(cks.zip(cpks.map{|k| get_column_value(k)}))).update(ck_nil_hash)
2441
+ end
2442
+ end
2443
+ end
2444
+ end
2445
+
2446
+ # Alias of def_many_to_many, since they share pretty much the same code.
2447
+ def def_one_through_one(opts)
2448
+ def_many_to_many(opts)
2449
+ end
2450
+
2451
+ # Alias of def_one_to_many, since they share pretty much the same code.
2452
+ def def_one_to_one(opts)
2453
+ def_one_to_many(opts)
2454
+ end
2455
+
2456
+ # Return dataset to graph into given the association reflection, applying the :callback option if set.
2457
+ def eager_graph_dataset(opts, eager_options)
2458
+ ds = opts.associated_class.dataset
2459
+ if cb = eager_options[:callback]
2460
+ ds = cb.call(ds)
2461
+ end
2462
+ ds
2463
+ end
2464
+
2465
+ # If not caching associations, reload the database schema by default,
2466
+ # ignoring any cached values.
2467
+ def reload_db_schema?
2468
+ !@cache_associations
2469
+ end
2470
+ end
2471
+
2472
+ # Instance methods used to implement the associations support.
2473
+ module InstanceMethods
2474
+ # The currently cached associations. A hash with the keys being the
2475
+ # association name symbols and the values being the associated object
2476
+ # or nil (many_to_one), or the array of associated objects (*_to_many).
2477
+ def associations
2478
+ @associations ||= {}
2479
+ end
2480
+
2481
+ # Freeze the associations cache when freezing the object. Note that
2482
+ # retrieving associations after freezing will still work in most cases,
2483
+ # but the associations will not be cached in the association cache.
2484
+ def freeze
2485
+ associations
2486
+ super
2487
+ associations.freeze
2488
+ self
2489
+ end
2490
+
2491
+ private
2492
+
2493
+ # Apply the association options such as :order and :limit to the given dataset, returning a modified dataset.
2494
+ def _apply_association_options(opts, ds)
2495
+ unless ds.kind_of?(AssociationDatasetMethods)
2496
+ ds = opts.apply_dataset_changes(ds)
2497
+ end
2498
+ ds = ds.clone(:model_object => self)
2499
+ ds = ds.eager_graph(opts[:eager_graph]) if opts[:eager_graph] && opts.eager_graph_lazy_dataset?
2500
+ # block method is private
2501
+ ds = send(opts[:block_method], ds) if opts[:block_method]
2502
+ ds
2503
+ end
2504
+
2505
+ # Return a dataset for the association after applying any dynamic callback.
2506
+ def _associated_dataset(opts, dynamic_opts)
2507
+ ds = public_send(opts.dataset_method)
2508
+ if callback = dynamic_opts[:callback]
2509
+ ds = callback.call(ds)
2510
+ end
2511
+ ds
2512
+ end
2513
+
2514
+ # A placeholder literalizer that can be used to load the association, or nil to not use one.
2515
+ def _associated_object_loader(opts, dynamic_opts)
2516
+ if !dynamic_opts[:callback] && (loader = opts.placeholder_loader)
2517
+ loader
2518
+ end
2519
+ end
2520
+
2521
+ # Return an association dataset for the given association reflection
2522
+ def _dataset(opts)
2523
+ raise(Sequel::Error, "model object #{inspect} does not have a primary key") if opts.dataset_need_primary_key? && !pk
2524
+ ds = if opts[:dataset_opt_arity] == 1
2525
+ # dataset_opt_method is private
2526
+ send(opts[:dataset_opt_method], opts)
2527
+ else
2528
+ send(opts[:dataset_opt_method])
2529
+ end
2530
+ _apply_association_options(opts, ds)
2531
+ end
2532
+
2533
+ # Dataset for the join table of the given many to many association reflection
2534
+ def _join_table_dataset(opts)
2535
+ ds = (opts[:join_table_db] || model.db).from(opts.join_table_source)
2536
+ opts[:join_table_block] ? opts[:join_table_block].call(ds) : ds
2537
+ end
2538
+
2539
+ # Return the associated single object for the given association reflection and dynamic options
2540
+ # (or nil if no associated object).
2541
+ def _load_associated_object(opts, dynamic_opts)
2542
+ _load_associated_object_array(opts, dynamic_opts).first
2543
+ end
2544
+
2545
+ # Return the associated single object using a primary key lookup on the associated class.
2546
+ def _load_associated_object_via_primary_key(opts)
2547
+ opts.associated_class.send(:primary_key_lookup, ((fk = opts[:key]).is_a?(Array) ? fk.map{|c| get_column_value(c)} : get_column_value(fk)))
2548
+ end
2549
+
2550
+ # Load the associated objects for the given association reflection and dynamic options
2551
+ # as an array.
2552
+ def _load_associated_object_array(opts, dynamic_opts)
2553
+ if loader = _associated_object_loader(opts, dynamic_opts)
2554
+ loader.all(*opts.predicate_key_values(self))
2555
+ else
2556
+ ds = _associated_dataset(opts, dynamic_opts)
2557
+ if ds.opts[:no_results]
2558
+ []
2559
+ else
2560
+ ds.all
2561
+ end
2562
+ end
2563
+ end
2564
+
2565
+ # Return the associated objects from the dataset, without association callbacks, reciprocals, and caching.
2566
+ # Still apply the dynamic callback if present.
2567
+ def _load_associated_objects(opts, dynamic_opts=OPTS)
2568
+ if opts.can_have_associated_objects?(self)
2569
+ if opts.returns_array?
2570
+ _load_associated_object_array(opts, dynamic_opts)
2571
+ elsif load_with_primary_key_lookup?(opts, dynamic_opts)
2572
+ _load_associated_object_via_primary_key(opts)
2573
+ else
2574
+ _load_associated_object(opts, dynamic_opts)
2575
+ end
2576
+ elsif opts.returns_array?
2577
+ []
2578
+ end
2579
+ end
2580
+
2581
+ # Clear the associations cache when refreshing
2582
+ def _refresh_set_values(hash)
2583
+ @associations.clear if @associations
2584
+ super
2585
+ end
2586
+
2587
+ # Add the given associated object to the given association
2588
+ def add_associated_object(opts, o, *args)
2589
+ o = make_add_associated_object(opts, o)
2590
+ raise(Sequel::Error, "model object #{inspect} does not have a primary key") if opts.dataset_need_primary_key? && !pk
2591
+ ensure_associated_primary_key(opts, o, *args)
2592
+ return if run_association_callbacks(opts, :before_add, o) == false
2593
+ # Allow calling private _add method
2594
+ return if !send(opts[:_add_method], o, *args) && opts.handle_silent_modification_failure?
2595
+ if array = associations[opts[:name]] and !array.include?(o)
2596
+ array.push(o)
2597
+ end
2598
+ add_reciprocal_object(opts, o)
2599
+ run_association_callbacks(opts, :after_add, o)
2600
+ o
2601
+ end
2602
+ # :nocov:
2603
+ ruby2_keywords(:add_associated_object) if respond_to?(:ruby2_keywords, true)
2604
+ # :nocov:
2605
+
2606
+ # Add/Set the current object to/as the given object's reciprocal association.
2607
+ def add_reciprocal_object(opts, o)
2608
+ return if o.frozen?
2609
+ return unless reciprocal = opts.reciprocal
2610
+ if opts.reciprocal_array?
2611
+ if array = o.associations[reciprocal] and !array.include?(self)
2612
+ array.push(self)
2613
+ end
2614
+ else
2615
+ o.associations[reciprocal] = self
2616
+ end
2617
+ end
2618
+
2619
+ # Call uniq! on the given array. This is used by the :uniq option,
2620
+ # and is an actual method for memory reasons.
2621
+ def array_uniq!(a)
2622
+ a.uniq!
2623
+ end
2624
+
2625
+ # If a foreign key column value changes, clear the related
2626
+ # cached associations.
2627
+ def change_column_value(column, value)
2628
+ if assocs = model.autoreloading_associations[column]
2629
+ vals = @values
2630
+ if new?
2631
+ # Do deeper checking for new objects, so that associations are
2632
+ # not deleted when values do not change. This code is run at
2633
+ # a higher level for existing objects.
2634
+ if value == (c = vals[column]) && value.class == c.class
2635
+ # If the value is the same, there is no reason to delete
2636
+ # the related associations, so exit early in that case.
2637
+ return super
2638
+ end
2639
+
2640
+ only_delete_nil = c.nil?
2641
+ elsif vals[column].nil?
2642
+ only_delete_nil = true
2643
+ end
2644
+
2645
+ if only_delete_nil
2646
+ # If the current foreign key value is nil, but the association
2647
+ # is already present in the cache, it was probably added to the
2648
+ # cache for a reason, and we do not want to delete it in that case.
2649
+ # However, we still want to delete associations with nil values
2650
+ # to remove the cached false negative.
2651
+ assocs.each{|a| associations.delete(a) if associations[a].nil?}
2652
+ else
2653
+ assocs.each{|a| associations.delete(a)}
2654
+ end
2655
+ end
2656
+ super
2657
+ end
2658
+
2659
+ # Save the associated object if the associated object needs a primary key
2660
+ # and the associated object is new and does not have one. Raise an error if
2661
+ # the object still does not have a primary key
2662
+ def ensure_associated_primary_key(opts, o, *args)
2663
+ if opts.need_associated_primary_key?
2664
+ o.save(:validate=>opts[:validate]) if o.new?
2665
+ raise(Sequel::Error, "associated object #{o.inspect} does not have a primary key") unless o.pk
2666
+ end
2667
+ end
2668
+
2669
+ # Duplicate the associations hash when duplicating the object.
2670
+ def initialize_copy(other)
2671
+ super
2672
+ @associations = Hash[@associations] if @associations
2673
+ self
2674
+ end
2675
+
2676
+ # If a block is given, assign it as the :callback option in the hash, and return the hash.
2677
+ def load_association_objects_options(dynamic_opts, &block)
2678
+ if block
2679
+ dynamic_opts = Hash[dynamic_opts]
2680
+ dynamic_opts[:callback] = block
2681
+ end
2682
+
2683
+ dynamic_opts
2684
+ end
2685
+
2686
+ # Load the associated objects using the dataset, handling callbacks, reciprocals, and caching.
2687
+ def load_associated_objects(opts, dynamic_opts, &block)
2688
+ dynamic_opts = load_association_objects_options(dynamic_opts, &block)
2689
+ name = opts[:name]
2690
+ if associations.include?(name) && !dynamic_opts[:callback] && !dynamic_opts[:reload]
2691
+ associations[name]
2692
+ else
2693
+ objs = _load_associated_objects(opts, dynamic_opts)
2694
+ if opts.set_reciprocal_to_self?
2695
+ if opts.returns_array?
2696
+ objs.each{|o| add_reciprocal_object(opts, o)}
2697
+ elsif objs
2698
+ add_reciprocal_object(opts, objs)
2699
+ end
2700
+ end
2701
+
2702
+ # If the current object is frozen, you can't update the associations
2703
+ # cache. This can cause issues for after_load procs that expect
2704
+ # the objects to be already cached in the associations, but
2705
+ # unfortunately that case cannot be handled.
2706
+ associations[name] = objs unless frozen?
2707
+ run_association_callbacks(opts, :after_load, objs)
2708
+ frozen? ? objs : associations[name]
2709
+ end
2710
+ end
2711
+
2712
+ # Whether to use a simple primary key lookup on the associated class when loading.
2713
+ def load_with_primary_key_lookup?(opts, dynamic_opts)
2714
+ opts[:type] == :many_to_one &&
2715
+ !dynamic_opts[:callback] &&
2716
+ opts.send(:cached_fetch, :many_to_one_pk_lookup){opts.primary_key == opts.associated_class.primary_key}
2717
+ end
2718
+
2719
+ # Convert the input of the add_* association method into an associated object. For
2720
+ # hashes, this creates a new object using the hash. For integers, strings, and arrays,
2721
+ # assume the value specifies a primary key, and lookup an existing object with that primary key.
2722
+ # Otherwise, if the object is not already an instance of the class, raise an exception.
2723
+ def make_add_associated_object(opts, o)
2724
+ klass = opts.associated_class
2725
+
2726
+ case o
2727
+ when Hash
2728
+ klass.new(o)
2729
+ when Integer, String, Array
2730
+ klass.with_pk!(o)
2731
+ when klass
2732
+ o
2733
+ else
2734
+ raise(Sequel::Error, "associated object #{o.inspect} not of correct type #{klass}")
2735
+ end
2736
+ end
2737
+
2738
+ # Remove all associated objects from the given association
2739
+ def remove_all_associated_objects(opts, *args)
2740
+ raise(Sequel::Error, "model object #{inspect} does not have a primary key") if opts.dataset_need_primary_key? && !pk
2741
+ # Allow calling private _remove_all method
2742
+ send(opts[:_remove_all_method], *args)
2743
+ ret = associations[opts[:name]].each{|o| remove_reciprocal_object(opts, o)} if associations.include?(opts[:name])
2744
+ associations[opts[:name]] = []
2745
+ ret
2746
+ end
2747
+ # :nocov:
2748
+ ruby2_keywords(:remove_all_associated_objects) if respond_to?(:ruby2_keywords, true)
2749
+ # :nocov:
2750
+
2751
+ # Remove the given associated object from the given association
2752
+ def remove_associated_object(opts, o, *args)
2753
+ klass = opts.associated_class
2754
+ if o.is_a?(Integer) || o.is_a?(String) || o.is_a?(Array)
2755
+ o = remove_check_existing_object_from_pk(opts, o, *args)
2756
+ elsif !o.is_a?(klass)
2757
+ raise(Sequel::Error, "associated object #{o.inspect} not of correct type #{klass}")
2758
+ elsif opts.remove_should_check_existing? && public_send(opts.dataset_method).where(o.pk_hash).empty?
2759
+ raise(Sequel::Error, "associated object #{o.inspect} is not currently associated to #{inspect}")
2760
+ end
2761
+ raise(Sequel::Error, "model object #{inspect} does not have a primary key") if opts.dataset_need_primary_key? && !pk
2762
+ raise(Sequel::Error, "associated object #{o.inspect} does not have a primary key") if opts.need_associated_primary_key? && !o.pk
2763
+ return if run_association_callbacks(opts, :before_remove, o) == false
2764
+ # Allow calling private _remove method
2765
+ return if !send(opts[:_remove_method], o, *args) && opts.handle_silent_modification_failure?
2766
+ associations[opts[:name]].delete_if{|x| o === x} if associations.include?(opts[:name])
2767
+ remove_reciprocal_object(opts, o)
2768
+ run_association_callbacks(opts, :after_remove, o)
2769
+ o
2770
+ end
2771
+ # :nocov:
2772
+ ruby2_keywords(:remove_associated_object) if respond_to?(:ruby2_keywords, true)
2773
+ # :nocov:
2774
+
2775
+ # Check that the object from the associated table specified by the primary key
2776
+ # is currently associated to the receiver. If it is associated, return the object, otherwise
2777
+ # raise an error.
2778
+ def remove_check_existing_object_from_pk(opts, o, *args)
2779
+ key = o
2780
+ pkh = opts.associated_class.qualified_primary_key_hash(key)
2781
+ raise(Sequel::Error, "no object with key(s) #{key.inspect} is currently associated to #{inspect}") unless o = public_send(opts.dataset_method).first(pkh)
2782
+ o
2783
+ end
2784
+
2785
+ # Remove/unset the current object from/as the given object's reciprocal association.
2786
+ def remove_reciprocal_object(opts, o)
2787
+ return unless reciprocal = opts.reciprocal
2788
+ if opts.reciprocal_array?
2789
+ if array = o.associations[reciprocal]
2790
+ array.delete_if{|x| self === x}
2791
+ end
2792
+ else
2793
+ o.associations[reciprocal] = nil
2794
+ end
2795
+ end
2796
+
2797
+ # Run the callback for the association with the object.
2798
+ def run_association_callbacks(reflection, callback_type, object)
2799
+ return unless cbs = reflection[callback_type]
2800
+
2801
+ begin
2802
+ cbs.each do |cb|
2803
+ case cb
2804
+ when Symbol
2805
+ # Allow calling private methods in association callbacks
2806
+ send(cb, object)
2807
+ when Proc
2808
+ cb.call(self, object)
2809
+ else
2810
+ raise Error, "callbacks should either be Procs or Symbols"
2811
+ end
2812
+ end
2813
+ rescue HookFailed
2814
+ # The reason we automatically set raise_error for singular associations is that
2815
+ # assignment in ruby always returns the argument instead of the result of the
2816
+ # method, so we can't return nil to signal that the association callback prevented
2817
+ # the modification
2818
+ return false unless raise_on_save_failure || !reflection.returns_array?
2819
+ raise
2820
+ end
2821
+ end
2822
+
2823
+ # Set the given object as the associated object for the given *_to_one association reflection
2824
+ def _set_associated_object(opts, o)
2825
+ a = associations[opts[:name]]
2826
+ reciprocal = opts.reciprocal
2827
+ if set_associated_object_if_same?
2828
+ if reciprocal
2829
+ remove_reciprocal = a && (a != o || a.associations[reciprocal] != self)
2830
+ add_reciprocal = o && o.associations[reciprocal] != self
2831
+ end
2832
+ else
2833
+ return if a && a == o
2834
+ if reciprocal
2835
+ remove_reciprocal = a
2836
+ add_reciprocal = o
2837
+ end
2838
+ end
2839
+ run_association_callbacks(opts, :before_set, o)
2840
+ remove_reciprocal_object(opts, a) if remove_reciprocal
2841
+ # Allow calling private _setter method
2842
+ send(opts[:_setter_method], o)
2843
+ associations[opts[:name]] = o
2844
+ add_reciprocal_object(opts, o) if add_reciprocal
2845
+ run_association_callbacks(opts, :after_set, o)
2846
+ o
2847
+ end
2848
+
2849
+ # Whether run the associated object setter code if passed the same object as the one already
2850
+ # cached in the association. Usually not set (so nil), can be set on a per-object basis
2851
+ # if necessary.
2852
+ def set_associated_object_if_same?
2853
+ @set_associated_object_if_same
2854
+ end
2855
+
2856
+ # Set the given object as the associated object for the given many_to_one association reflection
2857
+ def set_associated_object(opts, o)
2858
+ raise(Error, "associated object #{o.inspect} does not have a primary key") if o && !o.pk
2859
+ _set_associated_object(opts, o)
2860
+ end
2861
+
2862
+ # Set the given object as the associated object for the given one_through_one association reflection
2863
+ def set_one_through_one_associated_object(opts, o)
2864
+ raise(Error, "object #{inspect} does not have a primary key") unless pk
2865
+ raise(Error, "associated object #{o.inspect} does not have a primary key") if o && !o.pk
2866
+ _set_associated_object(opts, o)
2867
+ end
2868
+
2869
+ # Set the given object as the associated object for the given one_to_one association reflection
2870
+ def set_one_to_one_associated_object(opts, o)
2871
+ raise(Error, "object #{inspect} does not have a primary key") unless pk
2872
+ _set_associated_object(opts, o)
2873
+ end
2874
+ end
2875
+
2876
+ # Eager loading makes it so that you can load all associated records for a
2877
+ # set of objects in a single query, instead of a separate query for each object.
2878
+ #
2879
+ # Two separate implementations are provided. +eager+ should be used most of the
2880
+ # time, as it loads associated records using one query per association. However,
2881
+ # it does not allow you the ability to filter or order based on columns in associated tables. +eager_graph+ loads
2882
+ # all records in a single query using JOINs, allowing you to filter or order based on columns in associated
2883
+ # tables. However, +eager_graph+ is usually slower than +eager+, especially if multiple
2884
+ # one_to_many or many_to_many associations are joined.
2885
+ #
2886
+ # You can cascade the eager loading (loading associations on associated objects)
2887
+ # with no limit to the depth of the cascades. You do this by passing a hash to +eager+ or +eager_graph+
2888
+ # with the keys being associations of the current model and values being
2889
+ # associations of the model associated with the current model via the key.
2890
+ #
2891
+ # The arguments can be symbols or hashes with symbol keys (for cascaded
2892
+ # eager loading). Examples:
2893
+ #
2894
+ # Album.eager(:artist).all
2895
+ # Album.eager_graph(:artist).all
2896
+ # Album.eager(:artist, :genre).all
2897
+ # Album.eager_graph(:artist, :genre).all
2898
+ # Album.eager(:artist).eager(:genre).all
2899
+ # Album.eager_graph(:artist).eager_graph(:genre).all
2900
+ # Artist.eager(albums: :tracks).all
2901
+ # Artist.eager_graph(albums: :tracks).all
2902
+ # Artist.eager(albums: {tracks: :genre}).all
2903
+ # Artist.eager_graph(albums: {tracks: :genre}).all
2904
+ #
2905
+ # You can also pass a callback as a hash value in order to customize the dataset being
2906
+ # eager loaded at query time, analogous to the way the :eager_block association option
2907
+ # allows you to customize it at association definition time. For example,
2908
+ # if you wanted artists with their albums since 1990:
2909
+ #
2910
+ # Artist.eager(albums: proc{|ds| ds.where{year > 1990}})
2911
+ #
2912
+ # Or if you needed albums and their artist's name only, using a single query:
2913
+ #
2914
+ # Albums.eager_graph(artist: proc{|ds| ds.select(:name)})
2915
+ #
2916
+ # To cascade eager loading while using a callback, you substitute the cascaded
2917
+ # associations with a single entry hash that has the proc callback as the key and
2918
+ # the cascaded associations as the value. This will load artists with their albums
2919
+ # since 1990, and also the tracks on those albums and the genre for those tracks:
2920
+ #
2921
+ # Artist.eager(albums: {proc{|ds| ds.where{year > 1990}}=>{tracks: :genre}})
2922
+ module DatasetMethods
2923
+ %w'inner left right full'.each do |type|
2924
+ class_eval(<<-END, __FILE__, __LINE__+1)
2925
+ def association_#{type}_join(*associations)
2926
+ _association_join(:#{type}, associations)
2927
+ end
2928
+ END
2929
+ end
2930
+
2931
+ # Adds one or more INNER JOINs to the existing dataset using the keys and conditions
2932
+ # specified by the given association(s). Take the same arguments as eager_graph, and
2933
+ # operates similarly, but only adds the joins as opposed to making the other changes
2934
+ # (such as adding selected columns and setting up eager loading).
2935
+ #
2936
+ # The following methods also exist for specifying a different type of JOIN:
2937
+ #
2938
+ # association_full_join :: FULL JOIN
2939
+ # association_inner_join :: INNER JOIN
2940
+ # association_left_join :: LEFT JOIN
2941
+ # association_right_join :: RIGHT JOIN
2942
+ #
2943
+ # Examples:
2944
+ #
2945
+ # # For each album, association_join load the artist
2946
+ # Album.association_join(:artist).all
2947
+ # # SELECT *
2948
+ # # FROM albums
2949
+ # # INNER JOIN artists AS artist ON (artists.id = albums.artist_id)
2950
+ #
2951
+ # # For each album, association_join load the artist, using a specified alias
2952
+ # Album.association_join(Sequel[:artist].as(:a)).all
2953
+ # # SELECT *
2954
+ # # FROM albums
2955
+ # # INNER JOIN artists AS a ON (a.id = albums.artist_id)
2956
+ #
2957
+ # # For each album, association_join load the artist and genre
2958
+ # Album.association_join(:artist, :genre).all
2959
+ # Album.association_join(:artist).association_join(:genre).all
2960
+ # # SELECT *
2961
+ # # FROM albums
2962
+ # # INNER JOIN artists AS artist ON (artist.id = albums.artist_id)
2963
+ # # INNER JOIN genres AS genre ON (genre.id = albums.genre_id)
2964
+ #
2965
+ # # For each artist, association_join load albums and tracks for each album
2966
+ # Artist.association_join(albums: :tracks).all
2967
+ # # SELECT *
2968
+ # # FROM artists
2969
+ # # INNER JOIN albums ON (albums.artist_id = artists.id)
2970
+ # # INNER JOIN tracks ON (tracks.album_id = albums.id)
2971
+ #
2972
+ # # For each artist, association_join load albums, tracks for each album, and genre for each track
2973
+ # Artist.association_join(albums: {tracks: :genre}).all
2974
+ # # SELECT *
2975
+ # # FROM artists
2976
+ # # INNER JOIN albums ON (albums.artist_id = artists.id)
2977
+ # # INNER JOIN tracks ON (tracks.album_id = albums.id)
2978
+ # # INNER JOIN genres AS genre ON (genre.id = tracks.genre_id)
2979
+ #
2980
+ # # For each artist, association_join load albums with year > 1990
2981
+ # Artist.association_join(albums: proc{|ds| ds.where{year > 1990}}).all
2982
+ # # SELECT *
2983
+ # # FROM artists
2984
+ # # INNER JOIN (
2985
+ # # SELECT * FROM albums WHERE (year > 1990)
2986
+ # # ) AS albums ON (albums.artist_id = artists.id)
2987
+ #
2988
+ # # For each artist, association_join load albums and tracks 1-10 for each album
2989
+ # Artist.association_join(albums: {tracks: proc{|ds| ds.where(number: 1..10)}}).all
2990
+ # # SELECT *
2991
+ # # FROM artists
2992
+ # # INNER JOIN albums ON (albums.artist_id = artists.id)
2993
+ # # INNER JOIN (
2994
+ # # SELECT * FROM tracks WHERE ((number >= 1) AND (number <= 10))
2995
+ # # ) AS tracks ON (tracks.albums_id = albums.id)
2996
+ #
2997
+ # # For each artist, association_join load albums with year > 1990, and tracks for those albums
2998
+ # Artist.association_join(albums: {proc{|ds| ds.where{year > 1990}}=>:tracks}).all
2999
+ # # SELECT *
3000
+ # # FROM artists
3001
+ # # INNER JOIN (
3002
+ # # SELECT * FROM albums WHERE (year > 1990)
3003
+ # # ) AS albums ON (albums.artist_id = artists.id)
3004
+ # # INNER JOIN tracks ON (tracks.album_id = albums.id)
3005
+ def association_join(*associations)
3006
+ association_inner_join(*associations)
3007
+ end
3008
+
3009
+ # If the expression is in the form <tt>x = y</tt> where +y+ is a <tt>Sequel::Model</tt>
3010
+ # instance, array of <tt>Sequel::Model</tt> instances, or a <tt>Sequel::Model</tt> dataset,
3011
+ # assume +x+ is an association symbol and look up the association reflection
3012
+ # via the dataset's model. From there, return the appropriate SQL based on the type of
3013
+ # association and the values of the foreign/primary keys of +y+. For most association
3014
+ # types, this is a simple transformation, but for +many_to_many+ associations this
3015
+ # creates a subquery to the join table.
3016
+ def complex_expression_sql_append(sql, op, args)
3017
+ r = args[1]
3018
+ if (((op == :'=' || op == :'!=') && r.is_a?(Sequel::Model)) ||
3019
+ (multiple = ((op == :IN || op == :'NOT IN') && ((is_ds = r.is_a?(Sequel::Dataset)) || (r.respond_to?(:all?) && r.all?{|x| x.is_a?(Sequel::Model)})))))
3020
+ l = args[0]
3021
+ if ar = model.association_reflections[l]
3022
+ raise Error, "filtering by associations is not allowed for #{ar.inspect}" if ar[:allow_filtering_by] == false
3023
+
3024
+ if multiple
3025
+ klass = ar.associated_class
3026
+ if is_ds
3027
+ if r.respond_to?(:model)
3028
+ unless r.model <= klass
3029
+ # A dataset for a different model class, could be a valid regular query
3030
+ return super
3031
+ end
3032
+ else
3033
+ # Not a model dataset, could be a valid regular query
3034
+ return super
3035
+ end
3036
+ else
3037
+ unless r.all?{|x| x.is_a?(klass)}
3038
+ raise Sequel::Error, "invalid association class for one object for association #{l.inspect} used in dataset filter for model #{model.inspect}, expected class #{klass.inspect}"
3039
+ end
3040
+ end
3041
+ elsif !r.is_a?(ar.associated_class)
3042
+ raise Sequel::Error, "invalid association class #{r.class.inspect} for association #{l.inspect} used in dataset filter for model #{model.inspect}, expected class #{ar.associated_class.inspect}"
3043
+ end
3044
+
3045
+ if exp = association_filter_expression(op, ar, r)
3046
+ literal_append(sql, exp)
3047
+ else
3048
+ raise Sequel::Error, "invalid association type #{ar[:type].inspect} for association #{l.inspect} used in dataset filter for model #{model.inspect}"
3049
+ end
3050
+ elsif multiple && (is_ds || r.empty?)
3051
+ # Not a query designed for this support, could be a valid regular query
3052
+ super
3053
+ else
3054
+ raise Sequel::Error, "invalid association #{l.inspect} used in dataset filter for model #{model.inspect}"
3055
+ end
3056
+ else
3057
+ super
3058
+ end
3059
+ end
3060
+
3061
+ # The preferred eager loading method. Loads all associated records using one
3062
+ # query for each association.
3063
+ #
3064
+ # The basic idea for how it works is that the dataset is first loaded normally.
3065
+ # Then it goes through all associations that have been specified via +eager+.
3066
+ # It loads each of those associations separately, then associates them back
3067
+ # to the original dataset via primary/foreign keys. Due to the necessity of
3068
+ # all objects being present, you need to use +all+ to use eager loading, as it
3069
+ # can't work with +each+.
3070
+ #
3071
+ # This implementation avoids the complexity of extracting an object graph out
3072
+ # of a single dataset, by building the object graph out of multiple datasets,
3073
+ # one for each association. By using a separate dataset for each association,
3074
+ # it avoids problems such as aliasing conflicts and creating cartesian product
3075
+ # result sets if multiple one_to_many or many_to_many eager associations are requested.
3076
+ #
3077
+ # One limitation of using this method is that you cannot filter the current dataset
3078
+ # based on values of columns in an associated table, since the associations are loaded
3079
+ # in separate queries. To do that you need to load all associations in the
3080
+ # same query, and extract an object graph from the results of that query. If you
3081
+ # need to filter based on columns in associated tables, look at +eager_graph+
3082
+ # or join the tables you need to filter on manually.
3083
+ #
3084
+ # Each association's order, if defined, is respected.
3085
+ # If the association uses a block or has an :eager_block argument, it is used.
3086
+ #
3087
+ # To modify the associated dataset that will be used for the eager load, you should use a
3088
+ # hash for the association, with the key being the association name symbol, and the value being
3089
+ # a callable object that is called with the associated dataset and should return a modified
3090
+ # dataset. If that association also has dependent associations, instead of a callable object,
3091
+ # use a hash with the callable object being the key, and the dependent association(s) as the value.
3092
+ #
3093
+ # Examples:
3094
+ #
3095
+ # # For each album, eager load the artist
3096
+ # Album.eager(:artist).all
3097
+ # # SELECT * FROM albums
3098
+ # # SELECT * FROM artists WHERE (id IN (...))
3099
+ #
3100
+ # # For each album, eager load the artist and genre
3101
+ # Album.eager(:artist, :genre).all
3102
+ # Album.eager(:artist).eager(:genre).all
3103
+ # # SELECT * FROM albums
3104
+ # # SELECT * FROM artists WHERE (id IN (...))
3105
+ # # SELECT * FROM genres WHERE (id IN (...))
3106
+ #
3107
+ # # For each artist, eager load albums and tracks for each album
3108
+ # Artist.eager(albums: :tracks).all
3109
+ # # SELECT * FROM artists
3110
+ # # SELECT * FROM albums WHERE (artist_id IN (...))
3111
+ # # SELECT * FROM tracks WHERE (album_id IN (...))
3112
+ #
3113
+ # # For each artist, eager load albums, tracks for each album, and genre for each track
3114
+ # Artist.eager(albums: {tracks: :genre}).all
3115
+ # # SELECT * FROM artists
3116
+ # # SELECT * FROM albums WHERE (artist_id IN (...))
3117
+ # # SELECT * FROM tracks WHERE (album_id IN (...))
3118
+ # # SELECT * FROM genre WHERE (id IN (...))
3119
+ #
3120
+ # # For each artist, eager load albums with year > 1990
3121
+ # Artist.eager(albums: proc{|ds| ds.where{year > 1990}}).all
3122
+ # # SELECT * FROM artists
3123
+ # # SELECT * FROM albums WHERE ((year > 1990) AND (artist_id IN (...)))
3124
+ #
3125
+ # # For each artist, eager load albums and tracks 1-10 for each album
3126
+ # Artist.eager(albums: {tracks: proc{|ds| ds.where(number: 1..10)}}).all
3127
+ # # SELECT * FROM artists
3128
+ # # SELECT * FROM albums WHERE (artist_id IN (...))
3129
+ # # SELECT * FROM tracks WHERE ((number >= 1) AND (number <= 10) AND (album_id IN (...)))
3130
+ #
3131
+ # # For each artist, eager load albums with year > 1990, and tracks for those albums
3132
+ # Artist.eager(albums: {proc{|ds| ds.where{year > 1990}}=>:tracks}).all
3133
+ # # SELECT * FROM artists
3134
+ # # SELECT * FROM albums WHERE ((year > 1990) AND (artist_id IN (...)))
3135
+ # # SELECT * FROM albums WHERE (artist_id IN (...))
3136
+ def eager(*associations)
3137
+ opts = @opts[:eager]
3138
+ association_opts = eager_options_for_associations(associations)
3139
+ opts = opts ? opts.merge(association_opts) : association_opts
3140
+ clone(:eager=>opts.freeze)
3141
+ end
3142
+
3143
+ # The secondary eager loading method. Loads all associations in a single query. This
3144
+ # method should only be used if you need to filter or order based on columns in associated tables,
3145
+ # or if you have done comparative benchmarking and determined it is faster.
3146
+ #
3147
+ # This method uses <tt>Dataset#graph</tt> to create appropriate aliases for columns in all the
3148
+ # tables. Then it uses the graph's metadata to build the associations from the single hash, and
3149
+ # finally replaces the array of hashes with an array model objects inside all.
3150
+ #
3151
+ # Be very careful when using this with multiple one_to_many or many_to_many associations, as you can
3152
+ # create large cartesian products. If you must graph multiple one_to_many and many_to_many associations,
3153
+ # make sure your filters are narrow if the datasets are large.
3154
+ #
3155
+ # Each association's order, if defined, is respected. +eager_graph+ probably
3156
+ # won't work correctly on a limited dataset, unless you are
3157
+ # only graphing many_to_one, one_to_one, and one_through_one associations.
3158
+ #
3159
+ # Does not use the block defined for the association, since it does a single query for
3160
+ # all objects. You can use the :graph_* association options to modify the SQL query.
3161
+ #
3162
+ # Like +eager+, you need to call +all+ on the dataset for the eager loading to work. If you just
3163
+ # call +each+, it will yield plain hashes, each containing all columns from all the tables.
3164
+ #
3165
+ # To modify the associated dataset that will be joined to the current dataset, you should use a
3166
+ # hash for the association, with the key being the association name symbol, and the value being
3167
+ # a callable object that is called with the associated dataset and should return a modified
3168
+ # dataset. If that association also has dependent associations, instead of a callable object,
3169
+ # use a hash with the callable object being the key, and the dependent association(s) as the value.
3170
+ #
3171
+ # You can specify an custom alias and/or join type on a per-association basis by providing an
3172
+ # Sequel::SQL::AliasedExpression object instead of an a Symbol for the association name.
3173
+ #
3174
+ # You cannot mix calls to +eager_graph+ and +graph+ on the same dataset.
3175
+ #
3176
+ # Examples:
3177
+ #
3178
+ # # For each album, eager_graph load the artist
3179
+ # Album.eager_graph(:artist).all
3180
+ # # SELECT ...
3181
+ # # FROM albums
3182
+ # # LEFT OUTER JOIN artists AS artist ON (artists.id = albums.artist_id)
3183
+ #
3184
+ # # For each album, eager_graph load the artist, using a specified alias
3185
+ # Album.eager_graph(Sequel[:artist].as(:a)).all
3186
+ # # SELECT ...
3187
+ # # FROM albums
3188
+ # # LEFT OUTER JOIN artists AS a ON (a.id = albums.artist_id)
3189
+ #
3190
+ # # For each album, eager_graph load the artist, using a specified alias
3191
+ # # and custom join type
3192
+ #
3193
+ # Album.eager_graph(Sequel[:artist].as(:a, join_type: :inner)).all
3194
+ # # SELECT ...
3195
+ # # FROM albums
3196
+ # # INNER JOIN artists AS a ON (a.id = albums.artist_id)
3197
+ #
3198
+ # # For each album, eager_graph load the artist and genre
3199
+ # Album.eager_graph(:artist, :genre).all
3200
+ # Album.eager_graph(:artist).eager_graph(:genre).all
3201
+ # # SELECT ...
3202
+ # # FROM albums
3203
+ # # LEFT OUTER JOIN artists AS artist ON (artist.id = albums.artist_id)
3204
+ # # LEFT OUTER JOIN genres AS genre ON (genre.id = albums.genre_id)
3205
+ #
3206
+ # # For each artist, eager_graph load albums and tracks for each album
3207
+ # Artist.eager_graph(albums: :tracks).all
3208
+ # # SELECT ...
3209
+ # # FROM artists
3210
+ # # LEFT OUTER JOIN albums ON (albums.artist_id = artists.id)
3211
+ # # LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)
3212
+ #
3213
+ # # For each artist, eager_graph load albums, tracks for each album, and genre for each track
3214
+ # Artist.eager_graph(albums: {tracks: :genre}).all
3215
+ # # SELECT ...
3216
+ # # FROM artists
3217
+ # # LEFT OUTER JOIN albums ON (albums.artist_id = artists.id)
3218
+ # # LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)
3219
+ # # LEFT OUTER JOIN genres AS genre ON (genre.id = tracks.genre_id)
3220
+ #
3221
+ # # For each artist, eager_graph load albums with year > 1990
3222
+ # Artist.eager_graph(albums: proc{|ds| ds.where{year > 1990}}).all
3223
+ # # SELECT ...
3224
+ # # FROM artists
3225
+ # # LEFT OUTER JOIN (
3226
+ # # SELECT * FROM albums WHERE (year > 1990)
3227
+ # # ) AS albums ON (albums.artist_id = artists.id)
3228
+ #
3229
+ # # For each artist, eager_graph load albums and tracks 1-10 for each album
3230
+ # Artist.eager_graph(albums: {tracks: proc{|ds| ds.where(number: 1..10)}}).all
3231
+ # # SELECT ...
3232
+ # # FROM artists
3233
+ # # LEFT OUTER JOIN albums ON (albums.artist_id = artists.id)
3234
+ # # LEFT OUTER JOIN (
3235
+ # # SELECT * FROM tracks WHERE ((number >= 1) AND (number <= 10))
3236
+ # # ) AS tracks ON (tracks.albums_id = albums.id)
3237
+ #
3238
+ # # For each artist, eager_graph load albums with year > 1990, and tracks for those albums
3239
+ # Artist.eager_graph(albums: {proc{|ds| ds.where{year > 1990}}=>:tracks}).all
3240
+ # # SELECT ...
3241
+ # # FROM artists
3242
+ # # LEFT OUTER JOIN (
3243
+ # # SELECT * FROM albums WHERE (year > 1990)
3244
+ # # ) AS albums ON (albums.artist_id = artists.id)
3245
+ # # LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)
3246
+ def eager_graph(*associations)
3247
+ eager_graph_with_options(associations)
3248
+ end
3249
+
3250
+ # Run eager_graph with some options specific to just this call. Unlike eager_graph, this takes
3251
+ # the associations as a single argument instead of multiple arguments.
3252
+ #
3253
+ # Options:
3254
+ #
3255
+ # :join_type :: Override the join type specified in the association
3256
+ # :limit_strategy :: Use a strategy for handling limits on associations.
3257
+ # Appropriate :limit_strategy values are:
3258
+ # true :: Pick the most appropriate based on what the database supports
3259
+ # :distinct_on :: Force use of DISTINCT ON stategy (*_one associations only)
3260
+ # :correlated_subquery :: Force use of correlated subquery strategy (one_to_* associations only)
3261
+ # :window_function :: Force use of window function strategy
3262
+ # :ruby :: Don't modify the SQL, implement limits/offsets with array slicing
3263
+ #
3264
+ # This can also be a hash with association name symbol keys and one of the above values,
3265
+ # to use different strategies per association.
3266
+ #
3267
+ # The default is the :ruby strategy. Choosing a different strategy can make your code
3268
+ # significantly slower in some cases (perhaps even the majority of cases), so you should
3269
+ # only use this if you have benchmarked that it is faster for your use cases.
3270
+ def eager_graph_with_options(associations, opts=OPTS)
3271
+ return self if associations.empty?
3272
+
3273
+ opts = opts.dup unless opts.frozen?
3274
+ associations = [associations] unless associations.is_a?(Array)
3275
+ ds = if eg = @opts[:eager_graph]
3276
+ eg = eg.dup
3277
+ [:requirements, :reflections, :reciprocals, :limits].each{|k| eg[k] = eg[k].dup}
3278
+ eg[:local] = opts
3279
+ ds = clone(:eager_graph=>eg)
3280
+ ds.eager_graph_associations(ds, model, ds.opts[:eager_graph][:master], [], *associations)
3281
+ else
3282
+ # Each of the following have a symbol key for the table alias, with the following values:
3283
+ # :reciprocals :: the reciprocal value to use for this association
3284
+ # :reflections :: AssociationReflection instance related to this association
3285
+ # :requirements :: array of requirements for this association
3286
+ # :limits :: Any limit/offset array slicing that need to be handled in ruby land after loading
3287
+ opts = {:requirements=>{}, :master=>alias_symbol(first_source), :reflections=>{}, :reciprocals=>{}, :limits=>{}, :local=>opts, :cartesian_product_number=>0, :row_proc=>row_proc}
3288
+ ds = clone(:eager_graph=>opts)
3289
+ ds = ds.eager_graph_associations(ds, model, ds.opts[:eager_graph][:master], [], *associations).naked
3290
+ end
3291
+
3292
+ ds.opts[:eager_graph].freeze
3293
+ ds.opts[:eager_graph].each_value{|v| v.freeze if v.is_a?(Hash)}
3294
+ ds
3295
+ end
3296
+
3297
+ # If the dataset is being eagerly loaded, default to calling all
3298
+ # instead of each.
3299
+ def as_hash(key_column=nil, value_column=nil, opts=OPTS)
3300
+ if (@opts[:eager_graph] || @opts[:eager]) && !opts.has_key?(:all)
3301
+ opts = Hash[opts]
3302
+ opts[:all] = true
3303
+ end
3304
+ super
3305
+ end
3306
+
3307
+ # If the dataset is being eagerly loaded, default to calling all
3308
+ # instead of each.
3309
+ def to_hash_groups(key_column, value_column=nil, opts=OPTS)
3310
+ if (@opts[:eager_graph] || @opts[:eager]) && !opts.has_key?(:all)
3311
+ opts = Hash[opts]
3312
+ opts[:all] = true
3313
+ end
3314
+ super
3315
+ end
3316
+
3317
+ # Do not attempt to split the result set into associations,
3318
+ # just return results as simple objects. This is useful if you
3319
+ # want to use eager_graph as a shortcut to have all of the joins
3320
+ # and aliasing set up, but want to do something else with the dataset.
3321
+ def ungraphed
3322
+ ds = super.clone(:eager_graph=>nil)
3323
+ if (eg = @opts[:eager_graph]) && (rp = eg[:row_proc])
3324
+ ds = ds.with_row_proc(rp)
3325
+ end
3326
+ ds
3327
+ end
3328
+
3329
+ protected
3330
+
3331
+ # Call graph on the association with the correct arguments,
3332
+ # update the eager_graph data structure, and recurse into
3333
+ # eager_graph_associations if there are any passed in associations
3334
+ # (which would be dependencies of the current association)
3335
+ #
3336
+ # Arguments:
3337
+ # ds :: Current dataset
3338
+ # model :: Current Model
3339
+ # ta :: table_alias used for the parent association
3340
+ # requirements :: an array, used as a stack for requirements
3341
+ # r :: association reflection for the current association, or an SQL::AliasedExpression
3342
+ # with the reflection as the expression, the alias base as the alias (or nil to
3343
+ # use the default alias), and an optional hash with a :join_type entry as the columns
3344
+ # to use a custom join type.
3345
+ # *associations :: any associations dependent on this one
3346
+ def eager_graph_association(ds, model, ta, requirements, r, *associations)
3347
+ if r.is_a?(SQL::AliasedExpression)
3348
+ alias_base = r.alias
3349
+ if r.columns.is_a?(Hash)
3350
+ join_type = r.columns[:join_type]
3351
+ end
3352
+ r = r.expression
3353
+ else
3354
+ alias_base = r[:graph_alias_base]
3355
+ end
3356
+ assoc_table_alias = ds.unused_table_alias(alias_base)
3357
+ loader = r[:eager_grapher]
3358
+ if !associations.empty?
3359
+ if associations.first.respond_to?(:call)
3360
+ callback = associations.first
3361
+ associations = {}
3362
+ elsif associations.length == 1 && (assocs = associations.first).is_a?(Hash) && assocs.length == 1 && (pr_assoc = assocs.to_a.first) && pr_assoc.first.respond_to?(:call)
3363
+ callback, assoc = pr_assoc
3364
+ associations = assoc.is_a?(Array) ? assoc : [assoc]
3365
+ end
3366
+ end
3367
+ local_opts = ds.opts[:eager_graph][:local]
3368
+ limit_strategy = r.eager_graph_limit_strategy(local_opts[:limit_strategy])
3369
+
3370
+ if r[:conditions] && !Sequel.condition_specifier?(r[:conditions]) && !r[:orig_opts].has_key?(:graph_conditions) && !r[:orig_opts].has_key?(:graph_only_conditions) && !r.has_key?(:graph_block)
3371
+ raise Error, "Cannot eager_graph association when :conditions specified and not a hash or an array of pairs. Specify :graph_conditions, :graph_only_conditions, or :graph_block for the association. Model: #{r[:model]}, association: #{r[:name]}"
3372
+ end
3373
+
3374
+ ds = loader.call(:self=>ds, :table_alias=>assoc_table_alias, :implicit_qualifier=>(ta == ds.opts[:eager_graph][:master]) ? first_source : qualifier_from_alias_symbol(ta, first_source), :callback=>callback, :join_type=>join_type || local_opts[:join_type], :join_only=>local_opts[:join_only], :limit_strategy=>limit_strategy, :from_self_alias=>ds.opts[:eager_graph][:master])
3375
+ if r[:order_eager_graph] && (order = r.fetch(:graph_order, r[:order]))
3376
+ ds = ds.order_append(*qualified_expression(order, assoc_table_alias))
3377
+ end
3378
+ eager_graph = ds.opts[:eager_graph]
3379
+ eager_graph[:requirements][assoc_table_alias] = requirements.dup
3380
+ eager_graph[:reflections][assoc_table_alias] = r
3381
+ if limit_strategy == :ruby
3382
+ eager_graph[:limits][assoc_table_alias] = r.limit_and_offset
3383
+ end
3384
+ eager_graph[:cartesian_product_number] += r[:cartesian_product_number] || 2
3385
+ ds = ds.eager_graph_associations(ds, r.associated_class, assoc_table_alias, requirements + [assoc_table_alias], *associations) unless associations.empty?
3386
+ ds
3387
+ end
3388
+
3389
+ # Check the associations are valid for the given model.
3390
+ # Call eager_graph_association on each association.
3391
+ #
3392
+ # Arguments:
3393
+ # ds :: Current dataset
3394
+ # model :: Current Model
3395
+ # ta :: table_alias used for the parent association
3396
+ # requirements :: an array, used as a stack for requirements
3397
+ # *associations :: the associations to add to the graph
3398
+ def eager_graph_associations(ds, model, ta, requirements, *associations)
3399
+ associations.flatten.each do |association|
3400
+ ds = case association
3401
+ when Symbol, SQL::AliasedExpression
3402
+ ds.eager_graph_association(ds, model, ta, requirements, eager_graph_check_association(model, association))
3403
+ when Hash
3404
+ association.each do |assoc, assoc_assocs|
3405
+ ds = ds.eager_graph_association(ds, model, ta, requirements, eager_graph_check_association(model, assoc), assoc_assocs)
3406
+ end
3407
+ ds
3408
+ else
3409
+ raise(Sequel::Error, 'Associations must be in the form of a symbol or hash')
3410
+ end
3411
+ end
3412
+ ds
3413
+ end
3414
+
3415
+ # Replace the array of plain hashes with an array of model objects will all eager_graphed
3416
+ # associations set in the associations cache for each object.
3417
+ def eager_graph_build_associations(hashes)
3418
+ hashes.replace(_eager_graph_build_associations(hashes, eager_graph_loader))
3419
+ end
3420
+
3421
+ private
3422
+
3423
+ # Return a new dataset with JOINs of the given type added, using the tables and
3424
+ # conditions specified by the associations.
3425
+ def _association_join(type, associations)
3426
+ clone(:join=>clone(:graph_from_self=>false).eager_graph_with_options(associations, :join_type=>type, :join_only=>true).opts[:join])
3427
+ end
3428
+
3429
+ # Process the array of hashes using the eager graph loader to return an array
3430
+ # of model objects with the associations set.
3431
+ def _eager_graph_build_associations(hashes, egl)
3432
+ egl.load(hashes)
3433
+ end
3434
+
3435
+ # If the association has conditions itself, then it requires additional filters be
3436
+ # added to the current dataset to ensure that the passed in object would also be
3437
+ # included by the association's conditions.
3438
+ def add_association_filter_conditions(ref, obj, expr)
3439
+ if expr != SQL::Constants::FALSE && ref.filter_by_associations_add_conditions?
3440
+ Sequel[ref.filter_by_associations_conditions_expression(obj)]
3441
+ else
3442
+ expr
3443
+ end
3444
+ end
3445
+
3446
+ # Process the array of associations arguments (Symbols, Arrays, and Hashes),
3447
+ # and return a hash of options suitable for cascading.
3448
+ def eager_options_for_associations(associations)
3449
+ opts = {}
3450
+ associations.flatten.each do |association|
3451
+ case association
3452
+ when Symbol
3453
+ check_association(model, association)
3454
+ opts[association] = nil
3455
+ when Hash
3456
+ association.keys.each{|assoc| check_association(model, assoc)}
3457
+ opts.merge!(association)
3458
+ else
3459
+ raise(Sequel::Error, 'Associations must be in the form of a symbol or hash')
3460
+ end
3461
+ end
3462
+ opts
3463
+ end
3464
+
3465
+ # Return an expression for filtering by the given association reflection and associated object.
3466
+ def association_filter_expression(op, ref, obj)
3467
+ meth = :"#{ref[:type]}_association_filter_expression"
3468
+ # Allow calling private association specific method to get filter expression
3469
+ send(meth, op, ref, obj) if respond_to?(meth, true)
3470
+ end
3471
+
3472
+ # Handle inversion for association filters by returning an inverted expression,
3473
+ # plus also handling cases where the referenced columns are NULL.
3474
+ def association_filter_handle_inversion(op, exp, cols)
3475
+ if op == :'!=' || op == :'NOT IN'
3476
+ if exp == SQL::Constants::FALSE
3477
+ ~exp
3478
+ else
3479
+ ~exp | Sequel::SQL::BooleanExpression.from_value_pairs(cols.zip([]), :OR)
3480
+ end
3481
+ else
3482
+ exp
3483
+ end
3484
+ end
3485
+
3486
+ # Return an expression for making sure that the given keys match the value of
3487
+ # the given methods for either the single object given or for any of the objects
3488
+ # given if +obj+ is an array.
3489
+ def association_filter_key_expression(keys, meths, obj)
3490
+ vals = if obj.is_a?(Sequel::Dataset)
3491
+ {(keys.length == 1 ? keys.first : keys)=>obj.select(*meths).exclude(Sequel::SQL::BooleanExpression.from_value_pairs(meths.zip([]), :OR))}
3492
+ else
3493
+ vals = Array(obj).reject{|o| !meths.all?{|m| o.get_column_value(m)}}
3494
+ return SQL::Constants::FALSE if vals.empty?
3495
+ if obj.is_a?(Array)
3496
+ if keys.length == 1
3497
+ meth = meths.first
3498
+ {keys.first=>vals.map{|o| o.get_column_value(meth)}}
3499
+ else
3500
+ {keys=>vals.map{|o| meths.map{|m| o.get_column_value(m)}}}
3501
+ end
3502
+ else
3503
+ keys.zip(meths.map{|k| obj.get_column_value(k)})
3504
+ end
3505
+ end
3506
+ SQL::BooleanExpression.from_value_pairs(vals)
3507
+ end
3508
+
3509
+ # Make sure the association is valid for this model, and return the related AssociationReflection.
3510
+ def check_association(model, association)
3511
+ raise(Sequel::UndefinedAssociation, "Invalid association #{association} for #{model.name}") unless reflection = model.association_reflection(association)
3512
+ raise(Sequel::Error, "Eager loading is not allowed for #{model.name} association #{association}") if reflection[:allow_eager] == false
3513
+ reflection
3514
+ end
3515
+
3516
+ # Allow associations that are eagerly graphed to be specified as an SQL::AliasedExpression, for
3517
+ # per-call determining of the alias base.
3518
+ def eager_graph_check_association(model, association)
3519
+ reflection = if association.is_a?(SQL::AliasedExpression)
3520
+ expr = association.expression
3521
+ if expr.is_a?(SQL::Identifier)
3522
+ expr = expr.value
3523
+ if expr.is_a?(String)
3524
+ expr = expr.to_sym
3525
+ end
3526
+ end
3527
+
3528
+ check_reflection = check_association(model, expr)
3529
+ SQL::AliasedExpression.new(check_reflection, association.alias || expr, association.columns)
3530
+ else
3531
+ check_reflection = check_association(model, association)
3532
+ end
3533
+
3534
+ if check_reflection && check_reflection[:allow_eager_graph] == false
3535
+ raise Error, "eager_graph not allowed for #{reflection.inspect}"
3536
+ end
3537
+
3538
+ reflection
3539
+ end
3540
+
3541
+ # The EagerGraphLoader instance used for converting eager_graph results.
3542
+ def eager_graph_loader
3543
+ unless egl = cache_get(:_model_eager_graph_loader)
3544
+ egl = cache_set(:_model_eager_graph_loader, EagerGraphLoader.new(self))
3545
+ end
3546
+ egl.dup
3547
+ end
3548
+
3549
+ # Eagerly load all specified associations.
3550
+ def eager_load(a, eager_assoc=@opts[:eager])
3551
+ return if a.empty?
3552
+
3553
+ # Reflections for all associations to eager load
3554
+ reflections = eager_assoc.keys.map{|assoc| model.association_reflection(assoc) || (raise Sequel::UndefinedAssociation, "Model: #{self}, Association: #{assoc}")}
3555
+
3556
+ perform_eager_loads(prepare_eager_load(a, reflections, eager_assoc))
3557
+
3558
+ reflections.each do |r|
3559
+ a.each{|object| object.send(:run_association_callbacks, r, :after_load, object.associations[r[:name]])} if r[:after_load]
3560
+ end
3561
+
3562
+ nil
3563
+ end
3564
+
3565
+ # Prepare a hash loaders and eager options which will be used to implement the eager loading.
3566
+ def prepare_eager_load(a, reflections, eager_assoc)
3567
+ eager_load_data = {}
3568
+
3569
+ # Key is foreign/primary key name symbol.
3570
+ # Value is hash with keys being foreign/primary key values (generally integers)
3571
+ # and values being an array of current model objects with that specific foreign/primary key
3572
+ key_hash = {}
3573
+
3574
+ # Populate the key_hash entry for each association being eagerly loaded
3575
+ reflections.each do |r|
3576
+ if key = r.eager_loader_key
3577
+ # key_hash for this key has already been populated,
3578
+ # skip populating again so that duplicate values
3579
+ # aren't added.
3580
+ unless id_map = key_hash[key]
3581
+ id_map = key_hash[key] = Hash.new{|h,k| h[k] = []}
3582
+
3583
+ # Supporting both single (Symbol) and composite (Array) keys.
3584
+ a.each do |rec|
3585
+ case key
3586
+ when Array
3587
+ if (k = key.map{|k2| rec.get_column_value(k2)}) && k.all?
3588
+ id_map[k] << rec
3589
+ end
3590
+ when Symbol
3591
+ if k = rec.get_column_value(key)
3592
+ id_map[k] << rec
3593
+ end
3594
+ else
3595
+ raise Error, "unhandled eager_loader_key #{key.inspect} for association #{r[:name]}"
3596
+ end
3597
+ end
3598
+ end
3599
+ else
3600
+ id_map = nil
3601
+ end
3602
+
3603
+ associations = eager_assoc[r[:name]]
3604
+ if associations.respond_to?(:call)
3605
+ eager_block = associations
3606
+ associations = OPTS
3607
+ elsif associations.is_a?(Hash) && associations.length == 1 && (pr_assoc = associations.to_a.first) && pr_assoc.first.respond_to?(:call)
3608
+ eager_block, associations = pr_assoc
3609
+ end
3610
+
3611
+ eager_load_data[r[:eager_loader]] = {:key_hash=>key_hash, :rows=>a, :associations=>associations, :self=>self, :eager_block=>eager_block, :id_map=>id_map}
3612
+ end
3613
+
3614
+ eager_load_data
3615
+ end
3616
+
3617
+ # Using the hash of loaders and eager options, perform the eager loading.
3618
+ def perform_eager_loads(eager_load_data)
3619
+ eager_load_data.map do |loader, eo|
3620
+ perform_eager_load(loader, eo)
3621
+ end
3622
+ end
3623
+
3624
+ # Perform eager loading for a single association using the loader and eager options.
3625
+ def perform_eager_load(loader, eo)
3626
+ loader.call(eo)
3627
+ end
3628
+
3629
+ # Return a subquery expression for filering by a many_to_many association
3630
+ def many_to_many_association_filter_expression(op, ref, obj)
3631
+ lpks, lks, rks = ref.values_at(:left_primary_key_columns, :left_keys, :right_keys)
3632
+ jt = ref.join_table_alias
3633
+ lpks = lpks.first if lpks.length == 1
3634
+ lpks = ref.qualify(model.table_name, lpks)
3635
+
3636
+ meths = if obj.is_a?(Sequel::Dataset)
3637
+ ref.qualify(obj.model.table_name, ref.right_primary_keys)
3638
+ else
3639
+ ref.right_primary_key_methods
3640
+ end
3641
+
3642
+ expr = association_filter_key_expression(ref.qualify(jt, rks), meths, obj)
3643
+ unless expr == SQL::Constants::FALSE
3644
+ expr = SQL::BooleanExpression.from_value_pairs(lpks=>model.db.from(ref[:join_table]).select(*ref.qualify(jt, lks)).where(expr).exclude(SQL::BooleanExpression.from_value_pairs(ref.qualify(jt, lks).zip([]), :OR)))
3645
+ expr = add_association_filter_conditions(ref, obj, expr)
3646
+ end
3647
+
3648
+ association_filter_handle_inversion(op, expr, Array(lpks))
3649
+ end
3650
+ alias one_through_one_association_filter_expression many_to_many_association_filter_expression
3651
+
3652
+ # Return a simple equality expression for filering by a many_to_one association
3653
+ def many_to_one_association_filter_expression(op, ref, obj)
3654
+ keys = ref.qualify(model.table_name, ref[:key_columns])
3655
+ meths = if obj.is_a?(Sequel::Dataset)
3656
+ ref.qualify(obj.model.table_name, ref.primary_keys)
3657
+ else
3658
+ ref.primary_key_methods
3659
+ end
3660
+
3661
+ expr = association_filter_key_expression(keys, meths, obj)
3662
+ expr = add_association_filter_conditions(ref, obj, expr)
3663
+ association_filter_handle_inversion(op, expr, keys)
3664
+ end
3665
+
3666
+ # Return a simple equality expression for filering by a one_to_* association
3667
+ def one_to_many_association_filter_expression(op, ref, obj)
3668
+ keys = ref.qualify(model.table_name, ref[:primary_key_columns])
3669
+ meths = if obj.is_a?(Sequel::Dataset)
3670
+ ref.qualify(obj.model.table_name, ref[:keys])
3671
+ else
3672
+ ref[:key_methods]
3673
+ end
3674
+
3675
+ expr = association_filter_key_expression(keys, meths, obj)
3676
+ expr = add_association_filter_conditions(ref, obj, expr)
3677
+ association_filter_handle_inversion(op, expr, keys)
3678
+ end
3679
+ alias one_to_one_association_filter_expression one_to_many_association_filter_expression
3680
+
3681
+ def non_sql_option?(key)
3682
+ super || key == :eager || key == :eager_graph
3683
+ end
3684
+
3685
+ # Build associations from the graph if #eager_graph was used,
3686
+ # and/or load other associations if #eager was used.
3687
+ def post_load(all_records)
3688
+ eager_graph_build_associations(all_records) if @opts[:eager_graph]
3689
+ eager_load(all_records) if @opts[:eager] && (row_proc || @opts[:eager_graph])
3690
+ super
3691
+ end
3692
+ end
3693
+
3694
+ # This class is the internal implementation of eager_graph. It is responsible for taking an array of plain
3695
+ # hashes and returning an array of model objects with all eager_graphed associations already set in the
3696
+ # association cache.
3697
+ class EagerGraphLoader
3698
+ # Hash with table alias symbol keys and after_load hook values
3699
+ attr_reader :after_load_map
3700
+
3701
+ # Hash with table alias symbol keys and association name values
3702
+ attr_reader :alias_map
3703
+
3704
+ # Hash with table alias symbol keys and subhash values mapping column_alias symbols to the
3705
+ # symbol of the real name of the column
3706
+ attr_reader :column_maps
3707
+
3708
+ # Recursive hash with table alias symbol keys mapping to hashes with dependent table alias symbol keys.
3709
+ attr_reader :dependency_map
3710
+
3711
+ # Hash with table alias symbol keys and [limit, offset] values
3712
+ attr_reader :limit_map
3713
+
3714
+ # The table alias symbol for the primary model
3715
+ attr_reader :master
3716
+
3717
+ # Hash with table alias symbol keys and primary key symbol values (or arrays of primary key symbols for
3718
+ # composite key tables)
3719
+ attr_reader :primary_keys
3720
+
3721
+ # Hash with table alias symbol keys and reciprocal association symbol values,
3722
+ # used for setting reciprocals for one_to_many associations.
3723
+ attr_reader :reciprocal_map
3724
+
3725
+ # Hash with table alias symbol keys and subhash values mapping primary key symbols (or array of symbols)
3726
+ # to model instances. Used so that only a single model instance is created for each object.
3727
+ attr_reader :records_map
3728
+
3729
+ # Hash with table alias symbol keys and AssociationReflection values
3730
+ attr_reader :reflection_map
3731
+
3732
+ # Hash with table alias symbol keys and callable values used to create model instances
3733
+ attr_reader :row_procs
3734
+
3735
+ # Hash with table alias symbol keys and true/false values, where true means the
3736
+ # association represented by the table alias uses an array of values instead of
3737
+ # a single value (i.e. true => *_many, false => *_to_one).
3738
+ attr_reader :type_map
3739
+
3740
+ # Initialize all of the data structures used during loading.
3741
+ def initialize(dataset)
3742
+ opts = dataset.opts
3743
+ eager_graph = opts[:eager_graph]
3744
+ @master = eager_graph[:master]
3745
+ requirements = eager_graph[:requirements]
3746
+ reflection_map = @reflection_map = eager_graph[:reflections]
3747
+ reciprocal_map = @reciprocal_map = eager_graph[:reciprocals]
3748
+ limit_map = @limit_map = eager_graph[:limits]
3749
+ @unique = eager_graph[:cartesian_product_number] > 1
3750
+
3751
+ alias_map = @alias_map = {}
3752
+ type_map = @type_map = {}
3753
+ after_load_map = @after_load_map = {}
3754
+ reflection_map.each do |k, v|
3755
+ alias_map[k] = v[:name]
3756
+ after_load_map[k] = v[:after_load] if v[:after_load]
3757
+ type_map[k] = if v.returns_array?
3758
+ true
3759
+ elsif (limit_and_offset = limit_map[k]) && !limit_and_offset.last.nil?
3760
+ :offset
3761
+ end
3762
+ end
3763
+ after_load_map.freeze
3764
+ alias_map.freeze
3765
+ type_map.freeze
3766
+
3767
+ # Make dependency map hash out of requirements array for each association.
3768
+ # This builds a tree of dependencies that will be used for recursion
3769
+ # to ensure that all parts of the object graph are loaded into the
3770
+ # appropriate subordinate association.
3771
+ dependency_map = @dependency_map = {}
3772
+ # Sort the associations by requirements length, so that
3773
+ # requirements are added to the dependency hash before their
3774
+ # dependencies.
3775
+ requirements.sort_by{|a| a[1].length}.each do |ta, deps|
3776
+ if deps.empty?
3777
+ dependency_map[ta] = {}
3778
+ else
3779
+ deps = deps.dup
3780
+ hash = dependency_map[deps.shift]
3781
+ deps.each do |dep|
3782
+ hash = hash[dep]
3783
+ end
3784
+ hash[ta] = {}
3785
+ end
3786
+ end
3787
+ freezer = lambda do |h|
3788
+ h.freeze
3789
+ h.each_value(&freezer)
3790
+ end
3791
+ freezer.call(dependency_map)
3792
+
3793
+ datasets = opts[:graph][:table_aliases].to_a.reject{|ta,ds| ds.nil?}
3794
+ column_aliases = opts[:graph][:column_aliases]
3795
+ primary_keys = {}
3796
+ column_maps = {}
3797
+ models = {}
3798
+ row_procs = {}
3799
+ datasets.each do |ta, ds|
3800
+ models[ta] = ds.model
3801
+ primary_keys[ta] = []
3802
+ column_maps[ta] = {}
3803
+ row_procs[ta] = ds.row_proc
3804
+ end
3805
+ column_aliases.each do |col_alias, tc|
3806
+ ta, column = tc
3807
+ column_maps[ta][col_alias] = column
3808
+ end
3809
+ column_maps.each do |ta, h|
3810
+ pk = models[ta].primary_key
3811
+ if pk.is_a?(Array)
3812
+ primary_keys[ta] = []
3813
+ h.select{|ca, c| primary_keys[ta] << ca if pk.include?(c)}
3814
+ else
3815
+ h.select{|ca, c| primary_keys[ta] = ca if pk == c}
3816
+ end
3817
+ end
3818
+ @column_maps = column_maps.freeze
3819
+ @primary_keys = primary_keys.freeze
3820
+ @row_procs = row_procs.freeze
3821
+
3822
+ # For performance, create two special maps for the master table,
3823
+ # so you can skip a hash lookup.
3824
+ @master_column_map = column_maps[master]
3825
+ @master_primary_keys = primary_keys[master]
3826
+
3827
+ # Add a special hash mapping table alias symbols to 5 element arrays that just
3828
+ # contain the data in other data structures for that table alias. This is
3829
+ # used for performance, to get all values in one hash lookup instead of
3830
+ # separate hash lookups for each data structure.
3831
+ ta_map = {}
3832
+ alias_map.each_key do |ta|
3833
+ ta_map[ta] = [row_procs[ta], alias_map[ta], type_map[ta], reciprocal_map[ta]].freeze
3834
+ end
3835
+ @ta_map = ta_map.freeze
3836
+ freeze
3837
+ end
3838
+
3839
+ # Return an array of primary model instances with the associations cache prepopulated
3840
+ # for all model objects (both primary and associated).
3841
+ def load(hashes)
3842
+ # This mapping is used to make sure that duplicate entries in the
3843
+ # result set are mapped to a single record. For example, using a
3844
+ # single one_to_many association with 10 associated records,
3845
+ # the main object column values appear in the object graph 10 times.
3846
+ # We map by primary key, if available, or by the object's entire values,
3847
+ # if not. The mapping must be per table, so create sub maps for each table
3848
+ # alias.
3849
+ @records_map = records_map = {}
3850
+ alias_map.keys.each{|ta| records_map[ta] = {}}
3851
+
3852
+ master = master()
3853
+
3854
+ # Assign to local variables for speed increase
3855
+ rp = row_procs[master]
3856
+ rm = records_map[master] = {}
3857
+ dm = dependency_map
3858
+
3859
+ records_map.freeze
3860
+
3861
+ # This will hold the final record set that we will be replacing the object graph with.
3862
+ records = []
3863
+
3864
+ hashes.each do |h|
3865
+ unless key = master_pk(h)
3866
+ key = hkey(master_hfor(h))
3867
+ end
3868
+ unless primary_record = rm[key]
3869
+ primary_record = rm[key] = rp.call(master_hfor(h))
3870
+ # Only add it to the list of records to return if it is a new record
3871
+ records.push(primary_record)
3872
+ end
3873
+ # Build all associations for the current object and it's dependencies
3874
+ _load(dm, primary_record, h)
3875
+ end
3876
+
3877
+ # Remove duplicate records from all associations if this graph could possibly be a cartesian product
3878
+ # Run after_load procs if there are any
3879
+ post_process(records, dm) if @unique || !after_load_map.empty? || !limit_map.empty?
3880
+
3881
+ records_map.each_value(&:freeze)
3882
+ freeze
3883
+
3884
+ records
3885
+ end
3886
+
3887
+ private
3888
+
3889
+ # Recursive method that creates associated model objects and associates them to the current model object.
3890
+ def _load(dependency_map, current, h)
3891
+ dependency_map.each do |ta, deps|
3892
+ unless key = pk(ta, h)
3893
+ ta_h = hfor(ta, h)
3894
+ unless ta_h.values.any?
3895
+ assoc_name = alias_map[ta]
3896
+ unless (assoc = current.associations).has_key?(assoc_name)
3897
+ assoc[assoc_name] = type_map[ta] ? [] : nil
3898
+ end
3899
+ next
3900
+ end
3901
+ key = hkey(ta_h)
3902
+ end
3903
+ rp, assoc_name, tm, rcm = @ta_map[ta]
3904
+ rm = records_map[ta]
3905
+
3906
+ # Check type map for all dependencies, and use a unique
3907
+ # object if any are dependencies for multiple objects,
3908
+ # to prevent duplicate objects from showing up in the case
3909
+ # the normal duplicate removal code is not being used.
3910
+ if !@unique && !deps.empty? && deps.any?{|dep_key,_| @ta_map[dep_key][2]}
3911
+ key = [current.object_id, key]
3912
+ end
3913
+
3914
+ unless rec = rm[key]
3915
+ rec = rm[key] = rp.call(hfor(ta, h))
3916
+ end
3917
+
3918
+ if tm
3919
+ unless (assoc = current.associations).has_key?(assoc_name)
3920
+ assoc[assoc_name] = []
3921
+ end
3922
+ assoc[assoc_name].push(rec)
3923
+ rec.associations[rcm] = current if rcm
3924
+ else
3925
+ current.associations[assoc_name] ||= rec
3926
+ end
3927
+ # Recurse into dependencies of the current object
3928
+ _load(deps, rec, h) unless deps.empty?
3929
+ end
3930
+ end
3931
+
3932
+ # Return the subhash for the specific table alias +ta+ by parsing the values out of the main hash +h+
3933
+ def hfor(ta, h)
3934
+ out = {}
3935
+ @column_maps[ta].each{|ca, c| out[c] = h[ca]}
3936
+ out
3937
+ end
3938
+
3939
+ # Return a suitable hash key for any subhash +h+, which is an array of values by column order.
3940
+ # This is only used if the primary key cannot be used.
3941
+ def hkey(h)
3942
+ h.sort_by{|x| x[0]}
3943
+ end
3944
+
3945
+ # Return the subhash for the master table by parsing the values out of the main hash +h+
3946
+ def master_hfor(h)
3947
+ out = {}
3948
+ @master_column_map.each{|ca, c| out[c] = h[ca]}
3949
+ out
3950
+ end
3951
+
3952
+ # Return a primary key value for the master table by parsing it out of the main hash +h+.
3953
+ def master_pk(h)
3954
+ x = @master_primary_keys
3955
+ if x.is_a?(Array)
3956
+ unless x == []
3957
+ x = x.map{|ca| h[ca]}
3958
+ x if x.all?
3959
+ end
3960
+ else
3961
+ h[x]
3962
+ end
3963
+ end
3964
+
3965
+ # Return a primary key value for the given table alias by parsing it out of the main hash +h+.
3966
+ def pk(ta, h)
3967
+ x = primary_keys[ta]
3968
+ if x.is_a?(Array)
3969
+ unless x == []
3970
+ x = x.map{|ca| h[ca]}
3971
+ x if x.all?
3972
+ end
3973
+ else
3974
+ h[x]
3975
+ end
3976
+ end
3977
+
3978
+ # If the result set is the result of a cartesian product, then it is possible that
3979
+ # there are multiple records for each association when there should only be one.
3980
+ # In that case, for each object in all associations loaded via +eager_graph+, run
3981
+ # uniq! on the association to make sure no duplicate records show up.
3982
+ # Note that this can cause legitimate duplicate records to be removed.
3983
+ def post_process(records, dependency_map)
3984
+ records.each do |record|
3985
+ dependency_map.each do |ta, deps|
3986
+ assoc_name = alias_map[ta]
3987
+ list = record.public_send(assoc_name)
3988
+ rec_list = if type_map[ta]
3989
+ list.uniq!
3990
+ if lo = limit_map[ta]
3991
+ limit, offset = lo
3992
+ offset ||= 0
3993
+ if type_map[ta] == :offset
3994
+ [record.associations[assoc_name] = list[offset]]
3995
+ else
3996
+ list.replace(list[(offset)..(limit ? (offset)+limit-1 : -1)] || [])
3997
+ end
3998
+ else
3999
+ list
4000
+ end
4001
+ elsif list
4002
+ [list]
4003
+ else
4004
+ []
4005
+ end
4006
+ record.send(:run_association_callbacks, reflection_map[ta], :after_load, list) if after_load_map[ta]
4007
+ post_process(rec_list, deps) if !rec_list.empty? && !deps.empty?
4008
+ end
4009
+ end
4010
+ end
4011
+ end
4012
+ end
4013
+ end
4014
+ end