activerecord 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,32 +0,0 @@
1
- require 'test/unit'
2
- require "cases/helper"
3
- require 'active_support/core_ext/class/inheritable_attributes'
4
-
5
- class A
6
- include ClassInheritableAttributes
7
- end
8
-
9
- class B < A
10
- write_inheritable_array "first", [ :one, :two ]
11
- end
12
-
13
- class C < A
14
- write_inheritable_array "first", [ :three ]
15
- end
16
-
17
- class D < B
18
- write_inheritable_array "first", [ :four ]
19
- end
20
-
21
-
22
- class ClassInheritableAttributesTest < ActiveRecord::TestCase
23
- def test_first_level
24
- assert_equal [ :one, :two ], B.read_inheritable_attribute("first")
25
- assert_equal [ :three ], C.read_inheritable_attribute("first")
26
- end
27
-
28
- def test_second_level
29
- assert_equal [ :one, :two, :four ], D.read_inheritable_attribute("first")
30
- assert_equal [ :one, :two ], B.read_inheritable_attribute("first")
31
- end
32
- end
@@ -1,17 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
-
4
- class TestColumnAlias < ActiveRecord::TestCase
5
- fixtures :topics
6
-
7
- QUERY = if 'Oracle' == ActiveRecord::Base.connection.adapter_name
8
- 'SELECT id AS pk FROM topics WHERE ROWNUM < 2'
9
- else
10
- 'SELECT id AS pk FROM topics'
11
- end
12
-
13
- def test_column_alias
14
- records = Topic.connection.select_all(QUERY)
15
- assert_equal 'pk', records[0].keys[0]
16
- end
17
- end
@@ -1,70 +0,0 @@
1
- require "cases/helper"
2
-
3
- class ColumnDefinitionTest < ActiveRecord::TestCase
4
- def setup
5
- @adapter = ActiveRecord::ConnectionAdapters::AbstractAdapter.new(nil)
6
- def @adapter.native_database_types
7
- {:string => "varchar"}
8
- end
9
- end
10
-
11
- # Avoid column definitions in create table statements like:
12
- # `title` varchar(255) DEFAULT NULL
13
- def test_should_not_include_default_clause_when_default_is_null
14
- column = ActiveRecord::ConnectionAdapters::Column.new("title", nil, "varchar(20)")
15
- column_def = ActiveRecord::ConnectionAdapters::ColumnDefinition.new(
16
- @adapter, column.name, "string",
17
- column.limit, column.precision, column.scale, column.default, column.null)
18
- assert_equal "title varchar(20)", column_def.to_sql
19
- end
20
-
21
- def test_should_include_default_clause_when_default_is_present
22
- column = ActiveRecord::ConnectionAdapters::Column.new("title", "Hello", "varchar(20)")
23
- column_def = ActiveRecord::ConnectionAdapters::ColumnDefinition.new(
24
- @adapter, column.name, "string",
25
- column.limit, column.precision, column.scale, column.default, column.null)
26
- assert_equal %Q{title varchar(20) DEFAULT 'Hello'}, column_def.to_sql
27
- end
28
-
29
- def test_should_specify_not_null_if_null_option_is_false
30
- column = ActiveRecord::ConnectionAdapters::Column.new("title", "Hello", "varchar(20)", false)
31
- column_def = ActiveRecord::ConnectionAdapters::ColumnDefinition.new(
32
- @adapter, column.name, "string",
33
- column.limit, column.precision, column.scale, column.default, column.null)
34
- assert_equal %Q{title varchar(20) DEFAULT 'Hello' NOT NULL}, column_def.to_sql
35
- end
36
-
37
- if current_adapter?(:MysqlAdapter)
38
- def test_should_set_default_for_mysql_binary_data_types
39
- binary_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "a", "binary(1)")
40
- assert_equal "a", binary_column.default
41
-
42
- varbinary_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "a", "varbinary(1)")
43
- assert_equal "a", varbinary_column.default
44
- end
45
-
46
- def test_should_not_set_default_for_blob_and_text_data_types
47
- assert_raise ArgumentError do
48
- ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "a", "blob")
49
- end
50
-
51
- assert_raise ArgumentError do
52
- ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "Hello", "text")
53
- end
54
-
55
- text_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "text")
56
- assert_equal nil, text_column.default
57
-
58
- not_null_text_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "text", false)
59
- assert_equal "", not_null_text_column.default
60
- end
61
-
62
- def test_has_default_should_return_false_for_blog_and_test_data_types
63
- blob_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "blob")
64
- assert !blob_column.has_default?
65
-
66
- text_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "text")
67
- assert !text_column.has_default?
68
- end
69
- end
70
- end
@@ -1,25 +0,0 @@
1
- require "cases/helper"
2
-
3
- class ConnectionManagementTest < ActiveRecord::TestCase
4
- def setup
5
- @env = {}
6
- @app = stub('App')
7
- @management = ActiveRecord::ConnectionAdapters::ConnectionManagement.new(@app)
8
-
9
- @connections_cleared = false
10
- ActiveRecord::Base.stubs(:clear_active_connections!).with { @connections_cleared = true }
11
- end
12
-
13
- test "clears active connections after each call" do
14
- @app.expects(:call).with(@env)
15
- @management.call(@env)
16
- assert @connections_cleared
17
- end
18
-
19
- test "doesn't clear active connections when running in a test case" do
20
- @env['rack.test'] = true
21
- @app.expects(:call).with(@env)
22
- @management.call(@env)
23
- assert !@connections_cleared
24
- end
25
- end
@@ -1,8 +0,0 @@
1
- require "cases/helper"
2
-
3
- class FirebirdConnectionTest < ActiveRecord::TestCase
4
- def test_charset_properly_set
5
- fb_conn = ActiveRecord::Base.connection.instance_variable_get(:@connection)
6
- assert_equal 'UTF8', fb_conn.database.character_set
7
- end
8
- end
@@ -1,65 +0,0 @@
1
- require "cases/helper"
2
-
3
- class MysqlConnectionTest < ActiveRecord::TestCase
4
- def setup
5
- super
6
- @connection = ActiveRecord::Base.connection
7
- end
8
-
9
- def test_mysql_reconnect_attribute_after_connection_with_reconnect_true
10
- run_without_connection do |orig_connection|
11
- ActiveRecord::Base.establish_connection(orig_connection.merge({:reconnect => true}))
12
- assert ActiveRecord::Base.connection.raw_connection.reconnect
13
- end
14
- end
15
-
16
- def test_mysql_reconnect_attribute_after_connection_with_reconnect_false
17
- run_without_connection do |orig_connection|
18
- ActiveRecord::Base.establish_connection(orig_connection.merge({:reconnect => false}))
19
- assert !ActiveRecord::Base.connection.raw_connection.reconnect
20
- end
21
- end
22
-
23
- def test_no_automatic_reconnection_after_timeout
24
- assert @connection.active?
25
- @connection.update('set @@wait_timeout=1')
26
- sleep 2
27
- assert !@connection.active?
28
- end
29
-
30
- def test_successful_reconnection_after_timeout_with_manual_reconnect
31
- assert @connection.active?
32
- @connection.update('set @@wait_timeout=1')
33
- sleep 2
34
- @connection.reconnect!
35
- assert @connection.active?
36
- end
37
-
38
- def test_successful_reconnection_after_timeout_with_verify
39
- assert @connection.active?
40
- @connection.update('set @@wait_timeout=1')
41
- sleep 2
42
- @connection.verify!
43
- assert @connection.active?
44
- end
45
-
46
- # Test that MySQL allows multiple results for stored procedures
47
- if Mysql.const_defined?(:CLIENT_MULTI_RESULTS)
48
- def test_multi_results
49
- rows = ActiveRecord::Base.connection.select_rows('CALL ten();')
50
- assert_equal 10, rows[0][0].to_i, "ten() did not return 10 as expected: #{rows.inspect}"
51
- assert @connection.active?, "Bad connection use by 'MysqlAdapter.select_rows'"
52
- end
53
- end
54
-
55
- private
56
-
57
- def run_without_connection
58
- original_connection = ActiveRecord::Base.remove_connection
59
- begin
60
- yield original_connection
61
- ensure
62
- ActiveRecord::Base.establish_connection(original_connection)
63
- end
64
- end
65
- end
@@ -1,80 +0,0 @@
1
- require "cases/helper"
2
-
3
- class CopyTableTest < ActiveRecord::TestCase
4
- fixtures :companies, :comments
5
-
6
- def setup
7
- @connection = ActiveRecord::Base.connection
8
- class << @connection
9
- public :copy_table, :table_structure, :indexes
10
- end
11
- end
12
-
13
- def test_copy_table(from = 'customers', to = 'customers2', options = {})
14
- assert_nothing_raised {copy_table(from, to, options)}
15
- assert_equal row_count(from), row_count(to)
16
-
17
- if block_given?
18
- yield from, to, options
19
- else
20
- assert_equal column_names(from), column_names(to)
21
- end
22
-
23
- @connection.drop_table(to) rescue nil
24
- end
25
-
26
- def test_copy_table_renaming_column
27
- test_copy_table('customers', 'customers2',
28
- :rename => {'name' => 'person_name'}) do |from, to, options|
29
- expected = column_values(from, 'name')
30
- assert expected.any?, 'only nils in resultset; real values are needed'
31
- assert_equal expected, column_values(to, 'person_name')
32
- end
33
- end
34
-
35
- def test_copy_table_with_index
36
- test_copy_table('comments', 'comments_with_index') do
37
- @connection.add_index('comments_with_index', ['post_id', 'type'])
38
- test_copy_table('comments_with_index', 'comments_with_index2') do
39
- assert_equal table_indexes_without_name('comments_with_index'),
40
- table_indexes_without_name('comments_with_index2')
41
- end
42
- end
43
- end
44
-
45
- def test_copy_table_without_primary_key
46
- test_copy_table('developers_projects', 'programmers_projects')
47
- end
48
-
49
- def test_copy_table_with_id_col_that_is_not_primary_key
50
- test_copy_table('goofy_string_id', 'goofy_string_id2') do |from, to, options|
51
- original_id = @connection.columns('goofy_string_id').detect{|col| col.name == 'id' }
52
- copied_id = @connection.columns('goofy_string_id2').detect{|col| col.name == 'id' }
53
- assert_equal original_id.type, copied_id.type
54
- assert_equal original_id.sql_type, copied_id.sql_type
55
- assert_equal original_id.limit, copied_id.limit
56
- assert_equal original_id.primary, copied_id.primary
57
- end
58
- end
59
-
60
- protected
61
- def copy_table(from, to, options = {})
62
- @connection.copy_table(from, to, {:temporary => true}.merge(options))
63
- end
64
-
65
- def column_names(table)
66
- @connection.table_structure(table).map {|column| column['name']}
67
- end
68
-
69
- def column_values(table, column)
70
- @connection.select_all("SELECT #{column} FROM #{table} ORDER BY id").map {|row| row[column]}
71
- end
72
-
73
- def table_indexes_without_name(table)
74
- @connection.indexes('comments_with_index').delete(:name)
75
- end
76
-
77
- def row_count(table)
78
- @connection.select_one("SELECT COUNT(*) AS count FROM #{table}")['count']
79
- end
80
- end
@@ -1,84 +0,0 @@
1
- require 'cases/helper'
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/category'
5
- require 'models/categorization'
6
-
7
- class CounterCacheTest < ActiveRecord::TestCase
8
- fixtures :topics, :categories, :categorizations
9
-
10
- class SpecialTopic < ::Topic
11
- has_many :special_replies, :foreign_key => 'parent_id'
12
- end
13
-
14
- class SpecialReply < ::Reply
15
- belongs_to :special_topic, :foreign_key => 'parent_id', :counter_cache => 'replies_count'
16
- end
17
-
18
- test "increment counter" do
19
- topic = Topic.find(1)
20
- assert_difference 'topic.reload.replies_count' do
21
- Topic.increment_counter(:replies_count, topic.id)
22
- end
23
- end
24
-
25
- test "decrement counter" do
26
- topic = Topic.find(1)
27
- assert_difference 'topic.reload.replies_count', -1 do
28
- Topic.decrement_counter(:replies_count, topic.id)
29
- end
30
- end
31
-
32
- test "reset counters" do
33
- topic = Topic.find(1)
34
- # throw the count off by 1
35
- Topic.increment_counter(:replies_count, topic.id)
36
-
37
- # check that it gets reset
38
- assert_difference 'topic.reload.replies_count', -1 do
39
- Topic.reset_counters(topic.id, :replies)
40
- end
41
- end
42
-
43
- test "reset counters with string argument" do
44
- topic = Topic.find(1)
45
- Topic.increment_counter('replies_count', topic.id)
46
-
47
- assert_difference 'topic.reload.replies_count', -1 do
48
- Topic.reset_counters(topic.id, 'replies')
49
- end
50
- end
51
-
52
- test "reset counters with modularized and camelized classnames" do
53
- special = SpecialTopic.create!(:title => 'Special')
54
- SpecialTopic.increment_counter(:replies_count, special.id)
55
-
56
- assert_difference 'special.reload.replies_count', -1 do
57
- SpecialTopic.reset_counters(special.id, :special_replies)
58
- end
59
- end
60
-
61
- test "update counter with initial null value" do
62
- category = categories(:general)
63
- assert_equal 2, category.categorizations.count
64
- assert_nil category.categorizations_count
65
-
66
- Category.update_counters(category.id, :categorizations_count => category.categorizations.count)
67
- assert_equal 2, category.reload.categorizations_count
68
- end
69
-
70
- test "update counter for decrement" do
71
- topic = Topic.find(1)
72
- assert_difference 'topic.reload.replies_count', -3 do
73
- Topic.update_counters(topic.id, :replies_count => -3)
74
- end
75
- end
76
-
77
- test "update counters of multiple records" do
78
- t1, t2 = topics(:first, :second)
79
-
80
- assert_difference ['t1.reload.replies_count', 't2.reload.replies_count'], 2 do
81
- Topic.update_counters([t1.id, t2.id], :replies_count => 2)
82
- end
83
- end
84
- end
@@ -1,12 +0,0 @@
1
- require "cases/helper"
2
-
3
- class DatabaseStatementsTest < ActiveRecord::TestCase
4
- def setup
5
- @connection = ActiveRecord::Base.connection
6
- end
7
-
8
- def test_insert_should_return_the_inserted_id
9
- id = @connection.insert("INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)")
10
- assert_not_nil id
11
- end
12
- end
@@ -1,204 +0,0 @@
1
- require "cases/helper"
2
-
3
- class PostgresqlArray < ActiveRecord::Base
4
- end
5
-
6
- class PostgresqlMoney < ActiveRecord::Base
7
- end
8
-
9
- class PostgresqlNumber < ActiveRecord::Base
10
- end
11
-
12
- class PostgresqlTime < ActiveRecord::Base
13
- end
14
-
15
- class PostgresqlNetworkAddress < ActiveRecord::Base
16
- end
17
-
18
- class PostgresqlBitString < ActiveRecord::Base
19
- end
20
-
21
- class PostgresqlOid < ActiveRecord::Base
22
- end
23
-
24
- class PostgresqlDataTypeTest < ActiveRecord::TestCase
25
- self.use_transactional_fixtures = false
26
-
27
- def setup
28
- @connection = ActiveRecord::Base.connection
29
- @connection.execute("set lc_monetary = 'C'")
30
-
31
- @connection.execute("INSERT INTO postgresql_arrays (commission_by_quarter, nicknames) VALUES ( '{35000,21000,18000,17000}', '{foo,bar,baz}' )")
32
- @first_array = PostgresqlArray.find(1)
33
-
34
- @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('567.89'::money)")
35
- @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('-567.89'::money)")
36
- @first_money = PostgresqlMoney.find(1)
37
- @second_money = PostgresqlMoney.find(2)
38
-
39
- @connection.execute("INSERT INTO postgresql_numbers (single, double) VALUES (123.456, 123456.789)")
40
- @first_number = PostgresqlNumber.find(1)
41
-
42
- @connection.execute("INSERT INTO postgresql_times (time_interval) VALUES ('1 year 2 days ago')")
43
- @first_time = PostgresqlTime.find(1)
44
-
45
- @connection.execute("INSERT INTO postgresql_network_addresses (cidr_address, inet_address, mac_address) VALUES('192.168.0/24', '172.16.1.254/32', '01:23:45:67:89:0a')")
46
- @first_network_address = PostgresqlNetworkAddress.find(1)
47
-
48
- @connection.execute("INSERT INTO postgresql_bit_strings (bit_string, bit_string_varying) VALUES (B'00010101', X'15')")
49
- @first_bit_string = PostgresqlBitString.find(1)
50
-
51
- @connection.execute("INSERT INTO postgresql_oids (obj_id) VALUES (1234)")
52
- @first_oid = PostgresqlOid.find(1)
53
- end
54
-
55
- def test_data_type_of_array_types
56
- assert_equal :string, @first_array.column_for_attribute(:commission_by_quarter).type
57
- assert_equal :string, @first_array.column_for_attribute(:nicknames).type
58
- end
59
-
60
- def test_data_type_of_money_types
61
- assert_equal :decimal, @first_money.column_for_attribute(:wealth).type
62
- end
63
-
64
- def test_data_type_of_number_types
65
- assert_equal :float, @first_number.column_for_attribute(:single).type
66
- assert_equal :float, @first_number.column_for_attribute(:double).type
67
- end
68
-
69
- def test_data_type_of_time_types
70
- assert_equal :string, @first_time.column_for_attribute(:time_interval).type
71
- end
72
-
73
- def test_data_type_of_network_address_types
74
- assert_equal :string, @first_network_address.column_for_attribute(:cidr_address).type
75
- assert_equal :string, @first_network_address.column_for_attribute(:inet_address).type
76
- assert_equal :string, @first_network_address.column_for_attribute(:mac_address).type
77
- end
78
-
79
- def test_data_type_of_bit_string_types
80
- assert_equal :string, @first_bit_string.column_for_attribute(:bit_string).type
81
- assert_equal :string, @first_bit_string.column_for_attribute(:bit_string_varying).type
82
- end
83
-
84
- def test_data_type_of_oid_types
85
- assert_equal :integer, @first_oid.column_for_attribute(:obj_id).type
86
- end
87
-
88
- def test_array_values
89
- assert_equal '{35000,21000,18000,17000}', @first_array.commission_by_quarter
90
- assert_equal '{foo,bar,baz}', @first_array.nicknames
91
- end
92
-
93
- def test_money_values
94
- assert_equal 567.89, @first_money.wealth
95
- assert_equal -567.89, @second_money.wealth
96
- end
97
-
98
- def test_number_values
99
- assert_equal 123.456, @first_number.single
100
- assert_equal 123456.789, @first_number.double
101
- end
102
-
103
- def test_time_values
104
- assert_equal '-1 years -2 days', @first_time.time_interval
105
- end
106
-
107
- def test_network_address_values
108
- assert_equal '192.168.0.0/24', @first_network_address.cidr_address
109
- assert_equal '172.16.1.254', @first_network_address.inet_address
110
- assert_equal '01:23:45:67:89:0a', @first_network_address.mac_address
111
- end
112
-
113
- def test_bit_string_values
114
- assert_equal '00010101', @first_bit_string.bit_string
115
- assert_equal '00010101', @first_bit_string.bit_string_varying
116
- end
117
-
118
- def test_oid_values
119
- assert_equal 1234, @first_oid.obj_id
120
- end
121
-
122
- def test_update_integer_array
123
- new_value = '{32800,95000,29350,17000}'
124
- assert @first_array.commission_by_quarter = new_value
125
- assert @first_array.save
126
- assert @first_array.reload
127
- assert_equal @first_array.commission_by_quarter, new_value
128
- assert @first_array.commission_by_quarter = new_value
129
- assert @first_array.save
130
- assert @first_array.reload
131
- assert_equal @first_array.commission_by_quarter, new_value
132
- end
133
-
134
- def test_update_text_array
135
- new_value = '{robby,robert,rob,robbie}'
136
- assert @first_array.nicknames = new_value
137
- assert @first_array.save
138
- assert @first_array.reload
139
- assert_equal @first_array.nicknames, new_value
140
- assert @first_array.nicknames = new_value
141
- assert @first_array.save
142
- assert @first_array.reload
143
- assert_equal @first_array.nicknames, new_value
144
- end
145
-
146
- def test_update_money
147
- new_value = BigDecimal.new('123.45')
148
- assert @first_money.wealth = new_value
149
- assert @first_money.save
150
- assert @first_money.reload
151
- assert_equal new_value, @first_money.wealth
152
- end
153
-
154
- def test_update_number
155
- new_single = 789.012
156
- new_double = 789012.345
157
- assert @first_number.single = new_single
158
- assert @first_number.double = new_double
159
- assert @first_number.save
160
- assert @first_number.reload
161
- assert_equal @first_number.single, new_single
162
- assert_equal @first_number.double, new_double
163
- end
164
-
165
- def test_update_time
166
- assert @first_time.time_interval = '2 years 3 minutes'
167
- assert @first_time.save
168
- assert @first_time.reload
169
- assert_equal @first_time.time_interval, '2 years 00:03:00'
170
- end
171
-
172
- def test_update_network_address
173
- new_cidr_address = '10.1.2.3/32'
174
- new_inet_address = '10.0.0.0/8'
175
- new_mac_address = 'bc:de:f0:12:34:56'
176
- assert @first_network_address.cidr_address = new_cidr_address
177
- assert @first_network_address.inet_address = new_inet_address
178
- assert @first_network_address.mac_address = new_mac_address
179
- assert @first_network_address.save
180
- assert @first_network_address.reload
181
- assert_equal @first_network_address.cidr_address, new_cidr_address
182
- assert_equal @first_network_address.inet_address, new_inet_address
183
- assert_equal @first_network_address.mac_address, new_mac_address
184
- end
185
-
186
- def test_update_bit_string
187
- new_bit_string = '11111111'
188
- new_bit_string_varying = 'FF'
189
- assert @first_bit_string.bit_string = new_bit_string
190
- assert @first_bit_string.bit_string_varying = new_bit_string_varying
191
- assert @first_bit_string.save
192
- assert @first_bit_string.reload
193
- assert_equal @first_bit_string.bit_string, new_bit_string
194
- assert_equal @first_bit_string.bit_string, @first_bit_string.bit_string_varying
195
- end
196
-
197
- def test_update_oid
198
- new_value = 567890
199
- assert @first_oid.obj_id = new_value
200
- assert @first_oid.save
201
- assert @first_oid.reload
202
- assert_equal @first_oid.obj_id, new_value
203
- end
204
- end