sequel 4.49.0 → 5.0.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 (477) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +3 -5
  6. data/doc/advanced_associations.rdoc +86 -163
  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/schema_modification.rdoc +63 -60
  29. data/doc/security.rdoc +97 -88
  30. data/doc/sharding.rdoc +43 -30
  31. data/doc/sql.rdoc +53 -65
  32. data/doc/testing.rdoc +3 -5
  33. data/doc/thread_safety.rdoc +2 -4
  34. data/doc/transactions.rdoc +18 -17
  35. data/doc/validations.rdoc +48 -45
  36. data/doc/virtual_rows.rdoc +87 -115
  37. data/lib/sequel.rb +1 -1
  38. data/lib/sequel/adapters/ado.rb +9 -25
  39. data/lib/sequel/adapters/ado/access.rb +7 -13
  40. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  41. data/lib/sequel/adapters/amalgalite.rb +3 -18
  42. data/lib/sequel/adapters/ibmdb.rb +9 -45
  43. data/lib/sequel/adapters/jdbc.rb +13 -73
  44. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  45. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  46. data/lib/sequel/adapters/jdbc/h2.rb +4 -25
  47. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
  48. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  49. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  50. data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
  51. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
  53. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  54. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  55. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  56. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  57. data/lib/sequel/adapters/mock.rb +4 -30
  58. data/lib/sequel/adapters/mysql.rb +7 -44
  59. data/lib/sequel/adapters/mysql2.rb +5 -23
  60. data/lib/sequel/adapters/odbc.rb +0 -19
  61. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  62. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  63. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  64. data/lib/sequel/adapters/oracle.rb +7 -13
  65. data/lib/sequel/adapters/postgres.rb +13 -57
  66. data/lib/sequel/adapters/postgresql.rb +1 -1
  67. data/lib/sequel/adapters/shared/access.rb +11 -51
  68. data/lib/sequel/adapters/shared/db2.rb +3 -61
  69. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  70. data/lib/sequel/adapters/shared/mysql.rb +23 -224
  71. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  72. data/lib/sequel/adapters/shared/postgres.rb +44 -259
  73. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  74. data/lib/sequel/adapters/shared/sqlite.rb +12 -101
  75. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  76. data/lib/sequel/adapters/sqlite.rb +2 -19
  77. data/lib/sequel/adapters/tinytds.rb +5 -15
  78. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  79. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
  80. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  81. data/lib/sequel/adapters/utils/replace.rb +0 -5
  82. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  83. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  84. data/lib/sequel/ast_transformer.rb +3 -94
  85. data/lib/sequel/connection_pool.rb +26 -28
  86. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  87. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  88. data/lib/sequel/connection_pool/single.rb +0 -2
  89. data/lib/sequel/connection_pool/threaded.rb +94 -110
  90. data/lib/sequel/core.rb +42 -101
  91. data/lib/sequel/database.rb +12 -2
  92. data/lib/sequel/database/connecting.rb +23 -60
  93. data/lib/sequel/database/dataset.rb +6 -9
  94. data/lib/sequel/database/dataset_defaults.rb +4 -48
  95. data/lib/sequel/database/features.rb +5 -4
  96. data/lib/sequel/database/logging.rb +2 -9
  97. data/lib/sequel/database/misc.rb +23 -55
  98. data/lib/sequel/database/query.rb +8 -13
  99. data/lib/sequel/database/schema_generator.rb +89 -64
  100. data/lib/sequel/database/schema_methods.rb +61 -79
  101. data/lib/sequel/database/transactions.rb +4 -24
  102. data/lib/sequel/dataset.rb +18 -10
  103. data/lib/sequel/dataset/actions.rb +53 -107
  104. data/lib/sequel/dataset/dataset_module.rb +3 -15
  105. data/lib/sequel/dataset/features.rb +30 -30
  106. data/lib/sequel/dataset/graph.rb +40 -49
  107. data/lib/sequel/dataset/misc.rb +12 -37
  108. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  109. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  110. data/lib/sequel/dataset/query.rb +71 -155
  111. data/lib/sequel/dataset/sql.rb +30 -225
  112. data/lib/sequel/deprecated.rb +18 -27
  113. data/lib/sequel/exceptions.rb +1 -17
  114. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  115. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  116. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  117. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  118. data/lib/sequel/extensions/connection_validator.rb +1 -1
  119. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  120. data/lib/sequel/extensions/core_extensions.rb +39 -49
  121. data/lib/sequel/extensions/core_refinements.rb +39 -45
  122. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  123. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  124. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  125. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  126. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  127. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  128. data/lib/sequel/extensions/from_block.rb +1 -35
  129. data/lib/sequel/extensions/graph_each.rb +2 -2
  130. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  131. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  132. data/lib/sequel/extensions/inflector.rb +4 -4
  133. data/lib/sequel/extensions/migration.rb +23 -40
  134. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  135. data/lib/sequel/extensions/null_dataset.rb +2 -8
  136. data/lib/sequel/extensions/pagination.rb +1 -17
  137. data/lib/sequel/extensions/pg_array.rb +20 -189
  138. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  139. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  140. data/lib/sequel/extensions/pg_inet.rb +2 -15
  141. data/lib/sequel/extensions/pg_interval.rb +1 -20
  142. data/lib/sequel/extensions/pg_json.rb +7 -27
  143. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  144. data/lib/sequel/extensions/pg_range.rb +6 -121
  145. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  146. data/lib/sequel/extensions/pg_row.rb +5 -77
  147. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  148. data/lib/sequel/extensions/query.rb +3 -4
  149. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  150. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  151. data/lib/sequel/extensions/select_remove.rb +3 -3
  152. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  153. data/lib/sequel/extensions/sql_comments.rb +2 -2
  154. data/lib/sequel/extensions/string_agg.rb +11 -8
  155. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  156. data/lib/sequel/model.rb +27 -62
  157. data/lib/sequel/model/associations.rb +128 -131
  158. data/lib/sequel/model/base.rb +171 -711
  159. data/lib/sequel/model/default_inflections.rb +1 -1
  160. data/lib/sequel/model/errors.rb +0 -3
  161. data/lib/sequel/model/exceptions.rb +2 -6
  162. data/lib/sequel/model/inflections.rb +1 -26
  163. data/lib/sequel/model/plugins.rb +1 -0
  164. data/lib/sequel/plugins/active_model.rb +2 -5
  165. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  166. data/lib/sequel/plugins/association_pks.rb +14 -28
  167. data/lib/sequel/plugins/association_proxies.rb +6 -7
  168. data/lib/sequel/plugins/auto_validations.rb +4 -4
  169. data/lib/sequel/plugins/before_after_save.rb +0 -43
  170. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  171. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  172. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  173. data/lib/sequel/plugins/caching.rb +5 -5
  174. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  175. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  176. data/lib/sequel/plugins/column_select.rb +2 -2
  177. data/lib/sequel/plugins/composition.rb +15 -24
  178. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  179. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  180. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  181. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  182. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  183. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  184. data/lib/sequel/plugins/finder.rb +16 -10
  185. data/lib/sequel/plugins/force_encoding.rb +1 -7
  186. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  187. data/lib/sequel/plugins/input_transformer.rb +10 -11
  188. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  189. data/lib/sequel/plugins/instance_filters.rb +5 -5
  190. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  191. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  192. data/lib/sequel/plugins/json_serializer.rb +19 -19
  193. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  194. data/lib/sequel/plugins/list.rb +6 -6
  195. data/lib/sequel/plugins/many_through_many.rb +11 -8
  196. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  197. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  198. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  199. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  200. data/lib/sequel/plugins/pg_row.rb +2 -11
  201. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  202. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  203. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  204. data/lib/sequel/plugins/serialization.rb +15 -33
  205. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  206. data/lib/sequel/plugins/sharding.rb +2 -8
  207. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  208. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  209. data/lib/sequel/plugins/static_cache.rb +8 -9
  210. data/lib/sequel/plugins/string_stripper.rb +3 -3
  211. data/lib/sequel/plugins/subclasses.rb +1 -1
  212. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  213. data/lib/sequel/plugins/table_select.rb +2 -2
  214. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  215. data/lib/sequel/plugins/timestamps.rb +6 -7
  216. data/lib/sequel/plugins/touch.rb +4 -8
  217. data/lib/sequel/plugins/tree.rb +3 -3
  218. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  219. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  220. data/lib/sequel/plugins/update_or_create.rb +3 -3
  221. data/lib/sequel/plugins/update_refresh.rb +3 -3
  222. data/lib/sequel/plugins/uuid.rb +7 -11
  223. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  224. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  225. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  226. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  227. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  228. data/lib/sequel/sql.rb +145 -276
  229. data/lib/sequel/timezones.rb +8 -22
  230. data/lib/sequel/version.rb +2 -2
  231. data/spec/adapter_spec.rb +1 -1
  232. data/spec/adapters/db2_spec.rb +2 -103
  233. data/spec/adapters/mssql_spec.rb +89 -68
  234. data/spec/adapters/mysql_spec.rb +101 -480
  235. data/spec/adapters/oracle_spec.rb +1 -9
  236. data/spec/adapters/postgres_spec.rb +312 -565
  237. data/spec/adapters/spec_helper.rb +12 -31
  238. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  239. data/spec/adapters/sqlite_spec.rb +8 -146
  240. data/spec/bin_spec.rb +11 -16
  241. data/spec/core/connection_pool_spec.rb +173 -74
  242. data/spec/core/database_spec.rb +64 -244
  243. data/spec/core/dataset_spec.rb +81 -415
  244. data/spec/core/deprecated_spec.rb +3 -3
  245. data/spec/core/expression_filters_spec.rb +37 -144
  246. data/spec/core/mock_adapter_spec.rb +176 -4
  247. data/spec/core/object_graph_spec.rb +11 -60
  248. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  249. data/spec/core/schema_generator_spec.rb +51 -40
  250. data/spec/core/schema_spec.rb +74 -77
  251. data/spec/core/spec_helper.rb +6 -24
  252. data/spec/core/version_spec.rb +1 -1
  253. data/spec/core_extensions_spec.rb +7 -83
  254. data/spec/core_model_spec.rb +2 -2
  255. data/spec/deprecation_helper.rb +2 -14
  256. data/spec/extensions/accessed_columns_spec.rb +1 -1
  257. data/spec/extensions/active_model_spec.rb +3 -3
  258. data/spec/extensions/after_initialize_spec.rb +1 -1
  259. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  260. data/spec/extensions/association_dependencies_spec.rb +1 -1
  261. data/spec/extensions/association_pks_spec.rb +4 -59
  262. data/spec/extensions/association_proxies_spec.rb +1 -1
  263. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  264. data/spec/extensions/auto_validations_spec.rb +1 -1
  265. data/spec/extensions/blacklist_security_spec.rb +1 -1
  266. data/spec/extensions/blank_spec.rb +1 -1
  267. data/spec/extensions/boolean_readers_spec.rb +1 -1
  268. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  269. data/spec/extensions/caching_spec.rb +1 -1
  270. data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
  271. data/spec/extensions/column_conflicts_spec.rb +1 -1
  272. data/spec/extensions/column_select_spec.rb +4 -4
  273. data/spec/extensions/columns_introspection_spec.rb +1 -1
  274. data/spec/extensions/columns_updated_spec.rb +1 -1
  275. data/spec/extensions/composition_spec.rb +1 -7
  276. data/spec/extensions/connection_expiration_spec.rb +3 -3
  277. data/spec/extensions/connection_validator_spec.rb +3 -3
  278. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  279. data/spec/extensions/constraint_validations_spec.rb +1 -1
  280. data/spec/extensions/core_refinements_spec.rb +1 -3
  281. data/spec/extensions/csv_serializer_spec.rb +4 -9
  282. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  283. data/spec/extensions/dataset_associations_spec.rb +2 -1
  284. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  285. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  286. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  287. data/spec/extensions/defaults_setter_spec.rb +2 -2
  288. data/spec/extensions/delay_add_association_spec.rb +8 -9
  289. data/spec/extensions/dirty_spec.rb +1 -1
  290. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  291. data/spec/extensions/eager_each_spec.rb +2 -2
  292. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  293. data/spec/extensions/error_splitter_spec.rb +1 -1
  294. data/spec/extensions/error_sql_spec.rb +1 -1
  295. data/spec/extensions/eval_inspect_spec.rb +1 -1
  296. data/spec/extensions/finder_spec.rb +1 -1
  297. data/spec/extensions/force_encoding_spec.rb +2 -5
  298. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  299. data/spec/extensions/graph_each_spec.rb +5 -5
  300. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  301. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  302. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  303. data/spec/extensions/inflector_spec.rb +1 -1
  304. data/spec/extensions/input_transformer_spec.rb +7 -2
  305. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  306. data/spec/extensions/instance_filters_spec.rb +1 -1
  307. data/spec/extensions/instance_hooks_spec.rb +1 -95
  308. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  309. data/spec/extensions/json_serializer_spec.rb +1 -1
  310. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  311. data/spec/extensions/list_spec.rb +1 -1
  312. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  313. data/spec/extensions/many_through_many_spec.rb +1 -1
  314. data/spec/extensions/migration_spec.rb +2 -2
  315. data/spec/extensions/modification_detection_spec.rb +1 -1
  316. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  317. data/spec/extensions/named_timezones_spec.rb +3 -3
  318. data/spec/extensions/nested_attributes_spec.rb +1 -29
  319. data/spec/extensions/null_dataset_spec.rb +1 -11
  320. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  321. data/spec/extensions/pagination_spec.rb +1 -1
  322. data/spec/extensions/pg_array_associations_spec.rb +4 -1
  323. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  324. data/spec/extensions/pg_array_spec.rb +3 -48
  325. data/spec/extensions/pg_enum_spec.rb +1 -1
  326. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  327. data/spec/extensions/pg_hstore_spec.rb +23 -32
  328. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_inet_spec.rb +1 -14
  330. data/spec/extensions/pg_interval_spec.rb +3 -13
  331. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  332. data/spec/extensions/pg_json_spec.rb +1 -13
  333. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  334. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_range_spec.rb +3 -88
  336. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  337. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  338. data/spec/extensions/pg_row_spec.rb +1 -44
  339. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  340. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  341. data/spec/extensions/prepared_statements_spec.rb +13 -48
  342. data/spec/extensions/pretty_table_spec.rb +1 -1
  343. data/spec/extensions/query_spec.rb +1 -12
  344. data/spec/extensions/rcte_tree_spec.rb +1 -1
  345. data/spec/extensions/round_timestamps_spec.rb +1 -5
  346. data/spec/extensions/s_spec.rb +1 -1
  347. data/spec/extensions/schema_caching_spec.rb +1 -1
  348. data/spec/extensions/schema_dumper_spec.rb +1 -1
  349. data/spec/extensions/select_remove_spec.rb +1 -1
  350. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  351. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  352. data/spec/extensions/serialization_spec.rb +2 -14
  353. data/spec/extensions/server_block_spec.rb +1 -1
  354. data/spec/extensions/server_logging_spec.rb +2 -2
  355. data/spec/extensions/sharding_spec.rb +1 -1
  356. data/spec/extensions/shared_caching_spec.rb +1 -28
  357. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  358. data/spec/extensions/singular_table_names_spec.rb +1 -1
  359. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  360. data/spec/extensions/spec_helper.rb +5 -27
  361. data/spec/extensions/split_array_nil_spec.rb +1 -1
  362. data/spec/extensions/split_values_spec.rb +1 -1
  363. data/spec/extensions/sql_comments_spec.rb +1 -1
  364. data/spec/extensions/sql_expr_spec.rb +1 -1
  365. data/spec/extensions/static_cache_spec.rb +1 -1
  366. data/spec/extensions/string_agg_spec.rb +2 -2
  367. data/spec/extensions/string_date_time_spec.rb +1 -1
  368. data/spec/extensions/string_stripper_spec.rb +1 -1
  369. data/spec/extensions/subclasses_spec.rb +1 -1
  370. data/spec/extensions/subset_conditions_spec.rb +1 -1
  371. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  372. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  373. data/spec/extensions/table_select_spec.rb +4 -4
  374. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  375. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  376. data/spec/extensions/timestamps_spec.rb +3 -3
  377. data/spec/extensions/to_dot_spec.rb +1 -1
  378. data/spec/extensions/touch_spec.rb +1 -1
  379. data/spec/extensions/tree_spec.rb +1 -1
  380. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  381. data/spec/extensions/unlimited_update_spec.rb +1 -1
  382. data/spec/extensions/update_or_create_spec.rb +1 -1
  383. data/spec/extensions/update_primary_key_spec.rb +4 -3
  384. data/spec/extensions/update_refresh_spec.rb +1 -1
  385. data/spec/extensions/uuid_spec.rb +10 -12
  386. data/spec/extensions/validate_associated_spec.rb +1 -1
  387. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  388. data/spec/extensions/validation_contexts_spec.rb +1 -1
  389. data/spec/extensions/validation_helpers_spec.rb +10 -44
  390. data/spec/extensions/whitelist_security_spec.rb +5 -5
  391. data/spec/extensions/xml_serializer_spec.rb +3 -3
  392. data/spec/guards_helper.rb +2 -1
  393. data/spec/integration/associations_test.rb +1 -23
  394. data/spec/integration/database_test.rb +7 -7
  395. data/spec/integration/dataset_test.rb +5 -47
  396. data/spec/integration/eager_loader_test.rb +1 -1
  397. data/spec/integration/migrator_test.rb +1 -1
  398. data/spec/integration/model_test.rb +4 -82
  399. data/spec/integration/plugin_test.rb +6 -22
  400. data/spec/integration/prepared_statement_test.rb +8 -88
  401. data/spec/integration/schema_test.rb +6 -6
  402. data/spec/integration/spec_helper.rb +13 -21
  403. data/spec/integration/timezone_test.rb +5 -5
  404. data/spec/integration/transaction_test.rb +3 -55
  405. data/spec/integration/type_test.rb +9 -9
  406. data/spec/model/association_reflection_spec.rb +24 -9
  407. data/spec/model/associations_spec.rb +124 -303
  408. data/spec/model/base_spec.rb +18 -137
  409. data/spec/model/class_dataset_methods_spec.rb +2 -20
  410. data/spec/model/dataset_methods_spec.rb +1 -20
  411. data/spec/model/eager_loading_spec.rb +17 -11
  412. data/spec/model/hooks_spec.rb +5 -300
  413. data/spec/model/inflector_spec.rb +1 -1
  414. data/spec/model/model_spec.rb +15 -320
  415. data/spec/model/plugins_spec.rb +2 -16
  416. data/spec/model/record_spec.rb +29 -121
  417. data/spec/model/spec_helper.rb +5 -15
  418. data/spec/model/validations_spec.rb +1 -1
  419. data/spec/sequel_warning.rb +1 -12
  420. metadata +8 -64
  421. data/doc/active_record.rdoc +0 -927
  422. data/lib/sequel/adapters/cubrid.rb +0 -160
  423. data/lib/sequel/adapters/do.rb +0 -166
  424. data/lib/sequel/adapters/do/mysql.rb +0 -69
  425. data/lib/sequel/adapters/do/postgres.rb +0 -46
  426. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  427. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  428. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  429. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  430. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  431. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  432. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  433. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  434. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  435. data/lib/sequel/adapters/shared/informix.rb +0 -63
  436. data/lib/sequel/adapters/shared/progress.rb +0 -40
  437. data/lib/sequel/adapters/swift.rb +0 -169
  438. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  439. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  440. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  441. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  442. data/lib/sequel/dataset/mutation.rb +0 -98
  443. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  444. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  445. data/lib/sequel/extensions/filter_having.rb +0 -65
  446. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  447. data/lib/sequel/extensions/meta_def.rb +0 -37
  448. data/lib/sequel/extensions/query_literals.rb +0 -86
  449. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  450. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  451. data/lib/sequel/extensions/set_overrides.rb +0 -82
  452. data/lib/sequel/no_core_ext.rb +0 -4
  453. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  454. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  455. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  456. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  457. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  458. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  459. data/lib/sequel/plugins/schema.rb +0 -84
  460. data/lib/sequel/plugins/scissors.rb +0 -37
  461. data/spec/core/dataset_mutation_spec.rb +0 -253
  462. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  463. data/spec/extensions/before_after_save_spec.rb +0 -40
  464. data/spec/extensions/filter_having_spec.rb +0 -42
  465. data/spec/extensions/from_block_spec.rb +0 -21
  466. data/spec/extensions/hash_aliases_spec.rb +0 -26
  467. data/spec/extensions/identifier_columns_spec.rb +0 -19
  468. data/spec/extensions/meta_def_spec.rb +0 -35
  469. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  470. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  471. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  472. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  473. data/spec/extensions/query_literals_spec.rb +0 -185
  474. data/spec/extensions/schema_spec.rb +0 -123
  475. data/spec/extensions/scissors_spec.rb +0 -27
  476. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  477. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,35 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Metaprogramming" do
4
- before do
5
- deprecated do
6
- Sequel.extension :meta_def
7
- end
8
- end
9
- after do
10
- Sequel::Metaprogramming.send(:remove_method, :meta_def)
11
- end
12
-
13
- it "should add meta_def method to Database, Dataset, and Model classes and instances" do
14
- Sequel::Database.meta_def(:foo){1}
15
- Sequel::Database.foo.must_equal 1
16
- Sequel::Dataset.meta_def(:foo){2}
17
- Sequel::Dataset.foo.must_equal 2
18
- Sequel::Model.meta_def(:foo){3}
19
- Sequel::Model.foo.must_equal 3
20
- o = Sequel::Database.new
21
- o.meta_def(:foo){4}
22
- o.foo.must_equal 4
23
-
24
- o = o[:a]
25
- # SEQUEL5: Remove
26
- unless o.frozen?
27
- o.meta_def(:foo){5}
28
- o.foo.must_equal 5
29
- end
30
-
31
- o = Sequel::Model.new
32
- o.meta_def(:foo){6}
33
- o.foo.must_equal 6
34
- end
35
- end
@@ -1,69 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "no_auto_literal_strings extension" do
4
- before do
5
- @ds = Sequel.mock[:t].extension(:no_auto_literal_strings)
6
- end
7
-
8
- it "should raise exception for plain strings in filter methods" do
9
- proc{@ds.where("a")}.must_raise Sequel::Error
10
- proc{@ds.having("a")}.must_raise Sequel::Error
11
- proc{@ds.filter("a")}.must_raise Sequel::Error
12
- proc{@ds.exclude_having("a")}.must_raise Sequel::Error
13
- deprecated do
14
- proc{@ds.exclude_where("a")}.must_raise Sequel::Error
15
- proc{@ds.and("a")}.must_raise Sequel::Error
16
- end
17
- proc{@ds.where(:a).or("a")}.must_raise Sequel::Error
18
- proc{@ds.first("a")}.must_raise Sequel::Error
19
- proc{@ds.order(:a).last("a")}.must_raise Sequel::Error
20
- proc{@ds["a"]}.must_raise Sequel::Error
21
- end
22
-
23
- it "should raise exception for plain strings arrays in filter methods" do
24
- proc{@ds.where(["a"])}.must_raise Sequel::Error
25
- end
26
-
27
- it "should handle explicit literal strings in filter methods" do
28
- @ds.where(Sequel.lit("a")).sql.must_equal 'SELECT * FROM t WHERE (a)'
29
- @ds.having(Sequel.lit("a")).sql.must_equal 'SELECT * FROM t HAVING (a)'
30
- @ds.filter(Sequel.lit("a")).sql.must_equal 'SELECT * FROM t WHERE (a)'
31
- @ds.exclude_having(Sequel.lit("a")).sql.must_equal 'SELECT * FROM t HAVING NOT (a)'
32
- deprecated do
33
- @ds.exclude_where(Sequel.lit("a")).sql.must_equal 'SELECT * FROM t WHERE NOT (a)'
34
- @ds.and(Sequel.lit("a")).sql.must_equal 'SELECT * FROM t WHERE (a)'
35
- end
36
- @ds.where(:a).or(Sequel.lit("a")).sql.must_equal 'SELECT * FROM t WHERE (a OR (a))'
37
- @ds.first(Sequel.lit("a"))
38
- @ds.order(:a).last(Sequel.lit("a"))
39
- @ds[Sequel.lit("a")]
40
- @ds.db.sqls.must_equal ["SELECT * FROM t WHERE (a) LIMIT 1",
41
- "SELECT * FROM t WHERE (a) ORDER BY a DESC LIMIT 1",
42
- "SELECT * FROM t WHERE (a) LIMIT 1"]
43
- end
44
-
45
- deprecated "should handle literal strings in arrays in filter methods" do
46
- @ds.where([Sequel.lit("a")]).sql.must_equal 'SELECT * FROM t WHERE (a)'
47
- end
48
-
49
- it "should handle other objects in filter methods" do
50
- @ds.where(:a).sql.must_equal 'SELECT * FROM t WHERE a'
51
- end
52
-
53
- it "should raise exception for plain strings in update methods" do
54
- proc{@ds.update("a = a + 1")}.must_raise Sequel::Error
55
- proc{@ds.update_sql("a = a + 1")}.must_raise Sequel::Error
56
- end
57
-
58
- it "should handle explicit literal strings in update methods" do
59
- @ds.update_sql(Sequel.lit("a = a + 1")).must_equal "UPDATE t SET a = a + 1"
60
- @ds.update(Sequel.lit("a = a + 1"))
61
- @ds.db.sqls.must_equal ["UPDATE t SET a = a + 1"]
62
- end
63
-
64
- it "should handle other objects in update methods" do
65
- @ds.update_sql(:a=>:a).must_equal "UPDATE t SET a = a"
66
- @ds.update(:a=>:a)
67
- @ds.db.sqls.must_equal ["UPDATE t SET a = a"]
68
- end
69
- end
@@ -1,70 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe Sequel::Model, "PgTypecastOnLoad plugin" do
4
- before do
5
- @db = Sequel.mock(:host=>'postgres', :fetch=>{:id=>1, :b=>"t", :y=>"0"}, :columns=>[:id, :b, :y], :numrows=>1)
6
- def @db.schema(*args)
7
- [[:id, {}], [:b, {:type=>:boolean, :oid=>16}], [:y, {:type=>:integer, :oid=>20}]]
8
- end
9
- @c = Class.new(Sequel::Model(@db[:items]))
10
- deprecated do
11
- @c.plugin :pg_typecast_on_load, :b, :y
12
- end
13
- end
14
-
15
- deprecated "should call the database conversion proc for all given columns" do
16
- @c.first.values.must_equal(:id=>1, :b=>true, :y=>0)
17
- end
18
-
19
- deprecated "should call the database conversion proc with value when reloading the object, for all given columns" do
20
- @c.first.refresh.values.must_equal(:id=>1, :b=>true, :y=>0)
21
- end
22
-
23
- deprecated "should not fail if schema oid does not have a related conversion proc" do
24
- @c.db_schema[:b][:oid] = 0
25
- @c.first.refresh.values.must_equal(:id=>1, :b=>"t", :y=>0)
26
- end
27
-
28
- deprecated "should call the database conversion proc with value when automatically reloading the object on creation via insert_select" do
29
- @c.dataset = @c.dataset.with_extend{def insert_select(h) insert(h); first end}
30
- @c.create.values.must_equal(:id=>1, :b=>true, :y=>0)
31
- end
32
-
33
- deprecated "should allowing setting columns separately via add_pg_typecast_on_load_columns" do
34
- @c = Class.new(Sequel::Model(@db[:items]))
35
- @c.plugin :pg_typecast_on_load
36
- @c.first.values.must_equal(:id=>1, :b=>"t", :y=>"0")
37
- @c.add_pg_typecast_on_load_columns :b
38
- @c.first.values.must_equal(:id=>1, :b=>true, :y=>"0")
39
- @c.add_pg_typecast_on_load_columns :y
40
- @c.first.values.must_equal(:id=>1, :b=>true, :y=>0)
41
- end
42
-
43
- deprecated "should work with subclasses" do
44
- @c = Class.new(Sequel::Model(@db[:items]))
45
- @c.plugin :pg_typecast_on_load
46
- @c.first.values.must_equal(:id=>1, :b=>"t", :y=>"0")
47
-
48
- c1 = Class.new(@c)
49
- @c.add_pg_typecast_on_load_columns :b
50
- @c.first.values.must_equal(:id=>1, :b=>true, :y=>"0")
51
- c1.first.values.must_equal(:id=>1, :b=>"t", :y=>"0")
52
-
53
- c2 = Class.new(@c)
54
- @c.add_pg_typecast_on_load_columns :y
55
- @c.first.values.must_equal(:id=>1, :b=>true, :y=>0)
56
- c2.first.values.must_equal(:id=>1, :b=>true, :y=>"0")
57
-
58
- c1.add_pg_typecast_on_load_columns :y
59
- c1.first.values.must_equal(:id=>1, :b=>"t", :y=>0)
60
- end
61
-
62
- deprecated "should not mark the object as modified" do
63
- @c.first.modified?.must_equal false
64
- end
65
-
66
- deprecated "should freeze pg_typecast_on_load_columns" do
67
- @c.freeze
68
- @c.pg_typecast_on_load_columns.frozen?.must_equal true
69
- end
70
- end
@@ -1,212 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Plugins::PreparedStatementsAssociations" do
4
- before do
5
- deprecated do
6
- @db = Sequel.mock(:servers=>{:foo=>{}})
7
- @db.extend_datasets do
8
- def select_sql
9
- sql = super
10
- sql << ' -- prepared' if is_a?(Sequel::Dataset::PreparedStatementMethods)
11
- sql
12
- end
13
- end
14
- @Artist = Class.new(Sequel::Model(@db[:artists]))
15
- @Artist.columns :id, :id2
16
- @Album= Class.new(Sequel::Model(@db[:albums]))
17
- @Album.columns :id, :artist_id, :id2, :artist_id2
18
- @Tag = Class.new(Sequel::Model(@db[:tags]))
19
- @Tag.columns :id, :id2
20
- @Artist.plugin :prepared_statements_associations
21
- @Album.plugin :prepared_statements_associations
22
- @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
23
- @Artist.one_to_one :album, :class=>@Album, :key=>:artist_id
24
- @Album.many_to_one :artist, :class=>@Artist
25
- @Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>:album_id
26
- @Album.one_through_one :tag, :clone=>:tags
27
- @Artist.plugin :many_through_many
28
- @Artist.many_through_many :tags, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :class=>@Tag
29
- @Artist.one_through_many :tag, :clone=>:tags
30
- @db.sqls
31
- end
32
- end
33
-
34
- deprecated "should run correct SQL for associations" do
35
- @Artist.load(:id=>1).albums
36
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE (albums.artist_id = 1) -- prepared"]
37
-
38
- @Artist.load(:id=>1).album
39
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE (albums.artist_id = 1) LIMIT 1 -- prepared"]
40
-
41
- @Album.load(:id=>1, :artist_id=>2).artist
42
- @db.sqls.must_equal ["SELECT id, id2 FROM artists WHERE (artists.id = 2) LIMIT 1 -- prepared"]
43
-
44
- @Album.load(:id=>1, :artist_id=>2).tags
45
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (albums_tags.album_id = 1) -- prepared"]
46
-
47
- @Album.load(:id=>1, :artist_id=>2).tag
48
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (albums_tags.album_id = 1) LIMIT 1 -- prepared"]
49
-
50
- @Artist.load(:id=>1).tags
51
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) WHERE (albums.artist_id = 1) -- prepared"]
52
-
53
- @Artist.load(:id=>1).tag
54
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) WHERE (albums.artist_id = 1) LIMIT 1 -- prepared"]
55
- end
56
-
57
- deprecated "should run correct shard for associations when also using sharding plugin" do
58
- @Artist.plugin :sharding
59
- @Album.plugin :sharding
60
-
61
- @Artist.load(:id=>1).set_server(:foo).albums
62
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE (albums.artist_id = 1) -- prepared -- foo"]
63
-
64
- @Artist.load(:id=>1).set_server(:foo).album
65
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE (albums.artist_id = 1) LIMIT 1 -- prepared -- foo"]
66
-
67
- @Album.load(:id=>1, :artist_id=>2).set_server(:foo).artist
68
- @db.sqls.must_equal ["SELECT id, id2 FROM artists WHERE (artists.id = 2) LIMIT 1 -- prepared -- foo"]
69
-
70
- @Album.load(:id=>1, :artist_id=>2).set_server(:foo).tags
71
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (albums_tags.album_id = 1) -- prepared -- foo"]
72
-
73
- @Album.load(:id=>1, :artist_id=>2).set_server(:foo).tag
74
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (albums_tags.album_id = 1) LIMIT 1 -- prepared -- foo"]
75
-
76
- @Artist.load(:id=>1).set_server(:foo).tags
77
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) WHERE (albums.artist_id = 1) -- prepared -- foo"]
78
-
79
- @Artist.load(:id=>1).set_server(:foo).tag
80
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) INNER JOIN albums ON (albums.id = albums_tags.album_id) WHERE (albums.artist_id = 1) LIMIT 1 -- prepared -- foo"]
81
-
82
- @Tag.plugin :sharding
83
- @Tag.plugin :prepared_statements_associations
84
- @Tag.many_to_many :albums, :class=>@Album, :join_table=>:albums_tags, :left_key=>:tag_id
85
- @Tag.load(:id=>1).set_server(:foo).albums
86
- @db.sqls.must_equal ["SELECT albums.id, albums.artist_id, albums.id2, albums.artist_id2 FROM albums INNER JOIN albums_tags ON (albums_tags.album_id = albums.id) WHERE (albums_tags.tag_id = 1) -- prepared -- foo"]
87
- end
88
-
89
- deprecated "should not override the shard for associations if not using the sharding plugin" do
90
- @Artist.load(:id=>1).set_server(:foo).albums
91
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE (albums.artist_id = 1) -- prepared"]
92
- end
93
-
94
- deprecated "should run correct SQL for composite key associations" do
95
- @Artist.one_to_many :albums, :class=>@Album, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
96
- @Artist.one_to_one :album, :class=>@Album, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
97
- @Album.many_to_one :artist, :class=>@Artist, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
98
- @Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>[:album_id, :album_id2], :right_key=>[:tag_id, :tag_id2], :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
99
- @Album.one_through_one :tag, :clone=>:tags
100
-
101
- @Artist.many_through_many :tags, [[:albums, [:artist_id, :artist_id2], [:id, :id2]], [:albums_tags, [:album_id, :album_id2], [:tag_id, :tag_id2]]], :class=>@Tag, :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
102
- @Artist.one_through_many :tag, :clone=>:tags
103
-
104
- @Artist.load(:id=>1, :id2=>2).albums
105
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) -- prepared"]
106
-
107
- @Artist.load(:id=>1, :id2=>2).album
108
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) LIMIT 1 -- prepared"]
109
-
110
- @Album.load(:id=>1, :artist_id=>2, :artist_id2=>3).artist
111
- @db.sqls.must_equal ["SELECT id, id2 FROM artists WHERE ((artists.id = 2) AND (artists.id2 = 3)) LIMIT 1 -- prepared"]
112
-
113
- @Album.load(:id=>1, :artist_id=>2, :id2=>3).tags
114
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2)) WHERE ((albums_tags.album_id = 1) AND (albums_tags.album_id2 = 3)) -- prepared"]
115
-
116
- @Album.load(:id=>1, :artist_id=>2, :id2=>3).tag
117
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2)) WHERE ((albums_tags.album_id = 1) AND (albums_tags.album_id2 = 3)) LIMIT 1 -- prepared"]
118
-
119
- @Artist.load(:id=>1, :id2=>2).tags
120
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2)) INNER JOIN albums ON ((albums.id = albums_tags.album_id) AND (albums.id2 = albums_tags.album_id2)) WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) -- prepared"]
121
-
122
- @Artist.load(:id=>1, :id2=>2).tag
123
- @db.sqls.must_equal ["SELECT tags.id, tags.id2 FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.tag_id2 = tags.id2)) INNER JOIN albums ON ((albums.id = albums_tags.album_id) AND (albums.id2 = albums_tags.album_id2)) WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) LIMIT 1 -- prepared"]
124
- end
125
-
126
- deprecated "should not run query if no objects can be associated" do
127
- @Artist.new.albums.must_equal []
128
- @Album.new.artist.must_be_nil
129
- @db.sqls.must_equal []
130
- end
131
-
132
- deprecated "should run a regular query if not caching association metadata" do
133
- @Artist.cache_associations = false
134
- @Artist.load(:id=>1).albums
135
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
136
- @Artist.load(:id=>1).album
137
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1) LIMIT 1"]
138
- end
139
-
140
- deprecated "should run a regular query if there is a callback" do
141
- @Artist.load(:id=>1).albums(proc{|ds| ds})
142
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
143
- @Artist.load(:id=>1).album(proc{|ds| ds})
144
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1) LIMIT 1"]
145
- end
146
-
147
- deprecated "should run a regular query if there is a block" do
148
- @Artist.load(:id=>1).albums{|ds| ds}
149
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
150
- @Artist.load(:id=>1).album{|ds| ds}
151
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1) LIMIT 1"]
152
- end
153
-
154
- deprecated "should run a regular query if :prepared_statement=>false option is used for the association" do
155
- @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :prepared_statement=>false
156
- @Artist.load(:id=>1).albums
157
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
158
- end
159
-
160
- deprecated "should run a regular query if unrecognized association is used" do
161
- a = @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
162
- a[:type] = :foo
163
- @Artist.load(:id=>1).albums
164
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
165
- end
166
-
167
- deprecated "should run a regular query if a block is used when defining the association" do
168
- @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id do |ds| ds end
169
- @Artist.load(:id=>1).albums
170
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
171
- end
172
-
173
- deprecated "should use a prepared statement if the associated dataset has conditions" do
174
- @Album.dataset = @Album.dataset.where(:a=>2)
175
- @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
176
- @Artist.load(:id=>1).albums
177
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE ((a = 2) AND (albums.artist_id = 1)) -- prepared"]
178
- end
179
-
180
- deprecated "should use a prepared statement if the :conditions association option" do
181
- @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{:a=>2}
182
- @Artist.load(:id=>1).albums
183
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE ((a = 2) AND (albums.artist_id = 1)) -- prepared"]
184
- end
185
-
186
- deprecated "should not use a prepared statement if :conditions association option uses an identifier" do
187
- @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{Sequel.identifier('a')=>2}
188
- @Artist.load(:id=>1).albums
189
- @db.sqls.must_equal ["SELECT id, artist_id, id2, artist_id2 FROM albums WHERE ((a = 2) AND (albums.artist_id = 1)) -- prepared"]
190
- end
191
-
192
- deprecated "should run a regular query if :dataset option is used when defining the association" do
193
- album = @Album
194
- @Artist.one_to_many :albums, :class=>@Album, :dataset=>proc{album.filter(:artist_id=>id)}
195
- @Artist.load(:id=>1).albums
196
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (artist_id = 1)"]
197
- end
198
-
199
- deprecated "should run a regular query if :cloning an association that doesn't used prepared statements" do
200
- @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id do |ds| ds end
201
- @Artist.one_to_many :oalbums, :clone=>:albums
202
- @Artist.load(:id=>1).oalbums
203
- @db.sqls.must_equal ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
204
- end
205
-
206
- deprecated "should work correctly when using an instance specific association" do
207
- tag = @Tag
208
- @Artist.many_to_one :tag, :key=>nil, :read_only=>true, :dataset=>proc{tag.where(:id=>id).limit(1)}, :reciprocal=>nil, :reciprocal_type=>nil
209
- @Artist.load(:id=>1).tag.must_be_nil
210
- @db.sqls.must_equal ["SELECT * FROM tags WHERE (id = 1) LIMIT 1"]
211
- end
212
- end
@@ -1,40 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "prepared_statements_with_pk plugin" do
4
- before do
5
- deprecated do
6
- @db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
7
- @c = Class.new(Sequel::Model(@db[:people]))
8
- @c.columns :id, :name, :i
9
- @c.plugin :prepared_statements_with_pk
10
- @p = @c.load(:id=>1, :name=>'foo', :i=>2)
11
- @db.sqls
12
- end
13
- end
14
-
15
- deprecated "should load the prepared_statements plugin" do
16
- @c.plugins.must_include(Sequel::Plugins::PreparedStatements)
17
- end
18
-
19
- deprecated "should correctly lookup by primary key from dataset" do
20
- @c.dataset.filter(:name=>'foo')[1].must_equal @p
21
- @c.db.sqls.must_equal ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1 -- read_only"]
22
- end
23
-
24
- deprecated "should still work correctly if there are multiple conflicting variables" do
25
- @c.dataset.filter(:name=>'foo').or(:name=>'bar')[1].must_equal @p
26
- @c.db.sqls.must_equal ["SELECT * FROM people WHERE (((name = 'foo') OR (name = 'bar')) AND (people.id = 1)) LIMIT 1 -- read_only"]
27
- end
28
-
29
- deprecated "should still work correctly if the primary key is used elsewhere in the query" do
30
- @c.dataset.filter{id > 2}[1].must_equal @p
31
- @c.db.sqls.must_equal ["SELECT * FROM people WHERE ((id > 2) AND (people.id = 1)) LIMIT 1 -- read_only"]
32
- end
33
-
34
- deprecated "should respect explicitly set server" do
35
- @c.dataset.filter(:name=>'foo')[1].must_equal @p
36
- @c.db.sqls.must_equal ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1 -- read_only"]
37
- @c.dataset.server(:default).filter(:name=>'foo')[1].must_equal @p
38
- @c.db.sqls.must_equal ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1"]
39
- end
40
- end
@@ -1,185 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "query_literals extension" do
4
- before do
5
- deprecated do
6
- @ds = Sequel.mock.dataset.from(:t).extension(:query_literals)
7
- end
8
- end
9
-
10
- it "should not use special support if given a block" do
11
- @ds.select('a, b, c'){d}.sql.must_equal 'SELECT \'a, b, c\', d FROM t'
12
- end
13
-
14
- it "should have #select use literal string if given a single string" do
15
- @ds.select('a, b, c').sql.must_equal 'SELECT a, b, c FROM t'
16
- end
17
-
18
- it "should have #select use placeholder literal string if given a string and additional arguments" do
19
- @ds.select('a, b, ?', 1).sql.must_equal 'SELECT a, b, 1 FROM t'
20
- end
21
-
22
- it "should have #select work the standard way if initial string is a literal string already" do
23
- @ds.select(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT a, b, ?, 1 FROM t'
24
- end
25
-
26
- it "should have #select work regularly if not given a string as the first argument" do
27
- @ds.select(:a, 1).sql.must_equal 'SELECT a, 1 FROM t'
28
- end
29
-
30
- describe 'with existing selection' do
31
- before do
32
- @ds = @ds.select(:d)
33
- end
34
-
35
- it "should have #select_more use literal string if given a single string" do
36
- @ds.select_more('a, b, c').sql.must_equal 'SELECT d, a, b, c FROM t'
37
- end
38
-
39
- it "should have #select_more use placeholder literal string if given a string and additional arguments" do
40
- @ds.select_more('a, b, ?', 1).sql.must_equal 'SELECT d, a, b, 1 FROM t'
41
- end
42
-
43
- it "should have #select_more work the standard way if initial string is a literal string already" do
44
- @ds.select_more(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT d, a, b, ?, 1 FROM t'
45
- end
46
-
47
- it "should have #select_more work regularly if not given a string as the first argument" do
48
- @ds.select_more(:a, 1).sql.must_equal 'SELECT d, a, 1 FROM t'
49
- end
50
- end
51
-
52
- it "should have #select_append use literal string if given a single string" do
53
- @ds.select_append('a, b, c').sql.must_equal 'SELECT *, a, b, c FROM t'
54
- end
55
-
56
- it "should have #select_append use placeholder literal string if given a string and additional arguments" do
57
- @ds.select_append('a, b, ?', 1).sql.must_equal 'SELECT *, a, b, 1 FROM t'
58
- end
59
-
60
- it "should have #select_append work the standard way if initial string is a literal string already" do
61
- @ds.select_append(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT *, a, b, ?, 1 FROM t'
62
- end
63
-
64
- it "should have #select_append work regularly if not given a string as the first argument" do
65
- @ds.select_append(:a, 1).sql.must_equal 'SELECT *, a, 1 FROM t'
66
- end
67
-
68
- it "should have #select_group use literal string if given a single string" do
69
- @ds.select_group('a, b, c').sql.must_equal 'SELECT a, b, c FROM t GROUP BY a, b, c'
70
- end
71
-
72
- it "should have #select_group use placeholder literal string if given a string and additional arguments" do
73
- @ds.select_group('a, b, ?', 1).sql.must_equal 'SELECT a, b, 1 FROM t GROUP BY a, b, 1'
74
- end
75
-
76
- it "should have #select_group work the standard way if initial string is a literal string already" do
77
- @ds.select_group(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT a, b, ?, 1 FROM t GROUP BY a, b, ?, 1'
78
- end
79
-
80
- it "should have #select_group work regularly if not given a string as the first argument" do
81
- @ds.select_group(:a, 1).sql.must_equal 'SELECT a, 1 FROM t GROUP BY a, 1'
82
- end
83
-
84
- it "should have #group use literal string if given a single string" do
85
- @ds.group('a, b, c').sql.must_equal 'SELECT * FROM t GROUP BY a, b, c'
86
- end
87
-
88
- it "should have #group use placeholder literal string if given a string and additional arguments" do
89
- @ds.group('a, b, ?', 1).sql.must_equal 'SELECT * FROM t GROUP BY a, b, 1'
90
- end
91
-
92
- it "should have #group work the standard way if initial string is a literal string already" do
93
- @ds.group(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT * FROM t GROUP BY a, b, ?, 1'
94
- end
95
-
96
- it "should have #group work regularly if not given a string as the first argument" do
97
- @ds.group(:a, 1).sql.must_equal 'SELECT * FROM t GROUP BY a, 1'
98
- end
99
-
100
- it "should have #group_and_count use literal string if given a single string" do
101
- @ds.group_and_count('a, b, c').sql.must_equal 'SELECT a, b, c, count(*) AS count FROM t GROUP BY a, b, c'
102
- end
103
-
104
- it "should have #group_and_count use placeholder literal string if given a string and additional arguments" do
105
- @ds.group_and_count('a, b, ?', 1).sql.must_equal 'SELECT a, b, 1, count(*) AS count FROM t GROUP BY a, b, 1'
106
- end
107
-
108
- it "should have #group_and_count work the standard way if initial string is a literal string already" do
109
- @ds.group_and_count(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT a, b, ?, 1, count(*) AS count FROM t GROUP BY a, b, ?, 1'
110
- end
111
-
112
- it "should have #group_and_count work regularly if not given a string as the first argument" do
113
- @ds.group_and_count(:a, 1).sql.must_equal 'SELECT a, 1, count(*) AS count FROM t GROUP BY a, 1'
114
- end
115
-
116
- it "should have #group_append use literal string if given a single string" do
117
- @ds.group(:d).group_append('a, b, c').sql.must_equal 'SELECT * FROM t GROUP BY d, a, b, c'
118
- end
119
-
120
- it "should have #group_append use placeholder literal string if given a string and additional arguments" do
121
- @ds.group(:d).group_append('a, b, ?', 1).sql.must_equal 'SELECT * FROM t GROUP BY d, a, b, 1'
122
- end
123
-
124
- it "should have #group_append work the standard way if initial string is a literal string already" do
125
- @ds.group(:d).group_append(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT * FROM t GROUP BY d, a, b, ?, 1'
126
- end
127
-
128
- it "should have #group_append work regularly if not given a string as the first argument" do
129
- @ds.group(:d).group_append(:a, 1).sql.must_equal 'SELECT * FROM t GROUP BY d, a, 1'
130
- end
131
-
132
- it "should have #order use literal string if given a single string" do
133
- @ds.order('a, b, c').sql.must_equal 'SELECT * FROM t ORDER BY a, b, c'
134
- end
135
-
136
- it "should have #order use placeholder literal string if given a string and additional arguments" do
137
- @ds.order('a, b, ?', 1).sql.must_equal 'SELECT * FROM t ORDER BY a, b, 1'
138
- end
139
-
140
- it "should have #order work the standard way if initial string is a literal string already" do
141
- @ds.order(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT * FROM t ORDER BY a, b, ?, 1'
142
- end
143
-
144
- it "should have #order work regularly if not given a string as the first argument" do
145
- @ds.order(:a, 1).sql.must_equal 'SELECT * FROM t ORDER BY a, 1'
146
- end
147
-
148
- describe 'with existing order' do
149
- before do
150
- @ds = @ds.order(:d)
151
- end
152
-
153
- it "should have #order_more use literal string if given a single string" do
154
- @ds.order_more('a, b, c').sql.must_equal 'SELECT * FROM t ORDER BY d, a, b, c'
155
- end
156
-
157
- it "should have #order_more use placeholder literal string if given a string and additional arguments" do
158
- @ds.order_more('a, b, ?', 1).sql.must_equal 'SELECT * FROM t ORDER BY d, a, b, 1'
159
- end
160
-
161
- it "should have #order_more work the standard way if initial string is a literal string already" do
162
- @ds.order_more(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT * FROM t ORDER BY d, a, b, ?, 1'
163
- end
164
-
165
- it "should have #order_more work regularly if not given a string as the first argument" do
166
- @ds.order_more(:a, 1).sql.must_equal 'SELECT * FROM t ORDER BY d, a, 1'
167
- end
168
-
169
- it "should have #order_prepend use literal string if given a single string" do
170
- @ds.order_prepend('a, b, c').sql.must_equal 'SELECT * FROM t ORDER BY a, b, c, d'
171
- end
172
-
173
- it "should have #order_append use placeholder literal string if given a string and additional arguments" do
174
- @ds.order_prepend('a, b, ?', 1).sql.must_equal 'SELECT * FROM t ORDER BY a, b, 1, d'
175
- end
176
-
177
- it "should have #order_append work the standard way if initial string is a literal string already" do
178
- @ds.order_prepend(Sequel.lit('a, b, ?'), 1).sql.must_equal 'SELECT * FROM t ORDER BY a, b, ?, 1, d'
179
- end
180
-
181
- it "should have #order_append work regularly if not given a string as the first argument" do
182
- @ds.order_prepend(:a, 1).sql.must_equal 'SELECT * FROM t ORDER BY a, 1, d'
183
- end
184
- end
185
- end