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
@@ -1,451 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
-
3
- describe "Array#all_two_pairs?" do
4
- specify "should return false if empty" do
5
- [].all_two_pairs?.should == false
6
- end
7
-
8
- specify "should return false if any of the elements is not an array" do
9
- [1].all_two_pairs?.should == false
10
- [[1,2],1].all_two_pairs?.should == false
11
- end
12
-
13
- specify "should return false if any of the elements has a length other than two" do
14
- [[1,2],[]].all_two_pairs?.should == false
15
- [[1,2],[1]].all_two_pairs?.should == false
16
- [[1,2],[1,2,3]].all_two_pairs?.should == false
17
- end
18
-
19
- specify "should return true if all of the elements are arrays with a length of two" do
20
- [[1,2]].all_two_pairs?.should == true
21
- [[1,2],[1,2]].all_two_pairs?.should == true
22
- [[1,2],[1,2],[1,2]].all_two_pairs?.should == true
23
- end
24
- end
25
-
26
- describe "Array#case and Hash#case" do
27
- before do
28
- @d = Sequel::Dataset.new(nil)
29
- end
30
-
31
- specify "should return SQL CASE expression" do
32
- @d.literal({:x=>:y}.case(:z)).should == '(CASE WHEN x THEN y ELSE z END)'
33
- @d.literal({:x=>:y}.case(:z, :exp)).should == '(CASE exp WHEN x THEN y ELSE z END)'
34
- ['(CASE WHEN x THEN y WHEN a THEN b ELSE z END)',
35
- '(CASE WHEN a THEN b WHEN x THEN y ELSE z END)'].should(include(@d.literal({:x=>:y, :a=>:b}.case(:z))))
36
- @d.literal([[:x, :y]].case(:z)).should == '(CASE WHEN x THEN y ELSE z END)'
37
- @d.literal([[:x, :y], [:a, :b]].case(:z)).should == '(CASE WHEN x THEN y WHEN a THEN b ELSE z END)'
38
- @d.literal([[:x, :y], [:a, :b]].case(:z, :exp)).should == '(CASE exp WHEN x THEN y WHEN a THEN b ELSE z END)'
39
- @d.literal([[:x, :y], [:a, :b]].case(:z, :exp__w)).should == '(CASE exp.w WHEN x THEN y WHEN a THEN b ELSE z END)'
40
- end
41
-
42
- specify "should return SQL CASE expression with expression even if nil" do
43
- @d.literal({:x=>:y}.case(:z, nil)).should == '(CASE NULL WHEN x THEN y ELSE z END)'
44
- end
45
-
46
- specify "should raise an error if an array that isn't all two pairs is used" do
47
- proc{[:b].case(:a)}.should raise_error(Sequel::Error)
48
- proc{[:b, :c].case(:a)}.should raise_error(Sequel::Error)
49
- proc{[[:b, :c], :d].case(:a)}.should raise_error(Sequel::Error)
50
- end
51
-
52
- specify "should raise an error if an empty array/hash is used" do
53
- proc{[].case(:a)}.should raise_error(Sequel::Error)
54
- proc{{}.case(:a)}.should raise_error(Sequel::Error)
55
- end
56
- end
57
-
58
- describe "Array#sql_value_list and #sql_array" do
59
- before do
60
- @d = Sequel::Dataset.new(nil)
61
- end
62
-
63
- specify "should treat the array as an SQL value list instead of conditions when used as a placeholder value" do
64
- @d.filter("(a, b) IN ?", [[:x, 1], [:y, 2]]).sql.should == 'SELECT * WHERE ((a, b) IN ((x = 1) AND (y = 2)))'
65
- @d.filter("(a, b) IN ?", [[:x, 1], [:y, 2]].sql_value_list).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
66
- @d.filter("(a, b) IN ?", [[:x, 1], [:y, 2]].sql_array).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
67
- end
68
-
69
- specify "should be no difference when used as a hash value" do
70
- @d.filter([:a, :b]=>[[:x, 1], [:y, 2]]).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
71
- @d.filter([:a, :b]=>[[:x, 1], [:y, 2]].sql_value_list).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
72
- @d.filter([:a, :b]=>[[:x, 1], [:y, 2]].sql_array).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
73
- end
74
- end
75
-
76
- describe "String#lit" do
77
- before do
78
- @ds = ds = MockDatabase.new.dataset
79
- end
80
- specify "should return an LiteralString object" do
81
- 'xyz'.lit.should be_a_kind_of(Sequel::LiteralString)
82
- 'xyz'.lit.to_s.should == 'xyz'
83
- end
84
-
85
- specify "should inhibit string literalization" do
86
- Sequel::Database.new[:t].update_sql(:stamp => "NOW()".lit).should == \
87
- "UPDATE t SET stamp = NOW()"
88
- end
89
-
90
- specify "should return a PlaceholderLiteralString object if args are given" do
91
- a = 'DISTINCT ?'.lit(:a)
92
- a.should be_a_kind_of(Sequel::SQL::PlaceholderLiteralString)
93
- @ds.literal(a).should == 'DISTINCT a'
94
- @ds.quote_identifiers = true
95
- @ds.literal(a).should == 'DISTINCT "a"'
96
- end
97
-
98
- specify "should handle named placeholders if given a single argument hash" do
99
- a = 'DISTINCT :b'.lit(:b=>:a)
100
- a.should be_a_kind_of(Sequel::SQL::PlaceholderLiteralString)
101
- @ds.literal(a).should == 'DISTINCT a'
102
- @ds.quote_identifiers = true
103
- @ds.literal(a).should == 'DISTINCT "a"'
104
- end
105
-
106
- specify "should treat placeholder literal strings as generic expressions" do
107
- a = ':b'.lit(:b=>:a)
108
- @ds.literal(a + 1).should == "(a + 1)"
109
- @ds.literal(a & :b).should == "(a AND b)"
110
- @ds.literal(a.sql_string + :b).should == "(a || b)"
111
- end
112
- end
113
-
114
- describe "String#to_sequel_blob" do
115
- specify "should return a Blob object" do
116
- 'xyz'.to_sequel_blob.should be_a_kind_of(::Sequel::SQL::Blob)
117
- 'xyz'.to_sequel_blob.should == 'xyz'
118
- end
119
-
120
- specify "should retain binary data" do
121
- "\1\2\3\4".to_sequel_blob.should == "\1\2\3\4"
122
- end
123
- end
124
-
125
- describe "#desc" do
126
- before do
127
- @ds = Sequel::Dataset.new(nil)
128
- end
129
-
130
- specify "should format a DESC clause for a column ref" do
131
- :test.desc.to_s(@ds).should == 'test DESC'
132
-
133
- :items__price.desc.to_s(@ds).should == 'items.price DESC'
134
- end
135
-
136
- specify "should format a DESC clause for a function" do
137
- :avg.sql_function(:test).desc.to_s(@ds).should == 'avg(test) DESC'
138
- end
139
- end
140
-
141
- describe "#asc" do
142
- before do
143
- @ds = Sequel::Dataset.new(nil)
144
- end
145
-
146
- specify "should format a ASC clause for a column ref" do
147
- :test.asc.to_s(@ds).should == 'test ASC'
148
-
149
- :items__price.asc.to_s(@ds).should == 'items.price ASC'
150
- end
151
-
152
- specify "should format a ASC clause for a function" do
153
- :avg.sql_function(:test).asc.to_s(@ds).should == 'avg(test) ASC'
154
- end
155
- end
156
-
157
- describe "#as" do
158
- before do
159
- @ds = Sequel::Dataset.new(nil)
160
- end
161
-
162
- specify "should format a AS clause for a column ref" do
163
- :test.as(:t).to_s(@ds).should == 'test AS t'
164
-
165
- :items__price.as(:p).to_s(@ds).should == 'items.price AS p'
166
- end
167
-
168
- specify "should format a AS clause for a function" do
169
- :avg.sql_function(:test).as(:avg).to_s(@ds).should == 'avg(test) AS avg'
170
- end
171
-
172
- specify "should format a AS clause for a literal value" do
173
- 'abc'.as(:abc).to_s(@ds).should == "'abc' AS abc"
174
- end
175
- end
176
-
177
- describe "Column references" do
178
- before do
179
- @c = Class.new(Sequel::Dataset) do
180
- def quoted_identifier(c); "`#{c}`"; end
181
- end
182
- @ds = @c.new(MockDatabase.new)
183
- @ds.quote_identifiers = true
184
- end
185
-
186
- specify "should be quoted properly" do
187
- @ds.literal(:xyz).should == "`xyz`"
188
- @ds.literal(:xyz__abc).should == "`xyz`.`abc`"
189
-
190
- @ds.literal(:xyz.as(:x)).should == "`xyz` AS `x`"
191
- @ds.literal(:xyz__abc.as(:x)).should == "`xyz`.`abc` AS `x`"
192
-
193
- @ds.literal(:xyz___x).should == "`xyz` AS `x`"
194
- @ds.literal(:xyz__abc___x).should == "`xyz`.`abc` AS `x`"
195
- end
196
-
197
- specify "should be quoted properly in SQL functions" do
198
- @ds.literal(:avg.sql_function(:xyz)).should == "avg(`xyz`)"
199
- @ds.literal(:avg.sql_function(:xyz, 1)).should == "avg(`xyz`, 1)"
200
- @ds.literal(:avg.sql_function(:xyz).as(:a)).should == "avg(`xyz`) AS `a`"
201
- end
202
-
203
- specify "should be quoted properly in ASC/DESC clauses" do
204
- @ds.literal(:xyz.asc).should == "`xyz` ASC"
205
- @ds.literal(:avg.sql_function(:xyz, 1).desc).should == "avg(`xyz`, 1) DESC"
206
- end
207
-
208
- specify "should be quoted properly in a cast function" do
209
- @ds.literal(:x.cast(:integer)).should == "CAST(`x` AS integer)"
210
- @ds.literal(:x__y.cast('varchar(20)')).should == "CAST(`x`.`y` AS varchar(20))"
211
- end
212
- end
213
-
214
- describe "Blob" do
215
- specify "#to_sequel_blob should return self" do
216
- blob = "x".to_sequel_blob
217
- blob.to_sequel_blob.object_id.should == blob.object_id
218
- end
219
- end
220
-
221
- if RUBY_VERSION < '1.9.0'
222
- describe "Symbol#[]" do
223
- specify "should format an SQL Function" do
224
- ds = Sequel::Dataset.new(nil)
225
- ds.literal(:xyz[]).should == 'xyz()'
226
- ds.literal(:xyz[1]).should == 'xyz(1)'
227
- ds.literal(:xyz[1, 2, :abc[3]]).should == 'xyz(1, 2, abc(3))'
228
- end
229
- end
230
- end
231
-
232
- describe "Symbol#*" do
233
- before do
234
- @ds = Sequel::Dataset.new(nil)
235
- end
236
-
237
- specify "should format a qualified wildcard if no argument" do
238
- :xyz.*.to_s(@ds).should == 'xyz.*'
239
- :abc.*.to_s(@ds).should == 'abc.*'
240
- end
241
-
242
- specify "should format a filter expression if an argument" do
243
- :xyz.*(3).to_s(@ds).should == '(xyz * 3)'
244
- :abc.*(5).to_s(@ds).should == '(abc * 5)'
245
- end
246
-
247
- specify "should support qualified symbols if no argument" do
248
- :xyz__abc.*.to_s(@ds).should == 'xyz.abc.*'
249
- end
250
- end
251
-
252
- describe "Symbol" do
253
- before do
254
- @ds = Sequel::Dataset.new(nil)
255
- @ds.quote_identifiers = true
256
- @ds.identifier_input_method = :upcase
257
- end
258
-
259
- specify "#identifier should format an identifier" do
260
- @ds.literal(:xyz__abc.identifier).should == '"XYZ__ABC"'
261
- end
262
-
263
- specify "#qualify should format a qualified column" do
264
- @ds.literal(:xyz.qualify(:abc)).should == '"ABC"."XYZ"'
265
- end
266
-
267
- specify "#qualify should work on QualifiedIdentifiers" do
268
- @ds.literal(:xyz.qualify(:abc).qualify(:def)).should == '"DEF"."ABC"."XYZ"'
269
- end
270
-
271
- specify "should be able to qualify an identifier" do
272
- @ds.literal(:xyz.identifier.qualify(:xyz__abc)).should == '"XYZ"."ABC"."XYZ"'
273
- end
274
-
275
- specify "should be able to specify a schema.table.column" do
276
- @ds.literal(:column.qualify(:table.qualify(:schema))).should == '"SCHEMA"."TABLE"."COLUMN"'
277
- @ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).should == '"SCHEMA"."TABLE__NAME"."COLUMN"'
278
- end
279
-
280
- specify "should be able to specify order" do
281
- @oe = :xyz.desc
282
- @oe.class.should == Sequel::SQL::OrderedExpression
283
- @oe.descending.should == true
284
- @oe = :xyz.asc
285
- @oe.class.should == Sequel::SQL::OrderedExpression
286
- @oe.descending.should == false
287
- end
288
- end
289
-
290
- describe "Dataset#literal" do
291
- before do
292
- @ds = MockDataset.new(nil)
293
- end
294
-
295
- specify "should convert qualified symbol notation into dot notation" do
296
- @ds.literal(:abc__def).should == 'abc.def'
297
- end
298
-
299
- specify "should convert AS symbol notation into SQL AS notation" do
300
- @ds.literal(:xyz___x).should == 'xyz AS x'
301
- @ds.literal(:abc__def___x).should == 'abc.def AS x'
302
- end
303
-
304
- specify "should support names with digits" do
305
- @ds.literal(:abc2).should == 'abc2'
306
- @ds.literal(:xx__yy3).should == 'xx.yy3'
307
- @ds.literal(:ab34__temp3_4ax).should == 'ab34.temp3_4ax'
308
- @ds.literal(:x1___y2).should == 'x1 AS y2'
309
- @ds.literal(:abc2__def3___ggg4).should == 'abc2.def3 AS ggg4'
310
- end
311
-
312
- specify "should support upper case and lower case" do
313
- @ds.literal(:ABC).should == 'ABC'
314
- @ds.literal(:Zvashtoy__aBcD).should == 'Zvashtoy.aBcD'
315
- end
316
-
317
- specify "should support spaces inside column names" do
318
- @ds.quote_identifiers = true
319
- @ds.literal(:"AB C").should == '"AB C"'
320
- @ds.literal(:"Zvas htoy__aB cD").should == '"Zvas htoy"."aB cD"'
321
- @ds.literal(:"aB cD___XX XX").should == '"aB cD" AS "XX XX"'
322
- @ds.literal(:"Zva shtoy__aB cD___XX XX").should == '"Zva shtoy"."aB cD" AS "XX XX"'
323
- end
324
- end
325
-
326
- describe "Symbol" do
327
- before do
328
- @ds = Sequel::Dataset.new(MockDatabase.new)
329
- end
330
-
331
- specify "should support upper case outer functions" do
332
- :COUNT.sql_function('1').to_s(@ds).should == "COUNT('1')"
333
- end
334
-
335
- specify "should inhibit string literalization" do
336
- db = Sequel::Database.new
337
- ds = db[:t]
338
- ds.select(:COUNT.sql_function('1')).sql.should == "SELECT COUNT('1') FROM t"
339
- end
340
-
341
- specify "should support cast method" do
342
- :abc.cast(:integer).to_s(@ds).should == "CAST(abc AS integer)"
343
- end
344
-
345
- specify "should support sql array accesses via sql_subscript" do
346
- @ds.literal(:abc.sql_subscript(1)).should == "abc[1]"
347
- @ds.literal(:abc__def.sql_subscript(1)).should == "abc.def[1]"
348
- @ds.literal(:abc.sql_subscript(1)|2).should == "abc[1, 2]"
349
- end
350
-
351
- specify "should support cast_numeric and cast_string" do
352
- x = :abc.cast_numeric
353
- x.should be_a_kind_of(Sequel::SQL::NumericExpression)
354
- x.to_s(@ds).should == "CAST(abc AS integer)"
355
-
356
- x = :abc.cast_numeric(:real)
357
- x.should be_a_kind_of(Sequel::SQL::NumericExpression)
358
- x.to_s(@ds).should == "CAST(abc AS real)"
359
-
360
- x = :abc.cast_string
361
- x.should be_a_kind_of(Sequel::SQL::StringExpression)
362
- x.to_s(@ds).should == "CAST(abc AS varchar(255))"
363
-
364
- x = :abc.cast_string(:varchar)
365
- x.should be_a_kind_of(Sequel::SQL::StringExpression)
366
- x.to_s(@ds).should == "CAST(abc AS varchar(255))"
367
- end
368
-
369
- specify "should allow database independent types when casting" do
370
- m = MockDatabase.new
371
- m.instance_eval do
372
- def cast_type_literal(type)
373
- return :foo if type == Integer
374
- return :bar if type == String
375
- type
376
- end
377
- end
378
- @ds2 = Sequel::Dataset.new(m)
379
- :abc.cast(String).to_s(@ds).should == "CAST(abc AS varchar(255))"
380
- :abc.cast(String).to_s(@ds2).should == "CAST(abc AS bar)"
381
- :abc.cast(String).to_s(@ds2).should == "CAST(abc AS bar)"
382
- :abc.cast_string.to_s(@ds2).should == "CAST(abc AS bar)"
383
- :abc.cast_string(Integer).to_s(@ds2).should == "CAST(abc AS foo)"
384
- :abc.cast_numeric.to_s(@ds2).should == "CAST(abc AS foo)"
385
- :abc.cast_numeric(String).to_s(@ds2).should == "CAST(abc AS bar)"
386
- end
387
-
388
- specify "should support SQL EXTRACT function via #extract " do
389
- :abc.extract(:year).to_s(@ds).should == "extract(year FROM abc)"
390
- end
391
- end
392
-
393
- describe "Sequel::SQL::Function#==" do
394
- specify "should be true for functions with the same name and arguments, false otherwise" do
395
- a = :date.sql_function(:t)
396
- b = :date.sql_function(:t)
397
- a.should == b
398
- (a == b).should == true
399
- c = :date.sql_function(:c)
400
- a.should_not == c
401
- (a == c).should == false
402
- d = :time.sql_function(:c)
403
- a.should_not == d
404
- c.should_not == d
405
- (a == d).should == false
406
- (c == d).should == false
407
- end
408
- end
409
-
410
- describe "Sequel::SQL::OrderedExpression" do
411
- specify "should #desc" do
412
- @oe = :column.asc
413
- @oe.descending.should == false
414
- @oe.desc.descending.should == true
415
- end
416
-
417
- specify "should #asc" do
418
- @oe = :column.desc
419
- @oe.descending.should == true
420
- @oe.asc.descending.should == false
421
- end
422
-
423
- specify "should #invert" do
424
- @oe = :column.desc
425
- @oe.invert.descending.should == false
426
- @oe.invert.invert.descending.should == true
427
- end
428
- end
429
-
430
- describe "Expression" do
431
- specify "should consider objects == only if they have the same attributes" do
432
- :column.qualify(:table).cast(:type).*(:numeric_column).asc.should == :column.qualify(:table).cast(:type).*(:numeric_column).asc
433
- :other_column.qualify(:table).cast(:type).*(:numeric_column).asc.should_not == :column.qualify(:table).cast(:type).*(:numeric_column).asc
434
-
435
- :column.qualify(:table).cast(:type).*(:numeric_column).asc.should eql(:column.qualify(:table).cast(:type).*(:numeric_column).asc)
436
- :other_column.qualify(:table).cast(:type).*(:numeric_column).asc.should_not eql(:column.qualify(:table).cast(:type).*(:numeric_column).asc)
437
- end
438
-
439
- specify "should use the same hash value for objects that have the same attributes" do
440
- :column.qualify(:table).cast(:type).*(:numeric_column).asc.hash.should == :column.qualify(:table).cast(:type).*(:numeric_column).asc.hash
441
- :other_column.qualify(:table).cast(:type).*(:numeric_column).asc.hash.should_not == :column.qualify(:table).cast(:type).*(:numeric_column).asc.hash
442
-
443
- h = {}
444
- a = :column.qualify(:table).cast(:type).*(:numeric_column).asc
445
- b = :column.qualify(:table).cast(:type).*(:numeric_column).asc
446
- h[a] = 1
447
- h[b] = 2
448
- h[a].should == 2
449
- h[b].should == 2
450
- end
451
- end