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,817 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Model attribute setters" do
4
- before do
5
- @c = Class.new(Sequel::Model(:items)) do
6
- columns :id, :x, :y, :"x y"
7
- end
8
- @o = @c.new
9
- DB.reset
10
- end
11
-
12
- it "refresh should return self" do
13
- @o = @c[1]
14
- def @o._refresh(*) [] end
15
- @o.refresh.must_equal @o
16
- end
17
-
18
- it "should mark the column value as changed" do
19
- @o.changed_columns.must_equal []
20
-
21
- @o.x = 2
22
- @o.changed_columns.must_equal [:x]
23
-
24
- @o.y = 3
25
- @o.changed_columns.must_equal [:x, :y]
26
-
27
- @o.changed_columns.clear
28
-
29
- @o[:x] = 2
30
- @o.changed_columns.must_equal [:x]
31
-
32
- @o[:y] = 3
33
- @o.changed_columns.must_equal [:x, :y]
34
- end
35
-
36
- it "should handle columns that can't be called like normal ruby methods" do
37
- @o.send(:"x y=", 3)
38
- @o.changed_columns.must_equal [:"x y"]
39
- @o.values.must_equal(:"x y"=>3)
40
- @o.send(:"x y").must_equal 3
41
- end
42
- end
43
-
44
- describe "Model.def_column_alias" do
45
- before do
46
- @o = Class.new(Sequel::Model(:items)) do
47
- columns :id
48
- def_column_alias(:id2, :id)
49
- end.load(:id=>1)
50
- DB.reset
51
- end
52
-
53
- it "should create an getter alias for the column" do
54
- @o.id2.must_equal 1
55
- end
56
-
57
- it "should create an setter alias for the column" do
58
- @o.id2 = 2
59
- @o.id2.must_equal 2
60
- @o.values.must_equal(:id => 2)
61
- end
62
- end
63
-
64
- describe Sequel::Model, "dataset" do
65
- before do
66
- @a = Class.new(Sequel::Model(:items))
67
- @b = Class.new(Sequel::Model)
68
- class ::Elephant < Sequel::Model(:ele1); end
69
- class ::Maggot < Sequel::Model; end
70
- class ::ShoeSize < Sequel::Model; end
71
- class ::BootSize < ShoeSize; end
72
- end
73
- after do
74
- [:Elephant, :Maggot, :ShoeSize, :BootSize].each{|x| Object.send(:remove_const, x)}
75
- end
76
-
77
- it "should default to the plural of the class name" do
78
- Maggot.dataset.sql.must_equal 'SELECT * FROM maggots'
79
- ShoeSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
80
- end
81
-
82
- it "should return the dataset for the superclass if available" do
83
- BootSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
84
- end
85
-
86
- it "should return the correct dataset if set explicitly" do
87
- Elephant.dataset.sql.must_equal 'SELECT * FROM ele1'
88
- @a.dataset.sql.must_equal 'SELECT * FROM items'
89
- end
90
-
91
- it "should raise if no dataset is explicitly set and the class is anonymous" do
92
- proc {@b.dataset}.must_raise(Sequel::Error)
93
- end
94
-
95
- it "should not override dataset explicitly set when subclassing" do
96
- sc = Class.new(::Elephant) do
97
- set_dataset :foo
98
- end
99
- sc.table_name.must_equal :foo
100
- end
101
- end
102
-
103
- describe Sequel::Model, "implicit table names" do
104
- after do
105
- Object.send(:remove_const, :BlahBlah)
106
- end
107
- it "should disregard namespaces for the table name" do
108
- module ::BlahBlah
109
- class MwaHaHa < Sequel::Model
110
- end
111
- end
112
- BlahBlah::MwaHaHa.dataset.sql.must_equal 'SELECT * FROM mwa_ha_has'
113
- end
114
-
115
- it "should automatically set datasets when anonymous class of Sequel::Model is used as superclass" do
116
- class BlahBlah < Class.new(Sequel::Model); end
117
- BlahBlah.dataset.sql.must_equal 'SELECT * FROM blah_blahs'
118
- end
119
- end
120
-
121
- describe Sequel::Model, ".dataset_module" do
122
- before do
123
- @c = Class.new(Sequel::Model(:items))
124
- end
125
-
126
- it "should extend the dataset with the module if the model has a dataset" do
127
- @c.dataset_module{def return_3() 3 end}
128
- @c.dataset.return_3.must_equal 3
129
- end
130
-
131
- it "should also extend the instance_dataset with the module if the model has a dataset" do
132
- @c.dataset_module{def return_3() 3 end}
133
- @c.instance_dataset.return_3.must_equal 3
134
- end
135
-
136
- it "should add methods defined in the module to the class" do
137
- @c.dataset_module{def return_3() 3 end}
138
- @c.return_3.must_equal 3
139
- end
140
-
141
- it "should add methods defined in the module outside the block to the class" do
142
- @c.dataset_module.module_eval{def return_3() 3 end}
143
- @c.return_3.must_equal 3
144
- end
145
-
146
- it "should add methods that can't be called with normal method syntax as class methods" do
147
- @c.dataset_module.module_eval{define_method(:'return 3'){3}}
148
- @c.send(:'return 3').must_equal 3
149
- end
150
-
151
- it "should not add private or protected methods defined in the module to the class" do
152
- @c.dataset_module{private; def return_3() 3 end}
153
- @c.dataset_module{protected; def return_4() 4 end}
154
- @c.respond_to?(:return_3).must_equal false
155
- @c.respond_to?(:return_4).must_equal false
156
- end
157
-
158
- it "should cache calls and readd methods if set_dataset is used" do
159
- @c.dataset_module{def return_3() 3 end}
160
- @c.set_dataset :items
161
- @c.return_3.must_equal 3
162
- @c.dataset.return_3.must_equal 3
163
- end
164
-
165
- it "should readd methods to subclasses, if set_dataset is used in a subclass" do
166
- @c.dataset_module{def return_3() 3 end}
167
- c = Class.new(@c)
168
- c.set_dataset :items
169
- c.return_3.must_equal 3
170
- c.dataset.return_3.must_equal 3
171
- end
172
-
173
- it "should only have a single dataset_module per class" do
174
- @c.dataset_module{def return_3() 3 end}
175
- @c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
176
- @c.return_3.must_equal 4
177
- end
178
-
179
- it "should not have subclasses share the dataset_module" do
180
- @c.dataset_module{def return_3() 3 end}
181
- c = Class.new(@c)
182
- c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
183
- c.return_3.must_equal 6
184
- end
185
-
186
- it "should accept a module object and extend the dataset with it" do
187
- @c.dataset_module Module.new{def return_3() 3 end}
188
- @c.dataset.return_3.must_equal 3
189
- end
190
-
191
- it "should be able to call dataset_module with a module multiple times" do
192
- @c.dataset_module Module.new{def return_3() 3 end}
193
- @c.dataset_module Module.new{def return_4() 4 end}
194
- @c.dataset.return_3.must_equal 3
195
- @c.dataset.return_4.must_equal 4
196
- end
197
-
198
- it "should be able mix dataset_module calls with and without arguments" do
199
- @c.dataset_module{def return_3() 3 end}
200
- @c.dataset_module Module.new{def return_4() 4 end}
201
- @c.dataset.return_3.must_equal 3
202
- @c.dataset.return_4.must_equal 4
203
- end
204
-
205
- it "should have modules provided to dataset_module extend subclass datasets" do
206
- @c.dataset_module{def return_3() 3 end}
207
- @c.dataset_module Module.new{def return_4() 4 end}
208
- c = Class.new(@c)
209
- c.set_dataset :a
210
- c.dataset.return_3.must_equal 3
211
- c.dataset.return_4.must_equal 4
212
- end
213
-
214
- it "should return the dataset module if given a block" do
215
- Object.new.extend(@c.dataset_module{def return_3() 3 end}).return_3.must_equal 3
216
- end
217
-
218
- it "should return the argument if given one" do
219
- Object.new.extend(@c.dataset_module Module.new{def return_3() 3 end}).return_3.must_equal 3
220
- end
221
-
222
- it "should have dataset_module support a subset method" do
223
- @c.dataset_module{subset :released, :released}
224
- @c.released.sql.must_equal 'SELECT * FROM items WHERE released'
225
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
226
- end
227
-
228
- it "should have dataset_module support a where method" do
229
- @c.dataset_module{where :released, :released}
230
- @c.released.sql.must_equal 'SELECT * FROM items WHERE released'
231
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
232
- end
233
-
234
- if Sequel::Model.dataset_module_class == Sequel::Model::DatasetModule
235
- it "should have dataset_module not support an eager method" do
236
- proc{@c.dataset_module{eager :foo}}.must_raise NoMethodError
237
- end
238
- end
239
-
240
- it "should have dataset_module support a having method" do
241
- @c.dataset_module{having(:released){released}}
242
- @c.released.sql.must_equal 'SELECT * FROM items HAVING released'
243
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING released'
244
- end
245
-
246
- it "should have dataset_module support an exclude method" do
247
- @c.dataset_module{exclude :released, :released}
248
- @c.released.sql.must_equal 'SELECT * FROM items WHERE NOT released'
249
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND NOT released)'
250
- end
251
-
252
- it "should have dataset_module support an exclude_having method" do
253
- @c.dataset_module{exclude_having :released, :released}
254
- @c.released.sql.must_equal 'SELECT * FROM items HAVING NOT released'
255
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING NOT released'
256
- end
257
-
258
- it "should have dataset_module support a distinct method" do
259
- @c.dataset = @c.dataset.with_extend{def supports_distinct_on?; true end}
260
- @c.dataset_module{distinct :foo, :baz}
261
- @c.foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items'
262
- @c.where(:bar).foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items WHERE bar'
263
- end
264
-
265
- it "should have dataset_module support a grep method" do
266
- @c.dataset_module{grep :foo, :baz, 'quux%'}
267
- @c.foo.sql.must_equal 'SELECT * FROM items WHERE ((baz LIKE \'quux%\' ESCAPE \'\\\'))'
268
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE (bar AND ((baz LIKE \'quux%\' ESCAPE \'\\\')))'
269
- end
270
-
271
- it "should have dataset_module support a group method" do
272
- @c.dataset_module{group :foo, :baz}
273
- @c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
274
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar GROUP BY baz'
275
- end
276
-
277
- it "should have dataset_module support a group_and_count method" do
278
- @c.dataset_module{group_and_count :foo, :baz}
279
- @c.foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items GROUP BY baz'
280
- @c.where(:bar).foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items WHERE bar GROUP BY baz'
281
- end
282
-
283
- it "should have dataset_module support a group_append method" do
284
- @c.dataset_module{group_append :foo, :baz}
285
- @c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
286
- @c.group(:bar).foo.sql.must_equal 'SELECT * FROM items GROUP BY bar, baz'
287
- end
288
-
289
- it "should have dataset_module support a limit method" do
290
- @c.dataset_module{limit :foo, 1}
291
- @c.foo.sql.must_equal 'SELECT * FROM items LIMIT 1'
292
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar LIMIT 1'
293
- end
294
-
295
- it "should have dataset_module support a offset method" do
296
- @c.dataset_module{offset :foo, 1}
297
- @c.foo.sql.must_equal 'SELECT * FROM items OFFSET 1'
298
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar OFFSET 1'
299
- end
300
-
301
- it "should have dataset_module support a order method" do
302
- @c.dataset_module{order(:foo){:baz}}
303
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
304
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz'
305
- end
306
-
307
- it "should have dataset_module support a order_append method" do
308
- @c.dataset_module{order_append :foo, :baz}
309
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
310
- @c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY bar, baz'
311
- end
312
-
313
- it "should have dataset_module support a order_prepend method" do
314
- @c.dataset_module{order_prepend :foo, :baz}
315
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
316
- @c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY baz, bar'
317
- end
318
-
319
- it "should have dataset_module support a reverse method" do
320
- @c.dataset_module{reverse(:foo){:baz}}
321
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz DESC'
322
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz DESC'
323
- end
324
-
325
- it "should have dataset_module support a select method" do
326
- @c.dataset_module{select :foo, :baz}
327
- @c.foo.sql.must_equal 'SELECT baz FROM items'
328
- @c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar'
329
- end
330
-
331
- it "should have dataset_module support a select_all method" do
332
- @c.dataset_module{select_all :foo, :baz}
333
- @c.foo.sql.must_equal 'SELECT baz.* FROM items'
334
- @c.where(:bar).foo.sql.must_equal 'SELECT baz.* FROM items WHERE bar'
335
- end
336
-
337
- it "should have dataset_module support a select_append method" do
338
- @c.dataset_module{select_append :foo, :baz}
339
- @c.foo.sql.must_equal 'SELECT *, baz FROM items'
340
- @c.where(:bar).foo.sql.must_equal 'SELECT *, baz FROM items WHERE bar'
341
- end
342
-
343
- it "should have dataset_module support a select_group method" do
344
- @c.dataset_module{select_group :foo, :baz}
345
- @c.foo.sql.must_equal 'SELECT baz FROM items GROUP BY baz'
346
- @c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar GROUP BY baz'
347
- end
348
-
349
- it "should have dataset_module support a server method" do
350
- @c.dataset_module{server :foo, :baz}
351
- @c.foo.opts[:server].must_equal :baz
352
- @c.where(:bar).foo.opts[:server].must_equal :baz
353
- end
354
-
355
- it "should raise error if called with both an argument and a block" do
356
- proc{@c.dataset_module(Module.new{def return_3() 3 end}){}}.must_raise(Sequel::Error)
357
- end
358
- end
359
-
360
- describe "A model class with implicit table name" do
361
- before do
362
- class ::Donkey < Sequel::Model
363
- end
364
- end
365
- after do
366
- Object.send(:remove_const, :Donkey)
367
- end
368
-
369
- it "should have a dataset associated with the model class" do
370
- Donkey.dataset.model.must_equal Donkey
371
- end
372
- end
373
-
374
- describe "A model inheriting from a model" do
375
- before do
376
- class ::Feline < Sequel::Model; end
377
- class ::Leopard < Feline; end
378
- end
379
- after do
380
- Object.send(:remove_const, :Leopard)
381
- Object.send(:remove_const, :Feline)
382
- end
383
-
384
- it "should have a dataset associated with itself" do
385
- Feline.dataset.model.must_equal Feline
386
- Leopard.dataset.model.must_equal Leopard
387
- end
388
- end
389
-
390
- describe "A model inheriting from a custom base that sets @dataset" do
391
- before do
392
- ::Feline = Class.new(Sequel::Model)
393
- def Feline.inherited(subclass)
394
- subclass.instance_variable_set(:@dataset, nil)
395
- superclass.inherited(subclass)
396
- end
397
- class ::Leopard < Feline; end
398
- end
399
- after do
400
- Object.send(:remove_const, :Leopard)
401
- Object.send(:remove_const, :Feline)
402
- end
403
-
404
- it "should not infer the dataset of the subclass" do
405
- proc{Leopard.dataset}.must_raise(Sequel::Error)
406
- end
407
- end
408
-
409
- describe "Model.primary_key" do
410
- before do
411
- @c = Class.new(Sequel::Model)
412
- end
413
-
414
- it "should default to id" do
415
- @c.primary_key.must_equal :id
416
- end
417
-
418
- it "should be overridden by set_primary_key" do
419
- @c.set_primary_key :cid
420
- @c.primary_key.must_equal :cid
421
-
422
- @c.set_primary_key([:id1, :id2])
423
- @c.primary_key.must_equal [:id1, :id2]
424
- end
425
-
426
- it "should use nil for no primary key" do
427
- @c.no_primary_key
428
- @c.primary_key.must_be_nil
429
- end
430
- end
431
-
432
- describe "Model.primary_key_hash" do
433
- before do
434
- @c = Class.new(Sequel::Model)
435
- end
436
-
437
- it "should handle a single primary key" do
438
- @c.primary_key_hash(1).must_equal(:id=>1)
439
- end
440
-
441
- it "should handle a composite primary key" do
442
- @c.set_primary_key([:id1, :id2])
443
- @c.primary_key_hash([1, 2]).must_equal(:id1=>1, :id2=>2)
444
- end
445
-
446
- it "should raise an error for no primary key" do
447
- @c.no_primary_key
448
- proc{@c.primary_key_hash(1)}.must_raise(Sequel::Error)
449
- end
450
- end
451
-
452
- describe "Model.qualified_primary_key_hash" do
453
- before do
454
- @c = Class.new(Sequel::Model(:items))
455
- end
456
-
457
- it "should handle a single primary key" do
458
- @c.qualified_primary_key_hash(1).must_equal(Sequel.qualify(:items, :id)=>1)
459
- end
460
-
461
- it "should handle a composite primary key" do
462
- @c.set_primary_key([:id1, :id2])
463
- @c.qualified_primary_key_hash([1, 2]).must_equal(Sequel.qualify(:items, :id1)=>1, Sequel.qualify(:items, :id2)=>2)
464
- end
465
-
466
- it "should raise an error for no primary key" do
467
- @c.no_primary_key
468
- proc{@c.qualified_primary_key_hash(1)}.must_raise(Sequel::Error)
469
- end
470
-
471
- it "should allow specifying a different qualifier" do
472
- @c.qualified_primary_key_hash(1, :apple).must_equal(Sequel.qualify(:apple, :id)=>1)
473
- @c.set_primary_key([:id1, :id2])
474
- @c.qualified_primary_key_hash([1, 2], :bear).must_equal(Sequel.qualify(:bear, :id1)=>1, Sequel.qualify(:bear, :id2)=>2)
475
- end
476
- end
477
-
478
- describe "Model.db" do
479
- before do
480
- @db = Sequel.mock
481
- @databases = Sequel::DATABASES.dup
482
- @model_db = Sequel::Model.db
483
- Sequel::Model.db = nil
484
- Sequel::DATABASES.clear
485
- end
486
- after do
487
- Sequel::Model.instance_variable_get(:@db).must_be_nil
488
- Sequel::DATABASES.replace(@databases)
489
- Sequel::Model.db = @model_db
490
- end
491
-
492
- it "should be required when creating named model classes" do
493
- begin
494
- proc{class ModelTest < Sequel::Model; end}.must_raise(Sequel::Error)
495
- ensure
496
- Object.send(:remove_const, :ModelTest)
497
- end
498
- end
499
-
500
- it "should be required when creating anonymous model classes without a database" do
501
- proc{Sequel::Model(:foo)}.must_raise(Sequel::Error)
502
- end
503
-
504
- it "should not be required when creating anonymous model classes with a database" do
505
- Sequel::Model(@db).db.must_equal @db
506
- Sequel::Model(@db[:foo]).db.must_equal @db
507
- end
508
-
509
- it "should work correctly when subclassing anonymous model classes with a database" do
510
- begin
511
- Class.new(Sequel::Model(@db)).db.must_equal @db
512
- Class.new(Sequel::Model(@db[:foo])).db.must_equal @db
513
- class ModelTest < Sequel::Model(@db)
514
- db.must_equal @db
515
- end
516
- class ModelTest2 < Sequel::Model(@db[:foo])
517
- db.must_equal @db
518
- end
519
- ModelTest.instance_variable_set(:@db, nil)
520
- ModelTest.db.must_equal @db
521
- ensure
522
- Object.send(:remove_const, :ModelTest)
523
- Object.send(:remove_const, :ModelTest2)
524
- end
525
- end
526
- end
527
-
528
- describe "Model.db=" do
529
- before do
530
- @db1 = Sequel.mock
531
- @db2 = Sequel.mock
532
- @m = Class.new(Sequel::Model(@db1))
533
- end
534
-
535
- it "should change database for model" do
536
- @m.db = @db2
537
- @m.db.must_equal @db2
538
- end
539
-
540
- it "should raise Error for model with existing dataset" do
541
- @m.dataset = :table
542
- proc{@m.db = @db2}.must_raise Sequel::Error
543
- end
544
-
545
- it "should use the database for subclasses" do
546
- Class.new(@m).db.must_equal @db1
547
- end
548
- end
549
-
550
- describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
551
- before do
552
- @c = Class.new(Sequel::Model(:blahblah)) do
553
- set_primary_key :id
554
- columns :x, :y, :z, :id
555
- end
556
- @c.strict_param_setting = false
557
- end
558
-
559
- it "should restrict updates to primary key by default" do
560
- i = @c.new(:x => 1, :y => 2, :id => 3)
561
- i.values.must_equal(:x => 1, :y => 2)
562
- i.set(:x => 4, :y => 5, :id => 6)
563
- i.values.must_equal(:x => 4, :y => 5)
564
- end
565
-
566
- it "should allow updates to primary key if unrestrict_primary_key is used" do
567
- @c.unrestrict_primary_key
568
- i = @c.new(:x => 1, :y => 2, :id => 3)
569
- i.values.must_equal(:x => 1, :y => 2, :id=>3)
570
- i.set(:x => 4, :y => 5, :id => 6)
571
- i.values.must_equal(:x => 4, :y => 5, :id=>6)
572
- end
573
-
574
- it "should have restrict_primary_key? return true or false depending" do
575
- @c.restrict_primary_key?.must_equal true
576
- @c.unrestrict_primary_key
577
- @c.restrict_primary_key?.must_equal false
578
- c1 = Class.new(@c)
579
- c1.restrict_primary_key?.must_equal false
580
- @c.restrict_primary_key
581
- @c.restrict_primary_key?.must_equal true
582
- c1.restrict_primary_key?.must_equal false
583
- c2 = Class.new(@c)
584
- c2.restrict_primary_key?.must_equal true
585
- end
586
- end
587
-
588
- describe Sequel::Model, ".strict_param_setting" do
589
- before do
590
- @c = Class.new(Sequel::Model(:blahblah)) do
591
- columns :x, :y, :z, :id
592
- end
593
- end
594
-
595
- it "should be enabled by default" do
596
- @c.strict_param_setting.must_equal true
597
- end
598
-
599
- it "should raise an error if a missing/restricted column/method is accessed" do
600
- proc{@c.new(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
601
- proc{@c.create(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
602
- c = @c.new
603
- proc{c.set(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
604
- proc{c.update(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
605
- end
606
-
607
- it "should be disabled by strict_param_setting = false" do
608
- @c.strict_param_setting = false
609
- @c.strict_param_setting.must_equal false
610
- @c.new(:a=>1)
611
- end
612
- end
613
-
614
- describe Sequel::Model, ".require_modification" do
615
- before do
616
- @ds1 = DB[:items].with_extend{def provides_accurate_rows_matched?; false end}
617
- @ds2 = DB[:items].with_extend{def provides_accurate_rows_matched?; true end}
618
- end
619
- after do
620
- Sequel::Model.require_modification = nil
621
- end
622
-
623
- it "should depend on whether the dataset provides an accurate number of rows matched by default" do
624
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
625
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
626
- end
627
-
628
- it "should obey global setting regardless of dataset support if set" do
629
- Sequel::Model.require_modification = true
630
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal true
631
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
632
-
633
- Sequel::Model.require_modification = false
634
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
635
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
636
- end
637
- end
638
-
639
- describe Sequel::Model, ".[] optimization" do
640
- before do
641
- @db = Sequel.mock
642
- def @db.schema(*) [[:id, {:primary_key=>true}]] end
643
- def @db.supports_schema_parsing?() true end
644
- @c = Class.new(Sequel::Model(@db))
645
- @ds = @db.dataset.with_quote_identifiers(true)
646
- end
647
-
648
- it "should set simple_pk to the literalized primary key column name if a single primary key" do
649
- @c.set_primary_key :id
650
- @c.simple_pk.must_equal 'id'
651
- @c.set_primary_key :b
652
- @c.simple_pk.must_equal 'b'
653
- @c.set_primary_key Sequel.identifier(:b__a)
654
- @c.simple_pk.must_equal 'b__a'
655
- end
656
-
657
- it "should have simple_pk be blank if compound or no primary key" do
658
- @c.no_primary_key
659
- @c.simple_pk.must_be_nil
660
- @c.set_primary_key [:b, :a]
661
- @c.simple_pk.must_be_nil
662
- end
663
-
664
- it "should have simple table set if passed a Symbol to set_dataset" do
665
- @c.set_dataset :a
666
- @c.simple_table.must_equal 'a'
667
- @c.set_dataset :b
668
- @c.simple_table.must_equal 'b'
669
- end
670
-
671
- it "should have simple_table set if passed a simple select all dataset to set_dataset" do
672
- @c.set_dataset @ds.from(:a)
673
- @c.simple_table.must_equal '"a"'
674
- @c.set_dataset @ds.from(:b)
675
- @c.simple_table.must_equal '"b"'
676
- @c.set_dataset @ds.from(Sequel[:b][:a])
677
- @c.simple_table.must_equal '"b"."a"'
678
- end
679
-
680
- with_symbol_splitting "should have simple_table set using qualified symbol" do
681
- @c.set_dataset :b__a
682
- @c.simple_table.must_equal 'b.a'
683
- @c.set_dataset @ds.from(:b__a)
684
- @c.simple_table.must_equal '"b"."a"'
685
- end
686
-
687
- it "should have simple_table = nil if passed a non-simple select all dataset to set_dataset" do
688
- @c.set_dataset @c.db[:a].filter(:active)
689
- @c.simple_table.must_be_nil
690
- end
691
-
692
- it "should have simple_table inherit superclass's setting" do
693
- Class.new(@c).simple_table.must_be_nil
694
- @c.set_dataset :a
695
- Class.new(@c).simple_table.must_equal 'a'
696
- end
697
-
698
- it "should use Dataset#with_sql if simple_table and simple_pk are true" do
699
- @c.set_dataset @db[:a].with_fetch(:id=>1)
700
- @c[1].must_equal @c.load(:id=>1)
701
- @db.sqls.must_equal ['SELECT * FROM a WHERE id = 1']
702
- end
703
-
704
- it "should not use Dataset#with_sql if either simple_table or simple_pk is nil" do
705
- @c.set_dataset @db[:a].where(:active).with_fetch(:id=>1)
706
- @c[1].must_equal @c.load(:id=>1)
707
- @db.sqls.must_equal ['SELECT * FROM a WHERE (active AND (id = 1)) LIMIT 1']
708
- end
709
- end
710
-
711
- describe "Model datasets #with_pk with #with_pk!" do
712
- before do
713
- @c = Class.new(Sequel::Model(:a))
714
- @ds = @c.dataset = @c.dataset.with_fetch(:id=>1)
715
- DB.reset
716
- end
717
-
718
- it "should be callable on the model class with optimized SQL" do
719
- @c.with_pk(1).must_equal @c.load(:id=>1)
720
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
721
- @c.with_pk!(1).must_equal @c.load(:id=>1)
722
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
723
- end
724
-
725
- it "should return the first record where the primary key matches" do
726
- @ds.with_pk(1).must_equal @c.load(:id=>1)
727
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
728
- @ds.with_pk!(1).must_equal @c.load(:id=>1)
729
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
730
- end
731
-
732
- it "should work when called repeatedly on a frozen dataset" do
733
- @ds.freeze
734
- 5.times do
735
- @ds.with_pk(1).must_equal @c.load(:id=>1)
736
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
737
- end
738
- end
739
-
740
- it "should handle existing filters" do
741
- @ds.filter(:a=>2).with_pk(1)
742
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
743
- @ds.filter(:a=>2).with_pk!(1)
744
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
745
- end
746
-
747
- it "should work with string values" do
748
- @ds.with_pk("foo")
749
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
750
- @ds.with_pk!("foo")
751
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
752
- end
753
-
754
- it "should handle an array for composite primary keys" do
755
- @c.set_primary_key [:id1, :id2]
756
- @ds.with_pk([1, 2])
757
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
758
-
759
- @ds.with_pk!([1, 2])
760
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
761
- end
762
-
763
- it "should work with composite primary keys when called repeatedly on a frozen dataset with" do
764
- @c.set_primary_key [:id1, :id2]
765
- @ds.freeze
766
- 5.times do
767
- @ds.with_pk([1,2])
768
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
769
- end
770
- end
771
-
772
- it "should have with_pk return nil and with_pk! raise if no rows match" do
773
- @ds = @ds.with_fetch([])
774
- @ds.with_pk(1).must_be_nil
775
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
776
- proc{@ds.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
777
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
778
- end
779
-
780
- it "should have with_pk return nil and with_pk! raise if no rows match when calling the class method" do
781
- @c.dataset = @c.dataset.with_fetch([])
782
- @c.with_pk(1).must_be_nil
783
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
784
- proc{@c.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
785
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
786
- end
787
-
788
- it "should have #[] consider an integer as a primary key lookup" do
789
- @ds[1].must_equal @c.load(:id=>1)
790
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
791
- end
792
-
793
- it "should not have #[] consider a literal string as a primary key lookup" do
794
- @ds[Sequel.lit('foo')].must_equal @c.load(:id=>1)
795
- DB.sqls.must_equal ["SELECT * FROM a WHERE (foo) LIMIT 1"]
796
- end
797
-
798
- it "should raise Error if called on a dataset with no primary key" do
799
- @c.no_primary_key
800
- @ds.freeze
801
- 5.times do
802
- proc{@ds.with_pk(1)}.must_raise Sequel::Error
803
- end
804
- end
805
- end
806
-
807
- describe "Model::include" do
808
- it "shouldn't change the signature of Module::include" do
809
- mod1 = Module.new
810
- mod2 = Module.new
811
- including_class = Class.new(Sequel::Model(:items)) do
812
- include(mod1, mod2)
813
- end
814
- including_class.included_modules.must_include(mod1)
815
- including_class.included_modules.must_include(mod2)
816
- end
817
- end