sequel 3.21.0 → 3.41.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 (363) hide show
  1. data/CHANGELOG +1131 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +106 -65
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +68 -52
  7. data/doc/advanced_associations.rdoc +201 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/bin_sequel.rdoc +144 -0
  10. data/doc/cheat_sheet.rdoc +21 -21
  11. data/doc/core_extensions.rdoc +374 -0
  12. data/doc/dataset_basics.rdoc +10 -10
  13. data/doc/dataset_filtering.rdoc +54 -42
  14. data/doc/mass_assignment.rdoc +56 -0
  15. data/doc/migration.rdoc +89 -557
  16. data/doc/model_hooks.rdoc +80 -29
  17. data/doc/object_model.rdoc +576 -0
  18. data/doc/opening_databases.rdoc +121 -53
  19. data/doc/prepared_statements.rdoc +41 -15
  20. data/doc/querying.rdoc +137 -56
  21. data/doc/reflection.rdoc +36 -10
  22. data/doc/release_notes/3.22.0.txt +39 -0
  23. data/doc/release_notes/3.23.0.txt +172 -0
  24. data/doc/release_notes/3.24.0.txt +420 -0
  25. data/doc/release_notes/3.25.0.txt +88 -0
  26. data/doc/release_notes/3.26.0.txt +88 -0
  27. data/doc/release_notes/3.27.0.txt +82 -0
  28. data/doc/release_notes/3.28.0.txt +304 -0
  29. data/doc/release_notes/3.29.0.txt +459 -0
  30. data/doc/release_notes/3.30.0.txt +135 -0
  31. data/doc/release_notes/3.31.0.txt +146 -0
  32. data/doc/release_notes/3.32.0.txt +202 -0
  33. data/doc/release_notes/3.33.0.txt +157 -0
  34. data/doc/release_notes/3.34.0.txt +671 -0
  35. data/doc/release_notes/3.35.0.txt +144 -0
  36. data/doc/release_notes/3.36.0.txt +245 -0
  37. data/doc/release_notes/3.37.0.txt +338 -0
  38. data/doc/release_notes/3.38.0.txt +234 -0
  39. data/doc/release_notes/3.39.0.txt +237 -0
  40. data/doc/release_notes/3.40.0.txt +73 -0
  41. data/doc/release_notes/3.41.0.txt +155 -0
  42. data/doc/schema_modification.rdoc +585 -0
  43. data/doc/sharding.rdoc +99 -8
  44. data/doc/sql.rdoc +154 -112
  45. data/doc/testing.rdoc +169 -0
  46. data/doc/thread_safety.rdoc +17 -0
  47. data/doc/transactions.rdoc +137 -0
  48. data/doc/validations.rdoc +1 -1
  49. data/doc/virtual_rows.rdoc +78 -43
  50. data/lib/sequel/adapters/ado/access.rb +334 -0
  51. data/lib/sequel/adapters/ado/mssql.rb +18 -12
  52. data/lib/sequel/adapters/ado.rb +69 -21
  53. data/lib/sequel/adapters/amalgalite.rb +17 -14
  54. data/lib/sequel/adapters/cubrid.rb +143 -0
  55. data/lib/sequel/adapters/db2.rb +178 -85
  56. data/lib/sequel/adapters/dbi.rb +19 -21
  57. data/lib/sequel/adapters/do/mysql.rb +17 -11
  58. data/lib/sequel/adapters/do/postgres.rb +2 -61
  59. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  60. data/lib/sequel/adapters/do.rb +20 -39
  61. data/lib/sequel/adapters/firebird.rb +33 -210
  62. data/lib/sequel/adapters/ibmdb.rb +452 -0
  63. data/lib/sequel/adapters/informix.rb +6 -29
  64. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  65. data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
  66. data/lib/sequel/adapters/jdbc/db2.rb +78 -0
  67. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  68. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  69. data/lib/sequel/adapters/jdbc/h2.rb +68 -31
  70. data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
  71. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  73. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  74. data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
  75. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  76. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  77. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  78. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  79. data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
  80. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  81. data/lib/sequel/adapters/jdbc.rb +308 -114
  82. data/lib/sequel/adapters/mock.rb +372 -0
  83. data/lib/sequel/adapters/mysql.rb +130 -230
  84. data/lib/sequel/adapters/mysql2.rb +64 -63
  85. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  86. data/lib/sequel/adapters/odbc.rb +29 -10
  87. data/lib/sequel/adapters/openbase.rb +7 -11
  88. data/lib/sequel/adapters/oracle.rb +364 -57
  89. data/lib/sequel/adapters/postgres.rb +379 -145
  90. data/lib/sequel/adapters/shared/access.rb +236 -11
  91. data/lib/sequel/adapters/shared/cubrid.rb +216 -0
  92. data/lib/sequel/adapters/shared/db2.rb +353 -0
  93. data/lib/sequel/adapters/shared/firebird.rb +231 -0
  94. data/lib/sequel/adapters/shared/informix.rb +53 -0
  95. data/lib/sequel/adapters/shared/mssql.rb +412 -116
  96. data/lib/sequel/adapters/shared/mysql.rb +396 -89
  97. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
  98. data/lib/sequel/adapters/shared/oracle.rb +262 -45
  99. data/lib/sequel/adapters/shared/postgres.rb +688 -279
  100. data/lib/sequel/adapters/shared/progress.rb +5 -8
  101. data/lib/sequel/adapters/shared/sqlite.rb +317 -96
  102. data/lib/sequel/adapters/sqlite.rb +109 -46
  103. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  104. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  105. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  106. data/lib/sequel/adapters/swift.rb +31 -27
  107. data/lib/sequel/adapters/tinytds.rb +177 -25
  108. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  109. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  110. data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
  111. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  112. data/lib/sequel/ast_transformer.rb +194 -0
  113. data/lib/sequel/connection_pool/sharded_single.rb +23 -13
  114. data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
  115. data/lib/sequel/connection_pool/single.rb +11 -3
  116. data/lib/sequel/connection_pool/threaded.rb +69 -20
  117. data/lib/sequel/connection_pool.rb +20 -18
  118. data/lib/sequel/core.rb +143 -11
  119. data/lib/sequel/database/connecting.rb +66 -29
  120. data/lib/sequel/database/dataset.rb +4 -4
  121. data/lib/sequel/database/dataset_defaults.rb +63 -2
  122. data/lib/sequel/database/logging.rb +7 -2
  123. data/lib/sequel/database/misc.rb +192 -51
  124. data/lib/sequel/database/query.rb +299 -114
  125. data/lib/sequel/database/schema_generator.rb +103 -36
  126. data/lib/sequel/database/schema_methods.rb +310 -69
  127. data/lib/sequel/dataset/actions.rb +344 -90
  128. data/lib/sequel/dataset/features.rb +101 -8
  129. data/lib/sequel/dataset/graph.rb +42 -15
  130. data/lib/sequel/dataset/misc.rb +52 -25
  131. data/lib/sequel/dataset/mutation.rb +12 -7
  132. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  133. data/lib/sequel/dataset/query.rb +322 -68
  134. data/lib/sequel/dataset/sql.rb +716 -293
  135. data/lib/sequel/dataset.rb +8 -0
  136. data/lib/sequel/exceptions.rb +4 -0
  137. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  138. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  139. data/lib/sequel/extensions/blank.rb +4 -0
  140. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  141. data/lib/sequel/extensions/connection_validator.rb +109 -0
  142. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  143. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  144. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  145. data/lib/sequel/extensions/inflector.rb +4 -0
  146. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  147. data/lib/sequel/extensions/migration.rb +100 -11
  148. data/lib/sequel/extensions/named_timezones.rb +9 -0
  149. data/lib/sequel/extensions/null_dataset.rb +94 -0
  150. data/lib/sequel/extensions/pagination.rb +4 -0
  151. data/lib/sequel/extensions/pg_array.rb +539 -0
  152. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  153. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  154. data/lib/sequel/extensions/pg_hstore.rb +334 -0
  155. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  156. data/lib/sequel/extensions/pg_inet.rb +113 -0
  157. data/lib/sequel/extensions/pg_interval.rb +191 -0
  158. data/lib/sequel/extensions/pg_json.rb +212 -0
  159. data/lib/sequel/extensions/pg_range.rb +513 -0
  160. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  161. data/lib/sequel/extensions/pg_row.rb +576 -0
  162. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  163. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  164. data/lib/sequel/extensions/pretty_table.rb +17 -72
  165. data/lib/sequel/extensions/query.rb +8 -4
  166. data/lib/sequel/extensions/query_literals.rb +79 -0
  167. data/lib/sequel/extensions/schema_caching.rb +76 -0
  168. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  169. data/lib/sequel/extensions/select_remove.rb +39 -0
  170. data/lib/sequel/extensions/server_block.rb +140 -0
  171. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  172. data/lib/sequel/extensions/sql_expr.rb +8 -110
  173. data/lib/sequel/extensions/string_date_time.rb +4 -0
  174. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  175. data/lib/sequel/extensions/to_dot.rb +99 -83
  176. data/lib/sequel/model/associations.rb +1263 -409
  177. data/lib/sequel/model/base.rb +624 -171
  178. data/lib/sequel/model/errors.rb +1 -1
  179. data/lib/sequel/model/exceptions.rb +24 -2
  180. data/lib/sequel/model/inflections.rb +1 -1
  181. data/lib/sequel/model.rb +30 -11
  182. data/lib/sequel/no_core_ext.rb +2 -0
  183. data/lib/sequel/plugins/active_model.rb +13 -1
  184. data/lib/sequel/plugins/association_pks.rb +137 -16
  185. data/lib/sequel/plugins/caching.rb +25 -18
  186. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  187. data/lib/sequel/plugins/composition.rb +44 -12
  188. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  189. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  190. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  191. data/lib/sequel/plugins/dirty.rb +214 -0
  192. data/lib/sequel/plugins/eager_each.rb +59 -0
  193. data/lib/sequel/plugins/force_encoding.rb +6 -6
  194. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  195. data/lib/sequel/plugins/identity_map.rb +134 -15
  196. data/lib/sequel/plugins/instance_filters.rb +10 -0
  197. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  198. data/lib/sequel/plugins/json_serializer.rb +77 -6
  199. data/lib/sequel/plugins/list.rb +13 -2
  200. data/lib/sequel/plugins/many_through_many.rb +103 -51
  201. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  202. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  203. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  204. data/lib/sequel/plugins/pg_row.rb +121 -0
  205. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  206. data/lib/sequel/plugins/prepared_statements.rb +168 -0
  207. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  208. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  209. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  210. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  211. data/lib/sequel/plugins/schema.rb +8 -3
  212. data/lib/sequel/plugins/serialization.rb +98 -49
  213. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  214. data/lib/sequel/plugins/sharding.rb +21 -54
  215. data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
  216. data/lib/sequel/plugins/static_cache.rb +99 -0
  217. data/lib/sequel/plugins/subclasses.rb +29 -3
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  219. data/lib/sequel/plugins/timestamps.rb +1 -1
  220. data/lib/sequel/plugins/touch.rb +18 -6
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  223. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  224. data/lib/sequel/plugins/validation_class_methods.rb +2 -1
  225. data/lib/sequel/plugins/validation_helpers.rb +57 -4
  226. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  227. data/lib/sequel/sql.rb +721 -141
  228. data/lib/sequel/timezones.rb +67 -40
  229. data/lib/sequel/version.rb +1 -1
  230. data/spec/adapters/db2_spec.rb +146 -0
  231. data/spec/adapters/firebird_spec.rb +53 -39
  232. data/spec/adapters/mssql_spec.rb +261 -66
  233. data/spec/adapters/mysql_spec.rb +597 -352
  234. data/spec/adapters/oracle_spec.rb +92 -117
  235. data/spec/adapters/postgres_spec.rb +2103 -341
  236. data/spec/adapters/spec_helper.rb +16 -6
  237. data/spec/adapters/sqlite_spec.rb +237 -76
  238. data/spec/core/connection_pool_spec.rb +270 -141
  239. data/spec/core/database_spec.rb +980 -524
  240. data/spec/core/dataset_spec.rb +1658 -1243
  241. data/spec/core/expression_filters_spec.rb +741 -334
  242. data/spec/core/mock_adapter_spec.rb +453 -0
  243. data/spec/core/object_graph_spec.rb +88 -129
  244. data/spec/core/schema_generator_spec.rb +4 -4
  245. data/spec/core/schema_spec.rb +556 -53
  246. data/spec/core/spec_helper.rb +7 -48
  247. data/spec/core_extensions_spec.rb +626 -0
  248. data/spec/extensions/active_model_spec.rb +13 -0
  249. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  250. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  251. data/spec/extensions/association_dependencies_spec.rb +15 -25
  252. data/spec/extensions/association_pks_spec.rb +227 -33
  253. data/spec/extensions/association_proxies_spec.rb +4 -4
  254. data/spec/extensions/boolean_readers_spec.rb +25 -25
  255. data/spec/extensions/caching_spec.rb +47 -51
  256. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  257. data/spec/extensions/columns_introspection_spec.rb +91 -0
  258. data/spec/extensions/composition_spec.rb +18 -13
  259. data/spec/extensions/connection_validator_spec.rb +118 -0
  260. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  261. data/spec/extensions/constraint_validations_spec.rb +316 -0
  262. data/spec/extensions/dataset_associations_spec.rb +199 -0
  263. data/spec/extensions/defaults_setter_spec.rb +88 -0
  264. data/spec/extensions/dirty_spec.rb +155 -0
  265. data/spec/extensions/eager_each_spec.rb +34 -0
  266. data/spec/extensions/eval_inspect_spec.rb +67 -0
  267. data/spec/extensions/force_encoding_spec.rb +4 -2
  268. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  269. data/spec/extensions/identity_map_spec.rb +142 -24
  270. data/spec/extensions/inflector_spec.rb +0 -4
  271. data/spec/extensions/instance_filters_spec.rb +11 -21
  272. data/spec/extensions/instance_hooks_spec.rb +72 -0
  273. data/spec/extensions/json_serializer_spec.rb +49 -12
  274. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  275. data/spec/extensions/list_spec.rb +49 -40
  276. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  277. data/spec/extensions/many_through_many_spec.rb +368 -254
  278. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  279. data/spec/extensions/migration_spec.rb +140 -35
  280. data/spec/extensions/named_timezones_spec.rb +29 -11
  281. data/spec/extensions/nested_attributes_spec.rb +268 -89
  282. data/spec/extensions/null_dataset_spec.rb +85 -0
  283. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  284. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  285. data/spec/extensions/pg_array_spec.rb +324 -0
  286. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  287. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  288. data/spec/extensions/pg_hstore_spec.rb +200 -0
  289. data/spec/extensions/pg_inet_spec.rb +47 -0
  290. data/spec/extensions/pg_interval_spec.rb +72 -0
  291. data/spec/extensions/pg_json_spec.rb +99 -0
  292. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  293. data/spec/extensions/pg_range_spec.rb +395 -0
  294. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  295. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  296. data/spec/extensions/pg_row_spec.rb +340 -0
  297. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  298. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  299. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  300. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  301. data/spec/extensions/prepared_statements_spec.rb +87 -0
  302. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  303. data/spec/extensions/pretty_table_spec.rb +7 -6
  304. data/spec/extensions/query_literals_spec.rb +167 -0
  305. data/spec/extensions/query_spec.rb +9 -3
  306. data/spec/extensions/rcte_tree_spec.rb +50 -43
  307. data/spec/extensions/schema_caching_spec.rb +41 -0
  308. data/spec/extensions/schema_dumper_spec.rb +434 -49
  309. data/spec/extensions/schema_spec.rb +30 -49
  310. data/spec/extensions/select_remove_spec.rb +38 -0
  311. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  312. data/spec/extensions/serialization_spec.rb +86 -48
  313. data/spec/extensions/server_block_spec.rb +90 -0
  314. data/spec/extensions/sharding_spec.rb +69 -143
  315. data/spec/extensions/single_table_inheritance_spec.rb +65 -29
  316. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  317. data/spec/extensions/spec_helper.rb +34 -67
  318. data/spec/extensions/split_array_nil_spec.rb +24 -0
  319. data/spec/extensions/sql_expr_spec.rb +29 -60
  320. data/spec/extensions/static_cache_spec.rb +145 -0
  321. data/spec/extensions/subclasses_spec.rb +14 -0
  322. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  323. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  324. data/spec/extensions/timestamps_spec.rb +6 -6
  325. data/spec/extensions/to_dot_spec.rb +8 -11
  326. data/spec/extensions/touch_spec.rb +53 -14
  327. data/spec/extensions/tree_spec.rb +11 -26
  328. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  329. data/spec/extensions/update_primary_key_spec.rb +30 -24
  330. data/spec/extensions/validation_class_methods_spec.rb +77 -68
  331. data/spec/extensions/validation_helpers_spec.rb +48 -37
  332. data/spec/extensions/xml_serializer_spec.rb +29 -4
  333. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  334. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  335. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  336. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  337. data/spec/integration/associations_test.rb +659 -21
  338. data/spec/integration/database_test.rb +25 -5
  339. data/spec/integration/dataset_test.rb +729 -141
  340. data/spec/integration/eager_loader_test.rb +38 -54
  341. data/spec/integration/migrator_test.rb +2 -3
  342. data/spec/integration/model_test.rb +81 -2
  343. data/spec/integration/plugin_test.rb +871 -160
  344. data/spec/integration/prepared_statement_test.rb +272 -128
  345. data/spec/integration/schema_test.rb +377 -57
  346. data/spec/integration/spec_helper.rb +49 -32
  347. data/spec/integration/timezone_test.rb +38 -12
  348. data/spec/integration/transaction_test.rb +183 -8
  349. data/spec/integration/type_test.rb +40 -8
  350. data/spec/model/association_reflection_spec.rb +207 -8
  351. data/spec/model/associations_spec.rb +1206 -693
  352. data/spec/model/base_spec.rb +334 -100
  353. data/spec/model/dataset_methods_spec.rb +45 -27
  354. data/spec/model/eager_loading_spec.rb +828 -692
  355. data/spec/model/hooks_spec.rb +355 -67
  356. data/spec/model/model_spec.rb +251 -179
  357. data/spec/model/plugins_spec.rb +24 -13
  358. data/spec/model/record_spec.rb +506 -232
  359. data/spec/model/spec_helper.rb +16 -77
  360. data/spec/model/validations_spec.rb +38 -2
  361. data/spec/rcov.opts +2 -0
  362. metadata +223 -81
  363. data/spec/core/core_sql_spec.rb +0 -451
@@ -2,54 +2,44 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "instance_filters plugin" do
4
4
  before do
5
- @c = Class.new(Sequel::Model(:people)) do
6
- end
7
- @sql = sql = ''
8
- @v = v = [1]
5
+ @c = Class.new(Sequel::Model(:people))
9
6
  @c.dataset.quote_identifiers = false
10
- @c.dataset.meta_def(:update) do |opts|
11
- sql.replace(update_sql(opts))
12
- return v.first
13
- end
14
- @c.dataset.meta_def(:delete) do
15
- sql.replace(delete_sql)
16
- return v.first
17
- end
18
7
  @c.columns :id, :name, :num
19
8
  @c.plugin :instance_filters
20
9
  @p = @c.load(:id=>1, :name=>'John', :num=>1)
10
+ MODEL_DB.sqls
21
11
  end
22
12
 
23
13
  specify "should raise an error when updating a stale record" do
24
14
  @p.update(:name=>'Bob')
25
- @sql.should == "UPDATE people SET name = 'Bob' WHERE (id = 1)"
15
+ MODEL_DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
26
16
  @p.instance_filter(:name=>'Jim')
27
- @v.replace([0])
17
+ @p.this.numrows = 0
28
18
  proc{@p.update(:name=>'Joe')}.should raise_error(Sequel::Plugins::InstanceFilters::Error)
29
- @sql.should == "UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"
19
+ MODEL_DB.sqls.should == ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Jim'))"]
30
20
  end
31
21
 
32
22
  specify "should raise an error when destroying a stale record" do
33
23
  @p.destroy
34
- @sql.should == "DELETE FROM people WHERE (id = 1)"
24
+ MODEL_DB.sqls.should == ["DELETE FROM people WHERE id = 1"]
35
25
  @p.instance_filter(:name=>'Jim')
36
- @v.replace([0])
26
+ @p.this.numrows = 0
37
27
  proc{@p.destroy}.should raise_error(Sequel::Plugins::InstanceFilters::Error)
38
- @sql.should == "DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"
28
+ MODEL_DB.sqls.should == ["DELETE FROM people WHERE ((id = 1) AND (name = 'Jim'))"]
39
29
  end
40
30
 
41
31
  specify "should apply all instance filters" do
42
32
  @p.instance_filter(:name=>'Jim')
43
33
  @p.instance_filter{num > 2}
44
34
  @p.update(:name=>'Bob')
45
- @sql.should == "UPDATE people SET name = 'Bob' WHERE ((id = 1) AND (name = 'Jim') AND (num > 2))"
35
+ MODEL_DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE ((id = 1) AND (name = 'Jim') AND (num > 2))"]
46
36
  end
47
37
 
48
38
  specify "should drop instance filters after updating" do
49
39
  @p.instance_filter(:name=>'Joe')
50
40
  @p.update(:name=>'Joe')
51
- @sql.should == "UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Joe'))"
41
+ MODEL_DB.sqls.should == ["UPDATE people SET name = 'Joe' WHERE ((id = 1) AND (name = 'Joe'))"]
52
42
  @p.update(:name=>'Bob')
53
- @sql.should == "UPDATE people SET name = 'Bob' WHERE (id = 1)"
43
+ MODEL_DB.sqls.should == ["UPDATE people SET name = 'Bob' WHERE (id = 1)"]
54
44
  end
55
45
  end
@@ -177,3 +177,75 @@ describe "InstanceHooks plugin" do
177
177
  @r.should == [2, 1, 4, 3]
178
178
  end
179
179
  end
180
+
181
+ describe "InstanceHooks plugin with transactions" do
182
+ before do
183
+ @db = Sequel.mock(:numrows=>1)
184
+ pr = proc{|x| r(x)}
185
+ @c = Class.new(Sequel::Model(@db[:items])) do
186
+ attr_accessor :rb
187
+ def after_save
188
+ db.execute('as')
189
+ raise Sequel::Rollback if rb
190
+ end
191
+ def after_destroy
192
+ db.execute('ad')
193
+ raise Sequel::Rollback if rb
194
+ end
195
+ end
196
+ @c.use_transactions = true
197
+ @c.plugin :instance_hooks
198
+ @o = @c.load({:id=>1})
199
+ @or = @c.load({:id=>1})
200
+ @or.rb = true
201
+ @r = []
202
+ @db.sqls
203
+ end
204
+
205
+ it "should support after_commit_hook" do
206
+ @o.after_commit_hook{@db.execute('ac1')}
207
+ @o.after_commit_hook{@db.execute('ac2')}
208
+ @o.save.should_not be_nil
209
+ @db.sqls.should == ['BEGIN', 'as', 'COMMIT', 'ac1', 'ac2']
210
+ end
211
+
212
+ it "should support after_rollback_hook" do
213
+ @or.after_rollback_hook{@db.execute('ar1')}
214
+ @or.after_rollback_hook{@db.execute('ar2')}
215
+ @or.save.should be_nil
216
+ @db.sqls.should == ['BEGIN', 'as', 'ROLLBACK', 'ar1', 'ar2']
217
+ end
218
+
219
+ it "should support after_commit_hook" do
220
+ @o.after_destroy_commit_hook{@db.execute('adc1')}
221
+ @o.after_destroy_commit_hook{@db.execute('adc2')}
222
+ @o.destroy.should_not be_nil
223
+ @db.sqls.should == ['BEGIN', "DELETE FROM items WHERE (id = 1)", 'ad', 'COMMIT', 'adc1', 'adc2']
224
+ end
225
+
226
+ it "should support after_rollback_hook" do
227
+ @or.after_destroy_rollback_hook{@db.execute('adr1')}
228
+ @or.after_destroy_rollback_hook{@db.execute('adr2')}
229
+ @or.destroy.should be_nil
230
+ @db.sqls.should == ['BEGIN', "DELETE FROM items WHERE (id = 1)", 'ad', 'ROLLBACK', 'adr1', 'adr2']
231
+ end
232
+
233
+ it "should have *_hook methods return self "do
234
+ @o.before_destroy_hook{r 1}.should equal(@o)
235
+ @o.before_validation_hook{r 1}.should equal(@o)
236
+ @o.before_save_hook{r 1}.should equal(@o)
237
+ @o.before_update_hook{r 1}.should equal(@o)
238
+ @o.before_create_hook{r 1}.should equal(@o)
239
+
240
+ @o.after_destroy_hook{r 1}.should equal(@o)
241
+ @o.after_validation_hook{r 1}.should equal(@o)
242
+ @o.after_save_hook{r 1}.should equal(@o)
243
+ @o.after_update_hook{r 1}.should equal(@o)
244
+ @o.after_create_hook{r 1}.should equal(@o)
245
+ @o.after_commit_hook{r 1}.should equal(@o)
246
+ @o.after_rollback_hook{r 1}.should equal(@o)
247
+ @o.after_destroy_commit_hook{r 1}.should equal(@o)
248
+ @o.after_destroy_rollback_hook{r 1}.should equal(@o)
249
+ end
250
+
251
+ end
@@ -1,10 +1,5 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
- begin
4
- require 'json'
5
- rescue LoadError => e
6
- skip_warn "json_serializer plugin: can't load json (#{e.class}: #{e})"
7
- else
8
3
  describe "Sequel::Plugins::JsonSerializer" do
9
4
  before do
10
5
  class ::Artist < Sequel::Model
@@ -96,14 +91,30 @@ describe "Sequel::Plugins::JsonSerializer" do
96
91
  @artist.id.should == 2
97
92
  end
98
93
 
94
+ it "should support #from_json to support specific :fields" do
95
+ @album.from_json('{"name": "AS", "artist_id": 3}', :fields=>['name'])
96
+ @album.name.should == 'AS'
97
+ @album.artist_id.should == 2
98
+ end
99
+
100
+ it "should support #from_json to support :missing=>:skip option" do
101
+ @album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:skip)
102
+ @album.name.should == 'RF'
103
+ @album.artist_id.should == 2
104
+ end
105
+
106
+ it "should support #from_json to support :missing=>:raise option" do
107
+ proc{@album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:raise)}.should raise_error(Sequel::Error)
108
+ end
109
+
99
110
  it "should raise an exception for json keys that aren't associations, columns, or setter methods" do
100
111
  Album.send(:undef_method, :blah=)
101
112
  proc{JSON.parse(@album.to_json(:include=>:blah))}.should raise_error(Sequel::Error)
102
113
  end
103
114
 
104
115
  it "should support a to_json class and dataset method" do
105
- album = @album
106
- Album.dataset.meta_def(:all){[album]}
116
+ Album.dataset._fetch = {:id=>1, :name=>'RF', :artist_id=>2}
117
+ Artist.dataset._fetch = {:id=>2, :name=>'YJM'}
107
118
  JSON.parse(Album.to_json).should == [@album]
108
119
  JSON.parse(Album.to_json(:include=>:artist)).map{|x| x.artist}.should == [@artist]
109
120
  JSON.parse(Album.dataset.to_json(:only=>:name)).should == [Album.load(:name=>@album.name)]
@@ -112,10 +123,23 @@ describe "Sequel::Plugins::JsonSerializer" do
112
123
  it "should have dataset to_json method work with naked datasets" do
113
124
  album = @album
114
125
  ds = Album.dataset.naked
115
- ds.meta_def(:all){[album.values]}
126
+ ds._fetch = {:id=>1, :name=>'RF', :artist_id=>2}
116
127
  JSON.parse(ds.to_json).should == [@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}]
117
128
  end
118
129
 
130
+ it "should have dataset to_json method respect :array option for the array to use" do
131
+ a = Album.load(:id=>1, :name=>'RF', :artist_id=>3)
132
+ JSON.parse(Album.to_json(:array=>[a])).should == [a]
133
+
134
+ a.associations[:artist] = artist = Artist.load(:id=>3, :name=>'YJM')
135
+ JSON.parse(Album.to_json(:array=>[a], :include=>:artist)).first.artist.should == artist
136
+
137
+ artist.associations[:albums] = [a]
138
+ x = JSON.parse(Artist.to_json(:array=>[artist], :include=>:albums))
139
+ x.should == [artist]
140
+ x.first.albums.should == [a]
141
+ end
142
+
119
143
  it "should propagate class default options to instance to_json output" do
120
144
  class ::Album2 < Sequel::Model
121
145
  attr_accessor :blah
@@ -136,9 +160,23 @@ describe "Sequel::Plugins::JsonSerializer" do
136
160
  @album.to_json(:root=>true, :only => :name).to_s.should == '{"album":{"name":"RF"}}'
137
161
  end
138
162
 
139
- it "should handle the :root option to qualify a dataset of records" do
140
- album = @album
141
- Album.dataset.meta_def(:all){[album, album]}
163
+ it "should handle the :root=>:both option to qualify a dataset of records" do
164
+ Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
165
+ Album.dataset.to_json(:root=>true, :only => :id).to_s.should == '{"albums":[{"album":{"id":1}},{"album":{"id":1}}]}'
166
+ end
167
+
168
+ it "should handle the :root=>:collection option to qualify just the collection" do
169
+ Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
170
+ Album.dataset.to_json(:root=>:collection, :only => :id).to_s.should == '{"albums":[{"id":1},{"id":1}]}'
171
+ end
172
+
173
+ it "should handle the :root=>:instance option to qualify just the instances" do
174
+ Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
175
+ Album.dataset.to_json(:root=>:instance, :only => :id).to_s.should == '[{"album":{"id":1}},{"album":{"id":1}}]'
176
+ end
177
+
178
+ it "should handle the :root=>true option be the same as :root=>:both for backwards compatibility" do
179
+ Album.dataset._fetch = [{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]
142
180
  Album.dataset.to_json(:root=>true, :only => :id).to_s.should == '{"albums":[{"album":{"id":1}},{"album":{"id":1}}]}'
143
181
  end
144
182
 
@@ -162,4 +200,3 @@ describe "Sequel::Plugins::JsonSerializer" do
162
200
  Object.send(:remove_const, :Artist3)
163
201
  end
164
202
  end
165
- end
@@ -1,8 +1,9 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+ require 'yaml'
2
3
 
3
4
  describe "Sequel::Plugins::LazyAttributes" do
4
5
  before do
5
- @db = MockDatabase.new
6
+ @db = Sequel.mock
6
7
  @db.meta_def(:schema){|*a| [[:id, {:type=>:integer}], [:name,{:type=>:string}]]}
7
8
  class ::LazyAttributesModel < Sequel::Model(@db[:la])
8
9
  plugin :lazy_attributes
@@ -10,27 +11,23 @@ describe "Sequel::Plugins::LazyAttributes" do
10
11
  meta_def(:columns){[:id, :name]}
11
12
  lazy_attributes :name
12
13
  meta_def(:columns){[:id]}
13
- ds = dataset
14
- def ds.fetch_rows(sql)
15
- execute(sql)
16
- select = @opts[:select]
17
- where = @opts[:where]
18
- block = @mod_block || proc{|s| s}
19
- if !where
20
- if select.include?(:name)
21
- yield(block[:id=>1, :name=>'1'])
22
- yield(block[:id=>2, :name=>'2'])
14
+ instance_dataset._fetch = dataset._fetch = proc do |sql|
15
+ if sql !~ /WHERE/
16
+ if sql =~ /name/
17
+ [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
23
18
  else
24
- yield(:id=>1)
25
- yield(:id=>2)
19
+ [{:id=>1}, {:id=>2}]
26
20
  end
27
21
  else
28
- i = where.args.last
29
- Array(i).each do |x|
22
+ if sql =~ /id IN \(([\d, ]+)\)/
23
+ $1.split(', ')
24
+ elsif sql =~ /id = (\d)/
25
+ [$1]
26
+ end.map do |x|
30
27
  if sql =~ /SELECT name FROM/
31
- yield(block[:name=>x.to_s])
28
+ {:name=>x.to_s}
32
29
  else
33
- yield(block[:id=>x, :name=>x.to_s])
30
+ {:id=>x.to_i, :name=>x.to_s}
34
31
  end
35
32
  end
36
33
  end
@@ -38,7 +35,7 @@ describe "Sequel::Plugins::LazyAttributes" do
38
35
  end
39
36
  @c = ::LazyAttributesModel
40
37
  @ds = LazyAttributesModel.dataset
41
- @db.reset
38
+ @db.sqls
42
39
  end
43
40
  after do
44
41
  Object.send(:remove_const, :LazyAttributesModel)
@@ -136,7 +133,7 @@ describe "Sequel::Plugins::LazyAttributes" do
136
133
 
137
134
  it "should work with the serialization plugin" do
138
135
  @c.plugin :serialization, :yaml, :name
139
- @ds.instance_variable_set(:@mod_block, proc{|s| s.merge(:name=>"--- #{s[:name].to_i*3}\n")})
136
+ @c.instance_dataset._fetch = @ds._fetch = [[{:id=>1}, {:id=>2}], [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}], [{:id=>1}], [{:name=>"--- 3\n"}]]
140
137
  @c.with_identity_map do
141
138
  ms = @ds.all
142
139
  ms.map{|m| m.values}.should == [{:id=>1}, {:id=>2}]
@@ -146,7 +143,6 @@ describe "Sequel::Plugins::LazyAttributes" do
146
143
  ms.map{|m| m.name}.should == [3,6]
147
144
  @db.sqls.should == ['SELECT id FROM la', 'SELECT id, name FROM la WHERE (id IN (1, 2))']
148
145
  end
149
- @db.reset
150
146
  @c.with_identity_map do
151
147
  m = @ds.first
152
148
  m.values.should == {:id=>1}
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), '/spec_helper')
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
2
 
3
3
  describe "List plugin" do
4
4
  def klass(opts={})
@@ -8,32 +8,10 @@ describe "List plugin" do
8
8
  columns :id, :position, :scope_id, :pos
9
9
  plugin :list, opts
10
10
  self.use_transactions = false
11
-
12
- class << self
13
- attr_accessor :rows
14
- end
15
-
16
- def checked_transaction(opts={})
17
- return super if @in_transaction || !use_transaction?(opts)
18
- @in_transaction = true
19
- db.execute 'BEGIN'
20
- super
21
- db.execute 'COMMIT'
22
- @in_transaction = false
23
- end
24
11
  end
25
12
  c
26
13
  end
27
14
 
28
- def y(c, *hs)
29
- c.rows = hs
30
- ds = c.dataset
31
- def ds.fetch_rows(sql)
32
- db.execute(sql)
33
- yield model.rows.shift
34
- end
35
- end
36
-
37
15
  before do
38
16
  @c = klass
39
17
  @o = @c.load(:id=>7, :position=>3)
@@ -89,18 +67,49 @@ describe "List plugin" do
89
67
  end
90
68
 
91
69
  it "should have at_position return the model object at the given position" do
92
- y(@c, :id=>1, :position=>1)
70
+ @c.dataset._fetch = {:id=>1, :position=>1}
93
71
  @o.at_position(10).should == @c.load(:id=>1, :position=>1)
94
- y(@sc, :id=>2, :position=>2, :scope_id=>5)
72
+ @sc.dataset._fetch = {:id=>2, :position=>2, :scope_id=>5}
95
73
  @so.at_position(20).should == @sc.load(:id=>2, :position=>2, :scope_id=>5)
96
74
  @db.sqls.should == ["SELECT * FROM items WHERE (position = 10) ORDER BY position LIMIT 1",
97
75
  "SELECT * FROM items WHERE ((scope_id = 5) AND (position = 20)) ORDER BY scope_id, position LIMIT 1"]
98
76
  end
99
77
 
78
+ it "should have position field set to max+1 when creating if not already set" do
79
+ @c.instance_dataset._fetch = @c.dataset._fetch = [[{:pos=>nil}], [{:id=>1, :position=>1}], [{:pos=>1}], [{:id=>2, :position=>2}]]
80
+ @c.instance_dataset.autoid = @c.dataset.autoid = 1
81
+ @c.create.values.should == {:id=>1, :position=>1}
82
+ @c.create.values.should == {:id=>2, :position=>2}
83
+ @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
84
+ "INSERT INTO items (position) VALUES (1)",
85
+ "SELECT * FROM items WHERE (id = 1) ORDER BY position LIMIT 1",
86
+ "SELECT max(position) FROM items LIMIT 1",
87
+ "INSERT INTO items (position) VALUES (2)",
88
+ "SELECT * FROM items WHERE (id = 2) ORDER BY position LIMIT 1"]
89
+ end
90
+
91
+ it "should have position field set to max+1 in scope when creating if not already set" do
92
+ @sc.instance_dataset._fetch = @sc.dataset._fetch = [[{:pos=>nil}], [{:id=>1, :scope_id=>1, :position=>1}], [{:pos=>1}], [{:id=>2, :scope_id=>1, :position=>2}], [{:pos=>nil}], [{:id=>3, :scope_id=>2, :position=>1}]]
93
+ @sc.instance_dataset.autoid = @sc.dataset.autoid = 1
94
+ @sc.create(:scope_id=>1).values.should == {:id=>1, :scope_id=>1, :position=>1}
95
+ @sc.create(:scope_id=>1).values.should == {:id=>2, :scope_id=>1, :position=>2}
96
+ @sc.create(:scope_id=>2).values.should == {:id=>3, :scope_id=>2, :position=>1}
97
+ sqls = @db.sqls
98
+ sqls.slice!(7).should =~ /INSERT INTO items \((scope_id|position), (scope_id|position)\) VALUES \([12], [12]\)/
99
+ sqls.slice!(4).should =~ /INSERT INTO items \((scope_id|position), (scope_id|position)\) VALUES \([12], [12]\)/
100
+ sqls.slice!(1).should =~ /INSERT INTO items \((scope_id|position), (scope_id|position)\) VALUES \(1, 1\)/
101
+ sqls.should == ["SELECT max(position) FROM items WHERE (scope_id = 1) LIMIT 1",
102
+ "SELECT * FROM items WHERE (id = 1) ORDER BY scope_id, position LIMIT 1",
103
+ "SELECT max(position) FROM items WHERE (scope_id = 1) LIMIT 1",
104
+ "SELECT * FROM items WHERE (id = 2) ORDER BY scope_id, position LIMIT 1",
105
+ "SELECT max(position) FROM items WHERE (scope_id = 2) LIMIT 1",
106
+ "SELECT * FROM items WHERE (id = 3) ORDER BY scope_id, position LIMIT 1"]
107
+ end
108
+
100
109
  it "should have last_position return the last position in the list" do
101
- y(@c, :max=>10)
110
+ @c.dataset._fetch = {:max=>10}
102
111
  @o.last_position.should == 10
103
- y(@sc, :max=>20)
112
+ @sc.dataset._fetch = {:max=>20}
104
113
  @so.last_position.should == 20
105
114
  @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
106
115
  "SELECT max(position) FROM items WHERE (scope_id = 5) LIMIT 1"]
@@ -115,7 +124,7 @@ describe "List plugin" do
115
124
  end
116
125
 
117
126
  it "should have move_down without an argument move down a single position" do
118
- y(@c, :max=>10)
127
+ @c.dataset._fetch = {:max=>10}
119
128
  @o.move_down.should == @o
120
129
  @o.position.should == 4
121
130
  @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
@@ -124,7 +133,7 @@ describe "List plugin" do
124
133
  end
125
134
 
126
135
  it "should have move_down with an argument move down the given number of positions" do
127
- y(@c, :max=>10)
136
+ @c.dataset._fetch = {:max=>10}
128
137
  @o.move_down(3).should == @o
129
138
  @o.position.should == 6
130
139
  @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
@@ -141,11 +150,11 @@ describe "List plugin" do
141
150
 
142
151
  it "should have move_to raise an error if an invalid target is used" do
143
152
  proc{@o.move_to(0)}.should raise_error(Sequel::Error)
144
- y(@c, :max=>10)
153
+ @c.dataset._fetch = {:max=>10}
145
154
  proc{@o.move_to(11)}.should raise_error(Sequel::Error)
146
155
  end
147
156
 
148
- it "should have move_to use a transaction is the instance is configured to use transactions" do
157
+ it "should have move_to use a transaction if the instance is configured to use transactions" do
149
158
  @o.use_transactions = true
150
159
  @o.move_to(2)
151
160
  @db.sqls.should == ["BEGIN",
@@ -167,13 +176,13 @@ describe "List plugin" do
167
176
  end
168
177
 
169
178
  it "should have move to shift entries correctly between current and target if moving down" do
170
- y(@c, :max=>10)
179
+ @c.dataset._fetch = {:max=>10}
171
180
  @o.move_to(4)
172
181
  @db.sqls[1].should == "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 4))"
173
182
  end
174
183
 
175
184
  it "should have move_to_bottom move the item to the last position" do
176
- y(@c, :max=>10)
185
+ @c.dataset._fetch = {:max=>10}
177
186
  @o.move_to_bottom
178
187
  @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
179
188
  "UPDATE items SET position = (position - 1) WHERE ((position >= 4) AND (position <= 10))",
@@ -201,7 +210,7 @@ describe "List plugin" do
201
210
  end
202
211
 
203
212
  it "should have move_up with a negative argument move down the given number of positions" do
204
- y(@c, :max=>10)
213
+ @c.dataset._fetch = {:max=>10}
205
214
  @o.move_up(-1).should == @o
206
215
  @o.position.should == 4
207
216
  @db.sqls.should == ["SELECT max(position) FROM items LIMIT 1",
@@ -210,19 +219,19 @@ describe "List plugin" do
210
219
  end
211
220
 
212
221
  it "should have next return the next entry in the list if not given an argument" do
213
- y(@c, :id=>9, :position=>4)
222
+ @c.dataset._fetch = {:id=>9, :position=>4}
214
223
  @o.next.should == @c.load(:id=>9, :position=>4)
215
224
  @db.sqls.should == ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
216
225
  end
217
226
 
218
227
  it "should have next return the entry the given number of positions below the instance if given an argument" do
219
- y(@c, :id=>9, :position=>5)
228
+ @c.dataset._fetch = {:id=>9, :position=>5}
220
229
  @o.next(2).should == @c.load(:id=>9, :position=>5)
221
230
  @db.sqls.should == ["SELECT * FROM items WHERE (position = 5) ORDER BY position LIMIT 1"]
222
231
  end
223
232
 
224
233
  it "should have next return a previous entry if given a negative argument" do
225
- y(@c, :id=>9, :position=>2)
234
+ @c.dataset._fetch = {:id=>9, :position=>2}
226
235
  @o.next(-1).should == @c.load(:id=>9, :position=>2)
227
236
  @db.sqls.should == ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
228
237
  end
@@ -232,19 +241,19 @@ describe "List plugin" do
232
241
  end
233
242
 
234
243
  it "should have prev return the previous entry in the list if not given an argument" do
235
- y(@c, :id=>9, :position=>2)
244
+ @c.dataset._fetch = {:id=>9, :position=>2}
236
245
  @o.prev.should == @c.load(:id=>9, :position=>2)
237
246
  @db.sqls.should == ["SELECT * FROM items WHERE (position = 2) ORDER BY position LIMIT 1"]
238
247
  end
239
248
 
240
249
  it "should have prev return the entry the given number of positions above the instance if given an argument" do
241
- y(@c, :id=>9, :position=>1)
250
+ @c.dataset._fetch = {:id=>9, :position=>1}
242
251
  @o.prev(2).should == @c.load(:id=>9, :position=>1)
243
252
  @db.sqls.should == ["SELECT * FROM items WHERE (position = 1) ORDER BY position LIMIT 1"]
244
253
  end
245
254
 
246
255
  it "should have prev return a following entry if given a negative argument" do
247
- y(@c, :id=>9, :position=>4)
256
+ @c.dataset._fetch = {:id=>9, :position=>4}
248
257
  @o.prev(-1).should == @c.load(:id=>9, :position=>4)
249
258
  @db.sqls.should == ["SELECT * FROM items WHERE (position = 4) ORDER BY position LIMIT 1"]
250
259
  end
@@ -4,18 +4,18 @@ describe "LooserTypecasting Extension" do
4
4
  before do
5
5
  @db = Sequel::Database.new({})
6
6
  def @db.schema(*args)
7
- [[:id, {}], [:y, {:type=>:float}], [:b, {:type=>:integer}]]
7
+ [[:id, {}], [:z, {:type=>:float}], [:b, {:type=>:integer}]]
8
8
  end
9
9
  @c = Class.new(Sequel::Model(@db[:items]))
10
10
  @c.instance_eval do
11
- @columns = [:id, :b, :y]
11
+ @columns = [:id, :b, :z]
12
12
  def columns; @columns; end
13
13
  end
14
14
  end
15
15
 
16
16
  specify "Should use to_i instead of Integer() for typecasting integers" do
17
17
  proc{@c.new(:b=>'a')}.should raise_error(Sequel::InvalidValue)
18
- @db.extend(Sequel::LooserTypecasting)
18
+ @db.extension(:looser_typecasting)
19
19
  @c.new(:b=>'a').b.should == 0
20
20
 
21
21
  o = Object.new
@@ -26,14 +26,14 @@ describe "LooserTypecasting Extension" do
26
26
  end
27
27
 
28
28
  specify "Should use to_f instead of Float() for typecasting floats" do
29
- proc{@c.new(:y=>'a')}.should raise_error(Sequel::InvalidValue)
30
- @db.extend(Sequel::LooserTypecasting)
31
- @c.new(:y=>'a').y.should == 0.0
29
+ proc{@c.new(:z=>'a')}.should raise_error(Sequel::InvalidValue)
30
+ @db.extension(:looser_typecasting)
31
+ @c.new(:z=>'a').z.should == 0.0
32
32
 
33
33
  o = Object.new
34
34
  def o.to_f
35
35
  1.0
36
36
  end
37
- @c.new(:y=>o).y.should == 1.0
37
+ @c.new(:z=>o).z.should == 1.0
38
38
  end
39
39
  end