sequel 5.29.0 → 5.34.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 (387) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -1922
  3. data/README.rdoc +1 -1
  4. data/doc/advanced_associations.rdoc +4 -4
  5. data/doc/association_basics.rdoc +3 -3
  6. data/doc/code_order.rdoc +12 -2
  7. data/doc/model_dataset_method_design.rdoc +1 -1
  8. data/doc/postgresql.rdoc +71 -0
  9. data/doc/release_notes/5.30.0.txt +20 -0
  10. data/doc/release_notes/5.31.0.txt +148 -0
  11. data/doc/release_notes/5.32.0.txt +46 -0
  12. data/doc/release_notes/5.33.0.txt +24 -0
  13. data/doc/release_notes/5.34.0.txt +40 -0
  14. data/doc/testing.rdoc +1 -1
  15. data/lib/sequel/adapters/shared/access.rb +6 -6
  16. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  17. data/lib/sequel/adapters/shared/mysql.rb +9 -9
  18. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  19. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  20. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  21. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  22. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  23. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  24. data/lib/sequel/connection_pool/single.rb +1 -1
  25. data/lib/sequel/connection_pool/threaded.rb +2 -2
  26. data/lib/sequel/core.rb +318 -314
  27. data/lib/sequel/database/connecting.rb +1 -1
  28. data/lib/sequel/database/misc.rb +16 -10
  29. data/lib/sequel/database/query.rb +3 -1
  30. data/lib/sequel/database/schema_generator.rb +0 -1
  31. data/lib/sequel/database/schema_methods.rb +15 -16
  32. data/lib/sequel/database/transactions.rb +12 -13
  33. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  34. data/lib/sequel/dataset/query.rb +4 -3
  35. data/lib/sequel/deprecated.rb +2 -0
  36. data/lib/sequel/exceptions.rb +2 -0
  37. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  38. data/lib/sequel/extensions/connection_validator.rb +2 -2
  39. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  40. data/lib/sequel/extensions/index_caching.rb +9 -7
  41. data/lib/sequel/extensions/integer64.rb +2 -0
  42. data/lib/sequel/extensions/migration.rb +1 -1
  43. data/lib/sequel/extensions/pg_enum.rb +5 -2
  44. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  45. data/lib/sequel/extensions/pg_inet.rb +13 -5
  46. data/lib/sequel/extensions/pg_interval.rb +2 -0
  47. data/lib/sequel/extensions/pg_range.rb +2 -0
  48. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  49. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  50. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  51. data/lib/sequel/extensions/server_block.rb +3 -3
  52. data/lib/sequel/model.rb +2 -0
  53. data/lib/sequel/model/associations.rb +30 -18
  54. data/lib/sequel/model/base.rb +64 -55
  55. data/lib/sequel/model/plugins.rb +3 -3
  56. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  57. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  58. data/lib/sequel/plugins/association_pks.rb +57 -16
  59. data/lib/sequel/plugins/association_proxies.rb +2 -0
  60. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  61. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  62. data/lib/sequel/plugins/dirty.rb +13 -13
  63. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  64. data/lib/sequel/plugins/json_serializer.rb +3 -7
  65. data/lib/sequel/plugins/rcte_tree.rb +2 -2
  66. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  67. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  68. data/lib/sequel/plugins/subclasses.rb +2 -0
  69. data/lib/sequel/timezones.rb +6 -4
  70. data/lib/sequel/version.rb +1 -1
  71. metadata +17 -368
  72. data/Rakefile +0 -151
  73. data/doc/release_notes/4.0.0.txt +0 -262
  74. data/doc/release_notes/4.1.0.txt +0 -85
  75. data/doc/release_notes/4.10.0.txt +0 -226
  76. data/doc/release_notes/4.11.0.txt +0 -147
  77. data/doc/release_notes/4.12.0.txt +0 -105
  78. data/doc/release_notes/4.13.0.txt +0 -169
  79. data/doc/release_notes/4.14.0.txt +0 -68
  80. data/doc/release_notes/4.15.0.txt +0 -56
  81. data/doc/release_notes/4.16.0.txt +0 -36
  82. data/doc/release_notes/4.17.0.txt +0 -38
  83. data/doc/release_notes/4.18.0.txt +0 -36
  84. data/doc/release_notes/4.19.0.txt +0 -45
  85. data/doc/release_notes/4.2.0.txt +0 -129
  86. data/doc/release_notes/4.20.0.txt +0 -79
  87. data/doc/release_notes/4.21.0.txt +0 -94
  88. data/doc/release_notes/4.22.0.txt +0 -72
  89. data/doc/release_notes/4.23.0.txt +0 -65
  90. data/doc/release_notes/4.24.0.txt +0 -99
  91. data/doc/release_notes/4.25.0.txt +0 -181
  92. data/doc/release_notes/4.26.0.txt +0 -44
  93. data/doc/release_notes/4.27.0.txt +0 -78
  94. data/doc/release_notes/4.28.0.txt +0 -57
  95. data/doc/release_notes/4.29.0.txt +0 -41
  96. data/doc/release_notes/4.3.0.txt +0 -40
  97. data/doc/release_notes/4.30.0.txt +0 -37
  98. data/doc/release_notes/4.31.0.txt +0 -57
  99. data/doc/release_notes/4.32.0.txt +0 -132
  100. data/doc/release_notes/4.33.0.txt +0 -88
  101. data/doc/release_notes/4.34.0.txt +0 -86
  102. data/doc/release_notes/4.35.0.txt +0 -130
  103. data/doc/release_notes/4.36.0.txt +0 -116
  104. data/doc/release_notes/4.37.0.txt +0 -50
  105. data/doc/release_notes/4.38.0.txt +0 -67
  106. data/doc/release_notes/4.39.0.txt +0 -127
  107. data/doc/release_notes/4.4.0.txt +0 -92
  108. data/doc/release_notes/4.40.0.txt +0 -179
  109. data/doc/release_notes/4.41.0.txt +0 -77
  110. data/doc/release_notes/4.42.0.txt +0 -221
  111. data/doc/release_notes/4.43.0.txt +0 -87
  112. data/doc/release_notes/4.44.0.txt +0 -125
  113. data/doc/release_notes/4.45.0.txt +0 -370
  114. data/doc/release_notes/4.46.0.txt +0 -404
  115. data/doc/release_notes/4.47.0.txt +0 -56
  116. data/doc/release_notes/4.48.0.txt +0 -293
  117. data/doc/release_notes/4.49.0.txt +0 -222
  118. data/doc/release_notes/4.5.0.txt +0 -34
  119. data/doc/release_notes/4.6.0.txt +0 -30
  120. data/doc/release_notes/4.7.0.txt +0 -103
  121. data/doc/release_notes/4.8.0.txt +0 -175
  122. data/doc/release_notes/4.9.0.txt +0 -190
  123. data/spec/adapter_spec.rb +0 -4
  124. data/spec/adapters/db2_spec.rb +0 -170
  125. data/spec/adapters/mssql_spec.rb +0 -828
  126. data/spec/adapters/mysql_spec.rb +0 -1060
  127. data/spec/adapters/oracle_spec.rb +0 -371
  128. data/spec/adapters/postgres_spec.rb +0 -4476
  129. data/spec/adapters/spec_helper.rb +0 -44
  130. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  131. data/spec/adapters/sqlite_spec.rb +0 -652
  132. data/spec/bin_spec.rb +0 -278
  133. data/spec/core/connection_pool_spec.rb +0 -1250
  134. data/spec/core/database_spec.rb +0 -2915
  135. data/spec/core/dataset_spec.rb +0 -5544
  136. data/spec/core/deprecated_spec.rb +0 -70
  137. data/spec/core/expression_filters_spec.rb +0 -1498
  138. data/spec/core/mock_adapter_spec.rb +0 -722
  139. data/spec/core/object_graph_spec.rb +0 -336
  140. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  141. data/spec/core/schema_generator_spec.rb +0 -214
  142. data/spec/core/schema_spec.rb +0 -1844
  143. data/spec/core/spec_helper.rb +0 -24
  144. data/spec/core/version_spec.rb +0 -14
  145. data/spec/core_extensions_spec.rb +0 -763
  146. data/spec/core_model_spec.rb +0 -2
  147. data/spec/core_spec.rb +0 -1
  148. data/spec/deprecation_helper.rb +0 -30
  149. data/spec/extensions/accessed_columns_spec.rb +0 -51
  150. data/spec/extensions/active_model_spec.rb +0 -99
  151. data/spec/extensions/after_initialize_spec.rb +0 -28
  152. data/spec/extensions/any_not_empty_spec.rb +0 -23
  153. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  154. data/spec/extensions/association_dependencies_spec.rb +0 -125
  155. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  156. data/spec/extensions/association_pks_spec.rb +0 -423
  157. data/spec/extensions/association_proxies_spec.rb +0 -100
  158. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  159. data/spec/extensions/auto_validations_spec.rb +0 -229
  160. data/spec/extensions/blacklist_security_spec.rb +0 -95
  161. data/spec/extensions/blank_spec.rb +0 -69
  162. data/spec/extensions/boolean_readers_spec.rb +0 -93
  163. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  164. data/spec/extensions/caching_spec.rb +0 -273
  165. data/spec/extensions/caller_logging_spec.rb +0 -52
  166. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  167. data/spec/extensions/column_conflicts_spec.rb +0 -75
  168. data/spec/extensions/column_select_spec.rb +0 -129
  169. data/spec/extensions/columns_introspection_spec.rb +0 -90
  170. data/spec/extensions/columns_updated_spec.rb +0 -35
  171. data/spec/extensions/composition_spec.rb +0 -248
  172. data/spec/extensions/connection_expiration_spec.rb +0 -151
  173. data/spec/extensions/connection_validator_spec.rb +0 -144
  174. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  175. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  176. data/spec/extensions/constraint_validations_spec.rb +0 -439
  177. data/spec/extensions/core_refinements_spec.rb +0 -528
  178. data/spec/extensions/csv_serializer_spec.rb +0 -183
  179. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  180. data/spec/extensions/dataset_associations_spec.rb +0 -365
  181. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  182. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  183. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  184. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  185. data/spec/extensions/defaults_setter_spec.rb +0 -150
  186. data/spec/extensions/delay_add_association_spec.rb +0 -73
  187. data/spec/extensions/dirty_spec.rb +0 -222
  188. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  189. data/spec/extensions/eager_each_spec.rb +0 -62
  190. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  191. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  192. data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
  193. data/spec/extensions/error_splitter_spec.rb +0 -18
  194. data/spec/extensions/error_sql_spec.rb +0 -20
  195. data/spec/extensions/escaped_like_spec.rb +0 -40
  196. data/spec/extensions/eval_inspect_spec.rb +0 -81
  197. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  198. data/spec/extensions/finder_spec.rb +0 -260
  199. data/spec/extensions/force_encoding_spec.rb +0 -126
  200. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  201. data/spec/extensions/graph_each_spec.rb +0 -113
  202. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  203. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  204. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  205. data/spec/extensions/index_caching_spec.rb +0 -66
  206. data/spec/extensions/inflector_spec.rb +0 -183
  207. data/spec/extensions/input_transformer_spec.rb +0 -69
  208. data/spec/extensions/insert_conflict_spec.rb +0 -103
  209. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  210. data/spec/extensions/instance_filters_spec.rb +0 -79
  211. data/spec/extensions/instance_hooks_spec.rb +0 -246
  212. data/spec/extensions/integer64_spec.rb +0 -22
  213. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  214. data/spec/extensions/json_serializer_spec.rb +0 -346
  215. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  216. data/spec/extensions/list_spec.rb +0 -291
  217. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  218. data/spec/extensions/many_through_many_spec.rb +0 -2177
  219. data/spec/extensions/migration_spec.rb +0 -864
  220. data/spec/extensions/modification_detection_spec.rb +0 -93
  221. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  222. data/spec/extensions/named_timezones_spec.rb +0 -218
  223. data/spec/extensions/nested_attributes_spec.rb +0 -815
  224. data/spec/extensions/null_dataset_spec.rb +0 -85
  225. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  226. data/spec/extensions/pagination_spec.rb +0 -116
  227. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  228. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  229. data/spec/extensions/pg_array_spec.rb +0 -398
  230. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  231. data/spec/extensions/pg_enum_spec.rb +0 -118
  232. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  233. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  234. data/spec/extensions/pg_hstore_spec.rb +0 -219
  235. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  236. data/spec/extensions/pg_inet_spec.rb +0 -72
  237. data/spec/extensions/pg_interval_spec.rb +0 -103
  238. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  239. data/spec/extensions/pg_json_spec.rb +0 -451
  240. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  241. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  242. data/spec/extensions/pg_range_spec.rb +0 -600
  243. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  244. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  245. data/spec/extensions/pg_row_spec.rb +0 -363
  246. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  247. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  248. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  249. data/spec/extensions/prepared_statements_spec.rb +0 -177
  250. data/spec/extensions/pretty_table_spec.rb +0 -123
  251. data/spec/extensions/query_spec.rb +0 -94
  252. data/spec/extensions/rcte_tree_spec.rb +0 -387
  253. data/spec/extensions/round_timestamps_spec.rb +0 -39
  254. data/spec/extensions/s_spec.rb +0 -60
  255. data/spec/extensions/schema_caching_spec.rb +0 -64
  256. data/spec/extensions/schema_dumper_spec.rb +0 -870
  257. data/spec/extensions/select_remove_spec.rb +0 -38
  258. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  259. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  260. data/spec/extensions/serialization_spec.rb +0 -365
  261. data/spec/extensions/server_block_spec.rb +0 -135
  262. data/spec/extensions/server_logging_spec.rb +0 -45
  263. data/spec/extensions/sharding_spec.rb +0 -197
  264. data/spec/extensions/shared_caching_spec.rb +0 -151
  265. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  266. data/spec/extensions/singular_table_names_spec.rb +0 -22
  267. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  268. data/spec/extensions/spec_helper.rb +0 -70
  269. data/spec/extensions/split_array_nil_spec.rb +0 -24
  270. data/spec/extensions/split_values_spec.rb +0 -57
  271. data/spec/extensions/sql_comments_spec.rb +0 -33
  272. data/spec/extensions/sql_expr_spec.rb +0 -59
  273. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  274. data/spec/extensions/static_cache_spec.rb +0 -471
  275. data/spec/extensions/string_agg_spec.rb +0 -90
  276. data/spec/extensions/string_date_time_spec.rb +0 -95
  277. data/spec/extensions/string_stripper_spec.rb +0 -68
  278. data/spec/extensions/subclasses_spec.rb +0 -79
  279. data/spec/extensions/subset_conditions_spec.rb +0 -38
  280. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  281. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  282. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  283. data/spec/extensions/table_select_spec.rb +0 -83
  284. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  285. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  286. data/spec/extensions/throw_failures_spec.rb +0 -74
  287. data/spec/extensions/timestamps_spec.rb +0 -209
  288. data/spec/extensions/to_dot_spec.rb +0 -153
  289. data/spec/extensions/touch_spec.rb +0 -226
  290. data/spec/extensions/tree_spec.rb +0 -334
  291. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  292. data/spec/extensions/unlimited_update_spec.rb +0 -21
  293. data/spec/extensions/update_or_create_spec.rb +0 -83
  294. data/spec/extensions/update_primary_key_spec.rb +0 -105
  295. data/spec/extensions/update_refresh_spec.rb +0 -59
  296. data/spec/extensions/uuid_spec.rb +0 -101
  297. data/spec/extensions/validate_associated_spec.rb +0 -52
  298. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  299. data/spec/extensions/validation_contexts_spec.rb +0 -31
  300. data/spec/extensions/validation_helpers_spec.rb +0 -525
  301. data/spec/extensions/whitelist_security_spec.rb +0 -157
  302. data/spec/extensions/xml_serializer_spec.rb +0 -213
  303. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  304. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  305. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  306. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  307. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  308. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  309. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  310. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  311. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  312. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  313. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  314. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  315. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  316. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  317. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  318. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  319. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  320. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  321. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  322. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  323. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  324. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  325. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  326. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  327. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  328. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  329. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  331. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  332. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  333. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  334. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  335. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  336. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  337. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  338. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  339. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  340. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  341. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  342. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  343. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  344. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  345. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  346. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  347. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  348. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  349. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  350. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  351. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  352. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  353. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  354. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  355. data/spec/guards_helper.rb +0 -59
  356. data/spec/integration/associations_test.rb +0 -2597
  357. data/spec/integration/database_test.rb +0 -113
  358. data/spec/integration/dataset_test.rb +0 -2037
  359. data/spec/integration/eager_loader_test.rb +0 -687
  360. data/spec/integration/migrator_test.rb +0 -262
  361. data/spec/integration/model_test.rb +0 -203
  362. data/spec/integration/plugin_test.rb +0 -2423
  363. data/spec/integration/prepared_statement_test.rb +0 -405
  364. data/spec/integration/schema_test.rb +0 -903
  365. data/spec/integration/spec_helper.rb +0 -71
  366. data/spec/integration/timezone_test.rb +0 -86
  367. data/spec/integration/transaction_test.rb +0 -603
  368. data/spec/integration/type_test.rb +0 -127
  369. data/spec/model/association_reflection_spec.rb +0 -803
  370. data/spec/model/associations_spec.rb +0 -4738
  371. data/spec/model/base_spec.rb +0 -875
  372. data/spec/model/class_dataset_methods_spec.rb +0 -146
  373. data/spec/model/dataset_methods_spec.rb +0 -198
  374. data/spec/model/eager_loading_spec.rb +0 -2377
  375. data/spec/model/hooks_spec.rb +0 -370
  376. data/spec/model/inflector_spec.rb +0 -26
  377. data/spec/model/model_spec.rb +0 -956
  378. data/spec/model/plugins_spec.rb +0 -429
  379. data/spec/model/record_spec.rb +0 -2118
  380. data/spec/model/spec_helper.rb +0 -46
  381. data/spec/model/validations_spec.rb +0 -220
  382. data/spec/model_no_assoc_spec.rb +0 -1
  383. data/spec/model_spec.rb +0 -1
  384. data/spec/plugin_spec.rb +0 -1
  385. data/spec/sequel_coverage.rb +0 -15
  386. data/spec/sequel_warning.rb +0 -5
  387. data/spec/spec_config.rb +0 -12
@@ -1,69 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::InputTransformer" do
4
- before do
5
- @c = Class.new(Sequel::Model)
6
- @c.columns :name, :b
7
- @c.plugin(:input_transformer, :reverser){|v| v.is_a?(String) ? v.reverse : v}
8
- @o = @c.new
9
- end
10
-
11
- it "should apply transformation to input" do
12
- @o.name = ' name '
13
- @o.name.must_equal ' eman '
14
- @o.name = [1, 2, 3]
15
- @o.name.must_equal [1, 2, 3]
16
- end
17
-
18
- it "should have working .input_transformer_order" do
19
- @c.input_transformer_order.must_equal [:reverser]
20
- @c.plugin(:input_transformer, :reverser2){|v| v.is_a?(String) ? v.reverse : v}
21
- @c.input_transformer_order.must_equal [:reverser2, :reverser]
22
- end
23
-
24
- it "should not apply any transformers by default" do
25
- c = Class.new(Sequel::Model)
26
- c.columns :name, :b
27
- c.plugin :input_transformer
28
- c.new(:name => ' name ').name.must_equal ' name '
29
- end
30
-
31
- it "should allow skipping of columns using .skip_input_transformer" do
32
- @c.skip_input_transformer :reverser, :name
33
- v = ' name '
34
- @o.name = v
35
- @o.name.must_be_same_as(v)
36
- end
37
-
38
- it "should work correctly in subclasses" do
39
- o = Class.new(@c).new
40
- o.name = ' name '
41
- o.name.must_equal ' eman '
42
- end
43
-
44
- it "should raise an error if adding input filter without name" do
45
- proc{@c.add_input_transformer(nil){}}.must_raise(Sequel::Error)
46
- proc{@c.plugin(:input_transformer){}}.must_raise(Sequel::Error)
47
- end
48
-
49
- it "should raise an error if adding input filter without block" do
50
- proc{@c.add_input_transformer(:foo)}.must_raise(Sequel::Error)
51
- proc{@c.plugin(:input_transformer, :foo)}.must_raise(Sequel::Error)
52
- end
53
-
54
- it "should apply multiple input transformers in reverse order of their call" do
55
- @c.add_input_transformer(:add_bar){|v| v << 'bar'}
56
- @c.add_input_transformer(:add_foo){|v| v << 'foo'}
57
- @o.name = ' name '.dup
58
- @o.name.must_equal 'raboof eman '
59
- end
60
-
61
- it "should freeze input transformers when freezing model class" do
62
- @c.skip_input_transformer :reverser, :name
63
- @c.freeze
64
- @c.input_transformers.frozen?.must_equal true
65
- skip = @c.instance_variable_get(:@skip_input_transformer_columns)
66
- skip.frozen?.must_equal true
67
- skip.values.all?(&:frozen?).must_equal true
68
- end
69
- end
@@ -1,103 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "insert_conflict plugin" do
4
- def model_class(adapter)
5
- db = Sequel.mock(:host=>adapter, :fetch=>{:id=>1, :s=>2}, :autoid=>1)
6
- db.extend_datasets{def quote_identifiers?; false end}
7
- model = Class.new(Sequel::Model)
8
- model.dataset = db[:t]
9
- model.columns :id, :s, :o
10
- model.plugin :insert_conflict
11
- db.sqls
12
- model
13
- end
14
-
15
- def model_class_plugin_first(adapter)
16
- model = Class.new(Sequel::Model)
17
- model.plugin :insert_conflict
18
- model = Class.new(model)
19
- db = Sequel.mock(:host=>adapter, :fetch=>{:id=>1, :s=>2}, :autoid=>1)
20
- db.extend_datasets{def quote_identifiers?; false end}
21
- model.dataset = db[:t]
22
- model.columns :id, :s, :o
23
- db.sqls
24
- model
25
- end
26
-
27
- it "should use INSERT ON CONFLICT when inserting on PostgreSQL" do
28
- model = model_class(:postgres)
29
- model.new(:s=>'A', :o=>1).insert_conflict.save
30
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT DO NOTHING RETURNING *"]
31
-
32
- model.new(:s=>'A', :o=>1).insert_conflict(:target=>:s, :update => {:o => Sequel[:excluded][:o]}).save
33
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT (s) DO UPDATE SET o = excluded.o RETURNING *"]
34
- end
35
-
36
- it "should use INSERT ON CONFLICT when inserting on SQLITE" do
37
- model = model_class(:sqlite)
38
- model.new(:s=>'A', :o=>1).insert_conflict.save
39
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT DO NOTHING",
40
- "SELECT * FROM t WHERE (id = 1) LIMIT 1"]
41
-
42
- model.new(:s=>'A', :o=>1).insert_conflict(:target=>:s, :update => {:o => Sequel[:excluded][:o]}).save
43
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT (s) DO UPDATE SET o = excluded.o",
44
- "SELECT * FROM t WHERE (id = 2) LIMIT 1"]
45
- end
46
-
47
- it "should raise Error if calling insert_conflict on a model instance that isn't new" do
48
- m = model_class(:postgres).load(:s=>'A', :o=>1)
49
- proc{m.insert_conflict}.must_raise Sequel::Error
50
- end
51
-
52
- it "should raise if loading plugin into a model class with a dataset that doesn't support insert_conflict" do
53
- model = Class.new(Sequel::Model)
54
- model.dataset = Sequel.mock[:t]
55
- proc{model.plugin :insert_conflict}.must_raise Sequel::Error
56
- end
57
-
58
- it "should work if loading into a model class without a dataset on PostgreSQL" do
59
- model = model_class_plugin_first(:postgres)
60
- model.new(:s=>'A', :o=>1).insert_conflict.save
61
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT DO NOTHING RETURNING *"]
62
-
63
- model.new(:s=>'A', :o=>1).insert_conflict(:target=>:s, :update => {:o => Sequel[:excluded][:o]}).save
64
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT (s) DO UPDATE SET o = excluded.o RETURNING *"]
65
- end
66
-
67
- it "should work if loading into a model class without a dataset on SQLITE" do
68
- model = model_class_plugin_first(:sqlite)
69
- model.new(:s=>'A', :o=>1).insert_conflict.save
70
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT DO NOTHING",
71
- "SELECT * FROM t WHERE (id = 1) LIMIT 1"]
72
-
73
- model.new(:s=>'A', :o=>1).insert_conflict(:target=>:s, :update => {:o => Sequel[:excluded][:o]}).save
74
- model.db.sqls.must_equal ["INSERT INTO t (s, o) VALUES ('A', 1) ON CONFLICT (s) DO UPDATE SET o = excluded.o",
75
- "SELECT * FROM t WHERE (id = 2) LIMIT 1"]
76
- end
77
-
78
- it "should work if the prepared_statements plugin is loaded before" do
79
- db = Sequel.mock(:host=>'sqlite', :fetch=>{:id=>1, :s=>2}, :autoid=>1, :numrows=>1)
80
- db.extend_datasets{def quote_identifiers?; false end}
81
- model = Class.new(Sequel::Model)
82
- model.dataset = db[:t]
83
- model.columns :id, :s
84
- model.plugin :prepared_statements
85
- model.plugin :insert_conflict
86
- db.sqls
87
- model.create(:s=>'a').update(:s=>'b')
88
- db.sqls.must_equal ["INSERT INTO t (s) VALUES ('a')", "SELECT * FROM t WHERE (id = 1) LIMIT 1", "UPDATE t SET s = 'b' WHERE (id = 1)"]
89
- end
90
-
91
- it "should work if the prepared_statements plugin is loaded after" do
92
- db = Sequel.mock(:host=>'postgres', :fetch=>{:id=>1, :s=>2}, :autoid=>1, :numrows=>1)
93
- db.extend_datasets{def quote_identifiers?; false end}
94
- model = Class.new(Sequel::Model)
95
- model.dataset = db[:t]
96
- model.columns :id, :s
97
- model.plugin :insert_conflict
98
- model.plugin :prepared_statements
99
- db.sqls
100
- model.create(:s=>'a').update(:s=>'b')
101
- db.sqls.must_equal ["INSERT INTO t (s) VALUES ('a') RETURNING *", "UPDATE t SET s = 'b' WHERE (id = 1)"]
102
- end
103
- end
@@ -1,72 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::InsertReturningSelect" do
4
- before do
5
- @db = Sequel.mock(:fetch=>{:id=>1, :x=>2}, :autoid=>1)
6
- @db.extend_datasets do
7
- def supports_returning?(_) true end
8
- def insert_select(*v) with_sql_first("#{insert_sql(*v)} RETURNING #{opts[:returning].map{|x| literal(x)}.join(', ')}") end
9
- end
10
- @Album = Class.new(Sequel::Model(@db[:albums].select(:id, :x)))
11
- @Album.columns :id, :x
12
- @db.sqls
13
- end
14
-
15
- it "should work if loaded into a model without a dataset that also uses the lazy_attributes or dataset associations plugins" do
16
- c = Sequel::Model(@db)
17
- c.plugin :insert_returning_select
18
- c.columns :id, :x
19
- c.plugin :lazy_attributes
20
- c.plugin :dataset_associations
21
-
22
- c.set_dataset @db[:albums].select(:id, :x)
23
- c.plugin :lazy_attributes, :x
24
- c.many_to_one :c, :key=>:id, :class=>c
25
- @db.sqls
26
-
27
- c.dataset.sql.must_equal 'SELECT id FROM albums'
28
- c.create(:x=>2)
29
- @db.sqls.must_equal ['INSERT INTO albums (x) VALUES (2) RETURNING id']
30
- c.load(:id=>2).x
31
- @db.sqls.must_equal ['SELECT albums.x FROM albums WHERE (id = 2) LIMIT 1']
32
- c.dataset.cs.sql.must_equal "SELECT id FROM albums WHERE (albums.id IN (SELECT albums.id FROM albums))"
33
- end
34
-
35
- it "should add a returning clause when inserting using selected columns" do
36
- @Album.plugin :insert_returning_select
37
- @Album.create(:x=>2).must_equal @Album.load(:id=>1, :x=>2)
38
- @db.sqls.must_equal ['INSERT INTO albums (x) VALUES (2) RETURNING id, x']
39
- end
40
-
41
- it "should not add a returning clause if selection does not consist of just columns" do
42
- @Album.dataset = @Album.dataset.select_append(Sequel.as(1, :b))
43
- @Album.plugin :insert_returning_select
44
- @db.sqls.clear
45
- @Album.create(:x=>2).must_equal @Album.load(:id=>1, :x=>2)
46
- @db.sqls.must_equal ['INSERT INTO albums (x) VALUES (2)', 'SELECT id, x, 1 AS b FROM albums WHERE (id = 1) LIMIT 1']
47
- end
48
-
49
- it "should not add a returning clause if database doesn't support it" do
50
- @db.extend_datasets{def supports_returning?(_) false end}
51
- @Album.plugin :insert_returning_select
52
- @Album.create(:x=>2).must_equal @Album.load(:id=>1, :x=>2)
53
- @db.sqls.must_equal ['INSERT INTO albums (x) VALUES (2)', 'SELECT id, x FROM albums WHERE (id = 1) LIMIT 1']
54
- end
55
-
56
- it "should work correctly with subclasses" do
57
- c = Class.new(Sequel::Model)
58
- c.plugin :insert_returning_select
59
- b = Class.new(c)
60
- b.columns :id, :x
61
- b.dataset = @db[:albums].select(:id, :x)
62
- @db.sqls.clear
63
- b.create(:x=>2).must_equal b.load(:id=>1, :x=>2)
64
- @db.sqls.must_equal ['INSERT INTO albums (x) VALUES (2) RETURNING id, x']
65
- end
66
-
67
- it "should freeze instance_insert_dataset when freezing model class" do
68
- @Album.plugin :insert_returning_select
69
- @Album.freeze
70
- @Album.instance_insert_dataset.frozen?.must_equal true
71
- end
72
- end
@@ -1,79 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "instance_filters plugin" do
4
- before do
5
- @c = Class.new(Sequel::Model(:people))
6
- @c.columns :id, :name, :num
7
- @c.plugin :instance_filters
8
- @p = @c.load(:id=>1, :name=>'John', :num=>1)
9
- DB.sqls
10
- end
11
-
12
- it "should raise an error when updating a stale record" do
13
- @p.update(:name=>'Bob')
14
- DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
15
- @p.instance_filter(:name=>'Jim')
16
- @p.instance_variable_set(:@this, @p.this.with_numrows(0))
17
- proc{@p.update(:name=>'Joe')}.must_raise(Sequel::Plugins::InstanceFilters::Error)
18
- DB.sqls.must_equal ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]
19
- end
20
-
21
- it "should raise an error when destroying a stale record" do
22
- @p.destroy
23
- DB.sqls.must_equal ["DELETE FROM people WHERE id = 1"]
24
- @p.instance_filter(:name=>'Jim')
25
- @p.instance_variable_set(:@this, @p.this.with_numrows(0))
26
- proc{@p.destroy}.must_raise(Sequel::Plugins::InstanceFilters::Error)
27
- DB.sqls.must_equal ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
28
- end
29
-
30
- it "should work when using the prepared_statements plugin" do
31
- @c.plugin :prepared_statements
32
-
33
- @p.update(:name=>'Bob')
34
- DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
35
- @p.instance_filter(:name=>'Jim')
36
- @p.instance_variable_set(:@this, @p.this.with_numrows(0))
37
- proc{@p.update(:name=>'Joe')}.must_raise(Sequel::Plugins::InstanceFilters::Error)
38
- DB.sqls.must_equal ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]
39
-
40
- @p = @c.load(:id=>1, :name=>'John', :num=>1)
41
- @p.instance_variable_set(:@this, @p.this.with_numrows(1))
42
- @c.instance_variable_set(:@fast_instance_delete_sql, nil)
43
- @p.destroy
44
- DB.sqls.must_equal ["DELETE FROM people WHERE (id = 1)"]
45
- @p.instance_filter(:name=>'Jim')
46
- @p.instance_variable_set(:@this, @p.this.with_numrows(0))
47
- proc{@p.destroy}.must_raise(Sequel::Plugins::InstanceFilters::Error)
48
- DB.sqls.must_equal ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
49
-
50
- @c.create.must_be_kind_of(@c)
51
- end
52
-
53
- it "should apply all instance filters" do
54
- @p.instance_filter(:name=>'Jim')
55
- @p.instance_filter{num > 2}
56
- @p.update(:name=>'Bob')
57
- DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE ((id = 1) AND (name = 'Jim') AND (num > 2))"]
58
- end
59
-
60
- it "should drop instance filters after updating" do
61
- @p.instance_filter(:name=>'Joe')
62
- @p.update(:name=>'Joe')
63
- DB.sqls.must_equal ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Joe'))"]
64
- @p.update(:name=>'Bob')
65
- DB.sqls.must_equal ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
66
- end
67
-
68
- it "shouldn't allow instance filters on frozen objects" do
69
- @p.instance_filter(:name=>'Joe')
70
- @p.freeze
71
- proc{@p.instance_filter(:name=>'Jim')}.must_raise
72
- end
73
-
74
- it "should have dup duplicate internal structures" do
75
- @p.instance_filter(:name=>'Joe')
76
- @p.dup.send(:instance_filters).must_equal @p.send(:instance_filters)
77
- @p.dup.send(:instance_filters).wont_be_same_as(@p.send(:instance_filters))
78
- end
79
- end
@@ -1,246 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "InstanceHooks plugin" do
4
- def r(x=nil)
5
- @r << x
6
- yield if block_given?
7
- x
8
- end
9
-
10
- before do
11
- @c = Class.new(Sequel::Model(:items))
12
- @c.plugin :instance_hooks
13
- @c.raise_on_save_failure = false
14
- @o = @c.new
15
- @x = @c.load({:id=>1})
16
- @r = []
17
- end
18
-
19
- it "should support before_create_hook and after_create_hook" do
20
- @o.after_create_hook{r 1}
21
- @o.before_create_hook{r 2}
22
- @o.after_create_hook{r 3}
23
- @o.before_create_hook{r 4}
24
- @o.save.wont_equal nil
25
- @r.must_equal [4, 2, 1, 3]
26
- end
27
-
28
- it "should cancel the save if before_create_hook block calls cancel_action" do
29
- @o.after_create_hook{r 1}
30
- @o.before_create_hook{r{@o.cancel_action}}
31
- @o.before_create_hook{r 4}
32
- @o.save.must_be_nil
33
- @r.must_equal [4, nil]
34
- @r.clear
35
- @o.save.must_be_nil
36
- @r.must_equal [4, nil]
37
- end
38
-
39
- it "should support before_update_hook and after_update_hook" do
40
- @x.after_update_hook{r 1}
41
- @x.before_update_hook{r 2}
42
- @x.after_update_hook{r 3}
43
- @x.before_update_hook{r 4}
44
- @x.save.wont_equal nil
45
- @r.must_equal [4, 2, 1, 3]
46
- @x.save.wont_equal nil
47
- @r.must_equal [4, 2, 1, 3]
48
- end
49
-
50
- it "should cancel the save if before_update_hook block calls cancel_action" do
51
- @x.after_update_hook{r 1}
52
- @x.before_update_hook{r{@x.cancel_action}}
53
- @x.before_update_hook{r 4}
54
- @x.save.must_be_nil
55
- @r.must_equal [4, nil]
56
- @r.clear
57
- @x.save.must_be_nil
58
- @r.must_equal [4, nil]
59
- end
60
-
61
- it "should support before_save_hook and after_save_hook" do
62
- @o.after_save_hook{r 1}
63
- @o.before_save_hook{r 2}
64
- @o.after_save_hook{r 3}
65
- @o.before_save_hook{r 4}
66
- @o.save.wont_equal nil
67
- @r.must_equal [4, 2, 1, 3]
68
- @r.clear
69
-
70
- @x.after_save_hook{r 1}
71
- @x.before_save_hook{r 2}
72
- @x.after_save_hook{r 3}
73
- @x.before_save_hook{r 4}
74
- @x.save.wont_equal nil
75
- @r.must_equal [4, 2, 1, 3]
76
- @x.save.wont_equal nil
77
- @r.must_equal [4, 2, 1, 3]
78
- end
79
-
80
- it "should cancel the save if before_save_hook block calls cancel_action" do
81
- @x.after_save_hook{r 1}
82
- @x.before_save_hook{r{@x.cancel_action}}
83
- @x.before_save_hook{r 4}
84
- @x.save.must_be_nil
85
- @r.must_equal [4, nil]
86
- @r.clear
87
-
88
- @x.after_save_hook{r 1}
89
- @x.before_save_hook{r{@x.cancel_action}}
90
- @x.before_save_hook{r 4}
91
- @x.save.must_be_nil
92
- @r.must_equal [4, nil]
93
- @r.clear
94
- @x.save.must_be_nil
95
- @r.must_equal [4, nil]
96
- end
97
-
98
- it "should support before_destroy_hook and after_destroy_hook" do
99
- @x.after_destroy_hook{r 1}
100
- @x.before_destroy_hook{r 2}
101
- @x.after_destroy_hook{r 3}
102
- @x.before_destroy_hook{r 4}
103
- @x.destroy.wont_equal nil
104
- @r.must_equal [4, 2, 1, 3]
105
- end
106
-
107
- it "should cancel the destroy if before_destroy_hook block calls cancel_action" do
108
- @x.after_destroy_hook{r 1}
109
- @x.before_destroy_hook{r{@x.cancel_action}}
110
- @x.before_destroy_hook{r 4}
111
- @x.destroy.must_be_nil
112
- @r.must_equal [4, nil]
113
- end
114
-
115
- it "should support before_validation_hook and after_validation_hook" do
116
- @o.after_validation_hook{r 1}
117
- @o.before_validation_hook{r 2}
118
- @o.after_validation_hook{r 3}
119
- @o.before_validation_hook{r 4}
120
- @o.valid?.must_equal true
121
- @r.must_equal [4, 2, 1, 3]
122
- end
123
-
124
- it "should cancel the save if before_validation_hook block calls cancel_action" do
125
- @o.after_validation_hook{r 1}
126
- @o.before_validation_hook{r{@o.cancel_action}}
127
- @o.before_validation_hook{r 4}
128
- @o.valid?.must_equal false
129
- @r.must_equal [4, nil]
130
- @r.clear
131
- @o.valid?.must_equal false
132
- @r.must_equal [4, nil]
133
- end
134
-
135
- it "should clear only related hooks on successful create" do
136
- @o.after_destroy_hook{r 1}
137
- @o.before_destroy_hook{r 2}
138
- @o.after_update_hook{r 3}
139
- @o.before_update_hook{r 4}
140
- @o.before_save_hook{r 5}
141
- @o.after_save_hook{r 6}
142
- @o.before_create_hook{r 7}
143
- @o.after_create_hook{r 8}
144
- @o.save.wont_equal nil
145
- @r.must_equal [5, 7, 8, 6]
146
- @o.instance_variable_set(:@new, false)
147
- @o.save.wont_equal nil
148
- @r.must_equal [5, 7, 8, 6, 4, 3]
149
- @o.save.wont_equal nil
150
- @r.must_equal [5, 7, 8, 6, 4, 3]
151
- @o.destroy
152
- @r.must_equal [5, 7, 8, 6, 4, 3, 2, 1]
153
- end
154
-
155
- it "should clear only related hooks on successful update" do
156
- @x.after_destroy_hook{r 1}
157
- @x.before_destroy_hook{r 2}
158
- @x.before_update_hook{r 3}
159
- @x.after_update_hook{r 4}
160
- @x.before_save_hook{r 5}
161
- @x.after_save_hook{r 6}
162
- @x.save.wont_equal nil
163
- @r.must_equal [5, 3, 4, 6]
164
- @x.save.wont_equal nil
165
- @r.must_equal [5, 3, 4, 6]
166
- @x.destroy
167
- @r.must_equal [5, 3, 4, 6, 2, 1]
168
- end
169
-
170
- it "should clear only related hooks on successful destroy" do
171
- @x.after_destroy_hook{r 1}
172
- @x.before_destroy_hook{r 2}
173
- @x.before_update_hook{r 3}
174
- @x.before_save_hook{r 4}
175
- @x.destroy
176
- @r.must_equal [2, 1]
177
- @x.save.wont_equal nil
178
- @r.must_equal [2, 1, 4, 3]
179
- end
180
-
181
- it "should not clear validations hooks on successful save" do
182
- @x.after_validation_hook{@x.errors.add(:id, 'a') if @x.id == 1; r 1}
183
- @x.before_validation_hook{r 2}
184
- @x.save.must_be_nil
185
- @r.must_equal [2, 1]
186
- @x.save.must_be_nil
187
- @r.must_equal [2, 1, 2, 1]
188
- @x.id = 2
189
- @x.save.must_equal @x
190
- @r.must_equal [2, 1, 2, 1, 2, 1]
191
- @x.save.must_equal @x
192
- @r.must_equal [2, 1, 2, 1, 2, 1]
193
- end
194
-
195
- it "should not allow addition of instance hooks to frozen instances" do
196
- @x.after_destroy_hook{r 1}
197
- @x.before_destroy_hook{r 2}
198
- @x.before_update_hook{r 3}
199
- @x.before_save_hook{r 4}
200
- @x.freeze
201
- proc{@x.after_destroy_hook{r 1}}.must_raise(Sequel::Error)
202
- proc{@x.before_destroy_hook{r 2}}.must_raise(Sequel::Error)
203
- proc{@x.before_update_hook{r 3}}.must_raise(Sequel::Error)
204
- proc{@x.before_save_hook{r 4}}.must_raise(Sequel::Error)
205
- end
206
- end
207
-
208
- describe "InstanceHooks plugin with transactions" do
209
- before do
210
- @db = Sequel.mock(:numrows=>1)
211
- @c = Class.new(Sequel::Model(@db[:items])) do
212
- attr_accessor :rb
213
- def after_save
214
- super
215
- db.execute('as')
216
- raise Sequel::Rollback if rb
217
- end
218
- def after_destroy
219
- super
220
- db.execute('ad')
221
- raise Sequel::Rollback if rb
222
- end
223
- end
224
- @c.use_transactions = true
225
- @c.plugin :instance_hooks
226
- @o = @c.load({:id=>1})
227
- @or = @c.load({:id=>1})
228
- @or.rb = true
229
- @r = []
230
- @db.sqls
231
- end
232
-
233
- it "should have *_hook methods return self "do
234
- @o.before_destroy_hook{r 1}.must_be_same_as(@o)
235
- @o.before_validation_hook{r 1}.must_be_same_as(@o)
236
- @o.before_save_hook{r 1}.must_be_same_as(@o)
237
- @o.before_update_hook{r 1}.must_be_same_as(@o)
238
- @o.before_create_hook{r 1}.must_be_same_as(@o)
239
-
240
- @o.after_destroy_hook{r 1}.must_be_same_as(@o)
241
- @o.after_validation_hook{r 1}.must_be_same_as(@o)
242
- @o.after_save_hook{r 1}.must_be_same_as(@o)
243
- @o.after_update_hook{r 1}.must_be_same_as(@o)
244
- @o.after_create_hook{r 1}.must_be_same_as(@o)
245
- end
246
- end