sequel 5.20.0 → 5.49.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 (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. 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
@@ -1,69 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :blank
4
-
5
- describe "Object#blank?" do
6
- it "it should be true if the object responds true to empty?" do
7
- [].blank?.must_equal true
8
- {}.blank?.must_equal true
9
- o = Object.new
10
- def o.empty?; true; end
11
- o.blank?.must_equal true
12
- end
13
-
14
- it "it should be false if the object doesn't respond true to empty?" do
15
- [2].blank?.must_equal false
16
- {1=>2}.blank?.must_equal false
17
- Object.new.blank?.must_equal false
18
- end
19
- end
20
-
21
- describe "Numeric#blank?" do
22
- it "it should always be false" do
23
- 1.blank?.must_equal false
24
- 0.blank?.must_equal false
25
- -1.blank?.must_equal false
26
- 1.0.blank?.must_equal false
27
- 0.0.blank?.must_equal false
28
- -1.0.blank?.must_equal false
29
- 10000000000000000.blank?.must_equal false
30
- -10000000000000000.blank?.must_equal false
31
- 10000000000000000.0.blank?.must_equal false
32
- -10000000000000000.0.blank?.must_equal false
33
- end
34
- end
35
-
36
- describe "NilClass#blank?" do
37
- it "it should always be true" do
38
- nil.blank?.must_equal true
39
- end
40
- end
41
-
42
- describe "TrueClass#blank?" do
43
- it "it should always be false" do
44
- true.blank?.must_equal false
45
- end
46
- end
47
-
48
- describe "FalseClass#blank?" do
49
- it "it should always be true" do
50
- false.blank?.must_equal true
51
- end
52
- end
53
-
54
- describe "String#blank?" do
55
- it "it should be true if the string is empty" do
56
- ''.blank?.must_equal true
57
- end
58
- it "it should be true if the string is composed of just whitespace" do
59
- ' '.blank?.must_equal true
60
- "\r\n\t".blank?.must_equal true
61
- (' '*4000).blank?.must_equal true
62
- ("\r\n\t"*4000).blank?.must_equal true
63
- end
64
- it "it should be false if the string has any non whitespace characters" do
65
- '1'.blank?.must_equal false
66
- ("\r\n\t"*4000 + 'a').blank?.must_equal false
67
- ("\r\na\t"*4000).blank?.must_equal false
68
- end
69
- end
@@ -1,93 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Model, "BooleanReaders plugin" do
4
- before do
5
- @db = Sequel.mock
6
- def @db.supports_schema_parsing?() true end
7
- def @db.schema(*args)
8
- [[:id, {}], [:z, {:type=>:integer, :db_type=>'tinyint(1)'}], [:b, {:type=>:boolean, :db_type=>'boolean'}]]
9
- end
10
-
11
- @c = Class.new(Sequel::Model(@db[:items]))
12
- @p = proc do
13
- @columns = [:id, :b, :z]
14
- def columns; @columns; end
15
- end
16
- @c.instance_eval(&@p)
17
- end
18
-
19
- it "should create attribute? readers for all boolean attributes" do
20
- @c.plugin(:boolean_readers)
21
- o = @c.new
22
- o.b?.must_be_nil
23
- o.b = '1'
24
- o.b?.must_equal true
25
- o.b = '0'
26
- o.b?.must_equal false
27
- o.b = ''
28
- o.b?.must_be_nil
29
- end
30
-
31
- it "should not create attribute? readers for non-boolean attributes" do
32
- @c.plugin(:boolean_readers)
33
- proc{@c.new.z?}.must_raise(NoMethodError)
34
- proc{@c.new.id?}.must_raise(NoMethodError)
35
- end
36
-
37
- it "should accept a block to determine if an attribute is boolean" do
38
- @c.plugin(:boolean_readers){|c| db_schema[c][:db_type] == 'tinyint(1)'}
39
- proc{@c.new.b?}.must_raise(NoMethodError)
40
- o = @c.new
41
- o.z.must_be_nil
42
- o.z?.must_be_nil
43
- o.z = '1'
44
- o.z.must_equal 1
45
- o.z?.must_equal true
46
- o.z = '0'
47
- o.z.must_equal 0
48
- o.z?.must_equal false
49
- o.z = ''
50
- o.z.must_be_nil
51
- o.z?.must_be_nil
52
- end
53
-
54
- it "should create boolean readers when set_dataset is defined" do
55
- c = Class.new(Sequel::Model(@db))
56
- c.instance_eval(&@p)
57
- c.plugin(:boolean_readers)
58
- c.set_dataset(@db[:a])
59
- o = c.new
60
- o.b?.must_be_nil
61
- o.b = '1'
62
- o.b?.must_equal true
63
- o.b = '0'
64
- o.b?.must_equal false
65
- o.b = ''
66
- o.b?.must_be_nil
67
- proc{o.i?}.must_raise(NoMethodError)
68
-
69
- c = Class.new(Sequel::Model(@db))
70
- c.instance_eval(&@p)
71
- c.plugin(:boolean_readers){|x| db_schema[x][:db_type] == 'tinyint(1)'}
72
- c.set_dataset(@db[:a])
73
- o = c.new
74
- o.z.must_be_nil
75
- o.z?.must_be_nil
76
- o.z = '1'
77
- o.z.must_equal 1
78
- o.z?.must_equal true
79
- o.z = '0'
80
- o.z.must_equal 0
81
- o.z?.must_equal false
82
- o.z = ''
83
- o.z.must_be_nil
84
- o.z?.must_be_nil
85
- proc{o.b?}.must_raise(NoMethodError)
86
- end
87
-
88
- it "should handle cases where getting the columns raises an error" do
89
- def @c.columns; raise Sequel::Error end
90
- @c.plugin(:boolean_readers)
91
- proc{@c.new.b?}.must_raise(NoMethodError)
92
- end
93
- end