sequel 5.20.0 → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -1,875 +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 attribute getters/setters" do
45
- before do
46
- a = @a = []
47
- @c = Class.new(Sequel::Model(:items)) do
48
- columns :id, :x, :"x y", :require_modification
49
-
50
- [:x, :"x y"].each do |c|
51
- define_method(c) do
52
- a << c
53
- super()
54
- end
55
- define_method(:"#{c}=") do |v|
56
- a << :"#{c}=" << v
57
- super(v)
58
- end
59
- end
60
- end
61
- DB.reset
62
- end
63
-
64
- it "should not override existing methods" do
65
- @o = @c.new
66
- @o.values.merge!(:x=>4, :"x y"=>5, :require_modification=>6)
67
- @o.x.must_equal 4
68
- @o.x = 1
69
- @o.send(:"x y").must_equal 5
70
- @o.send(:"x y=", 2)
71
- @o.require_modification.must_equal true
72
- @o.require_modification = 3
73
- @o.values.must_equal(:x=>1, :"x y"=>2, :require_modification=>6)
74
- @a.must_equal [:x, :x=, 1, :"x y", :"x y=", 2]
75
- end
76
-
77
- it "should not override existing methods in subclasses" do
78
- @c = Class.new(@c)
79
- @c.columns(:id, :x, :y, :"x y", :require_modification)
80
- @o = @c.new
81
- @o.values.merge!(:x=>4, :"x y"=>5, :require_modification=>6)
82
- @o.x.must_equal 4
83
- @o.x = 1
84
- @o.send(:"x y").must_equal 5
85
- @o.send(:"x y=", 2)
86
- @o.require_modification.must_equal true
87
- @o.require_modification = 3
88
- @o.values.must_equal(:x=>1, :"x y"=>2, :require_modification=>6)
89
- @a.must_equal [:x, :x=, 1, :"x y", :"x y=", 2]
90
- end
91
- end
92
-
93
- describe "Model.def_column_alias" do
94
- before do
95
- @o = Class.new(Sequel::Model(:items)) do
96
- columns :id
97
- def_column_alias(:id2, :id)
98
- end.load(:id=>1)
99
- DB.reset
100
- end
101
-
102
- it "should create an getter alias for the column" do
103
- @o.id2.must_equal 1
104
- end
105
-
106
- it "should create an setter alias for the column" do
107
- @o.id2 = 2
108
- @o.id2.must_equal 2
109
- @o.values.must_equal(:id => 2)
110
- end
111
- end
112
-
113
- describe Sequel::Model, "dataset" do
114
- before do
115
- @a = Class.new(Sequel::Model(:items))
116
- @b = Class.new(Sequel::Model)
117
- class ::Elephant < Sequel::Model(:ele1); end
118
- class ::Maggot < Sequel::Model; end
119
- class ::ShoeSize < Sequel::Model; end
120
- class ::BootSize < ShoeSize; end
121
- end
122
- after do
123
- [:Elephant, :Maggot, :ShoeSize, :BootSize].each{|x| Object.send(:remove_const, x)}
124
- end
125
-
126
- it "should default to the plural of the class name" do
127
- Maggot.dataset.sql.must_equal 'SELECT * FROM maggots'
128
- ShoeSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
129
- end
130
-
131
- it "should return the dataset for the superclass if available" do
132
- BootSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
133
- end
134
-
135
- it "should return the correct dataset if set explicitly" do
136
- Elephant.dataset.sql.must_equal 'SELECT * FROM ele1'
137
- @a.dataset.sql.must_equal 'SELECT * FROM items'
138
- end
139
-
140
- it "should raise if no dataset is explicitly set and the class is anonymous" do
141
- proc {@b.dataset}.must_raise(Sequel::Error)
142
- end
143
-
144
- it "should not override dataset explicitly set when subclassing" do
145
- sc = Class.new(::Elephant) do
146
- set_dataset :foo
147
- end
148
- sc.table_name.must_equal :foo
149
- end
150
- end
151
-
152
- describe Sequel::Model, "has_dataset?" do
153
- it "should return whether the model has a dataset" do
154
- c = Class.new(Sequel::Model)
155
- c.has_dataset?.must_equal false
156
- c.dataset = c.db[:table]
157
- c.has_dataset?.must_equal true
158
- end
159
- end
160
-
161
- describe Sequel::Model, "implicit table names" do
162
- after do
163
- Object.send(:remove_const, :BlahBlah)
164
- end
165
- it "should disregard namespaces for the table name" do
166
- module ::BlahBlah
167
- class MwaHaHa < Sequel::Model
168
- end
169
- end
170
- BlahBlah::MwaHaHa.dataset.sql.must_equal 'SELECT * FROM mwa_ha_has'
171
- end
172
-
173
- it "should automatically set datasets when anonymous class of Sequel::Model is used as superclass" do
174
- class BlahBlah < Class.new(Sequel::Model); end
175
- BlahBlah.dataset.sql.must_equal 'SELECT * FROM blah_blahs'
176
- end
177
- end
178
-
179
- describe Sequel::Model, ".dataset_module" do
180
- before do
181
- @c = Class.new(Sequel::Model(:items))
182
- end
183
-
184
- it "should extend the dataset with the module if the model has a dataset" do
185
- @c.dataset_module{def return_3() 3 end}
186
- @c.dataset.return_3.must_equal 3
187
- end
188
-
189
- it "should also extend the instance_dataset with the module if the model has a dataset" do
190
- @c.dataset_module{def return_3() 3 end}
191
- @c.instance_dataset.return_3.must_equal 3
192
- end
193
-
194
- it "should add methods defined in the module to the class" do
195
- @c.dataset_module{def return_3() 3 end}
196
- @c.return_3.must_equal 3
197
- end
198
-
199
- it "should add methods defined in the module outside the block to the class" do
200
- @c.dataset_module.module_eval{def return_3() 3 end}
201
- @c.return_3.must_equal 3
202
- end
203
-
204
- it "should add methods that can't be called with normal method syntax as class methods" do
205
- @c.dataset_module.module_eval{define_method(:'return 3'){3}}
206
- @c.send(:'return 3').must_equal 3
207
- end
208
-
209
- it "should not add private or protected methods defined in the module to the class" do
210
- @c.dataset_module{private; def return_3() 3 end}
211
- @c.dataset_module{protected; def return_4() 4 end}
212
- @c.respond_to?(:return_3).must_equal false
213
- @c.respond_to?(:return_4).must_equal false
214
- end
215
-
216
- it "should cache calls and readd methods if set_dataset is used" do
217
- @c.dataset_module{def return_3() 3 end}
218
- @c.set_dataset :items
219
- @c.return_3.must_equal 3
220
- @c.dataset.return_3.must_equal 3
221
- end
222
-
223
- it "should readd methods to subclasses, if set_dataset is used in a subclass" do
224
- @c.dataset_module{def return_3() 3 end}
225
- c = Class.new(@c)
226
- c.set_dataset :items
227
- c.return_3.must_equal 3
228
- c.dataset.return_3.must_equal 3
229
- end
230
-
231
- it "should only have a single dataset_module per class" do
232
- @c.dataset_module{def return_3() 3 end}
233
- @c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
234
- @c.return_3.must_equal 4
235
- end
236
-
237
- it "should not have subclasses share the dataset_module" do
238
- @c.dataset_module{def return_3() 3 end}
239
- c = Class.new(@c)
240
- c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
241
- c.return_3.must_equal 6
242
- end
243
-
244
- it "should accept a module object and extend the dataset with it" do
245
- @c.dataset_module Module.new{def return_3() 3 end}
246
- @c.dataset.return_3.must_equal 3
247
- end
248
-
249
- it "should be able to call dataset_module with a module multiple times" do
250
- @c.dataset_module Module.new{def return_3() 3 end}
251
- @c.dataset_module Module.new{def return_4() 4 end}
252
- @c.dataset.return_3.must_equal 3
253
- @c.dataset.return_4.must_equal 4
254
- end
255
-
256
- it "should be able mix dataset_module calls with and without arguments" do
257
- @c.dataset_module{def return_3() 3 end}
258
- @c.dataset_module Module.new{def return_4() 4 end}
259
- @c.dataset.return_3.must_equal 3
260
- @c.dataset.return_4.must_equal 4
261
- end
262
-
263
- it "should have modules provided to dataset_module extend subclass datasets" do
264
- @c.dataset_module{def return_3() 3 end}
265
- @c.dataset_module Module.new{def return_4() 4 end}
266
- c = Class.new(@c)
267
- c.set_dataset :a
268
- c.dataset.return_3.must_equal 3
269
- c.dataset.return_4.must_equal 4
270
- end
271
-
272
- it "should return the dataset module if given a block" do
273
- Object.new.extend(@c.dataset_module{def return_3() 3 end}).return_3.must_equal 3
274
- end
275
-
276
- it "should return the argument if given one" do
277
- Object.new.extend(@c.dataset_module Module.new{def return_3() 3 end}).return_3.must_equal 3
278
- end
279
-
280
- it "should have dataset_module support a subset method" do
281
- @c.dataset_module{subset :released, :released}
282
- @c.released.sql.must_equal 'SELECT * FROM items WHERE released'
283
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
284
- end
285
-
286
- it "should have dataset_module support a where method" do
287
- @c.dataset_module{where :released, :released}
288
- @c.released.sql.must_equal 'SELECT * FROM items WHERE released'
289
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
290
- end
291
-
292
- if Sequel::Model.dataset_module_class == Sequel::Model::DatasetModule
293
- it "should have dataset_module not support an eager method" do
294
- proc{@c.dataset_module{eager :foo}}.must_raise NoMethodError
295
- end
296
- end
297
-
298
- it "should have dataset_module support a having method" do
299
- @c.dataset_module{having(:released){released}}
300
- @c.released.sql.must_equal 'SELECT * FROM items HAVING released'
301
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING released'
302
- end
303
-
304
- it "should have dataset_module support an exclude method" do
305
- @c.dataset_module{exclude :released, :released}
306
- @c.released.sql.must_equal 'SELECT * FROM items WHERE NOT released'
307
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND NOT released)'
308
- end
309
-
310
- it "should have dataset_module support an exclude_having method" do
311
- @c.dataset_module{exclude_having :released, :released}
312
- @c.released.sql.must_equal 'SELECT * FROM items HAVING NOT released'
313
- @c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING NOT released'
314
- end
315
-
316
- it "should have dataset_module support a distinct method" do
317
- @c.dataset = @c.dataset.with_extend{def supports_distinct_on?; true end}
318
- @c.dataset_module{distinct :foo, :baz}
319
- @c.foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items'
320
- @c.where(:bar).foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items WHERE bar'
321
- end
322
-
323
- it "should have dataset_module support a grep method" do
324
- @c.dataset_module{grep :foo, :baz, 'quux%'}
325
- @c.foo.sql.must_equal 'SELECT * FROM items WHERE ((baz LIKE \'quux%\' ESCAPE \'\\\'))'
326
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE (bar AND ((baz LIKE \'quux%\' ESCAPE \'\\\')))'
327
- end
328
-
329
- it "should have dataset_module support a group method" do
330
- @c.dataset_module{group :foo, :baz}
331
- @c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
332
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar GROUP BY baz'
333
- end
334
-
335
- it "should have dataset_module support a group_and_count method" do
336
- @c.dataset_module{group_and_count :foo, :baz}
337
- @c.foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items GROUP BY baz'
338
- @c.where(:bar).foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items WHERE bar GROUP BY baz'
339
- end
340
-
341
- it "should have dataset_module support a group_append method" do
342
- @c.dataset_module{group_append :foo, :baz}
343
- @c.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
344
- @c.group(:bar).foo.sql.must_equal 'SELECT * FROM items GROUP BY bar, baz'
345
- end
346
-
347
- it "should have dataset_module support a limit method" do
348
- @c.dataset_module{limit :foo, 1}
349
- @c.foo.sql.must_equal 'SELECT * FROM items LIMIT 1'
350
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar LIMIT 1'
351
- end
352
-
353
- it "should have dataset_module support a offset method" do
354
- @c.dataset_module{offset :foo, 1}
355
- @c.foo.sql.must_equal 'SELECT * FROM items OFFSET 1'
356
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar OFFSET 1'
357
- end
358
-
359
- it "should have dataset_module support a order method" do
360
- @c.dataset_module{order(:foo){:baz}}
361
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
362
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz'
363
- end
364
-
365
- it "should have dataset_module support a order_append method" do
366
- @c.dataset_module{order_append :foo, :baz}
367
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
368
- @c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY bar, baz'
369
- end
370
-
371
- it "should have dataset_module support a order_prepend method" do
372
- @c.dataset_module{order_prepend :foo, :baz}
373
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
374
- @c.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY baz, bar'
375
- end
376
-
377
- it "should have dataset_module support a reverse method" do
378
- @c.dataset_module{reverse(:foo){:baz}}
379
- @c.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz DESC'
380
- @c.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz DESC'
381
- end
382
-
383
- it "should have dataset_module support a select method" do
384
- @c.dataset_module{select :foo, :baz}
385
- @c.foo.sql.must_equal 'SELECT baz FROM items'
386
- @c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar'
387
- end
388
-
389
- it "should have dataset_module support a select_all method" do
390
- @c.dataset_module{select_all :foo, :baz}
391
- @c.foo.sql.must_equal 'SELECT baz.* FROM items'
392
- @c.where(:bar).foo.sql.must_equal 'SELECT baz.* FROM items WHERE bar'
393
- end
394
-
395
- it "should have dataset_module support a select_append method" do
396
- @c.dataset_module{select_append :foo, :baz}
397
- @c.foo.sql.must_equal 'SELECT *, baz FROM items'
398
- @c.where(:bar).foo.sql.must_equal 'SELECT *, baz FROM items WHERE bar'
399
- end
400
-
401
- it "should have dataset_module support a select_group method" do
402
- @c.dataset_module{select_group :foo, :baz}
403
- @c.foo.sql.must_equal 'SELECT baz FROM items GROUP BY baz'
404
- @c.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar GROUP BY baz'
405
- end
406
-
407
- it "should have dataset_module support a server method" do
408
- @c.dataset_module{server :foo, :baz}
409
- @c.foo.opts[:server].must_equal :baz
410
- @c.where(:bar).foo.opts[:server].must_equal :baz
411
- end
412
-
413
- it "should raise error if called with both an argument and a block" do
414
- proc{@c.dataset_module(Module.new{def return_3() 3 end}){}}.must_raise(Sequel::Error)
415
- end
416
- end
417
-
418
- describe "A model class with implicit table name" do
419
- before do
420
- class ::Donkey < Sequel::Model
421
- end
422
- end
423
- after do
424
- Object.send(:remove_const, :Donkey)
425
- end
426
-
427
- it "should have a dataset associated with the model class" do
428
- Donkey.dataset.model.must_equal Donkey
429
- end
430
- end
431
-
432
- describe "A model inheriting from a model" do
433
- before do
434
- class ::Feline < Sequel::Model; end
435
- class ::Leopard < Feline; end
436
- end
437
- after do
438
- Object.send(:remove_const, :Leopard)
439
- Object.send(:remove_const, :Feline)
440
- end
441
-
442
- it "should have a dataset associated with itself" do
443
- Feline.dataset.model.must_equal Feline
444
- Leopard.dataset.model.must_equal Leopard
445
- end
446
- end
447
-
448
- describe "A model inheriting from a custom base that sets @dataset" do
449
- before do
450
- ::Feline = Class.new(Sequel::Model)
451
- def Feline.inherited(subclass)
452
- subclass.instance_variable_set(:@dataset, nil)
453
- superclass.inherited(subclass)
454
- end
455
- class ::Leopard < Feline; end
456
- end
457
- after do
458
- Object.send(:remove_const, :Leopard)
459
- Object.send(:remove_const, :Feline)
460
- end
461
-
462
- it "should not infer the dataset of the subclass" do
463
- proc{Leopard.dataset}.must_raise(Sequel::Error)
464
- end
465
- end
466
-
467
- describe "Model.primary_key" do
468
- before do
469
- @c = Class.new(Sequel::Model)
470
- end
471
-
472
- it "should default to id" do
473
- @c.primary_key.must_equal :id
474
- end
475
-
476
- it "should be overridden by set_primary_key" do
477
- @c.set_primary_key :cid
478
- @c.primary_key.must_equal :cid
479
-
480
- @c.set_primary_key([:id1, :id2])
481
- @c.primary_key.must_equal [:id1, :id2]
482
- end
483
-
484
- it "should use nil for no primary key" do
485
- @c.no_primary_key
486
- @c.primary_key.must_be_nil
487
- end
488
- end
489
-
490
- describe "Model.primary_key_hash" do
491
- before do
492
- @c = Class.new(Sequel::Model)
493
- end
494
-
495
- it "should handle a single primary key" do
496
- @c.primary_key_hash(1).must_equal(:id=>1)
497
- end
498
-
499
- it "should handle a composite primary key" do
500
- @c.set_primary_key([:id1, :id2])
501
- @c.primary_key_hash([1, 2]).must_equal(:id1=>1, :id2=>2)
502
- end
503
-
504
- it "should raise an error for no primary key" do
505
- @c.no_primary_key
506
- proc{@c.primary_key_hash(1)}.must_raise(Sequel::Error)
507
- end
508
- end
509
-
510
- describe "Model.qualified_primary_key_hash" do
511
- before do
512
- @c = Class.new(Sequel::Model(:items))
513
- end
514
-
515
- it "should handle a single primary key" do
516
- @c.qualified_primary_key_hash(1).must_equal(Sequel.qualify(:items, :id)=>1)
517
- end
518
-
519
- it "should handle a composite primary key" do
520
- @c.set_primary_key([:id1, :id2])
521
- @c.qualified_primary_key_hash([1, 2]).must_equal(Sequel.qualify(:items, :id1)=>1, Sequel.qualify(:items, :id2)=>2)
522
- end
523
-
524
- it "should raise an error for no primary key" do
525
- @c.no_primary_key
526
- proc{@c.qualified_primary_key_hash(1)}.must_raise(Sequel::Error)
527
- end
528
-
529
- it "should allow specifying a different qualifier" do
530
- @c.qualified_primary_key_hash(1, :apple).must_equal(Sequel.qualify(:apple, :id)=>1)
531
- @c.set_primary_key([:id1, :id2])
532
- @c.qualified_primary_key_hash([1, 2], :bear).must_equal(Sequel.qualify(:bear, :id1)=>1, Sequel.qualify(:bear, :id2)=>2)
533
- end
534
- end
535
-
536
- describe "Model.db" do
537
- before do
538
- @db = Sequel.mock
539
- @databases = Sequel::DATABASES.dup
540
- @model_db = Sequel::Model.db
541
- Sequel::Model.db = nil
542
- Sequel::DATABASES.clear
543
- end
544
- after do
545
- Sequel::Model.instance_variable_get(:@db).must_be_nil
546
- Sequel::DATABASES.replace(@databases)
547
- Sequel::Model.db = @model_db
548
- end
549
-
550
- it "should be required when creating named model classes" do
551
- begin
552
- proc{class ModelTest < Sequel::Model; end}.must_raise(Sequel::Error)
553
- ensure
554
- Object.send(:remove_const, :ModelTest)
555
- end
556
- end
557
-
558
- it "should be required when creating anonymous model classes without a database" do
559
- proc{Sequel::Model(:foo)}.must_raise(Sequel::Error)
560
- end
561
-
562
- it "should not be required when creating anonymous model classes with a database" do
563
- Sequel::Model(@db).db.must_equal @db
564
- Sequel::Model(@db[:foo]).db.must_equal @db
565
- end
566
-
567
- it "should work correctly when subclassing anonymous model classes with a database" do
568
- begin
569
- Class.new(Sequel::Model(@db)).db.must_equal @db
570
- Class.new(Sequel::Model(@db[:foo])).db.must_equal @db
571
- class ModelTest < Sequel::Model(@db)
572
- db.must_equal @db
573
- end
574
- class ModelTest2 < Sequel::Model(@db[:foo])
575
- db.must_equal @db
576
- end
577
- ModelTest.instance_variable_set(:@db, nil)
578
- ModelTest.db.must_equal @db
579
- ensure
580
- Object.send(:remove_const, :ModelTest)
581
- Object.send(:remove_const, :ModelTest2)
582
- end
583
- end
584
- end
585
-
586
- describe "Model.db=" do
587
- before do
588
- @db1 = Sequel.mock
589
- @db2 = Sequel.mock
590
- @m = Class.new(Sequel::Model(@db1))
591
- end
592
-
593
- it "should change database for model" do
594
- @m.db = @db2
595
- @m.db.must_equal @db2
596
- end
597
-
598
- it "should raise Error for model with existing dataset" do
599
- @m.dataset = :table
600
- proc{@m.db = @db2}.must_raise Sequel::Error
601
- end
602
-
603
- it "should use the database for subclasses" do
604
- Class.new(@m).db.must_equal @db1
605
- end
606
- end
607
-
608
- describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
609
- before do
610
- @c = Class.new(Sequel::Model(:blahblah)) do
611
- set_primary_key :id
612
- columns :x, :y, :z, :id
613
- end
614
- @c.strict_param_setting = false
615
- end
616
-
617
- it "should restrict updates to primary key by default" do
618
- i = @c.new(:x => 1, :y => 2, :id => 3)
619
- i.values.must_equal(:x => 1, :y => 2)
620
- i.set(:x => 4, :y => 5, :id => 6)
621
- i.values.must_equal(:x => 4, :y => 5)
622
- end
623
-
624
- it "should allow updates to primary key if unrestrict_primary_key is used" do
625
- @c.unrestrict_primary_key
626
- i = @c.new(:x => 1, :y => 2, :id => 3)
627
- i.values.must_equal(:x => 1, :y => 2, :id=>3)
628
- i.set(:x => 4, :y => 5, :id => 6)
629
- i.values.must_equal(:x => 4, :y => 5, :id=>6)
630
- end
631
-
632
- it "should have restrict_primary_key? return true or false depending" do
633
- @c.restrict_primary_key?.must_equal true
634
- @c.unrestrict_primary_key
635
- @c.restrict_primary_key?.must_equal false
636
- c1 = Class.new(@c)
637
- c1.restrict_primary_key?.must_equal false
638
- @c.restrict_primary_key
639
- @c.restrict_primary_key?.must_equal true
640
- c1.restrict_primary_key?.must_equal false
641
- c2 = Class.new(@c)
642
- c2.restrict_primary_key?.must_equal true
643
- end
644
- end
645
-
646
- describe Sequel::Model, ".strict_param_setting" do
647
- before do
648
- @c = Class.new(Sequel::Model(:blahblah)) do
649
- columns :x, :y, :z, :id
650
- end
651
- end
652
-
653
- it "should be enabled by default" do
654
- @c.strict_param_setting.must_equal true
655
- end
656
-
657
- it "should raise an error if a missing/restricted column/method is accessed" do
658
- proc{@c.new(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
659
- proc{@c.create(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
660
- c = @c.new
661
- proc{c.set(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
662
- proc{c.update(:a=>1)}.must_raise(Sequel::MassAssignmentRestriction)
663
- end
664
-
665
- it "should be disabled by strict_param_setting = false" do
666
- @c.strict_param_setting = false
667
- @c.strict_param_setting.must_equal false
668
- @c.new(:a=>1)
669
- end
670
- end
671
-
672
- describe Sequel::Model, ".require_modification" do
673
- before do
674
- @ds1 = DB[:items].with_extend{def provides_accurate_rows_matched?; false end}
675
- @ds2 = DB[:items].with_extend{def provides_accurate_rows_matched?; true end}
676
- end
677
- after do
678
- Sequel::Model.require_modification = nil
679
- end
680
-
681
- it "should depend on whether the dataset provides an accurate number of rows matched by default" do
682
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
683
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
684
- end
685
-
686
- it "should obey global setting regardless of dataset support if set" do
687
- Sequel::Model.require_modification = true
688
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal true
689
- Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
690
-
691
- Sequel::Model.require_modification = false
692
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
693
- Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
694
- end
695
- end
696
-
697
- describe Sequel::Model, ".[] optimization" do
698
- before do
699
- @db = Sequel.mock
700
- def @db.schema(*) [[:id, {:primary_key=>true}]] end
701
- def @db.supports_schema_parsing?() true end
702
- @c = Class.new(Sequel::Model(@db))
703
- @ds = @db.dataset.with_quote_identifiers(true)
704
- end
705
-
706
- it "should set simple_pk to the literalized primary key column name if a single primary key" do
707
- @c.set_primary_key :id
708
- @c.simple_pk.must_equal 'id'
709
- @c.set_primary_key :b
710
- @c.simple_pk.must_equal 'b'
711
- @c.set_primary_key Sequel.identifier(:b__a)
712
- @c.simple_pk.must_equal 'b__a'
713
- end
714
-
715
- it "should have simple_pk be blank if compound or no primary key" do
716
- @c.no_primary_key
717
- @c.simple_pk.must_be_nil
718
- @c.set_primary_key [:b, :a]
719
- @c.simple_pk.must_be_nil
720
- end
721
-
722
- it "should have simple table set if passed a Symbol to set_dataset" do
723
- @c.set_dataset :a
724
- @c.simple_table.must_equal 'a'
725
- @c.set_dataset :b
726
- @c.simple_table.must_equal 'b'
727
- end
728
-
729
- it "should have simple_table set if passed a simple select all dataset to set_dataset" do
730
- @c.set_dataset @ds.from(:a)
731
- @c.simple_table.must_equal '"a"'
732
- @c.set_dataset @ds.from(:b)
733
- @c.simple_table.must_equal '"b"'
734
- @c.set_dataset @ds.from(Sequel[:b][:a])
735
- @c.simple_table.must_equal '"b"."a"'
736
- end
737
-
738
- with_symbol_splitting "should have simple_table set using qualified symbol" do
739
- @c.set_dataset :b__a
740
- @c.simple_table.must_equal 'b.a'
741
- @c.set_dataset @ds.from(:b__a)
742
- @c.simple_table.must_equal '"b"."a"'
743
- end
744
-
745
- it "should have simple_table = nil if passed a non-simple select all dataset to set_dataset" do
746
- @c.set_dataset @c.db[:a].filter(:active)
747
- @c.simple_table.must_be_nil
748
- end
749
-
750
- it "should have simple_table inherit superclass's setting" do
751
- Class.new(@c).simple_table.must_be_nil
752
- @c.set_dataset :a
753
- Class.new(@c).simple_table.must_equal 'a'
754
- end
755
-
756
- it "should use Dataset#with_sql if simple_table and simple_pk are true" do
757
- @c.set_dataset @db[:a].with_fetch(:id=>1)
758
- @c[1].must_equal @c.load(:id=>1)
759
- @db.sqls.must_equal ['SELECT * FROM a WHERE id = 1']
760
- end
761
-
762
- it "should not use Dataset#with_sql if either simple_table or simple_pk is nil" do
763
- @c.set_dataset @db[:a].where(:active).with_fetch(:id=>1)
764
- @c[1].must_equal @c.load(:id=>1)
765
- @db.sqls.must_equal ['SELECT * FROM a WHERE (active AND (id = 1)) LIMIT 1']
766
- end
767
- end
768
-
769
- describe "Model datasets #with_pk with #with_pk!" do
770
- before do
771
- @c = Class.new(Sequel::Model(:a))
772
- @ds = @c.dataset = @c.dataset.with_fetch(:id=>1)
773
- DB.reset
774
- end
775
-
776
- it "should be callable on the model class with optimized SQL" do
777
- @c.with_pk(1).must_equal @c.load(:id=>1)
778
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
779
- @c.with_pk!(1).must_equal @c.load(:id=>1)
780
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
781
- end
782
-
783
- it "should return the first record where the primary key matches" do
784
- @ds.with_pk(1).must_equal @c.load(:id=>1)
785
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
786
- @ds.with_pk!(1).must_equal @c.load(:id=>1)
787
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
788
- end
789
-
790
- it "should work when called repeatedly on a frozen dataset" do
791
- @ds.freeze
792
- 5.times do
793
- @ds.with_pk(1).must_equal @c.load(:id=>1)
794
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
795
- end
796
- end
797
-
798
- it "should handle existing filters" do
799
- @ds.filter(:a=>2).with_pk(1)
800
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
801
- @ds.filter(:a=>2).with_pk!(1)
802
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
803
- end
804
-
805
- it "should work with string values" do
806
- @ds.with_pk("foo")
807
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
808
- @ds.with_pk!("foo")
809
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
810
- end
811
-
812
- it "should handle an array for composite primary keys" do
813
- @c.set_primary_key [:id1, :id2]
814
- @ds.with_pk([1, 2])
815
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
816
-
817
- @ds.with_pk!([1, 2])
818
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
819
- end
820
-
821
- it "should work with composite primary keys when called repeatedly on a frozen dataset with" do
822
- @c.set_primary_key [:id1, :id2]
823
- @ds.freeze
824
- 5.times do
825
- @ds.with_pk([1,2])
826
- DB.sqls.must_equal ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1"]
827
- end
828
- end
829
-
830
- it "should have with_pk return nil and with_pk! raise if no rows match" do
831
- @ds = @ds.with_fetch([])
832
- @ds.with_pk(1).must_be_nil
833
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
834
- proc{@ds.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
835
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
836
- end
837
-
838
- it "should have with_pk return nil and with_pk! raise if no rows match when calling the class method" do
839
- @c.dataset = @c.dataset.with_fetch([])
840
- @c.with_pk(1).must_be_nil
841
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
842
- proc{@c.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
843
- DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
844
- end
845
-
846
- it "should have #[] consider an integer as a primary key lookup" do
847
- @ds[1].must_equal @c.load(:id=>1)
848
- DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
849
- end
850
-
851
- it "should not have #[] consider a literal string as a primary key lookup" do
852
- @ds[Sequel.lit('foo')].must_equal @c.load(:id=>1)
853
- DB.sqls.must_equal ["SELECT * FROM a WHERE (foo) LIMIT 1"]
854
- end
855
-
856
- it "should raise Error if called on a dataset with no primary key" do
857
- @c.no_primary_key
858
- @ds.freeze
859
- 5.times do
860
- proc{@ds.with_pk(1)}.must_raise Sequel::Error
861
- end
862
- end
863
- end
864
-
865
- describe "Model::include" do
866
- it "shouldn't change the signature of Module::include" do
867
- mod1 = Module.new
868
- mod2 = Module.new
869
- including_class = Class.new(Sequel::Model(:items)) do
870
- include(mod1, mod2)
871
- end
872
- including_class.included_modules.must_include(mod1)
873
- including_class.included_modules.must_include(mod2)
874
- end
875
- end