sequel 5.8.0 → 5.38.0

Sign up to get free protection for your applications and to get access to all the features.
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