sequel 4.36.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -1,565 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe Sequel::Model::Associations::AssociationReflection, "#associated_class" do
4
- before do
5
- @c = Class.new(Sequel::Model(:foo))
6
- class ::ParParent < Sequel::Model; end
7
- end
8
- after do
9
- Object.send(:remove_const, :ParParent)
10
- end
11
-
12
- it "should use the :class value if present" do
13
- @c.many_to_one :c, :class=>ParParent
14
- @c.association_reflection(:c).keys.must_include(:class)
15
- @c.association_reflection(:c).associated_class.must_equal ParParent
16
- end
17
-
18
- it "should figure out the class if the :class value is not present" do
19
- @c.many_to_one :c, :class=>'ParParent'
20
- @c.association_reflection(:c).keys.wont_include(:class)
21
- @c.association_reflection(:c).associated_class.must_equal ParParent
22
- end
23
-
24
- it "should respect :class_namespace option for specifying the namespace" do
25
- class ::ParParent
26
- class ParParent < Sequel::Model; end
27
- end
28
- ParParent.many_to_one :par_parent, :class=>'ParParent'
29
- ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent
30
- ParParent.many_to_one :par_parent, :class=>'ParParent', :class_namespace=>'ParParent'
31
- ParParent.association_reflection(:par_parent).associated_class.must_equal ParParent::ParParent
32
- end
33
- end
34
-
35
- describe Sequel::Model::Associations::AssociationReflection, "#primary_key" do
36
- before do
37
- @c = Class.new(Sequel::Model(:foo))
38
- class ::ParParent < Sequel::Model; end
39
- end
40
- after do
41
- Object.send(:remove_const, :ParParent)
42
- end
43
-
44
- it "should use the :primary_key value if present" do
45
- @c.many_to_one :c, :class=>ParParent, :primary_key=>:blah__blah
46
- @c.association_reflection(:c).keys.must_include(:primary_key)
47
- @c.association_reflection(:c).primary_key.must_equal :blah__blah
48
- end
49
-
50
- it "should use the associated table's primary key if :primary_key is not present" do
51
- @c.many_to_one :c, :class=>'ParParent'
52
- @c.association_reflection(:c).keys.wont_include(:primary_key)
53
- @c.association_reflection(:c).primary_key.must_equal :id
54
- end
55
- end
56
-
57
- describe Sequel::Model::Associations::AssociationReflection, "#reciprocal_type" do
58
- it "should include a specific type if only one matches" do
59
- c = Class.new(Sequel::Model(:a))
60
- c.one_to_many :cs, :class=>c, :key=>:c_id
61
- c.many_to_one :c, :class=>c, :key=>:c_id
62
- c.association_reflection(:c).send(:reciprocal_type).must_equal :one_to_many
63
- end
64
- end
65
-
66
- describe Sequel::Model::Associations::AssociationReflection, "#reciprocal" do
67
- before do
68
- class ::ParParent < Sequel::Model; end
69
- class ::ParParentTwo < Sequel::Model; end
70
- class ::ParParentThree < Sequel::Model; end
71
- end
72
- after do
73
- Object.send(:remove_const, :ParParent)
74
- Object.send(:remove_const, :ParParentTwo)
75
- Object.send(:remove_const, :ParParentThree)
76
- end
77
-
78
- it "should use the :reciprocal value if present" do
79
- @c = Class.new(Sequel::Model(:foo))
80
- @d = Class.new(Sequel::Model(:foo))
81
- @c.many_to_one :c, :class=>@d, :reciprocal=>:xx
82
- @c.association_reflection(:c).keys.must_include(:reciprocal)
83
- @c.association_reflection(:c).reciprocal.must_equal :xx
84
- end
85
-
86
- it "should not raise an error if some reciprocal associations have invalid associated classes" do
87
- @c = Class.new(Sequel::Model(:foo))
88
- @c.one_to_many :sadfakloasdfioas
89
- @c.many_to_one :c, :class=>@c
90
- @c.association_reflection(:c).reciprocal
91
- end
92
-
93
- it "should require the associated class is the current class to be a reciprocal" do
94
- ParParent.many_to_one :par_parent_two, :key=>:blah
95
- ParParent.many_to_one :par_parent_three, :key=>:blah
96
- ParParentTwo.one_to_many :par_parents, :key=>:blah
97
- ParParentThree.one_to_many :par_parents, :key=>:blah
98
-
99
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
100
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_three
101
-
102
- ParParent.many_to_many :par_parent_twos, :left_key=>:l, :right_key=>:r, :join_table=>:jt
103
- ParParent.many_to_many :par_parent_threes, :left_key=>:l, :right_key=>:r, :join_table=>:jt
104
- ParParentTwo.many_to_many :par_parents, :right_key=>:l, :left_key=>:r, :join_table=>:jt
105
- ParParentThree.many_to_many :par_parents, :right_key=>:l, :left_key=>:r, :join_table=>:jt
106
-
107
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_twos
108
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
109
- end
110
-
111
- it "should handle composite keys" do
112
- ParParent.many_to_one :par_parent_two, :key=>[:a, :b], :primary_key=>[:c, :b]
113
- ParParent.many_to_one :par_parent_three, :key=>[:d, :e], :primary_key=>[:c, :b]
114
- ParParentTwo.one_to_many :par_parents, :primary_key=>[:c, :b], :key=>[:a, :b]
115
- ParParentThree.one_to_many :par_parents, :primary_key=>[:c, :b], :key=>[:d, :e]
116
-
117
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
118
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_three
119
-
120
- ParParent.many_to_many :par_parent_twos, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:pl1, :pl2], :right_primary_key=>[:pr1, :pr2], :join_table=>:jt
121
- ParParent.many_to_many :par_parent_threes, :right_key=>[:l1, :l2], :left_key=>[:r1, :r2], :left_primary_key=>[:pl1, :pl2], :right_primary_key=>[:pr1, :pr2], :join_table=>:jt
122
- ParParentTwo.many_to_many :par_parents, :right_key=>[:l1, :l2], :left_key=>[:r1, :r2], :right_primary_key=>[:pl1, :pl2], :left_primary_key=>[:pr1, :pr2], :join_table=>:jt
123
- ParParentThree.many_to_many :par_parents, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :right_primary_key=>[:pl1, :pl2], :left_primary_key=>[:pr1, :pr2], :join_table=>:jt
124
-
125
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_twos
126
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
127
- end
128
-
129
- it "should figure out the reciprocal if the :reciprocal value is not present" do
130
- ParParent.many_to_one :par_parent_two
131
- ParParentTwo.one_to_many :par_parents
132
- ParParent.many_to_many :par_parent_threes
133
- ParParentThree.many_to_many :par_parents
134
-
135
- ParParent.association_reflection(:par_parent_two).keys.wont_include(:reciprocal)
136
- ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
137
- ParParentTwo.association_reflection(:par_parents).keys.wont_include(:reciprocal)
138
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
139
- ParParent.association_reflection(:par_parent_threes).keys.wont_include(:reciprocal)
140
- ParParent.association_reflection(:par_parent_threes).reciprocal.must_equal :par_parents
141
- ParParentThree.association_reflection(:par_parents).keys.wont_include(:reciprocal)
142
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
143
- end
144
-
145
- it "should handle ambiguous reciprocals where only one doesn't have conditions/blocks" do
146
- ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
147
- ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two, :conditions=>{:id=>:id}
148
- ParParentTwo.one_to_many :par_parents
149
- ParParent.many_to_many :par_parent_threes, :class=>ParParentThree, :right_key=>:par_parent_three_id
150
- ParParent.many_to_many :par_parent_threes2, :clone=>:par_parent_threes do |ds|
151
- ds
152
- end
153
- ParParentThree.many_to_many :par_parents
154
-
155
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
156
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
157
- end
158
-
159
- it "should handle ambiguous reciprocals where only one has matching primary keys" do
160
- ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
161
- ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two, :primary_key=>:foo
162
- ParParentTwo.one_to_many :par_parents, :class=>ParParent, :key=>:par_parent_two_id
163
- ParParentTwo.one_to_many :par_parents2, :clone=>:par_parents, :primary_key=>:foo
164
- ParParent.many_to_many :par_parent_threes, :class=>ParParentThree, :right_key=>:par_parent_three_id
165
- ParParent.many_to_many :par_parent_threes2, :clone=>:par_parent_threes, :right_primary_key=>:foo
166
- ParParent.many_to_many :par_parent_threes3, :clone=>:par_parent_threes, :left_primary_key=>:foo
167
- ParParentThree.many_to_many :par_parents
168
-
169
- ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
170
- ParParent.association_reflection(:par_parent_two2).reciprocal.must_equal :par_parents2
171
- ParParentTwo.association_reflection(:par_parents).reciprocal.must_equal :par_parent_two
172
- ParParentTwo.association_reflection(:par_parents2).reciprocal.must_equal :par_parent_two2
173
- ParParentThree.association_reflection(:par_parents).reciprocal.must_equal :par_parent_threes
174
- end
175
-
176
- it "should handle reciprocals where current association has conditions/block" do
177
- ParParent.many_to_one :par_parent_two, :conditions=>{:id=>:id}
178
- ParParentTwo.one_to_many :par_parents
179
- ParParent.many_to_many :par_parent_threes do |ds|
180
- ds
181
- end
182
- ParParentThree.many_to_many :par_parents
183
-
184
- ParParent.association_reflection(:par_parent_two).reciprocal.must_equal :par_parents
185
- ParParent.association_reflection(:par_parent_threes).reciprocal.must_equal :par_parents
186
- end
187
- end
188
-
189
- describe Sequel::Model::Associations::AssociationReflection, "#select" do
190
- before do
191
- @c = Class.new(Sequel::Model(:foo))
192
- class ::ParParent < Sequel::Model; end
193
- end
194
- after do
195
- Object.send(:remove_const, :ParParent)
196
- end
197
-
198
- it "should use the :select value if present" do
199
- @c.many_to_one :c, :class=>ParParent, :select=>[:par_parents__id]
200
- @c.association_reflection(:c).keys.must_include(:select)
201
- @c.association_reflection(:c).select.must_equal [:par_parents__id]
202
- end
203
- it "should be the associated_table.* if :select is not present for a many_to_many associaiton" do
204
- @c.many_to_many :cs, :class=>'ParParent'
205
- @c.association_reflection(:cs).keys.wont_include(:select)
206
- @c.association_reflection(:cs).select.must_equal Sequel::SQL::ColumnAll.new(:par_parents)
207
- end
208
- it "should be blank if :select is not present for a many_to_one and one_to_many associaiton" do
209
- @c.one_to_many :cs, :class=>'ParParent'
210
- @c.association_reflection(:cs).keys.wont_include(:select)
211
- @c.association_reflection(:cs).select.must_equal nil
212
- @c.many_to_one :c, :class=>'ParParent'
213
- @c.association_reflection(:c).keys.wont_include(:select)
214
- @c.association_reflection(:c).select.must_equal nil
215
- end
216
- end
217
-
218
- describe Sequel::Model::Associations::AssociationReflection, "#can_have_associated_objects?" do
219
- it "should be true for any given object (for backward compatibility)" do
220
- Sequel::Model::Associations::AssociationReflection.new.can_have_associated_objects?(Object.new).must_equal true
221
- end
222
- end
223
-
224
- describe Sequel::Model::Associations::AssociationReflection, "#associated_object_keys" do
225
- before do
226
- @c = Class.new(Sequel::Model(:foo))
227
- class ::ParParent < Sequel::Model; end
228
- end
229
- after do
230
- Object.send(:remove_const, :ParParent)
231
- end
232
-
233
- it "should use the primary keys for a many_to_one association" do
234
- @c.many_to_one :c, :class=>ParParent
235
- @c.association_reflection(:c).associated_object_keys.must_equal [:id]
236
- @c.many_to_one :c, :class=>ParParent, :primary_key=>:d_id
237
- @c.association_reflection(:c).associated_object_keys.must_equal [:d_id]
238
- @c.many_to_one :c, :class=>ParParent, :key=>[:c_id1, :c_id2], :primary_key=>[:id1, :id2]
239
- @c.association_reflection(:c).associated_object_keys.must_equal [:id1, :id2]
240
- end
241
- it "should use the keys for a one_to_many association" do
242
- ParParent.one_to_many :cs, :class=>ParParent
243
- ParParent.association_reflection(:cs).associated_object_keys.must_equal [:par_parent_id]
244
- @c.one_to_many :cs, :class=>ParParent, :key=>:d_id
245
- @c.association_reflection(:cs).associated_object_keys.must_equal [:d_id]
246
- @c.one_to_many :cs, :class=>ParParent, :key=>[:c_id1, :c_id2], :primary_key=>[:id1, :id2]
247
- @c.association_reflection(:cs).associated_object_keys.must_equal [:c_id1, :c_id2]
248
- end
249
- it "should use the right primary keys for a many_to_many association" do
250
- @c.many_to_many :cs, :class=>ParParent
251
- @c.association_reflection(:cs).associated_object_keys.must_equal [:id]
252
- @c.many_to_many :cs, :class=>ParParent, :right_primary_key=>:d_id
253
- @c.association_reflection(:cs).associated_object_keys.must_equal [:d_id]
254
- @c.many_to_many :cs, :class=>ParParent, :right_key=>[:c_id1, :c_id2], :right_primary_key=>[:id1, :id2]
255
- @c.association_reflection(:cs).associated_object_keys.must_equal [:id1, :id2]
256
- end
257
- end
258
-
259
- describe Sequel::Model::Associations::AssociationReflection do
260
- before do
261
- @c = Class.new(Sequel::Model(:foo))
262
- def @c.name() "C" end
263
- end
264
-
265
- it "#eager_loading_predicate_key should be an alias of predicate_key for backwards compatibility" do
266
- @c.one_to_many :cs, :class=>@c
267
- @c.dataset.literal(@c.association_reflection(:cs).eager_loading_predicate_key).must_equal 'foo.c_id'
268
- end
269
-
270
- it "one_to_many #qualified_primary_key should be a qualified version of the primary key" do
271
- @c.one_to_many :cs, :class=>@c
272
- @c.dataset.literal(@c.association_reflection(:cs).qualified_primary_key).must_equal 'foo.id'
273
- end
274
-
275
- it "many_to_many #associated_key_column should be the left key" do
276
- @c.many_to_many :cs, :class=>@c
277
- @c.association_reflection(:cs).associated_key_column.must_equal :c_id
278
- end
279
-
280
- it "many_to_many #qualified_right_key should be a qualified version of the primary key" do
281
- @c.many_to_many :cs, :class=>@c, :right_key=>:c2_id
282
- @c.dataset.literal(@c.association_reflection(:cs).qualified_right_key).must_equal 'cs_cs.c2_id'
283
- end
284
-
285
- it "many_to_many #qualified_right_primary_key should be a qualified version of the primary key" do
286
- @c.many_to_many :cs, :class=>@c
287
- @c.dataset.literal(@c.association_reflection(:cs).qualified_right_primary_key).must_equal 'foo.id'
288
- end
289
- end
290
-
291
- describe Sequel::Model::Associations::AssociationReflection, "#remove_before_destroy?" do
292
- before do
293
- @c = Class.new(Sequel::Model(:foo))
294
- end
295
-
296
- it "should be true for many_to_one and many_to_many associations" do
297
- @c.many_to_one :c, :class=>@c
298
- @c.association_reflection(:c).remove_before_destroy?.must_equal true
299
- @c.many_to_many :cs, :class=>@c
300
- @c.association_reflection(:cs).remove_before_destroy?.must_equal true
301
- end
302
-
303
- it "should be false for one_to_one and one_to_many associations" do
304
- @c.one_to_one :c, :class=>@c
305
- @c.association_reflection(:c).remove_before_destroy?.must_equal false
306
- @c.one_to_many :cs, :class=>@c
307
- @c.association_reflection(:cs).remove_before_destroy?.must_equal false
308
- end
309
- end
310
-
311
- describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associations_limit_strategy" do
312
- before do
313
- @db = Sequel.mock
314
- @c = Class.new(Sequel::Model(@db[:a]))
315
- end
316
- after do
317
- Sequel::Model.default_eager_limit_strategy = true
318
- end
319
-
320
- it "should be nil by default for *_one associations" do
321
- @c.many_to_one :c, :class=>@c
322
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
323
- @c.one_to_one :c, :class=>@c
324
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
325
- @c.one_through_one :c, :class=>@c
326
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
327
- end
328
-
329
- it "should be :correlated_subquery by default for one_to_many and one_to_one with :order associations" do
330
- @c.one_to_one :c, :class=>@c, :order=>:a
331
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
332
- @c.one_to_many :cs, :class=>@c, :limit=>1
333
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
334
- end
335
-
336
- it "should be :ruby by default for many_to_many and one_through_one with :order associations" do
337
- @c.one_through_one :c, :class=>@c, :order=>:a
338
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :ruby
339
- @c.many_to_many :cs, :class=>@c, :limit=>1
340
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
341
- end
342
-
343
- it "should be nil for many_to_one associations even if :eager_limit_strategy or :filter_limit_strategy is used" do
344
- @c.many_to_one :c, :class=>@c, :eager_limit_strategy=>true
345
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
346
- @c.many_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
347
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
348
- @c.many_to_one :c, :class=>@c, :filter_limit_strategy=>true
349
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
350
- end
351
-
352
- it "should be a symbol for other associations if given a symbol" do
353
- @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
354
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :distinct_on
355
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>:window_function, :limit=>1
356
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
357
- end
358
-
359
- it "should use :distinct_on for one_to_one associations if picking and the association dataset supports ordered distinct on" do
360
- def (@c.dataset).supports_ordered_distinct_on?() true end
361
- @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
362
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :distinct_on
363
- end
364
-
365
- it "should use :window_function for associations if picking and the association dataset supports window functions" do
366
- def (@c.dataset).supports_window_functions?() true end
367
- @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
368
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :window_function
369
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
370
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
371
- @c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
372
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
373
- end
374
-
375
- it "should use :ruby for one_to_many associations if the database doesn't support limits in subqueries" do
376
- def (@c.dataset).supports_limits_in_correlated_subqueries?; false; end
377
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
378
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
379
- end
380
-
381
- it "should use :ruby for one_to_many associations if offset doesn't work in correlated subqueries and an offset is used" do
382
- def (@c.dataset).supports_offsets_in_correlated_subqueries?; false; end
383
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
384
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
385
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>[1, 1]
386
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
387
- end
388
-
389
- it "should use :ruby for one_to_many associations if composite primary key is used and database does not multiple columns in IN" do
390
- def (@c.dataset).supports_multiple_column_in?; false; end
391
- @c.set_primary_key [:id, :id2]
392
- @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1, :key=>[:id, :id2]
393
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
394
- end
395
-
396
- it "should use :ruby for many_to_many associations if picking and the association dataset doesn't window functions" do
397
- @c.many_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
398
- @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
399
- end
400
-
401
- it "should respect Model.default_eager_limit_strategy to *_many associations" do
402
- Sequel::Model.default_eager_limit_strategy = :window_function
403
- Sequel::Model.default_eager_limit_strategy.must_equal :window_function
404
- c = Class.new(Sequel::Model)
405
- c.dataset = :a
406
- c.default_eager_limit_strategy.must_equal :window_function
407
- c.one_to_many :cs, :class=>c, :limit=>1
408
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
409
- c.many_to_many :cs, :class=>c, :limit=>1
410
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
411
-
412
- Sequel::Model.default_eager_limit_strategy = true
413
- c = Class.new(Sequel::Model)
414
- c.dataset = :a
415
- c.one_to_many :cs, :class=>c, :limit=>1
416
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
417
- def (c.dataset).supports_window_functions?() true end
418
- c.many_to_many :cs, :class=>c, :limit=>1
419
- c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
420
- end
421
-
422
- it "should ignore Model.default_eager_limit_strategy for one_to_one associations" do
423
- @c.default_eager_limit_strategy = :window_function
424
- @c.one_to_one :c, :class=>@c
425
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
426
- end
427
- end
428
-
429
- describe Sequel::Model::Associations::AssociationReflection, "#apply_eager_dataset_changes" do
430
- it "should apply the eager block as well as the association options to the dataset" do
431
- @c = Class.new(Sequel::Model(:foo))
432
- @c.one_to_many :cs, :class=>@c, :select=>:a, :order=>:b do |ds| ds.where(:c) end
433
- @c.association_reflection(:cs).apply_eager_dataset_changes(@c.dataset).sql.must_equal 'SELECT a FROM foo WHERE c ORDER BY b'
434
- end
435
- end
436
-
437
- describe Sequel::Model, " association reflection methods" do
438
- before do
439
- @c1 = Class.new(Sequel::Model(:nodes)) do
440
- def self.name; 'Node'; end
441
- def self.to_s; 'Node'; end
442
- end
443
- DB.reset
444
- end
445
-
446
- it "#all_association_reflections should include all association reflection hashes" do
447
- @c1.all_association_reflections.must_equal []
448
-
449
- @c1.associate :many_to_one, :parent, :class => @c1
450
- @c1.all_association_reflections.collect{|v| v[:name]}.must_equal [:parent]
451
- @c1.all_association_reflections.collect{|v| v[:type]}.must_equal [:many_to_one]
452
- @c1.all_association_reflections.collect{|v| v[:class]}.must_equal [@c1]
453
-
454
- @c1.associate :one_to_many, :children, :class => @c1
455
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}
456
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:name]}.must_equal [:children, :parent]
457
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:type]}.must_equal [:one_to_many, :many_to_one]
458
- @c1.all_association_reflections.sort_by{|x|x[:name].to_s}.collect{|v| v[:class]}.must_equal [@c1, @c1]
459
- end
460
-
461
- it "#association_reflection should return nil for nonexistent association" do
462
- @c1.association_reflection(:blah).must_equal nil
463
- end
464
-
465
- it "#association_reflection should return association reflection hash if association exists" do
466
- @c1.associate :many_to_one, :parent, :class => @c1
467
- @c1.association_reflection(:parent).must_be_kind_of(Sequel::Model::Associations::AssociationReflection)
468
- @c1.association_reflection(:parent)[:name].must_equal :parent
469
- @c1.association_reflection(:parent)[:type].must_equal :many_to_one
470
- @c1.association_reflection(:parent)[:class].must_equal @c1
471
-
472
- @c1.associate :one_to_many, :children, :class => @c1
473
- @c1.association_reflection(:children).must_be_kind_of(Sequel::Model::Associations::AssociationReflection)
474
- @c1.association_reflection(:children)[:name].must_equal :children
475
- @c1.association_reflection(:children)[:type].must_equal :one_to_many
476
- @c1.association_reflection(:children)[:class].must_equal @c1
477
- end
478
-
479
- it "#associations should include all association names" do
480
- @c1.associations.must_equal []
481
- @c1.associate :many_to_one, :parent, :class => @c1
482
- @c1.associations.must_equal [:parent]
483
- @c1.associate :one_to_many, :children, :class => @c1
484
- @c1.associations.sort_by{|x|x.to_s}.must_equal [:children, :parent]
485
- end
486
-
487
- it "association reflections should be copied upon subclasing" do
488
- @c1.associate :many_to_one, :parent, :class => @c1
489
- c = Class.new(@c1)
490
- @c1.associations.must_equal [:parent]
491
- c.associations.must_equal [:parent]
492
- c.associate :many_to_one, :parent2, :class => @c1
493
- @c1.associations.must_equal [:parent]
494
- c.associations.sort_by{|x| x.to_s}.must_equal [:parent, :parent2]
495
- c.instance_methods.map{|x| x.to_s}.must_include('parent')
496
- end
497
- end
498
-
499
- describe Sequel::Model::Associations::AssociationReflection, "with caching disabled" do
500
- before do
501
- @db = Sequel.mock
502
- @c = Class.new(Sequel::Model)
503
- @c.dataset = @db[:foo]
504
- @c.cache_associations = false
505
- end
506
-
507
- it "should not cache metadata" do
508
- begin
509
- class ::ParParent < Sequel::Model; end
510
- c = ParParent
511
- @c.many_to_one :c, :class=>:ParParent
512
- @c.association_reflection(:c).associated_class.must_equal c
513
- Object.send(:remove_const, :ParParent)
514
- class ::ParParent < Sequel::Model; end
515
- c = ParParent
516
- @c.association_reflection(:c).associated_class.must_equal c
517
- ensure
518
- Object.send(:remove_const, :ParParent)
519
- end
520
- end
521
-
522
- it "should not used cached schema" do
523
- def @db.supports_schema_parsing?; true end
524
- def @db.schema(table, opts={})
525
- [[opts[:reload] ? :reload : :id, {}]]
526
- end
527
- @c.dataset = @db[:items]
528
- @c.columns.must_equal [:reload]
529
-
530
- @c.cache_associations = true
531
- @c.dataset = @db[:items]
532
- @c.columns.must_equal [:id]
533
- end
534
- end
535
-
536
- describe Sequel::Model::Associations::AssociationReflection, "with default association options" do
537
- before do
538
- @db = Sequel.mock
539
- @c = Class.new(Sequel::Model)
540
- @c.dataset = @db[:foo]
541
- end
542
-
543
- it "should use default_association_options as defaults" do
544
- @c.default_association_options = {:foo=>1, :bar=>2}
545
- @c.many_to_one :c, :class=>@c, :foo=>3
546
- r = @c.association_reflection(:c)
547
- r[:foo].must_equal 3
548
- r[:bar].must_equal 2
549
- end
550
-
551
- it "should inherit default_association_options" do
552
- @c.default_association_options = {:foo=>1, :bar=>2}
553
- c = Class.new(@c)
554
- c.many_to_one :c, :class=>c, :foo=>3
555
- r = c.association_reflection(:c)
556
- r[:foo].must_equal 3
557
- r[:bar].must_equal 2
558
-
559
- @c.default_association_options[:bar] = 4
560
- c.many_to_one :d, :class=>c, :foo=>3
561
- r = c.association_reflection(:d)
562
- r[:foo].must_equal 3
563
- r[:bar].must_equal 2
564
- end
565
- end