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,402 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- model_class = proc do |klass, &block|
4
- c = Class.new(klass)
5
- c.plugin :hook_class_methods
6
- c.class_eval(&block) if block
7
- c
8
- end
9
-
10
- describe Sequel::Model, "hook_class_methods plugin" do
11
- before do
12
- DB.reset
13
- end
14
-
15
- it "should freeze hooks when freezing model class" do
16
- c = model_class.call Sequel::Model do
17
- before_save{adds << 'hi'}
18
- end
19
- c.freeze
20
- hooks = c.instance_variable_get(:@hooks)
21
- hooks.frozen?.must_equal true
22
- hooks.values.all?(&:frozen?).must_equal true
23
- end
24
-
25
- deprecated ".hook_blocks method should yield each hook block" do
26
- c = model_class.call Sequel::Model
27
- a = []
28
- c.hook_blocks(:before_save){|b| a << b}
29
- a.must_equal []
30
-
31
- pr = proc{adds << 'hi'}
32
- c.before_save(&pr)
33
- a = []
34
- c.hook_blocks(:before_save){|b| a << b}
35
- a.must_equal [pr]
36
-
37
- c.before_save(&pr)
38
- a = []
39
- c.hook_blocks(:before_save){|b| a << b}
40
- a.must_equal [pr, pr]
41
-
42
- a = []
43
- c.hook_blocks(:after_save){|b| a << b}
44
- a.must_equal []
45
- end
46
-
47
- it "should be definable using a block" do
48
- adds = []
49
- c = model_class.call Sequel::Model do
50
- before_save{adds << 'hi'}
51
- end
52
-
53
- c.new.before_save
54
- adds.must_equal ['hi']
55
- end
56
-
57
- it "should be definable using a method name" do
58
- adds = []
59
- c = model_class.call Sequel::Model do
60
- define_method(:bye){adds << 'bye'}
61
- before_save :bye
62
- end
63
-
64
- c.new.before_save
65
- adds.must_equal ['bye']
66
- end
67
-
68
- it "should be additive" do
69
- adds = []
70
- c = model_class.call Sequel::Model do
71
- after_save{adds << 'hyiyie'}
72
- after_save{adds << 'byiyie'}
73
- end
74
-
75
- c.new.after_save
76
- adds.must_equal ['hyiyie', 'byiyie']
77
- end
78
-
79
- it "before hooks should run in reverse order" do
80
- adds = []
81
- c = model_class.call Sequel::Model do
82
- before_save{adds << 'hyiyie'}
83
- before_save{adds << 'byiyie'}
84
- end
85
-
86
- c.new.before_save
87
- adds.must_equal ['byiyie', 'hyiyie']
88
- end
89
-
90
- it "should not be additive if the method or tag already exists" do
91
- adds = []
92
- c = model_class.call Sequel::Model do
93
- define_method(:bye){adds << 'bye'}
94
- before_save :bye
95
- before_save :bye
96
- end
97
-
98
- c.new.before_save
99
- adds.must_equal ['bye']
100
-
101
- adds = []
102
- d = model_class.call Sequel::Model do
103
- before_save(:bye){adds << 'hyiyie'}
104
- before_save(:bye){adds << 'byiyie'}
105
- end
106
-
107
- d.new.before_save
108
- adds.must_equal ['byiyie']
109
-
110
- adds = []
111
- e = model_class.call Sequel::Model do
112
- define_method(:bye){adds << 'bye'}
113
- before_save :bye
114
- before_save(:bye){adds << 'byiyie'}
115
- end
116
-
117
- e.new.before_save
118
- adds.must_equal ['byiyie']
119
-
120
- adds = []
121
- e = model_class.call Sequel::Model do
122
- define_method(:bye){adds << 'bye'}
123
- before_save(:bye){adds << 'byiyie'}
124
- before_save :bye
125
- end
126
-
127
- e.new.before_save
128
- adds.must_equal ['bye']
129
- end
130
-
131
- it "should be inheritable" do
132
- adds = []
133
- a = model_class.call Sequel::Model do
134
- after_save{adds << '123'}
135
- end
136
-
137
- b = Class.new(a)
138
- b.class_eval do
139
- after_save{adds << '456'}
140
- after_save{adds << '789'}
141
- end
142
-
143
- b.new.after_save
144
- adds.must_equal ['123', '456', '789']
145
- end
146
-
147
- it "should be overridable in descendant classes" do
148
- adds = []
149
- a = model_class.call Sequel::Model do
150
- before_save{adds << '123'}
151
- end
152
-
153
- b = Class.new(a)
154
- b.class_eval do
155
- define_method(:before_save){adds << '456'}
156
- end
157
-
158
- a.new.before_save
159
- adds.must_equal ['123']
160
- adds = []
161
- b.new.before_save
162
- adds.must_equal ['456']
163
- end
164
-
165
- it "should stop processing if a before hook calls cancel_action" do
166
- flag = true
167
- adds = []
168
-
169
- a = model_class.call Sequel::Model(:items) do
170
- before_save{adds << 'cruel'; cancel_action if flag == false}
171
- before_save{adds << 'blah'; cancel_action if flag == false}
172
- end
173
-
174
- a.raise_on_save_failure = false
175
- a.new.save
176
- adds.must_equal ['blah', 'cruel']
177
-
178
- # chain should not break on nil
179
- adds = []
180
- flag = nil
181
- a.new.save
182
- adds.must_equal ['blah', 'cruel']
183
-
184
- adds = []
185
- flag = false
186
- a.new.save
187
- adds.must_equal ['blah']
188
-
189
- b = Class.new(a)
190
- b.class_eval do
191
- before_save{adds << 'mau'}
192
- end
193
-
194
- adds = []
195
- b.new.save
196
- adds.must_equal ['mau', 'blah']
197
- end
198
- end
199
-
200
- describe "Model#before_create && Model#after_create" do
201
- before do
202
- DB.reset
203
-
204
- @c = model_class.call Sequel::Model(:items) do
205
- columns :x
206
- no_primary_key
207
-
208
- after_create {DB << "BLAH after"}
209
- end
210
- end
211
-
212
- it "should be called around new record creation" do
213
- @c.before_create {DB << "BLAH before"}
214
- @c.create(:x => 2)
215
- DB.sqls.must_equal ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'BLAH after']
216
- end
217
-
218
- it ".create should cancel the save and raise an error if before_create calls cancel_action and raise_on_save_failure is true" do
219
- @c.before_create{cancel_action}
220
- proc{@c.create(:x => 2)}.must_raise(Sequel::HookFailed)
221
- DB.sqls.must_equal []
222
- end
223
-
224
- it ".create should cancel the save and return nil if before_create calls cancel_action and raise_on_save_failure is false" do
225
- @c.before_create{cancel_action}
226
- @c.raise_on_save_failure = false
227
- @c.create(:x => 2).must_be_nil
228
- DB.sqls.must_equal []
229
- end
230
- end
231
-
232
- describe "Model#before_update && Model#after_update" do
233
- before do
234
- DB.reset
235
-
236
- @c = model_class.call(Sequel::Model(:items)) do
237
- after_update {DB << "BLAH after"}
238
- end
239
- end
240
-
241
- it "should be called around record update" do
242
- @c.before_update {DB << "BLAH before"}
243
- m = @c.load(:id => 2233, :x=>123)
244
- m.save
245
- DB.sqls.must_equal ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
246
- end
247
-
248
- it "#save should cancel the save and raise an error if before_update calls cancel_action and raise_on_save_failure is true" do
249
- @c.before_update{cancel_action}
250
- proc{@c.load(:id => 2233).save}.must_raise(Sequel::HookFailed)
251
- DB.sqls.must_equal []
252
- end
253
-
254
- it "#save should cancel the save and return nil if before_update calls cancel_action and raise_on_save_failure is false" do
255
- @c.before_update{cancel_action}
256
- @c.raise_on_save_failure = false
257
- @c.load(:id => 2233).save.must_be_nil
258
- DB.sqls.must_equal []
259
- end
260
- end
261
-
262
- describe "Model#before_save && Model#after_save" do
263
- before do
264
- DB.reset
265
-
266
- @c = model_class.call(Sequel::Model(:items)) do
267
- columns :x
268
- after_save {DB << "BLAH after"}
269
- end
270
- end
271
-
272
- it "should be called around record update" do
273
- @c.before_save {DB << "BLAH before"}
274
- m = @c.load(:id => 2233, :x=>123)
275
- m.save
276
- DB.sqls.must_equal ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
277
- end
278
-
279
- it "should be called around record creation" do
280
- @c.before_save {DB << "BLAH before"}
281
- @c.no_primary_key
282
- @c.create(:x => 2)
283
- DB.sqls.must_equal ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'BLAH after']
284
- end
285
-
286
- it "#save should cancel the save and raise an error if before_save calls cancel_action and raise_on_save_failure is true" do
287
- @c.before_save{cancel_action}
288
- proc{@c.load(:id => 2233).save}.must_raise(Sequel::HookFailed)
289
- DB.sqls.must_equal []
290
- end
291
-
292
- it "#save should cancel the save and return nil if before_save calls cancel_action and raise_on_save_failure is false" do
293
- @c.before_save{cancel_action}
294
- @c.raise_on_save_failure = false
295
- @c.load(:id => 2233).save.must_be_nil
296
- DB.sqls.must_equal []
297
- end
298
- end
299
-
300
- describe "Model#before_destroy && Model#after_destroy" do
301
- before do
302
- DB.reset
303
-
304
- @c = model_class.call(Sequel::Model(:items)) do
305
- after_destroy {DB << "BLAH after"}
306
- end
307
- end
308
-
309
- it "should be called around record destruction" do
310
- @c.before_destroy {DB << "BLAH before"}
311
- m = @c.load(:id => 2233)
312
- m.destroy
313
- DB.sqls.must_equal ['BLAH before', "DELETE FROM items WHERE id = 2233", 'BLAH after']
314
- end
315
-
316
- it "#destroy should cancel the destroy and raise an error if before_destroy calls cancel_action and raise_on_save_failure is true" do
317
- @c.before_destroy{cancel_action}
318
- proc{@c.load(:id => 2233).destroy}.must_raise(Sequel::HookFailed)
319
- DB.sqls.must_equal []
320
- end
321
-
322
- it "#destroy should cancel the destroy and return nil if before_destroy calls cancel_action and raise_on_save_failure is false" do
323
- @c.before_destroy{cancel_action}
324
- @c.raise_on_save_failure = false
325
- @c.load(:id => 2233).destroy.must_be_nil
326
- DB.sqls.must_equal []
327
- end
328
- end
329
-
330
- describe "Model#before_validation && Model#after_validation" do
331
- before do
332
- DB.reset
333
-
334
- @c = model_class.call(Sequel::Model(:items)) do
335
- plugin :validation_class_methods
336
- after_validation{DB << "BLAH after"}
337
-
338
- def self.validate(o)
339
- o.errors.add(:id, 'not valid') unless o[:id] == 2233
340
- end
341
- columns :id
342
- end
343
- end
344
-
345
- it "should be called around validation" do
346
- @c.before_validation{DB << "BLAH before"}
347
- m = @c.load(:id => 2233)
348
- m.must_be :valid?
349
- DB.sqls.must_equal ['BLAH before', 'BLAH after']
350
-
351
- DB.sqls.clear
352
- m = @c.load(:id => 22)
353
- m.wont_be :valid?
354
- DB.sqls.must_equal ['BLAH before', 'BLAH after']
355
- end
356
-
357
- it "should be called when calling save" do
358
- @c.before_validation{DB << "BLAH before"}
359
- m = @c.load(:id => 2233, :x=>123)
360
- m.save.must_equal m
361
- DB.sqls.must_equal ['BLAH before', 'BLAH after', 'UPDATE items SET x = 123 WHERE (id = 2233)']
362
-
363
- DB.sqls.clear
364
- m = @c.load(:id => 22)
365
- m.raise_on_save_failure = false
366
- m.save.must_be_nil
367
- DB.sqls.must_equal ['BLAH before', 'BLAH after']
368
- end
369
-
370
- it "#save should cancel the save and raise an error if before_validation calls cancel_action and raise_on_save_failure is true" do
371
- @c.before_validation{cancel_action}
372
- proc{@c.load(:id => 2233).save}.must_raise(Sequel::HookFailed)
373
- DB.sqls.must_equal []
374
- end
375
-
376
- it "#save should cancel the save and return nil if before_validation calls cancel_action and raise_on_save_failure is false" do
377
- @c.before_validation{cancel_action}
378
- @c.raise_on_save_failure = false
379
- @c.load(:id => 2233).save.must_be_nil
380
- DB.sqls.must_equal []
381
- end
382
- end
383
-
384
- describe "Model.has_hooks?" do
385
- before do
386
- @c = model_class.call(Sequel::Model(:items))
387
- end
388
-
389
- it "should return false if no hooks are defined" do
390
- @c.has_hooks?(:before_save).must_equal false
391
- end
392
-
393
- it "should return true if hooks are defined" do
394
- @c.before_save {'blah'}
395
- @c.has_hooks?(:before_save).must_equal true
396
- end
397
-
398
- it "should return true if hooks are inherited" do
399
- @d = Class.new(@c)
400
- @d.has_hooks?(:before_save).must_equal false
401
- end
402
- end
@@ -1,201 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "identifier_mangling extension" do
4
- it "should respect the :quote_identifiers option" do
5
- db = Sequel::Database.new(:quote_identifiers=>false).extension(:identifier_mangling)
6
- db.quote_identifiers?.must_equal false
7
- db = Sequel::Database.new(:quote_identifiers=>true).extension(:identifier_mangling)
8
- db.quote_identifiers?.must_equal true
9
- end
10
-
11
- it "should respect the :quote_identifiers setting" do
12
- db = Sequel::Database.new.extension(:identifier_mangling)
13
- db.quote_identifiers?.must_equal true
14
- db.quote_identifiers = false
15
- db.quote_identifiers?.must_equal false
16
- end
17
-
18
- it "should upcase on input and downcase on output by default" do
19
- db = Sequel::Database.new.extension(:identifier_mangling)
20
- db.send(:identifier_input_method_default).must_equal :upcase
21
- db.send(:identifier_output_method_default).must_equal :downcase
22
- end
23
-
24
- it "should respect the :identifier_input_method option" do
25
- db = Sequel::Database.new.extension(:identifier_mangling)
26
- db.identifier_input_method.must_equal :upcase
27
- db.identifier_input_method = nil
28
- db.identifier_input_method.must_be_nil
29
- db = Sequel::Database.new(:identifier_input_method=>nil).extension(:identifier_mangling)
30
- db.identifier_input_method.must_be_nil
31
- db.identifier_input_method = :downcase
32
- db.identifier_input_method.must_equal :downcase
33
- db = Sequel::Database.new(:identifier_input_method=>:upcase).extension(:identifier_mangling)
34
- db.identifier_input_method.must_equal :upcase
35
- db.identifier_input_method = nil
36
- db.identifier_input_method.must_be_nil
37
- end
38
-
39
- it "should respect the :identifier_output_method option" do
40
- db = Sequel::Database.new.extension(:identifier_mangling)
41
- db.identifier_output_method.must_equal :downcase
42
- db.identifier_output_method = nil
43
- db.identifier_output_method.must_be_nil
44
- db = Sequel::Database.new(:identifier_output_method=>nil).extension(:identifier_mangling)
45
- db.identifier_output_method.must_be_nil
46
- db.identifier_output_method = :downcase
47
- db.identifier_output_method.must_equal :downcase
48
- db = Sequel::Database.new(:identifier_output_method=>:upcase).extension(:identifier_mangling)
49
- db.identifier_output_method.must_equal :upcase
50
- db.identifier_output_method = nil
51
- db.identifier_output_method.must_be_nil
52
- end
53
-
54
- it "should respect the identifier_input_method_default method if Sequel.identifier_input_method is not called" do
55
- class Sequel::Database
56
- @identifier_input_method = nil
57
- end
58
- x = Class.new(Sequel::Database){def dataset_class_default; Sequel::Dataset end; def identifier_input_method_default; :downcase end}
59
- x.new.extension(:identifier_mangling).identifier_input_method.must_equal :downcase
60
- y = Class.new(Sequel::Database){def dataset_class_default; Sequel::Dataset end; def identifier_input_method_default; :camelize end}
61
- y.new.extension(:identifier_mangling).identifier_input_method.must_equal :camelize
62
- end
63
-
64
- it "should respect the identifier_output_method_default method if Sequel.identifier_output_method is not called" do
65
- class Sequel::Database
66
- @identifier_output_method = nil
67
- end
68
- x = Class.new(Sequel::Database){def dataset_class_default; Sequel::Dataset end; def identifier_output_method_default; :upcase end}
69
- x.new.extension(:identifier_mangling).identifier_output_method.must_equal :upcase
70
- y = Class.new(Sequel::Database){def dataset_class_default; Sequel::Dataset end; def identifier_output_method_default; :underscore end}
71
- y.new.extension(:identifier_mangling).identifier_output_method.must_equal :underscore
72
- end
73
- end
74
-
75
- describe "Database#input_identifier_meth" do
76
- it "should be the input_identifer method of a default dataset for this database" do
77
- db = Sequel::Database.new.extension(:identifier_mangling)
78
- db.identifier_input_method = nil
79
- db.send(:input_identifier_meth).call(:a).must_equal 'a'
80
- db.identifier_input_method = :upcase
81
- db.send(:input_identifier_meth).call(:a).must_equal 'A'
82
- end
83
- end
84
-
85
- describe "Database#output_identifier_meth" do
86
- it "should be the output_identifer method of a default dataset for this database" do
87
- db = Sequel::Database.new.extension(:identifier_mangling)
88
- db.identifier_output_method = nil
89
- db.send(:output_identifier_meth).call('A').must_equal :A
90
- db.identifier_output_method = :downcase
91
- db.send(:output_identifier_meth).call('A').must_equal :a
92
- end
93
- end
94
-
95
- describe "Database#metadata_dataset" do
96
- it "should be a dataset with the default settings for identifier_mangling" do
97
- ds = Sequel::Database.new.extension(:identifier_mangling).send(:metadata_dataset)
98
- ds.literal(:a).must_equal "\"A\""
99
- ds.send(:output_identifier, 'A').must_equal :a
100
- end
101
- end
102
-
103
- describe "Dataset" do
104
- before do
105
- @dataset = Sequel.mock.extension(:identifier_mangling).dataset
106
- end
107
-
108
- it "should get quote_identifiers default from database" do
109
- db = Sequel::Database.new(:quote_identifiers=>true).extension(:identifier_mangling)
110
- db[:a].quote_identifiers?.must_equal true
111
- db = Sequel::Database.new(:quote_identifiers=>false).extension(:identifier_mangling)
112
- db[:a].quote_identifiers?.must_equal false
113
- end
114
-
115
- it "should get identifier_input_method default from database" do
116
- db = Sequel::Database.new(:identifier_input_method=>:upcase).extension(:identifier_mangling)
117
- db[:a].identifier_input_method.must_equal :upcase
118
- db = Sequel::Database.new(:identifier_input_method=>:downcase).extension(:identifier_mangling)
119
- db[:a].identifier_input_method.must_equal :downcase
120
- end
121
-
122
- it "should get identifier_output_method default from database" do
123
- db = Sequel::Database.new(:identifier_output_method=>:upcase).extension(:identifier_mangling)
124
- db[:a].identifier_output_method.must_equal :upcase
125
- db = Sequel::Database.new(:identifier_output_method=>:downcase).extension(:identifier_mangling)
126
- db[:a].identifier_output_method.must_equal :downcase
127
- end
128
-
129
- it "should have with_quote_identifiers method which returns cloned dataset with changed literalization of identifiers" do
130
- @dataset.with_quote_identifiers(true).literal(:a).must_equal '"a"'
131
- @dataset.with_quote_identifiers(false).literal(:a).must_equal 'a'
132
- ds = @dataset.freeze.with_quote_identifiers(false)
133
- ds.literal(:a).must_equal 'a'
134
- ds.frozen?.must_equal true
135
- end
136
-
137
- it "should have with_identifier_input_method method which returns cloned dataset with changed literalization of identifiers" do
138
- @dataset.with_identifier_input_method(:upcase).literal(:a).must_equal 'A'
139
- @dataset.with_identifier_input_method(:downcase).literal(:A).must_equal 'a'
140
- @dataset.with_identifier_input_method(:reverse).literal(:at_b).must_equal 'b_ta'
141
- ds = @dataset.freeze.with_identifier_input_method(:reverse)
142
- ds.frozen?.must_equal true
143
- ds.literal(:at_b).must_equal 'b_ta'
144
- end
145
-
146
- it "should have with_identifier_output_method method which returns cloned dataset with changed identifiers returned from the database" do
147
- @dataset.send(:output_identifier, "at_b_C").must_equal :at_b_C
148
- @dataset.with_identifier_output_method(:upcase).send(:output_identifier, "at_b_C").must_equal :AT_B_C
149
- @dataset.with_identifier_output_method(:downcase).send(:output_identifier, "at_b_C").must_equal :at_b_c
150
- @dataset.with_identifier_output_method(:reverse).send(:output_identifier, "at_b_C").must_equal :C_b_ta
151
- ds = @dataset.freeze.with_identifier_output_method(:reverse)
152
- ds.send(:output_identifier, "at_b_C").must_equal :C_b_ta
153
- ds.frozen?.must_equal true
154
- end
155
-
156
- it "should have output_identifier handle empty identifiers" do
157
- @dataset.send(:output_identifier, "").must_equal :untitled
158
- @dataset.with_identifier_output_method(:upcase).send(:output_identifier, "").must_equal :UNTITLED
159
- @dataset.with_identifier_output_method(:downcase).send(:output_identifier, "").must_equal :untitled
160
- @dataset.with_identifier_output_method(:reverse).send(:output_identifier, "").must_equal :deltitnu
161
- end
162
- end
163
-
164
- describe "identifier_mangling extension" do
165
- it "should be able to load dialects based on the database name" do
166
- Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
167
- Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
168
- Sequel.mock(:host=>'mssql')[:a].full_text_search(:b, 'c').sql.must_equal "SELECT * FROM [A] WHERE (CONTAINS ([B], 'c'))"
169
- Sequel.mock(:host=>'mysql')[:a].full_text_search(:b, 'c').sql.must_equal "SELECT * FROM `a` WHERE (MATCH (`b`) AGAINST ('c'))"
170
- Sequel.mock(:host=>'oracle')[:a].limit(1).sql.must_equal 'SELECT * FROM (SELECT * FROM "A") "T1" WHERE (ROWNUM <= 1)'
171
- Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').sql.must_equal "SELECT * FROM \"a\" WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(\"b\", ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
172
- Sequel.mock(:host=>'sqlanywhere').from(:a).offset(1).sql.must_equal 'SELECT TOP 2147483647 START AT (1 + 1) * FROM "A"'
173
- Sequel.mock(:host=>'sqlite')[Sequel[:a].as(:b)].sql.must_equal "SELECT * FROM `a` AS 'b'"
174
- end
175
- end
176
-
177
- describe Sequel::Model, ".[] optimization" do
178
- before do
179
- @db = Sequel.mock(:quote_identifiers=>true).extension(:identifier_mangling)
180
- def @db.schema(*) [[:id, {:primary_key=>true}]] end
181
- def @db.supports_schema_parsing?() true end
182
- @c = Class.new(Sequel::Model(@db))
183
- @ds = @db.dataset.with_quote_identifiers(true)
184
- end
185
-
186
- it "should have simple_pk and simple_table respect dataset's identifier input methods" do
187
- ds = @db.from(:ab).with_identifier_input_method(:reverse)
188
- @c.set_dataset ds
189
- @c.simple_table.must_equal '"ba"'
190
- @c.set_primary_key :cd
191
- @c.simple_pk.must_equal '"dc"'
192
- @c.set_dataset ds.from(Sequel[:ef][:gh])
193
- @c.simple_table.must_equal '"fe"."hg"'
194
- end
195
-
196
- with_symbol_splitting "should have simple_pk and simple_table respect dataset's identifier input methods when using splittable symbols" do
197
- ds = @db.from(:ab).with_identifier_input_method(:reverse)
198
- @c.set_dataset ds.from(:ef__gh)
199
- @c.simple_table.must_equal '"fe"."hg"'
200
- end
201
- end
@@ -1,58 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Dataset::ImplicitSubquery" do
4
- it "should implicitly use a subquery for most dataset query methods" do
5
- db = Sequel.mock
6
- db.extend_datasets{def supports_cte?; true end}
7
- ds = db["SELECT * FROM table"].extension(:implicit_subquery)
8
- ds.columns(:id, :a)
9
- ods = db[:c]
10
- ods.columns(:id, :b)
11
-
12
- ds.cross_join(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 CROSS JOIN c"
13
- ds.distinct.sql.must_equal "SELECT DISTINCT * FROM (SELECT * FROM table) AS t1"
14
- ds.except(ods).sql.must_equal "SELECT * FROM (SELECT * FROM (SELECT * FROM table) AS t1 EXCEPT SELECT * FROM c) AS t1"
15
- ds.exclude(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 WHERE NOT c"
16
- ds.exclude_having(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 HAVING NOT c"
17
- ds.filter(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 WHERE c"
18
- ds.for_update.sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 FOR UPDATE"
19
- ds.full_join(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 FULL JOIN c"
20
- ds.full_outer_join(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 FULL OUTER JOIN c"
21
- ds.graph(ods).sql.must_equal "SELECT t1.id, t1.a, c.id AS c_id, c.b FROM (SELECT * FROM table) AS t1 LEFT OUTER JOIN c"
22
- ds.grep(:c, 'a').sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 WHERE ((c LIKE 'a' ESCAPE '\\'))"
23
- ds.group(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 GROUP BY c"
24
- ds.group_append(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 GROUP BY c"
25
- ds.group_and_count(:c).sql.must_equal "SELECT c, count(*) AS count FROM (SELECT * FROM table) AS t1 GROUP BY c"
26
- ds.group_by(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 GROUP BY c"
27
- ds.having(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 HAVING c"
28
- ds.inner_join(:c, [:d]).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 INNER JOIN c USING (d)"
29
- ds.intersect(ods).sql.must_equal "SELECT * FROM (SELECT * FROM (SELECT * FROM table) AS t1 INTERSECT SELECT * FROM c) AS t1"
30
- ds.invert.sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 WHERE 'f'"
31
- ds.join(:c, [:d]).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 INNER JOIN c USING (d)"
32
- ds.join_table(:inner, :c, [:d]).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 INNER JOIN c USING (d)"
33
- ds.left_join(:c, [:d]).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 LEFT JOIN c USING (d)"
34
- ds.left_outer_join(:c, [:d]).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 LEFT OUTER JOIN c USING (d)"
35
- ds.limit(1).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 LIMIT 1"
36
- ds.lock_style('FOR UPDATE').sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 FOR UPDATE"
37
- ds.natural_full_join(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 NATURAL FULL JOIN c"
38
- ds.natural_join(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 NATURAL JOIN c"
39
- ds.natural_left_join(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 NATURAL LEFT JOIN c"
40
- ds.natural_right_join(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 NATURAL RIGHT JOIN c"
41
- ds.offset(1).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 OFFSET 1"
42
- ds.order(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 ORDER BY c"
43
- ds.order_append(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 ORDER BY c"
44
- ds.order_by(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 ORDER BY c"
45
- ds.order_more(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 ORDER BY c"
46
- ds.order_prepend(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 ORDER BY c"
47
- ds.right_join(:c, [:d]).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 RIGHT JOIN c USING (d)"
48
- ds.right_outer_join(:c, [:d]).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 RIGHT OUTER JOIN c USING (d)"
49
- ds.select(:c).sql.must_equal "SELECT c FROM (SELECT * FROM table) AS t1"
50
- ds.select_append(:c).sql.must_equal "SELECT *, c FROM (SELECT * FROM table) AS t1"
51
- ds.select_group(:c).sql.must_equal "SELECT c FROM (SELECT * FROM table) AS t1 GROUP BY c"
52
- ds.select_more(:c).sql.must_equal "SELECT *, c FROM (SELECT * FROM table) AS t1"
53
- ds.union(ods).sql.must_equal "SELECT * FROM (SELECT * FROM (SELECT * FROM table) AS t1 UNION SELECT * FROM c) AS t1"
54
- ds.where(:c).sql.must_equal "SELECT * FROM (SELECT * FROM table) AS t1 WHERE c"
55
- ds.with(:d, ods).sql.must_equal "WITH d AS (SELECT * FROM c) SELECT * FROM (SELECT * FROM table) AS t1"
56
- ds.with_recursive(:d, ods, ods).sql.must_equal "WITH d AS (SELECT * FROM c UNION ALL SELECT * FROM c) SELECT * FROM (SELECT * FROM table) AS t1"
57
- end
58
- end