sequel 5.20.0 → 5.49.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 (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -1,956 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Model()" do
4
- before do
5
- @db = Sequel::Model.db
6
- end
7
-
8
- it "should return a model subclass with the given dataset if given a dataset" do
9
- ds = @db[:blah]
10
- c = Sequel::Model(ds)
11
- c.superclass.must_equal Sequel::Model
12
- c.dataset.row_proc.must_equal c
13
- end
14
-
15
- it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
16
- c = Sequel::Model(:blah)
17
- c.superclass.must_equal Sequel::Model
18
- c.db.must_equal @db
19
- c.table_name.must_equal :blah
20
- end
21
-
22
- it "should return a model subclass with a dataset with the default database and given table name if given a LiteralString" do
23
- c = Sequel::Model(Sequel.lit('blah'))
24
- c.superclass.must_equal Sequel::Model
25
- c.db.must_equal @db
26
- c.table_name.must_equal Sequel.lit('blah')
27
- end
28
-
29
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::Identifier" do
30
- c = Sequel::Model(Sequel.identifier(:blah))
31
- c.superclass.must_equal Sequel::Model
32
- c.db.must_equal @db
33
- c.table_name.must_equal Sequel.identifier(:blah)
34
- end
35
-
36
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::QualifiedIdentifier" do
37
- c = Sequel::Model(Sequel.qualify(:boo, :blah))
38
- c.superclass.must_equal Sequel::Model
39
- c.db.must_equal @db
40
- c.table_name.must_equal Sequel.qualify(:boo, :blah)
41
- end
42
-
43
- it "should return a model subclass with a dataset with the default database and given table name if given an SQL::AliasedExpression" do
44
- c = Sequel::Model(Sequel.as(:blah, :boo))
45
- c.superclass.must_equal Sequel::Model
46
- c.db.must_equal @db
47
- c.table_name.must_equal :boo
48
- end
49
-
50
- it "should return a model subclass with the given dataset if given a dataset using an SQL::Identifier" do
51
- ds = @db[Sequel.identifier(:blah)]
52
- c = Sequel::Model(ds)
53
- c.superclass.must_equal Sequel::Model
54
- c.dataset.row_proc.must_equal c
55
- end
56
-
57
- it "should be callable on Sequel::Model" do
58
- ds = @db[:blah]
59
- c = Sequel::Model::Model(ds)
60
- c.superclass.must_equal Sequel::Model
61
- c.dataset.row_proc.must_equal c
62
- end
63
-
64
- it "should be callable on subclasses of Sequel::Model" do
65
- ds = @db[:blah]
66
- c = Class.new(Sequel::Model)
67
- sc = c::Model(ds)
68
- sc.superclass.must_equal c
69
- sc.dataset.row_proc.must_equal sc
70
- end
71
-
72
- it "should be callable on other modules if def_Model is used" do
73
- m = Module.new
74
- Sequel::Model.def_Model(m)
75
- ds = @db[:blah]
76
- c = m::Model(ds)
77
- c.superclass.must_equal Sequel::Model
78
- c.dataset.row_proc.must_equal c
79
- end
80
-
81
- it "should be callable using model subclasses on other modules if def_Model is used" do
82
- m = Module.new
83
- c = Class.new(Sequel::Model)
84
- c.def_Model(m)
85
- ds = @db[:blah]
86
- sc = m::Model(ds)
87
- sc.superclass.must_equal c
88
- sc.dataset.row_proc.must_equal sc
89
- end
90
-
91
- it "should return a model subclass associated to the given database if given a database" do
92
- db = Sequel.mock
93
- c = Sequel::Model(db)
94
- c.superclass.must_equal Sequel::Model
95
- c.db.must_equal db
96
- proc{c.dataset}.must_raise(Sequel::Error)
97
- class SmBlahTest < c
98
- end
99
- SmBlahTest.db.must_equal db
100
- SmBlahTest.table_name.must_equal :sm_blah_tests
101
- end
102
-
103
- describe "reloading" do
104
- before do
105
- Sequel::Model.cache_anonymous_models = true
106
- end
107
- after do
108
- Sequel::Model.cache_anonymous_models = false
109
- Object.send(:remove_const, :Album) if defined?(::Album)
110
- end
111
-
112
- it "should work without raising an exception with a symbol" do
113
- class ::Album < Sequel::Model(:table); end
114
- class ::Album < Sequel::Model(:table); end
115
- end
116
-
117
- it "should work without raising an exception with an SQL::Identifier " do
118
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
119
- class ::Album < Sequel::Model(Sequel.identifier(:table)); end
120
- end
121
-
122
- it "should work without raising an exception with an SQL::QualifiedIdentifier " do
123
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
124
- class ::Album < Sequel::Model(Sequel.qualify(:schema, :table)); end
125
- end
126
-
127
- it "should work without raising an exception with an SQL::AliasedExpression" do
128
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
129
- class ::Album < Sequel::Model(Sequel.as(:table, :alias)); end
130
- end
131
-
132
- it "should work without raising an exception with an LiteralString" do
133
- class ::Album < Sequel::Model(Sequel.lit('table')); end
134
- class ::Album < Sequel::Model(Sequel.lit('table')); end
135
- end
136
-
137
- it "should work without raising an exception with a database" do
138
- class ::Album < Sequel::Model(@db); end
139
- class ::Album < Sequel::Model(@db); end
140
- end
141
-
142
- it "should work without raising an exception with a dataset" do
143
- class ::Album < Sequel::Model(@db[:table]); end
144
- class ::Album < Sequel::Model(@db[:table]); end
145
- end
146
-
147
- it "should work without raising an exception with a dataset with an SQL::Identifier" do
148
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
149
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
150
- end
151
-
152
- it "should raise an exception if anonymous model caching is disabled" do
153
- Sequel::Model.cache_anonymous_models = false
154
- proc do
155
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
156
- class ::Album < Sequel::Model(@db[Sequel.identifier(:table)]); end
157
- end.must_raise TypeError
158
- end
159
-
160
- it "should use separate anonymous cache for subclasses" do
161
- c = Class.new(Sequel::Model)
162
- c.cache_anonymous_models.must_equal true
163
- class ::Album < c::Model(:table); end
164
- class ::Album < c::Model(:table); end
165
-
166
- c1 = c::Model(:t1)
167
- c1.must_equal c::Model(:t1)
168
- c1.wont_equal Sequel::Model(:t1)
169
-
170
- c.cache_anonymous_models = false
171
- Sequel::Model.cache_anonymous_models.must_equal true
172
- c1.wont_equal c::Model(:t1)
173
- end
174
- end
175
- end
176
-
177
- describe "Sequel::Model.freeze" do
178
- it "should freeze the model class and not allow any changes" do
179
- model = Class.new(Sequel::Model(:items))
180
- model.freeze
181
-
182
- model.frozen?.must_equal true
183
- model.dataset.frozen?.must_equal true
184
- model.db_schema.frozen?.must_equal true
185
- model.db_schema[:id].frozen?.must_equal true
186
- model.columns.frozen?.must_equal true
187
- model.setter_methods.frozen?.must_equal true
188
- model.send(:overridable_methods_module).frozen?.must_equal true
189
- model.default_set_fields_options.frozen?.must_equal true
190
-
191
- proc{model.dataset_module{}}.must_raise RuntimeError
192
- end
193
-
194
- it "should work if the model is already frozen" do
195
- model = Class.new(Sequel::Model(:items))
196
- model.freeze.freeze
197
- end
198
-
199
- it "should freeze a model class without a dataset without breaking" do
200
- model = Class.new(Sequel::Model)
201
- model.freeze
202
- model.frozen?.must_equal true
203
- proc{model.dataset}.must_raise Sequel::Error
204
- model.db_schema.must_be_nil
205
- model.columns.must_be_nil
206
- model.setter_methods.must_equal []
207
- model.send(:overridable_methods_module).frozen?.must_equal true
208
- model.default_set_fields_options.frozen?.must_equal true
209
-
210
- proc{model.dataset_module{}}.must_raise RuntimeError
211
- end
212
-
213
- it "should allow subclasses of frozen model classes to work correctly" do
214
- model = Class.new(Sequel::Model(:items))
215
- model.freeze
216
- model = Class.new(model)
217
- model.dataset = :items2
218
-
219
- model.dataset_module{}
220
- model.plugin Module.new
221
-
222
- model.frozen?.must_equal false
223
- model.db_schema.frozen?.must_equal false
224
- model.db_schema[:id].frozen?.must_equal false
225
- model.setter_methods.frozen?.must_equal false
226
- model.dataset_module{}.frozen?.must_equal false
227
- model.send(:overridable_methods_module).frozen?.must_equal false
228
- model.default_set_fields_options.frozen?.must_equal false
229
- end
230
- end
231
-
232
- describe Sequel::Model do
233
- it "should have class method aliased as model" do
234
- model_a = Class.new(Sequel::Model(:items))
235
- model_a.new.model.must_be_same_as model_a
236
- end
237
-
238
- it "should be associated with a dataset" do
239
- model_a = Class.new(Sequel::Model) { set_dataset DB[:as] }
240
-
241
- model_a.dataset.must_be_kind_of(Sequel::Mock::Dataset)
242
- model_a.dataset.opts[:from].must_equal [:as]
243
-
244
- model_b = Class.new(Sequel::Model) { set_dataset DB[:bs] }
245
-
246
- model_b.dataset.must_be_kind_of(Sequel::Mock::Dataset)
247
- model_b.dataset.opts[:from].must_equal [:bs]
248
-
249
- model_a.dataset.opts[:from].must_equal [:as]
250
- end
251
- end
252
-
253
- describe Sequel::Model do
254
- before do
255
- @model = Class.new(Sequel::Model(:items))
256
- DB.reset
257
- end
258
-
259
- it "should not allow dup/clone" do
260
- proc{@model.dup}.must_raise NoMethodError
261
- proc{@model.clone}.must_raise NoMethodError
262
- end
263
-
264
- it "has table_name return name of table" do
265
- @model.table_name.must_equal :items
266
- end
267
-
268
- it "defaults to primary key of id" do
269
- @model.primary_key.must_equal :id
270
- end
271
-
272
- it "allow primary key change" do
273
- @model.set_primary_key :ssn
274
- @model.primary_key.must_equal :ssn
275
- end
276
-
277
- it "allows dataset change" do
278
- @model.set_dataset(DB[:foo])
279
- @model.table_name.must_equal :foo
280
- end
281
-
282
- it "allows frozen dataset" do
283
- @model.set_dataset(DB[:foo].freeze)
284
- @model.table_name.must_equal :foo
285
- @model.dataset.sql.must_equal 'SELECT * FROM foo'
286
- end
287
-
288
-
289
- it "table_name should respect table aliases" do
290
- @model.set_dataset(Sequel[:foo].as(:x))
291
- @model.table_name.must_equal :x
292
- end
293
-
294
- with_symbol_splitting "table_name should respect table alias symbols" do
295
- @model.set_dataset(:foo___x)
296
- @model.table_name.must_equal :x
297
- end
298
-
299
- it "set_dataset should raise an error unless given a Symbol or Dataset" do
300
- proc{@model.set_dataset(Object.new)}.must_raise(Sequel::Error)
301
- end
302
-
303
- it "set_dataset should use a subquery for joined datasets" do
304
- @model.set_dataset(DB.from(:foo, :bar))
305
- @model.dataset.sql.must_equal 'SELECT * FROM (SELECT * FROM foo, bar) AS foo'
306
- @model.set_dataset(DB[:foo].cross_join(:bar))
307
- @model.dataset.sql.must_equal 'SELECT * FROM (SELECT * FROM foo CROSS JOIN bar) AS foo'
308
- end
309
-
310
- it "set_dataset should add the destroy method to the dataset that destroys each object" do
311
- ds = DB[:foo]
312
- ds.wont_respond_to(:destroy)
313
- ds = @model.set_dataset(ds).dataset
314
- ds.must_respond_to(:destroy)
315
- DB.sqls
316
- ds.with_fetch([{:id=>1}, {:id=>2}]).destroy.must_equal 2
317
- DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
318
- end
319
-
320
- it "set_dataset should add the destroy method that respects sharding with transactions" do
321
- db = Sequel.mock(:servers=>{:s1=>{}})
322
- ds = db[:foo].server(:s1)
323
- @model.use_transactions = true
324
- ds = @model.set_dataset(ds).dataset
325
- db.sqls
326
- ds.destroy.must_equal 0
327
- db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
328
- end
329
-
330
- it "should raise an error on set_dataset if there is an error connecting to the database" do
331
- def @model.columns() raise Sequel::DatabaseConnectionError end
332
- proc{@model.set_dataset(Sequel::Database.new[:foo].join(:blah).from_self)}.must_raise Sequel::DatabaseConnectionError
333
- end
334
-
335
- it "should not raise an error if there is a problem getting the columns for a dataset" do
336
- def @model.columns() raise Sequel::Error end
337
- @model.set_dataset(DB[:foo].join(:blah).from_self)
338
- end
339
-
340
- it "doesn't raise an error on set_dataset if there is an error raised getting the schema" do
341
- db = Sequel.mock
342
- def db.schema(*) raise Sequel::Error; end
343
- @model.set_dataset(db[:foo])
344
- end
345
-
346
- it "reload_db_schema? should be false by default" do
347
- c = Class.new
348
- c.extend Sequel::Model::ClassMethods
349
- c.send(:reload_db_schema?).must_equal false
350
- end
351
-
352
- it "doesn't raise an error on inherited if there is an error setting the dataset" do
353
- db = Sequel.mock
354
- def db.schema(*) raise Sequel::Error; end
355
- @model.dataset = db[:foo]
356
- Class.new(@model)
357
- end
358
-
359
- it "uses a savepoint if inside a transaction when getting the columns" do
360
- db = Sequel.mock
361
- def db.supports_savepoints?; true end
362
- Sequel::Model(db[:table])
363
- db.sqls.must_equal ["SELECT * FROM table LIMIT 1"]
364
- db.transaction{Sequel::Model(db[:table])}
365
- db.sqls.must_equal ["BEGIN", "SAVEPOINT autopoint_1", "SELECT * FROM table LIMIT 1", "RELEASE SAVEPOINT autopoint_1", "COMMIT"]
366
- end
367
-
368
- it "should raise if bad inherited instance variable value is used" do
369
- def @model.inherited_instance_variables() super.merge(:@a=>:foo) end
370
- @model.instance_eval{@a=1}
371
- proc{Class.new(@model)}.must_raise(Sequel::Error)
372
- end
373
-
374
- it "copy inherited instance variables into subclass if set" do
375
- def @model.inherited_instance_variables() super.merge(:@a=>nil, :@b=>:dup, :@c=>:hash_dup, :@d=>proc{|v| v * 2}) end
376
- @model.instance_eval{@a=1; @b=[2]; @c={3=>[4]}; @d=10}
377
- m = Class.new(@model)
378
- @model.instance_eval{@a=5; @b << 6; @c[3] << 7; @c[8] = [9]; @d=40}
379
- m.instance_eval do
380
- @a.must_equal 1
381
- @b.must_equal [2]
382
- @c.must_equal(3=>[4])
383
- @d.must_equal 20
384
- end
385
- end
386
- end
387
-
388
- describe Sequel::Model do
389
- before do
390
- @model = Class.new(Sequel::Model)
391
- DB.reset
392
- end
393
-
394
- it "allows set_dataset to accept a Symbol" do
395
- @model.set_dataset(:foo)
396
- @model.table_name.must_equal :foo
397
- end
398
-
399
- it "allows set_dataset to accept a LiteralString" do
400
- @model.set_dataset(Sequel.lit('foo'))
401
- @model.table_name.must_equal Sequel.lit('foo')
402
- end
403
-
404
- it "allows set_dataset to acceptan SQL::Identifier" do
405
- @model.set_dataset(Sequel.identifier(:foo))
406
- @model.table_name.must_equal Sequel.identifier(:foo)
407
- end
408
-
409
- it "allows set_dataset to acceptan SQL::QualifiedIdentifier" do
410
- @model.set_dataset(Sequel.qualify(:bar, :foo))
411
- @model.table_name.must_equal Sequel.qualify(:bar, :foo)
412
- end
413
-
414
- it "allows set_dataset to acceptan SQL::AliasedExpression" do
415
- @model.set_dataset(Sequel.as(:foo, :bar))
416
- @model.table_name.must_equal :bar
417
- end
418
- end
419
-
420
- describe Sequel::Model, ".require_valid_table = true" do
421
- before do
422
- @db = Sequel.mock
423
- @db.columns = proc do |sql|
424
- raise Sequel::Error if sql =~ /foos/
425
- [:id]
426
- end
427
- def @db.supports_schema_parsing?; true end
428
- def @db.schema(t, *) t.first_source == :foos ? (raise Sequel::Error) : [[:id, {}]] end
429
- Sequel::Model.db = @db
430
- Sequel::Model.require_valid_table = true
431
- end
432
- after do
433
- Sequel::Model.require_valid_table = false
434
- Sequel::Model.db = DB
435
- if Object.const_defined?(:Bar)
436
- Object.send(:remove_const, :Bar)
437
- end
438
- if Object.const_defined?(:Foo)
439
- Object.send(:remove_const, :Foo)
440
- end
441
- end
442
-
443
- it "should raise an exception when creating a model with an invalid implicit table" do
444
- proc{class ::Foo < Sequel::Model; end}.must_raise Sequel::Error
445
- end
446
-
447
- it "should not raise an exception when creating a model with a valid implicit table" do
448
- class ::Bar < Sequel::Model; end
449
- Bar.columns.must_equal [:id]
450
- end
451
-
452
- it "should raise an exception when creating a model with an invalid explicit table" do
453
- proc{Sequel::Model(@db[:foos])}.must_raise Sequel::Error
454
- end
455
-
456
- it "should not raise an exception when creating a model with a valid explicit table" do
457
- c = Sequel::Model(@db[:bars])
458
- c.columns.must_equal [:id]
459
- end
460
-
461
- it "should raise an exception when calling set_dataset with an invalid table" do
462
- c = Class.new(Sequel::Model)
463
- proc{c.set_dataset @db[:foos]}.must_raise Sequel::Error
464
- end
465
-
466
- it "should not raise an exception when calling set_dataset with an valid table" do
467
- c = Class.new(Sequel::Model)
468
- c.set_dataset @db[:bars]
469
- c.columns.must_equal [:id]
470
- end
471
-
472
- it "should assume nil value is the same as false" do
473
- c = Class.new(Sequel::Model)
474
- c.require_valid_table = nil
475
- ds = @db.dataset.with_extend{def columns; raise Sequel::Error; end}
476
- c.set_dataset(ds)
477
- end
478
- end
479
-
480
- describe Sequel::Model, "constructors" do
481
- before do
482
- @m = Class.new(Sequel::Model)
483
- @m.columns :a, :b
484
- end
485
-
486
- it "should accept a hash" do
487
- m = @m.new(:a => 1, :b => 2)
488
- m.values.must_equal(:a => 1, :b => 2)
489
- m.must_be :new?
490
- end
491
-
492
- it "should accept a block and yield itself to the block" do
493
- block_called = false
494
- m = @m.new {|i| block_called = true; i.must_be_kind_of(@m); i.values[:a] = 1}
495
-
496
- block_called.must_equal true
497
- m.values[:a].must_equal 1
498
- end
499
-
500
- it "should have dataset row_proc create an existing object" do
501
- @m.dataset = Sequel.mock.dataset
502
- o = @m.dataset.row_proc.call(:a=>1)
503
- o.must_be_kind_of(@m)
504
- o.values.must_equal(:a=>1)
505
- o.new?.must_equal false
506
- end
507
-
508
- it "should have .call create an existing object" do
509
- o = @m.call(:a=>1)
510
- o.must_be_kind_of(@m)
511
- o.values.must_equal(:a=>1)
512
- o.new?.must_equal false
513
- end
514
-
515
- it "should have .load create an existing object" do
516
- o = @m.load(:a=>1)
517
- o.must_be_kind_of(@m)
518
- o.values.must_equal(:a=>1)
519
- o.new?.must_equal false
520
- end
521
- end
522
-
523
- describe Sequel::Model, "new" do
524
- before do
525
- @m = Class.new(Sequel::Model) do
526
- set_dataset DB[:items]
527
- columns :x, :id
528
- end
529
- end
530
-
531
- it "should be marked as new?" do
532
- o = @m.new
533
- o.must_be :new?
534
- end
535
-
536
- it "should not be marked as new? once it is saved" do
537
- o = @m.new(:x => 1)
538
- o.must_be :new?
539
- o.save
540
- o.wont_be :new?
541
- end
542
-
543
- it "should use the last inserted id as primary key if not in values" do
544
- @m.dataset = @m.dataset.with_fetch(:x => 1, :id => 1234).with_autoid(1234)
545
-
546
- o = @m.new(:x => 1)
547
- o.save
548
- o.id.must_equal 1234
549
-
550
- o = @m.load(:x => 1, :id => 333)
551
- o.save
552
- o.id.must_equal 333
553
- end
554
- end
555
-
556
- describe Sequel::Model, ".find" do
557
- before do
558
- @c = Class.new(Sequel::Model(:items))
559
- @c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
560
- DB.reset
561
- end
562
-
563
- it "should return the first record matching the given filter" do
564
- @c.find(:name => 'sharon').must_be_kind_of(@c)
565
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
566
-
567
- @c.find(Sequel.expr(:name).like('abc%')).must_be_kind_of(@c)
568
- DB.sqls.must_equal ["SELECT * FROM items WHERE (name LIKE 'abc%' ESCAPE '\\') LIMIT 1"]
569
- end
570
-
571
- it "should accept filter blocks" do
572
- @c.find{id > 1}.must_be_kind_of(@c)
573
- DB.sqls.must_equal ["SELECT * FROM items WHERE (id > 1) LIMIT 1"]
574
-
575
- @c.find{(x > 1) & (y < 2)}.must_be_kind_of(@c)
576
- DB.sqls.must_equal ["SELECT * FROM items WHERE ((x > 1) AND (y < 2)) LIMIT 1"]
577
- end
578
- end
579
-
580
- describe Sequel::Model, ".fetch" do
581
- before do
582
- DB.reset
583
- @c = Class.new(Sequel::Model(:items))
584
- end
585
-
586
- it "should return instances of Model" do
587
- @c.fetch("SELECT * FROM items").first.must_be_kind_of(@c)
588
- end
589
-
590
- it "should return true for .empty? and not raise an error on empty selection" do
591
- @c.dataset = @c.dataset.with_extend do
592
- def fetch_rows(sql)
593
- yield({:count => 0})
594
- end
595
- end
596
- @c.fetch("SELECT * FROM items WHERE FALSE").empty?
597
- end
598
- end
599
-
600
- describe Sequel::Model, ".find_or_create" do
601
- before do
602
- @db = Sequel.mock
603
- @c = Class.new(Sequel::Model(@db[:items])) do
604
- set_primary_key :id
605
- columns :x
606
- end
607
- @db.sqls
608
- end
609
-
610
- it "should find the record" do
611
- @db.fetch = [{:x=>1, :id=>1}]
612
- @db.autoid = 1
613
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
614
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1"]
615
- end
616
-
617
- it "should create the record if not found" do
618
- @db.fetch = [[], {:x=>1, :id=>1}]
619
- @db.autoid = 1
620
- @c.find_or_create(:x => 1).must_equal @c.load(:x=>1, :id=>1)
621
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
622
- "INSERT INTO items (x) VALUES (1)",
623
- "SELECT * FROM items WHERE id = 1"]
624
- end
625
-
626
- it "should pass the new record to be created to the block if no record is found" do
627
- @db.fetch = [[], {:x=>1, :id=>1}]
628
- @db.autoid = 1
629
- @c.find_or_create(:x => 1){|x| x[:y] = 2}.must_equal @c.load(:x=>1, :id=>1)
630
- @db.sqls.must_equal ["SELECT * FROM items WHERE (x = 1) LIMIT 1",
631
- "INSERT INTO items (x, y) VALUES (1, 2)",
632
- "SELECT * FROM items WHERE id = 1"]
633
- end
634
- end
635
-
636
- describe Sequel::Model, ".all" do
637
- it "should return all records in the dataset" do
638
- c = Class.new(Sequel::Model(:items))
639
- c.all.must_equal [c.load(:x=>1, :id=>1)]
640
- end
641
- end
642
-
643
- describe Sequel::Model, "A model class without a primary key" do
644
- before do
645
- @c = Class.new(Sequel::Model(:items)) do
646
- columns :x
647
- no_primary_key
648
- end
649
- DB.reset
650
- end
651
-
652
- it "should be able to insert records without selecting them back" do
653
- i = nil
654
- i = @c.create(:x => 1)
655
- i.class.wont_be_nil
656
- i.values.to_hash.must_equal(:x => 1)
657
-
658
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (1)']
659
- end
660
-
661
- it "should raise when deleting" do
662
- proc{@c.load(:x=>1).delete}.must_raise Sequel::Error
663
- end
664
-
665
- it "should raise when updating" do
666
- proc{@c.load(:x=>1).update(:x=>2)}.must_raise Sequel::Error
667
- end
668
-
669
- it "should insert a record when saving" do
670
- o = @c.new(:x => 2)
671
- o.must_be :new?
672
- o.save
673
- DB.sqls.must_equal ['INSERT INTO items (x) VALUES (2)']
674
- end
675
- end
676
-
677
- describe Sequel::Model, "attribute accessors" do
678
- before do
679
- db = Sequel.mock
680
- def db.supports_schema_parsing?() true end
681
- def db.schema(*)
682
- [[:x, {:type=>:integer}], [:z, {:type=>:integer}]]
683
- end
684
- @dataset = db[:items].columns(:x, :z)
685
- @c = Class.new(Sequel::Model)
686
- DB.reset
687
- end
688
-
689
- it "should be created on set_dataset" do
690
- a = [:x, :z, :x= ,:z=]
691
- (a - @c.instance_methods).must_equal a
692
- @c.set_dataset(@dataset)
693
- (a - @c.instance_methods).must_equal []
694
- o = @c.new
695
- (a - o.methods).must_equal []
696
-
697
- o.x.must_be_nil
698
- o.x = 34
699
- o.x.must_equal 34
700
- end
701
-
702
- it "should be only accept one argument for the write accessor" do
703
- @c.set_dataset(@dataset)
704
- o = @c.new
705
-
706
- o.x = 34
707
- o.x.must_equal 34
708
- proc{o.send(:x=)}.must_raise ArgumentError
709
- proc{o.send(:x=, 3, 4)}.must_raise ArgumentError
710
- end
711
-
712
- it "should have a working typecasting setter even if the column is not selected" do
713
- @c.set_dataset(@dataset.select(:z).columns(:z))
714
- o = @c.new
715
-
716
- o.x = '34'
717
- o.x.must_equal 34
718
- end
719
-
720
- it "should typecast if the new value is the same as the existing but has a different class" do
721
- @c.set_dataset(@dataset.select(:z).columns(:z))
722
- o = @c.new
723
-
724
- o.x = 34
725
- o.x = 34.0
726
- o.x.must_equal 34.0
727
- o.x = 34
728
- o.x.must_equal 34
729
- end
730
- end
731
-
732
- describe Sequel::Model, ".[]" do
733
- before do
734
- @c = Class.new(Sequel::Model(:items))
735
- @c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
736
- DB.reset
737
- end
738
-
739
- it "should return the first record for the given pk" do
740
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
741
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
742
- @c[9999].must_equal @c.load(:name => 'sharon', :id => 1)
743
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 9999"]
744
- end
745
-
746
- it "should have #[] return nil if no rows match" do
747
- @c.dataset = @c.dataset.with_fetch([])
748
- @c[1].must_be_nil
749
- DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
750
- end
751
-
752
- it "should work correctly for custom primary key" do
753
- @c.set_primary_key :name
754
- @c['sharon'].must_equal @c.load(:name => 'sharon', :id => 1)
755
- DB.sqls.must_equal ["SELECT * FROM items WHERE name = 'sharon'"]
756
- end
757
-
758
- it "should handle a dataset that uses a subquery" do
759
- @c.dataset = @c.dataset.cross_join(:a).from_self(:alias=>:b)
760
- @c[1].must_equal @c.load(:name => 'sharon', :id => 1)
761
- DB.sqls.must_equal ["SELECT * FROM (SELECT * FROM items CROSS JOIN a) AS b WHERE (id = 1) LIMIT 1"]
762
- end
763
-
764
- it "should work correctly for composite primary key specified as array" do
765
- @c.set_primary_key [:node_id, :kind]
766
- @c[3921, 201].must_be_kind_of(@c)
767
- DB.sqls.must_equal ['SELECT * FROM items WHERE ((node_id = 3921) AND (kind = 201)) LIMIT 1']
768
- end
769
- end
770
-
771
- describe "Model#inspect" do
772
- it "should include the class name and the values" do
773
- Sequel::Model.load(:x => 333).inspect.must_equal '#<Sequel::Model @values={:x=>333}>'
774
- end
775
- end
776
-
777
- describe "Model.db_schema" do
778
- before do
779
- @c = Class.new(Sequel::Model(:items)) do
780
- def self.columns; orig_columns; end
781
- end
782
- @db = Sequel.mock
783
- def @db.supports_schema_parsing?() true end
784
- @dataset = @db[:items]
785
- end
786
-
787
- it "should not call database's schema if it isn't supported" do
788
- def @db.supports_schema_parsing?() false end
789
- def @db.schema(table, opts = {})
790
- raise Sequel::Error
791
- end
792
- @dataset = @dataset.with_extend do
793
- def columns
794
- [:x, :y]
795
- end
796
- end
797
-
798
- @c.dataset = @dataset
799
- @c.db_schema.must_equal(:x=>{}, :y=>{})
800
- @c.columns.must_equal [:x, :y]
801
-
802
- @c.instance_eval{@db_schema = nil}
803
- @c.db_schema.must_equal(:x=>{}, :y=>{})
804
- @c.columns.must_equal [:x, :y]
805
- end
806
-
807
- it "should use the database's schema and set the columns and dataset columns" do
808
- def @db.schema(table, opts = {})
809
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
810
- end
811
- @c.dataset = @dataset
812
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
813
- @c.columns.must_equal [:x, :y]
814
- @c.dataset.columns.must_equal [:x, :y]
815
- end
816
-
817
- it "should not restrict the schema for datasets with a :select option" do
818
- def @c.columns; [:x, :z]; end
819
- def @db.schema(table, opts = {})
820
- [[:x, {:type=>:integer}], [:y, {:type=>:string}]]
821
- end
822
- @c.dataset = @dataset.select(:x, :y___z)
823
- @c.db_schema.must_equal(:x=>{:type=>:integer}, :z=>{}, :y=>{:type=>:string})
824
- end
825
-
826
- it "should not raise error if setting dataset where getting schema and columns raises an error and require_valid_table is false" do
827
- @c.require_valid_table = false
828
- def @db.schema(table, opts={})
829
- raise Sequel::Error
830
- end
831
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
832
- @c.db_schema.must_equal(:x=>{}, :id=>{})
833
- end
834
-
835
- it "should raise error if setting dataset where getting schema and columns raises an error and require_valid_table is true" do
836
- @c.require_valid_table = true
837
- def @db.schema(table, opts={})
838
- raise Sequel::Error
839
- end
840
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
841
- @c.db_schema.must_equal(:x=>{}, :id=>{})
842
- end
843
-
844
- it "should use dataset columns if getting schema raises an error and require_valid_table is false" do
845
- @c.require_valid_table = false
846
- def @db.schema(table, opts={})
847
- raise Sequel::Error
848
- end
849
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
850
- @c.db_schema.must_equal(:x=>{}, :id=>{})
851
- end
852
-
853
- it "should use dataset columns if getting schema raises an error and require_valid_table is true" do
854
- @c.require_valid_table = true
855
- def @db.schema(table, opts={})
856
- raise Sequel::Error
857
- end
858
- @c.dataset = @dataset.join(:x, :id).from_self.columns(:id, :x)
859
- @c.db_schema.must_equal(:x=>{}, :id=>{})
860
- end
861
-
862
- it "should automatically set a singular primary key based on the schema" do
863
- ds = @dataset
864
- d = ds.db
865
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
866
- @c.primary_key.must_equal :id
867
- @c.dataset = ds
868
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
869
- @c.primary_key.must_equal :x
870
- end
871
-
872
- it "should automatically set a singular primary key even if there are specific columns selected" do
873
- ds = @dataset.select(:a, :b, :x)
874
- d = ds.db
875
- def d.schema(table, *opts) [[:a, {:primary_key=>false}], [:b, {:primary_key=>false}], [:x, {:primary_key=>true}]] end
876
- @c.primary_key.must_equal :id
877
- @c.dataset = ds
878
- @c.db_schema.must_equal(:a=>{:primary_key=>false}, :b=>{:primary_key=>false}, :x=>{:primary_key=>true})
879
- @c.primary_key.must_equal :x
880
- end
881
-
882
- it "should automatically set the composite primary key based on the schema" do
883
- ds = @dataset
884
- d = ds.db
885
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
886
- @c.primary_key.must_equal :id
887
- @c.dataset = ds
888
- @c.db_schema.must_equal(:x=>{:primary_key=>true}, :y=>{:primary_key=>true})
889
- @c.primary_key.must_equal [:x, :y]
890
- end
891
-
892
- it "should set an immutable composite primary key based on the schema" do
893
- ds = @dataset
894
- d = ds.db
895
- def d.schema(table, *opts) [[:x, {:primary_key=>true}], [:y, {:primary_key=>true}]] end
896
- @c.dataset = ds
897
- @c.primary_key.must_equal [:x, :y]
898
- proc{@c.primary_key.pop}.must_raise
899
- end
900
-
901
- it "should automatically set no primary key based on the schema" do
902
- ds = @dataset
903
- d = ds.db
904
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {:primary_key=>false}]] end
905
- @c.primary_key.must_equal :id
906
- @c.dataset = ds
907
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
908
- @c.primary_key.must_be_nil
909
- end
910
-
911
- it "should automatically set primary key for dataset selecting table.*" do
912
- ds = @dataset.select_all(:items)
913
- d = ds.db
914
- def d.schema(table, *opts) [[:x, {:primary_key=>true}]] end
915
- @c.primary_key.must_equal :id
916
- @c.dataset = ds
917
- @c.db_schema.must_equal(:x=>{:primary_key=>true})
918
- @c.primary_key.must_equal :x
919
- end
920
-
921
- it "should not modify the primary key unless all column schema hashes have a :primary_key entry" do
922
- ds = @dataset
923
- d = ds.db
924
- def d.schema(table, *opts) [[:x, {:primary_key=>false}], [:y, {}]] end
925
- @c.primary_key.must_equal :id
926
- @c.dataset = ds
927
- @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{})
928
- @c.primary_key.must_equal :id
929
- end
930
- end
931
-
932
- describe "Model#use_transactions" do
933
- before do
934
- @c = Class.new(Sequel::Model(:items))
935
- end
936
-
937
- it "should return class value by default" do
938
- @c.use_transactions = true
939
- @c.new.use_transactions.must_equal true
940
- @c.use_transactions = false
941
- @c.new.use_transactions.must_equal false
942
- end
943
-
944
- it "should return set value if manually set" do
945
- instance = @c.new
946
- instance.use_transactions = false
947
- instance.use_transactions.must_equal false
948
- @c.use_transactions = true
949
- instance.use_transactions.must_equal false
950
-
951
- instance.use_transactions = true
952
- instance.use_transactions.must_equal true
953
- @c.use_transactions = false
954
- instance.use_transactions.must_equal true
955
- end
956
- end