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,1097 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Model()" do
4
- before do
5
- @db = Sequel::Model.db
6
- end
7
-
8
- it "should return a model subclass with the given dataset if given a dataset" do
9
- ds = @db[:blah]
10
- c = Sequel::Model(ds)
11
- c.superclass.must_equal Sequel::Model
12
- c.dataset.must_equal ds
13
- end
14
-
15
- it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
16
- c = Sequel::Model(:blah)
17
- c.superclass.must_equal Sequel::Model
18
- c.db.must_equal @db
19
- c.table_name.must_equal :blah
20
- end
21
-
22
- it "should return a model subclass with a dataset with the default database and given table name if given a LiteralString" do
23
- c = Sequel::Model(Sequel.lit('blah'))
24
- c.superclass.must_equal Sequel::Model
25
- c.db.must_equal @db
26
- c.table_name.must_equal Sequel.lit('blah')
27
- end
28
-
29
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::Identifier" do
30
- c = Sequel::Model(Sequel.identifier(:blah))
31
- c.superclass.must_equal Sequel::Model
32
- c.db.must_equal @db
33
- c.table_name.must_equal Sequel.identifier(:blah)
34
- end
35
-
36
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::QualifiedIdentifier" do
37
- c = Sequel::Model(Sequel.qualify(:boo, :blah))
38
- c.superclass.must_equal Sequel::Model
39
- c.db.must_equal @db
40
- c.table_name.must_equal Sequel.qualify(:boo, :blah)
41
- end
42
-
43
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::AliasedExpression" do
44
- c = Sequel::Model(Sequel.as(:blah, :boo))
45
- c.superclass.must_equal Sequel::Model
46
- c.db.must_equal @db
47
- c.table_name.must_equal :boo
48
- end
49
-
50
- it "should return a model subclass with the given dataset if given a dataset using an SQL::Identifier" do
51
- ds = @db[Sequel.identifier(:blah)]
52
- c = Sequel::Model(ds)
53
- c.superclass.must_equal Sequel::Model
54
- c.dataset.must_equal ds
55
- end
56
-
57
- it "should be callable on Sequel::Model" do
58
- ds = @db[:blah]
59
- c = Sequel::Model::Model(ds)
60
- c.superclass.must_equal Sequel::Model
61
- c.dataset.must_equal ds
62
- end
63
-
64
- it "should be callable on subclasses of Sequel::Model" do
65
- ds = @db[:blah]
66
- c = Class.new(Sequel::Model)
67
- sc = c::Model(ds)
68
- sc.superclass.must_equal c
69
- sc.dataset.must_equal ds
70
- end
71
-
72
- it "should be callable on other modules if def_Model is used" do
73
- m = Module.new
74
- Sequel::Model.def_Model(m)
75
- ds = @db[:blah]
76
- c = m::Model(ds)
77
- c.superclass.must_equal Sequel::Model
78
- c.dataset.must_equal ds
79
- end
80
-
81
- it "should be callable using model subclasses on other modules if def_Model is used" do
82
- m = Module.new
83
- c = Class.new(Sequel::Model)
84
- c.def_Model(m)
85
- ds = @db[:blah]
86
- sc = m::Model(ds)
87
- sc.superclass.must_equal c
88
- sc.dataset.must_equal ds
89
- end
90
-
91
- it "should return a model subclass associated to the given database if given a database" do
92
- db = Sequel.mock
93
- c = Sequel::Model(db)
94
- c.superclass.must_equal Sequel::Model
95
- c.db.must_equal db
96
- proc{c.dataset}.must_raise(Sequel::Error)
97
- class SmBlahTest < c
98
- end
99
- SmBlahTest.db.must_equal db
100
- SmBlahTest.table_name.must_equal :sm_blah_tests
101
- end
102
-
103
- describe "reloading" do
104
- before do
105
- Sequel.cache_anonymous_models = true
106
- end
107
- after do
108
- Sequel.cache_anonymous_models = false
109
- Object.send(:remove_const, :Album) if defined?(::Album)
110
- end
111
-
112
- it "should work without raising an exception with a symbol" do
113
- class ::Album < Sequel::Model(:table); end
114
- class ::Album < Sequel::Model(:table); end
115
- end
116
-
117
- it "should work without raising an exception with an SQL::Identifier " do
118
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
119
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
120
- end
121
-
122
- it "should work without raising an exception with an SQL::QualifiedIdentifier " do
123
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
124
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
125
- end
126
-
127
- it "should work without raising an exception with an SQL::AliasedExpression" do
128
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
129
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
130
- end
131
-
132
- it "should work without raising an exception with an LiteralString" do
133
- class ::Album < Sequel::Model(Sequel.lit('table')); end
134
- class ::Album < Sequel::Model(Sequel.lit('table')); end
135
- end
136
-
137
- it "should work without raising an exception with a database" do
138
- class ::Album < Sequel::Model(@db); end
139
- class ::Album < Sequel::Model(@db); end
140
- end
141
-
142
- it "should work without raising an exception with a dataset" do
143
- class ::Album < Sequel::Model(@db[:table]); end
144
- class ::Album < Sequel::Model(@db[:table]); end
145
- end
146
-
147
- it "should work without raising an exception with a dataset with an SQL::Identifier" do
148
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
149
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
150
- end
151
-
152
- it "should raise an exception if anonymous model caching is disabled" do
153
- Sequel.cache_anonymous_models = false
154
- proc do
155
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
156
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
157
- end.must_raise TypeError
158
- end
159
-
160
- it "should use separate cache and cache settings for subclasses" do
161
- c = Class.new(Sequel::Model)
162
- c.cache_anonymous_models.must_equal true
163
- class ::Album < c::Model(:table); end
164
- class ::Album < c::Model(:table); end
165
-
166
- c1 = c::Model(:t1)
167
- c1.must_equal c::Model(:t1)
168
- c1.wont_equal Sequel::Model(:t1)
169
-
170
- c.cache_anonymous_models = false
171
- Sequel::Model.cache_anonymous_models.must_equal true
172
- c1.wont_equal c::Model(:t1)
173
- end
174
- end
175
- end
176
-
177
- describe Sequel::Model do
178
- it "should have class method aliased as model" do
179
- Sequel::Model.instance_methods.collect{|x| x.to_s}.must_include("model")
180
-
181
- model_a = Class.new(Sequel::Model(:items))
182
- model_a.new.model.wont_be_nil
183
- end
184
-
185
- it "should be associated with a dataset" do
186
- model_a = Class.new(Sequel::Model) { set_dataset DB[:as] }
187
-
188
- model_a.dataset.must_be_kind_of(Sequel::Mock::Dataset)
189
- model_a.dataset.opts[:from].must_equal [:as]
190
-
191
- model_b = Class.new(Sequel::Model) { set_dataset DB[:bs] }
192
-
193
- model_b.dataset.must_be_kind_of(Sequel::Mock::Dataset)
194
- model_b.dataset.opts[:from].must_equal [:bs]
195
-
196
- model_a.dataset.opts[:from].must_equal [:as]
197
- end
198
- end
199
-
200
- describe Sequel::Model do
201
- before do
202
- @model = Class.new(Sequel::Model(:items))
203
- DB.reset
204
- end
205
-
206
- it "has table_name return name of table" do
207
- @model.table_name.must_equal :items
208
- end
209
-
210
- it "defaults to primary key of id" do
211
- @model.primary_key.must_equal :id
212
- end
213
-
214
- it "allow primary key change" do
215
- @model.set_primary_key :ssn
216
- @model.primary_key.must_equal :ssn
217
- end
218
-
219
- it "allows dataset change" do
220
- @model.set_dataset(DB[:foo])
221
- @model.table_name.must_equal :foo
222
- end
223
-
224
- it "allows set_dataset to accept a Symbol" do
225
- @model.db = DB
226
- @model.set_dataset(:foo)
227
- @model.table_name.must_equal :foo
228
- end
229
-
230
- it "allows set_dataset to accept a LiteralString" do
231
- @model.db = DB
232
- @model.set_dataset(Sequel.lit('foo'))
233
- @model.table_name.must_equal Sequel.lit('foo')
234
- end
235
-
236
- it "allows set_dataset to acceptan SQL::Identifier" do
237
- @model.db = DB
238
- @model.set_dataset(Sequel.identifier(:foo))
239
- @model.table_name.must_equal Sequel.identifier(:foo)
240
- end
241
-
242
- it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
243
- @model.db = DB
244
- @model.set_dataset(Sequel.qualify(:bar, :foo))
245
- @model.table_name.must_equal Sequel.qualify(:bar, :foo)
246
- end
247
-
248
- it "allows set_dataset to acceptan SQL::AliasedExpression" do
249
- @model.db = DB
250
- @model.set_dataset(Sequel.as(:foo, :bar))
251
- @model.table_name.must_equal :bar
252
- end
253
-
254
- it "table_name should respect table aliases" do
255
- @model.set_dataset(:foo___x)
256
- @model.table_name.must_equal :x
257
- end
258
-
259
- it "set_dataset should raise an error unless given a Symbol or Dataset" do
260
- proc{@model.set_dataset(Object.new)}.must_raise(Sequel::Error)
261
- end
262
-
263
- it "set_dataset should add the destroy method to the dataset that destroys each object" do
264
- ds = DB[:foo]
265
- ds.wont_respond_to(:destroy)
266
- @model.set_dataset(ds)
267
- ds.must_respond_to(:destroy)
268
- DB.sqls
269
- ds._fetch = [{:id=>1}, {:id=>2}]
270
- ds.destroy.must_equal 2
271
- DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
272
- end
273
-
274
- it "set_dataset should add the destroy method that respects sharding with transactions" do
275
- db = Sequel.mock(:servers=>{:s1=>{}})
276
- ds = db[:foo].server(:s1)
277
- @model.use_transactions = true
278
- @model.set_dataset(ds)
279
- db.sqls
280
- ds.destroy.must_equal 0
281
- db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
282
- end
283
-
284
- it "should raise an error on set_dataset if there is an error connecting to the database" do
285
- def @model.columns() raise Sequel::DatabaseConnectionError end
286
- proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah))}.must_raise Sequel::DatabaseConnectionError
287
- end
288
-
289
- it "should not raise an error if there is a problem getting the columns for a dataset" do
290
- def @model.columns() raise Sequel::Error end
291
- @model.set_dataset(DB[:foo].join(:blah))
292
- end
293
-
294
- it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
295
- db = Sequel.mock
296
- def db.schema(*) raise Sequel::Error; end
297
- @model.set_dataset(db[:foo])
298
- end
299
-
300
- it "reload_db_schema? should be false by default" do
301
- c = Class.new
302
- c.extend Sequel::Model::ClassMethods
303
- c.send(:reload_db_schema?).must_equal false
304
- end
305
-
306
- it "doesn't raise an error on inherited if there is an error setting the dataset" do
307
- db = Sequel.mock
308
- def db.schema(*) raise Sequel::Error; end
309
- @model.db = db
310
- Class.new(@model)
311
- end
312
-
313
- it "uses a savepoint if inside a transaction when getting the columns" do
314
- db = Sequel.mock
315
- def db.supports_savepoints?; true end
316
- Sequel::Model(db[:table])
317
- db.sqls.must_equal ["SELECT * FROM table LIMIT 1"]
318
- c = db.transaction{Sequel::Model(db[:table])}
319
- db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1", "SELECT * FROM table LIMIT 1", "RELEASE SAVEPOINT autopoint_1", "COMMIT"]
320
- end
321
-
322
- it "should raise if bad inherited instance variable value is used" do
323
- def @model.inherited_instance_variables() super.merge(:@a=>:foo) end
324
- @model.instance_eval{@a=1}
325
- proc{Class.new(@model)}.must_raise(Sequel::Error)
326
- end
327
-
328
- it "copy inherited instance variables into subclass if set" do
329
- def @model.inherited_instance_variables() super.merge(:@a=>nil, :@b=>:dup, :@c=>:hash_dup, :@d=>proc{|v| v * 2}) end
330
- @model.instance_eval{@a=1; @b=[2]; @c={3=>[4]}; @d=10}
331
- m = Class.new(@model)
332
- @model.instance_eval{@a=5; @b << 6; @c[3] << 7; @c[8] = [9]; @d=40}
333
- m.instance_eval do
334
- @a.must_equal 1
335
- @b.must_equal [2]
336
- @c.must_equal(3=>[4])
337
- @d.must_equal 20
338
- end
339
- end
340
- end
341
-
342
- describe Sequel::Model, ".require_valid_table = true" do
343
- before do
344
- @db = Sequel.mock
345
- @db.columns = proc do |sql|
346
- raise Sequel::Error if sql =~ /foos/
347
- [:id]
348
- end
349
- def @db.supports_schema_parsing?; true end
350
- def @db.schema(t, *) t.first_source == :foos ? (raise Sequel::Error) : [[:id, {}]] end
351
- Sequel::Model.db = @db
352
- Sequel::Model.require_valid_table = true
353
- end
354
- after do
355
- Sequel::Model.require_valid_table = false
356
- Sequel::Model.db = DB
357
- if Object.const_defined?(:Bar)
358
- Object.send(:remove_const, :Bar)
359
- end
360
- if Object.const_defined?(:Foo)
361
- Object.send(:remove_const, :Foo)
362
- end
363
- end
364
-
365
- it "should raise an exception when creating a model with an invalid implicit table" do
366
- proc{class ::Foo < Sequel::Model; end}.must_raise Sequel::Error
367
- end
368
-
369
- it "should not raise an exception when creating a model with a valid implicit table" do
370
- class ::Bar < Sequel::Model; end
371
- Bar.columns.must_equal [:id]
372
- end
373
-
374
- it "should raise an exception when creating a model with an invalid explicit table" do
375
- proc{Sequel::Model(@db[:foos])}.must_raise Sequel::Error
376
- end
377
-
378
- it "should not raise an exception when creating a model with a valid explicit table" do
379
- c = Sequel::Model(@db[:bars])
380
- c.columns.must_equal [:id]
381
- end
382
-
383
- it "should raise an exception when calling set_dataset with an invalid table" do
384
- c = Class.new(Sequel::Model)
385
- proc{c.set_dataset @db[:foos]}.must_raise Sequel::Error
386
- end
387
-
388
- it "should not raise an exception when calling set_dataset with an valid table" do
389
- c = Class.new(Sequel::Model)
390
- c.set_dataset @db[:bars]
391
- c.columns.must_equal [:id]
392
- end
393
- end
394
-
395
- describe Sequel::Model, "constructors" do
396
- before do
397
- @m = Class.new(Sequel::Model)
398
- @m.columns :a, :b
399
- end
400
-
401
- it "should accept a hash" do
402
- m = @m.new(:a => 1, :b => 2)
403
- m.values.must_equal(:a => 1, :b => 2)
404
- m.must_be :new?
405
- end
406
-
407
- it "should accept a block and yield itself to the block" do
408
- block_called = false
409
- m = @m.new {|i| block_called = true; i.must_be_kind_of(@m); i.values[:a] = 1}
410
-
411
- block_called.must_equal true
412
- m.values[:a].must_equal 1
413
- end
414
-
415
- it "should have dataset row_proc create an existing object" do
416
- @m.dataset = Sequel.mock.dataset
417
- o = @m.dataset.row_proc.call(:a=>1)
418
- o.must_be_kind_of(@m)
419
- o.values.must_equal(:a=>1)
420
- o.new?.must_equal false
421
- end
422
-
423
- it "should have .call create an existing object" do
424
- o = @m.call(:a=>1)
425
- o.must_be_kind_of(@m)
426
- o.values.must_equal(:a=>1)
427
- o.new?.must_equal false
428
- end
429
-
430
- it "should have .load create an existing object" do
431
- o = @m.load(:a=>1)
432
- o.must_be_kind_of(@m)
433
- o.values.must_equal(:a=>1)
434
- o.new?.must_equal false
435
- end
436
- end
437
-
438
- describe Sequel::Model, "new" do
439
- before do
440
- @m = Class.new(Sequel::Model) do
441
- set_dataset DB[:items]
442
- columns :x, :id
443
- end
444
- end
445
-
446
- it "should be marked as new?" do
447
- o = @m.new
448
- o.must_be :new?
449
- end
450
-
451
- it "should not be marked as new? once it is saved" do
452
- o = @m.new(:x => 1)
453
- o.must_be :new?
454
- o.save
455
- o.wont_be :new?
456
- end
457
-
458
- it "should use the last inserted id as primary key if not in values" do
459
- @m.instance_dataset._fetch = @m.dataset._fetch = {:x => 1, :id => 1234}
460
- @m.instance_dataset.autoid = @m.dataset.autoid = 1234
461
-
462
- o = @m.new(:x => 1)
463
- o.save
464
- o.id.must_equal 1234
465
-
466
- o = @m.load(:x => 1, :id => 333)
467
- o.save
468
- o.id.must_equal 333
469
- end
470
- end
471
-
472
- describe Sequel::Model, ".subset" do
473
- before do
474
- @c = Class.new(Sequel::Model(:items))
475
- DB.reset
476
- end
477
-
478
- it "should create a filter on the underlying dataset" do
479
- proc {@c.new_only}.must_raise(NoMethodError)
480
-
481
- @c.subset(:new_only){age < 'new'}
482
-
483
- @c.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
484
- @c.dataset.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
485
-
486
- @c.subset(:pricey){price > 100}
487
-
488
- @c.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
489
- @c.dataset.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
490
-
491
- @c.pricey.new_only.sql.must_equal "SELECT * FROM items WHERE ((price > 100) AND (age < 'new'))"
492
- @c.new_only.pricey.sql.must_equal "SELECT * FROM items WHERE ((age < 'new') AND (price > 100))"
493
- end
494
-
495
- it "should not override existing model methods" do
496
- def @c.active() true end
497
- @c.subset(:active, :active)
498
- @c.active.must_equal true
499
- end
500
- end
501
-
502
- describe Sequel::Model, ".find" do
503
- before do
504
- @c = Class.new(Sequel::Model(:items))
505
- @c.dataset._fetch = {:name => 'sharon', :id => 1}
506
- DB.reset
507
- end
508
-
509
- it "should return the first record matching the given filter" do
510
- @c.find(:name => 'sharon').must_be_kind_of(@c)
511
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
512
-
513
- @c.find(Sequel.expr(:name).like('abc%')).must_be_kind_of(@c)
514
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name LIKE 'abc%' ESCAPE '\\') LIMIT 1"]
515
- end
516
-
517
- it "should accept filter blocks" do
518
- @c.find{id > 1}.must_be_kind_of(@c)
519
- DB.sqls.must_equal ["SELECT * FROM items WHERE (id > 1) LIMIT 1"]
520
-
521
- @c.find{(x > 1) & (y < 2)}.must_be_kind_of(@c)
522
- DB.sqls.must_equal ["SELECT * FROM items WHERE ((x > 1) AND (y < 2)) LIMIT 1"]
523
- end
524
- end
525
-
526
- describe Sequel::Model, ".finder" do
527
- before do
528
- @h = {:id=>1}
529
- @db = Sequel.mock(:fetch=>@h)
530
- @c = Class.new(Sequel::Model(@db[:items]))
531
- @c.instance_eval do
532
- def foo(a, b)
533
- where(:bar=>a).order(b)
534
- end
535
- end
536
- @o = @c.load(@h)
537
- @db.sqls
538
- end
539
-
540
- it "should create a method that calls the method given and returns the first instance" do
541
- @c.finder :foo
542
- @c.first_foo(1, 2).must_equal @o
543
- @c.first_foo(3, 4).must_equal @o
544
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
545
- end
546
-
547
- it "should work correctly when subclassing" do
548
- @c.finder(:foo)
549
- @sc = Class.new(@c)
550
- @sc.set_dataset :foos
551
- @db.sqls
552
- @sc.first_foo(1, 2).must_equal @sc.load(@h)
553
- @sc.first_foo(3, 4).must_equal @sc.load(@h)
554
- @db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
555
- end
556
-
557
- it "should work correctly when dataset is modified" do
558
- @c.finder(:foo)
559
- @c.first_foo(1, 2).must_equal @o
560
- @c.set_dataset :foos
561
- @c.first_foo(3, 4).must_equal @o
562
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
563
- end
564
-
565
- it "should create a method based on the given block if no method symbol provided" do
566
- @c.finder(:name=>:first_foo){|pl, ds| ds.where(pl.arg).limit(1)}
567
- @c.first_foo(:id=>1).must_equal @o
568
- @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1"]
569
- end
570
-
571
- it "should raise an error if both a block and method symbol given" do
572
- proc{@c.finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
573
- end
574
-
575
- it "should raise an error if two option hashes are provided" do
576
- proc{@c.finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
577
- end
578
-
579
- it "should support :type option" do
580
- @c.finder :foo, :type=>:all
581
- @c.finder :foo, :type=>:each
582
- @c.finder :foo, :type=>:get
583
-
584
- a = []
585
- @c.all_foo(1, 2){|r| a << r}.must_equal [@o]
586
- a.must_equal [@o]
587
-
588
- a = []
589
- @c.each_foo(3, 4){|r| a << r}
590
- a.must_equal [@o]
591
-
592
- @c.get_foo(5, 6).must_equal 1
593
-
594
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4", "SELECT * FROM items WHERE (bar = 5) ORDER BY 6 LIMIT 1"]
595
- end
596
-
597
- it "should support :name option" do
598
- @c.finder :foo, :name=>:find_foo
599
- @c.find_foo(1, 2).must_equal @o
600
- @c.find_foo(3, 4).must_equal @o
601
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
602
- end
603
-
604
- it "should support :arity option" do
605
- def @c.foobar(*b)
606
- ds = dataset
607
- b.each_with_index do |a, i|
608
- ds = ds.where(i=>a)
609
- end
610
- ds
611
- end
612
- @c.finder :foobar, :arity=>1, :name=>:find_foobar_1
613
- @c.finder :foobar, :arity=>2, :name=>:find_foobar_2
614
- @c.find_foobar_1(:a)
615
- @c.find_foobar_2(:a, :b)
616
- @db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1"]
617
- end
618
-
619
- it "should support :mod option" do
620
- m = Module.new
621
- @c.finder :foo, :mod=>m
622
- proc{@c.first_foo}.must_raise NoMethodError
623
- @c.extend m
624
- @c.first_foo(1, 2).must_equal @o
625
- @c.first_foo(3, 4).must_equal @o
626
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
627
- end
628
-
629
- it "should raise error when calling with the wrong arity" do
630
- @c.finder :foo
631
- proc{@c.first_foo(1)}.must_raise Sequel::Error
632
- proc{@c.first_foo(1,2,3)}.must_raise Sequel::Error
633
- end
634
- end
635
-
636
- describe Sequel::Model, ".prepared_finder" do
637
- before do
638
- @h = {:id=>1}
639
- @db = Sequel.mock(:fetch=>@h)
640
- @db.extend_datasets do
641
- def select_sql
642
- sql = super
643
- sql << ' -- prepared' if is_a?(Sequel::Dataset::PreparedStatementMethods)
644
- sql
645
- end
646
- end
647
- @c = Class.new(Sequel::Model(@db[:items]))
648
- @c.instance_eval do
649
- def foo(a, b)
650
- where(:bar=>a).order(b)
651
- end
652
- end
653
- @o = @c.load(@h)
654
- @db.sqls
655
- end
656
-
657
- it "should create a method that calls the method given and returns the first instance" do
658
- @c.prepared_finder :foo
659
- @c.first_foo(1, 2).must_equal @o
660
- @c.first_foo(3, 4).must_equal @o
661
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
662
- end
663
-
664
- it "should work correctly when subclassing" do
665
- @c.prepared_finder(:foo)
666
- @sc = Class.new(@c)
667
- @sc.set_dataset :foos
668
- @db.sqls
669
- @sc.first_foo(1, 2).must_equal @sc.load(@h)
670
- @sc.first_foo(3, 4).must_equal @sc.load(@h)
671
- @db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
672
- end
673
-
674
- it "should work correctly when dataset is modified" do
675
- @c.prepared_finder(:foo)
676
- @c.first_foo(1, 2).must_equal @o
677
- @c.set_dataset :foos
678
- @c.first_foo(3, 4).must_equal @o
679
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
680
- end
681
-
682
- it "should create a method based on the given block if no method symbol provided" do
683
- @c.prepared_finder(:name=>:first_foo){|a1| where(:id=>a1).limit(1)}
684
- @c.first_foo(1).must_equal @o
685
- @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1 -- prepared"]
686
- end
687
-
688
- it "should raise an error if both a block and method symbol given" do
689
- proc{@c.prepared_finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
690
- end
691
-
692
- it "should raise an error if two option hashes are provided" do
693
- proc{@c.prepared_finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
694
- end
695
-
696
- it "should support :type option" do
697
- @c.prepared_finder :foo, :type=>:all
698
- @c.prepared_finder :foo, :type=>:each
699
-
700
- a = []
701
- @c.all_foo(1, 2){|r| a << r}.must_equal [@o]
702
- a.must_equal [@o]
703
-
704
- a = []
705
- @c.each_foo(3, 4){|r| a << r}
706
- a.must_equal [@o]
707
-
708
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 -- prepared"]
709
- end
710
-
711
- it "should support :name option" do
712
- @c.prepared_finder :foo, :name=>:find_foo
713
- @c.find_foo(1, 2).must_equal @o
714
- @c.find_foo(3, 4).must_equal @o
715
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
716
- end
717
-
718
- it "should support :arity option" do
719
- def @c.foobar(*b)
720
- ds = dataset
721
- b.each_with_index do |a, i|
722
- ds = ds.where(i=>a)
723
- end
724
- ds
725
- end
726
- @c.prepared_finder :foobar, :arity=>1, :name=>:find_foobar_1
727
- @c.prepared_finder :foobar, :arity=>2, :name=>:find_foobar_2
728
- @c.find_foobar_1(:a)
729
- @c.find_foobar_2(:a, :b)
730
- @db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1 -- prepared", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1 -- prepared"]
731
- end
732
-
733
- it "should support :mod option" do
734
- m = Module.new
735
- @c.prepared_finder :foo, :mod=>m
736
- proc{@c.first_foo}.must_raise NoMethodError
737
- @c.extend m
738
- @c.first_foo(1, 2).must_equal @o
739
- @c.first_foo(3, 4).must_equal @o
740
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
741
- end
742
-
743
- it "should handle models with names" do
744
- def @c.name; 'foobar' end
745
- @c.prepared_finder :foo
746
- @c.first_foo(1, 2).must_equal @o
747
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared"]
748
- end
749
- end
750
-
751
- describe Sequel::Model, ".fetch" do
752
- before do
753
- DB.reset
754
- @c = Class.new(Sequel::Model(:items))
755
- end
756
-
757
- it "should return instances of Model" do
758
- @c.fetch("SELECT * FROM items").first.must_be_kind_of(@c)
759
- end
760
-
761
- it "should return true for .empty? and not raise an error on empty selection" do
762
- rows = @c.fetch("SELECT * FROM items WHERE FALSE")
763
- @c.send(:define_method, :fetch_rows){|sql| yield({:count => 0})}
764
- rows.empty?
765
- end
766
- end
767
-
768
- describe Sequel::Model, ".find_or_create" do
769
- before do
770
- @db = Sequel.mock
771
- @c = Class.new(Sequel::Model(@db[:items])) do
772
- set_primary_key :id
773
- columns :x
774
- end
775
- @db.sqls
776
- end
777
-
778
- it "should find the record" do
779
- @db.fetch = [{:x=>1, :id=>1}]
780
- @db.autoid = 1
781
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
782
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1"]
783
- end
784
-
785
- it "should create the record if not found" do
786
- @db.fetch = [[], {:x=>1, :id=>1}]
787
- @db.autoid = 1
788
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
789
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
790
- "INSERT INTO items (x) VALUES (1)",
791
- "SELECT * FROM items WHERE (id = 1) LIMIT 1"]
792
- end
793
-
794
- it "should pass the new record to be created to the block if no record is found" do
795
- @db.fetch = [[], {:x=>1, :id=>1}]
796
- @db.autoid = 1
797
- @c.find_or_create(:x => 1){|x| x[:y] = 2}.must_equal @c.load(:x=>1, :id=>1)
798
- sqls = @db.sqls
799
- sqls.first.must_equal "SELECT * FROM items WHERE (x = 1) LIMIT 1"
800
- ["INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (y, x) VALUES (2, 1)"].must_include(sqls[1])
801
- sqls.last.must_equal "SELECT * FROM items WHERE (id = 1) LIMIT 1"
802
- end
803
- end
804
-
805
- describe Sequel::Model, ".all" do
806
- it "should return all records in the dataset" do
807
- c = Class.new(Sequel::Model(:items))
808
- c.all.must_equal [c.load(:x=>1, :id=>1)]
809
- end
810
- end
811
-
812
- describe Sequel::Model, "A model class without a primary key" do
813
- before do
814
- @c = Class.new(Sequel::Model(:items)) do
815
- columns :x
816
- no_primary_key
817
- end
818
- DB.reset
819
- end
820
-
821
- it "should be able to insert records without selecting them back" do
822
- i = nil
823
- i = @c.create(:x => 1)
824
- i.class.wont_be_nil
825
- i.values.to_hash.must_equal(:x => 1)
826
-
827
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (1)']
828
- end
829
-
830
- it "should raise when deleting" do
831
- proc{@c.load(:x=>1).delete}.must_raise Sequel::Error
832
- end
833
-
834
- it "should raise when updating" do
835
- proc{@c.load(:x=>1).update(:x=>2)}.must_raise Sequel::Error
836
- end
837
-
838
- it "should insert a record when saving" do
839
- o = @c.new(:x => 2)
840
- o.must_be :new?
841
- o.save
842
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (2)']
843
- end
844
- end
845
-
846
- describe Sequel::Model, "attribute accessors" do
847
- before do
848
- db = Sequel.mock
849
- def db.supports_schema_parsing?() true end
850
- def db.schema(*)
851
- [[:x, {:type=>:integer}], [:z, {:type=>:integer}]]
852
- end
853
- @dataset = db[:items].columns(:x, :z)
854
- @c = Class.new(Sequel::Model)
855
- DB.reset
856
- end
857
-
858
- it "should be created on set_dataset" do
859
- %w'x z x= z='.each do |x|
860
- @c.instance_methods.collect{|z| z.to_s}.wont_include(x)
861
- end
862
- @c.set_dataset(@dataset)
863
- %w'x z x= z='.each do |x|
864
- @c.instance_methods.collect{|z| z.to_s}.must_include(x)
865
- end
866
- o = @c.new
867
- %w'x z x= z='.each do |x|
868
- o.methods.collect{|z| z.to_s}.must_include(x)
869
- end
870
-
871
- o.x.must_equal nil
872
- o.x = 34
873
- o.x.must_equal 34
874
- end
875
-
876
- it "should be only accept one argument for the write accessor" do
877
- @c.set_dataset(@dataset)
878
- o = @c.new
879
-
880
- o.x = 34
881
- o.x.must_equal 34
882
- proc{o.send(:x=)}.must_raise ArgumentError
883
- proc{o.send(:x=, 3, 4)}.must_raise ArgumentError
884
- end
885
-
886
- it "should have a working typecasting setter even if the column is not selected" do
887
- @c.set_dataset(@dataset.select(:z).columns(:z))
888
- o = @c.new
889
-
890
- o.x = '34'
891
- o.x.must_equal 34
892
- end
893
-
894
- it "should typecast if the new value is the same as the existing but has a different class" do
895
- @c.set_dataset(@dataset.select(:z).columns(:z))
896
- o = @c.new
897
-
898
- o.x = 34
899
- o.x = 34.0
900
- o.x.must_equal 34.0
901
- o.x = 34
902
- o.x.must_equal 34
903
- end
904
- end
905
-
906
- describe Sequel::Model, ".[]" do
907
- before do
908
- @c = Class.new(Sequel::Model(:items))
909
- @c.dataset._fetch = {:name => 'sharon', :id => 1}
910
- DB.reset
911
- end
912
-
913
- it "should return the first record for the given pk" do
914
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
915
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
916
- @c[9999].must_equal @c.load(:name => 'sharon', :id => 1)
917
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 9999"]
918
- end
919
-
920
- it "should have #[] return nil if no rows match" do
921
- @c.dataset._fetch = []
922
- @c[1].must_equal nil
923
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
924
- end
925
-
926
- it "should work correctly for custom primary key" do
927
- @c.set_primary_key :name
928
- @c['sharon'].must_equal @c.load(:name => 'sharon', :id => 1)
929
- DB.sqls.must_equal ["SELECT * FROM items WHERE name = 'sharon'"]
930
- end
931
-
932
- it "should use a qualified primary key if the dataset is joined" do
933
- @c.dataset = @c.dataset.cross_join(:a)
934
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
935
- DB.sqls.must_equal ["SELECT * FROM items CROSS JOIN a WHERE (items.id = 1) LIMIT 1"]
936
- end
937
-
938
- it "should work correctly for composite primary key specified as array" do
939
- @c.set_primary_key [:node_id, :kind]
940
- @c[3921, 201].must_be_kind_of(@c)
941
- sqls = DB.sqls
942
- sqls.length.must_equal 1
943
- sqls.first.must_match(/^SELECT \* FROM items WHERE \((\(node_id = 3921\) AND \(kind = 201\))|(\(kind = 201\) AND \(node_id = 3921\))\) LIMIT 1$/)
944
- end
945
- end
946
-
947
- describe "Model#inspect" do
948
- it "should include the class name and the values" do
949
- Sequel::Model.load(:x => 333).inspect.must_equal '#<Sequel::Model @values={:x=>333}>'
950
- end
951
- end
952
-
953
- describe "Model.db_schema" do
954
- before do
955
- @c = Class.new(Sequel::Model(:items)) do
956
- def self.columns; orig_columns; end
957
- end
958
- @db = Sequel.mock
959
- def @db.supports_schema_parsing?() true end
960
- @dataset = @db[:items]
961
- end
962
-
963
- it "should not call database's schema if it isn't supported" do
964
- def @db.supports_schema_parsing?() false end
965
- def @db.schema(table, opts = {})
966
- raise Sequel::Error
967
- end
968
- @dataset.instance_variable_set(:@columns, [:x, :y])
969
-
970
- @c.dataset = @dataset
971
- @c.db_schema.must_equal(:x=>{}, :y=>{})
972
- @c.columns.must_equal [:x, :y]
973
- @c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
974
- end
975
-
976
- it "should use the database's schema and set the columns and dataset columns" do
977
- def @db.schema(table, opts = {})
978
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
979
- end
980
- @c.dataset = @dataset
981
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
982
- @c.columns.must_equal [:x, :y]
983
- @c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
984
- end
985
-
986
- it "should not restrict the schema for datasets with a :select option" do
987
- def @c.columns; [:x, :z]; end
988
- def @db.schema(table, opts = {})
989
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
990
- end
991
- @c.dataset = @dataset.select(:x, :y___z)
992
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :z=>{}, :y=>{:type=>:string})
993
- end
994
-
995
- it "should fallback to fetching records if schema raises an error" do
996
- def @db.schema(table, opts={})
997
- raise Sequel::Error
998
- end
999
- @c.dataset = @dataset.join(:x, :id).columns(:id, :x)
1000
- @c.db_schema.must_equal(:x=>{}, :id=>{})
1001
- end
1002
-
1003
- it "should automatically set a singular primary key based on the schema" do
1004
- ds = @dataset
1005
- d = ds.db
1006
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
1007
- @c.primary_key.must_equal :id
1008
- @c.dataset = ds
1009
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
1010
- @c.primary_key.must_equal :x
1011
- end
1012
-
1013
- it "should automatically set a singular primary key even if there are specific columns selected" do
1014
- ds = @dataset.select(:a, :b, :x)
1015
- d = ds.db
1016
- def d.schema(table, *opts) [[:a, {:primary_key=>false}], [:b, {:primary_key=>false}], [:x, {:primary_key=>true}]] end
1017
- @c.primary_key.must_equal :id
1018
- @c.dataset = ds
1019
- @c.db_schema.must_equal(:a=>{:primary_key=>false}, :b=>{:primary_key=>false}, :x=>{:primary_key=>true})
1020
- @c.primary_key.must_equal :x
1021
- end
1022
-
1023
- it "should automatically set the composite primary key based on the schema" do
1024
- ds = @dataset
1025
- d = ds.db
1026
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
1027
- @c.primary_key.must_equal :id
1028
- @c.dataset = ds
1029
- @c.db_schema.must_equal(:x=>{:primary_key=>true}, :y=>{:primary_key=>true})
1030
- @c.primary_key.must_equal [:x, :y]
1031
- end
1032
-
1033
- it "should set an immutable composite primary key based on the schema" do
1034
- ds = @dataset
1035
- d = ds.db
1036
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
1037
- @c.dataset = ds
1038
- @c.primary_key.must_equal [:x, :y]
1039
- proc{@c.primary_key.pop}.must_raise
1040
- end
1041
-
1042
- it "should automatically set no primary key based on the schema" do
1043
- ds = @dataset
1044
- d = ds.db
1045
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {:primary_key=>false}]] end
1046
- @c.primary_key.must_equal :id
1047
- @c.dataset = ds
1048
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
1049
- @c.primary_key.must_equal nil
1050
- end
1051
-
1052
- it "should automatically set primary key for dataset selecting table.*" do
1053
- ds = @dataset.select_all(:items)
1054
- d = ds.db
1055
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
1056
- @c.primary_key.must_equal :id
1057
- @c.dataset = ds
1058
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
1059
- @c.primary_key.must_equal :x
1060
- end
1061
-
1062
- it "should not modify the primary key unless all column schema hashes have a :primary_key entry" do
1063
- ds = @dataset
1064
- d = ds.db
1065
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {}]] end
1066
- @c.primary_key.must_equal :id
1067
- @c.dataset = ds
1068
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{})
1069
- @c.primary_key.must_equal :id
1070
- end
1071
- end
1072
-
1073
- describe "Model#use_transactions" do
1074
- before do
1075
- @c = Class.new(Sequel::Model(:items))
1076
- end
1077
-
1078
- it "should return class value by default" do
1079
- @c.use_transactions = true
1080
- @c.new.use_transactions.must_equal true
1081
- @c.use_transactions = false
1082
- @c.new.use_transactions.must_equal false
1083
- end
1084
-
1085
- it "should return set value if manually set" do
1086
- instance = @c.new
1087
- instance.use_transactions = false
1088
- instance.use_transactions.must_equal false
1089
- @c.use_transactions = true
1090
- instance.use_transactions.must_equal false
1091
-
1092
- instance.use_transactions = true
1093
- instance.use_transactions.must_equal true
1094
- @c.use_transactions = false
1095
- instance.use_transactions.must_equal true
1096
- end
1097
- end