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,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