sequel 3.21.0 → 3.41.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 (363) hide show
  1. data/CHANGELOG +1131 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +106 -65
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +68 -52
  7. data/doc/advanced_associations.rdoc +201 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/bin_sequel.rdoc +144 -0
  10. data/doc/cheat_sheet.rdoc +21 -21
  11. data/doc/core_extensions.rdoc +374 -0
  12. data/doc/dataset_basics.rdoc +10 -10
  13. data/doc/dataset_filtering.rdoc +54 -42
  14. data/doc/mass_assignment.rdoc +56 -0
  15. data/doc/migration.rdoc +89 -557
  16. data/doc/model_hooks.rdoc +80 -29
  17. data/doc/object_model.rdoc +576 -0
  18. data/doc/opening_databases.rdoc +121 -53
  19. data/doc/prepared_statements.rdoc +41 -15
  20. data/doc/querying.rdoc +137 -56
  21. data/doc/reflection.rdoc +36 -10
  22. data/doc/release_notes/3.22.0.txt +39 -0
  23. data/doc/release_notes/3.23.0.txt +172 -0
  24. data/doc/release_notes/3.24.0.txt +420 -0
  25. data/doc/release_notes/3.25.0.txt +88 -0
  26. data/doc/release_notes/3.26.0.txt +88 -0
  27. data/doc/release_notes/3.27.0.txt +82 -0
  28. data/doc/release_notes/3.28.0.txt +304 -0
  29. data/doc/release_notes/3.29.0.txt +459 -0
  30. data/doc/release_notes/3.30.0.txt +135 -0
  31. data/doc/release_notes/3.31.0.txt +146 -0
  32. data/doc/release_notes/3.32.0.txt +202 -0
  33. data/doc/release_notes/3.33.0.txt +157 -0
  34. data/doc/release_notes/3.34.0.txt +671 -0
  35. data/doc/release_notes/3.35.0.txt +144 -0
  36. data/doc/release_notes/3.36.0.txt +245 -0
  37. data/doc/release_notes/3.37.0.txt +338 -0
  38. data/doc/release_notes/3.38.0.txt +234 -0
  39. data/doc/release_notes/3.39.0.txt +237 -0
  40. data/doc/release_notes/3.40.0.txt +73 -0
  41. data/doc/release_notes/3.41.0.txt +155 -0
  42. data/doc/schema_modification.rdoc +585 -0
  43. data/doc/sharding.rdoc +99 -8
  44. data/doc/sql.rdoc +154 -112
  45. data/doc/testing.rdoc +169 -0
  46. data/doc/thread_safety.rdoc +17 -0
  47. data/doc/transactions.rdoc +137 -0
  48. data/doc/validations.rdoc +1 -1
  49. data/doc/virtual_rows.rdoc +78 -43
  50. data/lib/sequel/adapters/ado/access.rb +334 -0
  51. data/lib/sequel/adapters/ado/mssql.rb +18 -12
  52. data/lib/sequel/adapters/ado.rb +69 -21
  53. data/lib/sequel/adapters/amalgalite.rb +17 -14
  54. data/lib/sequel/adapters/cubrid.rb +143 -0
  55. data/lib/sequel/adapters/db2.rb +178 -85
  56. data/lib/sequel/adapters/dbi.rb +19 -21
  57. data/lib/sequel/adapters/do/mysql.rb +17 -11
  58. data/lib/sequel/adapters/do/postgres.rb +2 -61
  59. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  60. data/lib/sequel/adapters/do.rb +20 -39
  61. data/lib/sequel/adapters/firebird.rb +33 -210
  62. data/lib/sequel/adapters/ibmdb.rb +452 -0
  63. data/lib/sequel/adapters/informix.rb +6 -29
  64. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  65. data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
  66. data/lib/sequel/adapters/jdbc/db2.rb +78 -0
  67. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  68. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  69. data/lib/sequel/adapters/jdbc/h2.rb +68 -31
  70. data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
  71. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  73. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  74. data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
  75. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  76. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  77. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  78. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  79. data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
  80. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  81. data/lib/sequel/adapters/jdbc.rb +308 -114
  82. data/lib/sequel/adapters/mock.rb +372 -0
  83. data/lib/sequel/adapters/mysql.rb +130 -230
  84. data/lib/sequel/adapters/mysql2.rb +64 -63
  85. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  86. data/lib/sequel/adapters/odbc.rb +29 -10
  87. data/lib/sequel/adapters/openbase.rb +7 -11
  88. data/lib/sequel/adapters/oracle.rb +364 -57
  89. data/lib/sequel/adapters/postgres.rb +379 -145
  90. data/lib/sequel/adapters/shared/access.rb +236 -11
  91. data/lib/sequel/adapters/shared/cubrid.rb +216 -0
  92. data/lib/sequel/adapters/shared/db2.rb +353 -0
  93. data/lib/sequel/adapters/shared/firebird.rb +231 -0
  94. data/lib/sequel/adapters/shared/informix.rb +53 -0
  95. data/lib/sequel/adapters/shared/mssql.rb +412 -116
  96. data/lib/sequel/adapters/shared/mysql.rb +396 -89
  97. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
  98. data/lib/sequel/adapters/shared/oracle.rb +262 -45
  99. data/lib/sequel/adapters/shared/postgres.rb +688 -279
  100. data/lib/sequel/adapters/shared/progress.rb +5 -8
  101. data/lib/sequel/adapters/shared/sqlite.rb +317 -96
  102. data/lib/sequel/adapters/sqlite.rb +109 -46
  103. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  104. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  105. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  106. data/lib/sequel/adapters/swift.rb +31 -27
  107. data/lib/sequel/adapters/tinytds.rb +177 -25
  108. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  109. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  110. data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
  111. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  112. data/lib/sequel/ast_transformer.rb +194 -0
  113. data/lib/sequel/connection_pool/sharded_single.rb +23 -13
  114. data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
  115. data/lib/sequel/connection_pool/single.rb +11 -3
  116. data/lib/sequel/connection_pool/threaded.rb +69 -20
  117. data/lib/sequel/connection_pool.rb +20 -18
  118. data/lib/sequel/core.rb +143 -11
  119. data/lib/sequel/database/connecting.rb +66 -29
  120. data/lib/sequel/database/dataset.rb +4 -4
  121. data/lib/sequel/database/dataset_defaults.rb +63 -2
  122. data/lib/sequel/database/logging.rb +7 -2
  123. data/lib/sequel/database/misc.rb +192 -51
  124. data/lib/sequel/database/query.rb +299 -114
  125. data/lib/sequel/database/schema_generator.rb +103 -36
  126. data/lib/sequel/database/schema_methods.rb +310 -69
  127. data/lib/sequel/dataset/actions.rb +344 -90
  128. data/lib/sequel/dataset/features.rb +101 -8
  129. data/lib/sequel/dataset/graph.rb +42 -15
  130. data/lib/sequel/dataset/misc.rb +52 -25
  131. data/lib/sequel/dataset/mutation.rb +12 -7
  132. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  133. data/lib/sequel/dataset/query.rb +322 -68
  134. data/lib/sequel/dataset/sql.rb +716 -293
  135. data/lib/sequel/dataset.rb +8 -0
  136. data/lib/sequel/exceptions.rb +4 -0
  137. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  138. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  139. data/lib/sequel/extensions/blank.rb +4 -0
  140. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  141. data/lib/sequel/extensions/connection_validator.rb +109 -0
  142. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  143. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  144. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  145. data/lib/sequel/extensions/inflector.rb +4 -0
  146. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  147. data/lib/sequel/extensions/migration.rb +100 -11
  148. data/lib/sequel/extensions/named_timezones.rb +9 -0
  149. data/lib/sequel/extensions/null_dataset.rb +94 -0
  150. data/lib/sequel/extensions/pagination.rb +4 -0
  151. data/lib/sequel/extensions/pg_array.rb +539 -0
  152. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  153. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  154. data/lib/sequel/extensions/pg_hstore.rb +334 -0
  155. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  156. data/lib/sequel/extensions/pg_inet.rb +113 -0
  157. data/lib/sequel/extensions/pg_interval.rb +191 -0
  158. data/lib/sequel/extensions/pg_json.rb +212 -0
  159. data/lib/sequel/extensions/pg_range.rb +513 -0
  160. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  161. data/lib/sequel/extensions/pg_row.rb +576 -0
  162. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  163. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  164. data/lib/sequel/extensions/pretty_table.rb +17 -72
  165. data/lib/sequel/extensions/query.rb +8 -4
  166. data/lib/sequel/extensions/query_literals.rb +79 -0
  167. data/lib/sequel/extensions/schema_caching.rb +76 -0
  168. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  169. data/lib/sequel/extensions/select_remove.rb +39 -0
  170. data/lib/sequel/extensions/server_block.rb +140 -0
  171. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  172. data/lib/sequel/extensions/sql_expr.rb +8 -110
  173. data/lib/sequel/extensions/string_date_time.rb +4 -0
  174. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  175. data/lib/sequel/extensions/to_dot.rb +99 -83
  176. data/lib/sequel/model/associations.rb +1263 -409
  177. data/lib/sequel/model/base.rb +624 -171
  178. data/lib/sequel/model/errors.rb +1 -1
  179. data/lib/sequel/model/exceptions.rb +24 -2
  180. data/lib/sequel/model/inflections.rb +1 -1
  181. data/lib/sequel/model.rb +30 -11
  182. data/lib/sequel/no_core_ext.rb +2 -0
  183. data/lib/sequel/plugins/active_model.rb +13 -1
  184. data/lib/sequel/plugins/association_pks.rb +137 -16
  185. data/lib/sequel/plugins/caching.rb +25 -18
  186. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  187. data/lib/sequel/plugins/composition.rb +44 -12
  188. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  189. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  190. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  191. data/lib/sequel/plugins/dirty.rb +214 -0
  192. data/lib/sequel/plugins/eager_each.rb +59 -0
  193. data/lib/sequel/plugins/force_encoding.rb +6 -6
  194. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  195. data/lib/sequel/plugins/identity_map.rb +134 -15
  196. data/lib/sequel/plugins/instance_filters.rb +10 -0
  197. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  198. data/lib/sequel/plugins/json_serializer.rb +77 -6
  199. data/lib/sequel/plugins/list.rb +13 -2
  200. data/lib/sequel/plugins/many_through_many.rb +103 -51
  201. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  202. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  203. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  204. data/lib/sequel/plugins/pg_row.rb +121 -0
  205. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  206. data/lib/sequel/plugins/prepared_statements.rb +168 -0
  207. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  208. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  209. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  210. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  211. data/lib/sequel/plugins/schema.rb +8 -3
  212. data/lib/sequel/plugins/serialization.rb +98 -49
  213. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  214. data/lib/sequel/plugins/sharding.rb +21 -54
  215. data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
  216. data/lib/sequel/plugins/static_cache.rb +99 -0
  217. data/lib/sequel/plugins/subclasses.rb +29 -3
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  219. data/lib/sequel/plugins/timestamps.rb +1 -1
  220. data/lib/sequel/plugins/touch.rb +18 -6
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  223. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  224. data/lib/sequel/plugins/validation_class_methods.rb +2 -1
  225. data/lib/sequel/plugins/validation_helpers.rb +57 -4
  226. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  227. data/lib/sequel/sql.rb +721 -141
  228. data/lib/sequel/timezones.rb +67 -40
  229. data/lib/sequel/version.rb +1 -1
  230. data/spec/adapters/db2_spec.rb +146 -0
  231. data/spec/adapters/firebird_spec.rb +53 -39
  232. data/spec/adapters/mssql_spec.rb +261 -66
  233. data/spec/adapters/mysql_spec.rb +597 -352
  234. data/spec/adapters/oracle_spec.rb +92 -117
  235. data/spec/adapters/postgres_spec.rb +2103 -341
  236. data/spec/adapters/spec_helper.rb +16 -6
  237. data/spec/adapters/sqlite_spec.rb +237 -76
  238. data/spec/core/connection_pool_spec.rb +270 -141
  239. data/spec/core/database_spec.rb +980 -524
  240. data/spec/core/dataset_spec.rb +1658 -1243
  241. data/spec/core/expression_filters_spec.rb +741 -334
  242. data/spec/core/mock_adapter_spec.rb +453 -0
  243. data/spec/core/object_graph_spec.rb +88 -129
  244. data/spec/core/schema_generator_spec.rb +4 -4
  245. data/spec/core/schema_spec.rb +556 -53
  246. data/spec/core/spec_helper.rb +7 -48
  247. data/spec/core_extensions_spec.rb +626 -0
  248. data/spec/extensions/active_model_spec.rb +13 -0
  249. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  250. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  251. data/spec/extensions/association_dependencies_spec.rb +15 -25
  252. data/spec/extensions/association_pks_spec.rb +227 -33
  253. data/spec/extensions/association_proxies_spec.rb +4 -4
  254. data/spec/extensions/boolean_readers_spec.rb +25 -25
  255. data/spec/extensions/caching_spec.rb +47 -51
  256. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  257. data/spec/extensions/columns_introspection_spec.rb +91 -0
  258. data/spec/extensions/composition_spec.rb +18 -13
  259. data/spec/extensions/connection_validator_spec.rb +118 -0
  260. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  261. data/spec/extensions/constraint_validations_spec.rb +316 -0
  262. data/spec/extensions/dataset_associations_spec.rb +199 -0
  263. data/spec/extensions/defaults_setter_spec.rb +88 -0
  264. data/spec/extensions/dirty_spec.rb +155 -0
  265. data/spec/extensions/eager_each_spec.rb +34 -0
  266. data/spec/extensions/eval_inspect_spec.rb +67 -0
  267. data/spec/extensions/force_encoding_spec.rb +4 -2
  268. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  269. data/spec/extensions/identity_map_spec.rb +142 -24
  270. data/spec/extensions/inflector_spec.rb +0 -4
  271. data/spec/extensions/instance_filters_spec.rb +11 -21
  272. data/spec/extensions/instance_hooks_spec.rb +72 -0
  273. data/spec/extensions/json_serializer_spec.rb +49 -12
  274. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  275. data/spec/extensions/list_spec.rb +49 -40
  276. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  277. data/spec/extensions/many_through_many_spec.rb +368 -254
  278. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  279. data/spec/extensions/migration_spec.rb +140 -35
  280. data/spec/extensions/named_timezones_spec.rb +29 -11
  281. data/spec/extensions/nested_attributes_spec.rb +268 -89
  282. data/spec/extensions/null_dataset_spec.rb +85 -0
  283. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  284. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  285. data/spec/extensions/pg_array_spec.rb +324 -0
  286. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  287. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  288. data/spec/extensions/pg_hstore_spec.rb +200 -0
  289. data/spec/extensions/pg_inet_spec.rb +47 -0
  290. data/spec/extensions/pg_interval_spec.rb +72 -0
  291. data/spec/extensions/pg_json_spec.rb +99 -0
  292. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  293. data/spec/extensions/pg_range_spec.rb +395 -0
  294. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  295. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  296. data/spec/extensions/pg_row_spec.rb +340 -0
  297. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  298. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  299. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  300. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  301. data/spec/extensions/prepared_statements_spec.rb +87 -0
  302. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  303. data/spec/extensions/pretty_table_spec.rb +7 -6
  304. data/spec/extensions/query_literals_spec.rb +167 -0
  305. data/spec/extensions/query_spec.rb +9 -3
  306. data/spec/extensions/rcte_tree_spec.rb +50 -43
  307. data/spec/extensions/schema_caching_spec.rb +41 -0
  308. data/spec/extensions/schema_dumper_spec.rb +434 -49
  309. data/spec/extensions/schema_spec.rb +30 -49
  310. data/spec/extensions/select_remove_spec.rb +38 -0
  311. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  312. data/spec/extensions/serialization_spec.rb +86 -48
  313. data/spec/extensions/server_block_spec.rb +90 -0
  314. data/spec/extensions/sharding_spec.rb +69 -143
  315. data/spec/extensions/single_table_inheritance_spec.rb +65 -29
  316. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  317. data/spec/extensions/spec_helper.rb +34 -67
  318. data/spec/extensions/split_array_nil_spec.rb +24 -0
  319. data/spec/extensions/sql_expr_spec.rb +29 -60
  320. data/spec/extensions/static_cache_spec.rb +145 -0
  321. data/spec/extensions/subclasses_spec.rb +14 -0
  322. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  323. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  324. data/spec/extensions/timestamps_spec.rb +6 -6
  325. data/spec/extensions/to_dot_spec.rb +8 -11
  326. data/spec/extensions/touch_spec.rb +53 -14
  327. data/spec/extensions/tree_spec.rb +11 -26
  328. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  329. data/spec/extensions/update_primary_key_spec.rb +30 -24
  330. data/spec/extensions/validation_class_methods_spec.rb +77 -68
  331. data/spec/extensions/validation_helpers_spec.rb +48 -37
  332. data/spec/extensions/xml_serializer_spec.rb +29 -4
  333. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  334. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  335. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  336. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  337. data/spec/integration/associations_test.rb +659 -21
  338. data/spec/integration/database_test.rb +25 -5
  339. data/spec/integration/dataset_test.rb +729 -141
  340. data/spec/integration/eager_loader_test.rb +38 -54
  341. data/spec/integration/migrator_test.rb +2 -3
  342. data/spec/integration/model_test.rb +81 -2
  343. data/spec/integration/plugin_test.rb +871 -160
  344. data/spec/integration/prepared_statement_test.rb +272 -128
  345. data/spec/integration/schema_test.rb +377 -57
  346. data/spec/integration/spec_helper.rb +49 -32
  347. data/spec/integration/timezone_test.rb +38 -12
  348. data/spec/integration/transaction_test.rb +183 -8
  349. data/spec/integration/type_test.rb +40 -8
  350. data/spec/model/association_reflection_spec.rb +207 -8
  351. data/spec/model/associations_spec.rb +1206 -693
  352. data/spec/model/base_spec.rb +334 -100
  353. data/spec/model/dataset_methods_spec.rb +45 -27
  354. data/spec/model/eager_loading_spec.rb +828 -692
  355. data/spec/model/hooks_spec.rb +355 -67
  356. data/spec/model/model_spec.rb +251 -179
  357. data/spec/model/plugins_spec.rb +24 -13
  358. data/spec/model/record_spec.rb +506 -232
  359. data/spec/model/spec_helper.rb +16 -77
  360. data/spec/model/validations_spec.rb +38 -2
  361. data/spec/rcov.opts +2 -0
  362. metadata +223 -81
  363. data/spec/core/core_sql_spec.rb +0 -451
@@ -0,0 +1,144 @@
1
+ = New Features
2
+
3
+ * A dirty plugin has been added, which saves the initial value of
4
+ the column when the column is changed, similar to
5
+ ActiveModel::Dirty:
6
+
7
+ artist.name # => 'Foo'
8
+ artist.name = 'Bar'
9
+ artist.initial_value(:name) # 'Foo'
10
+ artist.column_change(:name) # ['Foo', 'Bar']
11
+ artist.column_changes # {:name => ['Foo', 'Bar']}
12
+ artist.column_changed?(:name) # true
13
+ artist.reset_column(:name)
14
+ artist.name # => 'Foo'
15
+ artist.column_changed?(:name) # false
16
+ artist.update(:name=>'Bar')
17
+ artist.column_changes # => {}
18
+ artist.previous_changes # => {:name=>['Foo', 'Bar']}
19
+
20
+ * Database#create_table now respects an :as option to create a
21
+ database based on the results of a query. The :as option value
22
+ should either be an SQL string or a dataset.
23
+
24
+ DB.create_table(:new_foos, :as=>DB[:foos].where(:new=>true))
25
+
26
+ * The json_serializer and xml_serializer plugins can now serialize
27
+ arbitrary arrays of model objects by passing an :array option
28
+ to the to_json class method. This works around an issue in
29
+ ruby's JSON library where Array#to_json does not pass arguments
30
+ given to it to the members of the array.
31
+
32
+ Artist.to_json(:array=>[Artist[1]], :include=>:albums)
33
+
34
+ * You can now use the % (modulus) operator in the same way you
35
+ can use the bitwise operators in Sequel:
36
+
37
+ :column.sql_number % 1 # (column % 1)
38
+
39
+ * On PostgreSQL, you can now provide :only, :cascade, and :restart
40
+ options to Dataset#truncate to use ONLY, CASCADE, and
41
+ RESTART IDENTITY. Additionally, you can now truncate multiple
42
+ tables at the same time:
43
+
44
+ DB.from(:table1, :table2).truncate(:cascade=>true)
45
+
46
+ * The :index option when creating columns in the schema generator
47
+ can now take a hash of index options:
48
+
49
+ DB.create_table(:foo){Integer :bar, :index=>{:unique=>true}}
50
+
51
+ * A Database#cache_schema accessor has been added, it can be set
52
+ to false to have the Database never cache schema results. This
53
+ can be useful in Rails development mode, so that you don't need to
54
+ restart a running server to have models pick up the new schema.
55
+
56
+ * Database#log_exception has been added for easier instrumentation.
57
+ It is called with the exception and SQL query string for all
58
+ queries that raise an exception.
59
+
60
+ * The Sequel.migration DSL now has a transaction method that forces
61
+ transaction use for the given migration.
62
+
63
+ = Other Improvements
64
+
65
+ * Many theoretical thread-safety issues have been fixed for ruby
66
+ implementations that don't use a global interpreter lock.
67
+ Previously, Sequel relied on MRI's global interpreter lock for
68
+ part of its thread safety, now it does manually locking in more
69
+ places to avoid thread-safety issues on JRuby (and other ruby
70
+ implementations without a global interpreter lock).
71
+
72
+ No Sequel user ever reported a production error related to the
73
+ previous thread-safety issues, and most of the issues fixed
74
+ were so difficult to hit that even tests specifically designed
75
+ to raise errors were unable to do so.
76
+
77
+ * Sequel.single_threaded = true now disables the mutex
78
+ synchronization that enforces thread safety for additional
79
+ performance in single threaded mode.
80
+
81
+ * Sequel's migrators now only attempt to use transactions by
82
+ default if the underlying database supports transactional DDL.
83
+ SQLite does support transactional DDL, but Sequel will not
84
+ use transactions for SQLite migrations as it causes issues
85
+ when emulating alter_table operations for tables with foreign
86
+ keys.
87
+
88
+ * Errors that occur when rolling back database transactions are
89
+ now handled correctly. Previously, the underlying exception was
90
+ raised, it wasn't correctly wrapped in a Sequel::DatabaseError,
91
+ and if it was due to a database disconnection, the connection
92
+ wasn't removed from the pool.
93
+
94
+ * Sequel no longer sets ruby instance variables on java objects,
95
+ fixing warnings on JRuby 1.7 and attempting to be forward
96
+ compatible with JRuby 2.0.
97
+
98
+ * Sequel now uses date and timestamp formats that are multilanguage
99
+ and not DATEFORMAT dependent on Microsoft SQL Server.
100
+
101
+ * Sequel now correctly escapes blackslash-carriage return-line feed
102
+ on Microsoft SQL Server.
103
+
104
+ * Parsing the column default values in the oracle adapter no longer
105
+ requires database superuser privileges.
106
+
107
+ * Sequel now correctly handles parsing schema for tables in other
108
+ databases on MySQL. Previously, it would always look in the
109
+ current database.
110
+
111
+ * Sequel no longer doubles backslashes in strings by default. It
112
+ now only does so on MySQL, since that is the only database that
113
+ appears to use backslashes for escaping. This fixes issues with
114
+ backslashes being doubled on some of the less commonly used
115
+ adapters.
116
+
117
+ * The pg_auto_parameterize extension now works correctly when
118
+ using cursors.
119
+
120
+ * Dataset#truncate now raises an Error if you attempt to do so
121
+ on a dataset that uses HAVING. Previously, it only checked for
122
+ WHERE.
123
+
124
+ * The schema dumper now recognized the identity type.
125
+
126
+ = Backwards Compatibility
127
+
128
+ * Association reflections now store cached information in a
129
+ separate subhash due to the thread-safety changes. Any code
130
+ accessing an association reflection should always call the
131
+ related method to get the cached data instead of checking
132
+ for a specific location in the hash.
133
+
134
+ * Association reflection internals for many_through_many associations
135
+ changed significantly, any code that accesses the edge information
136
+ in the reflection will need to be changed to use the new methods
137
+ instead of accessing the old values directly.
138
+
139
+ * The features deprecated in 3.34.0 have now been removed:
140
+ * Ruby <1.8.7 support
141
+ * PostgreSQL <8.2 support
142
+ * Dataset#disable_insert_returning on PostgreSQL
143
+ * Array#all_two_pairs? and #sql_expr_if_all_two_pairs
144
+
@@ -0,0 +1,245 @@
1
+ = New Features
2
+
3
+ * An eager_each plugin has been added, which automatically makes
4
+ eagerly loaded datasets do eager loading if you call #each (or
5
+ another Enumerable method) instead of #all. By default, if you
6
+ call #each on an eager dataset, it will not do eager loading,
7
+ and if you call #each on an eager_graph dataset, you will
8
+ get plain hashes with columns from all joined tables instead of
9
+ model objects. With this plugin, #each on both eager and
10
+ eager_graph datasets will do eager loading.
11
+
12
+ * The nested attributes plugin now supports composite primary keys
13
+ in associated records. Additionally, it now deals better with
14
+ natural primary keys in associated records. There is a new
15
+ :unmatched_pk option that can be set to :create if you want to
16
+ create new associated records when the input hash contains
17
+ primary key information that doesn't match one of the existing
18
+ associated objects.
19
+
20
+ The nested attributes plugin now also supports a :transform option.
21
+ If given, this option is called with the parent object and the
22
+ input hash given for each associated record passed into the
23
+ nested atttributes setter. The callable should return the hash
24
+ of attributes to use.
25
+
26
+ * Model#from_json in the json_serializer plugin now takes an options
27
+ hash and recognizes the :fields option. If the :fields option is
28
+ given, it should be an array of field names, and set_fields is
29
+ called with the array instead of using set. This allows you to
30
+ easily filter which fields in the hash are set in the model
31
+ instance. The entire options hash is also passed to set_fields
32
+ if :fields is present, so you can additionally use the :missing =>
33
+ :raise or :missing => :skip options that set_fields supports.
34
+
35
+ * The Dataset#to_json method in the json_serializer plugin now
36
+ respects :root=>:collection and :root=>:instance options. If
37
+ :root=>:collection is given, only the collection is wrapped in a
38
+ hash, and if :root=>:instance is given, only the instances are
39
+ wrapped in a hash. For backwards compatibility, both the
40
+ instances and collection are wrapped in a hash:
41
+
42
+ Model.to_json(:root=>true)
43
+ # {"models":[{"model":{"id":1}}]}
44
+
45
+ Model.to_json(:root=>:collection)
46
+ # {"models":[{"id":1}]}
47
+
48
+ Model.to_json(:root=>:instance)
49
+ # [{"model":{"id":1}}]
50
+
51
+ Wrapping both the collection and instance in a root by default
52
+ is probably an undesired behavior, so the default for :root=>true
53
+ may change in the next major version of Sequel. Users who want
54
+ the current behavior should switch to using :root=>:both.
55
+
56
+ * The schema_dumper extension now respects an :index_names option
57
+ when dumping. This option can be set to false to never dump the
58
+ index names. It can also be set to :namespace, in which case if
59
+ the database does not have a global index namespace, it will
60
+ automatically prefix the name of the index with the name of the
61
+ table.
62
+
63
+ Database#global_index_namespace? was added to check if the
64
+ database uses a global index namespace. If false, index names are
65
+ probably namespaced per table (MySQL, MSSQL, Oracle).
66
+
67
+ * :each is now a valid prepared statement type. This prepared
68
+ statement type requires a block when you call the statement, and
69
+ iterates over the records of the statement a row at a time.
70
+ Previously, there wasn't a way to iterate over the records of a
71
+ prepared statement a row at a time, since the :select and :all
72
+ types collect all rows into an array before iterating over them.
73
+
74
+ * A :connection_handling=>:queue option is now respected for
75
+ database objects, and changes the threaded connection pools to use
76
+ a queue instead of a stack as the data structure for storing
77
+ available connections. A queue does not perform as well as a
78
+ stack, but reduces the likelihood of stale connections.
79
+
80
+ It is possible that Sequel will change in the future from using a
81
+ stack by default to using a queue by default, so any users who
82
+ specifically desire a stack to be used should specify the
83
+ :connection_handling=>:stack option.
84
+
85
+ * Sequel::Migrator now supports is_current? class method to check
86
+ if there are no outstanding migrations to apply. It also supports
87
+ a check_current class method, which raises an exception if there
88
+ are outstanding migrations to apply.
89
+
90
+ * A pg_json extension has been added, supporting PostgreSQL's 9.2
91
+ json type, similarly to the pg_array and pg_hstore extensions.
92
+ Note that with the current PostgreSQL json code, the root object
93
+ can be a string or number, but ruby's json library requires the
94
+ root json value to be an object or array. So you will probably
95
+ get an exception if you attempt to retrieve a PostgreSQL json
96
+ value that ruby's JSON library won't parse.
97
+
98
+ * A pg_inet extension has been added, which automatically typecasts
99
+ PostgreSQL inet and cidr types to ruby IPAddr objects on retrieval.
100
+
101
+ * Database#transaction on PostgreSQL now recognizes :read_only and
102
+ :deferrable options, and can use them to set the READ ONLY and
103
+ DEFERRABLE transaction flags. A :synchronous option is also
104
+ recognized, which can be set to true, false, :local, or
105
+ :remote_write, and sets the value of synchronous_commit just for
106
+ that transaction.
107
+
108
+ * When adding and dropping indexes on PostgreSQL, a :concurrently
109
+ option can be used to create or drop the index CONCURRENTLY, which
110
+ doesn't require a full write table lock.
111
+
112
+ * When dropping indexes on PostgreSQL, :if_exists and :cascade options
113
+ are now recognized.
114
+
115
+ * When using alter_table set_column_type on PostgreSQL, the :using
116
+ option is respected, and can be used to force a specific conversion
117
+ from the previous value to the new value with the USING syntax.
118
+
119
+ * On MySQL, you can now set an :sql_mode option when connecting. This
120
+ can be a string or symbol or an array of them, and each should match
121
+ one of MySQL's sql_modes. MySQL's default SQL mode is fairly loose,
122
+ and using one of the strict sql modes is recommended, but for
123
+ backwards compatibility, Sequel will not set a specific SQL mode by
124
+ default. However, that may change in the next major version of
125
+ Sequel, so to be forwards compatible you should set :sql_mode=>nil
126
+ if you do not desire a strict SQL mode to be set automatically.
127
+
128
+ * Partial indexes are now supported on Microsoft SQL Server 2008
129
+ (SQL Server refers to them as filtered indexes). Attempting to
130
+ use a partial index on an earlier version of SQL Server will
131
+ result in the database raising an exception.
132
+
133
+ * A jdbc/progress adapter has been added, supporting the Progress
134
+ database via the jdbc adapter.
135
+
136
+ = Other Improvements
137
+
138
+ * Dataset#get now works correctly if you pass it a nil or false
139
+ argument. Previously, it ignored the argument and used the block
140
+ instead. If you want to use the block argument, you should not
141
+ pass in a regular argument.
142
+
143
+ * Database#call now passes any blocks given to it to the underlying
144
+ prepared statement object. Before, a passed block was ignored.
145
+
146
+ * Sequel::Model.db is no longer set automatically when creating
147
+ an anonymous class with an associated database object. This fixes
148
+ cases where a library would create namespaced models, and the
149
+ database used by the library would be set as the default for the
150
+ user's application code.
151
+
152
+ * Model *_to_one association setters are now no-ops if you pass a
153
+ value that is the same as the cached value. This fixes issues with
154
+ reciprocal associations getting reordered, and is better
155
+ for performance.
156
+
157
+ For cases where the old behavior is desired, the
158
+ set_associated_object_if_same? method can be overridden to return
159
+ true for object. If you are manually setting objects in the
160
+ associations cache before calling the setter method, you may want
161
+ to set that.
162
+
163
+ * The dirty plugin no longer affects the return value of refresh
164
+ and lock!. Internal changes should now help ensure that plugins
165
+ don't affect the return values of these methods.
166
+
167
+ * Sequel now supports JRuby 1.7's new exception handling, fixing
168
+ exception handling when connecting in the jdbc adapter.
169
+
170
+ * When dumping unsigned integer types in the schema dumper, if the
171
+ unsigned values could overflow a 32-bit signed integer type,
172
+ the generic Bignum class is used as the type. This should fix
173
+ issues when copying a database containing an unsigned 32-bit
174
+ integer column with values between 2^31 and 2^32-1.
175
+
176
+ * In the optimistic_locking plugin, attempting to refresh and
177
+ save after a failed save now works correctly. Before, the second
178
+ save would never modify a row.
179
+
180
+ * Time types on jdbc/postgres are now typecasted accurately on
181
+ retrieval, before they could be off by up to a millisecond due to
182
+ floating point issues.
183
+
184
+ * Disconnect detection in the mysql2 adapter has been improved.
185
+
186
+ * The jdbc/mysql, do/mysql, and swift/mysql adapters all now support
187
+ the :timeout option to set the MySQL wait_timeout.
188
+
189
+ * Savepoints in prepared transactions are now supported on MySQL
190
+ 5.5.23+, since the bug that caused them to be unsupported starting
191
+ in 5.5.13 has been fixed.
192
+
193
+ * Parsing foreign key metadata for tables with an explicit
194
+ schema now works correctly on PostgreSQL.
195
+
196
+ * bin/sequel -C now namespaces indexes automatically when copying
197
+ from a database without a global index namespace to a database
198
+ with a global index namespace.
199
+
200
+ * Indexes are now dropped in reverse order that they were added in
201
+ the schema_dumper.
202
+
203
+ * The Model typecasting code works around bugs in objects where
204
+ object.==('') would raise an exception instead of returning false.
205
+
206
+ * A better error message is used if an invalid JDBC URL is
207
+ provided and the JDBC driver's new.connect method returns NULL.
208
+
209
+ * A document describing Sequel's object model has been added,
210
+ describing the objects Sequel uses to represent SQL concepts.
211
+
212
+ * Most adapter specific options to Database methods are now mentioned
213
+ in the main Database method RDoc.
214
+
215
+ = Backwards Compatibility
216
+
217
+ * The nested_attributes plugin internals changed significantly. If
218
+ you were overriding one of the nested_attributes* private methods
219
+ and calling super to get the default behavior, you may have to
220
+ update your code.
221
+
222
+ * Database#case_sensitive_like has been removed on SQLite. This
223
+ method never worked correctly, it always returned false even if
224
+ the case_sensitive_like PRAGMA was set. That's because SQLite
225
+ doesn't offer a getter for this PRAGMA, only a setter. Note that
226
+ Database#case_sensitive_like= still exists and works correctly.
227
+
228
+ * Database#single_value has been removed from the native SQLite
229
+ adapter. This method was designed for internal use, and hasn't
230
+ been used for some time. Any current users of the method should
231
+ switch to Dataset#single_value.
232
+
233
+ * The private Database#defined_columns_for method in the SQLite
234
+ adapter no longer takes an options hash.
235
+
236
+ * A couple jdbc/postgres adapter methods are now private. Previously,
237
+ the jdbc/postgres adapter overrode some private superclass methods
238
+ but left the methods public.
239
+
240
+ * When using the optimistic_locking plugin, refreshing inside a
241
+ before_update method after calling super will now result in the
242
+ lock checking being skipped.
243
+
244
+ * The private Model#_refresh no longer returns self, so external
245
+ plugins should no longer rely on that behavior.