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,347 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Model, "single table inheritance plugin" do
4
- before do
5
- class ::StiTest < Sequel::Model
6
- columns :id, :kind, :blah
7
- plugin :single_table_inheritance, :kind
8
- end
9
- class ::StiTestSub1 < StiTest
10
- end
11
- class ::StiTestSub2 < StiTest
12
- end
13
- @ds = StiTest.dataset
14
- DB.reset
15
- end
16
- after do
17
- Object.send(:remove_const, :StiTestSub1)
18
- Object.send(:remove_const, :StiTestSub2)
19
- Object.send(:remove_const, :StiTest)
20
- end
21
-
22
- describe ".sti_load" do
23
- it "should load instances of the correct type" do
24
- StiTest.sti_load(:id => 3).must_be_instance_of StiTest
25
- StiTest.sti_load(:id => 3, :kind => 'StiTestSub1').must_be_instance_of StiTestSub1
26
- StiTest.sti_load(:id => 3, :kind => 'StiTestSub2').must_be_instance_of StiTestSub2
27
- end
28
- end
29
-
30
- describe ".sti_class_from_sti_key" do
31
- it "should load the correct subclass based on the key" do
32
- StiTest.sti_class_from_sti_key('StiTest').must_equal StiTest
33
- StiTest.sti_class_from_sti_key('StiTestSub1').must_equal StiTestSub1
34
- StiTest.sti_class_from_sti_key('StiTestSub2').must_equal StiTestSub2
35
- end
36
- end
37
-
38
- it "should freeze sti metadata when freezing model class" do
39
- StiTest.freeze
40
- StiTest.sti_dataset.frozen?.must_equal true
41
-
42
- StiTestSub1.freeze
43
- StiTestSub1.sti_key_array.frozen?.must_equal true
44
-
45
- proc{class ::StiTestSub1Sub1 < StiTestSub1; end}.must_raise RuntimeError, TypeError
46
- end
47
-
48
- it "should have simple_table = nil" do
49
- StiTest.simple_table.must_equal "sti_tests"
50
- StiTestSub1.simple_table.must_be_nil
51
- end
52
-
53
- it "should allow changing the inheritance column via a plugin :single_table_inheritance call" do
54
- StiTest.plugin :single_table_inheritance, :blah
55
- Object.send(:remove_const, :StiTestSub1)
56
- Object.send(:remove_const, :StiTestSub2)
57
- class ::StiTestSub1 < StiTest; end
58
- class ::StiTestSub2 < StiTest; end
59
- StiTest.dataset = StiTest.dataset.with_fetch([{:blah=>'StiTest'}, {:blah=>'StiTestSub1'}, {:blah=>'StiTestSub2'}])
60
- StiTest.all.collect{|x| x.class}.must_equal [StiTest, StiTestSub1, StiTestSub2]
61
- StiTest.dataset.sql.must_equal "SELECT * FROM sti_tests"
62
- StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.blah IN ('StiTestSub1'))"
63
- StiTestSub2.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.blah IN ('StiTestSub2'))"
64
- end
65
-
66
- it "should return rows with the correct class based on the polymorphic_key value" do
67
- StiTest.dataset = StiTest.dataset.with_fetch([{:kind=>'StiTest'}, {:kind=>'StiTestSub1'}, {:kind=>'StiTestSub2'}])
68
- StiTest.all.collect{|x| x.class}.must_equal [StiTest, StiTestSub1, StiTestSub2]
69
- end
70
-
71
- it "should return rows with the correct class based on the polymorphic_key value when retreiving by primary key" do
72
- StiTest.dataset = StiTest.dataset.with_fetch([{:kind=>'StiTestSub1'}])
73
- StiTest[1].class.must_equal StiTestSub1
74
- end
75
-
76
- it "should return rows with the correct class for subclasses based on the polymorphic_key value" do
77
- class ::StiTestSub1Sub < StiTestSub1; end
78
- StiTestSub1.dataset = StiTestSub1.dataset.with_fetch([{:kind=>'StiTestSub1'}, {:kind=>'StiTestSub1Sub'}])
79
- StiTestSub1.all.collect{|x| x.class}.must_equal [StiTestSub1, StiTestSub1Sub]
80
- end
81
-
82
- it "should fallback to the main class if the given class does not exist" do
83
- StiTest.dataset = StiTest.dataset.with_fetch(:kind=>'StiTestSub3')
84
- StiTest.all.collect{|x| x.class}.must_equal [StiTest]
85
- end
86
-
87
- it "should inherit dataset_modules correctly in subclass" do
88
- StiTest.dataset_module{def foo; 1; end}
89
- Object.send(:remove_const, :StiTestSub1)
90
- Object.send(:remove_const, :StiTestSub2)
91
- class ::StiTestSub1 < StiTest; end
92
- StiTestSub1.dataset_module{def bar; 2; end}
93
- class ::StiTestSub2 < StiTestSub1; end
94
- StiTestSub2.dataset_module{def baz; 3; end}
95
-
96
- StiTest.dataset.foo.must_equal 1
97
- proc{StiTest.dataset.bar}.must_raise NoMethodError
98
- proc{StiTest.dataset.baz}.must_raise NoMethodError
99
- StiTestSub1.dataset.foo.must_equal 1
100
- StiTestSub1.dataset.bar.must_equal 2
101
- proc{StiTestSub1.dataset.baz}.must_raise NoMethodError
102
- StiTestSub2.dataset.foo.must_equal 1
103
- StiTestSub2.dataset.bar.must_equal 2
104
- StiTestSub2.dataset.baz.must_equal 3
105
- end
106
-
107
- it "should fallback to the main class if the sti_key field is empty or nil without calling constantize" do
108
- called = false
109
- StiTest.define_singleton_method(:constantize){|_| called = true}
110
- StiTest.plugin :single_table_inheritance, :kind
111
- StiTest.dataset = StiTest.dataset.with_fetch([{:kind=>''}, {:kind=>nil}])
112
- StiTest.all.collect{|x| x.class}.must_equal [StiTest, StiTest]
113
- called.must_equal false
114
- end
115
-
116
- it "should set the model class name when saving" do
117
- StiTest.new.save
118
- StiTestSub1.new.save
119
- StiTestSub2.new.save
120
- DB.sqls.must_equal ["INSERT INTO sti_tests (kind) VALUES ('StiTest')", "SELECT * FROM sti_tests WHERE id = 10", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 10)) LIMIT 1", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub2')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub2')) AND (id = 10)) LIMIT 1"]
121
- end
122
-
123
- it "should destroy the model correctly" do
124
- StiTest.load(:id=>1).destroy
125
- StiTestSub1.load(:id=>1).destroy
126
- StiTestSub2.load(:id=>1).destroy
127
- DB.sqls.must_equal ["DELETE FROM sti_tests WHERE id = 1", "DELETE FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 1))", "DELETE FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub2')) AND (id = 1))"]
128
- end
129
-
130
- it "should handle validations on the type column field" do
131
- o = StiTestSub1.new
132
- def o.validate
133
- errors.add(:kind, 'not present') unless kind
134
- end
135
- o.valid?.must_equal true
136
- end
137
-
138
- it "should set type column field even if validations are skipped" do
139
- StiTestSub1.new.save(:validate=>false)
140
- DB.sqls.must_equal ["INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 10)) LIMIT 1"]
141
- end
142
-
143
- it "should override an existing value in the class name field" do
144
- StiTest.create(:kind=>'StiTestSub1')
145
- DB.sqls.must_equal ["INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE id = 10"]
146
- end
147
-
148
- it "should handle type column with the same name as existing method names" do
149
- StiTest.plugin :single_table_inheritance, :type
150
- StiTest.columns :id, :type
151
- StiTest.create
152
- DB.sqls.must_equal ["INSERT INTO sti_tests (type) VALUES ('StiTest')", "SELECT * FROM sti_tests WHERE id = 10"]
153
- end
154
-
155
- it "should add a filter to model datasets inside subclasses hook to only retreive objects with the matching key" do
156
- StiTest.dataset.sql.must_equal "SELECT * FROM sti_tests"
157
- StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1'))"
158
- StiTestSub2.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub2'))"
159
- end
160
-
161
- it "should add a correct filter for multiple levels of subclasses" do
162
- class ::StiTestSub1A < StiTestSub1; end
163
- StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1', 'StiTestSub1A'))"
164
- StiTestSub1A.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1A'))"
165
- class ::StiTestSub2A < StiTestSub2; end
166
- StiTestSub2.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub2', 'StiTestSub2A'))"
167
- StiTestSub2A.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub2A'))"
168
- class ::StiTestSub1B < StiTestSub1A; end
169
- StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1', 'StiTestSub1A', 'StiTestSub1B'))"
170
- StiTestSub1A.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1A', 'StiTestSub1B'))"
171
- StiTestSub1B.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1B'))"
172
- end
173
-
174
- it "should work correctly with the :caching plugin" do
175
- cache_class = Class.new(Hash) do
176
- attr_accessor :ttl
177
- def set(k, v, ttl); self[k] = v; @ttl = ttl; end
178
- def get(k); self[k]; end
179
- end
180
- cache = cache_class.new
181
-
182
- StiTest.plugin :caching, cache
183
- def StiTest.cache_key_prefix; "stitest" end
184
- c2 = Class.new StiTest
185
- c2.cache_key(:id).must_equal StiTest.cache_key(:id)
186
-
187
- obj2 = c2.new
188
- obj2.values[:x] = 2
189
- obj2.save
190
- c2[obj2.id]
191
- c2.cache_get_pk(obj2.id).values.must_equal StiTest.cache_get_pk(obj2.id).values
192
- obj2.save
193
- c2.cache_get_pk(obj2.id).must_be_nil
194
- StiTest.cache_get_pk(obj2.id).must_be_nil
195
- end
196
-
197
- describe "with custom options" do
198
- before do
199
- class ::StiTest2 < Sequel::Model
200
- columns :id, :kind
201
- def _save_refresh; end
202
- end
203
- end
204
- after do
205
- Object.send(:remove_const, :StiTest2)
206
- Object.send(:remove_const, :StiTest3) if defined?(StiTest3)
207
- Object.send(:remove_const, :StiTest4) if defined?(StiTest4)
208
- end
209
-
210
- it "should freeze sti key and model map if given as hashes when freezing model class" do
211
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>StiTest2, 1=>:StiTest3, 2=>'StiTest4'}, :key_map=>{StiTest2=>4, 'StiTest3'=>5, 'StiTest4'=>6}
212
- StiTest2.freeze
213
- StiTest2.sti_key_map.frozen?.must_equal true
214
- StiTest2.sti_model_map.frozen?.must_equal true
215
- end
216
-
217
- it "should have working row_proc if using set_dataset in subclass to remove columns" do
218
- StiTest2.plugin :single_table_inheritance, :kind
219
- class ::StiTest3 < ::StiTest2
220
- set_dataset(dataset.select(*(columns - [:blah])))
221
- end
222
- class ::StiTest4 < ::StiTest3; end
223
- StiTest3.dataset = StiTest3.dataset.with_fetch(:id=>1, :kind=>'StiTest4')
224
- StiTest3[1].must_equal StiTest4.load(:id=>1, :kind=>'StiTest4')
225
- end
226
-
227
- it "should work with custom procs with strings" do
228
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>proc{|v| v == 1 ? 'StiTest3' : 'StiTest4'}, :key_map=>proc{|klass| klass.name == 'StiTest3' ? 1 : 2}
229
- class ::StiTest3 < ::StiTest2; end
230
- class ::StiTest4 < ::StiTest2; end
231
- StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest4)
232
- StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
233
- StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
234
-
235
- StiTest2.create.kind.must_equal 2
236
- StiTest3.create.kind.must_equal 1
237
- StiTest4.create.kind.must_equal 2
238
- end
239
-
240
- it "should work with custom procs with symbols" do
241
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>proc{|v| v == 1 ? :StiTest3 : :StiTest4}, :key_map=>proc{|klass| klass.name == 'StiTest3' ? 1 : 2}
242
- class ::StiTest3 < ::StiTest2; end
243
- class ::StiTest4 < ::StiTest2; end
244
- StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest4)
245
- StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
246
- StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
247
-
248
- StiTest2.create.kind.must_equal 2
249
- StiTest3.create.kind.must_equal 1
250
- StiTest4.create.kind.must_equal 2
251
- end
252
-
253
- it "should work with custom hashes" do
254
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>StiTest2, 1=>:StiTest3, 2=>'StiTest4'}, :key_map=>{StiTest2=>4, 'StiTest3'=>5, 'StiTest4'=>6}
255
- class ::StiTest3 < ::StiTest2; end
256
- class ::StiTest4 < ::StiTest2; end
257
- StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest2)
258
- StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
259
- StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
260
- StiTest3.sti_model_map.must_equal StiTest2.sti_model_map
261
-
262
- StiTest2.create.kind.must_equal 4
263
- StiTest3.create.kind.must_equal 5
264
- StiTest4.create.kind.must_equal 6
265
-
266
- class ::StiTest5 < ::StiTest4; end
267
- StiTest5.create.kind.must_be_nil
268
- end
269
-
270
- it "should infer key_map from model_map if provided as a hash" do
271
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>StiTest2, 1=>'StiTest3', 2=>:StiTest4}
272
- class ::StiTest3 < ::StiTest2; end
273
- class ::StiTest4 < ::StiTest2; end
274
- StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest2)
275
- StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
276
- StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
277
-
278
- StiTest2.create.kind.must_equal 0
279
- StiTest3.create.kind.must_equal 1
280
- StiTest4.create.kind.must_equal 2
281
- end
282
-
283
- it "should raise exceptions if a bad model value is used" do
284
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>1,1=>1.5, 2=>Date.today}
285
- class ::StiTest3 < ::StiTest2; end
286
- class ::StiTest4 < ::StiTest2; end
287
- proc{StiTest2.dataset.row_proc.call(:kind=>0)}.must_raise(Sequel::Error)
288
- proc{StiTest2.dataset.row_proc.call(:kind=>1)}.must_raise(Sequel::Error)
289
- proc{StiTest2.dataset.row_proc.call(:kind=>2)}.must_raise(Sequel::Error)
290
- end
291
-
292
- it "should work with non-bijective mappings" do
293
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>'StiTest3', 1=>'StiTest3', 2=>'StiTest4'}
294
- class ::StiTest3 < ::StiTest2; end
295
- class ::StiTest4 < ::StiTest2; end
296
- StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest3)
297
- StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
298
- StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
299
-
300
- [0,1].must_include(StiTest3.create.kind)
301
- StiTest4.create.kind.must_equal 2
302
- end
303
-
304
- it "should work with non-bijective mappings and key map procs" do
305
- StiTest2.plugin :single_table_inheritance, :kind,
306
- :key_map=>proc{|model| model.to_s == 'StiTest4' ? 2 : [0,1] }
307
- class ::StiTest3 < ::StiTest2; end
308
- class ::StiTest4 < ::StiTest2; end
309
-
310
- StiTest2.dataset.sql.must_equal "SELECT * FROM sti_test2s"
311
- StiTest3.dataset.sql.must_equal "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))"
312
- StiTest4.dataset.sql.must_equal "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (2))"
313
- end
314
-
315
- it "should create correct sql with non-bijective mappings" do
316
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>'StiTest3', 1=>'StiTest3', 2=>'StiTest4'}
317
- class ::StiTest3 < ::StiTest2; end
318
- class ::StiTest4 < ::StiTest2; end
319
-
320
- StiTest2.dataset.sql.must_equal "SELECT * FROM sti_test2s"
321
- ["SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))",
322
- "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (1, 0))"].must_include(StiTest3.dataset.sql)
323
- end
324
-
325
- it "should destroy the model correctly" do
326
- StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{'sti3'=>'StiTest3', 'sti3b'=>'StiTest3', 'sti4'=>'StiTest4'}
327
- class ::StiTest3 < ::StiTest2; end
328
- class ::StiTest4 < ::StiTest2; end
329
- StiTest2.load(:id=>1).destroy
330
- StiTest3.load(:id=>1).destroy
331
- sqls = DB.sqls
332
- sqls.shift.must_equal "DELETE FROM sti_test2s WHERE id = 1"
333
- ["DELETE FROM sti_test2s WHERE ((sti_test2s.kind IN ('sti3', 'sti3b')) AND (id = 1))",
334
- "DELETE FROM sti_test2s WHERE ((sti_test2s.kind IN ('sti3b', 'sti3')) AND (id = 1))"].must_include(sqls.pop)
335
- sqls.must_equal []
336
- end
337
-
338
- it "should honor a :key_chooser" do
339
- StiTest2.plugin :single_table_inheritance, :kind, :key_chooser => proc{|inst| inst.model.to_s.downcase }
340
- class ::StiTest3 < ::StiTest2; end
341
- class ::StiTest4 < ::StiTest2; end
342
-
343
- StiTest3.create.kind.must_equal 'stitest3'
344
- StiTest4.create.kind.must_equal 'stitest4'
345
- end
346
- end
347
- end
@@ -1,22 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::SingularTableNames" do
4
- before do
5
- @c = Class.new(Sequel::Model)
6
- @c.plugin :singular_table_names
7
- end
8
- after do
9
- Object.send(:remove_const, :Foo)
10
- end
11
-
12
- it "should not used the pluralized table name" do
13
- class ::Foo < @c; end
14
- Foo.table_name.must_equal :foo
15
- end
16
-
17
- it "should handle nested moedls name" do
18
- module ::Foo; end
19
- class Foo::Bar < @c; end
20
- Foo::Bar.table_name.must_equal :bar
21
- end
22
- end
@@ -1,18 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::SkipCreateRefresh" do
4
- it "should skip the refresh after saving a new object" do
5
- c = Class.new(Sequel::Model(:a))
6
- c.columns :id, :x
7
- c.dataset = c.dataset.with_autoid(2)
8
- c.db.reset
9
- c.create(:x=>1)
10
- c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE id = 2']
11
-
12
- c.dataset = c.dataset.with_autoid(2)
13
- c.plugin :skip_create_refresh
14
- c.db.reset
15
- c.create(:x=>3).values.must_equal(:id=>2, :x=>3)
16
- c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (3)']
17
- end
18
- end
@@ -1,63 +0,0 @@
1
- require_relative "../sequel_warning"
2
-
3
- if ENV['COVERAGE']
4
- require_relative "../sequel_coverage"
5
- SimpleCov.sequel_coverage(:filter=>%r{lib/sequel/(extensions|plugins)/\w+\.rb\z})
6
- end
7
-
8
- ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
9
- gem 'minitest'
10
- require 'minitest/autorun'
11
- require 'minitest/hooks/default'
12
- require 'minitest/shared_description'
13
-
14
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
15
- require_relative "../../lib/sequel"
16
-
17
- require_relative '../deprecation_helper'
18
-
19
- begin
20
- # Attempt to load ActiveSupport blank extension and inflector first, so Sequel
21
- # can override them.
22
- require 'active_support/core_ext/object/blank'
23
- require 'active_support/inflector'
24
- require 'active_support/core_ext/string/inflections'
25
- rescue LoadError
26
- nil
27
- end
28
-
29
- Sequel.extension :core_refinements if RUBY_VERSION >= '2.0.0' && RUBY_ENGINE == 'ruby'
30
-
31
- class << Sequel::Model
32
- attr_writer :db_schema
33
- alias orig_columns columns
34
- def columns(*cols)
35
- return super if cols.empty?
36
- define_method(:columns){cols}
37
- @dataset.send(:columns=, cols) if @dataset
38
- def_column_accessor(*cols)
39
- @columns = cols
40
- @db_schema = {}
41
- cols.each{|c| @db_schema[c] = {}}
42
- end
43
- end
44
-
45
- Sequel::DB = nil
46
- Sequel::Model.use_transactions = false
47
- Sequel::Model.cache_anonymous_models = false
48
-
49
- db = Sequel.mock(:fetch=>{:id => 1, :x => 1}, :numrows=>1, :autoid=>proc{|sql| 10})
50
- def db.schema(*) [[:id, {:primary_key=>true}]] end
51
- def db.reset() sqls end
52
- def db.supports_schema_parsing?() true end
53
- Sequel::Model.db = DB = db
54
-
55
- if ENV['SEQUEL_COLUMNS_INTROSPECTION']
56
- Sequel.extension :columns_introspection
57
- Sequel::Database.extension :columns_introspection
58
- Sequel::Mock::Dataset.send(:include, Sequel::ColumnsIntrospection)
59
- end
60
- if ENV['SEQUEL_NO_CACHE_ASSOCIATIONS']
61
- Sequel::Model.cache_associations = false
62
- end
63
- Sequel::Model.plugin :throw_failures if ENV['SEQUEL_MODEL_THROW_FAILURES']
@@ -1,24 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "split_array_nil extension" do
4
- before do
5
- @ds = Sequel.mock[:table].extension(:split_array_nil)
6
- end
7
-
8
- it "should split IN with nil in array into separate OR IS NULL clause" do
9
- @ds.filter(:a=>[1, nil]).sql.must_equal "SELECT * FROM table WHERE ((a IN (1)) OR (a IS NULL))"
10
- end
11
-
12
- it "should split NOT IN with nil in array into separate AND IS NOT NULL clause" do
13
- @ds.exclude(:a=>[1, nil]).sql.must_equal "SELECT * FROM table WHERE ((a NOT IN (1)) AND (a IS NOT NULL))"
14
- end
15
-
16
- it "should not affect other IN/NOT in clauses" do
17
- @ds.filter(:a=>[1, 2]).sql.must_equal "SELECT * FROM table WHERE (a IN (1, 2))"
18
- @ds.exclude(:a=>[1, 2]).sql.must_equal "SELECT * FROM table WHERE (a NOT IN (1, 2))"
19
- end
20
-
21
- it "should not affect other types of filters clauses" do
22
- @ds.filter(:a=>1).sql.must_equal "SELECT * FROM table WHERE (a = 1)"
23
- end
24
- end
@@ -1,57 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::SplitValues" do
4
- before do
5
- @c = Class.new(Sequel::Model(:a))
6
- @c.columns :id, :x
7
- @c.plugin :split_values
8
- end
9
-
10
- it "stores non-columns in a separate hash" do
11
- @c.dataset = @c.dataset.with_fetch(:id=>1, :x=>2, :y=>3)
12
- o = @c.first
13
- @c.db.reset
14
-
15
- o.must_equal @c.load(:id=>1, :x=>2)
16
- o[:id].must_equal 1
17
- o[:x].must_equal 2
18
- o[:y].must_equal 3
19
- {@c.load(:id=>1, :x=>2)=>4}[o].must_equal 4
20
- o.values.must_equal(:id=>1, :x=>2)
21
-
22
- o.save
23
- @c.db.sqls.must_equal ["UPDATE a SET x = 2 WHERE (id = 1)"]
24
- end
25
-
26
- it "handles false values" do
27
- @c.dataset = @c.dataset.with_fetch(:id=>1, :x=>false, :y=>3)
28
- o = @c.first
29
- @c.db.reset
30
-
31
- o.must_equal @c.load(:id=>1, :x=>false)
32
- o[:id].must_equal 1
33
- o[:x].must_equal false
34
- o[:y].must_equal 3
35
- {@c.load(:id=>1, :x=>false)=>4}[o].must_equal 4
36
- o.values.must_equal(:id=>1, :x=>false)
37
-
38
- o.save
39
- @c.db.sqls.must_equal ["UPDATE a SET x = 'f' WHERE (id = 1)"]
40
- end
41
-
42
- it "handles nil values" do
43
- @c.dataset = @c.dataset.with_fetch(:id=>1, :x=>nil, :y=>3)
44
- o = @c.first
45
- @c.db.reset
46
-
47
- o.must_equal @c.load(:id=>1, :x=>nil)
48
- o[:id].must_equal 1
49
- o[:x].must_be_nil
50
- o[:y].must_equal 3
51
- {@c.load(:id=>1, :x=>nil)=>4}[o].must_equal 4
52
- o.values.must_equal(:id=>1, :x=>nil)
53
-
54
- o.save
55
- @c.db.sqls.must_equal ["UPDATE a SET x = NULL WHERE (id = 1)"]
56
- end
57
- end
@@ -1,33 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "sql_comments extension" do
4
- before do
5
- @ds = Sequel.mock[:t].extension(:sql_comments)
6
- end
7
-
8
- it "should not add a comment if one is not set for the dataset" do
9
- @ds.select_sql.must_equal 'SELECT * FROM t'
10
- @ds.insert_sql(:a=>1).must_equal 'INSERT INTO t (a) VALUES (1)'
11
- @ds.delete_sql.must_equal 'DELETE FROM t'
12
- @ds.update_sql(:a=>1).must_equal 'UPDATE t SET a = 1'
13
- end
14
-
15
- it "should add a comment if one is set for the dataset" do
16
- ds = @ds.comment("Some\nComment\r\n Here")
17
- ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
18
- ds.insert_sql(:a=>1).must_equal "INSERT INTO t (a) VALUES (1) -- Some Comment Here\n"
19
- ds.delete_sql.must_equal "DELETE FROM t -- Some Comment Here\n"
20
- ds.update_sql(:a=>1).must_equal "UPDATE t SET a = 1 -- Some Comment Here\n"
21
- end
22
-
23
- it "should handle comments used in nested datasets" do
24
- ds = @ds.comment("Some\nComment\r\n Here")
25
- ds.where(:id=>ds).select_sql.must_equal "SELECT * FROM t WHERE (id IN (SELECT * FROM t -- Some Comment Here\n)) -- Some Comment Here\n"
26
- end
27
-
28
- it "should handle frozen SQL strings" do
29
- @ds = Sequel.mock[:t].with_extend{def select_sql; super.freeze; end}.extension(:sql_comments)
30
- ds = @ds.comment("Some\nComment\r\n Here")
31
- ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
32
- end
33
- end
@@ -1,59 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :sql_expr
4
-
5
- describe "Sequel sql_expr extension" do
6
- before do
7
- @ds = Sequel.mock.dataset
8
- end
9
-
10
- it "Object#sql_expr should wrap the object in a GenericComplexExpression" do
11
- o = Object.new
12
- def o.sql_literal(ds) 'foo' end
13
- s = o.sql_expr
14
- @ds.literal(s).must_equal "foo"
15
- @ds.literal(s+1).must_equal "(foo + 1)"
16
- @ds.literal(s & true).must_equal "(foo AND 't')"
17
- @ds.literal(s < 1).must_equal "(foo < 1)"
18
- @ds.literal(s.sql_subscript(1)).must_equal "(foo)[1]"
19
- @ds.literal(s.like('a')).must_equal "(foo LIKE 'a' ESCAPE '\\')"
20
- @ds.literal(s.as(:a)).must_equal "foo AS a"
21
- @ds.literal(s.cast(Integer)).must_equal "CAST(foo AS integer)"
22
- @ds.literal(s.desc).must_equal "foo DESC"
23
- @ds.literal(s.sql_string + '1').must_equal "(foo || '1')"
24
- end
25
-
26
- it "Numeric#sql_expr should wrap the object in a NumericExpression" do
27
- [1, 2.0, 2^70, BigDecimal('1.0')].each do |o|
28
- @ds.literal(o.sql_expr).must_equal @ds.literal(o)
29
- @ds.literal(o.sql_expr + 1).must_equal "(#{@ds.literal(o)} + 1)"
30
- end
31
- end
32
-
33
- it "String#sql_expr should wrap the object in a StringExpression" do
34
- @ds.literal("".sql_expr).must_equal "''"
35
- @ds.literal("".sql_expr + :a).must_equal "('' || a)"
36
- end
37
-
38
- it "NilClass, TrueClass, and FalseClass#sql_expr should wrap the object in a BooleanExpression" do
39
- [nil, true, false].each do |o|
40
- @ds.literal(o.sql_expr).must_equal @ds.literal(o)
41
- @ds.literal(o.sql_expr & :a).must_equal "(#{@ds.literal(o)} AND a)"
42
- end
43
- end
44
-
45
- it "Proc#sql_expr should should treat the object as a virtual row block" do
46
- @ds.literal(proc{a}.sql_expr).must_equal "a"
47
- @ds.literal(proc{a(b)}.sql_expr).must_equal "a(b)"
48
- end
49
-
50
- it "Proc#sql_expr should should wrap the object in a GenericComplexExpression if the object is not already an expression" do
51
- @ds.literal(proc{1}.sql_expr).must_equal "1"
52
- @ds.literal(proc{1}.sql_expr + 2).must_equal "(1 + 2)"
53
- end
54
-
55
- it "Proc#sql_expr should should convert a hash or array of two element arrays to a BooleanExpression" do
56
- @ds.literal(proc{{a=>b}}.sql_expr).must_equal "(a = b)"
57
- @ds.literal(proc{[[a, b]]}.sql_expr & :a).must_equal "((a = b) AND a)"
58
- end
59
- end