sequel 5.8.0 → 5.38.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 (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  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 -380
  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 -275
  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 -840
  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 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  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 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  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 -487
  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 -182
  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 -868
  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 -61
  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 -410
  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 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -1,370 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Model#before_create && Model#after_create" do
4
- before do
5
- @c = Class.new(Sequel::Model(:items)) do
6
- columns :x
7
- set_primary_key :x
8
- unrestrict_primary_key
9
-
10
- def after_create
11
- DB << "BLAH after"
12
- end
13
- end
14
- DB.reset
15
- end
16
-
17
- it "should be called around new record creation" do
18
- @c.send(:define_method, :before_create){DB << "BLAH before"}
19
- @c.create(:x => 2)
20
- DB.sqls.must_equal ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'SELECT * FROM items WHERE x = 2', 'BLAH after']
21
- end
22
-
23
- it ".create should cancel the save and raise an error if before_create calls cancel_action and raise_on_save_failure is true" do
24
- @c.send(:define_method, :before_create){cancel_action 'not good'}
25
- proc{@c.create(:x => 2)}.must_raise(Sequel::HookFailed, 'not good')
26
- DB.sqls.must_equal []
27
- @c.load(:id => 2233).save
28
- end
29
-
30
- it ".create should cancel the save and return nil if before_create calls cancel_action and raise_on_save_failure is false" do
31
- @c.send(:define_method, :before_create){cancel_action}
32
- @c.raise_on_save_failure = false
33
- @c.create(:x => 2).must_be_nil
34
- DB.sqls.must_equal []
35
- end
36
- end
37
-
38
- describe "Model#before_update && Model#after_update" do
39
- before do
40
- @c = Class.new(Sequel::Model(:items)) do
41
- columns :id, :x
42
- def after_update
43
- DB << "BLAH after"
44
- end
45
- end
46
- DB.reset
47
- end
48
-
49
- it "should be called around record update" do
50
- @c.send(:define_method, :before_update){DB << "BLAH before"}
51
- m = @c.load(:id => 2233, :x=>123)
52
- m.save
53
- DB.sqls.must_equal ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
54
- end
55
-
56
- it "#save should cancel the save and raise an error if before_update calls cancel_action and raise_on_save_failure is true" do
57
- @c.send(:define_method, :before_update){cancel_action}
58
- proc{@c.load(:id => 2233).save}.must_raise(Sequel::HookFailed)
59
- DB.sqls.must_equal []
60
- end
61
-
62
- it "#save should cancel the save and return nil if before_update calls cancel_action and raise_on_save_failure is false" do
63
- @c.send(:define_method, :before_update){cancel_action}
64
- @c.raise_on_save_failure = false
65
- @c.load(:id => 2233).save.must_be_nil
66
- DB.sqls.must_equal []
67
- end
68
- end
69
-
70
- describe "Model#before_save && Model#after_save" do
71
- before do
72
- @c = Class.new(Sequel::Model(:items)) do
73
- columns :x
74
- def after_save
75
- DB << "BLAH after"
76
- end
77
- end
78
- DB.reset
79
- end
80
-
81
- it "should be called around record update" do
82
- @c.send(:define_method, :before_save){DB << "BLAH before"}
83
- m = @c.load(:id => 2233, :x=>123)
84
- m.save
85
- DB.sqls.must_equal ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
86
- end
87
-
88
- it "should be called around record creation" do
89
- @c.send(:define_method, :before_save){DB << "BLAH before"}
90
- @c.set_primary_key :x
91
- @c.unrestrict_primary_key
92
- @c.create(:x => 2)
93
- DB.sqls.must_equal ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'SELECT * FROM items WHERE x = 2', 'BLAH after']
94
- end
95
-
96
- it "#save should cancel the save and raise an error if before_save calls cancel_action and raise_on_failure option is true" do
97
- @c.send(:define_method, :before_save){cancel_action}
98
- @c.raise_on_save_failure = false
99
- proc{@c.load(:id => 2233).save(:raise_on_failure => true)}.must_raise(Sequel::HookFailed)
100
- DB.sqls.must_equal []
101
- end
102
-
103
- it "#save should cancel the save and return nil if before_save calls cancel_action and raise_on_save_failure is false" do
104
- @c.send(:define_method, :before_save){cancel_action}
105
- @c.raise_on_save_failure = false
106
- @c.load(:id => 2233).save.must_be_nil
107
- DB.sqls.must_equal []
108
- end
109
-
110
- it "#save should have a raised exception reference the model instance" do
111
- @c.send(:define_method, :before_save){cancel_action}
112
- proc{@c.create(:x => 2233)}.must_raise(Sequel::HookFailed){|e| e.model.must_equal @c.load(:x=>2233)}
113
- DB.sqls.must_equal []
114
- end
115
- end
116
-
117
- describe "Model#before_destroy && Model#after_destroy" do
118
- before do
119
- @c = Class.new(Sequel::Model(:items)) do
120
- def after_destroy
121
- DB << "BLAH after"
122
- end
123
- end
124
- DB.reset
125
- end
126
-
127
- it "should be called around record destruction" do
128
- @c.send(:define_method, :before_destroy){DB << "BLAH before"}
129
- m = @c.load(:id => 2233)
130
- m.destroy
131
- DB.sqls.must_equal ['BLAH before', 'DELETE FROM items WHERE id = 2233', 'BLAH after']
132
- end
133
-
134
- it "#destroy should cancel the destroy and raise an error if before_destroy calls cancel_action and raise_on_save_failure is true" do
135
- @c.send(:define_method, :before_destroy){cancel_action; true}
136
- proc{@c.load(:id => 2233).destroy}.must_raise(Sequel::HookFailed)
137
- DB.sqls.must_equal []
138
- end
139
-
140
- it "#destroy should cancel the destroy and return nil if before_destroy calls cancel_action and raise_on_save_failure is false" do
141
- @c.send(:define_method, :before_destroy){cancel_action; true}
142
- @c.raise_on_save_failure = false
143
- @c.load(:id => 2233).destroy.must_be_nil
144
- DB.sqls.must_equal []
145
- end
146
- end
147
-
148
- describe "Model#before_validation && Model#after_validation" do
149
- before do
150
- @c = Class.new(Sequel::Model(:items)) do
151
- columns :id
152
- def after_validation
153
- DB << "BLAH after"
154
- end
155
-
156
- def validate
157
- errors.add(:id, 'not valid') unless id == 2233
158
- end
159
- end
160
- DB.reset
161
- end
162
-
163
- it "should be called around validation" do
164
- @c.send(:define_method, :before_validation){DB << "BLAH before"}
165
- m = @c.load(:id => 2233)
166
- m.must_be :valid?
167
- DB.sqls.must_equal ['BLAH before', 'BLAH after']
168
-
169
- m = @c.load(:id => 22)
170
- m.wont_be :valid?
171
- DB.sqls.must_equal ['BLAH before', 'BLAH after']
172
- end
173
-
174
- it "should be called when calling save" do
175
- @c.send(:define_method, :before_validation){DB << "BLAH before"}
176
- m = @c.load(:id => 2233, :x=>123)
177
- m.save.must_equal m
178
- DB.sqls.must_equal ['BLAH before', 'BLAH after', 'UPDATE items SET x = 123 WHERE (id = 2233)']
179
-
180
- m = @c.load(:id => 22)
181
- m.raise_on_save_failure = false
182
- m.save.must_be_nil
183
- DB.sqls.must_equal ['BLAH before', 'BLAH after']
184
- end
185
-
186
- it "#save should cancel the save and raise an error if before_validation calls cancel_action and raise_on_save_failure is true" do
187
- @c.send(:define_method, :before_validation){cancel_action}
188
- proc{@c.load(:id => 2233).save}.must_raise(Sequel::HookFailed)
189
- DB.sqls.must_equal []
190
- end
191
-
192
- it "#save should cancel the save and return nil if before_validation calls cancel_action and raise_on_save_failure is false" do
193
- @c.send(:define_method, :before_validation){cancel_action}
194
- @c.raise_on_save_failure = false
195
- @c.load(:id => 2233).save.must_be_nil
196
- DB.sqls.must_equal []
197
- end
198
-
199
- it "#valid? should return false if before_validation calls cancel_action" do
200
- @c.send(:define_method, :before_validation){cancel_action}
201
- @c.load(:id => 2233).valid?.must_equal false
202
- end
203
- end
204
-
205
- describe "Model around filters" do
206
- before do
207
- @c = Class.new(Sequel::Model(:items)) do
208
- columns :id, :x
209
- end
210
- DB.reset
211
- end
212
-
213
- it "around_create should be called around new record creation" do
214
- @c.class_eval do
215
- def around_create
216
- DB << 'ac_before'
217
- super
218
- DB << 'ac_after'
219
- end
220
- end
221
- @c.create(:x => 2)
222
- DB.sqls.must_equal ['ac_before', 'INSERT INTO items (x) VALUES (2)', "SELECT * FROM items WHERE id = 10", 'ac_after']
223
- end
224
-
225
- it "around_delete should be called around record destruction" do
226
- @c.class_eval do
227
- def around_destroy
228
- DB << 'ad_before'
229
- super
230
- DB << 'ad_after'
231
- end
232
- end
233
- @c.load(:id=>1, :x => 2).destroy
234
- DB.sqls.must_equal ['ad_before', 'DELETE FROM items WHERE id = 1', 'ad_after']
235
- end
236
-
237
- it "around_update should be called around updating existing records" do
238
- @c.class_eval do
239
- def around_update
240
- DB << 'au_before'
241
- super
242
- DB << 'au_after'
243
- end
244
- end
245
- @c.load(:id=>1, :x => 2).save
246
- DB.sqls.must_equal ['au_before', 'UPDATE items SET x = 2 WHERE (id = 1)', 'au_after']
247
- end
248
-
249
- it "around_save should be called around saving both new and existing records, around either after_create and after_update" do
250
- @c.class_eval do
251
- def around_update
252
- DB << 'au_before'
253
- super
254
- DB << 'au_after'
255
- end
256
- def around_create
257
- DB << 'ac_before'
258
- super
259
- DB << 'ac_after'
260
- end
261
- def around_save
262
- DB << 'as_before'
263
- super
264
- DB << 'as_after'
265
- end
266
- end
267
- @c.create(:x => 2)
268
- DB.sqls.must_equal ['as_before', 'ac_before', 'INSERT INTO items (x) VALUES (2)', "SELECT * FROM items WHERE id = 10", 'ac_after', 'as_after']
269
- @c.load(:id=>1, :x => 2).save
270
- DB.sqls.must_equal ['as_before', 'au_before', 'UPDATE items SET x = 2 WHERE (id = 1)', 'au_after', 'as_after']
271
- end
272
-
273
- it "around_validation should be called around validating records" do
274
- @c.class_eval do
275
- def around_validation
276
- DB << 'av_before'
277
- super
278
- DB << 'av_after'
279
- end
280
- def validate
281
- DB << 'validate'
282
- end
283
- end
284
- @c.new(:x => 2).valid?.must_equal true
285
- DB.sqls.must_equal [ 'av_before', 'validate', 'av_after' ]
286
- end
287
-
288
- it "around_validation should handle cancel_action" do
289
- @c.class_eval do
290
- def around_validation
291
- DB << 'av_before'
292
- cancel_action
293
- super
294
- DB << 'av_after'
295
- end
296
- def validate
297
- DB << 'validate'
298
- end
299
- end
300
- @c.new(:x => 2).valid?.must_equal false
301
- DB.sqls.must_equal [ 'av_before' ]
302
- end
303
-
304
- it "around_validation should be able to catch validation errors and modify them" do
305
- @c.class_eval do
306
- def validate
307
- errors.add(:x, 'foo')
308
- end
309
- end
310
- @c.new(:x => 2).valid?.must_equal false
311
- @c.class_eval do
312
- def around_validation
313
- super
314
- errors.clear
315
- end
316
- end
317
- @c.new(:x => 2).valid?.must_equal true
318
- end
319
-
320
- it "around_create that doesn't call super should raise a HookFailed" do
321
- @c.send(:define_method, :around_create){}
322
- proc{@c.create(:x => 2)}.must_raise(Sequel::HookFailed)
323
- end
324
-
325
- it "around_update that doesn't call super should raise a HookFailed" do
326
- @c.send(:define_method, :around_update){}
327
- proc{@c.load(:x => 2).save}.must_raise(Sequel::HookFailed)
328
- end
329
-
330
- it "around_save that doesn't call super should raise a HookFailed" do
331
- @c.send(:define_method, :around_save){}
332
- proc{@c.create(:x => 2)}.must_raise(Sequel::HookFailed)
333
- proc{@c.load(:x => 2).save}.must_raise(Sequel::HookFailed)
334
- end
335
-
336
- it "around_destroy that doesn't call super should raise a HookFailed" do
337
- @c.send(:define_method, :around_destroy){}
338
- proc{@c.load(:x => 2).destroy}.must_raise(Sequel::HookFailed)
339
- end
340
-
341
- it "around_validation that doesn't call super should raise a HookFailed" do
342
- @c.send(:define_method, :around_validation){}
343
- proc{@c.new.save}.must_raise(Sequel::HookFailed)
344
- end
345
-
346
- it "around_validation that doesn't call super should have valid? return false" do
347
- @c.send(:define_method, :around_validation){}
348
- @c.new.valid?.must_equal false
349
- end
350
-
351
- it "around_* that doesn't call super should return nil if raise_on_save_failure is false" do
352
- @c.raise_on_save_failure = false
353
-
354
- o = @c.load(:id => 1)
355
- def o.around_save() end
356
- o.save.must_be_nil
357
-
358
- o = @c.load(:id => 1)
359
- def o.around_update() end
360
- o.save.must_be_nil
361
-
362
- o = @c.new
363
- def o.around_create() end
364
- o.save.must_be_nil
365
-
366
- o = @c.new
367
- def o.around_validation() end
368
- o.save.must_be_nil
369
- end
370
- end
@@ -1,26 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Inflections do
4
- before do
5
- @plurals, @singulars, @uncountables = Sequel.inflections.plurals.dup, Sequel.inflections.singulars.dup, Sequel.inflections.uncountables.dup
6
- end
7
- after do
8
- Sequel.inflections.plurals.replace(@plurals)
9
- Sequel.inflections.singulars.replace(@singulars)
10
- Sequel.inflections.uncountables.replace(@uncountables)
11
- end
12
-
13
- it "should be possible to clear the list of singulars, plurals, and uncountables" do
14
- Sequel.inflections.clear(:plurals)
15
- Sequel.inflections.plurals.must_equal []
16
- Sequel.inflections.plural('blah', 'blahs')
17
- Sequel.inflections.clear
18
- Sequel.inflections.plurals.must_equal []
19
- Sequel.inflections.singulars.must_equal []
20
- Sequel.inflections.uncountables.must_equal []
21
- end
22
-
23
- it "should be yielded and returned by Sequel.inflections" do
24
- Sequel.inflections{|i| i.must_equal Sequel::Inflections}.must_equal Sequel::Inflections
25
- end
26
- end
@@ -1,953 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Model()" do
4
- before do
5
- @db = Sequel::Model.db
6
- end
7
-
8
- it "should return a model subclass with the given dataset if given a dataset" do
9
- ds = @db[:blah]
10
- c = Sequel::Model(ds)
11
- c.superclass.must_equal Sequel::Model
12
- c.dataset.row_proc.must_equal c
13
- end
14
-
15
- it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
16
- c = Sequel::Model(:blah)
17
- c.superclass.must_equal Sequel::Model
18
- c.db.must_equal @db
19
- c.table_name.must_equal :blah
20
- end
21
-
22
- it "should return a model subclass with a dataset with the default database and given table name if given a LiteralString" do
23
- c = Sequel::Model(Sequel.lit('blah'))
24
- c.superclass.must_equal Sequel::Model
25
- c.db.must_equal @db
26
- c.table_name.must_equal Sequel.lit('blah')
27
- end
28
-
29
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::Identifier" do
30
- c = Sequel::Model(Sequel.identifier(:blah))
31
- c.superclass.must_equal Sequel::Model
32
- c.db.must_equal @db
33
- c.table_name.must_equal Sequel.identifier(:blah)
34
- end
35
-
36
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::QualifiedIdentifier" do
37
- c = Sequel::Model(Sequel.qualify(:boo, :blah))
38
- c.superclass.must_equal Sequel::Model
39
- c.db.must_equal @db
40
- c.table_name.must_equal Sequel.qualify(:boo, :blah)
41
- end
42
-
43
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::AliasedExpression" do
44
- c = Sequel::Model(Sequel.as(:blah, :boo))
45
- c.superclass.must_equal Sequel::Model
46
- c.db.must_equal @db
47
- c.table_name.must_equal :boo
48
- end
49
-
50
- it "should return a model subclass with the given dataset if given a dataset using an SQL::Identifier" do
51
- ds = @db[Sequel.identifier(:blah)]
52
- c = Sequel::Model(ds)
53
- c.superclass.must_equal Sequel::Model
54
- c.dataset.row_proc.must_equal c
55
- end
56
-
57
- it "should be callable on Sequel::Model" do
58
- ds = @db[:blah]
59
- c = Sequel::Model::Model(ds)
60
- c.superclass.must_equal Sequel::Model
61
- c.dataset.row_proc.must_equal c
62
- end
63
-
64
- it "should be callable on subclasses of Sequel::Model" do
65
- ds = @db[:blah]
66
- c = Class.new(Sequel::Model)
67
- sc = c::Model(ds)
68
- sc.superclass.must_equal c
69
- sc.dataset.row_proc.must_equal sc
70
- end
71
-
72
- it "should be callable on other modules if def_Model is used" do
73
- m = Module.new
74
- Sequel::Model.def_Model(m)
75
- ds = @db[:blah]
76
- c = m::Model(ds)
77
- c.superclass.must_equal Sequel::Model
78
- c.dataset.row_proc.must_equal c
79
- end
80
-
81
- it "should be callable using model subclasses on other modules if def_Model is used" do
82
- m = Module.new
83
- c = Class.new(Sequel::Model)
84
- c.def_Model(m)
85
- ds = @db[:blah]
86
- sc = m::Model(ds)
87
- sc.superclass.must_equal c
88
- sc.dataset.row_proc.must_equal sc
89
- end
90
-
91
- it "should return a model subclass associated to the given database if given a database" do
92
- db = Sequel.mock
93
- c = Sequel::Model(db)
94
- c.superclass.must_equal Sequel::Model
95
- c.db.must_equal db
96
- proc{c.dataset}.must_raise(Sequel::Error)
97
- class SmBlahTest < c
98
- end
99
- SmBlahTest.db.must_equal db
100
- SmBlahTest.table_name.must_equal :sm_blah_tests
101
- end
102
-
103
- describe "reloading" do
104
- before do
105
- Sequel::Model.cache_anonymous_models = true
106
- end
107
- after do
108
- Sequel::Model.cache_anonymous_models = false
109
- Object.send(:remove_const, :Album) if defined?(::Album)
110
- end
111
-
112
- it "should work without raising an exception with a symbol" do
113
- class ::Album < Sequel::Model(:table); end
114
- class ::Album < Sequel::Model(:table); end
115
- end
116
-
117
- it "should work without raising an exception with an SQL::Identifier " do
118
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
119
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
120
- end
121
-
122
- it "should work without raising an exception with an SQL::QualifiedIdentifier " do
123
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
124
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
125
- end
126
-
127
- it "should work without raising an exception with an SQL::AliasedExpression" do
128
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
129
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
130
- end
131
-
132
- it "should work without raising an exception with an LiteralString" do
133
- class ::Album < Sequel::Model(Sequel.lit('table')); end
134
- class ::Album < Sequel::Model(Sequel.lit('table')); end
135
- end
136
-
137
- it "should work without raising an exception with a database" do
138
- class ::Album < Sequel::Model(@db); end
139
- class ::Album < Sequel::Model(@db); end
140
- end
141
-
142
- it "should work without raising an exception with a dataset" do
143
- class ::Album < Sequel::Model(@db[:table]); end
144
- class ::Album < Sequel::Model(@db[:table]); end
145
- end
146
-
147
- it "should work without raising an exception with a dataset with an SQL::Identifier" do
148
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
149
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
150
- end
151
-
152
- it "should raise an exception if anonymous model caching is disabled" do
153
- Sequel::Model.cache_anonymous_models = false
154
- proc do
155
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
156
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
157
- end.must_raise TypeError
158
- end
159
-
160
- it "should use separate anonymous cache for subclasses" do
161
- c = Class.new(Sequel::Model)
162
- c.cache_anonymous_models.must_equal true
163
- class ::Album < c::Model(:table); end
164
- class ::Album < c::Model(:table); end
165
-
166
- c1 = c::Model(:t1)
167
- c1.must_equal c::Model(:t1)
168
- c1.wont_equal Sequel::Model(:t1)
169
-
170
- c.cache_anonymous_models = false
171
- Sequel::Model.cache_anonymous_models.must_equal true
172
- c1.wont_equal c::Model(:t1)
173
- end
174
- end
175
- end
176
-
177
- describe "Sequel::Model.freeze" do
178
- it "should freeze the model class and not allow any changes" do
179
- model = Class.new(Sequel::Model(:items))
180
- model.freeze
181
-
182
- model.frozen?.must_equal true
183
- model.dataset.frozen?.must_equal true
184
- model.db_schema.frozen?.must_equal true
185
- model.db_schema[:id].frozen?.must_equal true
186
- model.columns.frozen?.must_equal true
187
- model.setter_methods.frozen?.must_equal true
188
- model.send(:overridable_methods_module).frozen?.must_equal true
189
- model.default_set_fields_options.frozen?.must_equal true
190
-
191
- proc{model.dataset_module{}}.must_raise RuntimeError
192
- end
193
-
194
- it "should work if the model is already frozen" do
195
- model = Class.new(Sequel::Model(:items))
196
- model.freeze.freeze
197
- end
198
-
199
- it "should freeze a model class without a dataset without breaking" do
200
- model = Class.new(Sequel::Model)
201
- model.freeze
202
- model.frozen?.must_equal true
203
- proc{model.dataset}.must_raise Sequel::Error
204
- model.db_schema.must_be_nil
205
- model.columns.must_be_nil
206
- model.setter_methods.must_equal []
207
- model.send(:overridable_methods_module).frozen?.must_equal true
208
- model.default_set_fields_options.frozen?.must_equal true
209
-
210
- proc{model.dataset_module{}}.must_raise RuntimeError
211
- end
212
-
213
- it "should allow subclasses of frozen model classes to work correctly" do
214
- model = Class.new(Sequel::Model(:items))
215
- model.freeze
216
- model = Class.new(model)
217
- model.dataset = :items2
218
-
219
- model.dataset_module{}
220
- model.plugin Module.new
221
-
222
- model.frozen?.must_equal false
223
- model.db_schema.frozen?.must_equal false
224
- model.db_schema[:id].frozen?.must_equal false
225
- model.setter_methods.frozen?.must_equal false
226
- model.dataset_module{}.frozen?.must_equal false
227
- model.send(:overridable_methods_module).frozen?.must_equal false
228
- model.default_set_fields_options.frozen?.must_equal false
229
- end
230
- end
231
-
232
- describe Sequel::Model do
233
- it "should have class method aliased as model" do
234
- model_a = Class.new(Sequel::Model(:items))
235
- model_a.new.model.must_be_same_as model_a
236
- end
237
-
238
- it "should be associated with a dataset" do
239
- model_a = Class.new(Sequel::Model) { set_dataset DB[:as] }
240
-
241
- model_a.dataset.must_be_kind_of(Sequel::Mock::Dataset)
242
- model_a.dataset.opts[:from].must_equal [:as]
243
-
244
- model_b = Class.new(Sequel::Model) { set_dataset DB[:bs] }
245
-
246
- model_b.dataset.must_be_kind_of(Sequel::Mock::Dataset)
247
- model_b.dataset.opts[:from].must_equal [:bs]
248
-
249
- model_a.dataset.opts[:from].must_equal [:as]
250
- end
251
- end
252
-
253
- describe Sequel::Model do
254
- before do
255
- @model = Class.new(Sequel::Model(:items))
256
- DB.reset
257
- end
258
-
259
- it "should not allow dup/clone" do
260
- proc{@model.dup}.must_raise NoMethodError
261
- proc{@model.clone}.must_raise NoMethodError
262
- end
263
-
264
- it "has table_name return name of table" do
265
- @model.table_name.must_equal :items
266
- end
267
-
268
- it "defaults to primary key of id" do
269
- @model.primary_key.must_equal :id
270
- end
271
-
272
- it "allow primary key change" do
273
- @model.set_primary_key :ssn
274
- @model.primary_key.must_equal :ssn
275
- end
276
-
277
- it "allows dataset change" do
278
- @model.set_dataset(DB[:foo])
279
- @model.table_name.must_equal :foo
280
- end
281
-
282
- it "allows frozen dataset" do
283
- @model.set_dataset(DB[:foo].freeze)
284
- @model.table_name.must_equal :foo
285
- @model.dataset.sql.must_equal 'SELECT * FROM foo'
286
- end
287
-
288
-
289
- it "table_name should respect table aliases" do
290
- @model.set_dataset(Sequel[:foo].as(:x))
291
- @model.table_name.must_equal :x
292
- end
293
-
294
- with_symbol_splitting "table_name should respect table alias symbols" do
295
- @model.set_dataset(:foo___x)
296
- @model.table_name.must_equal :x
297
- end
298
-
299
- it "set_dataset should raise an error unless given a Symbol or Dataset" do
300
- proc{@model.set_dataset(Object.new)}.must_raise(Sequel::Error)
301
- end
302
-
303
- it "set_dataset should use a subquery for joined datasets" do
304
- @model.set_dataset(DB.from(:foo, :bar))
305
- @model.dataset.sql.must_equal 'SELECT * FROM (SELECT * FROM foo, bar) AS foo'
306
- @model.set_dataset(DB[:foo].cross_join(:bar))
307
- @model.dataset.sql.must_equal 'SELECT * FROM (SELECT * FROM foo CROSS JOIN bar) AS foo'
308
- end
309
-
310
- it "set_dataset should add the destroy method to the dataset that destroys each object" do
311
- ds = DB[:foo]
312
- ds.wont_respond_to(:destroy)
313
- ds = @model.set_dataset(ds).dataset
314
- ds.must_respond_to(:destroy)
315
- DB.sqls
316
- ds.with_fetch([{:id=>1}, {:id=>2}]).destroy.must_equal 2
317
- DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
318
- end
319
-
320
- it "set_dataset should add the destroy method that respects sharding with transactions" do
321
- db = Sequel.mock(:servers=>{:s1=>{}})
322
- ds = db[:foo].server(:s1)
323
- @model.use_transactions = true
324
- ds = @model.set_dataset(ds).dataset
325
- db.sqls
326
- ds.destroy.must_equal 0
327
- db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
328
- end
329
-
330
- it "should raise an error on set_dataset if there is an error connecting to the database" do
331
- def @model.columns() raise Sequel::DatabaseConnectionError end
332
- proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah).from_self)}.must_raise Sequel::DatabaseConnectionError
333
- end
334
-
335
- it "should not raise an error if there is a problem getting the columns for a dataset" do
336
- def @model.columns() raise Sequel::Error end
337
- @model.set_dataset(DB[:foo].join(:blah).from_self)
338
- end
339
-
340
- it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
341
- db = Sequel.mock
342
- def db.schema(*) raise Sequel::Error; end
343
- @model.set_dataset(db[:foo])
344
- end
345
-
346
- it "reload_db_schema? should be false by default" do
347
- c = Class.new
348
- c.extend Sequel::Model::ClassMethods
349
- c.send(:reload_db_schema?).must_equal false
350
- end
351
-
352
- it "doesn't raise an error on inherited if there is an error setting the dataset" do
353
- db = Sequel.mock
354
- def db.schema(*) raise Sequel::Error; end
355
- @model.dataset = db[:foo]
356
- Class.new(@model)
357
- end
358
-
359
- it "uses a savepoint if inside a transaction when getting the columns" do
360
- db = Sequel.mock
361
- def db.supports_savepoints?; true end
362
- Sequel::Model(db[:table])
363
- db.sqls.must_equal ["SELECT * FROM table LIMIT 1"]
364
- db.transaction{Sequel::Model(db[:table])}
365
- db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1", "SELECT * FROM table LIMIT 1", "RELEASE SAVEPOINT autopoint_1", "COMMIT"]
366
- end
367
-
368
- it "should raise if bad inherited instance variable value is used" do
369
- def @model.inherited_instance_variables() super.merge(:@a=>:foo) end
370
- @model.instance_eval{@a=1}
371
- proc{Class.new(@model)}.must_raise(Sequel::Error)
372
- end
373
-
374
- it "copy inherited instance variables into subclass if set" do
375
- def @model.inherited_instance_variables() super.merge(:@a=>nil, :@b=>:dup, :@c=>:hash_dup, :@d=>proc{|v| v * 2}) end
376
- @model.instance_eval{@a=1; @b=[2]; @c={3=>[4]}; @d=10}
377
- m = Class.new(@model)
378
- @model.instance_eval{@a=5; @b << 6; @c[3] << 7; @c[8] = [9]; @d=40}
379
- m.instance_eval do
380
- @a.must_equal 1
381
- @b.must_equal [2]
382
- @c.must_equal(3=>[4])
383
- @d.must_equal 20
384
- end
385
- end
386
- end
387
-
388
- describe Sequel::Model do
389
- before do
390
- @model = Class.new(Sequel::Model)
391
- DB.reset
392
- end
393
-
394
- it "allows set_dataset to accept a Symbol" do
395
- @model.set_dataset(:foo)
396
- @model.table_name.must_equal :foo
397
- end
398
-
399
- it "allows set_dataset to accept a LiteralString" do
400
- @model.set_dataset(Sequel.lit('foo'))
401
- @model.table_name.must_equal Sequel.lit('foo')
402
- end
403
-
404
- it "allows set_dataset to acceptan SQL::Identifier" do
405
- @model.set_dataset(Sequel.identifier(:foo))
406
- @model.table_name.must_equal Sequel.identifier(:foo)
407
- end
408
-
409
- it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
410
- @model.set_dataset(Sequel.qualify(:bar, :foo))
411
- @model.table_name.must_equal Sequel.qualify(:bar, :foo)
412
- end
413
-
414
- it "allows set_dataset to acceptan SQL::AliasedExpression" do
415
- @model.set_dataset(Sequel.as(:foo, :bar))
416
- @model.table_name.must_equal :bar
417
- end
418
- end
419
-
420
- describe Sequel::Model, ".require_valid_table = true" do
421
- before do
422
- @db = Sequel.mock
423
- @db.columns = proc do |sql|
424
- raise Sequel::Error if sql =~ /foos/
425
- [:id]
426
- end
427
- def @db.supports_schema_parsing?; true end
428
- def @db.schema(t, *) t.first_source == :foos ? (raise Sequel::Error) : [[:id, {}]] end
429
- Sequel::Model.db = @db
430
- Sequel::Model.require_valid_table = true
431
- end
432
- after do
433
- Sequel::Model.require_valid_table = false
434
- Sequel::Model.db = DB
435
- if Object.const_defined?(:Bar)
436
- Object.send(:remove_const, :Bar)
437
- end
438
- if Object.const_defined?(:Foo)
439
- Object.send(:remove_const, :Foo)
440
- end
441
- end
442
-
443
- it "should raise an exception when creating a model with an invalid implicit table" do
444
- proc{class ::Foo < Sequel::Model; end}.must_raise Sequel::Error
445
- end
446
-
447
- it "should not raise an exception when creating a model with a valid implicit table" do
448
- class ::Bar < Sequel::Model; end
449
- Bar.columns.must_equal [:id]
450
- end
451
-
452
- it "should raise an exception when creating a model with an invalid explicit table" do
453
- proc{Sequel::Model(@db[:foos])}.must_raise Sequel::Error
454
- end
455
-
456
- it "should not raise an exception when creating a model with a valid explicit table" do
457
- c = Sequel::Model(@db[:bars])
458
- c.columns.must_equal [:id]
459
- end
460
-
461
- it "should raise an exception when calling set_dataset with an invalid table" do
462
- c = Class.new(Sequel::Model)
463
- proc{c.set_dataset @db[:foos]}.must_raise Sequel::Error
464
- end
465
-
466
- it "should not raise an exception when calling set_dataset with an valid table" do
467
- c = Class.new(Sequel::Model)
468
- c.set_dataset @db[:bars]
469
- c.columns.must_equal [:id]
470
- end
471
-
472
- it "should assume nil value is the same as false" do
473
- c = Class.new(Sequel::Model)
474
- c.require_valid_table = nil
475
- ds = @db.dataset.with_extend{def columns; raise Sequel::Error; end}
476
- c.set_dataset(ds)
477
- end
478
- end
479
-
480
- describe Sequel::Model, "constructors" do
481
- before do
482
- @m = Class.new(Sequel::Model)
483
- @m.columns :a, :b
484
- end
485
-
486
- it "should accept a hash" do
487
- m = @m.new(:a => 1, :b => 2)
488
- m.values.must_equal(:a => 1, :b => 2)
489
- m.must_be :new?
490
- end
491
-
492
- it "should accept a block and yield itself to the block" do
493
- block_called = false
494
- m = @m.new {|i| block_called = true; i.must_be_kind_of(@m); i.values[:a] = 1}
495
-
496
- block_called.must_equal true
497
- m.values[:a].must_equal 1
498
- end
499
-
500
- it "should have dataset row_proc create an existing object" do
501
- @m.dataset = Sequel.mock.dataset
502
- o = @m.dataset.row_proc.call(:a=>1)
503
- o.must_be_kind_of(@m)
504
- o.values.must_equal(:a=>1)
505
- o.new?.must_equal false
506
- end
507
-
508
- it "should have .call create an existing object" do
509
- o = @m.call(:a=>1)
510
- o.must_be_kind_of(@m)
511
- o.values.must_equal(:a=>1)
512
- o.new?.must_equal false
513
- end
514
-
515
- it "should have .load create an existing object" do
516
- o = @m.load(:a=>1)
517
- o.must_be_kind_of(@m)
518
- o.values.must_equal(:a=>1)
519
- o.new?.must_equal false
520
- end
521
- end
522
-
523
- describe Sequel::Model, "new" do
524
- before do
525
- @m = Class.new(Sequel::Model) do
526
- set_dataset DB[:items]
527
- columns :x, :id
528
- end
529
- end
530
-
531
- it "should be marked as new?" do
532
- o = @m.new
533
- o.must_be :new?
534
- end
535
-
536
- it "should not be marked as new? once it is saved" do
537
- o = @m.new(:x => 1)
538
- o.must_be :new?
539
- o.save
540
- o.wont_be :new?
541
- end
542
-
543
- it "should use the last inserted id as primary key if not in values" do
544
- @m.dataset = @m.dataset.with_fetch(:x => 1, :id => 1234).with_autoid(1234)
545
-
546
- o = @m.new(:x => 1)
547
- o.save
548
- o.id.must_equal 1234
549
-
550
- o = @m.load(:x => 1, :id => 333)
551
- o.save
552
- o.id.must_equal 333
553
- end
554
- end
555
-
556
- describe Sequel::Model, ".find" do
557
- before do
558
- @c = Class.new(Sequel::Model(:items))
559
- @c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
560
- DB.reset
561
- end
562
-
563
- it "should return the first record matching the given filter" do
564
- @c.find(:name => 'sharon').must_be_kind_of(@c)
565
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
566
-
567
- @c.find(Sequel.expr(:name).like('abc%')).must_be_kind_of(@c)
568
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name LIKE 'abc%' ESCAPE '\\') LIMIT 1"]
569
- end
570
-
571
- it "should accept filter blocks" do
572
- @c.find{id > 1}.must_be_kind_of(@c)
573
- DB.sqls.must_equal ["SELECT * FROM items WHERE (id > 1) LIMIT 1"]
574
-
575
- @c.find{(x > 1) & (y < 2)}.must_be_kind_of(@c)
576
- DB.sqls.must_equal ["SELECT * FROM items WHERE ((x > 1) AND (y < 2)) LIMIT 1"]
577
- end
578
- end
579
-
580
- describe Sequel::Model, ".fetch" do
581
- before do
582
- DB.reset
583
- @c = Class.new(Sequel::Model(:items))
584
- end
585
-
586
- it "should return instances of Model" do
587
- @c.fetch("SELECT * FROM items").first.must_be_kind_of(@c)
588
- end
589
-
590
- it "should return true for .empty? and not raise an error on empty selection" do
591
- rows = @c.fetch("SELECT * FROM items WHERE FALSE")
592
- @c.send(:define_method, :fetch_rows){|sql| yield({:count => 0})}
593
- rows.empty?
594
- end
595
- end
596
-
597
- describe Sequel::Model, ".find_or_create" do
598
- before do
599
- @db = Sequel.mock
600
- @c = Class.new(Sequel::Model(@db[:items])) do
601
- set_primary_key :id
602
- columns :x
603
- end
604
- @db.sqls
605
- end
606
-
607
- it "should find the record" do
608
- @db.fetch = [{:x=>1, :id=>1}]
609
- @db.autoid = 1
610
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
611
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1"]
612
- end
613
-
614
- it "should create the record if not found" do
615
- @db.fetch = [[], {:x=>1, :id=>1}]
616
- @db.autoid = 1
617
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
618
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
619
- "INSERT INTO items (x) VALUES (1)",
620
- "SELECT * FROM items WHERE id = 1"]
621
- end
622
-
623
- it "should pass the new record to be created to the block if no record is found" do
624
- @db.fetch = [[], {:x=>1, :id=>1}]
625
- @db.autoid = 1
626
- @c.find_or_create(:x => 1){|x| x[:y] = 2}.must_equal @c.load(:x=>1, :id=>1)
627
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
628
- "INSERT INTO items (x, y) VALUES (1, 2)",
629
- "SELECT * FROM items WHERE id = 1"]
630
- end
631
- end
632
-
633
- describe Sequel::Model, ".all" do
634
- it "should return all records in the dataset" do
635
- c = Class.new(Sequel::Model(:items))
636
- c.all.must_equal [c.load(:x=>1, :id=>1)]
637
- end
638
- end
639
-
640
- describe Sequel::Model, "A model class without a primary key" do
641
- before do
642
- @c = Class.new(Sequel::Model(:items)) do
643
- columns :x
644
- no_primary_key
645
- end
646
- DB.reset
647
- end
648
-
649
- it "should be able to insert records without selecting them back" do
650
- i = nil
651
- i = @c.create(:x => 1)
652
- i.class.wont_be_nil
653
- i.values.to_hash.must_equal(:x => 1)
654
-
655
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (1)']
656
- end
657
-
658
- it "should raise when deleting" do
659
- proc{@c.load(:x=>1).delete}.must_raise Sequel::Error
660
- end
661
-
662
- it "should raise when updating" do
663
- proc{@c.load(:x=>1).update(:x=>2)}.must_raise Sequel::Error
664
- end
665
-
666
- it "should insert a record when saving" do
667
- o = @c.new(:x => 2)
668
- o.must_be :new?
669
- o.save
670
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (2)']
671
- end
672
- end
673
-
674
- describe Sequel::Model, "attribute accessors" do
675
- before do
676
- db = Sequel.mock
677
- def db.supports_schema_parsing?() true end
678
- def db.schema(*)
679
- [[:x, {:type=>:integer}], [:z, {:type=>:integer}]]
680
- end
681
- @dataset = db[:items].columns(:x, :z)
682
- @c = Class.new(Sequel::Model)
683
- DB.reset
684
- end
685
-
686
- it "should be created on set_dataset" do
687
- a = [:x, :z, :x= ,:z=]
688
- (a - @c.instance_methods).must_equal a
689
- @c.set_dataset(@dataset)
690
- (a - @c.instance_methods).must_equal []
691
- o = @c.new
692
- (a - o.methods).must_equal []
693
-
694
- o.x.must_be_nil
695
- o.x = 34
696
- o.x.must_equal 34
697
- end
698
-
699
- it "should be only accept one argument for the write accessor" do
700
- @c.set_dataset(@dataset)
701
- o = @c.new
702
-
703
- o.x = 34
704
- o.x.must_equal 34
705
- proc{o.send(:x=)}.must_raise ArgumentError
706
- proc{o.send(:x=, 3, 4)}.must_raise ArgumentError
707
- end
708
-
709
- it "should have a working typecasting setter even if the column is not selected" do
710
- @c.set_dataset(@dataset.select(:z).columns(:z))
711
- o = @c.new
712
-
713
- o.x = '34'
714
- o.x.must_equal 34
715
- end
716
-
717
- it "should typecast if the new value is the same as the existing but has a different class" do
718
- @c.set_dataset(@dataset.select(:z).columns(:z))
719
- o = @c.new
720
-
721
- o.x = 34
722
- o.x = 34.0
723
- o.x.must_equal 34.0
724
- o.x = 34
725
- o.x.must_equal 34
726
- end
727
- end
728
-
729
- describe Sequel::Model, ".[]" do
730
- before do
731
- @c = Class.new(Sequel::Model(:items))
732
- @c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
733
- DB.reset
734
- end
735
-
736
- it "should return the first record for the given pk" do
737
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
738
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
739
- @c[9999].must_equal @c.load(:name => 'sharon', :id => 1)
740
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 9999"]
741
- end
742
-
743
- it "should have #[] return nil if no rows match" do
744
- @c.dataset = @c.dataset.with_fetch([])
745
- @c[1].must_be_nil
746
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
747
- end
748
-
749
- it "should work correctly for custom primary key" do
750
- @c.set_primary_key :name
751
- @c['sharon'].must_equal @c.load(:name => 'sharon', :id => 1)
752
- DB.sqls.must_equal ["SELECT * FROM items WHERE name = 'sharon'"]
753
- end
754
-
755
- it "should handle a dataset that uses a subquery" do
756
- @c.dataset = @c.dataset.cross_join(:a).from_self(:alias=>:b)
757
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
758
- DB.sqls.must_equal ["SELECT * FROM (SELECT * FROM items CROSS JOIN a) AS b WHERE (id = 1) LIMIT 1"]
759
- end
760
-
761
- it "should work correctly for composite primary key specified as array" do
762
- @c.set_primary_key [:node_id, :kind]
763
- @c[3921, 201].must_be_kind_of(@c)
764
- DB.sqls.must_equal ['SELECT * FROM items WHERE ((node_id = 3921) AND (kind = 201)) LIMIT 1']
765
- end
766
- end
767
-
768
- describe "Model#inspect" do
769
- it "should include the class name and the values" do
770
- Sequel::Model.load(:x => 333).inspect.must_equal '#<Sequel::Model @values={:x=>333}>'
771
- end
772
- end
773
-
774
- describe "Model.db_schema" do
775
- before do
776
- @c = Class.new(Sequel::Model(:items)) do
777
- def self.columns; orig_columns; end
778
- end
779
- @db = Sequel.mock
780
- def @db.supports_schema_parsing?() true end
781
- @dataset = @db[:items]
782
- end
783
-
784
- it "should not call database's schema if it isn't supported" do
785
- def @db.supports_schema_parsing?() false end
786
- def @db.schema(table, opts = {})
787
- raise Sequel::Error
788
- end
789
- @dataset = @dataset.with_extend do
790
- def columns
791
- [:x, :y]
792
- end
793
- end
794
-
795
- @c.dataset = @dataset
796
- @c.db_schema.must_equal(:x=>{}, :y=>{})
797
- @c.columns.must_equal [:x, :y]
798
-
799
- @c.instance_eval{@db_schema = nil}
800
- @c.db_schema.must_equal(:x=>{}, :y=>{})
801
- @c.columns.must_equal [:x, :y]
802
- end
803
-
804
- it "should use the database's schema and set the columns and dataset columns" do
805
- def @db.schema(table, opts = {})
806
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
807
- end
808
- @c.dataset = @dataset
809
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
810
- @c.columns.must_equal [:x, :y]
811
- @c.dataset.columns.must_equal [:x, :y]
812
- end
813
-
814
- it "should not restrict the schema for datasets with a :select option" do
815
- def @c.columns; [:x, :z]; end
816
- def @db.schema(table, opts = {})
817
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
818
- end
819
- @c.dataset = @dataset.select(:x, :y___z)
820
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :z=>{}, :y=>{:type=>:string})
821
- end
822
-
823
- it "should not raise error if setting dataset where getting schema and columns raises an error and require_valid_table is false" do
824
- @c.require_valid_table = false
825
- def @db.schema(table, opts={})
826
- raise Sequel::Error
827
- end
828
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
829
- @c.db_schema.must_equal(:x=>{}, :id=>{})
830
- end
831
-
832
- it "should raise error if setting dataset where getting schema and columns raises an error and require_valid_table is true" do
833
- @c.require_valid_table = true
834
- def @db.schema(table, opts={})
835
- raise Sequel::Error
836
- end
837
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
838
- @c.db_schema.must_equal(:x=>{}, :id=>{})
839
- end
840
-
841
- it "should use dataset columns if getting schema raises an error and require_valid_table is false" do
842
- @c.require_valid_table = false
843
- def @db.schema(table, opts={})
844
- raise Sequel::Error
845
- end
846
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
847
- @c.db_schema.must_equal(:x=>{}, :id=>{})
848
- end
849
-
850
- it "should use dataset columns if getting schema raises an error and require_valid_table is true" do
851
- @c.require_valid_table = true
852
- def @db.schema(table, opts={})
853
- raise Sequel::Error
854
- end
855
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
856
- @c.db_schema.must_equal(:x=>{}, :id=>{})
857
- end
858
-
859
- it "should automatically set a singular primary key based on the schema" do
860
- ds = @dataset
861
- d = ds.db
862
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
863
- @c.primary_key.must_equal :id
864
- @c.dataset = ds
865
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
866
- @c.primary_key.must_equal :x
867
- end
868
-
869
- it "should automatically set a singular primary key even if there are specific columns selected" do
870
- ds = @dataset.select(:a, :b, :x)
871
- d = ds.db
872
- def d.schema(table, *opts) [[:a, {:primary_key=>false}], [:b, {:primary_key=>false}], [:x, {:primary_key=>true}]] end
873
- @c.primary_key.must_equal :id
874
- @c.dataset = ds
875
- @c.db_schema.must_equal(:a=>{:primary_key=>false}, :b=>{:primary_key=>false}, :x=>{:primary_key=>true})
876
- @c.primary_key.must_equal :x
877
- end
878
-
879
- it "should automatically set the composite primary key based on the schema" do
880
- ds = @dataset
881
- d = ds.db
882
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
883
- @c.primary_key.must_equal :id
884
- @c.dataset = ds
885
- @c.db_schema.must_equal(:x=>{:primary_key=>true}, :y=>{:primary_key=>true})
886
- @c.primary_key.must_equal [:x, :y]
887
- end
888
-
889
- it "should set an immutable composite primary key based on the schema" do
890
- ds = @dataset
891
- d = ds.db
892
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
893
- @c.dataset = ds
894
- @c.primary_key.must_equal [:x, :y]
895
- proc{@c.primary_key.pop}.must_raise
896
- end
897
-
898
- it "should automatically set no primary key based on the schema" do
899
- ds = @dataset
900
- d = ds.db
901
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {:primary_key=>false}]] end
902
- @c.primary_key.must_equal :id
903
- @c.dataset = ds
904
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
905
- @c.primary_key.must_be_nil
906
- end
907
-
908
- it "should automatically set primary key for dataset selecting table.*" do
909
- ds = @dataset.select_all(:items)
910
- d = ds.db
911
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
912
- @c.primary_key.must_equal :id
913
- @c.dataset = ds
914
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
915
- @c.primary_key.must_equal :x
916
- end
917
-
918
- it "should not modify the primary key unless all column schema hashes have a :primary_key entry" do
919
- ds = @dataset
920
- d = ds.db
921
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {}]] end
922
- @c.primary_key.must_equal :id
923
- @c.dataset = ds
924
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{})
925
- @c.primary_key.must_equal :id
926
- end
927
- end
928
-
929
- describe "Model#use_transactions" do
930
- before do
931
- @c = Class.new(Sequel::Model(:items))
932
- end
933
-
934
- it "should return class value by default" do
935
- @c.use_transactions = true
936
- @c.new.use_transactions.must_equal true
937
- @c.use_transactions = false
938
- @c.new.use_transactions.must_equal false
939
- end
940
-
941
- it "should return set value if manually set" do
942
- instance = @c.new
943
- instance.use_transactions = false
944
- instance.use_transactions.must_equal false
945
- @c.use_transactions = true
946
- instance.use_transactions.must_equal false
947
-
948
- instance.use_transactions = true
949
- instance.use_transactions.must_equal true
950
- @c.use_transactions = false
951
- instance.use_transactions.must_equal true
952
- end
953
- end