sequel 3.21.0 → 3.39.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 (352) hide show
  1. data/CHANGELOG +1061 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +103 -63
  4. data/Rakefile +59 -27
  5. data/bin/sequel +50 -26
  6. data/doc/active_record.rdoc +67 -51
  7. data/doc/advanced_associations.rdoc +189 -75
  8. data/doc/association_basics.rdoc +327 -79
  9. data/doc/cheat_sheet.rdoc +21 -21
  10. data/doc/core_extensions.rdoc +374 -0
  11. data/doc/dataset_basics.rdoc +10 -10
  12. data/doc/dataset_filtering.rdoc +54 -42
  13. data/doc/mass_assignment.rdoc +56 -0
  14. data/doc/migration.rdoc +89 -557
  15. data/doc/model_hooks.rdoc +80 -29
  16. data/doc/object_model.rdoc +547 -0
  17. data/doc/opening_databases.rdoc +114 -53
  18. data/doc/prepared_statements.rdoc +41 -15
  19. data/doc/querying.rdoc +137 -56
  20. data/doc/reflection.rdoc +36 -10
  21. data/doc/release_notes/3.22.0.txt +39 -0
  22. data/doc/release_notes/3.23.0.txt +172 -0
  23. data/doc/release_notes/3.24.0.txt +420 -0
  24. data/doc/release_notes/3.25.0.txt +88 -0
  25. data/doc/release_notes/3.26.0.txt +88 -0
  26. data/doc/release_notes/3.27.0.txt +82 -0
  27. data/doc/release_notes/3.28.0.txt +304 -0
  28. data/doc/release_notes/3.29.0.txt +459 -0
  29. data/doc/release_notes/3.30.0.txt +135 -0
  30. data/doc/release_notes/3.31.0.txt +146 -0
  31. data/doc/release_notes/3.32.0.txt +202 -0
  32. data/doc/release_notes/3.33.0.txt +157 -0
  33. data/doc/release_notes/3.34.0.txt +671 -0
  34. data/doc/release_notes/3.35.0.txt +144 -0
  35. data/doc/release_notes/3.36.0.txt +245 -0
  36. data/doc/release_notes/3.37.0.txt +338 -0
  37. data/doc/release_notes/3.38.0.txt +234 -0
  38. data/doc/release_notes/3.39.0.txt +237 -0
  39. data/doc/schema_modification.rdoc +585 -0
  40. data/doc/sharding.rdoc +99 -8
  41. data/doc/sql.rdoc +154 -112
  42. data/doc/testing.rdoc +169 -0
  43. data/doc/thread_safety.rdoc +17 -0
  44. data/doc/transactions.rdoc +137 -0
  45. data/doc/validations.rdoc +1 -1
  46. data/doc/virtual_rows.rdoc +78 -43
  47. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  48. data/lib/sequel/adapters/ado.rb +40 -18
  49. data/lib/sequel/adapters/amalgalite.rb +17 -9
  50. data/lib/sequel/adapters/db2.rb +175 -86
  51. data/lib/sequel/adapters/dbi.rb +15 -15
  52. data/lib/sequel/adapters/do/mysql.rb +17 -11
  53. data/lib/sequel/adapters/do/postgres.rb +2 -61
  54. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  55. data/lib/sequel/adapters/do.rb +18 -36
  56. data/lib/sequel/adapters/firebird.rb +27 -208
  57. data/lib/sequel/adapters/ibmdb.rb +453 -0
  58. data/lib/sequel/adapters/informix.rb +6 -23
  59. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  60. data/lib/sequel/adapters/jdbc/db2.rb +56 -0
  61. data/lib/sequel/adapters/jdbc/derby.rb +325 -0
  62. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  63. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  64. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  65. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  66. data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
  67. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  68. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  69. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  70. data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
  71. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  72. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  73. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  74. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  75. data/lib/sequel/adapters/jdbc.rb +279 -97
  76. data/lib/sequel/adapters/mock.rb +372 -0
  77. data/lib/sequel/adapters/mysql.rb +125 -222
  78. data/lib/sequel/adapters/mysql2.rb +65 -56
  79. data/lib/sequel/adapters/odbc/mssql.rb +17 -9
  80. data/lib/sequel/adapters/odbc.rb +28 -9
  81. data/lib/sequel/adapters/openbase.rb +3 -5
  82. data/lib/sequel/adapters/oracle.rb +349 -53
  83. data/lib/sequel/adapters/postgres.rb +368 -138
  84. data/lib/sequel/adapters/shared/access.rb +32 -9
  85. data/lib/sequel/adapters/shared/db2.rb +343 -0
  86. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  87. data/lib/sequel/adapters/shared/informix.rb +53 -0
  88. data/lib/sequel/adapters/shared/mssql.rb +401 -116
  89. data/lib/sequel/adapters/shared/mysql.rb +424 -89
  90. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  91. data/lib/sequel/adapters/shared/oracle.rb +257 -45
  92. data/lib/sequel/adapters/shared/postgres.rb +675 -279
  93. data/lib/sequel/adapters/shared/progress.rb +5 -8
  94. data/lib/sequel/adapters/shared/sqlite.rb +285 -96
  95. data/lib/sequel/adapters/sqlite.rb +101 -39
  96. data/lib/sequel/adapters/swift/mysql.rb +10 -12
  97. data/lib/sequel/adapters/swift/postgres.rb +13 -79
  98. data/lib/sequel/adapters/swift/sqlite.rb +9 -6
  99. data/lib/sequel/adapters/swift.rb +28 -19
  100. data/lib/sequel/adapters/tinytds.rb +174 -22
  101. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
  102. data/lib/sequel/adapters/utils/pg_types.rb +81 -0
  103. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  104. data/lib/sequel/ast_transformer.rb +194 -0
  105. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  106. data/lib/sequel/connection_pool/sharded_threaded.rb +33 -2
  107. data/lib/sequel/connection_pool/single.rb +5 -0
  108. data/lib/sequel/connection_pool/threaded.rb +43 -14
  109. data/lib/sequel/connection_pool.rb +10 -2
  110. data/lib/sequel/core.rb +143 -11
  111. data/lib/sequel/database/connecting.rb +38 -28
  112. data/lib/sequel/database/dataset.rb +4 -4
  113. data/lib/sequel/database/dataset_defaults.rb +63 -2
  114. data/lib/sequel/database/logging.rb +7 -2
  115. data/lib/sequel/database/misc.rb +190 -46
  116. data/lib/sequel/database/query.rb +272 -110
  117. data/lib/sequel/database/schema_generator.rb +103 -36
  118. data/lib/sequel/database/schema_methods.rb +300 -67
  119. data/lib/sequel/dataset/actions.rb +344 -90
  120. data/lib/sequel/dataset/features.rb +101 -8
  121. data/lib/sequel/dataset/graph.rb +42 -15
  122. data/lib/sequel/dataset/misc.rb +52 -25
  123. data/lib/sequel/dataset/mutation.rb +12 -7
  124. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  125. data/lib/sequel/dataset/query.rb +305 -54
  126. data/lib/sequel/dataset/sql.rb +720 -292
  127. data/lib/sequel/dataset.rb +8 -0
  128. data/lib/sequel/exceptions.rb +4 -0
  129. data/lib/sequel/extensions/_pretty_table.rb +83 -0
  130. data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
  131. data/lib/sequel/extensions/blank.rb +4 -0
  132. data/lib/sequel/extensions/columns_introspection.rb +72 -0
  133. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  134. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
  135. data/lib/sequel/extensions/eval_inspect.rb +173 -0
  136. data/lib/sequel/extensions/inflector.rb +4 -0
  137. data/lib/sequel/extensions/looser_typecasting.rb +5 -4
  138. data/lib/sequel/extensions/migration.rb +100 -11
  139. data/lib/sequel/extensions/named_timezones.rb +9 -0
  140. data/lib/sequel/extensions/null_dataset.rb +94 -0
  141. data/lib/sequel/extensions/pagination.rb +4 -0
  142. data/lib/sequel/extensions/pg_array.rb +537 -0
  143. data/lib/sequel/extensions/pg_array_ops.rb +263 -0
  144. data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
  145. data/lib/sequel/extensions/pg_hstore.rb +313 -0
  146. data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
  147. data/lib/sequel/extensions/pg_inet.rb +113 -0
  148. data/lib/sequel/extensions/pg_interval.rb +191 -0
  149. data/lib/sequel/extensions/pg_json.rb +208 -0
  150. data/lib/sequel/extensions/pg_range.rb +512 -0
  151. data/lib/sequel/extensions/pg_range_ops.rb +150 -0
  152. data/lib/sequel/extensions/pg_row.rb +572 -0
  153. data/lib/sequel/extensions/pg_row_ops.rb +182 -0
  154. data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
  155. data/lib/sequel/extensions/pretty_table.rb +17 -72
  156. data/lib/sequel/extensions/query.rb +8 -4
  157. data/lib/sequel/extensions/query_literals.rb +79 -0
  158. data/lib/sequel/extensions/schema_caching.rb +76 -0
  159. data/lib/sequel/extensions/schema_dumper.rb +282 -76
  160. data/lib/sequel/extensions/select_remove.rb +39 -0
  161. data/lib/sequel/extensions/server_block.rb +140 -0
  162. data/lib/sequel/extensions/split_array_nil.rb +65 -0
  163. data/lib/sequel/extensions/sql_expr.rb +8 -110
  164. data/lib/sequel/extensions/string_date_time.rb +4 -0
  165. data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
  166. data/lib/sequel/extensions/to_dot.rb +99 -83
  167. data/lib/sequel/model/associations.rb +1263 -409
  168. data/lib/sequel/model/base.rb +624 -171
  169. data/lib/sequel/model/errors.rb +1 -1
  170. data/lib/sequel/model/exceptions.rb +24 -2
  171. data/lib/sequel/model/inflections.rb +1 -1
  172. data/lib/sequel/model.rb +30 -11
  173. data/lib/sequel/no_core_ext.rb +2 -0
  174. data/lib/sequel/plugins/active_model.rb +13 -1
  175. data/lib/sequel/plugins/association_pks.rb +22 -4
  176. data/lib/sequel/plugins/caching.rb +25 -18
  177. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  178. data/lib/sequel/plugins/composition.rb +44 -12
  179. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  180. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  181. data/lib/sequel/plugins/defaults_setter.rb +72 -0
  182. data/lib/sequel/plugins/dirty.rb +214 -0
  183. data/lib/sequel/plugins/eager_each.rb +59 -0
  184. data/lib/sequel/plugins/force_encoding.rb +6 -6
  185. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  186. data/lib/sequel/plugins/identity_map.rb +134 -15
  187. data/lib/sequel/plugins/instance_filters.rb +10 -0
  188. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  189. data/lib/sequel/plugins/json_serializer.rb +58 -6
  190. data/lib/sequel/plugins/list.rb +13 -2
  191. data/lib/sequel/plugins/many_through_many.rb +103 -51
  192. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  193. data/lib/sequel/plugins/nested_attributes.rb +150 -66
  194. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  195. data/lib/sequel/plugins/pg_row.rb +121 -0
  196. data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
  197. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  198. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  199. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  200. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  201. data/lib/sequel/plugins/rcte_tree.rb +31 -17
  202. data/lib/sequel/plugins/schema.rb +8 -3
  203. data/lib/sequel/plugins/serialization.rb +98 -49
  204. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  205. data/lib/sequel/plugins/sharding.rb +21 -54
  206. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  207. data/lib/sequel/plugins/static_cache.rb +99 -0
  208. data/lib/sequel/plugins/subclasses.rb +29 -3
  209. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  210. data/lib/sequel/plugins/timestamps.rb +1 -1
  211. data/lib/sequel/plugins/tree.rb +3 -3
  212. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  213. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  214. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  215. data/lib/sequel/plugins/validation_helpers.rb +55 -4
  216. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  217. data/lib/sequel/sql.rb +649 -122
  218. data/lib/sequel/timezones.rb +67 -40
  219. data/lib/sequel/version.rb +1 -1
  220. data/spec/adapters/db2_spec.rb +146 -0
  221. data/spec/adapters/firebird_spec.rb +1 -1
  222. data/spec/adapters/mssql_spec.rb +194 -66
  223. data/spec/adapters/mysql_spec.rb +475 -306
  224. data/spec/adapters/oracle_spec.rb +92 -117
  225. data/spec/adapters/postgres_spec.rb +1982 -325
  226. data/spec/adapters/spec_helper.rb +9 -6
  227. data/spec/adapters/sqlite_spec.rb +203 -75
  228. data/spec/core/connection_pool_spec.rb +218 -93
  229. data/spec/core/database_spec.rb +956 -522
  230. data/spec/core/dataset_spec.rb +1631 -1242
  231. data/spec/core/expression_filters_spec.rb +690 -334
  232. data/spec/core/mock_adapter_spec.rb +453 -0
  233. data/spec/core/object_graph_spec.rb +88 -129
  234. data/spec/core/schema_generator_spec.rb +4 -4
  235. data/spec/core/schema_spec.rb +556 -53
  236. data/spec/core/spec_helper.rb +7 -48
  237. data/spec/core_extensions_spec.rb +626 -0
  238. data/spec/extensions/active_model_spec.rb +13 -0
  239. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  240. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  241. data/spec/extensions/association_dependencies_spec.rb +15 -25
  242. data/spec/extensions/association_pks_spec.rb +66 -32
  243. data/spec/extensions/association_proxies_spec.rb +4 -4
  244. data/spec/extensions/boolean_readers_spec.rb +25 -25
  245. data/spec/extensions/caching_spec.rb +47 -51
  246. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  247. data/spec/extensions/columns_introspection_spec.rb +91 -0
  248. data/spec/extensions/composition_spec.rb +18 -13
  249. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  250. data/spec/extensions/constraint_validations_spec.rb +316 -0
  251. data/spec/extensions/dataset_associations_spec.rb +199 -0
  252. data/spec/extensions/defaults_setter_spec.rb +88 -0
  253. data/spec/extensions/dirty_spec.rb +155 -0
  254. data/spec/extensions/eager_each_spec.rb +34 -0
  255. data/spec/extensions/eval_inspect_spec.rb +67 -0
  256. data/spec/extensions/force_encoding_spec.rb +4 -2
  257. data/spec/extensions/hook_class_methods_spec.rb +97 -128
  258. data/spec/extensions/identity_map_spec.rb +142 -24
  259. data/spec/extensions/inflector_spec.rb +0 -4
  260. data/spec/extensions/instance_filters_spec.rb +11 -21
  261. data/spec/extensions/instance_hooks_spec.rb +72 -0
  262. data/spec/extensions/json_serializer_spec.rb +49 -12
  263. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  264. data/spec/extensions/list_spec.rb +49 -40
  265. data/spec/extensions/looser_typecasting_spec.rb +7 -7
  266. data/spec/extensions/many_through_many_spec.rb +368 -254
  267. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  268. data/spec/extensions/migration_spec.rb +140 -35
  269. data/spec/extensions/named_timezones_spec.rb +29 -11
  270. data/spec/extensions/nested_attributes_spec.rb +268 -89
  271. data/spec/extensions/null_dataset_spec.rb +85 -0
  272. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  273. data/spec/extensions/pg_array_ops_spec.rb +112 -0
  274. data/spec/extensions/pg_array_spec.rb +320 -0
  275. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  276. data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
  277. data/spec/extensions/pg_hstore_spec.rb +194 -0
  278. data/spec/extensions/pg_inet_spec.rb +47 -0
  279. data/spec/extensions/pg_interval_spec.rb +72 -0
  280. data/spec/extensions/pg_json_spec.rb +99 -0
  281. data/spec/extensions/pg_range_ops_spec.rb +56 -0
  282. data/spec/extensions/pg_range_spec.rb +395 -0
  283. data/spec/extensions/pg_row_ops_spec.rb +58 -0
  284. data/spec/extensions/pg_row_plugin_spec.rb +49 -0
  285. data/spec/extensions/pg_row_spec.rb +323 -0
  286. data/spec/extensions/pg_statement_cache_spec.rb +208 -0
  287. data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
  288. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  289. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  290. data/spec/extensions/prepared_statements_spec.rb +87 -0
  291. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  292. data/spec/extensions/pretty_table_spec.rb +7 -6
  293. data/spec/extensions/query_literals_spec.rb +167 -0
  294. data/spec/extensions/query_spec.rb +9 -3
  295. data/spec/extensions/rcte_tree_spec.rb +50 -43
  296. data/spec/extensions/schema_caching_spec.rb +41 -0
  297. data/spec/extensions/schema_dumper_spec.rb +434 -49
  298. data/spec/extensions/schema_spec.rb +30 -49
  299. data/spec/extensions/select_remove_spec.rb +38 -0
  300. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  301. data/spec/extensions/serialization_spec.rb +86 -48
  302. data/spec/extensions/server_block_spec.rb +90 -0
  303. data/spec/extensions/sharding_spec.rb +69 -143
  304. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  305. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  306. data/spec/extensions/spec_helper.rb +34 -67
  307. data/spec/extensions/split_array_nil_spec.rb +24 -0
  308. data/spec/extensions/sql_expr_spec.rb +29 -60
  309. data/spec/extensions/static_cache_spec.rb +145 -0
  310. data/spec/extensions/subclasses_spec.rb +14 -0
  311. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  312. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  313. data/spec/extensions/timestamps_spec.rb +6 -6
  314. data/spec/extensions/to_dot_spec.rb +8 -11
  315. data/spec/extensions/touch_spec.rb +13 -14
  316. data/spec/extensions/tree_spec.rb +11 -26
  317. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  318. data/spec/extensions/update_primary_key_spec.rb +30 -24
  319. data/spec/extensions/validation_class_methods_spec.rb +58 -67
  320. data/spec/extensions/validation_helpers_spec.rb +31 -37
  321. data/spec/extensions/xml_serializer_spec.rb +29 -4
  322. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  323. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  324. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  325. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  326. data/spec/integration/associations_test.rb +659 -21
  327. data/spec/integration/database_test.rb +11 -5
  328. data/spec/integration/dataset_test.rb +717 -129
  329. data/spec/integration/eager_loader_test.rb +38 -54
  330. data/spec/integration/migrator_test.rb +2 -3
  331. data/spec/integration/model_test.rb +81 -2
  332. data/spec/integration/plugin_test.rb +604 -147
  333. data/spec/integration/prepared_statement_test.rb +272 -128
  334. data/spec/integration/schema_test.rb +367 -57
  335. data/spec/integration/spec_helper.rb +42 -32
  336. data/spec/integration/timezone_test.rb +38 -12
  337. data/spec/integration/transaction_test.rb +183 -8
  338. data/spec/integration/type_test.rb +31 -8
  339. data/spec/model/association_reflection_spec.rb +207 -8
  340. data/spec/model/associations_spec.rb +1206 -693
  341. data/spec/model/base_spec.rb +334 -100
  342. data/spec/model/dataset_methods_spec.rb +45 -27
  343. data/spec/model/eager_loading_spec.rb +828 -692
  344. data/spec/model/hooks_spec.rb +355 -67
  345. data/spec/model/model_spec.rb +251 -179
  346. data/spec/model/plugins_spec.rb +24 -13
  347. data/spec/model/record_spec.rb +506 -232
  348. data/spec/model/spec_helper.rb +16 -77
  349. data/spec/model/validations_spec.rb +38 -2
  350. data/spec/rcov.opts +2 -0
  351. metadata +209 -80
  352. data/spec/core/core_sql_spec.rb +0 -451
@@ -2,8 +2,6 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe Sequel::Model, "caching" do
4
4
  before do
5
- MODEL_DB.reset
6
-
7
5
  @cache_class = Class.new(Hash) do
8
6
  attr_accessor :ttl
9
7
  def set(k, v, ttl); self[k] = v; @ttl = ttl; end
@@ -44,31 +42,14 @@ describe Sequel::Model, "caching" do
44
42
  columns :name, :id
45
43
  end
46
44
 
47
-
48
- $cache_dataset_row = {:name => 'sharon', :id => 1}
49
45
  @dataset = @c.dataset = @c3.dataset = @c4.dataset
50
- $sqls = []
51
- @dataset.extend(Module.new {
52
- def fetch_rows(sql)
53
- $sqls << sql
54
- yield $cache_dataset_row
55
- end
56
-
57
- def update(values)
58
- $sqls << update_sql(values)
59
- $cache_dataset_row.merge!(values)
60
- 1
61
- end
62
-
63
- def delete
64
- $sqls << delete_sql
65
- 1
66
- end
67
- })
46
+ @dataset._fetch = {:name => 'sharon', :id => 1}
47
+ @dataset.numrows = 1
68
48
 
69
49
  @c2 = Class.new(@c) do
70
50
  def self.name; 'SubItem' end
71
51
  end
52
+ @c.db.reset
72
53
  end
73
54
 
74
55
  it "should set the model's cache store" do
@@ -101,7 +82,7 @@ describe Sequel::Model, "caching" do
101
82
  Class.new(@c).cache_ttl.should == 1234
102
83
  end
103
84
 
104
- it "should generate a cache key appropriate to the class" do
85
+ it "should generate a cache key appropriate to the class via the Model#cache_key" do
105
86
  m = @c.new
106
87
  m.values[:id] = 1
107
88
  m.cache_key.should == "#{m.class}:1"
@@ -133,6 +114,11 @@ describe Sequel::Model, "caching" do
133
114
  m.values[:b] = 789
134
115
  m.cache_key.should == "#{m.class}:123,789,456"
135
116
  end
117
+
118
+ it "should generate a cache key via the Model.cache_key method" do
119
+ @c.cache_key(1).should == "#{@c}:1"
120
+ @c.cache_key([1, 2]).should == "#{@c}:1,2"
121
+ end
136
122
 
137
123
  it "should raise error if attempting to generate cache_key and primary key value is null" do
138
124
  m = @c.new
@@ -154,27 +140,31 @@ describe Sequel::Model, "caching" do
154
140
  end
155
141
 
156
142
  it "should set the cache when reading from the database" do
157
- $sqls.should == []
143
+ @c.db.sqls.should == []
158
144
  @cache.should be_empty
159
145
 
160
146
  m = @c[1]
161
- $sqls.should == ['SELECT * FROM items WHERE (id = 1) LIMIT 1']
162
- m.values.should == $cache_dataset_row
147
+ @c.db.sqls.should == ['SELECT * FROM items WHERE id = 1']
148
+ m.values.should == {:name=>"sharon", :id=>1}
163
149
  @cache[m.cache_key].should == m
164
150
  m2 = @c[1]
165
- $sqls.should == ['SELECT * FROM items WHERE (id = 1) LIMIT 1']
151
+ @c.db.sqls.should == []
166
152
  m2.should == m
167
- m2.values.should == $cache_dataset_row
153
+ m2.values.should == {:name=>"sharon", :id=>1}
168
154
 
169
- $sqls.clear
170
155
  m = @c2[1]
171
- $sqls.should == ['SELECT * FROM items WHERE (id = 1) LIMIT 1']
172
- m.values.should == $cache_dataset_row
156
+ @c.db.sqls.should == ['SELECT * FROM items WHERE id = 1']
157
+ m.values.should == {:name=>"sharon", :id=>1}
173
158
  @cache[m.cache_key].should == m
174
159
  m2 = @c2[1]
175
- $sqls.should == ['SELECT * FROM items WHERE (id = 1) LIMIT 1']
160
+ @c.db.sqls.should == []
176
161
  m2.should == m
177
- m2.values.should == $cache_dataset_row
162
+ m2.values.should == {:name=>"sharon", :id=>1}
163
+ end
164
+
165
+ it "should handle lookups by nil primary keys" do
166
+ @c[nil].should == nil
167
+ @c.db.sqls.should == []
178
168
  end
179
169
 
180
170
  it "should delete the cache when writing to the database" do
@@ -183,14 +173,14 @@ describe Sequel::Model, "caching" do
183
173
  m.name = 'hey'
184
174
  m.save
185
175
  @cache.has_key?(m.cache_key).should be_false
186
- $sqls.last.should == "UPDATE items SET name = 'hey' WHERE (id = 1)"
176
+ @c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "UPDATE items SET name = 'hey' WHERE (id = 1)"]
187
177
 
188
178
  m = @c2[1]
189
179
  @cache[m.cache_key].should == m
190
180
  m.name = 'hey'
191
181
  m.save
192
182
  @cache.has_key?(m.cache_key).should be_false
193
- $sqls.last.should == "UPDATE items SET name = 'hey' WHERE (id = 1)"
183
+ @c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "UPDATE items SET name = 'hey' WHERE (id = 1)"]
194
184
  end
195
185
 
196
186
  it "should delete the cache when deleting the record" do
@@ -198,40 +188,33 @@ describe Sequel::Model, "caching" do
198
188
  @cache[m.cache_key].should == m
199
189
  m.delete
200
190
  @cache.has_key?(m.cache_key).should be_false
201
- $sqls.last.should == "DELETE FROM items WHERE (id = 1)"
191
+ @c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "DELETE FROM items WHERE id = 1"]
202
192
 
203
193
  m = @c2[1]
204
194
  @cache[m.cache_key].should == m
205
195
  m.delete
206
196
  @cache.has_key?(m.cache_key).should be_false
207
- $sqls.last.should == "DELETE FROM items WHERE (id = 1)"
197
+ @c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "DELETE FROM items WHERE id = 1"]
208
198
  end
209
199
 
210
200
  it "should support #[] as a shortcut to #find with hash" do
211
201
  m = @c[:id => 3]
212
202
  @cache[m.cache_key].should be_nil
213
- $sqls.last.should == "SELECT * FROM items WHERE (id = 3) LIMIT 1"
203
+ @c.db.sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
214
204
  m = @c[1]
215
205
  @cache[m.cache_key].should == m
216
- $sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1", \
217
- "SELECT * FROM items WHERE (id = 1) LIMIT 1"]
206
+ @c.db.sqls.should == ["SELECT * FROM items WHERE id = 1"]
218
207
  @c[:id => 4]
219
- $sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1", \
220
- "SELECT * FROM items WHERE (id = 1) LIMIT 1", \
221
- "SELECT * FROM items WHERE (id = 4) LIMIT 1"]
208
+ @c.db.sqls.should == ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
222
209
 
223
- $sqls.clear
224
210
  m = @c2[:id => 3]
225
211
  @cache[m.cache_key].should be_nil
226
- $sqls.last.should == "SELECT * FROM items WHERE (id = 3) LIMIT 1"
212
+ @c.db.sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
227
213
  m = @c2[1]
228
214
  @cache[m.cache_key].should == m
229
- $sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1", \
230
- "SELECT * FROM items WHERE (id = 1) LIMIT 1"]
215
+ @c.db.sqls.should == ["SELECT * FROM items WHERE id = 1"]
231
216
  @c2[:id => 4]
232
- $sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1", \
233
- "SELECT * FROM items WHERE (id = 1) LIMIT 1", \
234
- "SELECT * FROM items WHERE (id = 4) LIMIT 1"]
217
+ @c.db.sqls.should == ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
235
218
  end
236
219
 
237
220
  it "should support ignore_exception option" do
@@ -245,6 +228,19 @@ describe Sequel::Model, "caching" do
245
228
  end
246
229
 
247
230
  it "should rescue an exception if cache_store is memcached and ignore_exception is enabled" do
248
- @c4[1].values.should == $cache_dataset_row
231
+ @c4[1].values.should == {:name => 'sharon', :id => 1}
232
+ end
233
+
234
+ it "should support Model.cache_get_pk for getting a value from the cache by primary key" do
235
+ @c.cache_get_pk(1).should == nil
236
+ m = @c[1]
237
+ @c.cache_get_pk(1).should == m
238
+ end
239
+
240
+ it "should support Model.cache_delete_pk for removing a value from the cache by primary key" do
241
+ @c[1]
242
+ @c.cache_get_pk(1).should_not == nil
243
+ @c.cache_delete_pk(1).should == nil
244
+ @c.cache_get_pk(1).should == nil
249
245
  end
250
246
  end
@@ -2,17 +2,16 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "class_table_inheritance plugin" do
4
4
  before do
5
- @db = db = MODEL_DB.clone
6
- def db.schema(table, opts={})
5
+ @db = Sequel.mock(:autoid=>proc{|sql| 1})
6
+ def @db.schema(table, opts={})
7
7
  {:employees=>[[:id, {:primary_key=>true, :type=>:integer}], [:name, {:type=>:string}], [:kind, {:type=>:string}]],
8
8
  :managers=>[[:id, {:type=>:integer}], [:num_staff, {:type=>:integer}]],
9
9
  :executives=>[[:id, {:type=>:integer}], [:num_managers, {:type=>:integer}]],
10
10
  :staff=>[[:id, {:type=>:integer}], [:manager_id, {:type=>:integer}]],
11
- }[table]
11
+ }[table.is_a?(Sequel::Dataset) ? table.first_source_table : table]
12
12
  end
13
- def db.dataset(*args)
14
- ds = super(*args)
15
- def ds.columns
13
+ @db.extend_datasets do
14
+ def columns
16
15
  {[:employees]=>[:id, :name, :kind],
17
16
  [:managers]=>[:id, :num_staff],
18
17
  [:executives]=>[:id, :num_managers],
@@ -22,13 +21,8 @@ describe "class_table_inheritance plugin" do
22
21
  [:employees, :staff]=>[:id, :name, :kind, :manager_id],
23
22
  }[opts[:from] + (opts[:join] || []).map{|x| x.table}]
24
23
  end
25
- def ds.insert(*args)
26
- db << insert_sql(*args)
27
- 1
28
- end
29
- ds
30
24
  end
31
- class ::Employee < Sequel::Model(db)
25
+ class ::Employee < Sequel::Model(@db)
32
26
  def _refresh(x); @values[:id] = 1 end
33
27
  def self.columns
34
28
  dataset.columns
@@ -44,7 +38,7 @@ describe "class_table_inheritance plugin" do
44
38
  many_to_one :manager
45
39
  end
46
40
  @ds = Employee.dataset
47
- @db.reset
41
+ @db.sqls
48
42
  end
49
43
  after do
50
44
  Object.send(:remove_const, :Executive)
@@ -53,8 +47,8 @@ describe "class_table_inheritance plugin" do
53
47
  Object.send(:remove_const, :Employee)
54
48
  end
55
49
 
56
- specify "should have simple_table = nil" do
57
- Employee.simple_table.should == nil
50
+ specify "should have simple_table = nil for subclasses" do
51
+ Employee.simple_table.should == "employees"
58
52
  Manager.simple_table.should == nil
59
53
  Executive.simple_table.should == nil
60
54
  Staff.simple_table.should == nil
@@ -68,33 +62,18 @@ describe "class_table_inheritance plugin" do
68
62
  end
69
63
 
70
64
  it "should return rows with the correct class based on the polymorphic_key value" do
71
- def @ds.fetch_rows(sql)
72
- yield({:kind=>'Employee'})
73
- yield({:kind=>'Manager'})
74
- yield({:kind=>'Executive'})
75
- yield({:kind=>'Staff'})
76
- end
65
+ @ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Staff'}]
77
66
  Employee.all.collect{|x| x.class}.should == [Employee, Manager, Executive, Staff]
78
67
  end
79
68
 
80
69
  it "should return rows with the correct class based on the polymorphic_key value for subclasses" do
81
- ds = Manager.dataset
82
- def ds.fetch_rows(sql)
83
- yield({:kind=>'Manager'})
84
- yield({:kind=>'Executive'})
85
- end
70
+ Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}]
86
71
  Manager.all.collect{|x| x.class}.should == [Manager, Executive]
87
72
  end
88
73
 
89
74
  it "should return rows with the current class if cti_key is nil" do
90
75
  Employee.plugin(:class_table_inheritance)
91
- ds = Employee.dataset
92
- def ds.fetch_rows(sql)
93
- yield({:kind=>'Employee'})
94
- yield({:kind=>'Manager'})
95
- yield({:kind=>'Executive'})
96
- yield({:kind=>'Staff'})
97
- end
76
+ @ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Staff'}]
98
77
  Employee.all.collect{|x| x.class}.should == [Employee, Employee, Employee, Employee]
99
78
  end
100
79
 
@@ -102,35 +81,19 @@ describe "class_table_inheritance plugin" do
102
81
  Employee.plugin(:class_table_inheritance)
103
82
  Object.send(:remove_const, :Executive)
104
83
  Object.send(:remove_const, :Manager)
105
- class ::Manager < Employee
106
- end
107
- class ::Executive < Manager
108
- end
109
- ds = Manager.dataset
110
- def ds.fetch_rows(sql)
111
- yield({:kind=>'Manager'})
112
- yield({:kind=>'Executive'})
113
- end
84
+ class ::Manager < Employee; end
85
+ class ::Executive < Manager; end
86
+ Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}]
114
87
  Manager.all.collect{|x| x.class}.should == [Manager, Manager]
115
88
  end
116
89
 
117
90
  it "should fallback to the main class if the given class does not exist" do
118
- def @ds.fetch_rows(sql)
119
- yield({:kind=>'Employee'})
120
- yield({:kind=>'Manager'})
121
- yield({:kind=>'Blah'})
122
- yield({:kind=>'Staff'})
123
- end
91
+ @ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Blah'}, {:kind=>'Staff'}]
124
92
  Employee.all.collect{|x| x.class}.should == [Employee, Manager, Employee, Staff]
125
93
  end
126
94
 
127
95
  it "should fallback to the main class if the given class does not exist in subclasses" do
128
- ds = Manager.dataset
129
- def ds.fetch_rows(sql)
130
- yield({:kind=>'Manager'})
131
- yield({:kind=>'Executive'})
132
- yield({:kind=>'Blah'})
133
- end
96
+ Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Blah'}]
134
97
  Manager.all.collect{|x| x.class}.should == [Manager, Executive, Manager]
135
98
  end
136
99
 
@@ -167,19 +130,10 @@ describe "class_table_inheritance plugin" do
167
130
  end
168
131
 
169
132
  it "should lazily load attributes for columns in subclass tables" do
170
- ds = Manager.dataset
171
- def ds.fetch_rows(sql)
172
- @db << sql
173
- yield({:id=>1, :name=>'J', :kind=>'Executive', :num_staff=>2})
174
- end
133
+ Manager.instance_dataset._fetch = Manager.dataset._fetch = {:id=>1, :name=>'J', :kind=>'Executive', :num_staff=>2}
175
134
  m = Manager[1]
176
135
  @db.sqls.should == ['SELECT * FROM employees INNER JOIN managers USING (id) WHERE (id = 1) LIMIT 1']
177
- @db.reset
178
- ds = Executive.dataset
179
- def ds.fetch_rows(sql)
180
- @db << sql
181
- yield({:num_managers=>3})
182
- end
136
+ Executive.instance_dataset._fetch = Executive.dataset._fetch = {:num_managers=>3}
183
137
  m.num_managers.should == 3
184
138
  @db.sqls.should == ['SELECT num_managers FROM employees INNER JOIN managers USING (id) INNER JOIN executives USING (id) WHERE (id = 1) LIMIT 1']
185
139
  m.values.should == {:id=>1, :name=>'J', :kind=>'Executive', :num_staff=>2, :num_managers=>3}
@@ -210,20 +164,22 @@ describe "class_table_inheritance plugin" do
210
164
 
211
165
  it "should insert the correct rows into all tables when inserting" do
212
166
  Executive.create(:num_managers=>3, :num_staff=>2, :name=>'E')
213
- @db.sqls.length.should == 3
214
- @db.sqls[0].should =~ /INSERT INTO employees \((name|kind), (name|kind)\) VALUES \('(E|Executive)', '(E|Executive)'\)/
215
- @db.sqls[1].should =~ /INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \([12], [12]\)/
216
- @db.sqls[2].should =~ /INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([13], [13]\)/
167
+ sqls = @db.sqls
168
+ sqls.length.should == 3
169
+ sqls[0].should =~ /INSERT INTO employees \((name|kind), (name|kind)\) VALUES \('(E|Executive)', '(E|Executive)'\)/
170
+ sqls[1].should =~ /INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \([12], [12]\)/
171
+ sqls[2].should =~ /INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([13], [13]\)/
217
172
  end
218
173
 
219
174
  it "should insert the correct rows into all tables with a given primary key" do
220
175
  e = Executive.new(:num_managers=>3, :num_staff=>2, :name=>'E')
221
176
  e.id = 2
222
177
  e.save
223
- @db.sqls.length.should == 3
224
- @db.sqls[0].should =~ /INSERT INTO employees \((name|kind|id), (name|kind|id), (name|kind|id)\) VALUES \(('E'|'Executive'|2), ('E'|'Executive'|2), ('E'|'Executive'|2)\)/
225
- @db.sqls[1].should =~ /INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \(2, 2\)/
226
- @db.sqls[2].should =~ /INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([23], [23]\)/
178
+ sqls = @db.sqls
179
+ sqls.length.should == 3
180
+ sqls[0].should =~ /INSERT INTO employees \((name|kind|id), (name|kind|id), (name|kind|id)\) VALUES \(('E'|'Executive'|2), ('E'|'Executive'|2), ('E'|'Executive'|2)\)/
181
+ sqls[1].should =~ /INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \(2, 2\)/
182
+ sqls[2].should =~ /INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([23], [23]\)/
227
183
  end
228
184
 
229
185
  it "should update the correct rows in all tables when updating" do
@@ -232,21 +188,13 @@ describe "class_table_inheritance plugin" do
232
188
  end
233
189
 
234
190
  it "should handle many_to_one relationships correctly" do
235
- ds = Manager.dataset
236
- def ds.fetch_rows(sql)
237
- @db << sql
238
- yield({:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3})
239
- end
191
+ Manager.dataset._fetch = {:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3}
240
192
  Staff.load(:manager_id=>3).manager.should == Executive.load(:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3)
241
193
  @db.sqls.should == ['SELECT * FROM employees INNER JOIN managers USING (id) WHERE (managers.id = 3) LIMIT 1']
242
194
  end
243
195
 
244
196
  it "should handle one_to_many relationships correctly" do
245
- ds = Staff.dataset
246
- def ds.fetch_rows(sql)
247
- @db << sql
248
- yield({:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3})
249
- end
197
+ Staff.dataset._fetch = {:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3}
250
198
  Executive.load(:id=>3).staff_members.should == [Staff.load(:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3)]
251
199
  @db.sqls.should == ['SELECT * FROM employees INNER JOIN staff USING (id) WHERE (staff.manager_id = 3)']
252
200
  end
@@ -0,0 +1,91 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
+
3
+ describe "Sequel::Dataset.introspect_all_columns" do
4
+ before do
5
+ @db = MODEL_DB
6
+ @ds = @db[:a]
7
+ class Sequel::Dataset
8
+ # Handle case where introspect_all_columns has already been called
9
+ alias columns columns_without_introspection unless instance_methods(false).map{|x| x.to_s}.include?('columns')
10
+ end
11
+ Sequel::Dataset.introspect_all_columns
12
+ @db.reset
13
+ end
14
+ after do
15
+ class Sequel::Dataset
16
+ alias columns columns_without_introspection
17
+ end
18
+ end
19
+
20
+ specify "should turn on column introspection by default" do
21
+ @ds.select(:x).columns.should == [:x]
22
+ @db.sqls.length.should == 0
23
+ end
24
+ end
25
+
26
+ describe "columns_introspection extension" do
27
+ before do
28
+ @db = MODEL_DB
29
+ @ds = @db[:a]
30
+ @ds.extend(Sequel::ColumnsIntrospection.dup) # dup to allow multiple places in class hierarchy
31
+ @db.reset
32
+ end
33
+
34
+ specify "should not issue a database query if the columns are already loaded" do
35
+ @ds.instance_variable_set(:@columns, [:x])
36
+ @ds.columns.should == [:x]
37
+ @db.sqls.length.should == 0
38
+ end
39
+
40
+ specify "should handle plain symbols without a database query" do
41
+ @ds.select(:x).columns.should == [:x]
42
+ @db.sqls.length.should == 0
43
+ end
44
+
45
+ specify "should handle qualified symbols without a database query" do
46
+ @ds.select(:t__x).columns.should == [:x]
47
+ @db.sqls.length.should == 0
48
+ end
49
+
50
+ specify "should handle aliased symbols without a database query" do
51
+ @ds.select(:x___a).columns.should == [:a]
52
+ @db.sqls.length.should == 0
53
+ end
54
+
55
+ specify "should handle qualified and aliased symbols without a database query" do
56
+ @ds.select(:t__x___a).columns.should == [:a]
57
+ @db.sqls.length.should == 0
58
+ end
59
+
60
+ specify "should handle SQL::Identifiers " do
61
+ @ds.select(Sequel.identifier(:x)).columns.should == [:x]
62
+ @db.sqls.length.should == 0
63
+ end
64
+
65
+ specify "should handle SQL::QualifiedIdentifiers" do
66
+ @ds.select(Sequel.qualify(:t, :x)).columns.should == [:x]
67
+ @ds.select(Sequel.identifier(:x).qualify(:t)).columns.should == [:x]
68
+ @db.sqls.length.should == 0
69
+ end
70
+
71
+ specify "should handle SQL::AliasedExpressions" do
72
+ @ds.select(Sequel.as(:x, :a)).columns.should == [:a]
73
+ @ds.select(Sequel.as(:x, Sequel.identifier(:a))).columns.should == [:a]
74
+ @db.sqls.length.should == 0
75
+ end
76
+
77
+ specify "should issue a database query if the wildcard is selected" do
78
+ @ds.columns
79
+ @db.sqls.length.should == 1
80
+ end
81
+
82
+ specify "should issue a database query if an unsupported type is used" do
83
+ @ds.select(1).columns
84
+ @db.sqls.length.should == 1
85
+ end
86
+
87
+ specify "should not have column introspection on by default" do
88
+ @db[:a].select(:x).columns
89
+ @db.sqls.length.should == 1
90
+ end
91
+ end
@@ -48,9 +48,10 @@ describe "Composition plugin" do
48
48
  @c.composition :date, :composer=>proc{Date.new(year+1, month+2, day+3)}, :decomposer=>proc{[:year, :month, :day].each{|s| self.send("#{s}=", date.send(s) * 2)}}
49
49
  @o.date.should == Date.new(2, 4, 6)
50
50
  @o.save
51
- MODEL_DB.sqls.last.should include("year = 4")
52
- MODEL_DB.sqls.last.should include("month = 8")
53
- MODEL_DB.sqls.last.should include("day = 12")
51
+ sql = MODEL_DB.sqls.last
52
+ sql.should include("year = 4")
53
+ sql.should include("month = 8")
54
+ sql.should include("day = 12")
54
55
  end
55
56
 
56
57
  it "should allow call super in composition getter and setter method definition in class" do
@@ -139,8 +140,9 @@ describe "Composition plugin" do
139
140
  @o.date.month.should == 6
140
141
  @o.date = c.new(3, 4)
141
142
  @o.save
142
- MODEL_DB.sqls.last.should include("year = 6")
143
- MODEL_DB.sqls.last.should include("month = 12")
143
+ sql = MODEL_DB.sqls.last
144
+ sql.should include("year = 6")
145
+ sql.should include("month = 12")
144
146
  end
145
147
 
146
148
  it ":mapping option should work with an array of two pairs of symbols" do
@@ -160,8 +162,9 @@ describe "Composition plugin" do
160
162
  @o.date.m.should == 6
161
163
  @o.date = c.new(3, 4)
162
164
  @o.save
163
- MODEL_DB.sqls.last.should include("year = 6")
164
- MODEL_DB.sqls.last.should include("month = 12")
165
+ sql = MODEL_DB.sqls.last
166
+ sql.should include("year = 6")
167
+ sql.should include("month = 12")
165
168
  end
166
169
 
167
170
  it ":mapping option :composer should return nil if all values are nil" do
@@ -173,9 +176,10 @@ describe "Composition plugin" do
173
176
  @c.composition :date, :mapping=>[:year, :month, :day]
174
177
  @o.date = nil
175
178
  @o.save
176
- MODEL_DB.sqls.last.should include("year = NULL")
177
- MODEL_DB.sqls.last.should include("month = NULL")
178
- MODEL_DB.sqls.last.should include("day = NULL")
179
+ sql = MODEL_DB.sqls.last
180
+ sql.should include("year = NULL")
181
+ sql.should include("month = NULL")
182
+ sql.should include("day = NULL")
179
183
  end
180
184
 
181
185
  it "should work correctly with subclasses" do
@@ -184,8 +188,9 @@ describe "Composition plugin" do
184
188
  o = c.load(:id=>1, :year=>1, :month=>2, :day=>3)
185
189
  o.date.should == Date.new(1, 2, 3)
186
190
  o.save
187
- MODEL_DB.sqls.last.should include("year = 1")
188
- MODEL_DB.sqls.last.should include("month = 2")
189
- MODEL_DB.sqls.last.should include("day = 3")
191
+ sql = MODEL_DB.sqls.last
192
+ sql.should include("year = 1")
193
+ sql.should include("month = 2")
194
+ sql.should include("day = 3")
190
195
  end
191
196
  end