sequel 5.28.0 → 5.33.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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +64 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +3 -3
  7. data/doc/code_order.rdoc +12 -2
  8. data/doc/model_dataset_method_design.rdoc +1 -1
  9. data/doc/postgresql.rdoc +71 -0
  10. data/doc/release_notes/5.29.0.txt +22 -0
  11. data/doc/release_notes/5.30.0.txt +20 -0
  12. data/doc/release_notes/5.31.0.txt +148 -0
  13. data/doc/release_notes/5.32.0.txt +46 -0
  14. data/doc/release_notes/5.33.0.txt +24 -0
  15. data/doc/testing.rdoc +1 -1
  16. data/lib/sequel/adapters/postgres.rb +5 -1
  17. data/lib/sequel/adapters/shared/access.rb +6 -6
  18. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  19. data/lib/sequel/adapters/shared/mysql.rb +10 -10
  20. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  21. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  22. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  23. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  24. data/lib/sequel/adapters/tinytds.rb +1 -1
  25. data/lib/sequel/connection_pool/sharded_threaded.rb +2 -2
  26. data/lib/sequel/connection_pool/threaded.rb +1 -1
  27. data/lib/sequel/core.rb +318 -314
  28. data/lib/sequel/database/query.rb +1 -1
  29. data/lib/sequel/database/schema_generator.rb +1 -1
  30. data/lib/sequel/database/transactions.rb +8 -12
  31. data/lib/sequel/dataset/misc.rb +2 -2
  32. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  33. data/lib/sequel/extensions/connection_validator.rb +2 -2
  34. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  35. data/lib/sequel/extensions/index_caching.rb +9 -7
  36. data/lib/sequel/extensions/integer64.rb +2 -0
  37. data/lib/sequel/extensions/migration.rb +1 -1
  38. data/lib/sequel/extensions/pg_enum.rb +5 -2
  39. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  40. data/lib/sequel/extensions/pg_inet.rb +13 -5
  41. data/lib/sequel/extensions/pg_interval.rb +2 -0
  42. data/lib/sequel/extensions/pg_range.rb +2 -0
  43. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  44. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  45. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  46. data/lib/sequel/extensions/server_block.rb +3 -3
  47. data/lib/sequel/model/associations.rb +18 -5
  48. data/lib/sequel/model/base.rb +60 -53
  49. data/lib/sequel/model/plugins.rb +1 -0
  50. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  51. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  52. data/lib/sequel/plugins/association_proxies.rb +2 -0
  53. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  54. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  55. data/lib/sequel/plugins/dirty.rb +13 -13
  56. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  57. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  58. data/lib/sequel/plugins/json_serializer.rb +18 -11
  59. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  60. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  61. data/lib/sequel/plugins/subclasses.rb +2 -0
  62. data/lib/sequel/plugins/throw_failures.rb +1 -1
  63. data/lib/sequel/timezones.rb +6 -4
  64. data/lib/sequel/version.rb +1 -1
  65. metadata +18 -367
  66. data/Rakefile +0 -151
  67. data/doc/release_notes/4.0.0.txt +0 -262
  68. data/doc/release_notes/4.1.0.txt +0 -85
  69. data/doc/release_notes/4.10.0.txt +0 -226
  70. data/doc/release_notes/4.11.0.txt +0 -147
  71. data/doc/release_notes/4.12.0.txt +0 -105
  72. data/doc/release_notes/4.13.0.txt +0 -169
  73. data/doc/release_notes/4.14.0.txt +0 -68
  74. data/doc/release_notes/4.15.0.txt +0 -56
  75. data/doc/release_notes/4.16.0.txt +0 -36
  76. data/doc/release_notes/4.17.0.txt +0 -38
  77. data/doc/release_notes/4.18.0.txt +0 -36
  78. data/doc/release_notes/4.19.0.txt +0 -45
  79. data/doc/release_notes/4.2.0.txt +0 -129
  80. data/doc/release_notes/4.20.0.txt +0 -79
  81. data/doc/release_notes/4.21.0.txt +0 -94
  82. data/doc/release_notes/4.22.0.txt +0 -72
  83. data/doc/release_notes/4.23.0.txt +0 -65
  84. data/doc/release_notes/4.24.0.txt +0 -99
  85. data/doc/release_notes/4.25.0.txt +0 -181
  86. data/doc/release_notes/4.26.0.txt +0 -44
  87. data/doc/release_notes/4.27.0.txt +0 -78
  88. data/doc/release_notes/4.28.0.txt +0 -57
  89. data/doc/release_notes/4.29.0.txt +0 -41
  90. data/doc/release_notes/4.3.0.txt +0 -40
  91. data/doc/release_notes/4.30.0.txt +0 -37
  92. data/doc/release_notes/4.31.0.txt +0 -57
  93. data/doc/release_notes/4.32.0.txt +0 -132
  94. data/doc/release_notes/4.33.0.txt +0 -88
  95. data/doc/release_notes/4.34.0.txt +0 -86
  96. data/doc/release_notes/4.35.0.txt +0 -130
  97. data/doc/release_notes/4.36.0.txt +0 -116
  98. data/doc/release_notes/4.37.0.txt +0 -50
  99. data/doc/release_notes/4.38.0.txt +0 -67
  100. data/doc/release_notes/4.39.0.txt +0 -127
  101. data/doc/release_notes/4.4.0.txt +0 -92
  102. data/doc/release_notes/4.40.0.txt +0 -179
  103. data/doc/release_notes/4.41.0.txt +0 -77
  104. data/doc/release_notes/4.42.0.txt +0 -221
  105. data/doc/release_notes/4.43.0.txt +0 -87
  106. data/doc/release_notes/4.44.0.txt +0 -125
  107. data/doc/release_notes/4.45.0.txt +0 -370
  108. data/doc/release_notes/4.46.0.txt +0 -404
  109. data/doc/release_notes/4.47.0.txt +0 -56
  110. data/doc/release_notes/4.48.0.txt +0 -293
  111. data/doc/release_notes/4.49.0.txt +0 -222
  112. data/doc/release_notes/4.5.0.txt +0 -34
  113. data/doc/release_notes/4.6.0.txt +0 -30
  114. data/doc/release_notes/4.7.0.txt +0 -103
  115. data/doc/release_notes/4.8.0.txt +0 -175
  116. data/doc/release_notes/4.9.0.txt +0 -190
  117. data/spec/adapter_spec.rb +0 -4
  118. data/spec/adapters/db2_spec.rb +0 -170
  119. data/spec/adapters/mssql_spec.rb +0 -828
  120. data/spec/adapters/mysql_spec.rb +0 -1060
  121. data/spec/adapters/oracle_spec.rb +0 -371
  122. data/spec/adapters/postgres_spec.rb +0 -4476
  123. data/spec/adapters/spec_helper.rb +0 -44
  124. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  125. data/spec/adapters/sqlite_spec.rb +0 -652
  126. data/spec/bin_spec.rb +0 -278
  127. data/spec/core/connection_pool_spec.rb +0 -1250
  128. data/spec/core/database_spec.rb +0 -2915
  129. data/spec/core/dataset_spec.rb +0 -5547
  130. data/spec/core/deprecated_spec.rb +0 -70
  131. data/spec/core/expression_filters_spec.rb +0 -1498
  132. data/spec/core/mock_adapter_spec.rb +0 -722
  133. data/spec/core/object_graph_spec.rb +0 -336
  134. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  135. data/spec/core/schema_generator_spec.rb +0 -214
  136. data/spec/core/schema_spec.rb +0 -1844
  137. data/spec/core/spec_helper.rb +0 -24
  138. data/spec/core/version_spec.rb +0 -14
  139. data/spec/core_extensions_spec.rb +0 -763
  140. data/spec/core_model_spec.rb +0 -2
  141. data/spec/core_spec.rb +0 -1
  142. data/spec/deprecation_helper.rb +0 -30
  143. data/spec/extensions/accessed_columns_spec.rb +0 -51
  144. data/spec/extensions/active_model_spec.rb +0 -99
  145. data/spec/extensions/after_initialize_spec.rb +0 -28
  146. data/spec/extensions/any_not_empty_spec.rb +0 -23
  147. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  148. data/spec/extensions/association_dependencies_spec.rb +0 -125
  149. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  150. data/spec/extensions/association_pks_spec.rb +0 -423
  151. data/spec/extensions/association_proxies_spec.rb +0 -100
  152. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  153. data/spec/extensions/auto_validations_spec.rb +0 -229
  154. data/spec/extensions/blacklist_security_spec.rb +0 -95
  155. data/spec/extensions/blank_spec.rb +0 -69
  156. data/spec/extensions/boolean_readers_spec.rb +0 -93
  157. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  158. data/spec/extensions/caching_spec.rb +0 -273
  159. data/spec/extensions/caller_logging_spec.rb +0 -52
  160. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  161. data/spec/extensions/column_conflicts_spec.rb +0 -75
  162. data/spec/extensions/column_select_spec.rb +0 -129
  163. data/spec/extensions/columns_introspection_spec.rb +0 -90
  164. data/spec/extensions/columns_updated_spec.rb +0 -35
  165. data/spec/extensions/composition_spec.rb +0 -248
  166. data/spec/extensions/connection_expiration_spec.rb +0 -151
  167. data/spec/extensions/connection_validator_spec.rb +0 -144
  168. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  169. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  170. data/spec/extensions/constraint_validations_spec.rb +0 -439
  171. data/spec/extensions/core_refinements_spec.rb +0 -528
  172. data/spec/extensions/csv_serializer_spec.rb +0 -183
  173. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  174. data/spec/extensions/dataset_associations_spec.rb +0 -365
  175. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  176. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  177. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  178. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  179. data/spec/extensions/defaults_setter_spec.rb +0 -150
  180. data/spec/extensions/delay_add_association_spec.rb +0 -73
  181. data/spec/extensions/dirty_spec.rb +0 -222
  182. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  183. data/spec/extensions/eager_each_spec.rb +0 -62
  184. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  185. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  186. data/spec/extensions/error_splitter_spec.rb +0 -18
  187. data/spec/extensions/error_sql_spec.rb +0 -20
  188. data/spec/extensions/escaped_like_spec.rb +0 -40
  189. data/spec/extensions/eval_inspect_spec.rb +0 -81
  190. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  191. data/spec/extensions/finder_spec.rb +0 -260
  192. data/spec/extensions/force_encoding_spec.rb +0 -126
  193. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  194. data/spec/extensions/graph_each_spec.rb +0 -113
  195. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  196. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  197. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  198. data/spec/extensions/index_caching_spec.rb +0 -66
  199. data/spec/extensions/inflector_spec.rb +0 -183
  200. data/spec/extensions/input_transformer_spec.rb +0 -69
  201. data/spec/extensions/insert_conflict_spec.rb +0 -103
  202. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  203. data/spec/extensions/instance_filters_spec.rb +0 -79
  204. data/spec/extensions/instance_hooks_spec.rb +0 -246
  205. data/spec/extensions/integer64_spec.rb +0 -22
  206. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  207. data/spec/extensions/json_serializer_spec.rb +0 -336
  208. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  209. data/spec/extensions/list_spec.rb +0 -291
  210. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  211. data/spec/extensions/many_through_many_spec.rb +0 -2177
  212. data/spec/extensions/migration_spec.rb +0 -864
  213. data/spec/extensions/modification_detection_spec.rb +0 -93
  214. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  215. data/spec/extensions/named_timezones_spec.rb +0 -218
  216. data/spec/extensions/nested_attributes_spec.rb +0 -815
  217. data/spec/extensions/null_dataset_spec.rb +0 -85
  218. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  219. data/spec/extensions/pagination_spec.rb +0 -116
  220. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  221. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  222. data/spec/extensions/pg_array_spec.rb +0 -398
  223. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  224. data/spec/extensions/pg_enum_spec.rb +0 -118
  225. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  226. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  227. data/spec/extensions/pg_hstore_spec.rb +0 -219
  228. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  229. data/spec/extensions/pg_inet_spec.rb +0 -72
  230. data/spec/extensions/pg_interval_spec.rb +0 -103
  231. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  232. data/spec/extensions/pg_json_spec.rb +0 -451
  233. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  234. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  235. data/spec/extensions/pg_range_spec.rb +0 -600
  236. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  237. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  238. data/spec/extensions/pg_row_spec.rb +0 -363
  239. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  240. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  241. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  242. data/spec/extensions/prepared_statements_spec.rb +0 -177
  243. data/spec/extensions/pretty_table_spec.rb +0 -123
  244. data/spec/extensions/query_spec.rb +0 -94
  245. data/spec/extensions/rcte_tree_spec.rb +0 -387
  246. data/spec/extensions/round_timestamps_spec.rb +0 -39
  247. data/spec/extensions/s_spec.rb +0 -60
  248. data/spec/extensions/schema_caching_spec.rb +0 -64
  249. data/spec/extensions/schema_dumper_spec.rb +0 -870
  250. data/spec/extensions/select_remove_spec.rb +0 -38
  251. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  252. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  253. data/spec/extensions/serialization_spec.rb +0 -365
  254. data/spec/extensions/server_block_spec.rb +0 -135
  255. data/spec/extensions/server_logging_spec.rb +0 -45
  256. data/spec/extensions/sharding_spec.rb +0 -197
  257. data/spec/extensions/shared_caching_spec.rb +0 -151
  258. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  259. data/spec/extensions/singular_table_names_spec.rb +0 -22
  260. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  261. data/spec/extensions/spec_helper.rb +0 -70
  262. data/spec/extensions/split_array_nil_spec.rb +0 -24
  263. data/spec/extensions/split_values_spec.rb +0 -57
  264. data/spec/extensions/sql_comments_spec.rb +0 -33
  265. data/spec/extensions/sql_expr_spec.rb +0 -59
  266. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  267. data/spec/extensions/static_cache_spec.rb +0 -471
  268. data/spec/extensions/string_agg_spec.rb +0 -90
  269. data/spec/extensions/string_date_time_spec.rb +0 -95
  270. data/spec/extensions/string_stripper_spec.rb +0 -68
  271. data/spec/extensions/subclasses_spec.rb +0 -79
  272. data/spec/extensions/subset_conditions_spec.rb +0 -38
  273. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  274. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  275. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  276. data/spec/extensions/table_select_spec.rb +0 -83
  277. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  278. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  279. data/spec/extensions/throw_failures_spec.rb +0 -74
  280. data/spec/extensions/timestamps_spec.rb +0 -209
  281. data/spec/extensions/to_dot_spec.rb +0 -153
  282. data/spec/extensions/touch_spec.rb +0 -226
  283. data/spec/extensions/tree_spec.rb +0 -334
  284. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  285. data/spec/extensions/unlimited_update_spec.rb +0 -21
  286. data/spec/extensions/update_or_create_spec.rb +0 -83
  287. data/spec/extensions/update_primary_key_spec.rb +0 -105
  288. data/spec/extensions/update_refresh_spec.rb +0 -59
  289. data/spec/extensions/uuid_spec.rb +0 -101
  290. data/spec/extensions/validate_associated_spec.rb +0 -52
  291. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  292. data/spec/extensions/validation_contexts_spec.rb +0 -31
  293. data/spec/extensions/validation_helpers_spec.rb +0 -525
  294. data/spec/extensions/whitelist_security_spec.rb +0 -157
  295. data/spec/extensions/xml_serializer_spec.rb +0 -213
  296. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  297. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  298. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  299. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  300. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  301. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  302. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  303. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  304. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  305. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  306. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  307. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  308. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  309. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  310. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  311. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  312. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  313. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  314. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  315. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  316. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  317. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  318. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  319. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  320. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  321. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  322. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  323. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  324. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  325. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  326. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  327. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  328. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  329. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  331. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  332. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  333. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  334. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  335. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  336. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  337. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  338. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  339. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  340. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  341. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  342. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  343. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  344. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  345. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  346. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  347. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  348. data/spec/guards_helper.rb +0 -59
  349. data/spec/integration/associations_test.rb +0 -2597
  350. data/spec/integration/database_test.rb +0 -113
  351. data/spec/integration/dataset_test.rb +0 -2037
  352. data/spec/integration/eager_loader_test.rb +0 -687
  353. data/spec/integration/migrator_test.rb +0 -262
  354. data/spec/integration/model_test.rb +0 -203
  355. data/spec/integration/plugin_test.rb +0 -2423
  356. data/spec/integration/prepared_statement_test.rb +0 -405
  357. data/spec/integration/schema_test.rb +0 -903
  358. data/spec/integration/spec_helper.rb +0 -71
  359. data/spec/integration/timezone_test.rb +0 -86
  360. data/spec/integration/transaction_test.rb +0 -603
  361. data/spec/integration/type_test.rb +0 -127
  362. data/spec/model/association_reflection_spec.rb +0 -803
  363. data/spec/model/associations_spec.rb +0 -4738
  364. data/spec/model/base_spec.rb +0 -875
  365. data/spec/model/class_dataset_methods_spec.rb +0 -146
  366. data/spec/model/dataset_methods_spec.rb +0 -198
  367. data/spec/model/eager_loading_spec.rb +0 -2377
  368. data/spec/model/hooks_spec.rb +0 -370
  369. data/spec/model/inflector_spec.rb +0 -26
  370. data/spec/model/model_spec.rb +0 -956
  371. data/spec/model/plugins_spec.rb +0 -429
  372. data/spec/model/record_spec.rb +0 -2118
  373. data/spec/model/spec_helper.rb +0 -46
  374. data/spec/model/validations_spec.rb +0 -220
  375. data/spec/model_no_assoc_spec.rb +0 -1
  376. data/spec/model_spec.rb +0 -1
  377. data/spec/plugin_spec.rb +0 -1
  378. data/spec/sequel_coverage.rb +0 -15
  379. data/spec/sequel_warning.rb +0 -4
  380. data/spec/spec_config.rb +0 -12
@@ -1,875 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Model attribute setters" do
4
- before do
5
- @c = Class.new(Sequel::Model(:items)) do
6
- columns :id, :x, :y, :"x y"
7
- end
8
- @o = @c.new
9
- DB.reset
10
- end
11
-
12
- it "refresh should return self" do
13
- @o = @c[1]
14
- def @o._refresh(*) [] end
15
- @o.refresh.must_equal @o
16
- end
17
-
18
- it "should mark the column value as changed" do
19
- @o.changed_columns.must_equal []
20
-
21
- @o.x = 2
22
- @o.changed_columns.must_equal [:x]
23
-
24
- @o.y = 3
25
- @o.changed_columns.must_equal [:x, :y]
26
-
27
- @o.changed_columns.clear
28
-
29
- @o[:x] = 2
30
- @o.changed_columns.must_equal [:x]
31
-
32
- @o[:y] = 3
33
- @o.changed_columns.must_equal [:x, :y]
34
- end
35
-
36
- it "should handle columns that can't be called like normal ruby methods" do
37
- @o.send(:"x y=", 3)
38
- @o.changed_columns.must_equal [:"x y"]
39
- @o.values.must_equal(:"x y"=>3)
40
- @o.send(:"x y").must_equal 3
41
- end
42
- end
43
-
44
- describe "Model attribute getters/setters" do
45
- before do
46
- a = @a = []
47
- @c = Class.new(Sequel::Model(:items)) do
48
- columns :id, :x, :"x y", :require_modification
49
-
50
- [:x, :"x y"].each do |c|
51
- define_method(c) do
52
- a << c
53
- super()
54
- end
55
- define_method(:"#{c}=") do |v|
56
- a << :"#{c}=" << v
57
- super(v)
58
- end
59
- end
60
- end
61
- DB.reset
62
- end
63
-
64
- it "should not override existing methods" do
65
- @o = @c.new
66
- @o.values.merge!(:x=>4, :"x y"=>5, :require_modification=>6)
67
- @o.x.must_equal 4
68
- @o.x = 1
69
- @o.send(:"x y").must_equal 5
70
- @o.send(:"x y=", 2)
71
- @o.require_modification.must_equal true
72
- @o.require_modification = 3
73
- @o.values.must_equal(:x=>1, :"x y"=>2, :require_modification=>6)
74
- @a.must_equal [:x, :x=, 1, :"x y", :"x y=", 2]
75
- end
76
-
77
- it "should not override existing methods in subclasses" do
78
- @c = Class.new(@c)
79
- @c.columns(:id, :x, :y, :"x y", :require_modification)
80
- @o = @c.new
81
- @o.values.merge!(:x=>4, :"x y"=>5, :require_modification=>6)
82
- @o.x.must_equal 4
83
- @o.x = 1
84
- @o.send(:"x y").must_equal 5
85
- @o.send(:"x y=", 2)
86
- @o.require_modification.must_equal true
87
- @o.require_modification = 3
88
- @o.values.must_equal(:x=>1, :"x y"=>2, :require_modification=>6)
89
- @a.must_equal [:x, :x=, 1, :"x y", :"x y=", 2]
90
- end
91
- end
92
-
93
- describe "Model.def_column_alias" do
94
- before do
95
- @o = Class.new(Sequel::Model(:items)) do
96
- columns :id
97
- def_column_alias(:id2, :id)
98
- end.load(:id=>1)
99
- DB.reset
100
- end
101
-
102
- it "should create an getter alias for the column" do
103
- @o.id2.must_equal 1
104
- end
105
-
106
- it "should create an setter alias for the column" do
107
- @o.id2 = 2
108
- @o.id2.must_equal 2
109
- @o.values.must_equal(:id => 2)
110
- end
111
- end
112
-
113
- describe Sequel::Model, "dataset" do
114
- before do
115
- @a = Class.new(Sequel::Model(:items))
116
- @b = Class.new(Sequel::Model)
117
- class ::Elephant < Sequel::Model(:ele1); end
118
- class ::Maggot < Sequel::Model; end
119
- class ::ShoeSize < Sequel::Model; end
120
- class ::BootSize < ShoeSize; end
121
- end
122
- after do
123
- [:Elephant, :Maggot, :ShoeSize, :BootSize].each{|x| Object.send(:remove_const, x)}
124
- end
125
-
126
- it "should default to the plural of the class name" do
127
- Maggot.dataset.sql.must_equal 'SELECT * FROM maggots'
128
- ShoeSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
129
- end
130
-
131
- it "should return the dataset for the superclass if available" do
132
- BootSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
133
- end
134
-
135
- it "should return the correct dataset if set explicitly" do
136
- Elephant.dataset.sql.must_equal 'SELECT * FROM ele1'
137
- @a.dataset.sql.must_equal 'SELECT * FROM items'
138
- end
139
-
140
- it "should raise if no dataset is explicitly set and the class is anonymous" do
141
- proc {@b.dataset}.must_raise(Sequel::Error)
142
- end
143
-
144
- it "should not override dataset explicitly set when subclassing" do
145
- sc = Class.new(::Elephant) do
146
- set_dataset :foo
147
- end
148
- sc.table_name.must_equal :foo
149
- end
150
- end
151
-
152
- describe Sequel::Model, "has_dataset?" do
153
- it "should return whether the model has a dataset" do
154
- c = Class.new(Sequel::Model)
155
- c.has_dataset?.must_equal false
156
- c.dataset = c.db[:table]
157
- c.has_dataset?.must_equal true
158
- end
159
- end
160
-
161
- describe Sequel::Model, "implicit table names" do
162
- after do
163
- Object.send(:remove_const, :BlahBlah)
164
- end
165
- it "should disregard namespaces for the table name" do
166
- module ::BlahBlah
167
- class MwaHaHa < Sequel::Model
168
- end
169
- end
170
- BlahBlah::MwaHaHa.dataset.sql.must_equal 'SELECT * FROM mwa_ha_has'
171
- end
172
-
173
- it "should automatically set datasets when anonymous class of Sequel::Model is used as superclass" do
174
- class BlahBlah < Class.new(Sequel::Model); end
175
- BlahBlah.dataset.sql.must_equal 'SELECT * FROM blah_blahs'
176
- end
177
- end
178
-
179
- describe Sequel::Model, ".dataset_module" do
180
- before do
181
- @c = Class.new(Sequel::Model(:items))
182
- end
183
-
184
- it "should extend the dataset with the module if the model has a dataset" do
185
- @c.dataset_module{def return_3() 3 end}
186
- @c.dataset.return_3.must_equal 3
187
- end
188
-
189
- it "should also extend the instance_dataset with the module if the model has a dataset" do
190
- @c.dataset_module{def return_3() 3 end}
191
- @c.instance_dataset.return_3.must_equal 3
192
- end
193
-
194
- it "should add methods defined in the module to the class" do
195
- @c.dataset_module{def return_3() 3 end}
196
- @c.return_3.must_equal 3
197
- end
198
-
199
- it "should add methods defined in the module outside the block to the class" do
200
- @c.dataset_module.module_eval{def return_3() 3 end}
201
- @c.return_3.must_equal 3
202
- end
203
-
204
- it "should add methods that can't be called with normal method syntax as class methods" do
205
- @c.dataset_module.module_eval{define_method(:'return 3'){3}}
206
- @c.send(:'return 3').must_equal 3
207
- end
208
-
209
- it "should not add private or protected methods defined in the module to the class" do
210
- @c.dataset_module{private; def return_3() 3 end}
211
- @c.dataset_module{protected; def return_4() 4 end}
212
- @c.respond_to?(:return_3).must_equal false
213
- @c.respond_to?(:return_4).must_equal false
214
- end
215
-
216
- it "should cache calls and readd methods if set_dataset is used" do
217
- @c.dataset_module{def return_3() 3 end}
218
- @c.set_dataset :items
219
- @c.return_3.must_equal 3
220
- @c.dataset.return_3.must_equal 3
221
- end
222
-
223
- it "should readd methods to subclasses, if set_dataset is used in a subclass" do
224
- @c.dataset_module{def return_3() 3 end}
225
- c = Class.new(@c)
226
- c.set_dataset :items
227
- c.return_3.must_equal 3
228
- c.dataset.return_3.must_equal 3
229
- end
230
-
231
- it "should only have a single dataset_module per class" do
232
- @c.dataset_module{def return_3() 3 end}
233
- @c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
234
- @c.return_3.must_equal 4
235
- end
236
-
237
- it "should not have subclasses share the dataset_module" do
238
- @c.dataset_module{def return_3() 3 end}
239
- c = Class.new(@c)
240
- c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
241
- c.return_3.must_equal 6
242
- end
243
-
244
- it "should accept a module object and extend the dataset with it" do
245
- @c.dataset_module Module.new{def return_3() 3 end}
246
- @c.dataset.return_3.must_equal 3
247
- end
248
-
249
- it "should be able to call dataset_module with a module multiple times" do
250
- @c.dataset_module Module.new{def return_3() 3 end}
251
- @c.dataset_module Module.new{def return_4() 4 end}
252
- @c.dataset.return_3.must_equal 3
253
- @c.dataset.return_4.must_equal 4
254
- end
255
-
256
- it "should be able mix dataset_module calls with and without arguments" do
257
- @c.dataset_module{def return_3() 3 end}
258
- @c.dataset_module Module.new{def return_4() 4 end}
259
- @c.dataset.return_3.must_equal 3
260
- @c.dataset.return_4.must_equal 4
261
- end
262
-
263
- it "should have modules provided to dataset_module extend subclass datasets" do
264
- @c.dataset_module{def return_3() 3 end}
265
- @c.dataset_module Module.new{def return_4() 4 end}
266
- c = Class.new(@c)
267
- c.set_dataset :a
268
- c.dataset.return_3.must_equal 3
269
- c.dataset.return_4.must_equal 4
270
- end
271
-
272
- it "should return the dataset module if given a block" do
273
- Object.new.extend(@c.dataset_module{def return_3() 3 end}).return_3.must_equal 3
274
- end
275
-
276
- it "should return the argument if given one" do
277
- Object.new.extend(@c.dataset_module Module.new{def return_3() 3 end}).return_3.must_equal 3
278
- end
279
-
280
- it "should have dataset_module support a subset method" do
281
- @c.dataset_module{subset :released, :released}
282
- @c.released.sql.must_equal 'SELECT * FROM items WHERE released'
283
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
284
- end
285
-
286
- it "should have dataset_module support a where method" do
287
- @c.dataset_module{where :released, :released}
288
- @c.released.sql.must_equal 'SELECT * FROM items WHERE released'
289
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
290
- end
291
-
292
- if Sequel::Model.dataset_module_class == Sequel::Model::DatasetModule
293
- it "should have dataset_module not support an eager method" do
294
- proc{@c.dataset_module{eager :foo}}.must_raise NoMethodError
295
- end
296
- end
297
-
298
- it "should have dataset_module support a having method" do
299
- @c.dataset_module{having(:released){released}}
300
- @c.released.sql.must_equal 'SELECT * FROM items HAVING released'
301
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING released'
302
- end
303
-
304
- it "should have dataset_module support an exclude method" do
305
- @c.dataset_module{exclude :released, :released}
306
- @c.released.sql.must_equal 'SELECT * FROM items WHERE NOT released'
307
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND NOT released)'
308
- end
309
-
310
- it "should have dataset_module support an exclude_having method" do
311
- @c.dataset_module{exclude_having :released, :released}
312
- @c.released.sql.must_equal 'SELECT * FROM items HAVING NOT released'
313
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING NOT released'
314
- end
315
-
316
- it "should have dataset_module support a distinct method" do
317
- @c.dataset = @c.dataset.with_extend{def supports_distinct_on?; true end}
318
- @c.dataset_module{distinct :foo, :baz}
319
- @c.foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items'
320
- @c.where(:bar).foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items WHERE bar'
321
- end
322
-
323
- it "should have dataset_module support a grep method" do
324
- @c.dataset_module{grep :foo, :baz, 'quux%'}
325
- @c.foo.sql.must_equal 'SELECT * FROM items WHERE ((baz LIKE \'quux%\' ESCAPE \'\\\'))'
326
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE (bar AND ((baz LIKE \'quux%\' ESCAPE \'\\\')))'
327
- end
328
-
329
- it "should have dataset_module support a group method" do
330
- @c.dataset_module{group :foo, :baz}
331
- @c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
332
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar GROUP BY baz'
333
- end
334
-
335
- it "should have dataset_module support a group_and_count method" do
336
- @c.dataset_module{group_and_count :foo, :baz}
337
- @c.foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items GROUP BY baz'
338
- @c.where(:bar).foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items WHERE bar GROUP BY baz'
339
- end
340
-
341
- it "should have dataset_module support a group_append method" do
342
- @c.dataset_module{group_append :foo, :baz}
343
- @c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
344
- @c.group(:bar).foo.sql.must_equal 'SELECT * FROM items GROUP BY bar, baz'
345
- end
346
-
347
- it "should have dataset_module support a limit method" do
348
- @c.dataset_module{limit :foo, 1}
349
- @c.foo.sql.must_equal 'SELECT * FROM items LIMIT 1'
350
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar LIMIT 1'
351
- end
352
-
353
- it "should have dataset_module support a offset method" do
354
- @c.dataset_module{offset :foo, 1}
355
- @c.foo.sql.must_equal 'SELECT * FROM items OFFSET 1'
356
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar OFFSET 1'
357
- end
358
-
359
- it "should have dataset_module support a order method" do
360
- @c.dataset_module{order(:foo){:baz}}
361
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
362
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz'
363
- end
364
-
365
- it "should have dataset_module support a order_append method" do
366
- @c.dataset_module{order_append :foo, :baz}
367
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
368
- @c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY bar, baz'
369
- end
370
-
371
- it "should have dataset_module support a order_prepend method" do
372
- @c.dataset_module{order_prepend :foo, :baz}
373
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
374
- @c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY baz, bar'
375
- end
376
-
377
- it "should have dataset_module support a reverse method" do
378
- @c.dataset_module{reverse(:foo){:baz}}
379
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz DESC'
380
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz DESC'
381
- end
382
-
383
- it "should have dataset_module support a select method" do
384
- @c.dataset_module{select :foo, :baz}
385
- @c.foo.sql.must_equal 'SELECT baz FROM items'
386
- @c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar'
387
- end
388
-
389
- it "should have dataset_module support a select_all method" do
390
- @c.dataset_module{select_all :foo, :baz}
391
- @c.foo.sql.must_equal 'SELECT baz.* FROM items'
392
- @c.where(:bar).foo.sql.must_equal 'SELECT baz.* FROM items WHERE bar'
393
- end
394
-
395
- it "should have dataset_module support a select_append method" do
396
- @c.dataset_module{select_append :foo, :baz}
397
- @c.foo.sql.must_equal 'SELECT *, baz FROM items'
398
- @c.where(:bar).foo.sql.must_equal 'SELECT *, baz FROM items WHERE bar'
399
- end
400
-
401
- it "should have dataset_module support a select_group method" do
402
- @c.dataset_module{select_group :foo, :baz}
403
- @c.foo.sql.must_equal 'SELECT baz FROM items GROUP BY baz'
404
- @c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar GROUP BY baz'
405
- end
406
-
407
- it "should have dataset_module support a server method" do
408
- @c.dataset_module{server :foo, :baz}
409
- @c.foo.opts[:server].must_equal :baz
410
- @c.where(:bar).foo.opts[:server].must_equal :baz
411
- end
412
-
413
- it "should raise error if called with both an argument and a block" do
414
- proc{@c.dataset_module(Module.new{def return_3() 3 end}){}}.must_raise(Sequel::Error)
415
- end
416
- end
417
-
418
- describe "A model class with implicit table name" do
419
- before do
420
- class ::Donkey < Sequel::Model
421
- end
422
- end
423
- after do
424
- Object.send(:remove_const, :Donkey)
425
- end
426
-
427
- it "should have a dataset associated with the model class" do
428
- Donkey.dataset.model.must_equal Donkey
429
- end
430
- end
431
-
432
- describe "A model inheriting from a model" do
433
- before do
434
- class ::Feline < Sequel::Model; end
435
- class ::Leopard < Feline; end
436
- end
437
- after do
438
- Object.send(:remove_const, :Leopard)
439
- Object.send(:remove_const, :Feline)
440
- end
441
-
442
- it "should have a dataset associated with itself" do
443
- Feline.dataset.model.must_equal Feline
444
- Leopard.dataset.model.must_equal Leopard
445
- end
446
- end
447
-
448
- describe "A model inheriting from a custom base that sets @dataset" do
449
- before do
450
- ::Feline = Class.new(Sequel::Model)
451
- def Feline.inherited(subclass)
452
- subclass.instance_variable_set(:@dataset, nil)
453
- superclass.inherited(subclass)
454
- end
455
- class ::Leopard < Feline; end
456
- end
457
- after do
458
- Object.send(:remove_const, :Leopard)
459
- Object.send(:remove_const, :Feline)
460
- end
461
-
462
- it "should not infer the dataset of the subclass" do
463
- proc{Leopard.dataset}.must_raise(Sequel::Error)
464
- end
465
- end
466
-
467
- describe "Model.primary_key" do
468
- before do
469
- @c = Class.new(Sequel::Model)
470
- end
471
-
472
- it "should default to id" do
473
- @c.primary_key.must_equal :id
474
- end
475
-
476
- it "should be overridden by set_primary_key" do
477
- @c.set_primary_key :cid
478
- @c.primary_key.must_equal :cid
479
-
480
- @c.set_primary_key([:id1, :id2])
481
- @c.primary_key.must_equal [:id1, :id2]
482
- end
483
-
484
- it "should use nil for no primary key" do
485
- @c.no_primary_key
486
- @c.primary_key.must_be_nil
487
- end
488
- end
489
-
490
- describe "Model.primary_key_hash" do
491
- before do
492
- @c = Class.new(Sequel::Model)
493
- end
494
-
495
- it "should handle a single primary key" do
496
- @c.primary_key_hash(1).must_equal(:id=>1)
497
- end
498
-
499
- it "should handle a composite primary key" do
500
- @c.set_primary_key([:id1, :id2])
501
- @c.primary_key_hash([1, 2]).must_equal(:id1=>1, :id2=>2)
502
- end
503
-
504
- it "should raise an error for no primary key" do
505
- @c.no_primary_key
506
- proc{@c.primary_key_hash(1)}.must_raise(Sequel::Error)
507
- end
508
- end
509
-
510
- describe "Model.qualified_primary_key_hash" do
511
- before do
512
- @c = Class.new(Sequel::Model(:items))
513
- end
514
-
515
- it "should handle a single primary key" do
516
- @c.qualified_primary_key_hash(1).must_equal(Sequel.qualify(:items, :id)=>1)
517
- end
518
-
519
- it "should handle a composite primary key" do
520
- @c.set_primary_key([:id1, :id2])
521
- @c.qualified_primary_key_hash([1, 2]).must_equal(Sequel.qualify(:items, :id1)=>1, Sequel.qualify(:items, :id2)=>2)
522
- end
523
-
524
- it "should raise an error for no primary key" do
525
- @c.no_primary_key
526
- proc{@c.qualified_primary_key_hash(1)}.must_raise(Sequel::Error)
527
- end
528
-
529
- it "should allow specifying a different qualifier" do
530
- @c.qualified_primary_key_hash(1, :apple).must_equal(Sequel.qualify(:apple, :id)=>1)
531
- @c.set_primary_key([:id1, :id2])
532
- @c.qualified_primary_key_hash([1, 2], :bear).must_equal(Sequel.qualify(:bear, :id1)=>1, Sequel.qualify(:bear, :id2)=>2)
533
- end
534
- end
535
-
536
- describe "Model.db" do
537
- before do
538
- @db = Sequel.mock
539
- @databases = Sequel::DATABASES.dup
540
- @model_db = Sequel::Model.db
541
- Sequel::Model.db = nil
542
- Sequel::DATABASES.clear
543
- end
544
- after do
545
- Sequel::Model.instance_variable_get(:@db).must_be_nil
546
- Sequel::DATABASES.replace(@databases)
547
- Sequel::Model.db = @model_db
548
- end
549
-
550
- it "should be required when creating named model classes" do
551
- begin
552
- proc{class ModelTest < Sequel::Model; end}.must_raise(Sequel::Error)
553
- ensure
554
- Object.send(:remove_const, :ModelTest)
555
- end
556
- end
557
-
558
- it "should be required when creating anonymous model classes without a database" do
559
- proc{Sequel::Model(:foo)}.must_raise(Sequel::Error)
560
- end
561
-
562
- it "should not be required when creating anonymous model classes with a database" do
563
- Sequel::Model(@db).db.must_equal @db
564
- Sequel::Model(@db[:foo]).db.must_equal @db
565
- end
566
-
567
- it "should work correctly when subclassing anonymous model classes with a database" do
568
- begin
569
- Class.new(Sequel::Model(@db)).db.must_equal @db
570
- Class.new(Sequel::Model(@db[:foo])).db.must_equal @db
571
- class ModelTest < Sequel::Model(@db)
572
- db.must_equal @db
573
- end
574
- class ModelTest2 < Sequel::Model(@db[:foo])
575
- db.must_equal @db
576
- end
577
- ModelTest.instance_variable_set(:@db, nil)
578
- ModelTest.db.must_equal @db
579
- ensure
580
- Object.send(:remove_const, :ModelTest)
581
- Object.send(:remove_const, :ModelTest2)
582
- end
583
- end
584
- end
585
-
586
- describe "Model.db=" do
587
- before do
588
- @db1 = Sequel.mock
589
- @db2 = Sequel.mock
590
- @m = Class.new(Sequel::Model(@db1))
591
- end
592
-
593
- it "should change database for model" do
594
- @m.db = @db2
595
- @m.db.must_equal @db2
596
- end
597
-
598
- it "should raise Error for model with existing dataset" do
599
- @m.dataset = :table
600
- proc{@m.db = @db2}.must_raise Sequel::Error
601
- end
602
-
603
- it "should use the database for subclasses" do
604
- Class.new(@m).db.must_equal @db1
605
- end
606
- end
607
-
608
- describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
609
- before do
610
- @c = Class.new(Sequel::Model(:blahblah)) do
611
- set_primary_key :id
612
- columns :x, :y, :z, :id
613
- end
614
- @c.strict_param_setting = false
615
- end
616
-
617
- it "should restrict updates to primary key by default" do
618
- i = @c.new(:x => 1, :y => 2, :id => 3)
619
- i.values.must_equal(:x => 1, :y => 2)
620
- i.set(:x => 4, :y => 5, :id => 6)
621
- i.values.must_equal(:x => 4, :y => 5)
622
- end
623
-
624
- it "should allow updates to primary key if unrestrict_primary_key is used" do
625
- @c.unrestrict_primary_key
626
- i = @c.new(:x => 1, :y => 2, :id => 3)
627
- i.values.must_equal(:x => 1, :y => 2, :id=>3)
628
- i.set(:x => 4, :y => 5, :id => 6)
629
- i.values.must_equal(:x => 4, :y => 5, :id=>6)
630
- end
631
-
632
- it "should have restrict_primary_key? return true or false depending" do
633
- @c.restrict_primary_key?.must_equal true
634
- @c.unrestrict_primary_key
635
- @c.restrict_primary_key?.must_equal false
636
- c1 = Class.new(@c)
637
- c1.restrict_primary_key?.must_equal false
638
- @c.restrict_primary_key
639
- @c.restrict_primary_key?.must_equal true
640
- c1.restrict_primary_key?.must_equal false
641
- c2 = Class.new(@c)
642
- c2.restrict_primary_key?.must_equal true
643
- end
644
- end
645
-
646
- describe Sequel::Model, ".strict_param_setting" do
647
- before do
648
- @c = Class.new(Sequel::Model(:blahblah)) do
649
- columns :x, :y, :z, :id
650
- end
651
- end
652
-
653
- it "should be enabled by default" do
654
- @c.strict_param_setting.must_equal true
655
- end
656
-
657
- it "should raise an error if a missing/restricted column/method is accessed" do
658
- proc{@c.new(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
659
- proc{@c.create(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
660
- c = @c.new
661
- proc{c.set(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
662
- proc{c.update(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
663
- end
664
-
665
- it "should be disabled by strict_param_setting = false" do
666
- @c.strict_param_setting = false
667
- @c.strict_param_setting.must_equal false
668
- @c.new(:a=>1)
669
- end
670
- end
671
-
672
- describe Sequel::Model, ".require_modification" do
673
- before do
674
- @ds1 = DB[:items].with_extend{def provides_accurate_rows_matched?; false end}
675
- @ds2 = DB[:items].with_extend{def provides_accurate_rows_matched?; true end}
676
- end
677
- after do
678
- Sequel::Model.require_modification = nil
679
- end
680
-
681
- it "should depend on whether the dataset provides an accurate number of rows matched by default" do
682
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
683
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
684
- end
685
-
686
- it "should obey global setting regardless of dataset support if set" do
687
- Sequel::Model.require_modification = true
688
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal true
689
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
690
-
691
- Sequel::Model.require_modification = false
692
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
693
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
694
- end
695
- end
696
-
697
- describe Sequel::Model, ".[] optimization" do
698
- before do
699
- @db = Sequel.mock
700
- def @db.schema(*) [[:id, {:primary_key=>true}]] end
701
- def @db.supports_schema_parsing?() true end
702
- @c = Class.new(Sequel::Model(@db))
703
- @ds = @db.dataset.with_quote_identifiers(true)
704
- end
705
-
706
- it "should set simple_pk to the literalized primary key column name if a single primary key" do
707
- @c.set_primary_key :id
708
- @c.simple_pk.must_equal 'id'
709
- @c.set_primary_key :b
710
- @c.simple_pk.must_equal 'b'
711
- @c.set_primary_key Sequel.identifier(:b__a)
712
- @c.simple_pk.must_equal 'b__a'
713
- end
714
-
715
- it "should have simple_pk be blank if compound or no primary key" do
716
- @c.no_primary_key
717
- @c.simple_pk.must_be_nil
718
- @c.set_primary_key [:b, :a]
719
- @c.simple_pk.must_be_nil
720
- end
721
-
722
- it "should have simple table set if passed a Symbol to set_dataset" do
723
- @c.set_dataset :a
724
- @c.simple_table.must_equal 'a'
725
- @c.set_dataset :b
726
- @c.simple_table.must_equal 'b'
727
- end
728
-
729
- it "should have simple_table set if passed a simple select all dataset to set_dataset" do
730
- @c.set_dataset @ds.from(:a)
731
- @c.simple_table.must_equal '"a"'
732
- @c.set_dataset @ds.from(:b)
733
- @c.simple_table.must_equal '"b"'
734
- @c.set_dataset @ds.from(Sequel[:b][:a])
735
- @c.simple_table.must_equal '"b"."a"'
736
- end
737
-
738
- with_symbol_splitting "should have simple_table set using qualified symbol" do
739
- @c.set_dataset :b__a
740
- @c.simple_table.must_equal 'b.a'
741
- @c.set_dataset @ds.from(:b__a)
742
- @c.simple_table.must_equal '"b"."a"'
743
- end
744
-
745
- it "should have simple_table = nil if passed a non-simple select all dataset to set_dataset" do
746
- @c.set_dataset @c.db[:a].filter(:active)
747
- @c.simple_table.must_be_nil
748
- end
749
-
750
- it "should have simple_table inherit superclass's setting" do
751
- Class.new(@c).simple_table.must_be_nil
752
- @c.set_dataset :a
753
- Class.new(@c).simple_table.must_equal 'a'
754
- end
755
-
756
- it "should use Dataset#with_sql if simple_table and simple_pk are true" do
757
- @c.set_dataset @db[:a].with_fetch(:id=>1)
758
- @c[1].must_equal @c.load(:id=>1)
759
- @db.sqls.must_equal ['SELECT * FROM a WHERE id = 1']
760
- end
761
-
762
- it "should not use Dataset#with_sql if either simple_table or simple_pk is nil" do
763
- @c.set_dataset @db[:a].where(:active).with_fetch(:id=>1)
764
- @c[1].must_equal @c.load(:id=>1)
765
- @db.sqls.must_equal ['SELECT * FROM a WHERE (active AND (id = 1)) LIMIT 1']
766
- end
767
- end
768
-
769
- describe "Model datasets #with_pk with #with_pk!" do
770
- before do
771
- @c = Class.new(Sequel::Model(:a))
772
- @ds = @c.dataset = @c.dataset.with_fetch(:id=>1)
773
- DB.reset
774
- end
775
-
776
- it "should be callable on the model class with optimized SQL" do
777
- @c.with_pk(1).must_equal @c.load(:id=>1)
778
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
779
- @c.with_pk!(1).must_equal @c.load(:id=>1)
780
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
781
- end
782
-
783
- it "should return the first record where the primary key matches" do
784
- @ds.with_pk(1).must_equal @c.load(:id=>1)
785
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
786
- @ds.with_pk!(1).must_equal @c.load(:id=>1)
787
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
788
- end
789
-
790
- it "should work when called repeatedly on a frozen dataset" do
791
- @ds.freeze
792
- 5.times do
793
- @ds.with_pk(1).must_equal @c.load(:id=>1)
794
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
795
- end
796
- end
797
-
798
- it "should handle existing filters" do
799
- @ds.filter(:a=>2).with_pk(1)
800
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
801
- @ds.filter(:a=>2).with_pk!(1)
802
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
803
- end
804
-
805
- it "should work with string values" do
806
- @ds.with_pk("foo")
807
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
808
- @ds.with_pk!("foo")
809
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
810
- end
811
-
812
- it "should handle an array for composite primary keys" do
813
- @c.set_primary_key [:id1, :id2]
814
- @ds.with_pk([1, 2])
815
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
816
-
817
- @ds.with_pk!([1, 2])
818
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
819
- end
820
-
821
- it "should work with composite primary keys when called repeatedly on a frozen dataset with" do
822
- @c.set_primary_key [:id1, :id2]
823
- @ds.freeze
824
- 5.times do
825
- @ds.with_pk([1,2])
826
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
827
- end
828
- end
829
-
830
- it "should have with_pk return nil and with_pk! raise if no rows match" do
831
- @ds = @ds.with_fetch([])
832
- @ds.with_pk(1).must_be_nil
833
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
834
- proc{@ds.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
835
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
836
- end
837
-
838
- it "should have with_pk return nil and with_pk! raise if no rows match when calling the class method" do
839
- @c.dataset = @c.dataset.with_fetch([])
840
- @c.with_pk(1).must_be_nil
841
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
842
- proc{@c.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
843
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
844
- end
845
-
846
- it "should have #[] consider an integer as a primary key lookup" do
847
- @ds[1].must_equal @c.load(:id=>1)
848
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
849
- end
850
-
851
- it "should not have #[] consider a literal string as a primary key lookup" do
852
- @ds[Sequel.lit('foo')].must_equal @c.load(:id=>1)
853
- DB.sqls.must_equal ["SELECT * FROM a WHERE (foo) LIMIT 1"]
854
- end
855
-
856
- it "should raise Error if called on a dataset with no primary key" do
857
- @c.no_primary_key
858
- @ds.freeze
859
- 5.times do
860
- proc{@ds.with_pk(1)}.must_raise Sequel::Error
861
- end
862
- end
863
- end
864
-
865
- describe "Model::include" do
866
- it "shouldn't change the signature of Module::include" do
867
- mod1 = Module.new
868
- mod2 = Module.new
869
- including_class = Class.new(Sequel::Model(:items)) do
870
- include(mod1, mod2)
871
- end
872
- including_class.included_modules.must_include(mod1)
873
- including_class.included_modules.must_include(mod2)
874
- end
875
- end