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,7 +1,7 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
3
  describe "Eagerly loading a tree structure" do
4
- before do
4
+ before(:all) do
5
5
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
6
6
  INTEGRATION_DB.create_table!(:nodes) do
7
7
  primary_key :id
@@ -12,7 +12,7 @@ describe "Eagerly loading a tree structure" do
12
12
  one_to_many :children, :key=>:parent_id
13
13
 
14
14
  # Only useful when eager loading
15
- many_to_one :ancestors, :eager_loader=>(proc do |eo|
15
+ many_to_one :ancestors, :eager_loader_key=>nil, :eager_loader=>(proc do |eo|
16
16
  # Handle cases where the root node has the same parent_id as primary_key
17
17
  # and also when it is NULL
18
18
  non_root_nodes = eo[:rows].reject do |n|
@@ -36,7 +36,7 @@ describe "Eagerly loading a tree structure" do
36
36
  end
37
37
  end
38
38
  end)
39
- many_to_one :descendants, :eager_loader=>(proc do |eo|
39
+ many_to_one :descendants, :eager_loader_key=>nil, :eager_loader=>(proc do |eo|
40
40
  id_map = {}
41
41
  eo[:rows].each do |n|
42
42
  # Initialize an empty array of child associations for each parent node
@@ -66,9 +66,8 @@ describe "Eagerly loading a tree structure" do
66
66
  Node.insert(:parent_id=>4)
67
67
  Node.insert(:parent_id=>5)
68
68
  Node.insert(:parent_id=>6)
69
- clear_sqls
70
69
  end
71
- after do
70
+ after(:all) do
72
71
  INTEGRATION_DB.drop_table :nodes
73
72
  Object.send(:remove_const, :Node)
74
73
  end
@@ -145,7 +144,6 @@ describe "Association Extensions" do
145
144
  many_to_one :author
146
145
  end
147
146
  @author = Author.create
148
- clear_sqls
149
147
  end
150
148
  after do
151
149
  INTEGRATION_DB.drop_table :authorships, :authors
@@ -172,7 +170,7 @@ describe "Association Extensions" do
172
170
  end
173
171
 
174
172
  describe "has_many :through has_many and has_one :through belongs_to" do
175
- before do
173
+ before(:all) do
176
174
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
177
175
  INTEGRATION_DB.create_table!(:firms) do
178
176
  primary_key :id
@@ -187,7 +185,7 @@ describe "has_many :through has_many and has_one :through belongs_to" do
187
185
  end
188
186
  end), \
189
187
  :eager_loader=>(proc do |eo|
190
- id_map = eo[:key_hash][Firm.primary_key]
188
+ id_map = eo[:id_map]
191
189
  eo[:rows].each{|firm| firm.associations[:invoices] = []}
192
190
  Invoice.eager_graph(:client).filter(:client__firm_id=>id_map.keys).all do |inv|
193
191
  id_map[inv.client.firm_id].each do |firm|
@@ -251,9 +249,8 @@ describe "has_many :through has_many and has_one :through belongs_to" do
251
249
  @invoice3 = Invoice.create(:client => @client2)
252
250
  @invoice4 = Invoice.create(:client => @client3)
253
251
  @invoice5 = Invoice.create(:client => @client3)
254
- clear_sqls
255
252
  end
256
- after do
253
+ after(:all) do
257
254
  INTEGRATION_DB.drop_table :invoices, :clients, :firms
258
255
  Object.send(:remove_const, :Firm)
259
256
  Object.send(:remove_const, :Client)
@@ -324,7 +321,7 @@ describe "has_many :through has_many and has_one :through belongs_to" do
324
321
  end
325
322
 
326
323
  describe "Polymorphic Associations" do
327
- before do
324
+ before(:all) do
328
325
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
329
326
  INTEGRATION_DB.create_table!(:assets) do
330
327
  primary_key :id
@@ -336,7 +333,7 @@ describe "Polymorphic Associations" do
336
333
  many_to_one :attachable, :reciprocal=>:assets, \
337
334
  :dataset=>(proc do
338
335
  klass = m.call(attachable_type)
339
- klass.filter(klass.primary_key=>attachable_id)
336
+ klass.where(klass.primary_key=>attachable_id)
340
337
  end), \
341
338
  :eager_loader=>(proc do |eo|
342
339
  id_map = {}
@@ -346,7 +343,7 @@ describe "Polymorphic Associations" do
346
343
  end
347
344
  id_map.each do |klass_name, id_map|
348
345
  klass = m.call(klass_name)
349
- klass.filter(klass.primary_key=>id_map.keys).all do |attach|
346
+ klass.where(klass.primary_key=>id_map.keys).all do |attach|
350
347
  id_map[attach.pk].each do |asset|
351
348
  asset.associations[:attachable] = attach
352
349
  end
@@ -366,25 +363,18 @@ describe "Polymorphic Associations" do
366
363
  primary_key :id
367
364
  end
368
365
  class ::Post < Sequel::Model
369
- one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable do |ds|
370
- ds.filter(:attachable_type=>'Post')
371
- end
366
+ one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Post'}
372
367
 
373
368
  private
374
369
 
375
370
  def _add_asset(asset)
376
- asset.attachable_id = pk
377
- asset.attachable_type = 'Post'
378
- asset.save
371
+ asset.update(:attachable_id=>pk, :attachable_type=>'Post')
379
372
  end
380
373
  def _remove_asset(asset)
381
- asset.attachable_id = nil
382
- asset.attachable_type = nil
383
- asset.save
374
+ asset.update(:attachable_id=>nil, :attachable_type=>nil)
384
375
  end
385
376
  def _remove_all_assets
386
- Asset.filter(:attachable_id=>pk, :attachable_type=>'Post')\
387
- .update(:attachable_id=>nil, :attachable_type=>nil)
377
+ assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)
388
378
  end
389
379
  end
390
380
 
@@ -392,27 +382,23 @@ describe "Polymorphic Associations" do
392
382
  primary_key :id
393
383
  end
394
384
  class ::Note < Sequel::Model
395
- one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable do |ds|
396
- ds.filter(:attachable_type=>'Note')
397
- end
398
-
385
+ one_to_many :assets, :key=>:attachable_id, :reciprocal=>:attachable, :conditions=>{:attachable_type=>'Note'}
386
+
399
387
  private
400
388
 
401
389
  def _add_asset(asset)
402
- asset.attachable_id = pk
403
- asset.attachable_type = 'Note'
404
- asset.save
390
+ asset.update(:attachable_id=>pk, :attachable_type=>'Note')
405
391
  end
406
392
  def _remove_asset(asset)
407
- asset.attachable_id = nil
408
- asset.attachable_type = nil
409
- asset.save
393
+ asset.update(:attachable_id=>nil, :attachable_type=>nil)
410
394
  end
411
395
  def _remove_all_assets
412
- Asset.filter(:attachable_id=>pk, :attachable_type=>'Note')\
413
- .update(:attachable_id=>nil, :attachable_type=>nil)
396
+ assets_dataset.update(:attachable_id=>nil, :attachable_type=>nil)
414
397
  end
415
398
  end
399
+ end
400
+ before do
401
+ [:assets, :posts, :notes].each{|t| INTEGRATION_DB[t].delete}
416
402
  @post = Post.create
417
403
  Note.create
418
404
  @note = Note.create
@@ -420,9 +406,8 @@ describe "Polymorphic Associations" do
420
406
  @asset2 = Asset.create(:attachable=>@note)
421
407
  @asset1.associations.clear
422
408
  @asset2.associations.clear
423
- clear_sqls
424
409
  end
425
- after do
410
+ after(:all) do
426
411
  INTEGRATION_DB.drop_table :assets, :posts, :notes
427
412
  Object.send(:remove_const, :Asset)
428
413
  Object.send(:remove_const, :Post)
@@ -483,7 +468,7 @@ describe "Polymorphic Associations" do
483
468
  end
484
469
 
485
470
  describe "many_to_one/one_to_many not referencing primary key" do
486
- before do
471
+ before(:all) do
487
472
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
488
473
  INTEGRATION_DB.create_table!(:clients) do
489
474
  primary_key :id
@@ -527,7 +512,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
527
512
  many_to_one :client, :key=>:client_name, \
528
513
  :dataset=>proc{Client.filter(:name=>client_name)}, \
529
514
  :eager_loader=>(proc do |eo|
530
- id_map = eo[:key_hash][:client_name]
515
+ id_map = eo[:id_map]
531
516
  eo[:rows].each{|inv| inv.associations[:client] = nil}
532
517
  Client.filter(:name=>id_map.keys).all do |client|
533
518
  id_map[client.name].each{|inv| inv.associations[:client] = client}
@@ -540,14 +525,16 @@ describe "many_to_one/one_to_many not referencing primary key" do
540
525
  self.client_name = (client.name if client)
541
526
  end
542
527
  end
543
-
528
+ end
529
+ before do
530
+ Client.delete
531
+ Invoice.delete
544
532
  @client1 = Client.create(:name=>'X')
545
533
  @client2 = Client.create(:name=>'Y')
546
534
  @invoice1 = Invoice.create(:client_name=>'X')
547
535
  @invoice2 = Invoice.create(:client_name=>'X')
548
- clear_sqls
549
536
  end
550
- after do
537
+ after(:all) do
551
538
  INTEGRATION_DB.drop_table :invoices, :clients
552
539
  Object.send(:remove_const, :Client)
553
540
  Object.send(:remove_const, :Invoice)
@@ -618,7 +605,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
618
605
  end
619
606
 
620
607
  describe "statistics associations" do
621
- before do
608
+ before(:all) do
622
609
  INTEGRATION_DB.create_table!(:projects) do
623
610
  primary_key :id
624
611
  String :name
@@ -628,11 +615,11 @@ describe "statistics associations" do
628
615
  :dataset=>proc{Ticket.filter(:project_id=>id).select{sum(hours).as(hours)}},
629
616
  :eager_loader=>(proc do |eo|
630
617
  eo[:rows].each{|p| p.associations[:ticket_hours] = nil}
631
- Ticket.filter(:project_id=>eo[:key_hash][:id].keys).
632
- group(:project_id).
633
- select{[project_id.as(project_id), sum(hours).as(hours)]}.
618
+ Ticket.filter(:project_id=>eo[:id_map].keys).
619
+ select_group(:project_id).
620
+ select_append{sum(hours).as(hours)}.
634
621
  all do |t|
635
- p = eo[:key_hash][:id][t.values.delete(:project_id)].first
622
+ p = eo[:id_map][t.values.delete(:project_id)].first
636
623
  p.associations[:ticket_hours] = t
637
624
  end
638
625
  end)
@@ -658,9 +645,8 @@ describe "statistics associations" do
658
645
  @ticket2 = Ticket.create(:project=>@project1, :hours=>10)
659
646
  @ticket3 = Ticket.create(:project=>@project2, :hours=>2)
660
647
  @ticket4 = Ticket.create(:project=>@project2, :hours=>20)
661
- clear_sqls
662
648
  end
663
- after do
649
+ after(:all) do
664
650
  INTEGRATION_DB.drop_table :tickets, :projects
665
651
  Object.send(:remove_const, :Project)
666
652
  Object.send(:remove_const, :Ticket)
@@ -679,7 +665,7 @@ describe "statistics associations" do
679
665
  end
680
666
 
681
667
  describe "one to one associations" do
682
- before do
668
+ before(:all) do
683
669
  INTEGRATION_DB.create_table!(:books) do
684
670
  primary_key :id
685
671
  end
@@ -703,10 +689,8 @@ describe "one to one associations" do
703
689
  @page2 = Page.create(:book=>@book1, :page_number=>2)
704
690
  @page3 = Page.create(:book=>@book2, :page_number=>1)
705
691
  @page4 = Page.create(:book=>@book2, :page_number=>2)
706
- clear_sqls
707
692
  end
708
-
709
- after do
693
+ after(:all) do
710
694
  INTEGRATION_DB.drop_table :pages, :books
711
695
  Object.send(:remove_const, :Book)
712
696
  Object.send(:remove_const, :Page)
@@ -7,7 +7,7 @@ describe Sequel::Migrator do
7
7
  @m = Sequel::Migrator
8
8
  end
9
9
  after do
10
- [:schema_info, :schema_migrations, :sm1111, :sm1122, :sm2222, :sm2233, :sm3333, :sm11111, :sm22222].each{|n| @db.drop_table(n) rescue nil}
10
+ @db.drop_table?(:schema_info, :schema_migrations, :sm1111, :sm1122, :sm2222, :sm2233, :sm3333, :sm11111, :sm22222)
11
11
  end
12
12
 
13
13
  specify "should be able to migrate up and down all the way successfully" do
@@ -187,8 +187,7 @@ describe Sequel::Migrator do
187
187
 
188
188
  specify "should handle reversible migrations" do
189
189
  @dir = 'spec/files/reversible_migrations'
190
- @db.drop_table(:a) rescue nil
191
- @db.drop_table(:b) rescue nil
190
+ @db.drop_table?(:a, :b)
192
191
  @m.apply(@db, @dir, 1)
193
192
  [:schema_info, :a].each{|n| @db.table_exists?(n).should be_true}
194
193
  [:schema_migrations, :b].each{|n| @db.table_exists?(n).should be_false}
@@ -3,7 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
3
3
  describe "Sequel::Model basic support" do
4
4
  before do
5
5
  @db = INTEGRATION_DB
6
- @db.create_table!(:items) do
6
+ @db.create_table!(:items, :engine=>:InnoDB) do
7
7
  primary_key :id
8
8
  String :name
9
9
  end
@@ -11,7 +11,7 @@ describe "Sequel::Model basic support" do
11
11
  end
12
12
  end
13
13
  after do
14
- @db.drop_table(:items)
14
+ @db.drop_table?(:items)
15
15
  Object.send(:remove_const, :Item)
16
16
  end
17
17
 
@@ -38,6 +38,14 @@ describe "Sequel::Model basic support" do
38
38
  Item::Thing.first.should == Item::Thing.load(:id=>1, :name=>'J')
39
39
  end
40
40
 
41
+ specify "should create accessors for all table columns even if all dataset columns aren't selected" do
42
+ c = Class.new(Sequel::Model(@db[:items].select(:id)))
43
+ o = c.new
44
+ o.name = 'A'
45
+ o.save.should == c.load(:id=>1)
46
+ c.select_map(:name).should == ['A']
47
+ end
48
+
41
49
  specify "should work correctly when a dataset restricts the colums it selects" do
42
50
  class ::Item::Thing < Sequel::Model(@db[:items].select(:name))
43
51
  end
@@ -52,6 +60,68 @@ describe "Sequel::Model basic support" do
52
60
  Item.count.should == 0
53
61
  end
54
62
 
63
+ specify "#save should return nil if raise_on_save_failure is false and save isn't successful" do
64
+ i = Item.new(:name=>'J')
65
+ i.use_transactions = true
66
+ def i.after_save
67
+ raise Sequel::Rollback
68
+ end
69
+ i.save.should be_nil
70
+ end
71
+
72
+ specify "#should respect after_commit, after_rollback, after_destroy_commit, and after_destroy_rollback hooks" do
73
+ i = Item.create(:name=>'J')
74
+ i.use_transactions = true
75
+ def i.hooks
76
+ @hooks
77
+ end
78
+ def i.rb=(x)
79
+ @hooks = []
80
+ @rb = x
81
+ end
82
+ def i.after_save
83
+ @hooks << :as
84
+ raise Sequel::Rollback if @rb
85
+ end
86
+ def i.after_destroy
87
+ @hooks << :ad
88
+ raise Sequel::Rollback if @rb
89
+ end
90
+ def i.after_commit
91
+ @hooks << :ac
92
+ end
93
+ def i.after_rollback
94
+ @hooks << :ar
95
+ end
96
+ def i.after_destroy_commit
97
+ @hooks << :adc
98
+ end
99
+ def i.after_destroy_rollback
100
+ @hooks << :adr
101
+ end
102
+ i.name = 'K'
103
+ i.rb = true
104
+ i.save.should be_nil
105
+ i.reload.name.should == 'J'
106
+ i.hooks.should == [:as, :ar]
107
+
108
+ i.rb = true
109
+ i.destroy.should be_nil
110
+ i.exists?.should be_true
111
+ i.hooks.should == [:ad, :adr]
112
+
113
+ i.name = 'K'
114
+ i.rb = false
115
+ i.save.should_not be_nil
116
+ i.reload.name.should == 'K'
117
+ i.hooks.should == [:as, :ac]
118
+
119
+ i.rb = false
120
+ i.destroy.should_not be_nil
121
+ i.exists?.should be_false
122
+ i.hooks.should == [:ad, :adc]
123
+ end
124
+
55
125
  specify "#exists? should return whether the item is still in the database" do
56
126
  i = Item.create(:name=>'J')
57
127
  i.exists?.should == true
@@ -128,3 +198,12 @@ describe "Sequel::Model basic support" do
128
198
  end
129
199
  end
130
200
  end
201
+
202
+ describe "Sequel::Model with no existing table" do
203
+ specify "should not raise an error when setting the dataset" do
204
+ db = INTEGRATION_DB
205
+ db.drop_table?(:items)
206
+ proc{class ::Item < Sequel::Model(db); end; Object.send(:remove_const, :Item)}.should_not raise_error
207
+ proc{c = Class.new(Sequel::Model); c.set_dataset(db[:items])}.should_not raise_error
208
+ end
209
+ end