sequel 5.8.0 → 5.38.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 (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  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 -380
  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 -275
  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 -840
  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 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  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 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  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 -487
  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 -182
  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 -868
  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 -61
  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 -410
  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 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -1,22 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "integer64 extension" do
4
- before do
5
- @db = Sequel.mock.extension(:integer64)
6
- end
7
-
8
- it "should use bigint as default integer type" do
9
- @db.create_table(:t){Integer :a; column :b, Integer}
10
- @db.sqls.must_equal ['CREATE TABLE t (a bigint, b bigint)']
11
- end
12
-
13
- it "should use bigint as default type for primary_key and foreign_key" do
14
- @db.create_table(:t){primary_key :id; foreign_key :t_id, :t}
15
- @db.sqls.must_equal ['CREATE TABLE t (id bigint PRIMARY KEY AUTOINCREMENT, t_id bigint REFERENCES t)']
16
- end
17
-
18
- it "should use bigint when casting" do
19
- @db.get(Sequel.cast('a', Integer))
20
- @db.sqls.must_equal ["SELECT CAST('a' AS bigint) AS v LIMIT 1"]
21
- end
22
- end
@@ -1,33 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::InvertedSubsets" do
4
- it "should add an inverted subset method which inverts the condition" do
5
- c = Class.new(Sequel::Model(:a))
6
- c.plugin :inverted_subsets
7
- c.dataset_module{subset(:published, :published => true)}
8
- c.not_published.sql.must_equal 'SELECT * FROM a WHERE (published IS NOT TRUE)'
9
- end
10
-
11
- it "should support a configuration block to customise the inverted method name" do
12
- c = Class.new(Sequel::Model(:a))
13
- c.plugin(:inverted_subsets){|name| "exclude_#{name}"}
14
- c.dataset_module{where(:published, :published => true)}
15
- c.exclude_published.sql.must_equal 'SELECT * FROM a WHERE (published IS NOT TRUE)'
16
- end
17
-
18
- it "should chain to existing dataset" do
19
- c = Class.new(Sequel::Model(:a))
20
- c.plugin :inverted_subsets
21
- c.dataset_module{where(:published, :published => true)}
22
- c.where(1=>0).not_published.sql.must_equal 'SELECT * FROM a WHERE ((1 = 0) AND (published IS NOT TRUE))'
23
- end
24
-
25
- it "should work in subclasses" do
26
- c = Class.new(Sequel::Model)
27
- c.plugin(:inverted_subsets){|name| "exclude_#{name}"}
28
- c = Class.new(c)
29
- c.dataset = :a
30
- c.dataset_module{subset(:published, :published => true)}
31
- c.exclude_published.sql.must_equal 'SELECT * FROM a WHERE (published IS NOT TRUE)'
32
- end
33
- end
@@ -1,336 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::JsonSerializer" do
4
- before do
5
- class ::Artist < Sequel::Model
6
- unrestrict_primary_key
7
- plugin :json_serializer, :naked=>true
8
- columns :id, :name
9
- def_column_accessor :id, :name
10
- @db_schema = {:id=>{:type=>:integer}}
11
- one_to_many :albums
12
- end
13
- class ::Album < Sequel::Model
14
- unrestrict_primary_key
15
- attr_accessor :blah
16
- plugin :json_serializer, :naked=>true
17
- columns :id, :name, :artist_id
18
- def_column_accessor :id, :name, :artist_id
19
- many_to_one :artist
20
- end
21
- @artist = Artist.load(:id=>2, :name=>'YJM')
22
- @artist.associations[:albums] = []
23
- @album = Album.load(:id=>1, :name=>'RF')
24
- @album.artist = @artist
25
- @album.blah = 'Blah'
26
- end
27
- after do
28
- Object.send(:remove_const, :Artist)
29
- Object.send(:remove_const, :Album)
30
- end
31
-
32
- it "should round trip successfully" do
33
- Artist.from_json(@artist.to_json).must_equal @artist
34
- Album.from_json(@album.to_json).must_equal @album
35
- end
36
-
37
- it "should handle ruby objects in values" do
38
- class ::Artist
39
- def name=(v)
40
- super(Date.parse(v))
41
- end
42
- end
43
- Artist.from_json(Artist.load(:name=>Date.today).to_json).must_equal Artist.load(:name=>Date.today)
44
- end
45
-
46
- it "should support setting json_serializer_opts on models" do
47
- @artist.json_serializer_opts(:only=>:name)
48
- Sequel.parse_json([@artist].to_json).must_equal [{'name'=>@artist.name}]
49
- @artist.json_serializer_opts(:include=>{:albums=>{:only=>:name}})
50
- Sequel.parse_json([@artist].to_json).must_equal [{'name'=>@artist.name, 'albums'=>[{'name'=>@album.name}]}]
51
- end
52
-
53
- it "should handle the :only option" do
54
- Artist.from_json(@artist.to_json(:only=>:name)).must_equal Artist.load(:name=>@artist.name)
55
- Album.from_json(@album.to_json(:only=>[:id, :name])).must_equal Album.load(:id=>@album.id, :name=>@album.name)
56
- end
57
-
58
- it "should handle the :except option" do
59
- Artist.from_json(@artist.to_json(:except=>:id)).must_equal Artist.load(:name=>@artist.name)
60
- Album.from_json(@album.to_json(:except=>[:id, :artist_id])).must_equal Album.load(:name=>@album.name)
61
- end
62
-
63
- it "should handle the :include option for associations" do
64
- Artist.from_json(@artist.to_json(:include=>:albums), :associations=>:albums).albums.must_equal [@album]
65
- Album.from_json(@album.to_json(:include=>:artist), :associations=>:artist).artist.must_equal @artist
66
- end
67
-
68
- it "should have #to_json support blocks for transformations" do
69
- values = {}
70
- @artist.values.each{|k,v| values[k.to_s] = v}
71
- Sequel.parse_json(@artist.to_json{|h| {'data'=>h}}).must_equal({'data'=>values})
72
- end
73
-
74
- it "should raise an error if attempting to parse json when providing array to non-array association or vice-versa" do
75
- proc{Artist.from_json('{"albums":{"id":1,"name":"RF","artist_id":2},"id":2,"name":"YJM"}', :associations=>:albums)}.must_raise(Sequel::Error)
76
- proc{Album.from_json('{"artist":[{"id":2,"name":"YJM"}],"id":1,"name":"RF","artist_id":2}', :associations=>:artist)}.must_raise(Sequel::Error)
77
- end
78
-
79
- it "should raise an error if attempting to parse an array containing non-hashes" do
80
- proc{Artist.from_json('[{"id":2,"name":"YJM"}, 2]')}.must_raise(Sequel::Error)
81
- end
82
-
83
- it "should raise an error if attempting to parse invalid JSON" do
84
- begin
85
- Sequel.instance_eval do
86
- alias pj parse_json
87
- def parse_json(v)
88
- v
89
- end
90
- end
91
- proc{Album.from_json('1')}.must_raise(Sequel::Error)
92
- ensure
93
- Sequel.instance_eval do
94
- alias parse_json pj
95
- end
96
- end
97
- end
98
-
99
- it "should handle case where Sequel.parse_json already returns an instance" do
100
- begin
101
- Sequel.instance_eval do
102
- alias pj parse_json
103
- def parse_json(v)
104
- Album.load(:id=>3)
105
- end
106
- end
107
- ::Album.from_json('1').must_equal Album.load(:id=>3)
108
- ensure
109
- Sequel.instance_eval do
110
- alias parse_json pj
111
- end
112
- end
113
- end
114
-
115
- it "should handle the :include option for arbitrary attributes" do
116
- Album.from_json(@album.to_json(:include=>:blah)).blah.must_equal @album.blah
117
- end
118
-
119
- it "should handle multiple inclusions using an array for the :include option" do
120
- a = Album.from_json(@album.to_json(:include=>[:blah, :artist]), :associations=>:artist)
121
- a.blah.must_equal @album.blah
122
- a.artist.must_equal @artist
123
- end
124
-
125
- it "should handle cascading using a hash for the :include option" do
126
- Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>:artist}}), :associations=>{:albums=>{:associations=>:artist}}).albums.map{|a| a.artist}.must_equal [@artist]
127
- Album.from_json(@album.to_json(:include=>{:artist=>{:include=>:albums}}), :associations=>{:artist=>{:associations=>:albums}}).artist.albums.must_equal [@album]
128
-
129
- Artist.from_json(@artist.to_json(:include=>{:albums=>{:only=>:name}}), :associations=>[:albums]).albums.must_equal [Album.load(:name=>@album.name)]
130
- Album.from_json(@album.to_json(:include=>{:artist=>{:except=>:name}}), :associations=>[:artist]).artist.must_equal Artist.load(:id=>@artist.id)
131
-
132
- Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>{:artist=>{:include=>:albums}}}}), :associations=>{:albums=>{:associations=>{:artist=>{:associations=>:albums}}}}).albums.map{|a| a.artist.albums}.must_equal [[@album]]
133
- Album.from_json(@album.to_json(:include=>{:artist=>{:include=>{:albums=>{:only=>:name}}}}), :associations=>{:artist=>{:associations=>:albums}}).artist.albums.must_equal [Album.load(:name=>@album.name)]
134
- end
135
-
136
- it "should handle usage of association_proxies when cascading using the :include option" do
137
- Artist.plugin :association_proxies
138
- Artist.one_to_many :albums, :clone=>:albums
139
- Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>:artist}}), :associations=>{:albums=>{:associations=>:artist}}).albums.map{|a| a.artist}.must_equal [@artist]
140
- end
141
-
142
- it "should handle the :include option cascading with an empty hash" do
143
- Album.from_json(@album.to_json(:include=>{:artist=>{}}), :associations=>:artist).artist.must_equal @artist
144
- Album.from_json(@album.to_json(:include=>{:blah=>{}})).blah.must_equal @album.blah
145
- end
146
-
147
- it "should accept a :naked option to not include the JSON.create_id, so parsing yields a plain hash" do
148
- Sequel.parse_json(@album.to_json(:naked=>true)).must_equal @album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}
149
- end
150
-
151
- it "should support #from_json to set column values" do
152
- @artist.from_json('{"name": "AS"}')
153
- @artist.name.must_equal 'AS'
154
- @artist.id.must_equal 2
155
- end
156
-
157
- it "should support #from_json to support specific :fields" do
158
- @album.from_json('{"name": "AS", "artist_id": 3}', :fields=>['name'])
159
- @album.name.must_equal 'AS'
160
- @album.artist_id.must_equal 2
161
- end
162
-
163
- it "should support #from_json to support :missing=>:skip option" do
164
- @album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:skip)
165
- @album.name.must_equal 'RF'
166
- @album.artist_id.must_equal 2
167
- end
168
-
169
- it "should support #from_json to support :missing=>:raise option" do
170
- proc{@album.from_json('{"artist_id": 3}', :fields=>['name'], :missing=>:raise)}.must_raise(Sequel::Error)
171
- end
172
-
173
- it "should have #from_json raise an error if parsed json isn't a hash" do
174
- proc{@artist.from_json('[]')}.must_raise(Sequel::Error)
175
- end
176
-
177
- it "should raise an exception for json keys that aren't associations, columns, or setter methods" do
178
- Album.send(:undef_method, :blah=)
179
- proc{Album.from_json(@album.to_json(:include=>:blah))}.must_raise(Sequel::MassAssignmentRestriction)
180
- end
181
-
182
- it "should support a to_json class and dataset method" do
183
- Album.dataset = Album.dataset.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
184
- Artist.dataset = Artist.dataset.with_fetch(:id=>2, :name=>'YJM')
185
- Album.array_from_json(Album.to_json).must_equal [@album]
186
- Album.array_from_json(Album.to_json(:include=>:artist), :associations=>:artist).map{|x| x.artist}.must_equal [@artist]
187
- Album.array_from_json(Album.dataset.to_json(:only=>:name)).must_equal [Album.load(:name=>@album.name)]
188
- end
189
-
190
- it "should have dataset to_json method work with eager_graph datasets" do
191
- ds = Album.dataset.eager_graph(:artist).with_fetch(:id=>1, :name=>'RF', :artist_id=>2, :artist_id_0=>2, :artist_name=>'YM')
192
- Sequel.parse_json(ds.to_json(:only=>:name, :include=>{:artist=>{:only=>:name}})).must_equal [{"name"=>"RF", "artist"=>{"name"=>"YM"}}]
193
- end
194
-
195
- it "should have dataset to_json method work with naked datasets" do
196
- ds = Album.dataset.naked.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
197
- Sequel.parse_json(ds.to_json).must_equal [@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}]
198
- end
199
-
200
- it "should have class and dataset to_json method accept blocks for transformations" do
201
- Album.dataset = Album.dataset.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
202
- Sequel.parse_json(Album.to_json{|h| {'data'=>h}}).must_equal('data'=>[@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}])
203
- Sequel.parse_json(Album.dataset.to_json{|h| {'data'=>h}}).must_equal('data'=>[@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}])
204
- end
205
-
206
- it "should have class and dataset to_json method support :instance_block option for instance_transformations" do
207
- Album.dataset = Album.dataset.with_fetch(:id=>1, :name=>'RF', :artist_id=>2)
208
- Sequel.parse_json(Album.to_json(:instance_block=>lambda{|h| {'data'=>h}})).must_equal [{'data'=>@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}}]
209
- Sequel.parse_json(Album.dataset.to_json(:instance_block=>lambda{|h| {'data'=>h}})).must_equal [{'data'=>@album.values.inject({}){|h, (k, v)| h[k.to_s] = v; h}}]
210
- end
211
-
212
- it "should have dataset to_json method respect :array option for the array to use" do
213
- a = Album.new(:name=>'RF', :artist_id=>3)
214
- Album.array_from_json(Album.to_json(:array=>[a])).must_equal [a]
215
-
216
- a.associations[:artist] = artist = Artist.load(:id=>3, :name=>'YJM')
217
- Album.array_from_json(Album.to_json(:array=>[a], :include=>:artist), :associations=>:artist).first.artist.must_equal artist
218
-
219
- artist.associations[:albums] = [a]
220
- x = Artist.array_from_json(Artist.to_json(:array=>[artist], :include=>:albums), :associations=>[:albums])
221
- x.must_equal [artist]
222
- x.first.albums.must_equal [a]
223
- end
224
-
225
- it "should propagate class default options to instance to_json output" do
226
- class ::Album2 < Sequel::Model
227
- attr_accessor :blah
228
- plugin :json_serializer, :naked => true, :except => :id
229
- columns :id, :name, :artist_id
230
- many_to_one :artist
231
- end
232
- @album2 = Album2.load(:id=>2, :name=>'JK')
233
- @album2.artist = @artist
234
- @album2.blah = 'Gak'
235
- JSON.parse(@album2.to_json).must_equal @album2.values.reject{|k,v| k.to_s == 'id'}.inject({}){|h, (k, v)| h[k.to_s] = v; h}
236
- JSON.parse(@album2.to_json(:only => :name)).must_equal @album2.values.reject{|k,v| k.to_s != 'name'}.inject({}){|h, (k, v)| h[k.to_s] = v; h}
237
- JSON.parse(@album2.to_json(:except => :artist_id)).must_equal @album2.values.reject{|k,v| k.to_s == 'artist_id'}.inject({}){|h, (k, v)| h[k.to_s] = v; h}
238
- end
239
-
240
- it "should handle the :root option to qualify single records" do
241
- @album.to_json(:root=>true, :except => [:name, :artist_id]).to_s.must_equal '{"album":{"id":1}}'
242
- @album.to_json(:root=>true, :only => :name).to_s.must_equal '{"album":{"name":"RF"}}'
243
- end
244
-
245
- it "should handle the :root option to qualify single records of namespaced models" do
246
- module ::Namespace
247
- class Album < Sequel::Model
248
- plugin :json_serializer, :naked=>true
249
- end
250
- end
251
- Namespace::Album.new({}).to_json(:root=>true).to_s.must_equal '{"album":{}}'
252
- Namespace::Album.dataset = Namespace::Album.dataset.with_fetch([{}])
253
- Namespace::Album.dataset.to_json(:root=>:collection).to_s.must_equal '{"albums":[{}]}'
254
- Namespace::Album.dataset.to_json(:root=>:both).to_s.must_equal '{"albums":[{"album":{}}]}'
255
- Object.send(:remove_const, :Namespace)
256
- end
257
-
258
- it "should handle the :root option with a string to qualify single records using the string as the key" do
259
- @album.to_json(:root=>"foo", :except => [:name, :artist_id]).to_s.must_equal '{"foo":{"id":1}}'
260
- @album.to_json(:root=>"bar", :only => :name).to_s.must_equal '{"bar":{"name":"RF"}}'
261
- end
262
-
263
- it "should handle the :root=>:both option to qualify a dataset of records" do
264
- Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]).to_json(:root=>:both, :only => :id).to_s.must_equal '{"albums":[{"album":{"id":1}},{"album":{"id":1}}]}'
265
- end
266
-
267
- it "should handle the :root=>:collection option to qualify just the collection" do
268
- ds = Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}])
269
- ds.to_json(:root=>:collection, :only => :id).to_s.must_equal '{"albums":[{"id":1},{"id":1}]}'
270
- ds.to_json(:root=>true, :only => :id).to_s.must_equal '{"albums":[{"id":1},{"id":1}]}'
271
- end
272
-
273
- it "should handle the :root=>:instance option to qualify just the instances" do
274
- Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}]).to_json(:root=>:instance, :only => :id).to_s.must_equal '[{"album":{"id":1}},{"album":{"id":1}}]'
275
- end
276
-
277
- it "should handle the :root=>string option to qualify just the collection using the string as the key" do
278
- ds = Album.dataset.with_fetch([{:id=>1, :name=>'RF'}, {:id=>1, :name=>'RF'}])
279
- ds.to_json(:root=>"foos", :only => :id).to_s.must_equal '{"foos":[{"id":1},{"id":1}]}'
280
- ds.to_json(:root=>"bars", :only => :id).to_s.must_equal '{"bars":[{"id":1},{"id":1}]}'
281
- end
282
-
283
- it "should use an alias for an included asscociation to qualify an association" do
284
- JSON.parse(@album.to_json(:include=>Sequel.as(:artist, :singer)).to_s).must_equal JSON.parse('{"id":1,"name":"RF","artist_id":2,"singer":{"id":2,"name":"YJM"}}')
285
- JSON.parse(@album.to_json(:include=>{Sequel.as(:artist, :singer)=>{:only=>:name}}).to_s).must_equal JSON.parse('{"id":1,"name":"RF","artist_id":2,"singer":{"name":"YJM"}}')
286
- end
287
-
288
- it "should store the default options in json_serializer_opts" do
289
- Album.json_serializer_opts.must_equal(:naked=>true)
290
- c = Class.new(Album)
291
- c.plugin :json_serializer, :naked=>false
292
- c.json_serializer_opts.must_equal(:naked=>false)
293
- end
294
-
295
- it "should work correctly when subclassing" do
296
- class ::Artist2 < Artist
297
- plugin :json_serializer, :only=>:name
298
- end
299
- Artist2.from_json(Artist2.load(:id=>2, :name=>'YYY').to_json).must_equal Artist2.load(:name=>'YYY')
300
- class ::Artist3 < Artist2
301
- plugin :json_serializer, :naked=>:true
302
- end
303
- Sequel.parse_json(Artist3.load(:id=>2, :name=>'YYY').to_json).must_equal("name"=>'YYY')
304
- Object.send(:remove_const, :Artist2)
305
- Object.send(:remove_const, :Artist3)
306
- end
307
-
308
- it "should raise an error if attempting to set a restricted column and :all_columns is not used" do
309
- Artist.restrict_primary_key
310
- proc{Artist.from_json(@artist.to_json)}.must_raise(Sequel::MassAssignmentRestriction)
311
- end
312
-
313
- it "should raise an error if an unsupported association is passed in the :associations option" do
314
- Artist.association_reflections.delete(:albums)
315
- proc{Artist.from_json(@artist.to_json(:include=>:albums), :associations=>:albums)}.must_raise(Sequel::Error)
316
- end
317
-
318
- it "should raise an error if using from_json and JSON parsing returns an array" do
319
- proc{Artist.from_json([@artist].to_json)}.must_raise(Sequel::Error)
320
- end
321
-
322
- it "should raise an error if using array_from_json and JSON parsing does not return an array" do
323
- proc{Artist.array_from_json(@artist.to_json)}.must_raise(Sequel::Error)
324
- end
325
-
326
- it "should raise an error if using an unsupported :associations option" do
327
- proc{Artist.from_json(@artist.to_json, :associations=>'')}.must_raise(Sequel::Error)
328
- end
329
-
330
- it "should freeze json serializier opts when model class is frozen" do
331
- Album.json_serializer_opts[:only] = [:id]
332
- Album.freeze
333
- Album.json_serializer_opts.frozen?.must_equal true
334
- Album.json_serializer_opts[:only].frozen?.must_equal true
335
- end
336
- end
@@ -1,183 +0,0 @@
1
- require_relative "spec_helper"
2
- require 'yaml'
3
-
4
- describe "Sequel::Plugins::LazyAttributes" do
5
- before do
6
- @db = Sequel.mock
7
- def @db.supports_schema_parsing?() true end
8
- def @db.schema(*a) [[:id, {:type=>:integer}], [:name,{:type=>:string}]] end
9
- class ::LazyAttributesModel < Sequel::Model(@db[:la])
10
- plugin :lazy_attributes
11
- set_columns([:id, :name])
12
- def self.columns; [:id, :name] end
13
- lazy_attributes :name
14
- def self.columns; [:id] end
15
- set_dataset dataset.with_fetch(proc do |sql|
16
- if sql !~ /WHERE/
17
- if sql =~ /name/
18
- [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
19
- else
20
- [{:id=>1}, {:id=>2}]
21
- end
22
- else
23
- if sql =~ /id IN \(([\d, ]+)\)/
24
- $1.split(', ')
25
- elsif sql =~ /id = (\d)/
26
- [$1]
27
- end.map do |x|
28
- if sql =~ /SELECT (la.)?name FROM/
29
- {:name=>x.to_s}
30
- else
31
- {:id=>x.to_i, :name=>x.to_s}
32
- end
33
- end
34
- end
35
- end)
36
- end
37
- @c = ::LazyAttributesModel
38
- @ds = LazyAttributesModel.dataset
39
- @db.sqls
40
- end
41
- after do
42
- Object.send(:remove_const, :LazyAttributesModel)
43
- end
44
-
45
- it "should allowing adding additional lazy attributes via plugin :lazy_attributes" do
46
- @c.set_dataset(@ds.select(:id, :blah))
47
- @c.dataset.sql.must_equal 'SELECT id, blah FROM la'
48
- @c.plugin :lazy_attributes, :blah
49
- @c.dataset.sql.must_equal 'SELECT id FROM la'
50
- end
51
-
52
- it "should allowing adding additional lazy attributes via lazy_attributes" do
53
- @c.set_dataset(@ds.select(:id, :blah))
54
- @c.dataset.sql.must_equal 'SELECT id, blah FROM la'
55
- @c.lazy_attributes :blah
56
- @c.dataset.sql.must_equal 'SELECT id FROM la'
57
- end
58
-
59
- it "should handle lazy attributes that are qualified in the selection" do
60
- @c.set_dataset(@ds.select(Sequel[:la][:id], Sequel[:la][:blah]))
61
- @c.dataset.sql.must_equal 'SELECT la.id, la.blah FROM la'
62
- @c.plugin :lazy_attributes, :blah
63
- @c.dataset.sql.must_equal 'SELECT la.id FROM la'
64
- end
65
-
66
- with_symbol_splitting "should handle lazy attributes that are qualified in the selection using symbol splitting" do
67
- @c.set_dataset(@ds.select(:la__id, :la__blah))
68
- @c.dataset.sql.must_equal 'SELECT la.id, la.blah FROM la'
69
- @c.plugin :lazy_attributes, :blah
70
- @c.dataset.sql.must_equal 'SELECT la.id FROM la'
71
- end
72
-
73
- it "should remove the attributes given from the SELECT columns of the model's dataset" do
74
- @ds.sql.must_equal 'SELECT la.id FROM la'
75
- end
76
-
77
- it "should still typecast correctly in lazy loaded column setters" do
78
- m = @c.new
79
- m.name = 1
80
- m.name.must_equal '1'
81
- end
82
-
83
- it "should raise error if the model has no primary key" do
84
- m = @c.first
85
- @c.no_primary_key
86
- proc{m.name}.must_raise(Sequel::Error)
87
- end
88
-
89
- it "should lazily load the attribute for a single model object" do
90
- m = @c.first
91
- m.values.must_equal(:id=>1)
92
- m.name.must_equal '1'
93
- m.values.must_equal(:id=>1, :name=>'1')
94
- @db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
95
- end
96
-
97
- it "should lazily load the attribute for a frozen model object" do
98
- m = @c.first
99
- m.freeze
100
- m.name.must_equal '1'
101
- @db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
102
- m.name.must_equal '1'
103
- @db.sqls.must_equal ['SELECT la.name FROM la WHERE (id = 1) LIMIT 1']
104
- end
105
-
106
- it "should not lazily load the attribute for a single model object if the value already exists" do
107
- m = @c.first
108
- m.values.must_equal(:id=>1)
109
- m[:name] = '1'
110
- m.name.must_equal '1'
111
- m.values.must_equal(:id=>1, :name=>'1')
112
- @db.sqls.must_equal ['SELECT la.id FROM la LIMIT 1']
113
- end
114
-
115
- it "should not lazily load the attribute for a single model object if it is a new record" do
116
- m = @c.new
117
- m.values.must_equal({})
118
- m.name.must_be_nil
119
- @db.sqls.must_equal []
120
- end
121
-
122
- it "should eagerly load the attribute for all model objects reteived with it" do
123
- ms = @c.all
124
- ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
125
- ms.map{|m| m.name}.must_equal %w'1 2'
126
- ms.map{|m| m.values}.must_equal [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
127
- sqls = @db.sqls
128
- ['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
129
- 'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
130
- sqls.must_equal ['SELECT la.id FROM la']
131
- end
132
-
133
- it "should not eagerly load the attribute if model instance is frozen, and deal with other frozen instances if not frozen" do
134
- ms = @c.all
135
- ms.first.freeze
136
- ms.map{|m| m.name}.must_equal %w'1 2'
137
- @db.sqls.must_equal ['SELECT la.id FROM la', 'SELECT la.name FROM la WHERE (id = 1) LIMIT 1', 'SELECT la.id, la.name FROM la WHERE (la.id IN (2))']
138
- end
139
-
140
- it "should add the accessors to a module included in the class, so they can be easily overridden" do
141
- @c.class_eval do
142
- def name
143
- "#{super}-blah"
144
- end
145
- end
146
- ms = @c.all
147
- ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
148
- ms.map{|m| m.name}.must_equal %w'1-blah 2-blah'
149
- ms.map{|m| m.values}.must_equal [{:id=>1, :name=>'1'}, {:id=>2, :name=>'2'}]
150
- sqls = @db.sqls
151
- ['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
152
- 'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
153
- sqls.must_equal ['SELECT la.id FROM la']
154
- end
155
-
156
- it "should work with the serialization plugin" do
157
- @c.plugin :serialization, :yaml, :name
158
- @ds = @c.dataset = @ds.with_fetch([[{:id=>1}, {:id=>2}], [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}], [{:id=>1}], [{:name=>"--- 3\n"}]])
159
- ms = @ds.all
160
- ms.map{|m| m.values}.must_equal [{:id=>1}, {:id=>2}]
161
- ms.map{|m| m.name}.must_equal [3,6]
162
- ms.map{|m| m.values}.must_equal [{:id=>1, :name=>"--- 3\n"}, {:id=>2, :name=>"--- 6\n"}]
163
- ms.map{|m| m.deserialized_values}.must_equal [{:name=>3}, {:name=>6}]
164
- ms.map{|m| m.name}.must_equal [3,6]
165
- sqls = @db.sqls
166
- ['SELECT la.id, la.name FROM la WHERE (la.id IN (1, 2))',
167
- 'SELECT la.id, la.name FROM la WHERE (la.id IN (2, 1))'].must_include(sqls.pop)
168
- sqls.must_equal ['SELECT la.id FROM la']
169
- m = @ds.first
170
- m.values.must_equal(:id=>1)
171
- m.name.must_equal 3
172
- m.values.must_equal(:id=>1, :name=>"--- 3\n")
173
- m.deserialized_values.must_equal(:name=>3)
174
- m.name.must_equal 3
175
- @db.sqls.must_equal ["SELECT la.id FROM la LIMIT 1", "SELECT la.name FROM la WHERE (id = 1) LIMIT 1"]
176
- end
177
-
178
- it "should not allow additional lazy attributes after freezing" do
179
- @c.plugin :lazy_attributes, :blah
180
- @c.freeze
181
- proc{@c.lazy_attributes :name}.must_raise RuntimeError, TypeError
182
- end
183
- end