sequel 4.26.0 → 5.37.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 (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  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/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,26 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
-
3
- describe Sequel::Inflections do
4
- before do
5
- @plurals, @singulars, @uncountables = Sequel.inflections.plurals.dup, Sequel.inflections.singulars.dup, Sequel.inflections.uncountables.dup
6
- end
7
- after do
8
- Sequel.inflections.plurals.replace(@plurals)
9
- Sequel.inflections.singulars.replace(@singulars)
10
- Sequel.inflections.uncountables.replace(@uncountables)
11
- end
12
-
13
- it "should be possible to clear the list of singulars, plurals, and uncountables" do
14
- Sequel.inflections.clear(:plurals)
15
- Sequel.inflections.plurals.must_equal []
16
- Sequel.inflections.plural('blah', 'blahs')
17
- Sequel.inflections.clear
18
- Sequel.inflections.plurals.must_equal []
19
- Sequel.inflections.singulars.must_equal []
20
- Sequel.inflections.uncountables.must_equal []
21
- end
22
-
23
- it "should be yielded and returned by Sequel.inflections" do
24
- Sequel.inflections{|i| i.must_equal Sequel::Inflections}.must_equal Sequel::Inflections
25
- end
26
- end
@@ -1,982 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Model()" do
4
- before do
5
- @db = Sequel::Model.db
6
- end
7
-
8
- it "should return a model subclass with the given dataset if given a dataset" do
9
- ds = @db[:blah]
10
- c = Sequel::Model(ds)
11
- c.superclass.must_equal Sequel::Model
12
- c.dataset.must_equal ds
13
- end
14
-
15
- it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
16
- c = Sequel::Model(:blah)
17
- c.superclass.must_equal Sequel::Model
18
- c.db.must_equal @db
19
- c.table_name.must_equal :blah
20
- end
21
-
22
- it "should return a model subclass with a dataset with the default database and given table name if given a LiteralString" do
23
- c = Sequel::Model(Sequel.lit('blah'))
24
- c.superclass.must_equal Sequel::Model
25
- c.db.must_equal @db
26
- c.table_name.must_equal Sequel.lit('blah')
27
- end
28
-
29
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::Identifier" do
30
- c = Sequel::Model(Sequel.identifier(:blah))
31
- c.superclass.must_equal Sequel::Model
32
- c.db.must_equal @db
33
- c.table_name.must_equal Sequel.identifier(:blah)
34
- end
35
-
36
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::QualifiedIdentifier" do
37
- c = Sequel::Model(Sequel.qualify(:boo, :blah))
38
- c.superclass.must_equal Sequel::Model
39
- c.db.must_equal @db
40
- c.table_name.must_equal Sequel.qualify(:boo, :blah)
41
- end
42
-
43
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::AliasedExpression" do
44
- c = Sequel::Model(Sequel.as(:blah, :boo))
45
- c.superclass.must_equal Sequel::Model
46
- c.db.must_equal @db
47
- c.table_name.must_equal :boo
48
- end
49
-
50
- it "should return a model subclass with the given dataset if given a dataset using an SQL::Identifier" do
51
- ds = @db[Sequel.identifier(:blah)]
52
- c = Sequel::Model(ds)
53
- c.superclass.must_equal Sequel::Model
54
- c.dataset.must_equal ds
55
- end
56
-
57
- it "should return a model subclass associated to the given database if given a database" do
58
- db = Sequel.mock
59
- c = Sequel::Model(db)
60
- c.superclass.must_equal Sequel::Model
61
- c.db.must_equal db
62
- proc{c.dataset}.must_raise(Sequel::Error)
63
- class SmBlahTest < c
64
- end
65
- SmBlahTest.db.must_equal db
66
- SmBlahTest.table_name.must_equal :sm_blah_tests
67
- end
68
-
69
- describe "reloading" do
70
- before do
71
- Sequel.cache_anonymous_models = true
72
- end
73
- after do
74
- Sequel.cache_anonymous_models = false
75
- Object.send(:remove_const, :Album) if defined?(::Album)
76
- end
77
-
78
- it "should work without raising an exception with a symbol" do
79
- class ::Album < Sequel::Model(:table); end
80
- class ::Album < Sequel::Model(:table); end
81
- end
82
-
83
- it "should work without raising an exception with an SQL::Identifier " do
84
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
85
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
86
- end
87
-
88
- it "should work without raising an exception with an SQL::QualifiedIdentifier " do
89
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
90
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
91
- end
92
-
93
- it "should work without raising an exception with an SQL::AliasedExpression" do
94
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
95
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
96
- end
97
-
98
- it "should work without raising an exception with an LiteralString" do
99
- class ::Album < Sequel::Model(Sequel.lit('table')); end
100
- class ::Album < Sequel::Model(Sequel.lit('table')); end
101
- end
102
-
103
- it "should work without raising an exception with a database" do
104
- class ::Album < Sequel::Model(@db); end
105
- class ::Album < Sequel::Model(@db); end
106
- end
107
-
108
- it "should work without raising an exception with a dataset" do
109
- class ::Album < Sequel::Model(@db[:table]); end
110
- class ::Album < Sequel::Model(@db[:table]); end
111
- end
112
-
113
- it "should work without raising an exception with a dataset with an SQL::Identifier" do
114
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
115
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
116
- end
117
-
118
- it "should raise an exception if anonymous model caching is disabled" do
119
- Sequel.cache_anonymous_models = false
120
- proc do
121
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
122
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
123
- end.must_raise TypeError
124
- end
125
- end
126
- end
127
-
128
- describe Sequel::Model do
129
- it "should have class method aliased as model" do
130
- Sequel::Model.instance_methods.collect{|x| x.to_s}.must_include("model")
131
-
132
- model_a = Class.new(Sequel::Model(:items))
133
- model_a.new.model.wont_be_nil
134
- end
135
-
136
- it "should be associated with a dataset" do
137
- model_a = Class.new(Sequel::Model) { set_dataset DB[:as] }
138
-
139
- model_a.dataset.must_be_kind_of(Sequel::Mock::Dataset)
140
- model_a.dataset.opts[:from].must_equal [:as]
141
-
142
- model_b = Class.new(Sequel::Model) { set_dataset DB[:bs] }
143
-
144
- model_b.dataset.must_be_kind_of(Sequel::Mock::Dataset)
145
- model_b.dataset.opts[:from].must_equal [:bs]
146
-
147
- model_a.dataset.opts[:from].must_equal [:as]
148
- end
149
- end
150
-
151
- describe Sequel::Model do
152
- before do
153
- @model = Class.new(Sequel::Model(:items))
154
- end
155
-
156
- it "has table_name return name of table" do
157
- @model.table_name.must_equal :items
158
- end
159
-
160
- it "defaults to primary key of id" do
161
- @model.primary_key.must_equal :id
162
- end
163
-
164
- it "allow primary key change" do
165
- @model.set_primary_key :ssn
166
- @model.primary_key.must_equal :ssn
167
- end
168
-
169
- it "allows dataset change" do
170
- @model.set_dataset(DB[:foo])
171
- @model.table_name.must_equal :foo
172
- end
173
-
174
- it "allows set_dataset to accept a Symbol" do
175
- @model.db = DB
176
- @model.set_dataset(:foo)
177
- @model.table_name.must_equal :foo
178
- end
179
-
180
- it "allows set_dataset to accept a LiteralString" do
181
- @model.db = DB
182
- @model.set_dataset(Sequel.lit('foo'))
183
- @model.table_name.must_equal Sequel.lit('foo')
184
- end
185
-
186
- it "allows set_dataset to acceptan SQL::Identifier" do
187
- @model.db = DB
188
- @model.set_dataset(Sequel.identifier(:foo))
189
- @model.table_name.must_equal Sequel.identifier(:foo)
190
- end
191
-
192
- it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
193
- @model.db = DB
194
- @model.set_dataset(Sequel.qualify(:bar, :foo))
195
- @model.table_name.must_equal Sequel.qualify(:bar, :foo)
196
- end
197
-
198
- it "allows set_dataset to acceptan SQL::AliasedExpression" do
199
- @model.db = DB
200
- @model.set_dataset(Sequel.as(:foo, :bar))
201
- @model.table_name.must_equal :bar
202
- end
203
-
204
- it "table_name should respect table aliases" do
205
- @model.set_dataset(:foo___x)
206
- @model.table_name.must_equal :x
207
- end
208
-
209
- it "set_dataset should raise an error unless given a Symbol or Dataset" do
210
- proc{@model.set_dataset(Object.new)}.must_raise(Sequel::Error)
211
- end
212
-
213
- it "set_dataset should add the destroy method to the dataset that destroys each object" do
214
- ds = DB[:foo]
215
- ds.wont_respond_to(:destroy)
216
- @model.set_dataset(ds)
217
- ds.must_respond_to(:destroy)
218
- DB.sqls
219
- ds._fetch = [{:id=>1}, {:id=>2}]
220
- ds.destroy.must_equal 2
221
- DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
222
- end
223
-
224
- it "set_dataset should add the destroy method that respects sharding with transactions" do
225
- db = Sequel.mock(:servers=>{:s1=>{}})
226
- ds = db[:foo].server(:s1)
227
- @model.use_transactions = true
228
- @model.set_dataset(ds)
229
- db.sqls
230
- ds.destroy.must_equal 0
231
- db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
232
- end
233
-
234
- it "should raise an error on set_dataset if there is an error connecting to the database" do
235
- def @model.columns() raise Sequel::DatabaseConnectionError end
236
- proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah))}.must_raise Sequel::DatabaseConnectionError
237
- end
238
-
239
- it "should not raise an error if there is a problem getting the columns for a dataset" do
240
- def @model.columns() raise Sequel::Error end
241
- @model.set_dataset(DB[:foo].join(:blah))
242
- end
243
-
244
- it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
245
- def @model.get_db_schema(*) raise Sequel::Error end
246
- @model.set_dataset(DB[:foo])
247
- end
248
-
249
- it "reload_db_schema? should be false by default" do
250
- c = Class.new
251
- c.extend Sequel::Model::ClassMethods
252
- c.send(:reload_db_schema?).must_equal false
253
- end
254
-
255
- it "doesn't raise an error on inherited if there is an error setting the dataset" do
256
- def @model.set_dataset(*) raise Sequel::Error end
257
- Class.new(@model)
258
- end
259
-
260
- it "should raise if bad inherited instance variable value is used" do
261
- def @model.inherited_instance_variables() super.merge(:@a=>:foo) end
262
- @model.instance_eval{@a=1}
263
- proc{Class.new(@model)}.must_raise(Sequel::Error)
264
- end
265
-
266
- it "copy inherited instance variables into subclass if set" do
267
- def @model.inherited_instance_variables() super.merge(:@a=>nil, :@b=>:dup, :@c=>:hash_dup, :@d=>proc{|v| v * 2}) end
268
- @model.instance_eval{@a=1; @b=[2]; @c={3=>[4]}; @d=10}
269
- m = Class.new(@model)
270
- @model.instance_eval{@a=5; @b << 6; @c[3] << 7; @c[8] = [9]; @d=40}
271
- m.instance_eval do
272
- @a.must_equal 1
273
- @b.must_equal [2]
274
- @c.must_equal(3=>[4])
275
- @d.must_equal 20
276
- end
277
- end
278
- end
279
-
280
- describe Sequel::Model, "constructors" do
281
- before do
282
- @m = Class.new(Sequel::Model)
283
- @m.columns :a, :b
284
- end
285
-
286
- it "should accept a hash" do
287
- m = @m.new(:a => 1, :b => 2)
288
- m.values.must_equal(:a => 1, :b => 2)
289
- m.must_be :new?
290
- end
291
-
292
- it "should accept a block and yield itself to the block" do
293
- block_called = false
294
- m = @m.new {|i| block_called = true; i.must_be_kind_of(@m); i.values[:a] = 1}
295
-
296
- block_called.must_equal true
297
- m.values[:a].must_equal 1
298
- end
299
-
300
- it "should have dataset row_proc create an existing object" do
301
- @m.dataset = Sequel.mock.dataset
302
- o = @m.dataset.row_proc.call(:a=>1)
303
- o.must_be_kind_of(@m)
304
- o.values.must_equal(:a=>1)
305
- o.new?.must_equal false
306
- end
307
-
308
- it "should have .call create an existing object" do
309
- o = @m.call(:a=>1)
310
- o.must_be_kind_of(@m)
311
- o.values.must_equal(:a=>1)
312
- o.new?.must_equal false
313
- end
314
-
315
- it "should have .load create an existing object" do
316
- o = @m.load(:a=>1)
317
- o.must_be_kind_of(@m)
318
- o.values.must_equal(:a=>1)
319
- o.new?.must_equal false
320
- end
321
- end
322
-
323
- describe Sequel::Model, "new" do
324
- before do
325
- @m = Class.new(Sequel::Model) do
326
- set_dataset DB[:items]
327
- columns :x, :id
328
- end
329
- end
330
-
331
- it "should be marked as new?" do
332
- o = @m.new
333
- o.must_be :new?
334
- end
335
-
336
- it "should not be marked as new? once it is saved" do
337
- o = @m.new(:x => 1)
338
- o.must_be :new?
339
- o.save
340
- o.wont_be :new?
341
- end
342
-
343
- it "should use the last inserted id as primary key if not in values" do
344
- @m.instance_dataset._fetch = @m.dataset._fetch = {:x => 1, :id => 1234}
345
- @m.instance_dataset.autoid = @m.dataset.autoid = 1234
346
-
347
- o = @m.new(:x => 1)
348
- o.save
349
- o.id.must_equal 1234
350
-
351
- o = @m.load(:x => 1, :id => 333)
352
- o.save
353
- o.id.must_equal 333
354
- end
355
- end
356
-
357
- describe Sequel::Model, ".subset" do
358
- before do
359
- @c = Class.new(Sequel::Model(:items))
360
- DB.reset
361
- end
362
-
363
- it "should create a filter on the underlying dataset" do
364
- proc {@c.new_only}.must_raise(NoMethodError)
365
-
366
- @c.subset(:new_only){age < 'new'}
367
-
368
- @c.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
369
- @c.dataset.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
370
-
371
- @c.subset(:pricey){price > 100}
372
-
373
- @c.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
374
- @c.dataset.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
375
-
376
- @c.pricey.new_only.sql.must_equal "SELECT * FROM items WHERE ((price > 100) AND (age < 'new'))"
377
- @c.new_only.pricey.sql.must_equal "SELECT * FROM items WHERE ((age < 'new') AND (price > 100))"
378
- end
379
-
380
- it "should not override existing model methods" do
381
- def @c.active() true end
382
- @c.subset(:active, :active)
383
- @c.active.must_equal true
384
- end
385
- end
386
-
387
- describe Sequel::Model, ".find" do
388
- before do
389
- @c = Class.new(Sequel::Model(:items))
390
- @c.dataset._fetch = {:name => 'sharon', :id => 1}
391
- DB.reset
392
- end
393
-
394
- it "should return the first record matching the given filter" do
395
- @c.find(:name => 'sharon').must_be_kind_of(@c)
396
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
397
-
398
- @c.find(Sequel.expr(:name).like('abc%')).must_be_kind_of(@c)
399
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name LIKE 'abc%' ESCAPE '\\') LIMIT 1"]
400
- end
401
-
402
- it "should accept filter blocks" do
403
- @c.find{id > 1}.must_be_kind_of(@c)
404
- DB.sqls.must_equal ["SELECT * FROM items WHERE (id > 1) LIMIT 1"]
405
-
406
- @c.find{(x > 1) & (y < 2)}.must_be_kind_of(@c)
407
- DB.sqls.must_equal ["SELECT * FROM items WHERE ((x > 1) AND (y < 2)) LIMIT 1"]
408
- end
409
- end
410
-
411
- describe Sequel::Model, ".finder" do
412
- before do
413
- @h = {:id=>1}
414
- @db = Sequel.mock(:fetch=>@h)
415
- @c = Class.new(Sequel::Model(@db[:items]))
416
- @c.instance_eval do
417
- def foo(a, b)
418
- where(:bar=>a).order(b)
419
- end
420
- end
421
- @o = @c.load(@h)
422
- @db.sqls
423
- end
424
-
425
- it "should create a method that calls the method given and returns the first instance" do
426
- @c.finder :foo
427
- @c.first_foo(1, 2).must_equal @o
428
- @c.first_foo(3, 4).must_equal @o
429
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
430
- end
431
-
432
- it "should work correctly when subclassing" do
433
- @c.finder(:foo)
434
- @sc = Class.new(@c)
435
- @sc.set_dataset :foos
436
- @db.sqls
437
- @sc.first_foo(1, 2).must_equal @sc.load(@h)
438
- @sc.first_foo(3, 4).must_equal @sc.load(@h)
439
- @db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
440
- end
441
-
442
- it "should work correctly when dataset is modified" do
443
- @c.finder(:foo)
444
- @c.first_foo(1, 2).must_equal @o
445
- @c.set_dataset :foos
446
- @c.first_foo(3, 4).must_equal @o
447
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
448
- end
449
-
450
- it "should create a method based on the given block if no method symbol provided" do
451
- @c.finder(:name=>:first_foo){|pl, ds| ds.where(pl.arg).limit(1)}
452
- @c.first_foo(:id=>1).must_equal @o
453
- @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1"]
454
- end
455
-
456
- it "should raise an error if both a block and method symbol given" do
457
- proc{@c.finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
458
- end
459
-
460
- it "should raise an error if two option hashes are provided" do
461
- proc{@c.finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
462
- end
463
-
464
- it "should support :type option" do
465
- @c.finder :foo, :type=>:all
466
- @c.finder :foo, :type=>:each
467
- @c.finder :foo, :type=>:get
468
-
469
- a = []
470
- @c.all_foo(1, 2){|r| a << r}.must_equal [@o]
471
- a.must_equal [@o]
472
-
473
- a = []
474
- @c.each_foo(3, 4){|r| a << r}
475
- a.must_equal [@o]
476
-
477
- @c.get_foo(5, 6).must_equal [:id, 1]
478
-
479
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4", "SELECT * FROM items WHERE (bar = 5) ORDER BY 6 LIMIT 1"]
480
- end
481
-
482
- it "should support :name option" do
483
- @c.finder :foo, :name=>:find_foo
484
- @c.find_foo(1, 2).must_equal @o
485
- @c.find_foo(3, 4).must_equal @o
486
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
487
- end
488
-
489
- it "should support :arity option" do
490
- def @c.foobar(*b)
491
- ds = dataset
492
- b.each_with_index do |a, i|
493
- ds = ds.where(i=>a)
494
- end
495
- ds
496
- end
497
- @c.finder :foobar, :arity=>1, :name=>:find_foobar_1
498
- @c.finder :foobar, :arity=>2, :name=>:find_foobar_2
499
- @c.find_foobar_1(:a)
500
- @c.find_foobar_2(:a, :b)
501
- @db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1"]
502
- end
503
-
504
- it "should support :mod option" do
505
- m = Module.new
506
- @c.finder :foo, :mod=>m
507
- proc{@c.first_foo}.must_raise NoMethodError
508
- @c.extend m
509
- @c.first_foo(1, 2).must_equal @o
510
- @c.first_foo(3, 4).must_equal @o
511
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1"]
512
- end
513
-
514
- it "should raise error when calling with the wrong arity" do
515
- @c.finder :foo
516
- proc{@c.first_foo(1)}.must_raise Sequel::Error
517
- proc{@c.first_foo(1,2,3)}.must_raise Sequel::Error
518
- end
519
- end
520
-
521
- describe Sequel::Model, ".prepared_finder" do
522
- before do
523
- @h = {:id=>1}
524
- @db = Sequel.mock(:fetch=>@h)
525
- @db.extend_datasets do
526
- def select_sql
527
- sql = super
528
- sql << ' -- prepared' if is_a?(Sequel::Dataset::PreparedStatementMethods)
529
- sql
530
- end
531
- end
532
- @c = Class.new(Sequel::Model(@db[:items]))
533
- @c.instance_eval do
534
- def foo(a, b)
535
- where(:bar=>a).order(b)
536
- end
537
- end
538
- @o = @c.load(@h)
539
- @db.sqls
540
- end
541
-
542
- it "should create a method that calls the method given and returns the first instance" do
543
- @c.prepared_finder :foo
544
- @c.first_foo(1, 2).must_equal @o
545
- @c.first_foo(3, 4).must_equal @o
546
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
547
- end
548
-
549
- it "should work correctly when subclassing" do
550
- @c.prepared_finder(:foo)
551
- @sc = Class.new(@c)
552
- @sc.set_dataset :foos
553
- @db.sqls
554
- @sc.first_foo(1, 2).must_equal @sc.load(@h)
555
- @sc.first_foo(3, 4).must_equal @sc.load(@h)
556
- @db.sqls.must_equal ["SELECT * FROM foos WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
557
- end
558
-
559
- it "should work correctly when dataset is modified" do
560
- @c.prepared_finder(:foo)
561
- @c.first_foo(1, 2).must_equal @o
562
- @c.set_dataset :foos
563
- @c.first_foo(3, 4).must_equal @o
564
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM foos LIMIT 1", "SELECT * FROM foos WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
565
- end
566
-
567
- it "should create a method based on the given block if no method symbol provided" do
568
- @c.prepared_finder(:name=>:first_foo){|a1| where(:id=>a1).limit(1)}
569
- @c.first_foo(1).must_equal @o
570
- @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1) LIMIT 1 -- prepared"]
571
- end
572
-
573
- it "should raise an error if both a block and method symbol given" do
574
- proc{@c.prepared_finder(:foo, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
575
- end
576
-
577
- it "should raise an error if two option hashes are provided" do
578
- proc{@c.prepared_finder({:name2=>:foo}, :name=>:first_foo){|pl, ds| ds.where(pl.arg)}}.must_raise(Sequel::Error)
579
- end
580
-
581
- it "should support :type option" do
582
- @c.prepared_finder :foo, :type=>:all
583
- @c.prepared_finder :foo, :type=>:each
584
-
585
- a = []
586
- @c.all_foo(1, 2){|r| a << r}.must_equal [@o]
587
- a.must_equal [@o]
588
-
589
- a = []
590
- @c.each_foo(3, 4){|r| a << r}
591
- a.must_equal [@o]
592
-
593
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 -- prepared"]
594
- end
595
-
596
- it "should support :name option" do
597
- @c.prepared_finder :foo, :name=>:find_foo
598
- @c.find_foo(1, 2).must_equal @o
599
- @c.find_foo(3, 4).must_equal @o
600
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
601
- end
602
-
603
- it "should support :arity option" do
604
- def @c.foobar(*b)
605
- ds = dataset
606
- b.each_with_index do |a, i|
607
- ds = ds.where(i=>a)
608
- end
609
- ds
610
- end
611
- @c.prepared_finder :foobar, :arity=>1, :name=>:find_foobar_1
612
- @c.prepared_finder :foobar, :arity=>2, :name=>:find_foobar_2
613
- @c.find_foobar_1(:a)
614
- @c.find_foobar_2(:a, :b)
615
- @db.sqls.must_equal ["SELECT * FROM items WHERE (0 = a) LIMIT 1 -- prepared", "SELECT * FROM items WHERE ((0 = a) AND (1 = b)) LIMIT 1 -- prepared"]
616
- end
617
-
618
- it "should support :mod option" do
619
- m = Module.new
620
- @c.prepared_finder :foo, :mod=>m
621
- proc{@c.first_foo}.must_raise NoMethodError
622
- @c.extend m
623
- @c.first_foo(1, 2).must_equal @o
624
- @c.first_foo(3, 4).must_equal @o
625
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared", "SELECT * FROM items WHERE (bar = 3) ORDER BY 4 LIMIT 1 -- prepared"]
626
- end
627
-
628
- it "should handle models with names" do
629
- def @c.name; 'foobar' end
630
- @c.prepared_finder :foo
631
- @c.first_foo(1, 2).must_equal @o
632
- @db.sqls.must_equal ["SELECT * FROM items WHERE (bar = 1) ORDER BY 2 LIMIT 1 -- prepared"]
633
- end
634
- end
635
-
636
- describe Sequel::Model, ".fetch" do
637
- before do
638
- DB.reset
639
- @c = Class.new(Sequel::Model(:items))
640
- end
641
-
642
- it "should return instances of Model" do
643
- @c.fetch("SELECT * FROM items").first.must_be_kind_of(@c)
644
- end
645
-
646
- it "should return true for .empty? and not raise an error on empty selection" do
647
- rows = @c.fetch("SELECT * FROM items WHERE FALSE")
648
- @c.send(:define_method, :fetch_rows){|sql| yield({:count => 0})}
649
- rows.empty?
650
- end
651
- end
652
-
653
- describe Sequel::Model, ".find_or_create" do
654
- before do
655
- @db = Sequel.mock
656
- @c = Class.new(Sequel::Model(@db[:items])) do
657
- set_primary_key :id
658
- columns :x
659
- end
660
- @db.sqls
661
- end
662
-
663
- it "should find the record" do
664
- @db.fetch = [{:x=>1, :id=>1}]
665
- @db.autoid = 1
666
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
667
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1"]
668
- end
669
-
670
- it "should create the record if not found" do
671
- @db.fetch = [[], {:x=>1, :id=>1}]
672
- @db.autoid = 1
673
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
674
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
675
- "INSERT INTO items (x) VALUES (1)",
676
- "SELECT * FROM items WHERE (id = 1) LIMIT 1"]
677
- end
678
-
679
- it "should pass the new record to be created to the block if no record is found" do
680
- @db.fetch = [[], {:x=>1, :id=>1}]
681
- @db.autoid = 1
682
- @c.find_or_create(:x => 1){|x| x[:y] = 2}.must_equal @c.load(:x=>1, :id=>1)
683
- sqls = @db.sqls
684
- sqls.first.must_equal "SELECT * FROM items WHERE (x = 1) LIMIT 1"
685
- ["INSERT INTO items (x, y) VALUES (1, 2)", "INSERT INTO items (y, x) VALUES (2, 1)"].must_include(sqls[1])
686
- sqls.last.must_equal "SELECT * FROM items WHERE (id = 1) LIMIT 1"
687
- end
688
- end
689
-
690
- describe Sequel::Model, ".all" do
691
- it "should return all records in the dataset" do
692
- c = Class.new(Sequel::Model(:items))
693
- c.all.must_equal [c.load(:x=>1, :id=>1)]
694
- end
695
- end
696
-
697
- describe Sequel::Model, "A model class without a primary key" do
698
- before do
699
- @c = Class.new(Sequel::Model(:items)) do
700
- columns :x
701
- no_primary_key
702
- end
703
- DB.reset
704
- end
705
-
706
- it "should be able to insert records without selecting them back" do
707
- i = nil
708
- i = @c.create(:x => 1)
709
- i.class.wont_be_nil
710
- i.values.to_hash.must_equal(:x => 1)
711
-
712
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (1)']
713
- end
714
-
715
- it "should raise when deleting" do
716
- proc{@c.load(:x=>1).delete}.must_raise Sequel::Error
717
- end
718
-
719
- it "should raise when updating" do
720
- proc{@c.load(:x=>1).update(:x=>2)}.must_raise Sequel::Error
721
- end
722
-
723
- it "should insert a record when saving" do
724
- o = @c.new(:x => 2)
725
- o.must_be :new?
726
- o.save
727
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (2)']
728
- end
729
- end
730
-
731
- describe Sequel::Model, "attribute accessors" do
732
- before do
733
- db = Sequel.mock
734
- def db.supports_schema_parsing?() true end
735
- def db.schema(*)
736
- [[:x, {:type=>:integer}], [:z, {:type=>:integer}]]
737
- end
738
- @dataset = db[:items].columns(:x, :z)
739
- @c = Class.new(Sequel::Model)
740
- DB.reset
741
- end
742
-
743
- it "should be created on set_dataset" do
744
- %w'x z x= z='.each do |x|
745
- @c.instance_methods.collect{|z| z.to_s}.wont_include(x)
746
- end
747
- @c.set_dataset(@dataset)
748
- %w'x z x= z='.each do |x|
749
- @c.instance_methods.collect{|z| z.to_s}.must_include(x)
750
- end
751
- o = @c.new
752
- %w'x z x= z='.each do |x|
753
- o.methods.collect{|z| z.to_s}.must_include(x)
754
- end
755
-
756
- o.x.must_equal nil
757
- o.x = 34
758
- o.x.must_equal 34
759
- end
760
-
761
- it "should be only accept one argument for the write accessor" do
762
- @c.set_dataset(@dataset)
763
- o = @c.new
764
-
765
- o.x = 34
766
- o.x.must_equal 34
767
- proc{o.send(:x=)}.must_raise ArgumentError
768
- proc{o.send(:x=, 3, 4)}.must_raise ArgumentError
769
- end
770
-
771
- it "should have a working typecasting setter even if the column is not selected" do
772
- @c.set_dataset(@dataset.select(:z).columns(:z))
773
- o = @c.new
774
-
775
- o.x = '34'
776
- o.x.must_equal 34
777
- end
778
-
779
- it "should typecast if the new value is the same as the existing but has a different class" do
780
- @c.set_dataset(@dataset.select(:z).columns(:z))
781
- o = @c.new
782
-
783
- o.x = 34
784
- o.x = 34.0
785
- o.x.must_equal 34.0
786
- o.x = 34
787
- o.x.must_equal 34
788
- end
789
- end
790
-
791
- describe Sequel::Model, ".[]" do
792
- before do
793
- @c = Class.new(Sequel::Model(:items))
794
- @c.dataset._fetch = {:name => 'sharon', :id => 1}
795
- DB.reset
796
- end
797
-
798
- it "should return the first record for the given pk" do
799
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
800
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
801
- @c[9999].must_equal @c.load(:name => 'sharon', :id => 1)
802
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 9999"]
803
- end
804
-
805
- it "should have #[] return nil if no rows match" do
806
- @c.dataset._fetch = []
807
- @c[1].must_equal nil
808
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
809
- end
810
-
811
- it "should work correctly for custom primary key" do
812
- @c.set_primary_key :name
813
- @c['sharon'].must_equal @c.load(:name => 'sharon', :id => 1)
814
- DB.sqls.must_equal ["SELECT * FROM items WHERE name = 'sharon'"]
815
- end
816
-
817
- it "should use a qualified primary key if the dataset is joined" do
818
- @c.dataset = @c.dataset.cross_join(:a)
819
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
820
- DB.sqls.must_equal ["SELECT * FROM items CROSS JOIN a WHERE (items.id = 1) LIMIT 1"]
821
- end
822
-
823
- it "should work correctly for composite primary key specified as array" do
824
- @c.set_primary_key [:node_id, :kind]
825
- @c[3921, 201].must_be_kind_of(@c)
826
- sqls = DB.sqls
827
- sqls.length.must_equal 1
828
- sqls.first.must_match(/^SELECT \* FROM items WHERE \((\(node_id = 3921\) AND \(kind = 201\))|(\(kind = 201\) AND \(node_id = 3921\))\) LIMIT 1$/)
829
- end
830
- end
831
-
832
- describe "Model#inspect" do
833
- it "should include the class name and the values" do
834
- Sequel::Model.load(:x => 333).inspect.must_equal '#<Sequel::Model @values={:x=>333}>'
835
- end
836
- end
837
-
838
- describe "Model.db_schema" do
839
- before do
840
- @c = Class.new(Sequel::Model(:items)) do
841
- def self.columns; orig_columns; end
842
- end
843
- @db = Sequel.mock
844
- def @db.supports_schema_parsing?() true end
845
- @dataset = @db[:items]
846
- end
847
-
848
- it "should not call database's schema if it isn't supported" do
849
- def @db.supports_schema_parsing?() false end
850
- def @db.schema(table, opts = {})
851
- raise Sequel::Error
852
- end
853
- @dataset.instance_variable_set(:@columns, [:x, :y])
854
-
855
- @c.dataset = @dataset
856
- @c.db_schema.must_equal(:x=>{}, :y=>{})
857
- @c.columns.must_equal [:x, :y]
858
- @c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
859
- end
860
-
861
- it "should use the database's schema and set the columns and dataset columns" do
862
- def @db.schema(table, opts = {})
863
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
864
- end
865
- @c.dataset = @dataset
866
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
867
- @c.columns.must_equal [:x, :y]
868
- @c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
869
- end
870
-
871
- it "should not restrict the schema for datasets with a :select option" do
872
- def @c.columns; [:x, :z]; end
873
- def @db.schema(table, opts = {})
874
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
875
- end
876
- @c.dataset = @dataset.select(:x, :y___z)
877
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :z=>{}, :y=>{:type=>:string})
878
- end
879
-
880
- it "should fallback to fetching records if schema raises an error" do
881
- def @db.schema(table, opts={})
882
- raise Sequel::Error
883
- end
884
- @c.dataset = @dataset.join(:x, :id).columns(:id, :x)
885
- @c.db_schema.must_equal(:x=>{}, :id=>{})
886
- end
887
-
888
- it "should automatically set a singular primary key based on the schema" do
889
- ds = @dataset
890
- d = ds.db
891
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
892
- @c.primary_key.must_equal :id
893
- @c.dataset = ds
894
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
895
- @c.primary_key.must_equal :x
896
- end
897
-
898
- it "should automatically set a singular primary key even if there are specific columns selected" do
899
- ds = @dataset.select(:a, :b, :x)
900
- d = ds.db
901
- def d.schema(table, *opts) [[:a, {:primary_key=>false}], [:b, {:primary_key=>false}], [:x, {:primary_key=>true}]] end
902
- @c.primary_key.must_equal :id
903
- @c.dataset = ds
904
- @c.db_schema.must_equal(:a=>{:primary_key=>false}, :b=>{:primary_key=>false}, :x=>{:primary_key=>true})
905
- @c.primary_key.must_equal :x
906
- end
907
-
908
- it "should automatically set the composite primary key based on the schema" do
909
- ds = @dataset
910
- d = ds.db
911
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
912
- @c.primary_key.must_equal :id
913
- @c.dataset = ds
914
- @c.db_schema.must_equal(:x=>{:primary_key=>true}, :y=>{:primary_key=>true})
915
- @c.primary_key.must_equal [:x, :y]
916
- end
917
-
918
- it "should set an immutable composite primary key based on the schema" do
919
- ds = @dataset
920
- d = ds.db
921
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
922
- @c.dataset = ds
923
- @c.primary_key.must_equal [:x, :y]
924
- proc{@c.primary_key.pop}.must_raise
925
- end
926
-
927
- it "should automatically set no primary key based on the schema" do
928
- ds = @dataset
929
- d = ds.db
930
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {:primary_key=>false}]] end
931
- @c.primary_key.must_equal :id
932
- @c.dataset = ds
933
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
934
- @c.primary_key.must_equal nil
935
- end
936
-
937
- it "should automatically set primary key for dataset selecting table.*" do
938
- ds = @dataset.select_all(:items)
939
- d = ds.db
940
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
941
- @c.primary_key.must_equal :id
942
- @c.dataset = ds
943
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
944
- @c.primary_key.must_equal :x
945
- end
946
-
947
- it "should not modify the primary key unless all column schema hashes have a :primary_key entry" do
948
- ds = @dataset
949
- d = ds.db
950
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {}]] end
951
- @c.primary_key.must_equal :id
952
- @c.dataset = ds
953
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{})
954
- @c.primary_key.must_equal :id
955
- end
956
- end
957
-
958
- describe "Model#use_transactions" do
959
- before do
960
- @c = Class.new(Sequel::Model(:items))
961
- end
962
-
963
- it "should return class value by default" do
964
- @c.use_transactions = true
965
- @c.new.use_transactions.must_equal true
966
- @c.use_transactions = false
967
- @c.new.use_transactions.must_equal false
968
- end
969
-
970
- it "should return set value if manually set" do
971
- instance = @c.new
972
- instance.use_transactions = false
973
- instance.use_transactions.must_equal false
974
- @c.use_transactions = true
975
- instance.use_transactions.must_equal false
976
-
977
- instance.use_transactions = true
978
- instance.use_transactions.must_equal true
979
- @c.use_transactions = false
980
- instance.use_transactions.must_equal true
981
- end
982
- end