sequel 4.36.0 → 5.61.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 (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -1,22 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "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,17 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "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.db.reset
8
- c.instance_dataset.meta_def(:insert){|*a| super(*a); 2}
9
- c.create(:x=>1)
10
- c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE (id = 2) LIMIT 1']
11
-
12
- c.plugin :skip_create_refresh
13
- c.db.reset
14
- c.create(:x=>3).values.must_equal(:id=>2, :x=>3)
15
- c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (3)']
16
- end
17
- end
@@ -1,71 +0,0 @@
1
- require 'rubygems'
2
-
3
- if ENV['COVERAGE']
4
- require File.join(File.dirname(File.expand_path(__FILE__)), "../sequel_coverage")
5
- SimpleCov.sequel_coverage(:filter=>%r{lib/sequel/(extensions|plugins)/\w+\.rb\z})
6
- end
7
-
8
- gem 'minitest'
9
- require 'minitest/autorun'
10
- require 'minitest/hooks/default'
11
- require 'minitest/shared_description'
12
-
13
- unless Object.const_defined?('Sequel') && Sequel.const_defined?('Model')
14
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
15
- require 'sequel'
16
- end
17
- Sequel::Deprecation.backtrace_filter = lambda{|line, lineno| lineno < 4 || line =~ /_spec\.rb/}
18
- SEQUEL_EXTENSIONS_NO_DEPRECATION_WARNING = true
19
-
20
- begin
21
- # Attempt to load ActiveSupport blank extension and inflector first, so Sequel
22
- # can override them.
23
- require 'active_support/core_ext/object/blank'
24
- require 'active_support/inflector'
25
- require 'active_support/core_ext/string/inflections'
26
- rescue LoadError
27
- nil
28
- end
29
-
30
- Sequel.extension :meta_def
31
- Sequel.extension :core_refinements if RUBY_VERSION >= '2.0.0' && RUBY_ENGINE == 'ruby'
32
-
33
- def skip_warn(s)
34
- warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
35
- end
36
-
37
- Sequel.quote_identifiers = false
38
- Sequel.identifier_input_method = nil
39
- Sequel.identifier_output_method = nil
40
-
41
- class << Sequel::Model
42
- attr_writer :db_schema
43
- alias orig_columns columns
44
- def columns(*cols)
45
- return super if cols.empty?
46
- define_method(:columns){cols}
47
- @dataset.instance_variable_set(:@columns, cols) if @dataset
48
- def_column_accessor(*cols)
49
- @columns = cols
50
- @db_schema = {}
51
- cols.each{|c| @db_schema[c] = {}}
52
- end
53
- end
54
-
55
- Sequel::Model.use_transactions = false
56
- Sequel.cache_anonymous_models = false
57
-
58
- db = Sequel.mock(:fetch=>{:id => 1, :x => 1}, :numrows=>1, :autoid=>proc{|sql| 10})
59
- def db.schema(*) [[:id, {:primary_key=>true}]] end
60
- def db.reset() sqls end
61
- def db.supports_schema_parsing?() true end
62
- Sequel::Model.db = DB = db
63
-
64
- if ENV['SEQUEL_COLUMNS_INTROSPECTION']
65
- Sequel.extension :columns_introspection
66
- Sequel::Database.extension :columns_introspection
67
- Sequel::Mock::Dataset.send(:include, Sequel::ColumnsIntrospection)
68
- end
69
- if ENV['SEQUEL_NO_CACHE_ASSOCIATIONS']
70
- Sequel::Model.cache_associations = false
71
- end
@@ -1,24 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), '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,22 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Plugins::SplitValues" 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.plugin :split_values
8
- c.dataset._fetch = {:id=>1, :x=>2, :y=>3}
9
- o = c.first
10
- c.db.reset
11
-
12
- o.must_equal c.load(:id=>1, :x=>2)
13
- o[:id].must_equal 1
14
- o[:x].must_equal 2
15
- o[:y].must_equal 3
16
- {c.load(:id=>1, :x=>2)=>4}[o].must_equal 4
17
- o.values.must_equal(:id=>1, :x=>2)
18
-
19
- o.save
20
- c.db.sqls.must_equal ["UPDATE a SET x = 2 WHERE (id = 1)"]
21
- end
22
- end
@@ -1,27 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "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
- end
@@ -1,60 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), '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.new('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
- @ds.literal(proc{a(b)}.sql_expr).must_equal "a(b)"
49
- end
50
-
51
- it "Proc#sql_expr should should wrap the object in a GenericComplexExpression if the object is not already an expression" do
52
- @ds.literal(proc{1}.sql_expr).must_equal "1"
53
- @ds.literal(proc{1}.sql_expr + 2).must_equal "(1 + 2)"
54
- end
55
-
56
- it "Proc#sql_expr should should convert a hash or array of two element arrays to a BooleanExpression" do
57
- @ds.literal(proc{{a=>b}}.sql_expr).must_equal "(a = b)"
58
- @ds.literal(proc{[[a, b]]}.sql_expr & :a).must_equal "((a = b) AND a)"
59
- end
60
- end
@@ -1,361 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Plugins::StaticCache" do
4
- before do
5
- @db = Sequel.mock
6
- @db.fetch = [{:id=>1}, {:id=>2}]
7
- @db.numrows = 1
8
- @c = Class.new(Sequel::Model(@db[:t]))
9
- @c.columns :id, :name
10
- end
11
-
12
- it "should not attempt to validate objects" do
13
- @c.send(:define_method, :validate){errors.add(:name, 'bad')}
14
- @c.plugin(:static_cache)
15
- @c.map{|o| o.valid?}.must_equal [true, true]
16
- end
17
-
18
- static_cache_specs = shared_description do
19
- it "should use a ruby hash as a cache of all model instances" do
20
- @c.cache.must_equal(1=>@c.load(:id=>1), 2=>@c.load(:id=>2))
21
- @c.cache[1].must_be_same_as(@c1)
22
- @c.cache[2].must_be_same_as(@c2)
23
- end
24
-
25
- it "should make .[] method with primary key use the cache" do
26
- @c[1].must_equal @c1
27
- @c[2].must_equal @c2
28
- @c[3].must_equal nil
29
- @c[[1, 2]].must_equal nil
30
- @c[nil].must_equal nil
31
- @c[].must_equal nil
32
- @db.sqls.must_equal []
33
- end
34
-
35
- it "should have .[] with a hash not use the cache" do
36
- @db.fetch = {:id=>2}
37
- @c[:id=>2].must_equal @c2
38
- @db.sqls.must_equal ['SELECT * FROM t WHERE (id = 2) LIMIT 1']
39
- end
40
-
41
- it "should support cache_get_pk" do
42
- @c.cache_get_pk(1).must_equal @c1
43
- @c.cache_get_pk(2).must_equal @c2
44
- @c.cache_get_pk(3).must_equal nil
45
- @db.sqls.must_equal []
46
- end
47
-
48
- it "should have each just iterate over the hash's values without sending a query" do
49
- a = []
50
- @c.each{|o| a << o}
51
- a = a.sort_by{|o| o.id}
52
- a.first.must_equal @c1
53
- a.last.must_equal @c2
54
- @db.sqls.must_equal []
55
- end
56
-
57
- it "should have map just iterate over the hash's values without sending a query if no argument is given" do
58
- @c.map{|v| v.id}.sort.must_equal [1, 2]
59
- @db.sqls.must_equal []
60
- end
61
-
62
- it "should have count with no argument or block not issue a query" do
63
- @c.count.must_equal 2
64
- @db.sqls.must_equal []
65
- end
66
-
67
- it "should have count with argument or block not issue a query" do
68
- @db.fetch = [[{:count=>1}], [{:count=>2}]]
69
- @c.count(:a).must_equal 1
70
- @c.count{b}.must_equal 2
71
- @db.sqls.must_equal ["SELECT count(a) AS count FROM t LIMIT 1", "SELECT count(b) AS count FROM t LIMIT 1"]
72
- end
73
-
74
- it "should have map not send a query if given an argument" do
75
- @c.map(:id).sort.must_equal [1, 2]
76
- @db.sqls.must_equal []
77
- @c.map([:id,:id]).sort.must_equal [[1,1], [2,2]]
78
- @db.sqls.must_equal []
79
- end
80
-
81
- it "should have map without a block or argument not raise an exception or issue a query" do
82
- @c.map.to_a.must_equal @c.all
83
- @db.sqls.must_equal []
84
- end
85
-
86
- it "should have map without a block not return a frozen object" do
87
- @c.map.frozen?.must_equal false
88
- end
89
-
90
- it "should have map with a block and argument raise" do
91
- proc{@c.map(:id){}}.must_raise(Sequel::Error)
92
- end
93
-
94
- it "should have other enumerable methods work without sending a query" do
95
- a = @c.sort_by{|o| o.id}
96
- a.first.must_equal @c1
97
- a.last.must_equal @c2
98
- @db.sqls.must_equal []
99
- end
100
-
101
- it "should have all return all objects" do
102
- a = @c.all.sort_by{|o| o.id}
103
- a.first.must_equal @c1
104
- a.last.must_equal @c2
105
- @db.sqls.must_equal []
106
- end
107
-
108
- it "should have all not return a frozen object" do
109
- @c.all.frozen?.must_equal false
110
- end
111
-
112
- it "should have all return things in dataset order" do
113
- @c.all.must_equal [@c1, @c2]
114
- end
115
-
116
- it "should have to_hash without arguments run without a query" do
117
- a = @c.to_hash
118
- a.must_equal(1=>@c1, 2=>@c2)
119
- a[1].must_equal @c1
120
- a[2].must_equal @c2
121
- @db.sqls.must_equal []
122
- end
123
-
124
- it "should have to_hash with arguments return results without a query" do
125
- a = @c.to_hash(:id)
126
- a.must_equal(1=>@c1, 2=>@c2)
127
- a[1].must_equal @c1
128
- a[2].must_equal @c2
129
-
130
- a = @c.to_hash([:id])
131
- a.must_equal([1]=>@c1, [2]=>@c2)
132
- a[[1]].must_equal @c1
133
- a[[2]].must_equal @c2
134
-
135
- @c.to_hash(:id, :id).must_equal(1=>1, 2=>2)
136
- @c.to_hash([:id], :id).must_equal([1]=>1, [2]=>2)
137
- @c.to_hash(:id, [:id]).must_equal(1=>[1], 2=>[2])
138
- @c.to_hash([:id], [:id]).must_equal([1]=>[1], [2]=>[2])
139
-
140
- @db.sqls.must_equal []
141
- end
142
-
143
- it "should have to_hash not return a frozen object" do
144
- @c.to_hash.frozen?.must_equal false
145
- end
146
-
147
- it "should have to_hash_groups without arguments return the cached objects without a query" do
148
- a = @c.to_hash_groups(:id)
149
- a.must_equal(1=>[@c1], 2=>[@c2])
150
- a[1].first.must_equal @c1
151
- a[2].first.must_equal @c2
152
-
153
- a = @c.to_hash_groups([:id])
154
- a.must_equal([1]=>[@c1], [2]=>[@c2])
155
- a[[1]].first.must_equal @c1
156
- a[[2]].first.must_equal @c2
157
-
158
- @c.to_hash_groups(:id, :id).must_equal(1=>[1], 2=>[2])
159
- @c.to_hash_groups([:id], :id).must_equal([1]=>[1], [2]=>[2])
160
- @c.to_hash_groups(:id, [:id]).must_equal(1=>[[1]], 2=>[[2]])
161
- @c.to_hash_groups([:id], [:id]).must_equal([1]=>[[1]], [2]=>[[2]])
162
-
163
- @db.sqls.must_equal []
164
- end
165
-
166
- it "subclasses should work correctly" do
167
- c = Class.new(@c)
168
- c.all.must_equal [c.load(:id=>1), c.load(:id=>2)]
169
- c.to_hash.must_equal(1=>c.load(:id=>1), 2=>c.load(:id=>2))
170
- @db.sqls.must_equal ['SELECT * FROM t']
171
- end
172
-
173
- it "set_dataset should work correctly" do
174
- ds = @c.dataset.from(:t2)
175
- ds.instance_variable_set(:@columns, [:id])
176
- ds._fetch = {:id=>3}
177
- @c.dataset = ds
178
- @c.all.must_equal [@c.load(:id=>3)]
179
- @c.to_hash.must_equal(3=>@c.load(:id=>3))
180
- @c.to_hash[3].must_equal @c.all.first
181
- @db.sqls.must_equal ['SELECT * FROM t2']
182
- end
183
- end
184
-
185
- describe "without options" do
186
- before do
187
- @c.plugin :static_cache
188
- @c1 = @c.cache[1]
189
- @c2 = @c.cache[2]
190
- @db.sqls
191
- end
192
-
193
- include static_cache_specs
194
-
195
- it "should work correctly with composite keys" do
196
- @db.fetch = [{:id=>1, :id2=>1}, {:id=>2, :id2=>1}]
197
- @c = Class.new(Sequel::Model(@db[:t]))
198
- @c.columns :id, :id2
199
- @c.set_primary_key([:id, :id2])
200
- @c.plugin :static_cache
201
- @db.sqls
202
- @c1 = @c.cache[[1, 2]]
203
- @c2 = @c.cache[[2, 1]]
204
- @c[[1, 2]].must_be_same_as(@c1)
205
- @c[[2, 1]].must_be_same_as(@c2)
206
- @db.sqls.must_equal []
207
- end
208
-
209
- it "all of the static cache values (model instances) should be frozen" do
210
- @c.all.all?{|o| o.frozen?}.must_equal true
211
- end
212
-
213
- it "should make .[] method with primary key return cached instances" do
214
- @c[1].must_be_same_as(@c1)
215
- @c[2].must_be_same_as(@c2)
216
- end
217
-
218
- it "should have cache_get_pk return cached instances" do
219
- @c.cache_get_pk(1).must_be_same_as(@c1)
220
- @c.cache_get_pk(2).must_be_same_as(@c2)
221
- end
222
-
223
- it "should have each yield cached objects" do
224
- a = []
225
- @c.each{|o| a << o}
226
- a = a.sort_by{|o| o.id}
227
- a.first.must_be_same_as(@c1)
228
- a.last.must_be_same_as(@c2)
229
- end
230
-
231
- it "should have other enumerable methods work yield cached objects" do
232
- a = @c.sort_by{|o| o.id}
233
- a.first.must_be_same_as(@c1)
234
- a.last.must_be_same_as(@c2)
235
- end
236
-
237
- it "should have all return cached instances" do
238
- a = @c.all.sort_by{|o| o.id}
239
- a.first.must_be_same_as(@c1)
240
- a.last.must_be_same_as(@c2)
241
- end
242
-
243
- it "should have to_hash without arguments use cached instances" do
244
- a = @c.to_hash
245
- a[1].must_be_same_as(@c1)
246
- a[2].must_be_same_as(@c2)
247
- end
248
-
249
- it "should have to_hash with arguments return cached instances" do
250
- a = @c.to_hash(:id)
251
- a[1].must_be_same_as(@c1)
252
- a[2].must_be_same_as(@c2)
253
-
254
- a = @c.to_hash([:id])
255
- a[[1]].must_be_same_as(@c1)
256
- a[[2]].must_be_same_as(@c2)
257
- end
258
-
259
- it "should have to_hash_groups without single argument return the cached instances" do
260
- a = @c.to_hash_groups(:id)
261
- a[1].first.must_be_same_as(@c1)
262
- a[2].first.must_be_same_as(@c2)
263
-
264
- a = @c.to_hash_groups([:id])
265
- a[[1]].first.must_be_same_as(@c1)
266
- a[[2]].first.must_be_same_as(@c2)
267
- end
268
-
269
- it "should not allow the saving of new objects" do
270
- proc{@c.create}.must_raise(Sequel::HookFailed)
271
- end
272
-
273
- it "should not allow the saving of existing objects" do
274
- @db.fetch = {:id=>1}
275
- proc{@c.first(:id=>1).save}.must_raise(Sequel::HookFailed)
276
- end
277
-
278
- it "should not allow the destroying of existing objects" do
279
- @db.fetch = {:id=>1}
280
- proc{@c.first(:id=>1).destroy}.must_raise(Sequel::HookFailed)
281
- end
282
- end
283
-
284
- describe "with :frozen=>false option" do
285
- before do
286
- @c.plugin :static_cache, :frozen=>false
287
- @c1 = @c.cache[1]
288
- @c2 = @c.cache[2]
289
- @db.sqls
290
- end
291
-
292
- include static_cache_specs
293
-
294
- it "record retrieved by primary key should not be frozen" do
295
- @c[1].frozen?.must_equal false
296
- @c.cache_get_pk(1).frozen?.must_equal false
297
- end
298
-
299
- it "none of values returned in #all should be frozen" do
300
- @c.all.all?{|o| !o.frozen?}.must_equal true
301
- end
302
-
303
- it "none of values yielded by each should be frozen" do
304
- a = []
305
- @c.each{|o| a << o}
306
- a.all?{|o| !o.frozen?}.must_equal true
307
- end
308
-
309
- it "none of values yielded by Enumerable method should be frozen" do
310
- @c.sort_by{|o| o.id}.all?{|o| !o.frozen?}.must_equal true
311
- end
312
-
313
- it "none of values returned by map without an argument or block should be frozen" do
314
- @c.map{|o| o}.all?{|o| !o.frozen?}.must_equal true
315
- @c.map.all?{|o| !o.frozen?}.must_equal true
316
- end
317
-
318
- it "none of values in the hash returned by to_hash without an argument should be frozen" do
319
- @c.to_hash.values.all?{|o| !o.frozen?}.must_equal true
320
- end
321
-
322
- it "none of values in the hash returned by to_hash with a single argument should be frozen" do
323
- @c.to_hash(:id).values.all?{|o| !o.frozen?}.must_equal true
324
- end
325
-
326
- it "none of values in the hash returned by to_hash with a single array argument should be frozen" do
327
- @c.to_hash([:id, :id]).values.all?{|o| !o.frozen?}.must_equal true
328
- end
329
-
330
- it "none of values in the hash returned by to_hash_groups with a single argument should be frozen" do
331
- @c.to_hash_groups(:id).values.flatten.all?{|o| !o.frozen?}.must_equal true
332
- end
333
-
334
- it "none of values in the hash returned by to_hash_groups with a single array argument should be frozen" do
335
- @c.to_hash_groups([:id, :id]).values.flatten.all?{|o| !o.frozen?}.must_equal true
336
- end
337
-
338
- it "should not automatically update the cache when creating new model objects" do
339
- o = @c.new
340
- o.id = 3
341
- @db.autoid = 3
342
- @db.fetch = [[{:id=>1}, {:id=>2}, {:id=>3}], [{:id=>3}]]
343
- o.save
344
- @c[3].must_equal nil
345
- end
346
-
347
- it "should not automatically update the cache when updating model objects" do
348
- o = @c[2]
349
- @db.fetch = [[{:id=>1}, {:id=>2, :name=>'a'}]]
350
- o.update(:name=>'a')
351
- @c[2].values.must_equal(:id=>2)
352
- end
353
-
354
- it "should not automatically update the cache when updating model objects" do
355
- o = @c[2]
356
- @db.fetch = [[{:id=>1}]]
357
- o.destroy
358
- @c[2].must_equal @c2
359
- end
360
- end
361
- end
@@ -1,85 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
-
4
- describe "string_agg extension" do
5
- dbf = lambda do |db_type|
6
- db = Sequel.connect("mock://#{db_type}")
7
- db.extension :string_agg
8
- db
9
- end
10
-
11
- before(:all) do
12
- Sequel.extension :string_agg
13
- end
14
- before do
15
- @sa1 = Sequel.string_agg(:c)
16
- @sa2 = Sequel.string_agg(:c, '-')
17
- @sa3 = Sequel.string_agg(:c, '-').order(:o)
18
- @sa4 = Sequel.string_agg(:c).order(:o).distinct
19
- end
20
-
21
- it "should use existing method" do
22
- db = Sequel.mock
23
- db.extend_datasets do
24
- def string_agg_sql_append(sql, sa)
25
- sql << "sa(#{sa.expr})"
26
- end
27
- end
28
- db.extension :string_agg
29
- db.literal(Sequel.string_agg(:c)).must_equal "sa(c)"
30
- end
31
-
32
- it "should correctly literalize on Postgres" do
33
- db = dbf.call(:postgres)
34
- db.literal(@sa1).must_equal "string_agg(c, ',')"
35
- db.literal(@sa2).must_equal "string_agg(c, '-')"
36
- db.literal(@sa3).must_equal "string_agg(c, '-' ORDER BY o)"
37
- db.literal(@sa4).must_equal "string_agg(DISTINCT c, ',' ORDER BY o)"
38
- end
39
-
40
- it "should correctly literalize on SQLAnywhere" do
41
- db = dbf.call(:sqlanywhere)
42
- db.literal(@sa1).must_equal "list(c, ',')"
43
- db.literal(@sa2).must_equal "list(c, '-')"
44
- db.literal(@sa3).must_equal "list(c, '-' ORDER BY o)"
45
- db.literal(@sa4).must_equal "list(DISTINCT c, ',' ORDER BY o)"
46
- end
47
-
48
- it "should correctly literalize on MySQL, H2, HSQLDB, CUBRID" do
49
- [:mysql, :h2, :hsqldb, :cubrid].each do |type|
50
- db = dbf.call(type)
51
- db.meta_def(:database_type){type}
52
- db.literal(@sa1).must_equal "GROUP_CONCAT(c SEPARATOR ',')"
53
- db.literal(@sa2).must_equal "GROUP_CONCAT(c SEPARATOR '-')"
54
- db.literal(@sa3).must_equal "GROUP_CONCAT(c ORDER BY o SEPARATOR '-')"
55
- db.literal(@sa4).must_equal "GROUP_CONCAT(DISTINCT c ORDER BY o SEPARATOR ',')"
56
- end
57
- end
58
-
59
- it "should correctly literalize on Oracle and DB2" do
60
- [:oracle, :db2].each do |type|
61
- db = dbf.call(type)
62
- db.literal(@sa1).must_equal "listagg(c, ',') WITHIN GROUP (ORDER BY 1)"
63
- db.literal(@sa2).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY 1)"
64
- db.literal(@sa3).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY o)"
65
- proc{db.literal(@sa4)}.must_raise Sequel::Error
66
- end
67
- end
68
-
69
- it "should handle order without arguments" do
70
- db = dbf.call(:postgres)
71
- db.literal(@sa1.order).must_equal "string_agg(c, ',')"
72
- end
73
-
74
- it "should handle operations on object" do
75
- db = dbf.call(:postgres)
76
- db.literal(@sa1 + 'b').must_equal "(string_agg(c, ',') || 'b')"
77
- db.literal(@sa1.like('b')).must_equal "(string_agg(c, ',') LIKE 'b' ESCAPE '\\')"
78
- db.literal(@sa1 < 'b').must_equal "(string_agg(c, ',') < 'b')"
79
- db.literal(@sa1.as(:b)).must_equal "string_agg(c, ',') AS b"
80
- db.literal(@sa1.cast(:b)).must_equal "CAST(string_agg(c, ',') AS b)"
81
- db.literal(@sa1.desc).must_equal "string_agg(c, ',') DESC"
82
- db.literal(@sa1 =~ /a/).must_equal "(string_agg(c, ',') ~ 'a')"
83
- db.literal(@sa1.sql_subscript(1)).must_equal "string_agg(c, ',')[1]"
84
- end
85
- end