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,759 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Model attribute setters" do
4
- before do
5
- @c = Class.new(Sequel::Model(:items)) do
6
- columns :id, :x, :y, :"x y"
7
- end
8
- @o = @c.new
9
- DB.reset
10
- end
11
-
12
- it "refresh should return self" do
13
- @o = @c[1]
14
- def @o._refresh(*) [] end
15
- @o.refresh.must_equal @o
16
- end
17
-
18
- it "should mark the column value as changed" do
19
- @o.changed_columns.must_equal []
20
-
21
- @o.x = 2
22
- @o.changed_columns.must_equal [:x]
23
-
24
- @o.y = 3
25
- @o.changed_columns.must_equal [:x, :y]
26
-
27
- @o.changed_columns.clear
28
-
29
- @o[:x] = 2
30
- @o.changed_columns.must_equal [:x]
31
-
32
- @o[:y] = 3
33
- @o.changed_columns.must_equal [:x, :y]
34
- end
35
-
36
- it "should handle columns that can't be called like normal ruby methods" do
37
- @o.send(:"x y=", 3)
38
- @o.changed_columns.must_equal [:"x y"]
39
- @o.values.must_equal(:"x y"=>3)
40
- @o.send(:"x y").must_equal 3
41
- end
42
- end
43
-
44
- describe "Model.def_column_alias" do
45
- before do
46
- @o = Class.new(Sequel::Model(:items)) do
47
- columns :id
48
- def_column_alias(:id2, :id)
49
- end.load(:id=>1)
50
- DB.reset
51
- end
52
-
53
- it "should create an getter alias for the column" do
54
- @o.id2.must_equal 1
55
- end
56
-
57
- it "should create an setter alias for the column" do
58
- @o.id2 = 2
59
- @o.id2.must_equal 2
60
- @o.values.must_equal(:id => 2)
61
- end
62
- end
63
-
64
- describe Sequel::Model, "dataset" do
65
- before do
66
- @a = Class.new(Sequel::Model(:items))
67
- @b = Class.new(Sequel::Model)
68
- class ::Elephant < Sequel::Model(:ele1); end
69
- class ::Maggot < Sequel::Model; end
70
- class ::ShoeSize < Sequel::Model; end
71
- class ::BootSize < ShoeSize; end
72
- end
73
- after do
74
- [:Elephant, :Maggot, :ShoeSize, :BootSize].each{|x| Object.send(:remove_const, x)}
75
- end
76
-
77
- it "should default to the plural of the class name" do
78
- Maggot.dataset.sql.must_equal 'SELECT * FROM maggots'
79
- ShoeSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
80
- end
81
-
82
- it "should return the dataset for the superclass if available" do
83
- BootSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
84
- end
85
-
86
- it "should return the correct dataset if set explicitly" do
87
- Elephant.dataset.sql.must_equal 'SELECT * FROM ele1'
88
- @a.dataset.sql.must_equal 'SELECT * FROM items'
89
- end
90
-
91
- it "should raise if no dataset is explicitly set and the class is anonymous" do
92
- proc {@b.dataset}.must_raise(Sequel::Error)
93
- end
94
-
95
- it "should not override dataset explicitly set when subclassing" do
96
- sc = Class.new(::Elephant) do
97
- set_dataset :foo
98
- end
99
- sc.table_name.must_equal :foo
100
- end
101
- end
102
-
103
- describe Sequel::Model, "implicit table names" do
104
- after do
105
- Object.send(:remove_const, :BlahBlah)
106
- end
107
- it "should disregard namespaces for the table name" do
108
- module ::BlahBlah
109
- class MwaHaHa < Sequel::Model
110
- end
111
- end
112
- BlahBlah::MwaHaHa.dataset.sql.must_equal 'SELECT * FROM mwa_ha_has'
113
- end
114
-
115
- it "should automatically set datasets when anonymous class of Sequel::Model is used as superclass" do
116
- class BlahBlah < Class.new(Sequel::Model); end
117
- BlahBlah.dataset.sql.must_equal 'SELECT * FROM blah_blahs'
118
- end
119
- end
120
-
121
- describe Sequel::Model, ".def_dataset_method" do
122
- before do
123
- @c = Class.new(Sequel::Model(:items))
124
- end
125
-
126
- it "should add a method to the dataset and model if called with a block argument" do
127
- @c.def_dataset_method(:return_3){3}
128
- @c.return_3.must_equal 3
129
- @c.dataset.return_3.must_equal 3
130
- end
131
-
132
- it "should handle weird method names" do
133
- @c.def_dataset_method(:"return 3"){3}
134
- @c.send(:"return 3").must_equal 3
135
- @c.dataset.send(:"return 3").must_equal 3
136
- end
137
-
138
- it "should not add a model method if the model already responds to the method" do
139
- @c.instance_eval do
140
- def foo
141
- 1
142
- end
143
-
144
- private
145
-
146
- def bar
147
- 2
148
- end
149
-
150
- def_dataset_method(:foo){3}
151
- def_dataset_method(:bar){4}
152
- end
153
- @c.foo.must_equal 1
154
- @c.dataset.foo.must_equal 3
155
- @c.send(:bar).must_equal 2
156
- @c.dataset.bar.must_equal 4
157
- end
158
-
159
- it "should add all passed methods to the model if called without a block argument" do
160
- @c.def_dataset_method(:return_3, :return_4)
161
- proc{@c.return_3}.must_raise(NoMethodError)
162
- proc{@c.return_4}.must_raise(NoMethodError)
163
- @c.dataset.instance_eval do
164
- def return_3; 3; end
165
- def return_4; 4; end
166
- end
167
- @c.return_3.must_equal 3
168
- @c.return_4.must_equal 4
169
- end
170
-
171
- it "should cache calls and readd methods if set_dataset is used" do
172
- @c.def_dataset_method(:return_3){3}
173
- @c.set_dataset :items
174
- @c.return_3.must_equal 3
175
- @c.dataset.return_3.must_equal 3
176
- end
177
-
178
- it "should readd methods to subclasses, if set_dataset is used in a subclass" do
179
- @c.def_dataset_method(:return_3){3}
180
- c = Class.new(@c)
181
- c.set_dataset :items
182
- c.return_3.must_equal 3
183
- c.dataset.return_3.must_equal 3
184
- end
185
- end
186
-
187
- describe Sequel::Model, ".dataset_module" do
188
- before do
189
- @c = Class.new(Sequel::Model(:items))
190
- end
191
-
192
- it "should extend the dataset with the module if the model has a dataset" do
193
- @c.dataset_module{def return_3() 3 end}
194
- @c.dataset.return_3.must_equal 3
195
- end
196
-
197
- it "should also extend the instance_dataset with the module if the model has a dataset" do
198
- @c.dataset_module{def return_3() 3 end}
199
- @c.instance_dataset.return_3.must_equal 3
200
- end
201
-
202
- it "should add methods defined in the module to the class" do
203
- @c.dataset_module{def return_3() 3 end}
204
- @c.return_3.must_equal 3
205
- end
206
-
207
- it "should add methods defined in the module outside the block to the class" do
208
- @c.dataset_module.module_eval{def return_3() 3 end}
209
- @c.return_3.must_equal 3
210
- end
211
-
212
- it "should cache calls and readd methods if set_dataset is used" do
213
- @c.dataset_module{def return_3() 3 end}
214
- @c.set_dataset :items
215
- @c.return_3.must_equal 3
216
- @c.dataset.return_3.must_equal 3
217
- end
218
-
219
- it "should readd methods to subclasses, if set_dataset is used in a subclass" do
220
- @c.dataset_module{def return_3() 3 end}
221
- c = Class.new(@c)
222
- c.set_dataset :items
223
- c.return_3.must_equal 3
224
- c.dataset.return_3.must_equal 3
225
- end
226
-
227
- it "should only have a single dataset_module per class" do
228
- @c.dataset_module{def return_3() 3 end}
229
- @c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
230
- @c.return_3.must_equal 4
231
- end
232
-
233
- it "should not have subclasses share the dataset_module" do
234
- @c.dataset_module{def return_3() 3 end}
235
- c = Class.new(@c)
236
- c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
237
- c.return_3.must_equal 6
238
- end
239
-
240
- it "should accept a module object and extend the dataset with it" do
241
- @c.dataset_module Module.new{def return_3() 3 end}
242
- @c.dataset.return_3.must_equal 3
243
- end
244
-
245
- it "should be able to call dataset_module with a module multiple times" do
246
- @c.dataset_module Module.new{def return_3() 3 end}
247
- @c.dataset_module Module.new{def return_4() 4 end}
248
- @c.dataset.return_3.must_equal 3
249
- @c.dataset.return_4.must_equal 4
250
- end
251
-
252
- it "should be able mix dataset_module calls with and without arguments" do
253
- @c.dataset_module{def return_3() 3 end}
254
- @c.dataset_module Module.new{def return_4() 4 end}
255
- @c.dataset.return_3.must_equal 3
256
- @c.dataset.return_4.must_equal 4
257
- end
258
-
259
- it "should have modules provided to dataset_module extend subclass datasets" do
260
- @c.dataset_module{def return_3() 3 end}
261
- @c.dataset_module Module.new{def return_4() 4 end}
262
- c = Class.new(@c)
263
- c.set_dataset :a
264
- c.dataset.return_3.must_equal 3
265
- c.dataset.return_4.must_equal 4
266
- end
267
-
268
- it "should return the dataset module if given a block" do
269
- Object.new.extend(@c.dataset_module{def return_3() 3 end}).return_3.must_equal 3
270
- end
271
-
272
- it "should return the argument if given one" do
273
- Object.new.extend(@c.dataset_module Module.new{def return_3() 3 end}).return_3.must_equal 3
274
- end
275
-
276
- it "should have dataset_module support a subset method" do
277
- @c.dataset_module{subset :released, :released}
278
- @c.released.sql.must_equal 'SELECT * FROM items WHERE released'
279
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
280
- end
281
-
282
- it "should raise error if called with both an argument and ablock" do
283
- proc{@c.dataset_module(Module.new{def return_3() 3 end}){}}.must_raise(Sequel::Error)
284
- end
285
- end
286
-
287
- describe "A model class with implicit table name" do
288
- before do
289
- class ::Donkey < Sequel::Model
290
- end
291
- end
292
- after do
293
- Object.send(:remove_const, :Donkey)
294
- end
295
-
296
- it "should have a dataset associated with the model class" do
297
- Donkey.dataset.model.must_equal Donkey
298
- end
299
- end
300
-
301
- describe "A model inheriting from a model" do
302
- before do
303
- class ::Feline < Sequel::Model; end
304
- class ::Leopard < Feline; end
305
- end
306
- after do
307
- Object.send(:remove_const, :Leopard)
308
- Object.send(:remove_const, :Feline)
309
- end
310
-
311
- it "should have a dataset associated with itself" do
312
- Feline.dataset.model.must_equal Feline
313
- Leopard.dataset.model.must_equal Leopard
314
- end
315
- end
316
-
317
- describe "Model.primary_key" do
318
- before do
319
- @c = Class.new(Sequel::Model)
320
- end
321
-
322
- it "should default to id" do
323
- @c.primary_key.must_equal :id
324
- end
325
-
326
- it "should be overridden by set_primary_key" do
327
- @c.set_primary_key :cid
328
- @c.primary_key.must_equal :cid
329
-
330
- @c.set_primary_key([:id1, :id2])
331
- @c.primary_key.must_equal [:id1, :id2]
332
- end
333
-
334
- it "should use nil for no primary key" do
335
- @c.no_primary_key
336
- @c.primary_key.must_equal nil
337
- end
338
- end
339
-
340
- describe "Model.primary_key_hash" do
341
- before do
342
- @c = Class.new(Sequel::Model)
343
- end
344
-
345
- it "should handle a single primary key" do
346
- @c.primary_key_hash(1).must_equal(:id=>1)
347
- end
348
-
349
- it "should handle a composite primary key" do
350
- @c.set_primary_key([:id1, :id2])
351
- @c.primary_key_hash([1, 2]).must_equal(:id1=>1, :id2=>2)
352
- end
353
-
354
- it "should raise an error for no primary key" do
355
- @c.no_primary_key
356
- proc{@c.primary_key_hash(1)}.must_raise(Sequel::Error)
357
- end
358
- end
359
-
360
- describe "Model.qualified_primary_key_hash" do
361
- before do
362
- @c = Class.new(Sequel::Model(:items))
363
- end
364
-
365
- it "should handle a single primary key" do
366
- @c.qualified_primary_key_hash(1).must_equal(Sequel.qualify(:items, :id)=>1)
367
- end
368
-
369
- it "should handle a composite primary key" do
370
- @c.set_primary_key([:id1, :id2])
371
- @c.qualified_primary_key_hash([1, 2]).must_equal(Sequel.qualify(:items, :id1)=>1, Sequel.qualify(:items, :id2)=>2)
372
- end
373
-
374
- it "should raise an error for no primary key" do
375
- @c.no_primary_key
376
- proc{@c.qualified_primary_key_hash(1)}.must_raise(Sequel::Error)
377
- end
378
-
379
- it "should allow specifying a different qualifier" do
380
- @c.qualified_primary_key_hash(1, :apple).must_equal(Sequel.qualify(:apple, :id)=>1)
381
- @c.set_primary_key([:id1, :id2])
382
- @c.qualified_primary_key_hash([1, 2], :bear).must_equal(Sequel.qualify(:bear, :id1)=>1, Sequel.qualify(:bear, :id2)=>2)
383
- end
384
- end
385
-
386
- describe "Model.db" do
387
- before do
388
- @db = Sequel.mock
389
- @databases = Sequel::DATABASES.dup
390
- @model_db = Sequel::Model.db
391
- Sequel::Model.db = nil
392
- Sequel::DATABASES.clear
393
- end
394
- after do
395
- Sequel::Model.instance_variable_get(:@db).must_equal nil
396
- Sequel::DATABASES.replace(@databases)
397
- Sequel::Model.db = @model_db
398
- end
399
-
400
- it "should be required when creating named model classes" do
401
- begin
402
- proc{class ModelTest < Sequel::Model; end}.must_raise(Sequel::Error)
403
- ensure
404
- Object.send(:remove_const, :ModelTest)
405
- end
406
- end
407
-
408
- it "should be required when creating anonymous model classes without a database" do
409
- proc{Sequel::Model(:foo)}.must_raise(Sequel::Error)
410
- end
411
-
412
- it "should not be required when creating anonymous model classes with a database" do
413
- Sequel::Model(@db).db.must_equal @db
414
- Sequel::Model(@db[:foo]).db.must_equal @db
415
- end
416
-
417
- it "should work correctly when subclassing anonymous model classes with a database" do
418
- begin
419
- Class.new(Sequel::Model(@db)).db.must_equal @db
420
- Class.new(Sequel::Model(@db[:foo])).db.must_equal @db
421
- class ModelTest < Sequel::Model(@db)
422
- db.must_equal @db
423
- end
424
- class ModelTest2 < Sequel::Model(@db[:foo])
425
- db.must_equal @db
426
- end
427
- ModelTest.instance_variable_set(:@db, nil)
428
- ModelTest.db.must_equal @db
429
- ensure
430
- Object.send(:remove_const, :ModelTest)
431
- Object.send(:remove_const, :ModelTest2)
432
- end
433
- end
434
- end
435
-
436
- describe "Model.db=" do
437
- before do
438
- @db1 = Sequel.mock
439
- @db2 = Sequel.mock
440
-
441
- @m = Class.new(Sequel::Model(@db1[:blue].filter(:x=>1)))
442
- end
443
-
444
- it "should affect the underlying dataset" do
445
- @m.db = @db2
446
-
447
- @m.dataset.db.must_equal @db2
448
- @m.dataset.db.wont_equal @db1
449
- end
450
-
451
- it "should keep the same dataset options" do
452
- @m.db = @db2
453
- @m.dataset.sql.must_equal 'SELECT * FROM blue WHERE (x = 1)'
454
- end
455
-
456
- it "should use the database for subclasses" do
457
- @m.db = @db2
458
- Class.new(@m).db.must_equal @db2
459
- end
460
- end
461
-
462
- describe Sequel::Model, ".(allowed|restricted)_columns " do
463
- before do
464
- @c = Class.new(Sequel::Model(:blahblah)) do
465
- columns :x, :y, :z
466
- end
467
- @c.strict_param_setting = false
468
- @c.instance_variable_set(:@columns, [:x, :y, :z])
469
- DB.reset
470
- end
471
-
472
- it "should set the allowed columns correctly" do
473
- @c.allowed_columns.must_equal nil
474
- @c.set_allowed_columns :x
475
- @c.allowed_columns.must_equal [:x]
476
- @c.set_allowed_columns :x, :y
477
- @c.allowed_columns.must_equal [:x, :y]
478
- end
479
-
480
- it "should only set allowed columns by default" do
481
- @c.set_allowed_columns :x, :y
482
- i = @c.new(:x => 1, :y => 2, :z => 3)
483
- i.values.must_equal(:x => 1, :y => 2)
484
- i.set(:x => 4, :y => 5, :z => 6)
485
- i.values.must_equal(:x => 4, :y => 5)
486
-
487
- @c.instance_dataset._fetch = @c.dataset._fetch = {:x => 7}
488
- i = @c.new
489
- i.update(:x => 7, :z => 9)
490
- i.values.must_equal(:x => 7)
491
- DB.sqls.must_equal ["INSERT INTO blahblah (x) VALUES (7)", "SELECT * FROM blahblah WHERE (id = 10) LIMIT 1"]
492
- end
493
- end
494
-
495
- describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
496
- before do
497
- @c = Class.new(Sequel::Model(:blahblah)) do
498
- set_primary_key :id
499
- columns :x, :y, :z, :id
500
- end
501
- @c.strict_param_setting = false
502
- end
503
-
504
- it "should restrict updates to primary key by default" do
505
- i = @c.new(:x => 1, :y => 2, :id => 3)
506
- i.values.must_equal(:x => 1, :y => 2)
507
- i.set(:x => 4, :y => 5, :id => 6)
508
- i.values.must_equal(:x => 4, :y => 5)
509
- end
510
-
511
- it "should allow updates to primary key if unrestrict_primary_key is used" do
512
- @c.unrestrict_primary_key
513
- i = @c.new(:x => 1, :y => 2, :id => 3)
514
- i.values.must_equal(:x => 1, :y => 2, :id=>3)
515
- i.set(:x => 4, :y => 5, :id => 6)
516
- i.values.must_equal(:x => 4, :y => 5, :id=>6)
517
- end
518
-
519
- it "should have restrict_primary_key? return true or false depending" do
520
- @c.restrict_primary_key?.must_equal true
521
- @c.unrestrict_primary_key
522
- @c.restrict_primary_key?.must_equal false
523
- c1 = Class.new(@c)
524
- c1.restrict_primary_key?.must_equal false
525
- @c.restrict_primary_key
526
- @c.restrict_primary_key?.must_equal true
527
- c1.restrict_primary_key?.must_equal false
528
- c2 = Class.new(@c)
529
- c2.restrict_primary_key?.must_equal true
530
- end
531
- end
532
-
533
- describe Sequel::Model, ".strict_param_setting" do
534
- before do
535
- @c = Class.new(Sequel::Model(:blahblah)) do
536
- columns :x, :y, :z, :id
537
- set_allowed_columns :x, :y
538
- end
539
- end
540
-
541
- it "should be enabled by default" do
542
- @c.strict_param_setting.must_equal true
543
- end
544
-
545
- it "should raise an error if a missing/restricted column/method is accessed" do
546
- proc{@c.new(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
547
- proc{@c.create(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
548
- c = @c.new
549
- proc{c.set(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
550
- proc{c.set_all(:use_after_commit_rollback => false)}.must_raise(Sequel::MassAssignmentRestriction)
551
- proc{c.set_only({:x=>1}, :y)}.must_raise(Sequel::MassAssignmentRestriction)
552
- proc{c.update(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
553
- proc{c.update_all(:use_after_commit_rollback=>false)}.must_raise(Sequel::MassAssignmentRestriction)
554
- proc{c.update_only({:x=>1}, :y)}.must_raise(Sequel::MassAssignmentRestriction)
555
- end
556
-
557
- it "should be disabled by strict_param_setting = false" do
558
- @c.strict_param_setting = false
559
- @c.strict_param_setting.must_equal false
560
- @c.new(:z=>1)
561
- end
562
- end
563
-
564
- describe Sequel::Model, ".require_modification" do
565
- before do
566
- @ds1 = DB[:items]
567
- def @ds1.provides_accurate_rows_matched?() false end
568
- @ds2 = DB[:items]
569
- def @ds2.provides_accurate_rows_matched?() true end
570
- end
571
- after do
572
- Sequel::Model.require_modification = nil
573
- end
574
-
575
- it "should depend on whether the dataset provides an accurate number of rows matched by default" do
576
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
577
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
578
- end
579
-
580
- it "should obey global setting regardless of dataset support if set" do
581
- Sequel::Model.require_modification = true
582
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal true
583
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
584
-
585
- Sequel::Model.require_modification = false
586
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
587
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
588
- end
589
- end
590
-
591
- describe Sequel::Model, ".[] optimization" do
592
- before do
593
- @db = Sequel.mock
594
- @db.quote_identifiers = true
595
- def @db.schema(*) [[:id, {:primary_key=>true}]] end
596
- def @db.supports_schema_parsing?() true end
597
- @c = Class.new(Sequel::Model(@db))
598
- end
599
-
600
- it "should set simple_pk to the literalized primary key column name if a single primary key" do
601
- @c.set_primary_key :id
602
- @c.simple_pk.must_equal '"id"'
603
- @c.set_primary_key :b
604
- @c.simple_pk.must_equal '"b"'
605
- @c.set_primary_key Sequel.identifier(:b__a)
606
- @c.simple_pk.must_equal '"b__a"'
607
- end
608
-
609
- it "should have simple_pk be blank if compound or no primary key" do
610
- @c.no_primary_key
611
- @c.simple_pk.must_equal nil
612
- @c.set_primary_key [:b, :a]
613
- @c.simple_pk.must_equal nil
614
- end
615
-
616
- it "should have simple table set if passed a Symbol to set_dataset" do
617
- @c.set_dataset :a
618
- @c.simple_table.must_equal '"a"'
619
- @c.set_dataset :b
620
- @c.simple_table.must_equal '"b"'
621
- @c.set_dataset :b__a
622
- @c.simple_table.must_equal '"b"."a"'
623
- end
624
-
625
- it "should have simple_table set if passed a simple select all dataset to set_dataset" do
626
- @c.set_dataset @db[:a]
627
- @c.simple_table.must_equal '"a"'
628
- @c.set_dataset @db[:b]
629
- @c.simple_table.must_equal '"b"'
630
- @c.set_dataset @db[:b__a]
631
- @c.simple_table.must_equal '"b"."a"'
632
- end
633
-
634
- it "should have simple_pk and simple_table respect dataset's identifier input methods" do
635
- ds = @db[:ab]
636
- ds.identifier_input_method = :reverse
637
- @c.set_dataset ds
638
- @c.simple_table.must_equal '"ba"'
639
- @c.set_primary_key :cd
640
- @c.simple_pk.must_equal '"dc"'
641
-
642
- @c.set_dataset ds.from(:ef__gh)
643
- @c.simple_table.must_equal '"fe"."hg"'
644
- end
645
-
646
- it "should have simple_table = nil if passed a non-simple select all dataset to set_dataset" do
647
- @c.set_dataset @c.db[:a].filter(:active)
648
- @c.simple_table.must_equal nil
649
- end
650
-
651
- it "should have simple_table inherit superclass's setting" do
652
- Class.new(@c).simple_table.must_equal nil
653
- @c.set_dataset :a
654
- Class.new(@c).simple_table.must_equal '"a"'
655
- end
656
-
657
- it "should use Dataset#with_sql if simple_table and simple_pk are true" do
658
- @c.set_dataset :a
659
- @c.instance_dataset._fetch = @c.dataset._fetch = {:id => 1}
660
- @c[1].must_equal @c.load(:id=>1)
661
- @db.sqls.must_equal ['SELECT * FROM "a" WHERE "id" = 1']
662
- end
663
-
664
- it "should not use Dataset#with_sql if either simple_table or simple_pk is nil" do
665
- @c.set_dataset @db[:a].filter(:active)
666
- @c.dataset._fetch = {:id => 1}
667
- @c[1].must_equal @c.load(:id=>1)
668
- @db.sqls.must_equal ['SELECT * FROM "a" WHERE ("active" AND ("id" = 1)) LIMIT 1']
669
- end
670
- end
671
-
672
- describe "Model datasets #with_pk with #with_pk!" do
673
- before do
674
- @c = Class.new(Sequel::Model(:a))
675
- @ds = @c.dataset
676
- @ds._fetch = {:id=>1}
677
- DB.reset
678
- end
679
-
680
- it "should be callable on the model class with optimized SQL" do
681
- @c.with_pk(1).must_equal @c.load(:id=>1)
682
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
683
- @c.with_pk!(1).must_equal @c.load(:id=>1)
684
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
685
- end
686
-
687
- it "should return the first record where the primary key matches" do
688
- @ds.with_pk(1).must_equal @c.load(:id=>1)
689
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
690
- @ds.with_pk!(1).must_equal @c.load(:id=>1)
691
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
692
- end
693
-
694
- it "should handle existing filters" do
695
- @ds.filter(:a=>2).with_pk(1)
696
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
697
- @ds.filter(:a=>2).with_pk!(1)
698
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
699
- end
700
-
701
- it "should work with string values" do
702
- @ds.with_pk("foo")
703
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
704
- @ds.with_pk!("foo")
705
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
706
- end
707
-
708
- it "should handle an array for composite primary keys" do
709
- @c.set_primary_key [:id1, :id2]
710
- @ds.with_pk([1, 2])
711
- sqls = DB.sqls
712
- ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1",
713
- "SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].must_include(sqls.pop)
714
- sqls.must_equal []
715
-
716
- @ds.with_pk!([1, 2])
717
- sqls = DB.sqls
718
- ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1",
719
- "SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].must_include(sqls.pop)
720
- sqls.must_equal []
721
- end
722
-
723
- it "should have with_pk return nil and with_pk! raise if no rows match" do
724
- @ds._fetch = []
725
- @ds.with_pk(1).must_equal nil
726
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
727
- proc{@ds.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
728
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
729
- end
730
-
731
- it "should have with_pk return nil and with_pk! raise if no rows match when calling the class method" do
732
- @ds._fetch = []
733
- @c.with_pk(1).must_equal nil
734
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
735
- proc{@c.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
736
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
737
- end
738
-
739
- it "should have #[] consider an integer as a primary key lookup" do
740
- @ds[1].must_equal @c.load(:id=>1)
741
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
742
- end
743
-
744
- it "should not have #[] consider a string as a primary key lookup" do
745
- @ds['foo'].must_equal @c.load(:id=>1)
746
- DB.sqls.must_equal ["SELECT * FROM a WHERE (foo) LIMIT 1"]
747
- end
748
- end
749
-
750
- describe "Model::include" do
751
- it "shouldn't change the signature of Module::include" do
752
- mod1 = Module.new
753
- mod2 = Module.new
754
- including_class = Class.new(Sequel::Model(:items)) do
755
- include(mod1, mod2)
756
- end
757
- including_class.included_modules.must_include(mod1, mod2)
758
- end
759
- end