sequel 4.49.0 → 5.3.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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  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.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,32 +1,14 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
1
+ require_relative "spec_helper"
2
2
 
3
3
  describe "A new Database" do
4
4
  before do
5
5
  @db = Sequel::Database.new(1 => 2, :logger => 3)
6
6
  end
7
- after do
8
- deprecated do
9
- Sequel.quote_identifiers = false
10
- Sequel.identifier_input_method = nil
11
- Sequel.identifier_output_method = nil
12
- end
13
- end
14
7
 
15
- deprecated "should support DatasetClass constant" do
16
- dbc = Class.new(Sequel::Database)
17
- dbc::DatasetClass = dsc = Class.new(Sequel::Dataset)
18
- dbc.new.dataset.must_be_kind_of(dsc)
19
- end
20
-
21
- deprecated "should allow dup/clone" do
22
- @db.dup.must_be_kind_of @db.class
23
- @db.clone.must_be_kind_of @db.class
24
- end
25
-
26
8
  it "should not allow dup/clone" do
27
- proc{@db.dup}.must_raise Sequel::Error
28
- proc{@db.clone}.must_raise Sequel::Error
29
- end if false # SEQUEL5
9
+ proc{@db.dup}.must_raise NoMethodError
10
+ proc{@db.clone}.must_raise NoMethodError
11
+ end
30
12
 
31
13
  it "should receive options" do
32
14
  @db.opts[1].must_equal 2
@@ -78,7 +60,7 @@ describe "A new Database" do
78
60
  it "should have the connection pool use the connect method to get connections" do
79
61
  cc = nil
80
62
  d = Sequel::Database.new
81
- meta_def(d, :connect){|c| 1234}
63
+ d.define_singleton_method(:connect){|c| 1234}
82
64
  d.synchronize {|c| cc = c}
83
65
  cc.must_equal 1234
84
66
  end
@@ -99,21 +81,13 @@ describe "A new Database" do
99
81
  end
100
82
 
101
83
  it "should just use a :uri option for jdbc with the full connection string" do
102
- db = Sequel::Database.stub(:adapter_class, Sequel::Database) do
84
+ db = Sequel::Database.stub(:adapter_class, Class.new(Sequel::Database){def connect(*); Object.new end}) do
103
85
  Sequel.connect('jdbc:test://host/db_name')
104
86
  end
105
87
  db.must_be_kind_of(Sequel::Database)
106
88
  db.opts[:uri].must_equal 'jdbc:test://host/db_name'
107
89
  end
108
90
 
109
- it "should just use a :uri option for do with the full connection string" do
110
- db = Sequel::Database.stub(:adapter_class, Sequel::Database) do
111
- Sequel.connect('do:test://host/db_name')
112
- end
113
- db.must_be_kind_of(Sequel::Database)
114
- db.opts[:uri].must_equal 'do:test://host/db_name'
115
- end
116
-
117
91
  it "should populate :adapter option when using connection string" do
118
92
  Sequel.connect('mock:/').opts[:adapter].must_equal "mock"
119
93
  end
@@ -125,7 +99,19 @@ describe "A new Database" do
125
99
 
126
100
  it 'should strip square brackets for ipv6 hosts' do
127
101
  Sequel.connect('mock://[::1]').opts[:host].must_equal "::1"
128
- end if RUBY_VERSION >= '1.9.3'
102
+ end
103
+ end
104
+
105
+ describe "Database :connect_sqls option" do
106
+ it "should issue the each sql query for each new connection" do
107
+ db = Sequel.mock(:connect_sqls=>['SELECT 1', 'SELECT 2'])
108
+ db.sqls.must_equal ['SELECT 1', 'SELECT 2']
109
+ db['SELECT 3'].get
110
+ db.sqls.must_equal ['SELECT 3']
111
+ db.disconnect
112
+ db['SELECT 3'].get
113
+ db.sqls.must_equal ['SELECT 1', 'SELECT 2', 'SELECT 3']
114
+ end
129
115
  end
130
116
 
131
117
  describe "Database#freeze" do
@@ -188,79 +174,6 @@ describe "Database#log_info" do
188
174
  end
189
175
  end
190
176
 
191
- describe "Database#log_yield" do
192
- before do
193
- @o = Object.new
194
- def @o.logs; @logs || []; end
195
- def @o.warn(*args); (@logs ||= []) << [:warn] + args; end
196
- def @o.method_missing(*args); (@logs ||= []) << args; end
197
- def @o.to_ary; [self]; end
198
- @db = Sequel::Database.new(:logger=>@o)
199
- end
200
-
201
- deprecated "should yield to the passed block" do
202
- a = nil
203
- @db.log_yield('blah'){a = 1}
204
- a.must_equal 1
205
- end
206
-
207
- deprecated "should raise an exception if a block is not passed" do
208
- proc{@db.log_yield('blah')}.must_raise LocalJumpError
209
- end
210
-
211
- deprecated "should log message with duration at info level to all loggers" do
212
- @db.log_yield('blah'){}
213
- @o.logs.length.must_equal 1
214
- @o.logs.first.length.must_equal 2
215
- @o.logs.first.first.must_equal :info
216
- @o.logs.first.last.must_match(/\A\(\d\.\d{6}s\) blah\z/)
217
- end
218
-
219
- deprecated "should respect sql_log_level setting" do
220
- @db.sql_log_level = :debug
221
- @db.log_yield('blah'){}
222
- @o.logs.length.must_equal 1
223
- @o.logs.first.length.must_equal 2
224
- @o.logs.first.first.must_equal :debug
225
- @o.logs.first.last.must_match(/\A\(\d\.\d{6}s\) blah\z/)
226
- end
227
-
228
- deprecated "should log message with duration at warn level if duration greater than log_warn_duration" do
229
- @db.log_warn_duration = 0
230
- @db.log_yield('blah'){}
231
- @o.logs.length.must_equal 1
232
- @o.logs.first.length.must_equal 2
233
- @o.logs.first.first.must_equal :warn
234
- @o.logs.first.last.must_match(/\A\(\d\.\d{6}s\) blah\z/)
235
- end
236
-
237
- deprecated "should log message with duration at info level if duration less than log_warn_duration" do
238
- @db.log_warn_duration = 1000
239
- @db.log_yield('blah'){}
240
- @o.logs.length.must_equal 1
241
- @o.logs.first.length.must_equal 2
242
- @o.logs.first.first.must_equal :info
243
- @o.logs.first.last.must_match(/\A\(\d\.\d{6}s\) blah\z/)
244
- end
245
-
246
- deprecated "should log message at error level if block raises an error" do
247
- @db.log_warn_duration = 0
248
- proc{@db.log_yield('blah'){raise Sequel::Error, 'adsf'}}.must_raise Sequel::Error
249
- @o.logs.length.must_equal 1
250
- @o.logs.first.length.must_equal 2
251
- @o.logs.first.first.must_equal :error
252
- @o.logs.first.last.must_match(/\ASequel::Error: adsf: blah\z/)
253
- end
254
-
255
- deprecated "should include args with message if args passed" do
256
- @db.log_yield('blah', [1, 2]){}
257
- @o.logs.length.must_equal 1
258
- @o.logs.first.length.must_equal 2
259
- @o.logs.first.first.must_equal :info
260
- @o.logs.first.last.must_match(/\A\(\d\.\d{6}s\) blah; \[1, 2\]\z/)
261
- end
262
- end
263
-
264
177
  describe "Database#log_connection_yield" do
265
178
  before do
266
179
  @o = Object.new
@@ -357,6 +270,7 @@ describe "Database#uri" do
357
270
  before do
358
271
  @c = Class.new(Sequel::Database) do
359
272
  def dataset_class_default; Sequel::Dataset end
273
+ def connect(*); Object.new end
360
274
  set_adapter_scheme :mau
361
275
  end
362
276
 
@@ -412,10 +326,8 @@ describe "Database#dataset" do
412
326
  e.sql.must_equal 'SELECT * FROM miu'
413
327
  end
414
328
 
415
- deprecated "should provide a filtered #from dataset if a block is given" do
416
- d = @db.from(:mau){x.sql_number > 100}
417
- d.must_be_kind_of(Sequel::Dataset)
418
- d.sql.must_equal 'SELECT * FROM mau WHERE (x > 100)'
329
+ it "should provide a #from dataset that supports virtual row blocks" do
330
+ @db.from{a(b)}.sql.must_equal 'SELECT * FROM a(b)'
419
331
  end
420
332
 
421
333
  it "should provide a #select dataset" do
@@ -610,6 +522,12 @@ describe "Database#extend_datasets custom methods" do
610
522
  ds.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY baz, bar'
611
523
  end
612
524
 
525
+ it "should have dataset_module support a reverse method" do
526
+ @db.extend_datasets{reverse(:foo){:baz}}
527
+ ds.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz DESC'
528
+ ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz DESC'
529
+ end
530
+
613
531
  it "should have dataset_module support a select method" do
614
532
  @db.extend_datasets{select :foo, :baz}
615
533
  ds.foo.sql.must_equal 'SELECT baz FROM items'
@@ -710,7 +628,7 @@ end
710
628
  describe "Database#synchronize" do
711
629
  before do
712
630
  @db = Sequel::Database.new(:max_connections => 1)
713
- meta_def(@db, :connect){|c| 12345}
631
+ @db.define_singleton_method(:connect){|c| 12345}
714
632
  end
715
633
 
716
634
  it "should wrap the supplied block in pool.hold" do
@@ -735,7 +653,7 @@ describe "Database#test_connection" do
735
653
  before do
736
654
  @db = Sequel::Database.new
737
655
  pr = proc{@test = rand(100)}
738
- meta_def(@db, :connect){|c| pr.call}
656
+ @db.define_singleton_method(:connect){|c| pr.call}
739
657
  end
740
658
 
741
659
  it "should attempt to get a connection" do
@@ -781,7 +699,7 @@ DatabaseTransactionSpecs = shared_description do
781
699
  end
782
700
 
783
701
  it "should support transaction isolation levels" do
784
- meta_def(@db, :supports_transaction_isolation_levels?){true}
702
+ @db.define_singleton_method(:supports_transaction_isolation_levels?){true}
785
703
  [:uncommitted, :committed, :repeatable, :serializable].each do |l|
786
704
  @db.transaction(:isolation=>l){@db.run "DROP TABLE #{l}"}
787
705
  end
@@ -792,7 +710,7 @@ DatabaseTransactionSpecs = shared_description do
792
710
  end
793
711
 
794
712
  it "should allow specifying a default transaction isolation level" do
795
- meta_def(@db, :supports_transaction_isolation_levels?){true}
713
+ @db.define_singleton_method(:supports_transaction_isolation_levels?){true}
796
714
  [:uncommitted, :committed, :repeatable, :serializable].each do |l|
797
715
  @db.transaction_isolation_level = l
798
716
  @db.transaction{@db.run "DROP TABLE #{l}"}
@@ -883,8 +801,8 @@ DatabaseTransactionSpecs = shared_description do
883
801
 
884
802
  it "should handle errors when sending BEGIN" do
885
803
  ec = Class.new(StandardError)
886
- meta_def(@db, :database_error_classes){[ec]}
887
- meta_def(@db, :log_connection_execute){|c, sql| sql =~ /BEGIN/ ? raise(ec, 'bad') : super(c, sql)}
804
+ @db.define_singleton_method(:database_error_classes){[ec]}
805
+ @db.define_singleton_method(:log_connection_execute){|c, sql| sql =~ /BEGIN/ ? raise(ec, 'bad') : super(c, sql)}
888
806
  begin
889
807
  @db.transaction{@db.execute 'DROP TABLE test;'}
890
808
  rescue Sequel::DatabaseError => e
@@ -896,8 +814,8 @@ DatabaseTransactionSpecs = shared_description do
896
814
 
897
815
  it "should handle errors when sending COMMIT" do
898
816
  ec = Class.new(StandardError)
899
- meta_def(@db, :database_error_classes){[ec]}
900
- meta_def(@db, :log_connection_execute){|c, sql| sql =~ /COMMIT/ ? raise(ec, 'bad') : super(c, sql)}
817
+ @db.define_singleton_method(:database_error_classes){[ec]}
818
+ @db.define_singleton_method(:log_connection_execute){|c, sql| sql =~ /COMMIT/ ? raise(ec, 'bad') : super(c, sql)}
901
819
  begin
902
820
  @db.transaction{@db.execute 'DROP TABLE test;'}
903
821
  rescue Sequel::DatabaseError => e
@@ -909,8 +827,8 @@ DatabaseTransactionSpecs = shared_description do
909
827
 
910
828
  it "should raise original exception if there is an exception raised when rolling back" do
911
829
  ec = Class.new(StandardError)
912
- meta_def(@db, :database_error_classes){[ec]}
913
- meta_def(@db, :log_connection_execute){|c, sql| sql =~ /ROLLBACK/ ? raise(ec, 'bad') : super(c, sql)}
830
+ @db.define_singleton_method(:database_error_classes){[ec]}
831
+ @db.define_singleton_method(:log_connection_execute){|c, sql| sql =~ /ROLLBACK/ ? raise(ec, 'bad') : super(c, sql)}
914
832
  begin
915
833
  @db.transaction{raise ArgumentError, 'asdf'}
916
834
  rescue => e
@@ -921,8 +839,8 @@ DatabaseTransactionSpecs = shared_description do
921
839
 
922
840
  it "should raise original exception if there is an exception raised when rolling back when using :rollback=>:always" do
923
841
  ec = Class.new(StandardError)
924
- meta_def(@db, :database_error_classes){[ec]}
925
- meta_def(@db, :log_connection_execute){|c, sql| sql =~ /ROLLBACK/ ? raise(ec, 'bad') : super(c, sql)}
842
+ @db.define_singleton_method(:database_error_classes){[ec]}
843
+ @db.define_singleton_method(:log_connection_execute){|c, sql| sql =~ /ROLLBACK/ ? raise(ec, 'bad') : super(c, sql)}
926
844
  begin
927
845
  @db.transaction(:rollback=>:always){}
928
846
  rescue => e
@@ -1014,10 +932,10 @@ DatabaseTransactionSpecs = shared_description do
1014
932
  end
1015
933
 
1016
934
  it "should raise database errors when commiting a transaction as Sequel::DatabaseError" do
1017
- meta_def(@db, :commit_transaction){raise ArgumentError}
935
+ @db.define_singleton_method(:commit_transaction){raise ArgumentError}
1018
936
  lambda{@db.transaction{}}.must_raise(ArgumentError)
1019
937
 
1020
- meta_def(@db, :database_error_classes){[ArgumentError]}
938
+ @db.define_singleton_method(:database_error_classes){[ArgumentError]}
1021
939
  lambda{@db.transaction{}}.must_raise(Sequel::DatabaseError)
1022
940
  end
1023
941
 
@@ -1144,13 +1062,13 @@ DatabaseTransactionSpecs = shared_description do
1144
1062
  end
1145
1063
 
1146
1064
  it "should raise an error if you attempt to use after_commit inside a prepared transaction" do
1147
- meta_def(@db, :supports_prepared_transactions?){true}
1065
+ @db.define_singleton_method(:supports_prepared_transactions?){true}
1148
1066
  proc{@db.transaction(:prepare=>'XYZ'){@db.after_commit{@db.execute('foo')}}}.must_raise(Sequel::Error)
1149
1067
  @db.sqls.must_equal ['BEGIN', 'ROLLBACK']
1150
1068
  end
1151
1069
 
1152
1070
  it "should raise an error if you attempt to use after_rollback inside a prepared transaction" do
1153
- meta_def(@db, :supports_prepared_transactions?){true}
1071
+ @db.define_singleton_method(:supports_prepared_transactions?){true}
1154
1072
  proc{@db.transaction(:prepare=>'XYZ'){@db.after_rollback{@db.execute('foo')}}}.must_raise(Sequel::Error)
1155
1073
  @db.sqls.must_equal ['BEGIN', 'ROLLBACK']
1156
1074
  end
@@ -1216,13 +1134,13 @@ describe "Database#transaction with savepoint support" do
1216
1134
  end
1217
1135
 
1218
1136
  it "should raise an error if you attempt to use after_commit inside a savepoint in a prepared transaction" do
1219
- meta_def(@db, :supports_prepared_transactions?){true}
1137
+ @db.define_singleton_method(:supports_prepared_transactions?){true}
1220
1138
  proc{@db.transaction(:prepare=>'XYZ'){@db.transaction(:savepoint=>true){@db.after_commit{@db.execute('foo')}}}}.must_raise(Sequel::Error)
1221
1139
  @db.sqls.must_equal ['BEGIN', 'SAVEPOINT autopoint_1','ROLLBACK TO SAVEPOINT autopoint_1', 'ROLLBACK']
1222
1140
  end
1223
1141
 
1224
1142
  it "should raise an error if you attempt to use after_rollback inside a savepoint in a prepared transaction" do
1225
- meta_def(@db, :supports_prepared_transactions?){true}
1143
+ @db.define_singleton_method(:supports_prepared_transactions?){true}
1226
1144
  proc{@db.transaction(:prepare=>'XYZ'){@db.transaction(:savepoint=>true){@db.after_rollback{@db.execute('foo')}}}}.must_raise(Sequel::Error)
1227
1145
  @db.sqls.must_equal ['BEGIN', 'SAVEPOINT autopoint_1','ROLLBACK TO SAVEPOINT autopoint_1', 'ROLLBACK']
1228
1146
  end
@@ -1241,7 +1159,7 @@ end
1241
1159
  describe "Database#transaction without savepoint support" do
1242
1160
  before do
1243
1161
  @db = Sequel.mock(:servers=>{:test=>{}})
1244
- meta_def(@db, :supports_savepoints?){false}
1162
+ @db.define_singleton_method(:supports_savepoints?){false}
1245
1163
  end
1246
1164
 
1247
1165
  it "should not create savepoint if inside a transaction when :savepoint=>:only is used" do
@@ -1405,11 +1323,11 @@ describe "Database#transaction with savepoints" do
1405
1323
  end
1406
1324
 
1407
1325
  it "should raise database errors when commiting a transaction as Sequel::DatabaseError" do
1408
- meta_def(@db, :commit_transaction){raise ArgumentError}
1326
+ @db.define_singleton_method(:commit_transaction){raise ArgumentError}
1409
1327
  lambda{@db.transaction{}}.must_raise(ArgumentError)
1410
1328
  lambda{@db.transaction{@db.transaction(:savepoint=>true){}}}.must_raise(ArgumentError)
1411
1329
 
1412
- meta_def(@db, :database_error_classes){[ArgumentError]}
1330
+ @db.define_singleton_method(:database_error_classes){[ArgumentError]}
1413
1331
  lambda{@db.transaction{}}.must_raise(Sequel::DatabaseError)
1414
1332
  lambda{@db.transaction{@db.transaction(:savepoint=>true){}}}.must_raise(Sequel::DatabaseError)
1415
1333
  end
@@ -1417,7 +1335,7 @@ end
1417
1335
 
1418
1336
  describe "A Database adapter with a scheme" do
1419
1337
  before do
1420
- require 'sequel/adapters/mock'
1338
+ require_relative '../../lib/sequel/adapters/mock'
1421
1339
  @ccc = Class.new(Sequel::Mock::Database)
1422
1340
  @ccc.send(:set_adapter_scheme, :ccc)
1423
1341
  end
@@ -1475,7 +1393,7 @@ describe "A Database adapter with a scheme" do
1475
1393
  Sequel.send(:def_adapter_method, :ccc)
1476
1394
  Sequel.ccc('db', :host=>'localhost', &p).must_equal returnValue
1477
1395
  @ccc::DISCONNECTS.must_equal [z, y, x]
1478
- class << Sequel; remove_method(:ccc) end
1396
+ Sequel.singleton_class.send(:remove_method, :ccc)
1479
1397
  end
1480
1398
 
1481
1399
  it "should be accessible through Sequel.<adapter>" do
@@ -1500,7 +1418,7 @@ describe "A Database adapter with a scheme" do
1500
1418
  c = Sequel.ccc(:database => 'mydb', :host => 'localhost')
1501
1419
  c.must_be_kind_of(@ccc)
1502
1420
  c.opts.values_at(:adapter, :database, :host, :adapter_class).must_equal [:ccc, 'mydb', 'localhost', @ccc]
1503
- class << Sequel; remove_method(:ccc) end
1421
+ Sequel.singleton_class.send(:remove_method, :ccc)
1504
1422
  end
1505
1423
 
1506
1424
  it "should be accessible through Sequel.connect with options" do
@@ -1608,14 +1526,6 @@ describe "A single threaded database" do
1608
1526
  db.pool.must_be_kind_of(Sequel::SingleConnectionPool)
1609
1527
  end
1610
1528
 
1611
- deprecated "should be constructable using Database.single_threaded = true" do
1612
- Sequel::Database.single_threaded = true
1613
- Sequel.single_threaded.must_equal true
1614
- Sequel::Database.single_threaded.must_equal true
1615
- db = Sequel::Database.new{123}
1616
- db.pool.must_be_kind_of(Sequel::SingleConnectionPool)
1617
- end
1618
-
1619
1529
  it "should be constructable using Sequel.single_threaded = true" do
1620
1530
  Sequel.single_threaded = true
1621
1531
  Sequel.single_threaded.must_equal true
@@ -1628,7 +1538,7 @@ describe "A single threaded database" do
1628
1538
  before do
1629
1539
  conn = 1234567
1630
1540
  @db = Sequel::Database.new(:single_threaded => true)
1631
- meta_def(@db, :connect) do |c|
1541
+ @db.define_singleton_method(:connect) do |c|
1632
1542
  conn += 1
1633
1543
  end
1634
1544
  end
@@ -1649,14 +1559,12 @@ describe "A single threaded database" do
1649
1559
  end
1650
1560
 
1651
1561
  it "should convert an Exception on connection into a DatabaseConnectionError" do
1652
- db = Sequel::Database.new(:single_threaded => true, :servers=>{})
1653
- def db.connect(*) raise Exception end
1562
+ db = Class.new(Sequel::Database){def connect(*) raise Exception end}.new(:single_threaded => true, :servers=>{}, :test=>false)
1654
1563
  proc {db.pool.hold {|c|}}.must_raise(Sequel::DatabaseConnectionError)
1655
1564
  end
1656
1565
 
1657
1566
  it "should raise a DatabaseConnectionError if the connection proc returns nil" do
1658
- db = Sequel.mock(:single_threaded => true, :servers=>{})
1659
- def db.connect(*) end
1567
+ db = Class.new(Sequel::Database){def connect(*) end}.new(:single_threaded => true, :servers=>{}, :test=>false)
1660
1568
  proc {db.pool.hold {|c|}}.must_raise(Sequel::DatabaseConnectionError)
1661
1569
  end
1662
1570
  end
@@ -1776,11 +1684,11 @@ describe "Database#inspect" do
1776
1684
  end
1777
1685
 
1778
1686
  it "should include the class name and the connection options if an options hash was given" do
1779
- Sequel.connect(:adapter=>:mock).inspect.must_match(/#<Sequel::Mock::Database: \{:adapter=>:mock\}>/)
1687
+ Sequel.connect(:adapter=>:mock).inspect.must_equal '#<Sequel::Mock::Database: {:adapter=>:mock}>'
1780
1688
  end
1781
1689
 
1782
1690
  it "should include the class name, uri, and connection options if uri and options hash was given" do
1783
- Sequel.connect('mock://foo', :database=>'bar').inspect.must_match(/#<Sequel::Mock::Database: "mock:\/\/foo" \{:database=>"bar"\}>/)
1691
+ Sequel.connect('mock://foo', :database=>'bar').inspect.must_equal '#<Sequel::Mock::Database: "mock://foo" {:database=>"bar"}>'
1784
1692
  end
1785
1693
  end
1786
1694
 
@@ -1890,6 +1798,10 @@ describe "Database#add_servers" do
1890
1798
  @db.synchronize(:server1){|c| c.opts[:host].must_equal 8}
1891
1799
  @db.synchronize(:server2){|c| c.opts[:host].must_equal 4}
1892
1800
  end
1801
+
1802
+ it "should raise error for unsharded pool" do
1803
+ proc{Sequel.mock.add_servers(:server1=>{})}.must_raise Sequel::Error
1804
+ end
1893
1805
  end
1894
1806
 
1895
1807
  describe "Database#remove_servers" do
@@ -1940,86 +1852,12 @@ describe "Database#remove_servers" do
1940
1852
  c1.opts[:host].must_equal 1
1941
1853
  end
1942
1854
  end
1943
- end
1944
1855
 
1945
- describe "Database#add_servers and #remove_servers when not sharded" do
1946
- deprecated "should do nothing" do
1947
- db = Sequel.mock
1948
- db.opts[:servers].must_be_nil
1949
- db.add_servers(:foo=>{}).must_be_nil
1950
- db.opts[:servers].must_be_nil
1951
- db.remove_servers(:foo).must_be_nil
1952
- db.opts[:servers].must_be_nil
1953
- end
1954
-
1955
- it "should raise Error" do
1956
- db = Sequel.mock
1957
- db.opts[:servers].must_be_nil
1958
- proc{db.add_servers(:foo=>{})}.must_raise Sequel::Error
1959
- db.opts[:servers].must_be_nil
1960
- proc{db.remove_servers(:foo)}.must_raise Sequel::Error
1961
- db.opts[:servers].must_be_nil
1962
- end if false # SEQUEL5
1963
- end
1964
-
1965
- describe "Database#each_server with do/jdbc adapter connection string without :adapter option" do
1966
- deprecated "should yield a separate database object for each server" do
1967
- require 'sequel/adapters/mock'
1968
- klass = Class.new(Sequel::Database)
1969
- def klass.adapter_class(v)
1970
- raise unless v == :jdbc
1971
- Sequel::Mock::Database
1972
- end
1973
- @db = klass.connect('jdbc:blah:', :host=>1, :database=>2, :servers=>{:server1=>{:host=>3}})
1974
-
1975
- hosts = []
1976
- @db.each_server do |db|
1977
- db.must_be_kind_of(Sequel::Database)
1978
- db.wont_equal @db
1979
- db.opts[:adapter_class].must_equal Sequel::Mock::Database
1980
- db.opts[:database].must_equal 2
1981
- hosts << db.opts[:host]
1982
- end
1983
- hosts.sort.must_equal [1, 3]
1984
- end
1985
-
1986
- deprecated "should raise if not given a block" do
1987
- proc{Sequel.mock.each_server}.must_raise(Sequel::Error)
1856
+ it "should raise error for unsharded pool" do
1857
+ proc{Sequel.mock.remove_servers(:server1)}.must_raise Sequel::Error
1988
1858
  end
1989
1859
  end
1990
1860
 
1991
- describe "Database#each_server" do
1992
- before do
1993
- @db = Sequel.mock(:host=>1, :database=>2, :servers=>{:server1=>{:host=>3}, :server2=>{:host=>4}})
1994
- end
1995
-
1996
- deprecated "should yield a separate database object for each server" do
1997
- hosts = []
1998
- @db.each_server do |db|
1999
- db.must_be_kind_of(Sequel::Database)
2000
- db.wont_equal @db
2001
- db.opts[:adapter].must_equal :mock
2002
- db.opts[:database].must_equal 2
2003
- hosts << db.opts[:host]
2004
- end
2005
- hosts.sort.must_equal [1, 3, 4]
2006
- end
2007
-
2008
- deprecated "should disconnect and remove entry from Sequel::DATABASES after use" do
2009
- dbs = []
2010
- dcs = []
2011
- @db.each_server do |db|
2012
- dbs << db
2013
- Sequel::DATABASES.must_include(db)
2014
- meta_def(db, :disconnect){dcs << db}
2015
- end
2016
- dbs.each do |db|
2017
- Sequel::DATABASES.wont_include(db)
2018
- end
2019
- dbs.must_equal dcs
2020
- end
2021
- end
2022
-
2023
1861
  describe "Database#raise_error" do
2024
1862
  before do
2025
1863
  @db = Sequel.mock
@@ -2156,9 +1994,9 @@ describe "Database#typecast_value" do
2156
1994
  t2 = Time.mktime(2011, 1, 2, 3, 4, 5, 500000) # Local Time
2157
1995
  t3 = Time.utc(2011, 1, 2, 3, 4, 5, 500000) - (t - t2) # Local Time in UTC Time
2158
1996
  t4 = Time.mktime(2011, 1, 2, 3, 4, 5, 500000) + (t - t2) # UTC Time in Local Time
2159
- secs = defined?(Rational) ? Rational(11, 2) : 5.5
2160
- r1 = defined?(Rational) ? Rational(t2.utc_offset, 86400) : t2.utc_offset/86400.0
2161
- r2 = defined?(Rational) ? Rational((t - t2).to_i, 86400) : (t - t2).to_i/86400.0
1997
+ secs = Rational(11, 2)
1998
+ r1 = Rational(t2.utc_offset, 86400)
1999
+ r2 = Rational((t - t2).to_i, 86400)
2162
2000
  dt = DateTime.civil(2011, 1, 2, 3, 4, secs)
2163
2001
  dt2 = DateTime.civil(2011, 1, 2, 3, 4, secs, r1)
2164
2002
  dt3 = DateTime.civil(2011, 1, 2, 3, 4, secs) - r2
@@ -2297,8 +2135,8 @@ describe "Database#typecast_value" do
2297
2135
 
2298
2136
  Sequel.datetime_class = DateTime
2299
2137
  @db.typecast_value(:datetime, [2011, 10, 11, 12, 13, 14]).must_equal DateTime.civil(2011, 10, 11, 12, 13, 14)
2300
- @db.typecast_value(:datetime, [2011, 10, 11, 12, 13, 14, 500000000]).must_equal DateTime.civil(2011, 10, 11, 12, 13, (defined?(Rational) ? Rational(29, 2) : 14.5))
2301
- @db.typecast_value(:datetime, [2011, 10, 11, 12, 13, 14, 500000000, (defined?(Rational) ? Rational(1, 2) : 0.5)]).must_equal DateTime.civil(2011, 10, 11, 12, 13, (defined?(Rational) ? Rational(29, 2) : 14.5), (defined?(Rational) ? Rational(1, 2) : 0.5))
2138
+ @db.typecast_value(:datetime, [2011, 10, 11, 12, 13, 14, 500000000]).must_equal DateTime.civil(2011, 10, 11, 12, 13, Rational(29, 2))
2139
+ @db.typecast_value(:datetime, [2011, 10, 11, 12, 13, 14, 500000000, Rational(1, 2)]).must_equal DateTime.civil(2011, 10, 11, 12, 13, Rational(29, 2), Rational(1, 2))
2302
2140
  ensure
2303
2141
  Sequel.datetime_class = Time
2304
2142
  end
@@ -2313,13 +2151,13 @@ describe "Database#typecast_value" do
2313
2151
 
2314
2152
  Sequel.datetime_class = DateTime
2315
2153
  @db.typecast_value(:datetime, :year=>2011, :month=>10, :day=>11, :hour=>12, :minute=>13, :second=>14).must_equal DateTime.civil(2011, 10, 11, 12, 13, 14)
2316
- @db.typecast_value(:datetime, :year=>2011, :month=>10, :day=>11, :hour=>12, :minute=>13, :second=>14, :nanos=>500000000).must_equal DateTime.civil(2011, 10, 11, 12, 13, (defined?(Rational) ? Rational(29, 2) : 14.5))
2154
+ @db.typecast_value(:datetime, :year=>2011, :month=>10, :day=>11, :hour=>12, :minute=>13, :second=>14, :nanos=>500000000).must_equal DateTime.civil(2011, 10, 11, 12, 13, Rational(29, 2))
2317
2155
  @db.typecast_value(:datetime, 'year'=>2011, 'month'=>10, 'day'=>11, 'hour'=>12, 'minute'=>13, 'second'=>14).must_equal DateTime.civil(2011, 10, 11, 12, 13, 14)
2318
- @db.typecast_value(:datetime, 'year'=>2011, 'month'=>10, 'day'=>11, 'hour'=>12, 'minute'=>13, 'second'=>14, 'nanos'=>500000000).must_equal DateTime.civil(2011, 10, 11, 12, 13, (defined?(Rational) ? Rational(29, 2) : 14.5))
2319
- @db.typecast_value(:datetime, :year=>2011, :month=>10, :day=>11, :hour=>12, :minute=>13, :second=>14, :offset=>(defined?(Rational) ? Rational(1, 2) : 0.5)).must_equal DateTime.civil(2011, 10, 11, 12, 13, 14, (defined?(Rational) ? Rational(1, 2) : 0.5))
2320
- @db.typecast_value(:datetime, :year=>2011, :month=>10, :day=>11, :hour=>12, :minute=>13, :second=>14, :nanos=>500000000, :offset=>(defined?(Rational) ? Rational(1, 2) : 0.5)).must_equal DateTime.civil(2011, 10, 11, 12, 13, (defined?(Rational) ? Rational(29, 2) : 14.5), (defined?(Rational) ? Rational(1, 2) : 0.5))
2321
- @db.typecast_value(:datetime, 'year'=>2011, 'month'=>10, 'day'=>11, 'hour'=>12, 'minute'=>13, 'second'=>14, 'offset'=>(defined?(Rational) ? Rational(1, 2) : 0.5)).must_equal DateTime.civil(2011, 10, 11, 12, 13, 14, (defined?(Rational) ? Rational(1, 2) : 0.5))
2322
- @db.typecast_value(:datetime, 'year'=>2011, 'month'=>10, 'day'=>11, 'hour'=>12, 'minute'=>13, 'second'=>14, 'nanos'=>500000000, 'offset'=>(defined?(Rational) ? Rational(1, 2) : 0.5)).must_equal DateTime.civil(2011, 10, 11, 12, 13, (defined?(Rational) ? Rational(29, 2) : 14.5), (defined?(Rational) ? Rational(1, 2) : 0.5))
2156
+ @db.typecast_value(:datetime, 'year'=>2011, 'month'=>10, 'day'=>11, 'hour'=>12, 'minute'=>13, 'second'=>14, 'nanos'=>500000000).must_equal DateTime.civil(2011, 10, 11, 12, 13, Rational(29, 2))
2157
+ @db.typecast_value(:datetime, :year=>2011, :month=>10, :day=>11, :hour=>12, :minute=>13, :second=>14, :offset=>Rational(1, 2)).must_equal DateTime.civil(2011, 10, 11, 12, 13, 14, Rational(1, 2))
2158
+ @db.typecast_value(:datetime, :year=>2011, :month=>10, :day=>11, :hour=>12, :minute=>13, :second=>14, :nanos=>500000000, :offset=>Rational(1, 2)).must_equal DateTime.civil(2011, 10, 11, 12, 13, Rational(29, 2), Rational(1, 2))
2159
+ @db.typecast_value(:datetime, 'year'=>2011, 'month'=>10, 'day'=>11, 'hour'=>12, 'minute'=>13, 'second'=>14, 'offset'=>Rational(1, 2)).must_equal DateTime.civil(2011, 10, 11, 12, 13, 14, Rational(1, 2))
2160
+ @db.typecast_value(:datetime, 'year'=>2011, 'month'=>10, 'day'=>11, 'hour'=>12, 'minute'=>13, 'second'=>14, 'nanos'=>500000000, 'offset'=>Rational(1, 2)).must_equal DateTime.civil(2011, 10, 11, 12, 13, Rational(29, 2), Rational(1, 2))
2323
2161
  ensure
2324
2162
  Sequel.datetime_class = Time
2325
2163
  end
@@ -2397,7 +2235,7 @@ describe "Database#typecast_value" do
2397
2235
  rescue => e1
2398
2236
  begin
2399
2237
  raise RuntimeError
2400
- rescue => e2
2238
+ rescue
2401
2239
  @db.send(:raise_error, e1)
2402
2240
  end
2403
2241
  end
@@ -2411,7 +2249,7 @@ describe "Database#typecast_value" do
2411
2249
  @db.typecast_value(:date, 'a')
2412
2250
  true.must_equal false
2413
2251
  rescue Sequel::InvalidValue => e
2414
- e.inspect.must_match(/\A#<Sequel::InvalidValue: ArgumentError: .*>\z/)
2252
+ e.inspect.must_equal '#<Sequel::InvalidValue: ArgumentError: invalid date>'
2415
2253
  end
2416
2254
  end
2417
2255
  end
@@ -2559,8 +2397,8 @@ describe "Database#supports_savepoints_in_prepared_transactions?" do
2559
2397
 
2560
2398
  it "should be true if both savepoints and prepared transactions are supported" do
2561
2399
  db = Sequel::Database.new
2562
- meta_def(db, :supports_savepoints?){true}
2563
- meta_def(db, :supports_prepared_transactions?){true}
2400
+ db.define_singleton_method(:supports_savepoints?){true}
2401
+ db.define_singleton_method(:supports_prepared_transactions?){true}
2564
2402
  db.supports_savepoints_in_prepared_transactions?.must_equal true
2565
2403
  end
2566
2404
  end
@@ -2669,7 +2507,7 @@ describe "Database extensions" do
2669
2507
  end
2670
2508
  end
2671
2509
  before do
2672
- @db = Sequel.mock(:identifier_mangling=>false)
2510
+ @db = Sequel.mock
2673
2511
  end
2674
2512
  after do
2675
2513
  Sequel::Database.instance_variable_set(:@initialize_hook, Proc.new {|db| })
@@ -2724,8 +2562,22 @@ describe "Database extensions" do
2724
2562
  Sequel::Database.extension(:foo, :bar)
2725
2563
  @db.wont_respond_to(:a)
2726
2564
  @db.wont_respond_to(:b)
2727
- Sequel.mock(:identifier_mangling=>false).a.must_equal 1
2728
- Sequel.mock(:identifier_mangling=>false).b.must_equal 2
2565
+ Sequel.mock.a.must_equal 1
2566
+ Sequel.mock.b.must_equal 2
2567
+ end
2568
+
2569
+ it "should be loadable via the :extensions Database option" do
2570
+ Sequel::Database.register_extension(:a, Module.new{def a; 1; end})
2571
+ Sequel::Database.register_extension(:b, Module.new{def b; 2; end})
2572
+ Sequel.mock(:extensions=>:a).a.must_equal 1
2573
+ db = Sequel.mock(:extensions=>'a,b')
2574
+ db.a.must_equal 1
2575
+ db.b.must_equal 2
2576
+ db = Sequel.mock(:extensions=>[:a, :b])
2577
+ db.a.must_equal 1
2578
+ db.b.must_equal 2
2579
+ proc{Sequel.mock(:extensions=>nil).a}.must_raise NoMethodError
2580
+ proc{Sequel.mock(:extensions=>Object.new)}.must_raise Sequel::Error
2729
2581
  end
2730
2582
  end
2731
2583
 
@@ -2816,6 +2668,6 @@ end
2816
2668
 
2817
2669
  describe "Dataset identifier folding" do
2818
2670
  it "should fold to uppercase by default, as per SQL" do
2819
- Sequel::Database.new(:identifier_mangling=>false).send(:folds_unquoted_identifiers_to_uppercase?).must_equal true
2671
+ Sequel::Database.new.send(:folds_unquoted_identifiers_to_uppercase?).must_equal true
2820
2672
  end
2821
2673
  end