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,687 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
-
3
- describe "Eagerly loading a tree structure" do
4
- before(:all) do
5
- DB.instance_variable_set(:@schemas, {})
6
- DB.create_table!(:nodes) do
7
- primary_key :id
8
- foreign_key :parent_id, :nodes
9
- end
10
- class ::Node < Sequel::Model
11
- many_to_one :parent
12
- one_to_many :children, :key=>:parent_id
13
-
14
- # Only useful when eager loading
15
- many_to_one :ancestors, :eager_loader_key=>nil, :eager_loader=>(proc do |eo|
16
- # Handle cases where the root node has the same parent_id as primary_key
17
- # and also when it is NULL
18
- non_root_nodes = eo[:rows].reject do |n|
19
- if [nil, n.pk].include?(n.parent_id)
20
- # Make sure root nodes have their parent association set to nil
21
- n.associations[:parent] = nil
22
- true
23
- else
24
- false
25
- end
26
- end
27
- unless non_root_nodes.empty?
28
- id_map = {}
29
- # Create an map of parent_ids to nodes that have that parent id
30
- non_root_nodes.each{|n| (id_map[n.parent_id] ||= []) << n}
31
- # Doesn't cause an infinte loop, because when only the root node
32
- # is left, this is not called.
33
- Node.filter(Node.primary_key=>id_map.keys.sort).eager(:ancestors).all do |node|
34
- # Populate the parent association for each node
35
- id_map[node.pk].each{|n| n.associations[:parent] = node}
36
- end
37
- end
38
- end)
39
- many_to_one :descendants, :eager_loader_key=>nil, :eager_loader=>(proc do |eo|
40
- id_map = {}
41
- eo[:rows].each do |n|
42
- # Initialize an empty array of child associations for each parent node
43
- n.associations[:children] = []
44
- # Populate identity map of nodes
45
- id_map[n.pk] = n
46
- end
47
- # Doesn't cause an infinite loop, because the :eager_loader is not called
48
- # if no records are returned. Exclude id = parent_id to avoid infinite loop
49
- # if the root note is one of the returned records and it has parent_id = id
50
- # instead of parent_id = NULL.
51
- Node.filter(:parent_id=>id_map.keys.sort).exclude(:id=>:parent_id).eager(:descendants).all do |node|
52
- # Get the parent from the identity map
53
- parent = id_map[node.parent_id]
54
- # Set the child's parent association to the parent
55
- node.associations[:parent] = parent
56
- # Add the child association to the array of children in the parent
57
- parent.associations[:children] << node
58
- end
59
- end)
60
- end
61
-
62
- Node.insert(:parent_id=>1)
63
- Node.insert(:parent_id=>1)
64
- Node.insert(:parent_id=>1)
65
- Node.insert(:parent_id=>2)
66
- Node.insert(:parent_id=>4)
67
- Node.insert(:parent_id=>5)
68
- Node.insert(:parent_id=>6)
69
- end
70
- after(:all) do
71
- DB.drop_table :nodes
72
- Object.send(:remove_const, :Node)
73
- end
74
-
75
- it "#descendants should get all descendants in one call" do
76
- nodes = Node.filter(:id=>1).eager(:descendants).all
77
- nodes.length.must_equal 1
78
- node = nodes.first
79
- node.pk.must_equal 1
80
- node.children.length.must_equal 2
81
- node.children.collect{|x| x.pk}.sort.must_equal [2, 3]
82
- node.children.collect{|x| x.parent}.must_equal [node, node]
83
- node = nodes.first.children.find{|x| x.pk == 2}
84
- node.children.length.must_equal 1
85
- node.children.first.pk.must_equal 4
86
- node.children.first.parent.must_equal node
87
- node = node.children.first
88
- node.children.length.must_equal 1
89
- node.children.first.pk.must_equal 5
90
- node.children.first.parent.must_equal node
91
- node = node.children.first
92
- node.children.length.must_equal 1
93
- node.children.first.pk.must_equal 6
94
- node.children.first.parent.must_equal node
95
- node = node.children.first
96
- node.children.length.must_equal 1
97
- node.children.first.pk.must_equal 7
98
- node.children.first.parent.must_equal node
99
- end
100
-
101
- it "#ancestors should get all ancestors in one call" do
102
- nodes = Node.filter(:id=>[7,3]).order(:id).eager(:ancestors).all
103
- nodes.length.must_equal 2
104
- nodes.collect{|x| x.pk}.must_equal [3, 7]
105
- nodes.first.parent.pk.must_equal 1
106
- nodes.first.parent.parent.must_equal nil
107
- node = nodes.last
108
- node.parent.pk.must_equal 6
109
- node = node.parent
110
- node.parent.pk.must_equal 5
111
- node = node.parent
112
- node.parent.pk.must_equal 4
113
- node = node.parent
114
- node.parent.pk.must_equal 2
115
- node = node.parent
116
- node.parent.pk.must_equal 1
117
- node.parent.parent.must_equal nil
118
- end
119
- end
120
-
121
- describe "Association Extensions" do
122
- before do
123
- module ::FindOrCreate
124
- def find_or_create(vals)
125
- first(vals) || model.create(vals.merge(:author_id=>model_object.pk))
126
- end
127
- def find_or_create_by_name(name)
128
- first(:name=>name) || model.create(:name=>name, :author_id=>model_object.pk)
129
- end
130
- end
131
- DB.instance_variable_set(:@schemas, {})
132
- DB.create_table!(:authors) do
133
- primary_key :id
134
- end
135
- class ::Author < Sequel::Model
136
- one_to_many :authorships, :extend=>FindOrCreate
137
- end
138
- DB.create_table!(:authorships) do
139
- primary_key :id
140
- foreign_key :author_id, :authors
141
- String :name
142
- end
143
- class ::Authorship < Sequel::Model
144
- many_to_one :author
145
- end
146
- @author = Author.create
147
- end
148
- after do
149
- DB.drop_table :authorships, :authors
150
- Object.send(:remove_const, :Author)
151
- Object.send(:remove_const, :Authorship)
152
- end
153
-
154
- it "should allow methods to be called on the dataset method" do
155
- Authorship.count.must_equal 0
156
- authorship = @author.authorships_dataset.find_or_create_by_name('Bob')
157
- Authorship.count.must_equal 1
158
- Authorship.first.must_equal authorship
159
- authorship.name.must_equal 'Bob'
160
- authorship.author_id.must_equal @author.id
161
- @author.authorships_dataset.find_or_create_by_name('Bob').must_equal authorship
162
- Authorship.count.must_equal 1
163
- authorship2 = @author.authorships_dataset.find_or_create(:name=>'Jim')
164
- Authorship.count.must_equal 2
165
- Authorship.order(:name).map(:name).must_equal ['Bob', 'Jim']
166
- authorship2.name.must_equal 'Jim'
167
- authorship2.author_id.must_equal @author.id
168
- @author.authorships_dataset.find_or_create(:name=>'Jim').must_equal authorship2
169
- end
170
- end
171
-
172
- describe "has_many :through has_many and has_one :through belongs_to" do
173
- before(:all) do
174
- DB.instance_variable_set(:@schemas, {})
175
- DB.create_table!(:firms) do
176
- primary_key :id
177
- end
178
- class ::Firm < Sequel::Model
179
- one_to_many :clients
180
- one_to_many :invoices, :read_only=>true, \
181
- :dataset=>proc{Invoice.eager_graph(:client).filter(:client__firm_id=>pk)}, \
182
- :after_load=>(proc do |firm, invs|
183
- invs.each do |inv|
184
- inv.client.associations[:firm] = inv.associations[:firm] = firm
185
- end
186
- end), \
187
- :eager_loader=>(proc do |eo|
188
- id_map = eo[:id_map]
189
- eo[:rows].each{|firm| firm.associations[:invoices] = []}
190
- Invoice.eager_graph(:client).filter(:client__firm_id=>id_map.keys).all do |inv|
191
- id_map[inv.client.firm_id].each do |firm|
192
- firm.associations[:invoices] << inv
193
- end
194
- end
195
- end)
196
- end
197
-
198
- DB.create_table!(:clients) do
199
- primary_key :id
200
- foreign_key :firm_id, :firms
201
- end
202
- class ::Client < Sequel::Model
203
- many_to_one :firm
204
- one_to_many :invoices
205
- end
206
-
207
- DB.create_table!(:invoices) do
208
- primary_key :id
209
- foreign_key :client_id, :clients
210
- end
211
- class ::Invoice < Sequel::Model
212
- many_to_one :client
213
- many_to_one :firm, :key=>nil, :read_only=>true, \
214
- :dataset=>proc{Firm.eager_graph(:clients).filter(:clients__id=>client_id)}, \
215
- :after_load=>(proc do |inv, firm|
216
- # Delete the cached associations from firm, because it only has the
217
- # client with this invoice, instead of all clients of the firm
218
- if c = firm.associations.delete(:clients)
219
- firm.associations[:invoice_client] = c.first
220
- end
221
- inv.associations[:client] ||= firm.associations[:invoice_client]
222
- end), \
223
- :eager_loader=>(proc do |eo|
224
- id_map = {}
225
- eo[:rows].each do |inv|
226
- inv.associations[:firm] = nil
227
- (id_map[inv.client_id] ||= []) << inv
228
- end
229
- Firm.eager_graph(:clients).filter(:clients__id=>id_map.keys).all do |firm|
230
- # Delete the cached associations from firm, because it only has the
231
- # clients related the invoices being eagerly loaded, instead of all
232
- # clients of the firm.
233
- firm.associations[:clients].each do |client|
234
- id_map[client.pk].each do |inv|
235
- inv.associations[:firm] = firm
236
- inv.associations[:client] = client
237
- end
238
- end
239
- end
240
- end)
241
- end
242
- @firm1 = Firm.create
243
- @firm2 = Firm.create
244
- @client1 = Client.create(:firm => @firm1)
245
- @client2 = Client.create(:firm => @firm1)
246
- @client3 = Client.create(:firm => @firm2)
247
- @invoice1 = Invoice.create(:client => @client1)
248
- @invoice2 = Invoice.create(:client => @client1)
249
- @invoice3 = Invoice.create(:client => @client2)
250
- @invoice4 = Invoice.create(:client => @client3)
251
- @invoice5 = Invoice.create(:client => @client3)
252
- end
253
- after(:all) do
254
- DB.drop_table :invoices, :clients, :firms
255
- Object.send(:remove_const, :Firm)
256
- Object.send(:remove_const, :Client)
257
- Object.send(:remove_const, :Invoice)
258
- end
259
-
260
- it "should return has_many :through has_many records for a single object" do
261
- invs = @firm1.invoices.sort_by{|x| x.pk}
262
- invs.must_equal [@invoice1, @invoice2, @invoice3]
263
- invs[0].client.must_equal @client1
264
- invs[1].client.must_equal @client1
265
- invs[2].client.must_equal @client2
266
- invs.collect{|i| i.firm}.must_equal [@firm1, @firm1, @firm1]
267
- invs.collect{|i| i.client.firm}.must_equal [@firm1, @firm1, @firm1]
268
- end
269
-
270
- it "should eagerly load has_many :through has_many records for multiple objects" do
271
- firms = Firm.order(:id).eager(:invoices).all
272
- firms.must_equal [@firm1, @firm2]
273
- firm1, firm2 = firms
274
- invs1 = firm1.invoices.sort_by{|x| x.pk}
275
- invs2 = firm2.invoices.sort_by{|x| x.pk}
276
- invs1.must_equal [@invoice1, @invoice2, @invoice3]
277
- invs2.must_equal [@invoice4, @invoice5]
278
- invs1[0].client.must_equal @client1
279
- invs1[1].client.must_equal @client1
280
- invs1[2].client.must_equal @client2
281
- invs2[0].client.must_equal @client3
282
- invs2[1].client.must_equal @client3
283
- invs1.collect{|i| i.firm}.must_equal [@firm1, @firm1, @firm1]
284
- invs2.collect{|i| i.firm}.must_equal [@firm2, @firm2]
285
- invs1.collect{|i| i.client.firm}.must_equal [@firm1, @firm1, @firm1]
286
- invs2.collect{|i| i.client.firm}.must_equal [@firm2, @firm2]
287
- end
288
-
289
- it "should return has_one :through belongs_to records for a single object" do
290
- firm = @invoice1.firm
291
- firm.must_equal @firm1
292
- @invoice1.client.must_equal @client1
293
- @invoice1.client.firm.must_equal @firm1
294
- firm.associations[:clients].must_equal nil
295
- end
296
-
297
- it "should eagerly load has_one :through belongs_to records for multiple objects" do
298
- invs = Invoice.order(:id).eager(:firm).all
299
- invs.must_equal [@invoice1, @invoice2, @invoice3, @invoice4, @invoice5]
300
- invs[0].firm.must_equal @firm1
301
- invs[0].client.must_equal @client1
302
- invs[0].client.firm.must_equal @firm1
303
- invs[0].firm.associations[:clients].must_equal nil
304
- invs[1].firm.must_equal @firm1
305
- invs[1].client.must_equal @client1
306
- invs[1].client.firm.must_equal @firm1
307
- invs[1].firm.associations[:clients].must_equal nil
308
- invs[2].firm.must_equal @firm1
309
- invs[2].client.must_equal @client2
310
- invs[2].client.firm.must_equal @firm1
311
- invs[2].firm.associations[:clients].must_equal nil
312
- invs[3].firm.must_equal @firm2
313
- invs[3].client.must_equal @client3
314
- invs[3].client.firm.must_equal @firm2
315
- invs[3].firm.associations[:clients].must_equal nil
316
- invs[4].firm.must_equal @firm2
317
- invs[4].client.must_equal @client3
318
- invs[4].client.firm.must_equal @firm2
319
- invs[4].firm.associations[:clients].must_equal nil
320
- end
321
- end
322
-
323
- describe "Polymorphic Associations" do
324
- before(:all) do
325
- DB.instance_variable_set(:@schemas, {})
326
- DB.create_table!(:assets) do
327
- primary_key :id
328
- Integer :attachable_id
329
- String :attachable_type
330
- end
331
- class ::Asset < Sequel::Model
332
- m = method(:constantize)
333
- many_to_one :attachable, :reciprocal=>:assets, :reciprocal_type=>:one_to_many,
334
- :setter=>(proc do |attachable|
335
- self[:attachable_id] = (attachable.pk if attachable)
336
- self[:attachable_type] = (attachable.class.name if attachable)
337
- end),
338
- :dataset=>(proc do
339
- klass = m.call(attachable_type)
340
- klass.where(klass.primary_key=>attachable_id)
341
- end),
342
- :eager_loader=>(proc do |eo|
343
- id_map = {}
344
- eo[:rows].each do |asset|
345
- asset.associations[:attachable] = nil
346
- ((id_map[asset.attachable_type] ||= {})[asset.attachable_id] ||= []) << asset
347
- end
348
- id_map.each do |klass_name, idmap|
349
- klass = m.call(klass_name)
350
- klass.where(klass.primary_key=>idmap.keys).all do |attach|
351
- idmap[attach.pk].each do |asset|
352
- asset.associations[:attachable] = attach
353
- end
354
- end
355
- end
356
- end)
357
- end
358
-
359
- DB.create_table!(:posts) do
360
- primary_key :id
361
- end
362
- class ::Post < Sequel::Model
363
- one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Post'},
364
- :adder=>proc{|asset| asset.update(:attachable_id=>pk, :attachable_type=>'Post')},
365
- :remover=>proc{|asset| asset.update(:attachable_id=>nil, :attachable_type=>nil)},
366
- :clearer=>proc{assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)}
367
- end
368
-
369
- DB.create_table!(:notes) do
370
- primary_key :id
371
- end
372
- class ::Note < Sequel::Model
373
- one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Note'},
374
- :adder=>proc{|asset| asset.update(:attachable_id=>pk, :attachable_type=>'Note')},
375
- :remover=>proc{|asset| asset.update(:attachable_id=>nil, :attachable_type=>nil)},
376
- :clearer=>proc{assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)}
377
- end
378
- end
379
- before do
380
- [:assets, :posts, :notes].each{|t| DB[t].delete}
381
- @post = Post.create
382
- Note.create
383
- @note = Note.create
384
- @asset1 = Asset.create(:attachable=>@post)
385
- @asset2 = Asset.create(:attachable=>@note)
386
- @asset1.associations.clear
387
- @asset2.associations.clear
388
- end
389
- after(:all) do
390
- DB.drop_table :assets, :posts, :notes
391
- Object.send(:remove_const, :Asset)
392
- Object.send(:remove_const, :Post)
393
- Object.send(:remove_const, :Note)
394
- end
395
-
396
- it "should load the correct associated object for a single object" do
397
- @asset1.attachable.must_equal @post
398
- @asset2.attachable.must_equal @note
399
- end
400
-
401
- it "should eagerly load the correct associated object for a group of objects" do
402
- assets = Asset.order(:id).eager(:attachable).all
403
- assets.must_equal [@asset1, @asset2]
404
- assets[0].attachable.must_equal @post
405
- assets[1].attachable.must_equal @note
406
- end
407
-
408
- it "should set items correctly" do
409
- @asset1.attachable = @note
410
- @asset2.attachable = @post
411
- @asset1.attachable.must_equal @note
412
- @asset1.attachable_id.must_equal @note.pk
413
- @asset1.attachable_type.must_equal 'Note'
414
- @asset2.attachable.must_equal @post
415
- @asset2.attachable_id.must_equal @post.pk
416
- @asset2.attachable_type.must_equal 'Post'
417
- @asset1.attachable = nil
418
- @asset1.attachable.must_equal nil
419
- @asset1.attachable_id.must_equal nil
420
- @asset1.attachable_type.must_equal nil
421
- end
422
-
423
- it "should add items correctly" do
424
- @post.assets.must_equal [@asset1]
425
- @post.add_asset(@asset2)
426
- @post.assets.must_equal [@asset1, @asset2]
427
- @asset2.attachable.must_equal @post
428
- @asset2.attachable_id.must_equal @post.pk
429
- @asset2.attachable_type.must_equal 'Post'
430
- end
431
-
432
- it "should remove items correctly" do
433
- @note.assets.must_equal [@asset2]
434
- @note.remove_asset(@asset2)
435
- @note.assets.must_equal []
436
- @asset2.attachable.must_equal nil
437
- @asset2.attachable_id.must_equal nil
438
- @asset2.attachable_type.must_equal nil
439
- end
440
-
441
- it "should remove all items correctly" do
442
- @post.remove_all_assets
443
- @note.remove_all_assets
444
- @asset1.reload.attachable.must_equal nil
445
- @asset2.reload.attachable.must_equal nil
446
- end
447
- end
448
-
449
- describe "many_to_one/one_to_many not referencing primary key" do
450
- before(:all) do
451
- DB.instance_variable_set(:@schemas, {})
452
- DB.create_table!(:clients) do
453
- primary_key :id
454
- String :name
455
- end
456
- class ::Client < Sequel::Model
457
- one_to_many :invoices, :reciprocal=>:client,
458
- :adder=>(proc do |invoice|
459
- invoice.client_name = name
460
- invoice.save
461
- end),
462
- :remover=>(proc do |invoice|
463
- invoice.client_name = nil
464
- invoice.save
465
- end),
466
- :clearer=>proc{invoices_dataset.update(:client_name=>nil)},
467
- :dataset=>proc{Invoice.filter(:client_name=>name)},
468
- :eager_loader=>(proc do |eo|
469
- id_map = {}
470
- eo[:rows].each do |client|
471
- id_map[client.name] = client
472
- client.associations[:invoices] = []
473
- end
474
- Invoice.filter(:client_name=>id_map.keys.sort).all do |inv|
475
- inv.associations[:client] = client = id_map[inv.client_name]
476
- client.associations[:invoices] << inv
477
- end
478
- end)
479
- end
480
-
481
- DB.create_table!(:invoices) do
482
- primary_key :id
483
- String :client_name
484
- end
485
- class ::Invoice < Sequel::Model
486
- many_to_one :client, :key=>:client_name,
487
- :setter=>proc{|client| self.client_name = (client.name if client)},
488
- :dataset=>proc{Client.filter(:name=>client_name)},
489
- :eager_loader=>(proc do |eo|
490
- id_map = eo[:id_map]
491
- eo[:rows].each{|inv| inv.associations[:client] = nil}
492
- Client.filter(:name=>id_map.keys).all do |client|
493
- id_map[client.name].each{|inv| inv.associations[:client] = client}
494
- end
495
- end)
496
- end
497
- end
498
- before do
499
- Client.dataset.delete
500
- Invoice.dataset.delete
501
- @client1 = Client.create(:name=>'X')
502
- @client2 = Client.create(:name=>'Y')
503
- @invoice1 = Invoice.create(:client_name=>'X')
504
- @invoice2 = Invoice.create(:client_name=>'X')
505
- end
506
- after(:all) do
507
- DB.drop_table :invoices, :clients
508
- Object.send(:remove_const, :Client)
509
- Object.send(:remove_const, :Invoice)
510
- end
511
-
512
- it "should load all associated one_to_many objects for a single object" do
513
- invs = @client1.invoices
514
- invs.sort_by{|x| x.pk}.must_equal [@invoice1, @invoice2]
515
- invs[0].client.must_equal @client1
516
- invs[1].client.must_equal @client1
517
- end
518
-
519
- it "should load the associated many_to_one object for a single object" do
520
- client = @invoice1.client
521
- client.must_equal @client1
522
- end
523
-
524
- it "should eagerly load all associated one_to_many objects for a group of objects" do
525
- clients = Client.order(:id).eager(:invoices).all
526
- clients.must_equal [@client1, @client2]
527
- clients[1].invoices.must_equal []
528
- invs = clients[0].invoices.sort_by{|x| x.pk}
529
- invs.must_equal [@invoice1, @invoice2]
530
- invs[0].client.must_equal @client1
531
- invs[1].client.must_equal @client1
532
- end
533
-
534
- it "should eagerly load the associated many_to_one object for a group of objects" do
535
- invoices = Invoice.order(:id).eager(:client).all
536
- invoices.must_equal [@invoice1, @invoice2]
537
- invoices[0].client.must_equal @client1
538
- invoices[1].client.must_equal @client1
539
- end
540
-
541
- it "should set the associated object correctly" do
542
- @invoice1.client = @client2
543
- @invoice1.client.must_equal @client2
544
- @invoice1.client_name.must_equal 'Y'
545
- @invoice1.client = nil
546
- @invoice1.client_name.must_equal nil
547
- end
548
-
549
- it "should add the associated object correctly" do
550
- @client2.invoices.must_equal []
551
- @client2.add_invoice(@invoice1)
552
- @client2.invoices.must_equal [@invoice1]
553
- @invoice1.client_name.must_equal 'Y'
554
- @invoice1.client = nil
555
- @invoice1.client_name.must_equal nil
556
- end
557
-
558
- it "should remove the associated object correctly" do
559
- invs = @client1.invoices.sort_by{|x| x.pk}
560
- invs.must_equal [@invoice1, @invoice2]
561
- @client1.remove_invoice(@invoice1)
562
- @client1.invoices.must_equal [@invoice2]
563
- @invoice1.client_name.must_equal nil
564
- @invoice1.client.must_equal nil
565
- end
566
-
567
- it "should remove all associated objects correctly" do
568
- @client1.remove_all_invoices
569
- @invoice1.refresh.client.must_equal nil
570
- @invoice1.client_name.must_equal nil
571
- @invoice2.refresh.client.must_equal nil
572
- @invoice2.client_name.must_equal nil
573
- end
574
- end
575
-
576
- describe "statistics associations" do
577
- before(:all) do
578
- DB.create_table!(:projects) do
579
- primary_key :id
580
- String :name
581
- end
582
- class ::Project < Sequel::Model
583
- many_to_one :ticket_hours, :read_only=>true, :key=>:id, :class=>:Ticket,
584
- :dataset=>proc{Ticket.filter(:project_id=>id).select{sum(hours).as(hours)}},
585
- :eager_loader=>(proc do |eo|
586
- eo[:rows].each{|p| p.associations[:ticket_hours] = nil}
587
- Ticket.filter(:project_id=>eo[:id_map].keys).
588
- select_group(:project_id).
589
- select_append{sum(hours).as(hours)}.
590
- all do |t|
591
- p = eo[:id_map][t.values.delete(:project_id)].first
592
- p.associations[:ticket_hours] = t
593
- end
594
- end)
595
- def ticket_hours
596
- if s = super
597
- s[:hours]
598
- end
599
- end
600
- end
601
-
602
- DB.create_table!(:tickets) do
603
- primary_key :id
604
- foreign_key :project_id, :projects
605
- Integer :hours
606
- end
607
- class ::Ticket < Sequel::Model
608
- many_to_one :project
609
- end
610
-
611
- @project1 = Project.create(:name=>'X')
612
- @project2 = Project.create(:name=>'Y')
613
- @ticket1 = Ticket.create(:project=>@project1, :hours=>1)
614
- @ticket2 = Ticket.create(:project=>@project1, :hours=>10)
615
- @ticket3 = Ticket.create(:project=>@project2, :hours=>2)
616
- @ticket4 = Ticket.create(:project=>@project2, :hours=>20)
617
- end
618
- after(:all) do
619
- DB.drop_table :tickets, :projects
620
- Object.send(:remove_const, :Project)
621
- Object.send(:remove_const, :Ticket)
622
- end
623
-
624
- it "should give the correct sum of ticket hours for each project" do
625
- @project1.ticket_hours.to_i.must_equal 11
626
- @project2.ticket_hours.to_i.must_equal 22
627
- end
628
-
629
- it "should give the correct sum of ticket hours for each project when eager loading" do
630
- p1, p2 = Project.order(:name).eager(:ticket_hours).all
631
- p1.ticket_hours.to_i.must_equal 11
632
- p2.ticket_hours.to_i.must_equal 22
633
- end
634
- end
635
-
636
- describe "one to one associations" do
637
- before(:all) do
638
- DB.create_table!(:books) do
639
- primary_key :id
640
- end
641
- class ::Book < Sequel::Model
642
- one_to_one :first_page, :class=>:Page, :conditions=>{:page_number=>1}, :reciprocal=>nil
643
- one_to_one :second_page, :class=>:Page, :conditions=>{:page_number=>2}, :reciprocal=>nil
644
- end
645
-
646
- DB.create_table!(:pages) do
647
- primary_key :id
648
- foreign_key :book_id, :books
649
- Integer :page_number
650
- end
651
- class ::Page < Sequel::Model
652
- many_to_one :book, :reciprocal=>nil
653
- end
654
-
655
- @book1 = Book.create
656
- @book2 = Book.create
657
- @page1 = Page.create(:book=>@book1, :page_number=>1)
658
- @page2 = Page.create(:book=>@book1, :page_number=>2)
659
- @page3 = Page.create(:book=>@book2, :page_number=>1)
660
- @page4 = Page.create(:book=>@book2, :page_number=>2)
661
- end
662
- after(:all) do
663
- DB.drop_table :pages, :books
664
- Object.send(:remove_const, :Book)
665
- Object.send(:remove_const, :Page)
666
- end
667
-
668
- it "should be eager loadable" do
669
- bk1, bk2 = Book.filter(:books__id=>[1,2]).eager(:first_page).all
670
- bk1.first_page.must_equal @page1
671
- bk2.first_page.must_equal @page3
672
- end
673
-
674
- it "should be eager graphable" do
675
- bk1, bk2 = Book.filter(:books__id=>[1,2]).eager_graph(:first_page).all
676
- bk1.first_page.must_equal @page1
677
- bk2.first_page.must_equal @page3
678
- end
679
-
680
- it "should be eager graphable two at once" do
681
- bk1, bk2 = Book.filter(:books__id=>[1,2]).eager_graph(:first_page, :second_page).all
682
- bk1.first_page.must_equal @page1
683
- bk1.second_page.must_equal @page2
684
- bk2.first_page.must_equal @page3
685
- bk2.second_page.must_equal @page4
686
- end
687
- end