sequel 5.28.0 → 5.33.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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +64 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +3 -3
  7. data/doc/code_order.rdoc +12 -2
  8. data/doc/model_dataset_method_design.rdoc +1 -1
  9. data/doc/postgresql.rdoc +71 -0
  10. data/doc/release_notes/5.29.0.txt +22 -0
  11. data/doc/release_notes/5.30.0.txt +20 -0
  12. data/doc/release_notes/5.31.0.txt +148 -0
  13. data/doc/release_notes/5.32.0.txt +46 -0
  14. data/doc/release_notes/5.33.0.txt +24 -0
  15. data/doc/testing.rdoc +1 -1
  16. data/lib/sequel/adapters/postgres.rb +5 -1
  17. data/lib/sequel/adapters/shared/access.rb +6 -6
  18. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  19. data/lib/sequel/adapters/shared/mysql.rb +10 -10
  20. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  21. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  22. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  23. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  24. data/lib/sequel/adapters/tinytds.rb +1 -1
  25. data/lib/sequel/connection_pool/sharded_threaded.rb +2 -2
  26. data/lib/sequel/connection_pool/threaded.rb +1 -1
  27. data/lib/sequel/core.rb +318 -314
  28. data/lib/sequel/database/query.rb +1 -1
  29. data/lib/sequel/database/schema_generator.rb +1 -1
  30. data/lib/sequel/database/transactions.rb +8 -12
  31. data/lib/sequel/dataset/misc.rb +2 -2
  32. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  33. data/lib/sequel/extensions/connection_validator.rb +2 -2
  34. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  35. data/lib/sequel/extensions/index_caching.rb +9 -7
  36. data/lib/sequel/extensions/integer64.rb +2 -0
  37. data/lib/sequel/extensions/migration.rb +1 -1
  38. data/lib/sequel/extensions/pg_enum.rb +5 -2
  39. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  40. data/lib/sequel/extensions/pg_inet.rb +13 -5
  41. data/lib/sequel/extensions/pg_interval.rb +2 -0
  42. data/lib/sequel/extensions/pg_range.rb +2 -0
  43. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  44. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  45. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  46. data/lib/sequel/extensions/server_block.rb +3 -3
  47. data/lib/sequel/model/associations.rb +18 -5
  48. data/lib/sequel/model/base.rb +60 -53
  49. data/lib/sequel/model/plugins.rb +1 -0
  50. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  51. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  52. data/lib/sequel/plugins/association_proxies.rb +2 -0
  53. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  54. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  55. data/lib/sequel/plugins/dirty.rb +13 -13
  56. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  57. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  58. data/lib/sequel/plugins/json_serializer.rb +18 -11
  59. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  60. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  61. data/lib/sequel/plugins/subclasses.rb +2 -0
  62. data/lib/sequel/plugins/throw_failures.rb +1 -1
  63. data/lib/sequel/timezones.rb +6 -4
  64. data/lib/sequel/version.rb +1 -1
  65. metadata +18 -367
  66. data/Rakefile +0 -151
  67. data/doc/release_notes/4.0.0.txt +0 -262
  68. data/doc/release_notes/4.1.0.txt +0 -85
  69. data/doc/release_notes/4.10.0.txt +0 -226
  70. data/doc/release_notes/4.11.0.txt +0 -147
  71. data/doc/release_notes/4.12.0.txt +0 -105
  72. data/doc/release_notes/4.13.0.txt +0 -169
  73. data/doc/release_notes/4.14.0.txt +0 -68
  74. data/doc/release_notes/4.15.0.txt +0 -56
  75. data/doc/release_notes/4.16.0.txt +0 -36
  76. data/doc/release_notes/4.17.0.txt +0 -38
  77. data/doc/release_notes/4.18.0.txt +0 -36
  78. data/doc/release_notes/4.19.0.txt +0 -45
  79. data/doc/release_notes/4.2.0.txt +0 -129
  80. data/doc/release_notes/4.20.0.txt +0 -79
  81. data/doc/release_notes/4.21.0.txt +0 -94
  82. data/doc/release_notes/4.22.0.txt +0 -72
  83. data/doc/release_notes/4.23.0.txt +0 -65
  84. data/doc/release_notes/4.24.0.txt +0 -99
  85. data/doc/release_notes/4.25.0.txt +0 -181
  86. data/doc/release_notes/4.26.0.txt +0 -44
  87. data/doc/release_notes/4.27.0.txt +0 -78
  88. data/doc/release_notes/4.28.0.txt +0 -57
  89. data/doc/release_notes/4.29.0.txt +0 -41
  90. data/doc/release_notes/4.3.0.txt +0 -40
  91. data/doc/release_notes/4.30.0.txt +0 -37
  92. data/doc/release_notes/4.31.0.txt +0 -57
  93. data/doc/release_notes/4.32.0.txt +0 -132
  94. data/doc/release_notes/4.33.0.txt +0 -88
  95. data/doc/release_notes/4.34.0.txt +0 -86
  96. data/doc/release_notes/4.35.0.txt +0 -130
  97. data/doc/release_notes/4.36.0.txt +0 -116
  98. data/doc/release_notes/4.37.0.txt +0 -50
  99. data/doc/release_notes/4.38.0.txt +0 -67
  100. data/doc/release_notes/4.39.0.txt +0 -127
  101. data/doc/release_notes/4.4.0.txt +0 -92
  102. data/doc/release_notes/4.40.0.txt +0 -179
  103. data/doc/release_notes/4.41.0.txt +0 -77
  104. data/doc/release_notes/4.42.0.txt +0 -221
  105. data/doc/release_notes/4.43.0.txt +0 -87
  106. data/doc/release_notes/4.44.0.txt +0 -125
  107. data/doc/release_notes/4.45.0.txt +0 -370
  108. data/doc/release_notes/4.46.0.txt +0 -404
  109. data/doc/release_notes/4.47.0.txt +0 -56
  110. data/doc/release_notes/4.48.0.txt +0 -293
  111. data/doc/release_notes/4.49.0.txt +0 -222
  112. data/doc/release_notes/4.5.0.txt +0 -34
  113. data/doc/release_notes/4.6.0.txt +0 -30
  114. data/doc/release_notes/4.7.0.txt +0 -103
  115. data/doc/release_notes/4.8.0.txt +0 -175
  116. data/doc/release_notes/4.9.0.txt +0 -190
  117. data/spec/adapter_spec.rb +0 -4
  118. data/spec/adapters/db2_spec.rb +0 -170
  119. data/spec/adapters/mssql_spec.rb +0 -828
  120. data/spec/adapters/mysql_spec.rb +0 -1060
  121. data/spec/adapters/oracle_spec.rb +0 -371
  122. data/spec/adapters/postgres_spec.rb +0 -4476
  123. data/spec/adapters/spec_helper.rb +0 -44
  124. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  125. data/spec/adapters/sqlite_spec.rb +0 -652
  126. data/spec/bin_spec.rb +0 -278
  127. data/spec/core/connection_pool_spec.rb +0 -1250
  128. data/spec/core/database_spec.rb +0 -2915
  129. data/spec/core/dataset_spec.rb +0 -5547
  130. data/spec/core/deprecated_spec.rb +0 -70
  131. data/spec/core/expression_filters_spec.rb +0 -1498
  132. data/spec/core/mock_adapter_spec.rb +0 -722
  133. data/spec/core/object_graph_spec.rb +0 -336
  134. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  135. data/spec/core/schema_generator_spec.rb +0 -214
  136. data/spec/core/schema_spec.rb +0 -1844
  137. data/spec/core/spec_helper.rb +0 -24
  138. data/spec/core/version_spec.rb +0 -14
  139. data/spec/core_extensions_spec.rb +0 -763
  140. data/spec/core_model_spec.rb +0 -2
  141. data/spec/core_spec.rb +0 -1
  142. data/spec/deprecation_helper.rb +0 -30
  143. data/spec/extensions/accessed_columns_spec.rb +0 -51
  144. data/spec/extensions/active_model_spec.rb +0 -99
  145. data/spec/extensions/after_initialize_spec.rb +0 -28
  146. data/spec/extensions/any_not_empty_spec.rb +0 -23
  147. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  148. data/spec/extensions/association_dependencies_spec.rb +0 -125
  149. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  150. data/spec/extensions/association_pks_spec.rb +0 -423
  151. data/spec/extensions/association_proxies_spec.rb +0 -100
  152. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  153. data/spec/extensions/auto_validations_spec.rb +0 -229
  154. data/spec/extensions/blacklist_security_spec.rb +0 -95
  155. data/spec/extensions/blank_spec.rb +0 -69
  156. data/spec/extensions/boolean_readers_spec.rb +0 -93
  157. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  158. data/spec/extensions/caching_spec.rb +0 -273
  159. data/spec/extensions/caller_logging_spec.rb +0 -52
  160. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  161. data/spec/extensions/column_conflicts_spec.rb +0 -75
  162. data/spec/extensions/column_select_spec.rb +0 -129
  163. data/spec/extensions/columns_introspection_spec.rb +0 -90
  164. data/spec/extensions/columns_updated_spec.rb +0 -35
  165. data/spec/extensions/composition_spec.rb +0 -248
  166. data/spec/extensions/connection_expiration_spec.rb +0 -151
  167. data/spec/extensions/connection_validator_spec.rb +0 -144
  168. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  169. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  170. data/spec/extensions/constraint_validations_spec.rb +0 -439
  171. data/spec/extensions/core_refinements_spec.rb +0 -528
  172. data/spec/extensions/csv_serializer_spec.rb +0 -183
  173. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  174. data/spec/extensions/dataset_associations_spec.rb +0 -365
  175. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  176. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  177. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  178. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  179. data/spec/extensions/defaults_setter_spec.rb +0 -150
  180. data/spec/extensions/delay_add_association_spec.rb +0 -73
  181. data/spec/extensions/dirty_spec.rb +0 -222
  182. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  183. data/spec/extensions/eager_each_spec.rb +0 -62
  184. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  185. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  186. data/spec/extensions/error_splitter_spec.rb +0 -18
  187. data/spec/extensions/error_sql_spec.rb +0 -20
  188. data/spec/extensions/escaped_like_spec.rb +0 -40
  189. data/spec/extensions/eval_inspect_spec.rb +0 -81
  190. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  191. data/spec/extensions/finder_spec.rb +0 -260
  192. data/spec/extensions/force_encoding_spec.rb +0 -126
  193. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  194. data/spec/extensions/graph_each_spec.rb +0 -113
  195. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  196. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  197. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  198. data/spec/extensions/index_caching_spec.rb +0 -66
  199. data/spec/extensions/inflector_spec.rb +0 -183
  200. data/spec/extensions/input_transformer_spec.rb +0 -69
  201. data/spec/extensions/insert_conflict_spec.rb +0 -103
  202. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  203. data/spec/extensions/instance_filters_spec.rb +0 -79
  204. data/spec/extensions/instance_hooks_spec.rb +0 -246
  205. data/spec/extensions/integer64_spec.rb +0 -22
  206. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  207. data/spec/extensions/json_serializer_spec.rb +0 -336
  208. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  209. data/spec/extensions/list_spec.rb +0 -291
  210. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  211. data/spec/extensions/many_through_many_spec.rb +0 -2177
  212. data/spec/extensions/migration_spec.rb +0 -864
  213. data/spec/extensions/modification_detection_spec.rb +0 -93
  214. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  215. data/spec/extensions/named_timezones_spec.rb +0 -218
  216. data/spec/extensions/nested_attributes_spec.rb +0 -815
  217. data/spec/extensions/null_dataset_spec.rb +0 -85
  218. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  219. data/spec/extensions/pagination_spec.rb +0 -116
  220. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  221. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  222. data/spec/extensions/pg_array_spec.rb +0 -398
  223. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  224. data/spec/extensions/pg_enum_spec.rb +0 -118
  225. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  226. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  227. data/spec/extensions/pg_hstore_spec.rb +0 -219
  228. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  229. data/spec/extensions/pg_inet_spec.rb +0 -72
  230. data/spec/extensions/pg_interval_spec.rb +0 -103
  231. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  232. data/spec/extensions/pg_json_spec.rb +0 -451
  233. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  234. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  235. data/spec/extensions/pg_range_spec.rb +0 -600
  236. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  237. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  238. data/spec/extensions/pg_row_spec.rb +0 -363
  239. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  240. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  241. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  242. data/spec/extensions/prepared_statements_spec.rb +0 -177
  243. data/spec/extensions/pretty_table_spec.rb +0 -123
  244. data/spec/extensions/query_spec.rb +0 -94
  245. data/spec/extensions/rcte_tree_spec.rb +0 -387
  246. data/spec/extensions/round_timestamps_spec.rb +0 -39
  247. data/spec/extensions/s_spec.rb +0 -60
  248. data/spec/extensions/schema_caching_spec.rb +0 -64
  249. data/spec/extensions/schema_dumper_spec.rb +0 -870
  250. data/spec/extensions/select_remove_spec.rb +0 -38
  251. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  252. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  253. data/spec/extensions/serialization_spec.rb +0 -365
  254. data/spec/extensions/server_block_spec.rb +0 -135
  255. data/spec/extensions/server_logging_spec.rb +0 -45
  256. data/spec/extensions/sharding_spec.rb +0 -197
  257. data/spec/extensions/shared_caching_spec.rb +0 -151
  258. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  259. data/spec/extensions/singular_table_names_spec.rb +0 -22
  260. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  261. data/spec/extensions/spec_helper.rb +0 -70
  262. data/spec/extensions/split_array_nil_spec.rb +0 -24
  263. data/spec/extensions/split_values_spec.rb +0 -57
  264. data/spec/extensions/sql_comments_spec.rb +0 -33
  265. data/spec/extensions/sql_expr_spec.rb +0 -59
  266. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  267. data/spec/extensions/static_cache_spec.rb +0 -471
  268. data/spec/extensions/string_agg_spec.rb +0 -90
  269. data/spec/extensions/string_date_time_spec.rb +0 -95
  270. data/spec/extensions/string_stripper_spec.rb +0 -68
  271. data/spec/extensions/subclasses_spec.rb +0 -79
  272. data/spec/extensions/subset_conditions_spec.rb +0 -38
  273. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  274. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  275. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  276. data/spec/extensions/table_select_spec.rb +0 -83
  277. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  278. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  279. data/spec/extensions/throw_failures_spec.rb +0 -74
  280. data/spec/extensions/timestamps_spec.rb +0 -209
  281. data/spec/extensions/to_dot_spec.rb +0 -153
  282. data/spec/extensions/touch_spec.rb +0 -226
  283. data/spec/extensions/tree_spec.rb +0 -334
  284. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  285. data/spec/extensions/unlimited_update_spec.rb +0 -21
  286. data/spec/extensions/update_or_create_spec.rb +0 -83
  287. data/spec/extensions/update_primary_key_spec.rb +0 -105
  288. data/spec/extensions/update_refresh_spec.rb +0 -59
  289. data/spec/extensions/uuid_spec.rb +0 -101
  290. data/spec/extensions/validate_associated_spec.rb +0 -52
  291. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  292. data/spec/extensions/validation_contexts_spec.rb +0 -31
  293. data/spec/extensions/validation_helpers_spec.rb +0 -525
  294. data/spec/extensions/whitelist_security_spec.rb +0 -157
  295. data/spec/extensions/xml_serializer_spec.rb +0 -213
  296. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  297. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  298. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  299. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  300. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  301. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  302. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  303. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  304. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  305. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  306. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  307. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  308. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  309. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  310. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  311. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  312. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  313. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  314. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  315. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  316. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  317. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  318. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  319. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  320. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  321. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  322. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  323. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  324. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  325. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  326. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  327. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  328. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  329. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  331. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  332. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  333. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  334. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  335. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  336. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  337. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  338. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  339. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  340. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  341. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  342. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  343. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  344. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  345. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  346. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  347. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  348. data/spec/guards_helper.rb +0 -59
  349. data/spec/integration/associations_test.rb +0 -2597
  350. data/spec/integration/database_test.rb +0 -113
  351. data/spec/integration/dataset_test.rb +0 -2037
  352. data/spec/integration/eager_loader_test.rb +0 -687
  353. data/spec/integration/migrator_test.rb +0 -262
  354. data/spec/integration/model_test.rb +0 -203
  355. data/spec/integration/plugin_test.rb +0 -2423
  356. data/spec/integration/prepared_statement_test.rb +0 -405
  357. data/spec/integration/schema_test.rb +0 -903
  358. data/spec/integration/spec_helper.rb +0 -71
  359. data/spec/integration/timezone_test.rb +0 -86
  360. data/spec/integration/transaction_test.rb +0 -603
  361. data/spec/integration/type_test.rb +0 -127
  362. data/spec/model/association_reflection_spec.rb +0 -803
  363. data/spec/model/associations_spec.rb +0 -4738
  364. data/spec/model/base_spec.rb +0 -875
  365. data/spec/model/class_dataset_methods_spec.rb +0 -146
  366. data/spec/model/dataset_methods_spec.rb +0 -198
  367. data/spec/model/eager_loading_spec.rb +0 -2377
  368. data/spec/model/hooks_spec.rb +0 -370
  369. data/spec/model/inflector_spec.rb +0 -26
  370. data/spec/model/model_spec.rb +0 -956
  371. data/spec/model/plugins_spec.rb +0 -429
  372. data/spec/model/record_spec.rb +0 -2118
  373. data/spec/model/spec_helper.rb +0 -46
  374. data/spec/model/validations_spec.rb +0 -220
  375. data/spec/model_no_assoc_spec.rb +0 -1
  376. data/spec/model_spec.rb +0 -1
  377. data/spec/plugin_spec.rb +0 -1
  378. data/spec/sequel_coverage.rb +0 -15
  379. data/spec/sequel_warning.rb +0 -4
  380. data/spec/spec_config.rb +0 -12
@@ -1,24 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "split_array_nil extension" do
4
- before do
5
- @ds = Sequel.mock[:table].extension(:split_array_nil)
6
- end
7
-
8
- it "should split IN with nil in array into separate OR IS NULL clause" do
9
- @ds.filter(:a=>[1, nil]).sql.must_equal "SELECT * FROM table WHERE ((a IN (1)) OR (a IS NULL))"
10
- end
11
-
12
- it "should split NOT IN with nil in array into separate AND IS NOT NULL clause" do
13
- @ds.exclude(:a=>[1, nil]).sql.must_equal "SELECT * FROM table WHERE ((a NOT IN (1)) AND (a IS NOT NULL))"
14
- end
15
-
16
- it "should not affect other IN/NOT in clauses" do
17
- @ds.filter(:a=>[1, 2]).sql.must_equal "SELECT * FROM table WHERE (a IN (1, 2))"
18
- @ds.exclude(:a=>[1, 2]).sql.must_equal "SELECT * FROM table WHERE (a NOT IN (1, 2))"
19
- end
20
-
21
- it "should not affect other types of filters clauses" do
22
- @ds.filter(:a=>1).sql.must_equal "SELECT * FROM table WHERE (a = 1)"
23
- end
24
- end
@@ -1,57 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::SplitValues" do
4
- before do
5
- @c = Class.new(Sequel::Model(:a))
6
- @c.columns :id, :x
7
- @c.plugin :split_values
8
- end
9
-
10
- it "stores non-columns in a separate hash" do
11
- @c.dataset = @c.dataset.with_fetch(:id=>1, :x=>2, :y=>3)
12
- o = @c.first
13
- @c.db.reset
14
-
15
- o.must_equal @c.load(:id=>1, :x=>2)
16
- o[:id].must_equal 1
17
- o[:x].must_equal 2
18
- o[:y].must_equal 3
19
- {@c.load(:id=>1, :x=>2)=>4}[o].must_equal 4
20
- o.values.must_equal(:id=>1, :x=>2)
21
-
22
- o.save
23
- @c.db.sqls.must_equal ["UPDATE a SET x = 2 WHERE (id = 1)"]
24
- end
25
-
26
- it "handles false values" do
27
- @c.dataset = @c.dataset.with_fetch(:id=>1, :x=>false, :y=>3)
28
- o = @c.first
29
- @c.db.reset
30
-
31
- o.must_equal @c.load(:id=>1, :x=>false)
32
- o[:id].must_equal 1
33
- o[:x].must_equal false
34
- o[:y].must_equal 3
35
- {@c.load(:id=>1, :x=>false)=>4}[o].must_equal 4
36
- o.values.must_equal(:id=>1, :x=>false)
37
-
38
- o.save
39
- @c.db.sqls.must_equal ["UPDATE a SET x = 'f' WHERE (id = 1)"]
40
- end
41
-
42
- it "handles nil values" do
43
- @c.dataset = @c.dataset.with_fetch(:id=>1, :x=>nil, :y=>3)
44
- o = @c.first
45
- @c.db.reset
46
-
47
- o.must_equal @c.load(:id=>1, :x=>nil)
48
- o[:id].must_equal 1
49
- o[:x].must_be_nil
50
- o[:y].must_equal 3
51
- {@c.load(:id=>1, :x=>nil)=>4}[o].must_equal 4
52
- o.values.must_equal(:id=>1, :x=>nil)
53
-
54
- o.save
55
- @c.db.sqls.must_equal ["UPDATE a SET x = NULL WHERE (id = 1)"]
56
- end
57
- end
@@ -1,33 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "sql_comments extension" do
4
- before do
5
- @ds = Sequel.mock[:t].extension(:sql_comments)
6
- end
7
-
8
- it "should not add a comment if one is not set for the dataset" do
9
- @ds.select_sql.must_equal 'SELECT * FROM t'
10
- @ds.insert_sql(:a=>1).must_equal 'INSERT INTO t (a) VALUES (1)'
11
- @ds.delete_sql.must_equal 'DELETE FROM t'
12
- @ds.update_sql(:a=>1).must_equal 'UPDATE t SET a = 1'
13
- end
14
-
15
- it "should add a comment if one is set for the dataset" do
16
- ds = @ds.comment("Some\nComment\r\n Here")
17
- ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
18
- ds.insert_sql(:a=>1).must_equal "INSERT INTO t (a) VALUES (1) -- Some Comment Here\n"
19
- ds.delete_sql.must_equal "DELETE FROM t -- Some Comment Here\n"
20
- ds.update_sql(:a=>1).must_equal "UPDATE t SET a = 1 -- Some Comment Here\n"
21
- end
22
-
23
- it "should handle comments used in nested datasets" do
24
- ds = @ds.comment("Some\nComment\r\n Here")
25
- ds.where(:id=>ds).select_sql.must_equal "SELECT * FROM t WHERE (id IN (SELECT * FROM t -- Some Comment Here\n)) -- Some Comment Here\n"
26
- end
27
-
28
- it "should handle frozen SQL strings" do
29
- @ds = Sequel.mock[:t].with_extend{def select_sql; super.freeze; end}.extension(:sql_comments)
30
- ds = @ds.comment("Some\nComment\r\n Here")
31
- ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
32
- end
33
- end
@@ -1,59 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :sql_expr
4
-
5
- describe "Sequel sql_expr extension" do
6
- before do
7
- @ds = Sequel.mock.dataset
8
- end
9
-
10
- it "Object#sql_expr should wrap the object in a GenericComplexExpression" do
11
- o = Object.new
12
- def o.sql_literal(ds) 'foo' end
13
- s = o.sql_expr
14
- @ds.literal(s).must_equal "foo"
15
- @ds.literal(s+1).must_equal "(foo + 1)"
16
- @ds.literal(s & true).must_equal "(foo AND 't')"
17
- @ds.literal(s < 1).must_equal "(foo < 1)"
18
- @ds.literal(s.sql_subscript(1)).must_equal "(foo)[1]"
19
- @ds.literal(s.like('a')).must_equal "(foo LIKE 'a' ESCAPE '\\')"
20
- @ds.literal(s.as(:a)).must_equal "foo AS a"
21
- @ds.literal(s.cast(Integer)).must_equal "CAST(foo AS integer)"
22
- @ds.literal(s.desc).must_equal "foo DESC"
23
- @ds.literal(s.sql_string + '1').must_equal "(foo || '1')"
24
- end
25
-
26
- it "Numeric#sql_expr should wrap the object in a NumericExpression" do
27
- [1, 2.0, 2^70, BigDecimal('1.0')].each do |o|
28
- @ds.literal(o.sql_expr).must_equal @ds.literal(o)
29
- @ds.literal(o.sql_expr + 1).must_equal "(#{@ds.literal(o)} + 1)"
30
- end
31
- end
32
-
33
- it "String#sql_expr should wrap the object in a StringExpression" do
34
- @ds.literal("".sql_expr).must_equal "''"
35
- @ds.literal("".sql_expr + :a).must_equal "('' || a)"
36
- end
37
-
38
- it "NilClass, TrueClass, and FalseClass#sql_expr should wrap the object in a BooleanExpression" do
39
- [nil, true, false].each do |o|
40
- @ds.literal(o.sql_expr).must_equal @ds.literal(o)
41
- @ds.literal(o.sql_expr & :a).must_equal "(#{@ds.literal(o)} AND a)"
42
- end
43
- end
44
-
45
- it "Proc#sql_expr should should treat the object as a virtual row block" do
46
- @ds.literal(proc{a}.sql_expr).must_equal "a"
47
- @ds.literal(proc{a(b)}.sql_expr).must_equal "a(b)"
48
- end
49
-
50
- it "Proc#sql_expr should should wrap the object in a GenericComplexExpression if the object is not already an expression" do
51
- @ds.literal(proc{1}.sql_expr).must_equal "1"
52
- @ds.literal(proc{1}.sql_expr + 2).must_equal "(1 + 2)"
53
- end
54
-
55
- it "Proc#sql_expr should should convert a hash or array of two element arrays to a BooleanExpression" do
56
- @ds.literal(proc{{a=>b}}.sql_expr).must_equal "(a = b)"
57
- @ds.literal(proc{[[a, b]]}.sql_expr & :a).must_equal "((a = b) AND a)"
58
- end
59
- end
@@ -1,35 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "static_cache_cache plugin" do
4
- before do
5
- @db = Sequel.mock
6
- @db.fetch = [{:id=>1, :name=>'A'}, {:id=>2, :name=>'B'}]
7
- @c = Class.new(Sequel::Model(@db[:t]))
8
- def @c.name; 'Foo' end
9
- @c.columns :id, :name
10
- @file = "spec/files/static_cache_cache-spec-#{$$}.cache"
11
- end
12
- after do
13
- File.delete(@file) if File.file?(@file)
14
- end
15
-
16
- it "should allow dumping and loading static cache rows from a cache file" do
17
- @c.plugin :static_cache_cache, @file
18
- @db.sqls
19
- @c.plugin :static_cache
20
- @db.sqls.must_equal ['SELECT * FROM t']
21
- @c.all.must_equal [@c.load(:id=>1, :name=>'A'), @c.load(:id=>2, :name=>'B')]
22
-
23
- @c.dump_static_cache_cache
24
-
25
- @db.fetch = []
26
- c = Class.new(Sequel::Model(@db[:t]))
27
- def c.name; 'Foo' end
28
- c.columns :id, :name
29
- @c.plugin :static_cache_cache, @file
30
- @db.sqls
31
- @c.plugin :static_cache
32
- @db.sqls.must_be_empty
33
- @c.all.must_equal [@c.load(:id=>1, :name=>'A'), @c.load(:id=>2, :name=>'B')]
34
- end
35
- end
@@ -1,471 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::StaticCache" do
4
- before do
5
- @db = Sequel.mock
6
- @db.fetch = [{:id=>1}, {:id=>2}]
7
- @db.numrows = 1
8
- @c = Class.new(Sequel::Model(@db[:t]))
9
- @c.columns :id, :name
10
- end
11
-
12
- it "should not attempt to validate objects" do
13
- @c.send(:define_method, :validate){errors.add(:name, 'bad')}
14
- @c.plugin(:static_cache)
15
- @c.map{|o| o.valid?}.must_equal [true, true]
16
- end
17
-
18
- static_cache_specs = shared_description do
19
- it "should use a ruby hash as a cache of all model instances" do
20
- @c.cache.must_equal(1=>@c.load(:id=>1), 2=>@c.load(:id=>2))
21
- @c.cache[1].must_be_same_as(@c1)
22
- @c.cache[2].must_be_same_as(@c2)
23
- end
24
-
25
- it "should make .[] method with primary key use the cache" do
26
- @c[1].must_equal @c1
27
- @c[2].must_equal @c2
28
- @c[3].must_be_nil
29
- @c[[1, 2]].must_be_nil
30
- @c[nil].must_be_nil
31
- @c[].must_be_nil
32
- @db.sqls.must_equal []
33
- end
34
-
35
- it "should have .[] with a hash not use the cache" do
36
- @db.fetch = {:id=>2}
37
- @c[:id=>2].must_equal @c2
38
- @db.sqls.must_equal ['SELECT * FROM t WHERE (id = 2) LIMIT 1']
39
- end
40
-
41
- it "should support cache_get_pk" do
42
- @c.cache_get_pk(1).must_equal @c1
43
- @c.cache_get_pk(2).must_equal @c2
44
- @c.cache_get_pk(3).must_be_nil
45
- @db.sqls.must_equal []
46
- end
47
-
48
- it "should have first just returns instances without sending a query" do
49
- @c.first.must_equal @c1
50
- @c.first(2).must_equal [@c1, @c2]
51
- @c.first(0).must_equal []
52
- @db.sqls.must_equal []
53
- end
54
-
55
- it "should have first just returns instances with sending a query" do
56
- @db.fetch = lambda do |s|
57
- case s
58
- when /id = '?(\d+)'?/
59
- id = $1.to_i
60
- id <= 2 ? { id: id } : nil
61
- when /id >= '?(\d+)'?/
62
- id = $1.to_i
63
- id <= 2 ? (id..2).map { |i| { id: i } } : []
64
- end
65
- end
66
-
67
- @c.first(id: 2).must_equal @c2
68
- @c.first(id: '2').must_equal @c2
69
- @c.first(id: 3).must_be_nil
70
- @c.first { id >= 2 }.must_equal @c2
71
- @c.first(2) { id >= 1 }.must_equal [@c1, @c2]
72
- @c.first(Sequel.lit('id = ?', 2)).must_equal @c2
73
- @db.sqls.must_equal [
74
- "SELECT * FROM t WHERE (id = 2) LIMIT 1",
75
- "SELECT * FROM t WHERE (id = '2') LIMIT 1",
76
- "SELECT * FROM t WHERE (id = 3) LIMIT 1",
77
- "SELECT * FROM t WHERE (id >= 2) LIMIT 1",
78
- "SELECT * FROM t WHERE (id >= 1) LIMIT 2",
79
- "SELECT * FROM t WHERE (id = 2) LIMIT 1"
80
- ]
81
- end
82
-
83
- it "should have each just iterate over the hash's values without sending a query" do
84
- a = []
85
- @c.each{|o| a << o}
86
- a = a.sort_by{|o| o.id}
87
- a.first.must_equal @c1
88
- a.last.must_equal @c2
89
- @db.sqls.must_equal []
90
- end
91
-
92
- it "should have map just iterate over the hash's values without sending a query if no argument is given" do
93
- @c.map{|v| v.id}.sort.must_equal [1, 2]
94
- @db.sqls.must_equal []
95
- end
96
-
97
- it "should have count with no argument or block not issue a query" do
98
- @c.count.must_equal 2
99
- @db.sqls.must_equal []
100
- end
101
-
102
- it "should have count with argument or block not issue a query" do
103
- @db.fetch = [[{:count=>1}], [{:count=>2}]]
104
- @c.count(:a).must_equal 1
105
- @c.count{b}.must_equal 2
106
- @db.sqls.must_equal ["SELECT count(a) AS count FROM t LIMIT 1", "SELECT count(b) AS count FROM t LIMIT 1"]
107
- end
108
-
109
- it "should have map not send a query if given an argument" do
110
- @c.map(:id).sort.must_equal [1, 2]
111
- @db.sqls.must_equal []
112
- @c.map([:id,:id]).sort.must_equal [[1,1], [2,2]]
113
- @db.sqls.must_equal []
114
- end
115
-
116
- it "should have map without a block or argument not raise an exception or issue a query" do
117
- @c.map.to_a.must_equal @c.all
118
- @db.sqls.must_equal []
119
- end
120
-
121
- it "should have map without a block not return a frozen object" do
122
- @c.map.frozen?.must_equal false
123
- end
124
-
125
- it "should have map without a block return an Enumerator" do
126
- @c.map.class.must_equal Enumerator
127
- end
128
-
129
- it "should have map with a block and argument raise" do
130
- proc{@c.map(:id){}}.must_raise(Sequel::Error)
131
- end
132
-
133
- it "should have other enumerable methods work without sending a query" do
134
- a = @c.sort_by{|o| o.id}
135
- a.first.must_equal @c1
136
- a.last.must_equal @c2
137
- @db.sqls.must_equal []
138
- end
139
-
140
- it "should have all return all objects" do
141
- a = @c.all.sort_by{|o| o.id}
142
- a.first.must_equal @c1
143
- a.last.must_equal @c2
144
- @db.sqls.must_equal []
145
- end
146
-
147
- it "should have all not return a frozen object" do
148
- @c.all.frozen?.must_equal false
149
- end
150
-
151
- it "should have all return things in dataset order" do
152
- @c.all.must_equal [@c1, @c2]
153
- end
154
-
155
- it "should have all receiving block" do
156
- a = []
157
- b = @c.all { |o| a << o }
158
- a.must_equal [@c1, @c2]
159
- a.must_equal b
160
- @db.sqls.must_equal []
161
- end
162
-
163
- it "should have as_hash/to_hash without arguments run without a query" do
164
- a = @c.to_hash
165
- a.must_equal(1=>@c1, 2=>@c2)
166
- a[1].must_equal @c1
167
- a[2].must_equal @c2
168
-
169
- a = @c.as_hash
170
- a.must_equal(1=>@c1, 2=>@c2)
171
- a[1].must_equal @c1
172
- a[2].must_equal @c2
173
- @db.sqls.must_equal []
174
- end
175
-
176
- it "should have as_hash handle :hash option" do
177
- h = {}
178
- a = @c.as_hash(nil, nil, :hash=>h)
179
- a.must_be_same_as h
180
- a.must_equal(1=>@c1, 2=>@c2)
181
- a[1].must_equal @c1
182
- a[2].must_equal @c2
183
-
184
- h = {}
185
- a = @c.as_hash(:id, nil, :hash=>h)
186
- a.must_be_same_as h
187
- a.must_equal(1=>@c1, 2=>@c2)
188
- a[1].must_equal @c1
189
- a[2].must_equal @c2
190
-
191
- @db.sqls.must_equal []
192
- end
193
-
194
- it "should have as_hash with arguments return results without a query" do
195
- a = @c.as_hash(:id)
196
- a.must_equal(1=>@c1, 2=>@c2)
197
- a[1].must_equal @c1
198
- a[2].must_equal @c2
199
-
200
- a = @c.as_hash([:id])
201
- a.must_equal([1]=>@c1, [2]=>@c2)
202
- a[[1]].must_equal @c1
203
- a[[2]].must_equal @c2
204
-
205
- @c.as_hash(:id, :id).must_equal(1=>1, 2=>2)
206
- @c.as_hash([:id], :id).must_equal([1]=>1, [2]=>2)
207
- @c.as_hash(:id, [:id]).must_equal(1=>[1], 2=>[2])
208
- @c.as_hash([:id], [:id]).must_equal([1]=>[1], [2]=>[2])
209
-
210
- @db.sqls.must_equal []
211
- end
212
-
213
- it "should have as_hash not return a frozen object" do
214
- @c.as_hash.frozen?.must_equal false
215
- end
216
-
217
- it "should have to_hash_groups without arguments return the cached objects without a query" do
218
- a = @c.to_hash_groups(:id)
219
- a.must_equal(1=>[@c1], 2=>[@c2])
220
- a[1].first.must_equal @c1
221
- a[2].first.must_equal @c2
222
-
223
- a = @c.to_hash_groups([:id])
224
- a.must_equal([1]=>[@c1], [2]=>[@c2])
225
- a[[1]].first.must_equal @c1
226
- a[[2]].first.must_equal @c2
227
-
228
- @c.to_hash_groups(:id, :id).must_equal(1=>[1], 2=>[2])
229
- @c.to_hash_groups([:id], :id).must_equal([1]=>[1], [2]=>[2])
230
- @c.to_hash_groups(:id, [:id]).must_equal(1=>[[1]], 2=>[[2]])
231
- @c.to_hash_groups([:id], [:id]).must_equal([1]=>[[1]], [2]=>[[2]])
232
-
233
- @db.sqls.must_equal []
234
- end
235
-
236
- it "should have to_hash_groups handle :hash option" do
237
- h = {}
238
- a = @c.to_hash_groups(:id, nil, :hash=>h)
239
- a.must_be_same_as h
240
- a.must_equal(1=>[@c1], 2=>[@c2])
241
- a[1].first.must_equal @c1
242
- a[2].first.must_equal @c2
243
- end
244
-
245
- it "should have as_hash_groups without arguments return the cached objects without a query" do
246
- a = @c.to_hash_groups(:id)
247
- a.must_equal(1=>[@c1], 2=>[@c2])
248
- a[1].first.must_equal @c1
249
- a[2].first.must_equal @c2
250
-
251
- a = @c.to_hash_groups([:id])
252
- a.must_equal([1]=>[@c1], [2]=>[@c2])
253
- a[[1]].first.must_equal @c1
254
- a[[2]].first.must_equal @c2
255
-
256
- @c.to_hash_groups(:id, :id).must_equal(1=>[1], 2=>[2])
257
- @c.to_hash_groups([:id], :id).must_equal([1]=>[1], [2]=>[2])
258
- @c.to_hash_groups(:id, [:id]).must_equal(1=>[[1]], 2=>[[2]])
259
- @c.to_hash_groups([:id], [:id]).must_equal([1]=>[[1]], [2]=>[[2]])
260
-
261
- @db.sqls.must_equal []
262
- end
263
-
264
- it "subclasses should work correctly" do
265
- c = Class.new(@c)
266
- c.all.must_equal [c.load(:id=>1), c.load(:id=>2)]
267
- c.as_hash.must_equal(1=>c.load(:id=>1), 2=>c.load(:id=>2))
268
- @db.sqls.must_equal ['SELECT * FROM t']
269
- end
270
-
271
- it "set_dataset should work correctly" do
272
- ds = @c.dataset.from(:t2).columns(:id).with_fetch(:id=>3)
273
- @c.dataset = ds
274
- @c.all.must_equal [@c.load(:id=>3)]
275
- @c.as_hash.must_equal(3=>@c.load(:id=>3))
276
- @c.as_hash[3].must_equal @c.all.first
277
- @db.sqls.must_equal ['SELECT * FROM t2']
278
- end
279
-
280
- it "should have load_cache" do
281
- a = @c.all.sort_by{|o| o.id}
282
- a.first.must_equal @c1
283
- a.last.must_equal @c2
284
- @db.sqls.must_equal []
285
-
286
- @c.load_cache
287
-
288
- a = @c.all.sort_by{|o| o.id}
289
- a.first.must_equal @c1
290
- a.last.must_equal @c2
291
- @db.sqls.must_equal ['SELECT * FROM t']
292
- end
293
- end
294
-
295
- describe "without options" do
296
- before do
297
- @c.plugin :static_cache
298
- @c1 = @c.cache[1]
299
- @c2 = @c.cache[2]
300
- @db.sqls
301
- end
302
-
303
- include static_cache_specs
304
-
305
- it "should work correctly with composite keys" do
306
- @db.fetch = [{:id=>1, :id2=>1}, {:id=>2, :id2=>1}]
307
- @c = Class.new(Sequel::Model(@db[:t]))
308
- @c.columns :id, :id2
309
- @c.set_primary_key([:id, :id2])
310
- @c.plugin :static_cache
311
- @db.sqls
312
- @c1 = @c.cache[[1, 2]]
313
- @c2 = @c.cache[[2, 1]]
314
- @c[[1, 2]].must_be_same_as(@c1)
315
- @c[[2, 1]].must_be_same_as(@c2)
316
- @db.sqls.must_equal []
317
- end
318
-
319
- it "all of the static cache values (model instances) should be frozen" do
320
- @c.all.all?{|o| o.frozen?}.must_equal true
321
- end
322
-
323
- it "should make .[] method with primary key return cached instances" do
324
- @c[1].must_be_same_as(@c1)
325
- @c[2].must_be_same_as(@c2)
326
- end
327
-
328
- it "should have cache_get_pk return cached instances" do
329
- @c.cache_get_pk(1).must_be_same_as(@c1)
330
- @c.cache_get_pk(2).must_be_same_as(@c2)
331
- end
332
-
333
- it "should have each yield cached objects" do
334
- a = []
335
- @c.each{|o| a << o}
336
- a = a.sort_by{|o| o.id}
337
- a.first.must_be_same_as(@c1)
338
- a.last.must_be_same_as(@c2)
339
- end
340
-
341
- it "should have other enumerable methods work yield cached objects" do
342
- a = @c.sort_by{|o| o.id}
343
- a.first.must_be_same_as(@c1)
344
- a.last.must_be_same_as(@c2)
345
- end
346
-
347
- it "should have all return cached instances" do
348
- a = @c.all.sort_by{|o| o.id}
349
- a.first.must_be_same_as(@c1)
350
- a.last.must_be_same_as(@c2)
351
- end
352
-
353
- it "should have as_hash without arguments use cached instances" do
354
- a = @c.as_hash
355
- a[1].must_be_same_as(@c1)
356
- a[2].must_be_same_as(@c2)
357
- end
358
-
359
- it "should have as_hash with arguments return cached instances" do
360
- a = @c.as_hash(:id)
361
- a[1].must_be_same_as(@c1)
362
- a[2].must_be_same_as(@c2)
363
-
364
- a = @c.as_hash([:id])
365
- a[[1]].must_be_same_as(@c1)
366
- a[[2]].must_be_same_as(@c2)
367
- end
368
-
369
- it "should have to_hash_groups without single argument return the cached instances" do
370
- a = @c.to_hash_groups(:id)
371
- a[1].first.must_be_same_as(@c1)
372
- a[2].first.must_be_same_as(@c2)
373
-
374
- a = @c.to_hash_groups([:id])
375
- a[[1]].first.must_be_same_as(@c1)
376
- a[[2]].first.must_be_same_as(@c2)
377
- end
378
-
379
- it "should not allow the saving of new objects" do
380
- proc{@c.create}.must_raise(Sequel::HookFailed)
381
- end
382
-
383
- it "should not allow the saving of existing objects" do
384
- @db.fetch = {:id=>1}
385
- proc{@c.first(:id=>1).save}.must_raise(Sequel::HookFailed)
386
- end
387
-
388
- it "should not allow the destroying of existing objects" do
389
- @db.fetch = {:id=>1}
390
- proc{@c.first(:id=>1).destroy}.must_raise(Sequel::HookFailed)
391
- end
392
- end
393
-
394
- describe "with :frozen=>false option" do
395
- before do
396
- @c.plugin :static_cache, :frozen=>false
397
- @c1 = @c.cache[1]
398
- @c2 = @c.cache[2]
399
- @db.sqls
400
- end
401
-
402
- include static_cache_specs
403
-
404
- it "record retrieved by primary key should not be frozen" do
405
- @c[1].frozen?.must_equal false
406
- @c.cache_get_pk(1).frozen?.must_equal false
407
- end
408
-
409
- it "none of values returned in #all should be frozen" do
410
- @c.all.all?{|o| !o.frozen?}.must_equal true
411
- end
412
-
413
- it "none of values yielded by each should be frozen" do
414
- a = []
415
- @c.each{|o| a << o}
416
- a.all?{|o| !o.frozen?}.must_equal true
417
- end
418
-
419
- it "none of values yielded by Enumerable method should be frozen" do
420
- @c.sort_by{|o| o.id}.all?{|o| !o.frozen?}.must_equal true
421
- end
422
-
423
- it "none of values returned by map without an argument or block should be frozen" do
424
- @c.map{|o| o}.all?{|o| !o.frozen?}.must_equal true
425
- @c.map.all?{|o| !o.frozen?}.must_equal true
426
- end
427
-
428
- it "none of values in the hash returned by as_hash without an argument should be frozen" do
429
- @c.as_hash.values.all?{|o| !o.frozen?}.must_equal true
430
- end
431
-
432
- it "none of values in the hash returned by as_hash with a single argument should be frozen" do
433
- @c.as_hash(:id).values.all?{|o| !o.frozen?}.must_equal true
434
- end
435
-
436
- it "none of values in the hash returned by as_hash with a single array argument should be frozen" do
437
- @c.as_hash([:id, :id]).values.all?{|o| !o.frozen?}.must_equal true
438
- end
439
-
440
- it "none of values in the hash returned by to_hash_groups with a single argument should be frozen" do
441
- @c.to_hash_groups(:id).values.flatten.all?{|o| !o.frozen?}.must_equal true
442
- end
443
-
444
- it "none of values in the hash returned by to_hash_groups with a single array argument should be frozen" do
445
- @c.to_hash_groups([:id, :id]).values.flatten.all?{|o| !o.frozen?}.must_equal true
446
- end
447
-
448
- it "should not automatically update the cache when creating new model objects" do
449
- o = @c.new
450
- o.id = 3
451
- @db.autoid = 3
452
- @db.fetch = [[{:id=>1}, {:id=>2}, {:id=>3}], [{:id=>3}]]
453
- o.save
454
- @c[3].must_be_nil
455
- end
456
-
457
- it "should not automatically update the cache when updating model objects" do
458
- o = @c[2]
459
- @db.fetch = [[{:id=>1}, {:id=>2, :name=>'a'}]]
460
- o.update(:name=>'a')
461
- @c[2].values.must_equal(:id=>2)
462
- end
463
-
464
- it "should not automatically update the cache when updating model objects" do
465
- o = @c[2]
466
- @db.fetch = [[{:id=>1}]]
467
- o.destroy
468
- @c[2].must_equal @c2
469
- end
470
- end
471
- end