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,71 +1,3 @@
1
1
  # frozen-string-literal: true
2
- #
3
- # The freeze_datasets extension freezes a databases's datasets by
4
- # default, and makes it so the databases's datasets are always
5
- # frozen. This makes sure you can never accidentally modify a
6
- # dataset that may be used elsewhere (such as a model class's
7
- # dataset or the same dataset being used in another thread).
8
- # Frozen datasets can also perform caching for many
9
- # different methods that can significantly improve performance.
10
- #
11
- # In addition to the caching provided by frozen datasets, this
12
- # also adds caching of Database#from calls if the method is
13
- # called with a single Symbol argument and not a block. In
14
- # addition to speeding up Dataset#from itself, because it
15
- # returns a cached dataset, all caching done by that dataset
16
- # can also improve performance.
17
- #
18
- # Usage:
19
- #
20
- # DB.extension(:freeze_datasets)
21
- #
22
- # Related module: Sequel::FreezeDatasets
23
2
 
24
- #
25
- module Sequel
26
- class Database
27
- module FreezeDatasets
28
- module DatasetMethods
29
- # Make dup be an alias to clone, so that it
30
- # returns a frozen dataset.
31
- def dup
32
- clone
33
- end
34
- end
35
-
36
- # Reset the default dataset for this database after
37
- # loading the extension.
38
- def self.extended(db)
39
- db.extend_datasets(DatasetMethods)
40
- end
41
-
42
- # Cache returned dataset if given a single argument and no block.
43
- def from(*args, &block)
44
- if !block && args.length == 1 && (table = args[0]).is_a?(Symbol)
45
- @default_dataset.send(:cached_dataset, :"_from_#{table}_ds"){super}
46
- else
47
- super
48
- end
49
- end
50
-
51
- # Freeze datasets created from this dataset.
52
- def dataset
53
- super.freeze
54
- end
55
-
56
- private
57
-
58
- # Clear the cache of the default dataset when removing a cached
59
- # schema, in order to clear the from table cache.
60
- def remove_cached_schema(table)
61
- cache = @default_dataset.send(:cache)
62
- Sequel.synchronize{cache.clear}
63
- super
64
- end
65
- end
66
-
67
- register_extension(:freeze_datasets, FreezeDatasets)
68
- end
69
- end
70
-
71
- # Sequel::Database.register_extension(:freeze_datasets){} # SEQUEL5
3
+ Sequel::Database.register_extension(:freeze_datasets){}
@@ -1,37 +1,3 @@
1
1
  # frozen-string-literal: true
2
- #
3
- # The from_block extension changes Database#from so that blocks given
4
- # to it are treated as virtual rows applying to the FROM clause,
5
- # instead of virtual rows applying to the WHERE clause. This will
6
- # probably be made the default in the next major version of Sequel.
7
- #
8
- # This makes it easier to use table returning functions:
9
- #
10
- # DB.from{table_function(1)}
11
- # # SELECT * FROM table_function(1)
12
- #
13
- # To load the extension into the database:
14
- #
15
- # DB.extension :from_block
16
- #
17
- # Related module: Sequel::Database::FromBlock
18
2
 
19
- #
20
- module Sequel
21
- module Database::FromBlock
22
- # If a block is given, make it affect the FROM clause:
23
- # DB.from{table_function(1)}
24
- # # SELECT * FROM table_function(1)
25
- def from(*args, &block)
26
- if block
27
- @default_dataset.from(*args, &block)
28
- else
29
- super
30
- end
31
- end
32
- end
33
-
34
- Database.register_extension(:from_block, Database::FromBlock)
35
- end
36
-
37
- # Sequel::Database.register_extension(:from_block){} # SEQUEL5
3
+ Sequel::Database.register_extension(:from_block){}
@@ -4,7 +4,7 @@
4
4
  # makes Dataset#each call #graph_each if the dataset has been graphed.
5
5
  # Dataset#graph_each splits result hashes into subhashes per table:
6
6
  #
7
- # DB[:a].graph(:b, :id=>:b_id).all
7
+ # DB[:a].graph(:b, id: :b_id).all
8
8
  # # => {:a=>{:id=>1, :b_id=>2}, :b=>{:id=>2}}
9
9
  #
10
10
  # You can load this extension into specific datasets:
@@ -56,7 +56,7 @@ module Sequel
56
56
  datasets = datasets.map{|ta, ds| [ta, ds, ds.row_proc]}
57
57
  # Use the manually set graph aliases, if any, otherwise
58
58
  # use the ones automatically created by .graph
59
- column_aliases = @opts[:graph_aliases] || @opts[:graph][:column_aliases] # SEQUEL5: Remove :graph_aliases support
59
+ column_aliases = @opts[:graph][:column_aliases]
60
60
  fetch_rows(sql) do |r|
61
61
  graph = {}
62
62
  # Create the sub hashes, one per table
@@ -120,10 +120,9 @@ module Sequel
120
120
  # Reset the identifier mangling options. Overrides any already set on
121
121
  # the instance. Only for internal use by shared adapters.
122
122
  def reset_identifier_mangling
123
- # SEQUEL5: Stop checking Database.*
124
- @quote_identifiers = @opts.fetch(:quote_identifiers){(qi = Database.quote_identifiers).nil? ? quote_identifiers_default : qi}
125
- @identifier_input_method = @opts.fetch(:identifier_input_method){(iim = Database.identifier_input_method).nil? ? identifier_input_method_default : (iim if iim)}
126
- @identifier_output_method = @opts.fetch(:identifier_output_method){(iom = Database.identifier_output_method).nil? ? identifier_output_method_default : (iom if iom)}
123
+ @quote_identifiers = @opts.fetch(:quote_identifiers, quote_identifiers_default)
124
+ @identifier_input_method = @opts.fetch(:identifier_input_method, identifier_input_method_default)
125
+ @identifier_output_method = @opts.fetch(:identifier_output_method, identifier_output_method_default)
127
126
  reset_default_dataset
128
127
  end
129
128
  end
@@ -135,25 +134,12 @@ module Sequel
135
134
  @opts.fetch(:identifier_input_method, db.identifier_input_method)
136
135
  end
137
136
 
138
- # Set the method to call on identifiers going into the database for this dataset
139
- def identifier_input_method=(v)
140
- raise_if_frozen!(%w"identifier_input_method= with_identifier_input_method")
141
- skip_symbol_cache!
142
- @opts[:identifier_input_method] = v
143
- end
144
-
145
137
  # The String instance method to call on identifiers before sending them to
146
138
  # the database.
147
139
  def identifier_output_method
148
140
  @opts.fetch(:identifier_output_method, db.identifier_output_method)
149
141
  end
150
142
 
151
- # Set the method to call on identifiers coming the database for this dataset
152
- def identifier_output_method=(v)
153
- raise_if_frozen!(%w"identifier_output_method= with_identifier_output_method")
154
- @opts[:identifier_output_method] = v
155
- end
156
-
157
143
  # Check with the database to see if identifier quoting is enabled
158
144
  def quote_identifiers?
159
145
  @opts.fetch(:quote_identifiers, db.quote_identifiers?)
@@ -174,14 +160,18 @@ module Sequel
174
160
  # Convert the identifier to the version used in the database via
175
161
  # identifier_input_method.
176
162
  def input_identifier(v)
177
- (i = identifier_input_method) ? v.to_s.send(i) : v.to_s
163
+ (i = identifier_input_method) ? v.to_s.public_send(i) : v.to_s
178
164
  end
179
165
 
180
166
  # Modify the identifier returned from the database based on the
181
167
  # identifier_output_method.
182
168
  def output_identifier(v)
183
169
  v = 'untitled' if v == ''
184
- (i = identifier_output_method) ? v.to_s.send(i).to_sym : v.to_sym
170
+ (i = identifier_output_method) ? v.to_s.public_send(i).to_sym : v.to_sym
171
+ end
172
+
173
+ def non_sql_option?(key)
174
+ super || key == :identifier_input_method || key == :identifier_output_method
185
175
  end
186
176
  end
187
177
  end
@@ -27,7 +27,7 @@
27
27
  module Sequel
28
28
  class Dataset
29
29
  module ImplicitSubquery
30
- exceptions = [:and, :add_graph_aliases, :filter, :from, :from_self, :naked, :or, :order_more,
30
+ exceptions = [:add_graph_aliases, :filter, :from, :from_self, :naked, :or, :order_more,
31
31
  :qualify, :reverse, :reverse_order, :select_all, :select_more, :server,
32
32
  :set_graph_aliases, :unfiltered, :ungraphed, :ungrouped, :unlimited, :unordered,
33
33
  :with_sql]
@@ -35,7 +35,7 @@ module Sequel
35
35
  (Dataset::QUERY_METHODS - Dataset::JOIN_METHODS - exceptions + additions).each do |meth|
36
36
  define_method(meth) do |*a, &b|
37
37
  if opts[:sql]
38
- from_self.send(meth, *a, &b)
38
+ from_self.public_send(meth, *a, &b)
39
39
  else
40
40
  super(*a, &b)
41
41
  end
@@ -95,8 +95,8 @@ class String
95
95
  (@uncountables << words).flatten!
96
96
  end
97
97
 
98
- Sequel.require('default_inflections', 'model')
99
- instance_eval(&Sequel::DEFAULT_INFLECTIONS_PROC)
98
+ require_relative '../model/default_inflections'
99
+ instance_exec(&Sequel::DEFAULT_INFLECTIONS_PROC)
100
100
  end
101
101
 
102
102
  # Yield the Inflections module if a block is given, and return
@@ -151,7 +151,7 @@ class String
151
151
  # Example
152
152
  # "puni_puni".dasherize #=> "puni-puni"
153
153
  def dasherize
154
- gsub(/_/, '-')
154
+ gsub('_', '-')
155
155
  end
156
156
 
157
157
  # Removes the module part from the expression in the string
@@ -181,7 +181,7 @@ class String
181
181
  # "employee_salary" #=> "Employee salary"
182
182
  # "author_id" #=> "Author"
183
183
  def humanize
184
- gsub(/_id$/, "").gsub(/_/, " ").capitalize
184
+ gsub(/_id$/, "").gsub('_', " ").capitalize
185
185
  end
186
186
 
187
187
  # Returns the plural form of the word in the string.
@@ -41,7 +41,7 @@ module Sequel
41
41
  # direction.
42
42
  def self.apply(db, direction)
43
43
  raise(ArgumentError, "Invalid migration direction specified (#{direction.inspect})") unless [:up, :down].include?(direction)
44
- new(db).send(direction)
44
+ new(db).public_send(direction)
45
45
  end
46
46
 
47
47
  # Returns the list of Migration descendants.
@@ -65,6 +65,7 @@ module Sequel
65
65
 
66
66
  # Intercepts method calls intended for the database and sends them along.
67
67
  def method_missing(method_sym, *args, &block)
68
+ # Allow calling private methods for backwards compatibility
68
69
  @db.send(method_sym, *args, &block)
69
70
  end
70
71
 
@@ -99,29 +100,29 @@ module Sequel
99
100
  end
100
101
 
101
102
  # Apply the appropriate block on the +Database+
102
- # instance using instance_eval.
103
+ # instance using instance_exec.
103
104
  def apply(db, direction)
104
105
  raise(ArgumentError, "Invalid migration direction specified (#{direction.inspect})") unless [:up, :down].include?(direction)
105
- if prok = send(direction)
106
- db.instance_eval(&prok)
106
+ if prok = public_send(direction)
107
+ db.instance_exec(&prok)
107
108
  end
108
109
  end
109
110
  end
110
111
 
111
112
  # Internal class used by the Sequel.migration DSL, part of the +migration+ extension.
112
113
  class MigrationDSL < BasicObject
113
- # The underlying Migration instance
114
+ # The underlying SimpleMigration instance
114
115
  attr_reader :migration
115
116
 
116
117
  def self.create(&block)
117
118
  new(&block).migration
118
119
  end
119
120
 
120
- # Create a new migration class, and instance_eval the block.
121
+ # Create a new migration class, and instance_exec the block.
121
122
  def initialize(&block)
122
123
  @migration = SimpleMigration.new
123
124
  Migration.descendants << migration
124
- instance_eval(&block)
125
+ instance_exec(&block)
125
126
  end
126
127
 
127
128
  # Defines the migration's down action.
@@ -150,7 +151,7 @@ module Sequel
150
151
  # the block.
151
152
  #
152
153
  # There are no guarantees that this will work perfectly
153
- # in all cases, but it should work for most common cases.
154
+ # in all cases, but it works for some simple cases.
154
155
  def change(&block)
155
156
  migration.up = block
156
157
  migration.down = MigrationReverser.new.reverse(&block)
@@ -170,7 +171,7 @@ module Sequel
170
171
  # the given block.
171
172
  def reverse(&block)
172
173
  begin
173
- instance_eval(&block)
174
+ instance_exec(&block)
174
175
  rescue
175
176
  just_raise = true
176
177
  end
@@ -180,12 +181,9 @@ module Sequel
180
181
  actions = @actions.reverse
181
182
  Proc.new do
182
183
  actions.each do |a|
183
- if a.last.is_a?(Proc)
184
- pr = a.pop
185
- send(*a, &pr)
186
- else
187
- send(*a)
188
- end
184
+ pr = a.last.is_a?(Proc) ? a.pop : nil
185
+ # Allow calling private methods as the reversing methods are private
186
+ send(*a, &pr)
189
187
  end
190
188
  end
191
189
  end
@@ -233,8 +231,9 @@ module Sequel
233
231
  end
234
232
 
235
233
  def reverse(&block)
236
- instance_eval(&block)
234
+ instance_exec(&block)
237
235
  actions = @actions.reverse
236
+ # Allow calling private methods as the reversing methods are private
238
237
  Proc.new{actions.each{|a| send(*a)}}
239
238
  end
240
239
 
@@ -339,25 +338,20 @@ module Sequel
339
338
  #
340
339
  # For example, to migrate the database all the way down:
341
340
  #
342
- # Sequel::Migrator.run(DB, '.', :target=>0)
341
+ # Sequel::Migrator.run(DB, '.', target: 0)
343
342
  #
344
343
  # For example, to migrate the database to version 4:
345
344
  #
346
- # Sequel::Migrator.run(DB, '.', :target=>4)
345
+ # Sequel::Migrator.run(DB, '.', target: 4)
347
346
  #
348
347
  # To migrate the database from version 1 to version 5:
349
348
  #
350
- # Sequel::Migrator.run(DB, '.', :target=>5, :current=>1)
349
+ # Sequel::Migrator.run(DB, '.', target: 5, current: 1)
351
350
  #
352
351
  # Part of the +migration+ extension.
353
352
  class Migrator
354
353
  MIGRATION_FILE_PATTERN = /\A(\d+)_.+\.rb\z/i.freeze
355
354
 
356
- MIGRATION_SPLITTER = '_'.freeze
357
- Sequel::Deprecation.deprecate_constant(self, :MIGRATION_SPLITTER)
358
- MINIMUM_TIMESTAMP = 20000101
359
- Sequel::Deprecation.deprecate_constant(self, :MINIMUM_TIMESTAMP)
360
-
361
355
  # Exception class raised when there is an error with the migrator's
362
356
  # file structure, database, or arguments.
363
357
  class Error < Sequel::Error
@@ -397,16 +391,15 @@ module Sequel
397
391
  #
398
392
  # Examples:
399
393
  # Sequel::Migrator.run(DB, "migrations")
400
- # Sequel::Migrator.run(DB, "migrations", :target=>15, :current=>10)
401
- # Sequel::Migrator.run(DB, "app1/migrations", :column=> :app2_version)
402
- # Sequel::Migrator.run(DB, "app2/migrations", :column => :app2_version, :table=>:schema_info2)
394
+ # Sequel::Migrator.run(DB, "migrations", target: 15, current: 10)
395
+ # Sequel::Migrator.run(DB, "app1/migrations", column: :app2_version)
396
+ # Sequel::Migrator.run(DB, "app2/migrations", column: :app2_version, table: :schema_info2)
403
397
  def self.run(db, directory, opts=OPTS)
404
398
  migrator_class(directory).new(db, directory, opts).run
405
399
  end
406
400
 
407
401
  # Choose the Migrator subclass to use. Uses the TimestampMigrator
408
- # if the version number appears to be a unix time integer for a year
409
- # after 2005, otherwise uses the IntegerMigrator.
402
+ # if the version number is greater than 20000101, otherwise uses the IntegerMigrator.
410
403
  def self.migrator_class(directory)
411
404
  if self.equal?(Migrator)
412
405
  Dir.new(directory).each do |file|
@@ -508,11 +501,6 @@ module Sequel
508
501
  # version number starting with 1, where missing or duplicate migration file
509
502
  # versions are not allowed. Part of the +migration+ extension.
510
503
  class IntegerMigrator < Migrator
511
- DEFAULT_SCHEMA_COLUMN = :version
512
- DEFAULT_SCHEMA_TABLE = :schema_info
513
- Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_COLUMN)
514
- Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_TABLE)
515
-
516
504
  Error = Migrator::Error
517
505
 
518
506
  # The current version for this migrator
@@ -528,6 +516,8 @@ module Sequel
528
516
  def initialize(db, directory, opts=OPTS)
529
517
  super
530
518
  @current = opts[:current] || current_migration_version
519
+ raise(Error, "No current version available") unless current
520
+
531
521
  latest_version = latest_migration_version
532
522
 
533
523
  @target = if opts[:target]
@@ -538,15 +528,14 @@ module Sequel
538
528
  latest_version
539
529
  end
540
530
 
531
+ raise(Error, "No target version available, probably because no migration files found or filenames don't follow the migration filename convention") unless target
532
+
541
533
  if @target > latest_version
542
534
  @target = latest_version
543
535
  elsif @target < 0
544
536
  @target = 0
545
537
  end
546
538
 
547
- raise(Error, "No current version available") unless current
548
- raise(Error, "No target version available, probably because no migration files found or filenames don't follow the migration filename convention") unless target
549
-
550
539
  @direction = current < target ? :up : :down
551
540
  @migrations = get_migrations
552
541
  end
@@ -663,17 +652,12 @@ module Sequel
663
652
  end
664
653
  end
665
654
 
666
- # The migrator used if any migration file version appears to be a timestamp.
655
+ # The migrator used if any migration file version is greater than 20000101.
667
656
  # Stores filenames of migration files, and can figure out which migrations
668
657
  # have not been applied and apply them, even if earlier migrations are added
669
658
  # after later migrations. If you plan to do that, the responsibility is on
670
659
  # you to make sure the migrations don't conflict. Part of the +migration+ extension.
671
660
  class TimestampMigrator < Migrator
672
- DEFAULT_SCHEMA_COLUMN = :filename
673
- DEFAULT_SCHEMA_TABLE = :schema_migrations
674
- Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_COLUMN)
675
- Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SCHEMA_TABLE)
676
-
677
661
  Error = Migrator::Error
678
662
 
679
663
  # Array of strings of applied migration filenames
@@ -1,86 +1,4 @@
1
1
  # frozen-string-literal: true
2
- #
3
- # The no_auto_literal_strings extension removes Sequel's automatic conversion
4
- # of strings to literal strings in the dataset filter methods. By default,
5
- # Sequel considers a string passed to a filter method as a literal string:
6
- #
7
- # DB[:table].where("name > 'A'")
8
- #
9
- # This is fine, except when the string is derived from user input:
10
- #
11
- # DB[:table].where("name > '#{params[:user]}'") # SQL Injection!
12
- #
13
- # Sequel does support using placeholders for such strings:
14
- #
15
- # DB[:table].where("name > ?", params[:user].to_s) # Safe
16
- #
17
- # However, if you forget to user placeholders, and pass a string to a filter
18
- # method that is derived from user input, you open yourself up to SQL injection.
19
- # With this extension, using a plain string in a filter method will result
20
- # in an exception being raised. You either need to explicitly use a literal
21
- # string:
22
- #
23
- # DB[:table].where(Sequel.lit("name > ?", params[:user].to_s))
24
- #
25
- # or you need to construct the same SQL using a non-string based approach:
26
- #
27
- # DB[:table].where{|o| o.name > params[:user].to_s}
28
- #
29
- # Note that as listed in Sequel's security guide, a large number of dataset
30
- # methods call down to a filtering method, and this protects all of those
31
- # cases.
32
- #
33
- # This extension also protects the use of a plain string passed to Dataset#update:
34
- #
35
- # DB[:table].update("column = column + 1")
36
- #
37
- # Again, you either need to explicitly use a literal string:
38
- #
39
- # DB[:table].update(Sequel.lit("column = column + 1"))
40
- #
41
- # or construct the same SQL using a non-string based approach:
42
- #
43
- # DB[:table].update(:column => Sequel[:column] + 1)
44
- #
45
- # Related module: Sequel::Dataset::NoAutoLiteralStrings
46
2
 
47
- #
48
- module Sequel
49
- class Dataset
50
- module NoAutoLiteralStrings
51
- # Raise an error if passing a plain string or an array whose first
52
- # entry is a plain string.
53
- def filter_expr(expr = nil)
54
- case expr
55
- when LiteralString
56
- super
57
- when String
58
- raise Error, "plain string passed to a dataset filtering method"
59
- when Array
60
- if expr.first.is_a?(String) && !expr.first.is_a?(LiteralString)
61
- raise Error, "plain string passed to a dataset filtering method"
62
- end
63
- super
64
- else
65
- super
66
- end
67
- end
68
-
69
- # Raise an error if passing a plain string.
70
- def update_sql(values=OPTS)
71
- case values
72
- when LiteralString
73
- super
74
- when String
75
- raise Error, "plain string passed to a dataset filtering method"
76
- else
77
- super
78
- end
79
- end
80
- end
81
-
82
- register_extension(:no_auto_literal_strings, NoAutoLiteralStrings)
83
- end
84
- end
85
-
86
- # Sequel::Dataset.register_extension(:no_auto_literal_strings){} # SEQUEL5
3
+ Sequel::Database.register_extension(:no_auto_literal_strings){}
4
+ Sequel::Dataset.register_extension(:no_auto_literal_strings){}
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # Usage:
15
15
  #
16
- # ds = DB[:items].nullify.where(:a=>:b).select(:c)
16
+ # ds = DB[:items].nullify.where(a: :b).select(:c)
17
17
  # ds.sql # => "SELECT c FROM items WHERE (a = b)"
18
18
  # ds.all # => [] # no query sent to the database
19
19
  #
@@ -41,13 +41,7 @@ module Sequel
41
41
  module Nullifiable
42
42
  # Return a cloned nullified dataset.
43
43
  def nullify
44
- clone.with_extend(NullDataset)
45
- end
46
-
47
- # Nullify the current dataset
48
- def nullify!
49
- Sequel::Deprecation.deprecate("Dataset#nullify! from the null_dataset extension", "Use Dataset#nullify, which returned a modified copy")
50
- extend NullDataset
44
+ with_extend(NullDataset)
51
45
  end
52
46
  end
53
47
 
@@ -64,10 +64,8 @@ module Sequel
64
64
 
65
65
  class Dataset
66
66
  # Holds methods that only relate to paginated datasets. Paginated dataset
67
- # have pages starting at 1 (page 1 is offset 0, page 1 is offset page_size).
67
+ # have pages starting at 1 (page 1 is offset 0, page 2 is offset 1 * page_size).
68
68
  module Pagination
69
- Sequel::Dataset.def_deprecated_opts_setter(self, :page_size, :page_count, :current_page, :pagination_record_count)
70
-
71
69
  # The number of records per page (the final page may have fewer than
72
70
  # this number of records).
73
71
  def page_size
@@ -135,20 +133,6 @@ module Sequel
135
133
  def prev_page
136
134
  current_page > 1 ? (current_page - 1) : nil
137
135
  end
138
-
139
- # SEQUEL5: Remove
140
- # :nocov:
141
- def set_pagination_info(page_no, page_size, record_count)
142
- Sequel::Deprecation.deprecate("Dataset#set_pagination_info", "It should no longer be necessary to call this method")
143
- self.current_page = page_no
144
- self.page_size = page_size
145
- self.pagination_record_count = record_count
146
- page_count = (record_count / page_size.to_f).ceil
147
- page_count = 1 if page_count == 0
148
- self.page_count = page_count
149
- self
150
- end
151
- # :nocov:
152
136
  end
153
137
  end
154
138