activerecord 2.3.18 → 3.2.22

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 (454) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1014 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +222 -0
  5. data/examples/performance.rb +100 -126
  6. data/examples/simple.rb +14 -0
  7. data/lib/active_record/aggregations.rb +93 -99
  8. data/lib/active_record/associations/alias_tracker.rb +76 -0
  9. data/lib/active_record/associations/association.rb +247 -0
  10. data/lib/active_record/associations/association_scope.rb +134 -0
  11. data/lib/active_record/associations/belongs_to_association.rb +54 -61
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
  13. data/lib/active_record/associations/builder/association.rb +55 -0
  14. data/lib/active_record/associations/builder/belongs_to.rb +88 -0
  15. data/lib/active_record/associations/builder/collection_association.rb +75 -0
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
  17. data/lib/active_record/associations/builder/has_many.rb +71 -0
  18. data/lib/active_record/associations/builder/has_one.rb +62 -0
  19. data/lib/active_record/associations/builder/singular_association.rb +32 -0
  20. data/lib/active_record/associations/collection_association.rb +580 -0
  21. data/lib/active_record/associations/collection_proxy.rb +133 -0
  22. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
  23. data/lib/active_record/associations/has_many_association.rb +60 -79
  24. data/lib/active_record/associations/has_many_through_association.rb +127 -206
  25. data/lib/active_record/associations/has_one_association.rb +55 -114
  26. data/lib/active_record/associations/has_one_through_association.rb +25 -26
  27. data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
  28. data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
  29. data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
  30. data/lib/active_record/associations/join_dependency.rb +214 -0
  31. data/lib/active_record/associations/join_helper.rb +55 -0
  32. data/lib/active_record/associations/preloader/association.rb +125 -0
  33. data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
  34. data/lib/active_record/associations/preloader/collection_association.rb +24 -0
  35. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
  36. data/lib/active_record/associations/preloader/has_many.rb +17 -0
  37. data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
  38. data/lib/active_record/associations/preloader/has_one.rb +23 -0
  39. data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
  40. data/lib/active_record/associations/preloader/singular_association.rb +21 -0
  41. data/lib/active_record/associations/preloader/through_association.rb +67 -0
  42. data/lib/active_record/associations/preloader.rb +181 -0
  43. data/lib/active_record/associations/singular_association.rb +64 -0
  44. data/lib/active_record/associations/through_association.rb +87 -0
  45. data/lib/active_record/associations.rb +693 -1337
  46. data/lib/active_record/attribute_assignment.rb +221 -0
  47. data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
  48. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
  49. data/lib/active_record/attribute_methods/dirty.rb +111 -0
  50. data/lib/active_record/attribute_methods/primary_key.rb +114 -0
  51. data/lib/active_record/attribute_methods/query.rb +39 -0
  52. data/lib/active_record/attribute_methods/read.rb +136 -0
  53. data/lib/active_record/attribute_methods/serialization.rb +120 -0
  54. data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
  55. data/lib/active_record/attribute_methods/write.rb +70 -0
  56. data/lib/active_record/attribute_methods.rb +211 -339
  57. data/lib/active_record/autosave_association.rb +179 -149
  58. data/lib/active_record/base.rb +401 -2907
  59. data/lib/active_record/callbacks.rb +91 -176
  60. data/lib/active_record/coders/yaml_column.rb +41 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
  62. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
  68. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
  69. data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
  70. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
  71. data/lib/active_record/connection_adapters/column.rb +296 -0
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
  73. data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
  75. data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
  76. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
  77. data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
  78. data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
  79. data/lib/active_record/counter_cache.rb +123 -0
  80. data/lib/active_record/dynamic_finder_match.rb +41 -14
  81. data/lib/active_record/dynamic_matchers.rb +84 -0
  82. data/lib/active_record/dynamic_scope_match.rb +13 -15
  83. data/lib/active_record/errors.rb +195 -0
  84. data/lib/active_record/explain.rb +86 -0
  85. data/lib/active_record/explain_subscriber.rb +25 -0
  86. data/lib/active_record/fixtures/file.rb +65 -0
  87. data/lib/active_record/fixtures.rb +695 -770
  88. data/lib/active_record/identity_map.rb +162 -0
  89. data/lib/active_record/inheritance.rb +174 -0
  90. data/lib/active_record/integration.rb +60 -0
  91. data/lib/active_record/locale/en.yml +9 -27
  92. data/lib/active_record/locking/optimistic.rb +76 -73
  93. data/lib/active_record/locking/pessimistic.rb +32 -10
  94. data/lib/active_record/log_subscriber.rb +72 -0
  95. data/lib/active_record/migration/command_recorder.rb +105 -0
  96. data/lib/active_record/migration.rb +415 -205
  97. data/lib/active_record/model_schema.rb +368 -0
  98. data/lib/active_record/nested_attributes.rb +153 -63
  99. data/lib/active_record/observer.rb +27 -103
  100. data/lib/active_record/persistence.rb +376 -0
  101. data/lib/active_record/query_cache.rb +49 -8
  102. data/lib/active_record/querying.rb +58 -0
  103. data/lib/active_record/railtie.rb +131 -0
  104. data/lib/active_record/railties/console_sandbox.rb +6 -0
  105. data/lib/active_record/railties/controller_runtime.rb +49 -0
  106. data/lib/active_record/railties/databases.rake +659 -0
  107. data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
  108. data/lib/active_record/readonly_attributes.rb +26 -0
  109. data/lib/active_record/reflection.rb +269 -120
  110. data/lib/active_record/relation/batches.rb +90 -0
  111. data/lib/active_record/relation/calculations.rb +372 -0
  112. data/lib/active_record/relation/delegation.rb +49 -0
  113. data/lib/active_record/relation/finder_methods.rb +402 -0
  114. data/lib/active_record/relation/predicate_builder.rb +63 -0
  115. data/lib/active_record/relation/query_methods.rb +417 -0
  116. data/lib/active_record/relation/spawn_methods.rb +180 -0
  117. data/lib/active_record/relation.rb +537 -0
  118. data/lib/active_record/result.rb +40 -0
  119. data/lib/active_record/sanitization.rb +194 -0
  120. data/lib/active_record/schema.rb +9 -6
  121. data/lib/active_record/schema_dumper.rb +55 -32
  122. data/lib/active_record/scoping/default.rb +142 -0
  123. data/lib/active_record/scoping/named.rb +200 -0
  124. data/lib/active_record/scoping.rb +152 -0
  125. data/lib/active_record/serialization.rb +8 -91
  126. data/lib/active_record/serializers/xml_serializer.rb +43 -197
  127. data/lib/active_record/session_store.rb +129 -103
  128. data/lib/active_record/store.rb +52 -0
  129. data/lib/active_record/test_case.rb +30 -23
  130. data/lib/active_record/timestamp.rb +95 -52
  131. data/lib/active_record/transactions.rb +212 -66
  132. data/lib/active_record/translation.rb +22 -0
  133. data/lib/active_record/validations/associated.rb +43 -0
  134. data/lib/active_record/validations/uniqueness.rb +180 -0
  135. data/lib/active_record/validations.rb +43 -1106
  136. data/lib/active_record/version.rb +5 -4
  137. data/lib/active_record.rb +121 -48
  138. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  139. data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
  140. data/lib/rails/generators/active_record/migration.rb +15 -0
  141. data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
  142. data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
  143. data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
  144. data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
  145. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  146. data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
  147. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
  148. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
  149. data/lib/rails/generators/active_record.rb +25 -0
  150. metadata +187 -363
  151. data/CHANGELOG +0 -5904
  152. data/README +0 -351
  153. data/RUNNING_UNIT_TESTS +0 -36
  154. data/Rakefile +0 -268
  155. data/install.rb +0 -30
  156. data/lib/active_record/association_preload.rb +0 -406
  157. data/lib/active_record/associations/association_collection.rb +0 -533
  158. data/lib/active_record/associations/association_proxy.rb +0 -288
  159. data/lib/active_record/batches.rb +0 -85
  160. data/lib/active_record/calculations.rb +0 -321
  161. data/lib/active_record/dirty.rb +0 -183
  162. data/lib/active_record/named_scope.rb +0 -197
  163. data/lib/active_record/serializers/json_serializer.rb +0 -91
  164. data/lib/activerecord.rb +0 -2
  165. data/test/assets/example.log +0 -1
  166. data/test/assets/flowers.jpg +0 -0
  167. data/test/cases/aaa_create_tables_test.rb +0 -24
  168. data/test/cases/active_schema_test_mysql.rb +0 -122
  169. data/test/cases/active_schema_test_postgresql.rb +0 -24
  170. data/test/cases/adapter_test.rb +0 -144
  171. data/test/cases/aggregations_test.rb +0 -167
  172. data/test/cases/ar_schema_test.rb +0 -32
  173. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  174. data/test/cases/associations/callbacks_test.rb +0 -161
  175. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  176. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  177. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  178. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  179. data/test/cases/associations/eager_singularization_test.rb +0 -145
  180. data/test/cases/associations/eager_test.rb +0 -852
  181. data/test/cases/associations/extension_test.rb +0 -62
  182. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  183. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  184. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  185. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  186. data/test/cases/associations/has_one_associations_test.rb +0 -330
  187. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  188. data/test/cases/associations/inner_join_association_test.rb +0 -93
  189. data/test/cases/associations/inverse_associations_test.rb +0 -566
  190. data/test/cases/associations/join_model_test.rb +0 -712
  191. data/test/cases/associations_test.rb +0 -282
  192. data/test/cases/attribute_methods_test.rb +0 -305
  193. data/test/cases/autosave_association_test.rb +0 -1218
  194. data/test/cases/base_test.rb +0 -2166
  195. data/test/cases/batches_test.rb +0 -81
  196. data/test/cases/binary_test.rb +0 -30
  197. data/test/cases/calculations_test.rb +0 -360
  198. data/test/cases/callbacks_observers_test.rb +0 -38
  199. data/test/cases/callbacks_test.rb +0 -438
  200. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  201. data/test/cases/column_alias_test.rb +0 -17
  202. data/test/cases/column_definition_test.rb +0 -70
  203. data/test/cases/connection_pool_test.rb +0 -25
  204. data/test/cases/connection_test_firebird.rb +0 -8
  205. data/test/cases/connection_test_mysql.rb +0 -65
  206. data/test/cases/copy_table_test_sqlite.rb +0 -80
  207. data/test/cases/counter_cache_test.rb +0 -84
  208. data/test/cases/database_statements_test.rb +0 -12
  209. data/test/cases/datatype_test_postgresql.rb +0 -204
  210. data/test/cases/date_time_test.rb +0 -37
  211. data/test/cases/default_test_firebird.rb +0 -16
  212. data/test/cases/defaults_test.rb +0 -111
  213. data/test/cases/deprecated_finder_test.rb +0 -30
  214. data/test/cases/dirty_test.rb +0 -316
  215. data/test/cases/finder_respond_to_test.rb +0 -76
  216. data/test/cases/finder_test.rb +0 -1098
  217. data/test/cases/fixtures_test.rb +0 -661
  218. data/test/cases/helper.rb +0 -68
  219. data/test/cases/i18n_test.rb +0 -46
  220. data/test/cases/inheritance_test.rb +0 -262
  221. data/test/cases/invalid_date_test.rb +0 -24
  222. data/test/cases/json_serialization_test.rb +0 -219
  223. data/test/cases/lifecycle_test.rb +0 -193
  224. data/test/cases/locking_test.rb +0 -350
  225. data/test/cases/method_scoping_test.rb +0 -704
  226. data/test/cases/migration_test.rb +0 -1649
  227. data/test/cases/migration_test_firebird.rb +0 -124
  228. data/test/cases/mixin_test.rb +0 -96
  229. data/test/cases/modules_test.rb +0 -109
  230. data/test/cases/multiple_db_test.rb +0 -85
  231. data/test/cases/named_scope_test.rb +0 -372
  232. data/test/cases/nested_attributes_test.rb +0 -840
  233. data/test/cases/pk_test.rb +0 -119
  234. data/test/cases/pooled_connections_test.rb +0 -103
  235. data/test/cases/query_cache_test.rb +0 -129
  236. data/test/cases/readonly_test.rb +0 -107
  237. data/test/cases/reflection_test.rb +0 -234
  238. data/test/cases/reload_models_test.rb +0 -22
  239. data/test/cases/repair_helper.rb +0 -50
  240. data/test/cases/reserved_word_test_mysql.rb +0 -176
  241. data/test/cases/sanitize_test.rb +0 -25
  242. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  243. data/test/cases/schema_dumper_test.rb +0 -211
  244. data/test/cases/schema_test_postgresql.rb +0 -178
  245. data/test/cases/serialization_test.rb +0 -47
  246. data/test/cases/sp_test_mysql.rb +0 -16
  247. data/test/cases/synonym_test_oracle.rb +0 -17
  248. data/test/cases/timestamp_test.rb +0 -75
  249. data/test/cases/transactions_test.rb +0 -543
  250. data/test/cases/unconnected_test.rb +0 -32
  251. data/test/cases/validations_i18n_test.rb +0 -925
  252. data/test/cases/validations_test.rb +0 -1684
  253. data/test/cases/xml_serialization_test.rb +0 -240
  254. data/test/cases/yaml_serialization_test.rb +0 -11
  255. data/test/config.rb +0 -5
  256. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  257. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  258. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  259. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  260. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  261. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  262. data/test/connections/native_db2/connection.rb +0 -25
  263. data/test/connections/native_firebird/connection.rb +0 -26
  264. data/test/connections/native_frontbase/connection.rb +0 -27
  265. data/test/connections/native_mysql/connection.rb +0 -25
  266. data/test/connections/native_openbase/connection.rb +0 -21
  267. data/test/connections/native_oracle/connection.rb +0 -27
  268. data/test/connections/native_postgresql/connection.rb +0 -21
  269. data/test/connections/native_sqlite/connection.rb +0 -25
  270. data/test/connections/native_sqlite3/connection.rb +0 -25
  271. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  272. data/test/connections/native_sybase/connection.rb +0 -23
  273. data/test/fixtures/accounts.yml +0 -29
  274. data/test/fixtures/all/developers.yml +0 -0
  275. data/test/fixtures/all/people.csv +0 -0
  276. data/test/fixtures/all/tasks.yml +0 -0
  277. data/test/fixtures/author_addresses.yml +0 -5
  278. data/test/fixtures/author_favorites.yml +0 -4
  279. data/test/fixtures/authors.yml +0 -9
  280. data/test/fixtures/binaries.yml +0 -132
  281. data/test/fixtures/books.yml +0 -7
  282. data/test/fixtures/categories/special_categories.yml +0 -9
  283. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  284. data/test/fixtures/categories.yml +0 -14
  285. data/test/fixtures/categories_ordered.yml +0 -7
  286. data/test/fixtures/categories_posts.yml +0 -23
  287. data/test/fixtures/categorizations.yml +0 -17
  288. data/test/fixtures/clubs.yml +0 -6
  289. data/test/fixtures/comments.yml +0 -59
  290. data/test/fixtures/companies.yml +0 -56
  291. data/test/fixtures/computers.yml +0 -4
  292. data/test/fixtures/courses.yml +0 -7
  293. data/test/fixtures/customers.yml +0 -26
  294. data/test/fixtures/developers.yml +0 -21
  295. data/test/fixtures/developers_projects.yml +0 -17
  296. data/test/fixtures/edges.yml +0 -6
  297. data/test/fixtures/entrants.yml +0 -14
  298. data/test/fixtures/faces.yml +0 -11
  299. data/test/fixtures/fk_test_has_fk.yml +0 -3
  300. data/test/fixtures/fk_test_has_pk.yml +0 -2
  301. data/test/fixtures/funny_jokes.yml +0 -10
  302. data/test/fixtures/interests.yml +0 -33
  303. data/test/fixtures/items.yml +0 -4
  304. data/test/fixtures/jobs.yml +0 -7
  305. data/test/fixtures/legacy_things.yml +0 -3
  306. data/test/fixtures/mateys.yml +0 -4
  307. data/test/fixtures/member_types.yml +0 -6
  308. data/test/fixtures/members.yml +0 -6
  309. data/test/fixtures/memberships.yml +0 -20
  310. data/test/fixtures/men.yml +0 -5
  311. data/test/fixtures/minimalistics.yml +0 -2
  312. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  313. data/test/fixtures/mixins.yml +0 -29
  314. data/test/fixtures/movies.yml +0 -7
  315. data/test/fixtures/naked/csv/accounts.csv +0 -1
  316. data/test/fixtures/naked/yml/accounts.yml +0 -1
  317. data/test/fixtures/naked/yml/companies.yml +0 -1
  318. data/test/fixtures/naked/yml/courses.yml +0 -1
  319. data/test/fixtures/organizations.yml +0 -5
  320. data/test/fixtures/owners.yml +0 -7
  321. data/test/fixtures/parrots.yml +0 -27
  322. data/test/fixtures/parrots_pirates.yml +0 -7
  323. data/test/fixtures/people.yml +0 -15
  324. data/test/fixtures/pets.yml +0 -14
  325. data/test/fixtures/pirates.yml +0 -9
  326. data/test/fixtures/polymorphic_designs.yml +0 -19
  327. data/test/fixtures/polymorphic_prices.yml +0 -19
  328. data/test/fixtures/posts.yml +0 -52
  329. data/test/fixtures/price_estimates.yml +0 -7
  330. data/test/fixtures/projects.yml +0 -7
  331. data/test/fixtures/readers.yml +0 -9
  332. data/test/fixtures/references.yml +0 -17
  333. data/test/fixtures/reserved_words/distinct.yml +0 -5
  334. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  335. data/test/fixtures/reserved_words/group.yml +0 -14
  336. data/test/fixtures/reserved_words/select.yml +0 -8
  337. data/test/fixtures/reserved_words/values.yml +0 -7
  338. data/test/fixtures/ships.yml +0 -5
  339. data/test/fixtures/sponsors.yml +0 -9
  340. data/test/fixtures/subscribers.yml +0 -7
  341. data/test/fixtures/subscriptions.yml +0 -12
  342. data/test/fixtures/taggings.yml +0 -28
  343. data/test/fixtures/tags.yml +0 -7
  344. data/test/fixtures/tasks.yml +0 -7
  345. data/test/fixtures/tees.yml +0 -4
  346. data/test/fixtures/ties.yml +0 -4
  347. data/test/fixtures/topics.yml +0 -42
  348. data/test/fixtures/toys.yml +0 -4
  349. data/test/fixtures/treasures.yml +0 -10
  350. data/test/fixtures/vertices.yml +0 -4
  351. data/test/fixtures/warehouse-things.yml +0 -3
  352. data/test/fixtures/zines.yml +0 -5
  353. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  354. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  355. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  356. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  357. data/test/migrations/duplicate/3_foo.rb +0 -7
  358. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  359. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  360. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  361. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  362. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  363. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  364. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  365. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  366. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  367. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  368. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  369. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  370. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  371. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  372. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  373. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  374. data/test/models/author.rb +0 -151
  375. data/test/models/auto_id.rb +0 -4
  376. data/test/models/binary.rb +0 -2
  377. data/test/models/bird.rb +0 -9
  378. data/test/models/book.rb +0 -4
  379. data/test/models/categorization.rb +0 -5
  380. data/test/models/category.rb +0 -34
  381. data/test/models/citation.rb +0 -6
  382. data/test/models/club.rb +0 -13
  383. data/test/models/column_name.rb +0 -3
  384. data/test/models/comment.rb +0 -29
  385. data/test/models/company.rb +0 -173
  386. data/test/models/company_in_module.rb +0 -78
  387. data/test/models/computer.rb +0 -3
  388. data/test/models/contact.rb +0 -16
  389. data/test/models/contract.rb +0 -5
  390. data/test/models/course.rb +0 -3
  391. data/test/models/customer.rb +0 -73
  392. data/test/models/default.rb +0 -2
  393. data/test/models/developer.rb +0 -101
  394. data/test/models/edge.rb +0 -5
  395. data/test/models/entrant.rb +0 -3
  396. data/test/models/essay.rb +0 -3
  397. data/test/models/event.rb +0 -3
  398. data/test/models/event_author.rb +0 -8
  399. data/test/models/face.rb +0 -7
  400. data/test/models/guid.rb +0 -2
  401. data/test/models/interest.rb +0 -5
  402. data/test/models/invoice.rb +0 -4
  403. data/test/models/item.rb +0 -7
  404. data/test/models/job.rb +0 -5
  405. data/test/models/joke.rb +0 -3
  406. data/test/models/keyboard.rb +0 -3
  407. data/test/models/legacy_thing.rb +0 -3
  408. data/test/models/line_item.rb +0 -3
  409. data/test/models/man.rb +0 -9
  410. data/test/models/matey.rb +0 -4
  411. data/test/models/member.rb +0 -12
  412. data/test/models/member_detail.rb +0 -5
  413. data/test/models/member_type.rb +0 -3
  414. data/test/models/membership.rb +0 -9
  415. data/test/models/minimalistic.rb +0 -2
  416. data/test/models/mixed_case_monkey.rb +0 -3
  417. data/test/models/movie.rb +0 -5
  418. data/test/models/order.rb +0 -4
  419. data/test/models/organization.rb +0 -6
  420. data/test/models/owner.rb +0 -5
  421. data/test/models/parrot.rb +0 -22
  422. data/test/models/person.rb +0 -16
  423. data/test/models/pet.rb +0 -5
  424. data/test/models/pirate.rb +0 -80
  425. data/test/models/polymorphic_design.rb +0 -3
  426. data/test/models/polymorphic_price.rb +0 -3
  427. data/test/models/post.rb +0 -102
  428. data/test/models/price_estimate.rb +0 -3
  429. data/test/models/project.rb +0 -30
  430. data/test/models/reader.rb +0 -4
  431. data/test/models/reference.rb +0 -4
  432. data/test/models/reply.rb +0 -46
  433. data/test/models/ship.rb +0 -19
  434. data/test/models/ship_part.rb +0 -7
  435. data/test/models/sponsor.rb +0 -4
  436. data/test/models/subject.rb +0 -4
  437. data/test/models/subscriber.rb +0 -8
  438. data/test/models/subscription.rb +0 -4
  439. data/test/models/tag.rb +0 -7
  440. data/test/models/tagging.rb +0 -10
  441. data/test/models/task.rb +0 -3
  442. data/test/models/tee.rb +0 -4
  443. data/test/models/tie.rb +0 -4
  444. data/test/models/topic.rb +0 -80
  445. data/test/models/toy.rb +0 -6
  446. data/test/models/treasure.rb +0 -8
  447. data/test/models/vertex.rb +0 -9
  448. data/test/models/warehouse_thing.rb +0 -5
  449. data/test/models/zine.rb +0 -3
  450. data/test/schema/mysql_specific_schema.rb +0 -31
  451. data/test/schema/postgresql_specific_schema.rb +0 -114
  452. data/test/schema/schema.rb +0 -550
  453. data/test/schema/schema2.rb +0 -6
  454. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,183 +0,0 @@
1
- module ActiveRecord
2
- # Track unsaved attribute changes.
3
- #
4
- # A newly instantiated object is unchanged:
5
- # person = Person.find_by_name('uncle bob')
6
- # person.changed? # => false
7
- #
8
- # Change the name:
9
- # person.name = 'Bob'
10
- # person.changed? # => true
11
- # person.name_changed? # => true
12
- # person.name_was # => 'uncle bob'
13
- # person.name_change # => ['uncle bob', 'Bob']
14
- # person.name = 'Bill'
15
- # person.name_change # => ['uncle bob', 'Bill']
16
- #
17
- # Save the changes:
18
- # person.save
19
- # person.changed? # => false
20
- # person.name_changed? # => false
21
- #
22
- # Assigning the same value leaves the attribute unchanged:
23
- # person.name = 'Bill'
24
- # person.name_changed? # => false
25
- # person.name_change # => nil
26
- #
27
- # Which attributes have changed?
28
- # person.name = 'bob'
29
- # person.changed # => ['name']
30
- # person.changes # => { 'name' => ['Bill', 'bob'] }
31
- #
32
- # Before modifying an attribute in-place:
33
- # person.name_will_change!
34
- # person.name << 'by'
35
- # person.name_change # => ['uncle bob', 'uncle bobby']
36
- module Dirty
37
- DIRTY_SUFFIXES = ['_changed?', '_change', '_will_change!', '_was']
38
-
39
- def self.included(base)
40
- base.attribute_method_suffix *DIRTY_SUFFIXES
41
- base.alias_method_chain :write_attribute, :dirty
42
- base.alias_method_chain :save, :dirty
43
- base.alias_method_chain :save!, :dirty
44
- base.alias_method_chain :update, :dirty
45
- base.alias_method_chain :reload, :dirty
46
-
47
- base.class_attribute :partial_updates
48
- base.partial_updates = true
49
-
50
- base.send(:extend, ClassMethods)
51
- end
52
-
53
- # Do any attributes have unsaved changes?
54
- # person.changed? # => false
55
- # person.name = 'bob'
56
- # person.changed? # => true
57
- def changed?
58
- !changed_attributes.empty?
59
- end
60
-
61
- # List of attributes with unsaved changes.
62
- # person.changed # => []
63
- # person.name = 'bob'
64
- # person.changed # => ['name']
65
- def changed
66
- changed_attributes.keys
67
- end
68
-
69
- # Map of changed attrs => [original value, new value].
70
- # person.changes # => {}
71
- # person.name = 'bob'
72
- # person.changes # => { 'name' => ['bill', 'bob'] }
73
- def changes
74
- changed.inject({}) { |h, attr| h[attr] = attribute_change(attr); h }
75
- end
76
-
77
- # Attempts to +save+ the record and clears changed attributes if successful.
78
- def save_with_dirty(*args) #:nodoc:
79
- if status = save_without_dirty(*args)
80
- changed_attributes.clear
81
- end
82
- status
83
- end
84
-
85
- # Attempts to <tt>save!</tt> the record and clears changed attributes if successful.
86
- def save_with_dirty!(*args) #:nodoc:
87
- status = save_without_dirty!(*args)
88
- changed_attributes.clear
89
- status
90
- end
91
-
92
- # <tt>reload</tt> the record and clears changed attributes.
93
- def reload_with_dirty(*args) #:nodoc:
94
- record = reload_without_dirty(*args)
95
- changed_attributes.clear
96
- record
97
- end
98
-
99
- private
100
- # Map of change <tt>attr => original value</tt>.
101
- def changed_attributes
102
- @changed_attributes ||= {}
103
- end
104
-
105
- # Handle <tt>*_changed?</tt> for +method_missing+.
106
- def attribute_changed?(attr)
107
- changed_attributes.include?(attr)
108
- end
109
-
110
- # Handle <tt>*_change</tt> for +method_missing+.
111
- def attribute_change(attr)
112
- [changed_attributes[attr], __send__(attr)] if attribute_changed?(attr)
113
- end
114
-
115
- # Handle <tt>*_was</tt> for +method_missing+.
116
- def attribute_was(attr)
117
- attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
118
- end
119
-
120
- # Handle <tt>*_will_change!</tt> for +method_missing+.
121
- def attribute_will_change!(attr)
122
- changed_attributes[attr] = clone_attribute_value(:read_attribute, attr)
123
- end
124
-
125
- # Wrap write_attribute to remember original attribute value.
126
- def write_attribute_with_dirty(attr, value)
127
- attr = attr.to_s
128
-
129
- # The attribute already has an unsaved change.
130
- if changed_attributes.include?(attr)
131
- old = changed_attributes[attr]
132
- changed_attributes.delete(attr) unless field_changed?(attr, old, value)
133
- else
134
- old = clone_attribute_value(:read_attribute, attr)
135
- changed_attributes[attr] = old if field_changed?(attr, old, value)
136
- end
137
-
138
- # Carry on.
139
- write_attribute_without_dirty(attr, value)
140
- end
141
-
142
- def update_with_dirty
143
- if partial_updates?
144
- # Serialized attributes should always be written in case they've been
145
- # changed in place.
146
- update_without_dirty(changed | (attributes.keys & self.class.serialized_attributes.keys))
147
- else
148
- update_without_dirty
149
- end
150
- end
151
-
152
- def field_changed?(attr, old, value)
153
- if column = column_for_attribute(attr)
154
- if column.number? && column.null && (old.nil? || old == 0) && value.blank?
155
- # For nullable numeric columns, NULL gets stored in database for blank (i.e. '') values.
156
- # Hence we don't record it as a change if the value changes from nil to ''.
157
- # If an old value of 0 is set to '' we want this to get changed to nil as otherwise it'll
158
- # be typecast back to 0 (''.to_i => 0)
159
- value = nil
160
- else
161
- value = column.type_cast(value)
162
- end
163
- end
164
-
165
- old != value
166
- end
167
-
168
- module ClassMethods
169
- def self.extended(base)
170
- base.singleton_class.alias_method_chain(:alias_attribute, :dirty)
171
- end
172
-
173
- def alias_attribute_with_dirty(new_name, old_name)
174
- alias_attribute_without_dirty(new_name, old_name)
175
- DIRTY_SUFFIXES.each do |suffix|
176
- module_eval <<-STR, __FILE__, __LINE__ + 1
177
- def #{new_name}#{suffix}; self.#{old_name}#{suffix}; end # def subject_changed?; self.title_changed?; end
178
- STR
179
- end
180
- end
181
- end
182
- end
183
- end
@@ -1,197 +0,0 @@
1
- module ActiveRecord
2
- module NamedScope
3
- # All subclasses of ActiveRecord::Base have one named scope:
4
- # * <tt>scoped</tt> - which allows for the creation of anonymous \scopes, on the fly: <tt>Shirt.scoped(:conditions => {:color => 'red'}).scoped(:include => :washing_instructions)</tt>
5
- #
6
- # These anonymous \scopes tend to be useful when procedurally generating complex queries, where passing
7
- # intermediate values (scopes) around as first-class objects is convenient.
8
- #
9
- # You can define a scope that applies to all finders using ActiveRecord::Base.default_scope.
10
- def self.included(base)
11
- base.extend ClassMethods
12
- end
13
-
14
- module ClassMethods
15
- def scopes
16
- read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {})
17
- end
18
-
19
- def scoped(scope, &block)
20
- Scope.new(self, scope, &block)
21
- end
22
-
23
- # Adds a class method for retrieving and querying objects. A scope represents a narrowing of a database query,
24
- # such as <tt>:conditions => {:color => :red}, :select => 'shirts.*', :include => :washing_instructions</tt>.
25
- #
26
- # class Shirt < ActiveRecord::Base
27
- # named_scope :red, :conditions => {:color => 'red'}
28
- # named_scope :dry_clean_only, :joins => :washing_instructions, :conditions => ['washing_instructions.dry_clean_only = ?', true]
29
- # end
30
- #
31
- # The above calls to <tt>named_scope</tt> define class methods Shirt.red and Shirt.dry_clean_only. Shirt.red,
32
- # in effect, represents the query <tt>Shirt.find(:all, :conditions => {:color => 'red'})</tt>.
33
- #
34
- # Unlike <tt>Shirt.find(...)</tt>, however, the object returned by Shirt.red is not an Array; it resembles the association object
35
- # constructed by a <tt>has_many</tt> declaration. For instance, you can invoke <tt>Shirt.red.find(:first)</tt>, <tt>Shirt.red.count</tt>,
36
- # <tt>Shirt.red.find(:all, :conditions => {:size => 'small'})</tt>. Also, just
37
- # as with the association objects, named \scopes act like an Array, implementing Enumerable; <tt>Shirt.red.each(&block)</tt>,
38
- # <tt>Shirt.red.first</tt>, and <tt>Shirt.red.inject(memo, &block)</tt> all behave as if Shirt.red really was an Array.
39
- #
40
- # These named \scopes are composable. For instance, <tt>Shirt.red.dry_clean_only</tt> will produce all shirts that are both red and dry clean only.
41
- # Nested finds and calculations also work with these compositions: <tt>Shirt.red.dry_clean_only.count</tt> returns the number of garments
42
- # for which these criteria obtain. Similarly with <tt>Shirt.red.dry_clean_only.average(:thread_count)</tt>.
43
- #
44
- # All \scopes are available as class methods on the ActiveRecord::Base descendant upon which the \scopes were defined. But they are also available to
45
- # <tt>has_many</tt> associations. If,
46
- #
47
- # class Person < ActiveRecord::Base
48
- # has_many :shirts
49
- # end
50
- #
51
- # then <tt>elton.shirts.red.dry_clean_only</tt> will return all of Elton's red, dry clean
52
- # only shirts.
53
- #
54
- # Named \scopes can also be procedural:
55
- #
56
- # class Shirt < ActiveRecord::Base
57
- # named_scope :colored, lambda { |color|
58
- # { :conditions => { :color => color } }
59
- # }
60
- # end
61
- #
62
- # In this example, <tt>Shirt.colored('puce')</tt> finds all puce shirts.
63
- #
64
- # Named \scopes can also have extensions, just as with <tt>has_many</tt> declarations:
65
- #
66
- # class Shirt < ActiveRecord::Base
67
- # named_scope :red, :conditions => {:color => 'red'} do
68
- # def dom_id
69
- # 'red_shirts'
70
- # end
71
- # end
72
- # end
73
- #
74
- #
75
- # For testing complex named \scopes, you can examine the scoping options using the
76
- # <tt>proxy_options</tt> method on the proxy itself.
77
- #
78
- # class Shirt < ActiveRecord::Base
79
- # named_scope :colored, lambda { |color|
80
- # { :conditions => { :color => color } }
81
- # }
82
- # end
83
- #
84
- # expected_options = { :conditions => { :colored => 'red' } }
85
- # assert_equal expected_options, Shirt.colored('red').proxy_options
86
- def named_scope(name, options = {}, &block)
87
- name = name.to_sym
88
-
89
- scopes[name] = lambda do |parent_scope, *args|
90
- Scope.new(parent_scope, case options
91
- when Hash
92
- options
93
- when Proc
94
- if self.model_name != parent_scope.model_name
95
- options.bind(parent_scope).call(*args)
96
- else
97
- options.call(*args)
98
- end
99
- end, &block)
100
- end
101
-
102
- singleton_class.send :define_method, name do |*args|
103
- scopes[name].call(self, *args)
104
- end
105
- end
106
- end
107
-
108
- class Scope
109
- attr_reader :proxy_scope, :proxy_options, :current_scoped_methods_when_defined
110
- NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? respond_to?).to_set
111
- [].methods.each do |m|
112
- unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s)
113
- delegate m, :to => :proxy_found
114
- end
115
- end
116
-
117
- delegate :scopes, :with_scope, :scoped_methods, :to => :proxy_scope
118
-
119
- def initialize(proxy_scope, options, &block)
120
- options ||= {}
121
- [options[:extend]].flatten.each { |extension| extend extension } if options[:extend]
122
- extend Module.new(&block) if block_given?
123
- unless (Scope === proxy_scope || ActiveRecord::Associations::AssociationCollection === proxy_scope)
124
- @current_scoped_methods_when_defined = proxy_scope.send(:current_scoped_methods)
125
- end
126
- @proxy_scope, @proxy_options = proxy_scope, options.except(:extend)
127
- end
128
-
129
- def reload
130
- load_found; self
131
- end
132
-
133
- def first(*args)
134
- if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash))
135
- proxy_found.first(*args)
136
- else
137
- find(:first, *args)
138
- end
139
- end
140
-
141
- def last(*args)
142
- if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash))
143
- proxy_found.last(*args)
144
- else
145
- find(:last, *args)
146
- end
147
- end
148
-
149
- def size
150
- @found ? @found.length : count
151
- end
152
-
153
- def empty?
154
- @found ? @found.empty? : count.zero?
155
- end
156
-
157
- def respond_to?(method, include_private = false)
158
- super || @proxy_scope.respond_to?(method, include_private)
159
- end
160
-
161
- def any?
162
- if block_given?
163
- proxy_found.any? { |*block_args| yield(*block_args) }
164
- else
165
- !empty?
166
- end
167
- end
168
-
169
- protected
170
- def proxy_found
171
- @found || load_found
172
- end
173
-
174
- private
175
- def method_missing(method, *args, &block)
176
- if scopes.include?(method)
177
- scopes[method].call(self, *args)
178
- else
179
- with_scope({:find => proxy_options, :create => proxy_options[:conditions].is_a?(Hash) ? proxy_options[:conditions] : {}}, :reverse_merge) do
180
- method = :new if method == :build
181
- if current_scoped_methods_when_defined && !scoped_methods.include?(current_scoped_methods_when_defined)
182
- with_scope current_scoped_methods_when_defined do
183
- proxy_scope.send(method, *args, &block)
184
- end
185
- else
186
- proxy_scope.send(method, *args, &block)
187
- end
188
- end
189
- end
190
- end
191
-
192
- def load_found
193
- @found = find(:all)
194
- end
195
- end
196
- end
197
- end
@@ -1,91 +0,0 @@
1
- require 'active_support/json'
2
- require 'active_support/core_ext/module/model_naming'
3
-
4
- module ActiveRecord #:nodoc:
5
- module Serialization
6
- def self.included(base)
7
- base.cattr_accessor :include_root_in_json, :instance_writer => false
8
- end
9
-
10
- # Returns a JSON string representing the model. Some configuration is
11
- # available through +options+.
12
- #
13
- # The option <tt>ActiveRecord::Base.include_root_in_json</tt> controls the
14
- # top-level behavior of to_json. In a new Rails application, it is set to
15
- # <tt>true</tt> in initializers/new_rails_defaults.rb. When it is <tt>true</tt>,
16
- # to_json will emit a single root node named after the object's type. For example:
17
- #
18
- # konata = User.find(1)
19
- # ActiveRecord::Base.include_root_in_json = true
20
- # konata.to_json
21
- # # => { "user": {"id": 1, "name": "Konata Izumi", "age": 16,
22
- # "created_at": "2006/08/01", "awesome": true} }
23
- #
24
- # ActiveRecord::Base.include_root_in_json = false
25
- # konata.to_json
26
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
27
- # "created_at": "2006/08/01", "awesome": true}
28
- #
29
- # The remainder of the examples in this section assume include_root_in_json is set to
30
- # <tt>false</tt>.
31
- #
32
- # Without any +options+, the returned JSON string will include all
33
- # the model's attributes. For example:
34
- #
35
- # konata = User.find(1)
36
- # konata.to_json
37
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
38
- # "created_at": "2006/08/01", "awesome": true}
39
- #
40
- # The <tt>:only</tt> and <tt>:except</tt> options can be used to limit the attributes
41
- # included, and work similar to the +attributes+ method. For example:
42
- #
43
- # konata.to_json(:only => [ :id, :name ])
44
- # # => {"id": 1, "name": "Konata Izumi"}
45
- #
46
- # konata.to_json(:except => [ :id, :created_at, :age ])
47
- # # => {"name": "Konata Izumi", "awesome": true}
48
- #
49
- # To include any methods on the model, use <tt>:methods</tt>.
50
- #
51
- # konata.to_json(:methods => :permalink)
52
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
53
- # "created_at": "2006/08/01", "awesome": true,
54
- # "permalink": "1-konata-izumi"}
55
- #
56
- # To include associations, use <tt>:include</tt>.
57
- #
58
- # konata.to_json(:include => :posts)
59
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
60
- # "created_at": "2006/08/01", "awesome": true,
61
- # "posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
62
- # {"id": 2, author_id: 1, "title": "So I was thinking"}]}
63
- #
64
- # 2nd level and higher order associations work as well:
65
- #
66
- # konata.to_json(:include => { :posts => {
67
- # :include => { :comments => {
68
- # :only => :body } },
69
- # :only => :title } })
70
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
71
- # "created_at": "2006/08/01", "awesome": true,
72
- # "posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
73
- # "title": "Welcome to the weblog"},
74
- # {"comments": [{"body": "Don't think too hard"}],
75
- # "title": "So I was thinking"}]}
76
- def to_json(options = {})
77
- super
78
- end
79
-
80
- def as_json(options = nil) #:nodoc:
81
- hash = Serializer.new(self, options).serializable_record
82
- hash = { options[:root] || self.class.model_name.element => hash } if include_root_in_json
83
- hash
84
- end
85
-
86
- def from_json(json)
87
- self.attributes = ActiveSupport::JSON.decode(json)
88
- self
89
- end
90
- end
91
- end
data/lib/activerecord.rb DELETED
@@ -1,2 +0,0 @@
1
- require 'active_record'
2
- ActiveSupport::Deprecation.warn 'require "activerecord" is deprecated and will be removed in Rails 3. Use require "active_record" instead.'
@@ -1 +0,0 @@
1
- # Logfile created on Wed Oct 31 16:05:13 +0000 2007 by logger.rb/1.5.2.9
Binary file
@@ -1,24 +0,0 @@
1
- # The filename begins with "aaa" to ensure this is the first test.
2
- require "cases/helper"
3
-
4
- class AAACreateTablesTest < ActiveRecord::TestCase
5
- self.use_transactional_fixtures = false
6
-
7
- def test_load_schema
8
- eval(File.read(SCHEMA_ROOT + "/schema.rb"))
9
- if File.exists?(adapter_specific_schema_file)
10
- eval(File.read(adapter_specific_schema_file))
11
- end
12
- assert true
13
- end
14
-
15
- def test_drop_and_create_courses_table
16
- eval(File.read(SCHEMA_ROOT + "/schema2.rb"))
17
- assert true
18
- end
19
-
20
- private
21
- def adapter_specific_schema_file
22
- SCHEMA_ROOT + '/' + ActiveRecord::Base.connection.adapter_name.downcase + '_specific_schema.rb'
23
- end
24
- end
@@ -1,122 +0,0 @@
1
- require "cases/helper"
2
-
3
- class ActiveSchemaTest < ActiveRecord::TestCase
4
- def setup
5
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
6
- alias_method :execute_without_stub, :execute
7
- def execute(sql, name = nil) return sql end
8
- end
9
- end
10
-
11
- def teardown
12
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
13
- remove_method :execute
14
- alias_method :execute, :execute_without_stub
15
- end
16
- end
17
-
18
- def test_add_index
19
- # add_index calls index_exists? which can't work since execute is stubbed
20
- ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:define_method, :index_exists?) do |*|
21
- false
22
- end
23
- expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`)"
24
- assert_equal expected, add_index(:people, :last_name, :length => nil)
25
-
26
- expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`(10))"
27
- assert_equal expected, add_index(:people, :last_name, :length => 10)
28
-
29
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(15))"
30
- assert_equal expected, add_index(:people, [:last_name, :first_name], :length => 15)
31
-
32
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`)"
33
- assert_equal expected, add_index(:people, [:last_name, :first_name], :length => {:last_name => 15})
34
-
35
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(10))"
36
- assert_equal expected, add_index(:people, [:last_name, :first_name], :length => {:last_name => 15, :first_name => 10})
37
- ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:remove_method, :index_exists?)
38
- end
39
-
40
- def test_drop_table
41
- assert_equal "DROP TABLE `people`", drop_table(:people)
42
- end
43
-
44
- if current_adapter?(:MysqlAdapter)
45
- def test_create_mysql_database_with_encoding
46
- assert_equal "CREATE DATABASE `matt` DEFAULT CHARACTER SET `utf8`", create_database(:matt)
47
- assert_equal "CREATE DATABASE `aimonetti` DEFAULT CHARACTER SET `latin1`", create_database(:aimonetti, {:charset => 'latin1'})
48
- assert_equal "CREATE DATABASE `matt_aimonetti` DEFAULT CHARACTER SET `big5` COLLATE `big5_chinese_ci`", create_database(:matt_aimonetti, {:charset => :big5, :collation => :big5_chinese_ci})
49
- end
50
-
51
- def test_recreate_mysql_database_with_encoding
52
- create_database(:luca, {:charset => 'latin1'})
53
- assert_equal "CREATE DATABASE `luca` DEFAULT CHARACTER SET `latin1`", recreate_database(:luca, {:charset => 'latin1'})
54
- end
55
- end
56
-
57
- def test_add_column
58
- assert_equal "ALTER TABLE `people` ADD `last_name` varchar(255)", add_column(:people, :last_name, :string)
59
- end
60
-
61
- def test_add_column_with_limit
62
- assert_equal "ALTER TABLE `people` ADD `key` varchar(32)", add_column(:people, :key, :string, :limit => 32)
63
- end
64
-
65
- def test_drop_table_with_specific_database
66
- assert_equal "DROP TABLE `otherdb`.`people`", drop_table('otherdb.people')
67
- end
68
-
69
- def test_add_timestamps
70
- with_real_execute do
71
- begin
72
- ActiveRecord::Base.connection.create_table :delete_me do |t|
73
- end
74
- ActiveRecord::Base.connection.add_timestamps :delete_me
75
- assert column_present?('delete_me', 'updated_at', 'datetime')
76
- assert column_present?('delete_me', 'created_at', 'datetime')
77
- ensure
78
- ActiveRecord::Base.connection.drop_table :delete_me rescue nil
79
- end
80
- end
81
- end
82
-
83
- def test_remove_timestamps
84
- with_real_execute do
85
- begin
86
- ActiveRecord::Base.connection.create_table :delete_me do |t|
87
- t.timestamps
88
- end
89
- ActiveRecord::Base.connection.remove_timestamps :delete_me
90
- assert !column_present?('delete_me', 'updated_at', 'datetime')
91
- assert !column_present?('delete_me', 'created_at', 'datetime')
92
- ensure
93
- ActiveRecord::Base.connection.drop_table :delete_me rescue nil
94
- end
95
- end
96
- end
97
-
98
- private
99
- def with_real_execute
100
- #we need to actually modify some data, so we make execute point to the original method
101
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
102
- alias_method :execute_with_stub, :execute
103
- alias_method :execute, :execute_without_stub
104
- end
105
- yield
106
- ensure
107
- #before finishing, we restore the alias to the mock-up method
108
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
109
- alias_method :execute, :execute_with_stub
110
- end
111
- end
112
-
113
-
114
- def method_missing(method_symbol, *arguments)
115
- ActiveRecord::Base.connection.send(method_symbol, *arguments)
116
- end
117
-
118
- def column_present?(table_name, column_name, type)
119
- results = ActiveRecord::Base.connection.select_all("SHOW FIELDS FROM #{table_name} LIKE '#{column_name}'")
120
- results.first && results.first['Type'] == type
121
- end
122
- end
@@ -1,24 +0,0 @@
1
- require 'cases/helper'
2
-
3
- class PostgresqlActiveSchemaTest < Test::Unit::TestCase
4
- def setup
5
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
6
- alias_method :real_execute, :execute
7
- def execute(sql, name = nil) sql end
8
- end
9
- end
10
-
11
- def teardown
12
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:alias_method, :execute, :real_execute)
13
- end
14
-
15
- def test_create_database_with_encoding
16
- assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
17
- assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
18
- end
19
-
20
- private
21
- def method_missing(method_symbol, *arguments)
22
- ActiveRecord::Base.connection.send(method_symbol, *arguments)
23
- end
24
- end