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,205 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Dataset#where" do
4
- before do
5
- @dataset = Sequel.mock[:test].extension(:auto_literal_strings)
6
- end
7
-
8
- it "should work with a string with placeholders and arguments for those placeholders" do
9
- @dataset.where('price < ? AND id in ?', 100, [1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
10
- end
11
-
12
- it "should use default behavior for array of conditions" do
13
- @dataset.where([[:a, 1], [:b, 2]]).sql.must_equal 'SELECT * FROM test WHERE ((a = 1) AND (b = 2))'
14
- end
15
-
16
- it "should not modify passed array with placeholders" do
17
- a = ['price < ? AND id in ?', 100, 1, 2, 3]
18
- b = a.dup
19
- @dataset.where(a)
20
- b.must_equal a
21
- end
22
-
23
- it "should work with strings (custom SQL expressions)" do
24
- @dataset.where('(a = 1 AND b = 2)').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1 AND b = 2))"
25
- end
26
-
27
- it "should work with a string with named placeholders and a hash of placeholder value arguments" do
28
- @dataset.where('price < :price AND id in :ids', :price=>100, :ids=>[1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
29
- end
30
-
31
- it "should not modify passed array with named placeholders" do
32
- a = ['price < :price AND id in :ids', {:price=>100}]
33
- b = a.dup
34
- @dataset.where(a)
35
- b.must_equal a
36
- end
37
-
38
- it "should not replace named placeholders that don't exist in the hash" do
39
- @dataset.where('price < :price AND id in :ids', :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
40
- end
41
-
42
- it "should raise an error for a mismatched number of placeholders" do
43
- proc{@dataset.where('price < ? AND id in ?', 100).select_sql}.must_raise(Sequel::Error)
44
- proc{@dataset.where('price < ? AND id in ?', 100, [1, 2, 3], 4).select_sql}.must_raise(Sequel::Error)
45
- end
46
-
47
- it "should handle partial names" do
48
- @dataset.where('price < :price AND id = :p', :p=>2, :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id = 2)"
49
- end
50
-
51
- it "should handle ::cast syntax when no parameters are supplied" do
52
- @dataset.where('price::float = 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float = 10)"
53
- @dataset.where('price::float ? 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float ? 10)"
54
- end
55
-
56
- it "should affect select, delete and update statements when using strings" do
57
- @d2 = @dataset.where('region = ?', 'Asia')
58
- @d2.select_sql.must_equal "SELECT * FROM test WHERE (region = 'Asia')"
59
- @d2.delete_sql.must_equal "DELETE FROM test WHERE (region = 'Asia')"
60
- @d2.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (region = 'Asia')"
61
-
62
- @d3 = @dataset.where("a = 1")
63
- @d3.select_sql.must_equal "SELECT * FROM test WHERE (a = 1)"
64
- @d3.delete_sql.must_equal "DELETE FROM test WHERE (a = 1)"
65
- @d3.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (a = 1)"
66
- end
67
-
68
- it "should be composable using AND operator (for scoping) when using strings" do
69
- @d2 = @dataset.where('region = ?', 'Asia')
70
- @d2.where('GDP > ?', 1000).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
71
- @d2.where(:name => ['Japan', 'China']).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (name IN ('Japan', 'China')))"
72
- @d2.where('GDP > ?').select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > ?))"
73
-
74
- @d3 = @dataset.where("a = 1")
75
- @d3.where('b = 2').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (b = 2))"
76
- @d3.where(:c => 3).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (c = 3))"
77
- @d3.where('d = ?', 4).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
78
- end
79
-
80
- it "should be composable using AND operator (for scoping) with block and string" do
81
- @dataset.where("a = 1").where{e < 5}.select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
82
- end
83
- end
84
-
85
- describe "Dataset #first and #last" do
86
- before do
87
- @d = Sequel.mock(:fetch=>proc{|s| {:s=>s}})[:test].extension(:auto_literal_strings)
88
- end
89
-
90
- it "should combine block and standard argument filters if argument is not an Integer" do
91
- ds = @d.order(:name).freeze
92
- 5.times do
93
- @d.first('y = 25'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
94
- ds.last('y = 16'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
95
- @d.first('y = ?', 25){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
96
- ds.last('y = ?', 16){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
97
- end
98
- end
99
- end
100
-
101
- describe "Dataset#exclude" do
102
- before do
103
- @dataset = Sequel.mock.dataset.from(:test).extension(:auto_literal_strings)
104
- end
105
-
106
- it "should parenthesize a single string condition correctly" do
107
- @dataset.exclude("region = 'Asia' AND name = 'Japan'").select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
108
- end
109
-
110
- it "should parenthesize an array condition correctly" do
111
- @dataset.exclude('region = ? AND name = ?', 'Asia', 'Japan').select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
112
- end
113
- end
114
-
115
- describe "Dataset#or" do
116
- before do
117
- @dataset = Sequel.mock.dataset.from(:test).extension(:auto_literal_strings)
118
- @d1 = @dataset.where(:x => 1)
119
- end
120
-
121
- it "should accept string filters" do
122
- @d1.or('y > ?', 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y > 2))'
123
- end
124
- end
125
-
126
- describe "Dataset#having" do
127
- before do
128
- @dataset = Sequel.mock.dataset.from(:test).extension(:auto_literal_strings)
129
- @grouped = @dataset.group(:region).select(:region, Sequel.function(:sum, :population), Sequel.function(:avg, :gdp))
130
- end
131
-
132
- it "should handle string arguments" do
133
- @grouped.having('sum(population) > 10').select_sql.must_equal "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
134
- end
135
- end
136
-
137
- describe "Dataset#join_table" do
138
- before do
139
- @d = Sequel.mock.dataset.from(:items).with_quote_identifiers(true).extension(:auto_literal_strings)
140
- end
141
-
142
- it "should support using a string as the join condition" do
143
- @d.join(:categories, "c.item_id = items.id", :table_alias=>:c).sql.must_equal 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
144
- end
145
- end
146
-
147
- describe "Dataset prepared statements and bound variables " do
148
- before do
149
- @db = Sequel.mock
150
- @ds = @db[:items].with_extend{def insert_select_sql(*v) "#{insert_sql(*v)} RETURNING *" end}.extension(:auto_literal_strings)
151
- end
152
-
153
- it "should handle literal strings" do
154
- @ds.filter("num = ?", :$n).call(:select, :n=>1)
155
- @db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
156
- end
157
-
158
- it "should handle subselects with strings" do
159
- @ds.filter(:$b).filter(:num=>@ds.select(:num).filter("num = ?", :$n)).call(:select, :n=>1, :b=>0)
160
- @db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num = 1))))']
161
- end
162
- end
163
-
164
- describe "Dataset#update_sql" do
165
- before do
166
- @ds = Sequel.mock.dataset.from(:items).extension(:auto_literal_strings)
167
- end
168
-
169
- it "should accept strings" do
170
- @ds.update_sql("a = b").must_equal "UPDATE items SET a = b"
171
- end
172
-
173
- it "should accept literal strings" do
174
- @ds.update_sql(Sequel.lit("a = b")).must_equal "UPDATE items SET a = b"
175
- end
176
-
177
- it "should accept hash" do
178
- @ds.update_sql(:c => 'd').must_equal "UPDATE items SET c = 'd'"
179
- end
180
- end
181
-
182
- describe "Dataset::PlaceholderLiteralizer" do
183
- before do
184
- @c = Sequel::Dataset::PlaceholderLiteralizer
185
- @db = Sequel.mock
186
- @ds = @db[:items].extension(:auto_literal_strings)
187
- @h = {:id=>1}
188
- @ds.db.fetch = @h
189
- end
190
-
191
- it "should handle calls with a placeholders used as filter arguments" do
192
- loader = @c.loader(@ds){|pl, ds| ds.where(pl.arg)}
193
- loader.first(:id=>1).must_equal @h
194
- loader.first(Sequel.expr{a(b)}).must_equal @h
195
- loader.first("a = 1").must_equal @h
196
- @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1)", "SELECT * FROM items WHERE a(b)", "SELECT * FROM items WHERE (a = 1)"]
197
- end
198
-
199
- it "should handle calls with a placeholder used multiple times in different capacities" do
200
- loader = @c.loader(@ds){|pl, ds| a = pl.arg; ds.where(a).where(:b=>a)}
201
- loader.first("a = 1").must_equal @h
202
- loader.first(["a = ?", 2]).must_equal @h
203
- @db.sqls.must_equal ["SELECT * FROM items WHERE ((a = 1) AND (b = 'a = 1'))", "SELECT * FROM items WHERE ((a = 2) AND (b IN ('a = ?', 2)))"]
204
- end
205
- end
@@ -1,229 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::AutoValidations" do
4
- before do
5
- db = Sequel.mock(:fetch=>proc{|sql| sql =~ /a{51}/ ? {:v=>0} : {:v=>1}})
6
- def db.schema_parse_table(*) true; end
7
- def db.schema(t, *)
8
- t = t.first_source if t.is_a?(Sequel::Dataset)
9
- return [] if t != :test
10
- [[:id, {:primary_key=>true, :type=>:integer, :allow_null=>false}],
11
- [:name, {:primary_key=>false, :type=>:string, :allow_null=>false, :max_length=>50}],
12
- [:num, {:primary_key=>false, :type=>:integer, :allow_null=>true}],
13
- [:d, {:primary_key=>false, :type=>:date, :allow_null=>false}],
14
- [:nnd, {:primary_key=>false, :type=>:string, :allow_null=>false, :default=>'nnd'}]]
15
- end
16
- def db.supports_index_parsing?() true end
17
- def db.indexes(t, *)
18
- raise if t.is_a?(Sequel::Dataset)
19
- return [] if t != :test
20
- {:a=>{:columns=>[:name, :num], :unique=>true}, :b=>{:columns=>[:num], :unique=>false}}
21
- end
22
- @c = Class.new(Sequel::Model(db[:test]))
23
- @c.send(:def_column_accessor, :id, :name, :num, :d, :nnd)
24
- @c.raise_on_typecast_failure = false
25
- @c.plugin :auto_validations
26
- @m = @c.new
27
- db.sqls
28
- end
29
-
30
- it "should have automatically created validations" do
31
- @m.valid?.must_equal false
32
- @m.errors.must_equal(:d=>["is not present"], :name=>["is not present"])
33
-
34
- @m.name = ''
35
- @m.valid?.must_equal false
36
- @m.errors.must_equal(:d=>["is not present"])
37
-
38
- @m.set(:d=>'/', :num=>'a', :name=>'1')
39
- @m.valid?.must_equal false
40
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
41
-
42
- @m.set(:d=>Date.today, :num=>1)
43
- @m.valid?.must_equal false
44
- @m.errors.must_equal([:name, :num]=>["is already taken"])
45
-
46
- @m.set(:name=>'a'*51)
47
- @m.valid?.must_equal false
48
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
49
- end
50
-
51
- it "should handle simple unique indexes correctly" do
52
- def (@c.db).indexes(t, *)
53
- raise if t.is_a?(Sequel::Dataset)
54
- return [] if t != :test
55
- {:a=>{:columns=>[:name], :unique=>true}}
56
- end
57
- @c.plugin :auto_validations
58
- @m.set(:name=>'foo', :d=>Date.today)
59
- @m.valid?.must_equal false
60
- @m.errors.must_equal(:name=>["is already taken"])
61
- end
62
-
63
- it "should validate using the underlying column values" do
64
- @c.send(:define_method, :name){super() * 2}
65
- @c.db.fetch = {:v=>0}
66
- @m.set(:d=>Date.today, :num=>1, :name=>'b'*26)
67
- @m.valid?.must_equal true
68
- end
69
-
70
- it "should handle databases that don't support index parsing" do
71
- def (@m.db).supports_index_parsing?() false end
72
- @m.model.send(:setup_auto_validations)
73
- @m.set(:d=>Date.today, :num=>1, :name=>'1')
74
- @m.valid?.must_equal true
75
- end
76
-
77
- it "should handle models that select from subqueries" do
78
- @c.set_dataset @c.dataset.from_self
79
- @c.send(:setup_auto_validations)
80
- end
81
-
82
- it "should support :not_null=>:presence option" do
83
- @c.plugin :auto_validations, :not_null=>:presence
84
- @m.set(:d=>Date.today, :num=>'')
85
- @m.valid?.must_equal false
86
- @m.errors.must_equal(:name=>["is not present"])
87
- end
88
-
89
- it "should automatically validate explicit nil values for columns with not nil defaults" do
90
- @m.set(:d=>Date.today, :name=>1, :nnd=>nil)
91
- @m.id = nil
92
- @m.valid?.must_equal false
93
- @m.errors.must_equal(:id=>["is not present"], :nnd=>["is not present"])
94
- end
95
-
96
- it "should allow skipping validations by type" do
97
- @c = Class.new(@c)
98
- @m = @c.new
99
- @m.skip_auto_validations(:not_null) do
100
- @m.valid?.must_equal true
101
- @m.nnd = nil
102
- @m.valid?.must_equal true
103
- end
104
- @m.set(:nnd => 'nnd')
105
- @c.skip_auto_validations(:not_null)
106
- @m.valid?.must_equal true
107
- @m.nnd = nil
108
- @m.valid?.must_equal true
109
-
110
- @m.set(:d=>'/', :num=>'a', :name=>'1')
111
- @m.valid?.must_equal false
112
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
113
-
114
- @m.skip_auto_validations(:types, :unique) do
115
- @m.valid?.must_equal true
116
- end
117
- @m.skip_auto_validations(:types) do
118
- @m.valid?.must_equal false
119
- @m.errors.must_equal([:name, :num]=>["is already taken"])
120
- end
121
- @c.skip_auto_validations(:types)
122
- @m.valid?.must_equal false
123
- @m.errors.must_equal([:name, :num]=>["is already taken"])
124
-
125
- @m.skip_auto_validations(:unique) do
126
- @m.valid?.must_equal true
127
- end
128
- @c.skip_auto_validations(:unique)
129
- @m.valid?.must_equal true
130
-
131
- @m.set(:name=>'a'*51)
132
- @m.valid?.must_equal false
133
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
134
-
135
- @m.skip_auto_validations(:max_length) do
136
- @m.valid?.must_equal true
137
- end
138
- @c.skip_auto_validations(:max_length)
139
- @m.valid?.must_equal true
140
- end
141
-
142
- it "should allow skipping all auto validations" do
143
- @c = Class.new(@c)
144
- @m = @c.new
145
- @m.skip_auto_validations(:all) do
146
- @m.valid?.must_equal true
147
- @m.set(:d=>'/', :num=>'a', :name=>'1')
148
- @m.valid?.must_equal true
149
- @m.set(:name=>'a'*51)
150
- @m.valid?.must_equal true
151
- end
152
- @m = @c.new
153
- @c.skip_auto_validations(:all)
154
- @m.valid?.must_equal true
155
- @m.set(:d=>'/', :num=>'a', :name=>'1')
156
- @m.valid?.must_equal true
157
- @m.set(:name=>'a'*51)
158
- @m.valid?.must_equal true
159
- end
160
-
161
- it "should work correctly in subclasses" do
162
- @c = Class.new(@c)
163
- @m = @c.new
164
- @m.valid?.must_equal false
165
- @m.errors.must_equal(:d=>["is not present"], :name=>["is not present"])
166
-
167
- @m.set(:d=>'/', :num=>'a', :name=>'1')
168
- @m.valid?.must_equal false
169
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
170
-
171
- @m.set(:d=>Date.today, :num=>1)
172
- @m.valid?.must_equal false
173
- @m.errors.must_equal([:name, :num]=>["is already taken"])
174
-
175
- @m.set(:name=>'a'*51)
176
- @m.valid?.must_equal false
177
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
178
- end
179
-
180
- it "should work correctly in STI subclasses" do
181
- @c.plugin(:single_table_inheritance, :num, :model_map=>{1=>@c}, :key_map=>proc{[1, 2]})
182
- sc = Class.new(@c)
183
- @m = sc.new
184
- @m.valid?.must_equal false
185
- @m.errors.must_equal(:d=>["is not present"], :name=>["is not present"])
186
-
187
- @m.set(:d=>'/', :num=>'a', :name=>'1')
188
- @m.valid?.must_equal false
189
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
190
-
191
- @m.db.sqls
192
- @m.set(:d=>Date.today, :num=>1)
193
- @m.valid?.must_equal false
194
- @m.errors.must_equal([:name, :num]=>["is already taken"])
195
- @m.db.sqls.must_equal ["SELECT count(*) AS count FROM test WHERE ((name = '1') AND (num = 1)) LIMIT 1"]
196
-
197
- @m.set(:name=>'a'*51)
198
- @m.valid?.must_equal false
199
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
200
- end
201
-
202
- it "should work correctly when changing the dataset" do
203
- @c.set_dataset(@c.db[:foo])
204
- @c.new.valid?.must_equal true
205
- end
206
-
207
- it "should support setting validator options" do
208
- sc = Class.new(@c)
209
- sc.plugin :auto_validations, :max_length_opts=> {:message=> 'ml_message'}, :schema_types_opts=> {:message=> 'st_message'}, :explicit_not_null_opts=> {:message=> 'enn_message'}, :unique_opts=> {:message=> 'u_message'}
210
-
211
- @m = sc.new
212
- @m.set(:name=>'a'*51, :d => '/', :nnd => nil, :num=>1)
213
- @m.valid?.must_equal false
214
- @m.errors.must_equal(:name=>["ml_message"], :d=>["st_message"], :nnd=>["enn_message"])
215
-
216
- @m = sc.new
217
- @m.set(:name=>1, :num=>1, :d=>Date.today)
218
- @m.valid?.must_equal false
219
- @m.errors.must_equal([:name, :num]=>["u_message"])
220
- end
221
-
222
- it "should not allow modifying auto validation information for frozen model classes" do
223
- @c.freeze
224
- @c.auto_validate_not_null_columns.frozen?.must_equal true
225
- @c.auto_validate_explicit_not_null_columns.frozen?.must_equal true
226
- @c.auto_validate_max_length_columns.frozen?.must_equal true
227
- @c.auto_validate_unique_columns.frozen?.must_equal true
228
- end
229
- end
@@ -1,95 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Model, "#(set|update)_except" do
4
- before do
5
- @c = Class.new(Sequel::Model(:items))
6
- @c.class_eval do
7
- plugin :blacklist_security
8
- set_primary_key :id
9
- columns :x, :y, :z, :id
10
- set_restricted_columns :y
11
- end
12
- @c.strict_param_setting = false
13
- @o1 = @c.new
14
- DB.reset
15
- end
16
-
17
- it "should raise errors if not all hash fields can be set and strict_param_setting is true" do
18
- @c.strict_param_setting = true
19
- proc{@c.new.set_except({:x => 1, :y => 2, :z=>3, :id=>4}, :x, :y)}.must_raise(Sequel::MassAssignmentRestriction)
20
- proc{@c.new.set_except({:x => 1, :y => 2, :z=>3}, :x, :y)}.must_raise(Sequel::MassAssignmentRestriction)
21
- (o = @c.new).set_except({:z => 3}, :x, :y)
22
- o.values.must_equal(:z=>3)
23
- end
24
-
25
- it "#set_except should not set given attributes or the primary key" do
26
- @o1.set_except({:x => 1, :y => 2, :z=>3, :id=>4}, [:y, :z])
27
- @o1.values.must_equal(:x => 1)
28
- @o1.set_except({:x => 4, :y => 2, :z=>3, :id=>4}, :y, :z)
29
- @o1.values.must_equal(:x => 4)
30
- end
31
-
32
- it "#update_except should not update given attributes" do
33
- @o1.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, [:y, :z])
34
- DB.sqls.must_equal ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE id = 10"]
35
- @c.new.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, :y, :z)
36
- DB.sqls.must_equal ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE id = 10"]
37
- end
38
- end
39
-
40
- describe Sequel::Model, ".restricted_columns " do
41
- before do
42
- @c = Class.new(Sequel::Model(:blahblah))
43
- @c.class_eval do
44
- plugin :blacklist_security
45
- columns :x, :y, :z
46
- end
47
- @c.strict_param_setting = false
48
- @c.instance_variable_set(:@columns, [:x, :y, :z])
49
- DB.sqls
50
- end
51
-
52
- it "should set the restricted columns correctly" do
53
- @c.restricted_columns.must_be_nil
54
- @c.set_restricted_columns :x
55
- @c.restricted_columns.must_equal [:x]
56
- @c.set_restricted_columns :x, :y
57
- @c.restricted_columns.must_equal [:x, :y]
58
- end
59
-
60
- it "should not set restricted columns by default" do
61
- @c.set_restricted_columns :z
62
- i = @c.new(:x => 1, :y => 2, :z => 3)
63
- i.values.must_equal(:x => 1, :y => 2)
64
- i.set(:x => 4, :y => 5, :z => 6)
65
- i.values.must_equal(:x => 4, :y => 5)
66
-
67
- @c.dataset = @c.dataset.with_fetch(:x => 7)
68
- i = @c.new
69
- i.update(:x => 7, :z => 9)
70
- i.values.must_equal(:x => 7)
71
- DB.sqls.must_equal ["INSERT INTO blahblah (x) VALUES (7)", "SELECT * FROM blahblah WHERE id = 10"]
72
- end
73
-
74
- it "should have allowed take precedence over restricted" do
75
- @c.plugin :whitelist_security
76
- @c.set_allowed_columns :x, :y
77
- @c.set_restricted_columns :y, :z
78
- i = @c.new(:x => 1, :y => 2, :z => 3)
79
- i.values.must_equal(:x => 1, :y => 2)
80
- i.set(:x => 4, :y => 5, :z => 6)
81
- i.values.must_equal(:x => 4, :y => 5)
82
-
83
- @c.dataset = @c.dataset.with_fetch(:y => 7)
84
- i = @c.new
85
- i.update(:y => 7, :z => 9)
86
- i.values.must_equal(:y => 7)
87
- DB.sqls.must_equal ["INSERT INTO blahblah (y) VALUES (7)", "SELECT * FROM blahblah WHERE id = 10"]
88
- end
89
-
90
- it "should freeze restricted_columns when freezing class" do
91
- @c.set_restricted_columns :z
92
- @c.freeze
93
- @c.restricted_columns.frozen?.must_equal true
94
- end
95
- end