radiant 0.8.0 → 0.8.1

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

Potentially problematic release.


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

Files changed (513) hide show
  1. data/CHANGELOG +33 -1
  2. data/CONTRIBUTORS +15 -2
  3. data/INSTALL +9 -7
  4. data/README +11 -7
  5. data/app/controllers/admin/layouts_controller.rb +5 -2
  6. data/app/controllers/admin/pages_controller.rb +8 -5
  7. data/app/controllers/admin/snippets_controller.rb +5 -2
  8. data/app/controllers/application_controller.rb +7 -0
  9. data/app/helpers/admin/node_helper.rb +2 -2
  10. data/app/helpers/application_helper.rb +2 -2
  11. data/app/models/radiant/config.rb +36 -4
  12. data/app/models/standard_tags.rb +1 -1
  13. data/app/views/admin/layouts/index.html.haml +15 -12
  14. data/app/views/admin/page_parts/_page_part.html.haml +2 -2
  15. data/app/views/admin/pages/index.html.haml +1 -1
  16. data/app/views/admin/snippets/_form.html.haml +1 -1
  17. data/app/views/admin/snippets/index.html.haml +14 -10
  18. data/config/database.db2.yml +20 -0
  19. data/config/environment.rb +4 -4
  20. data/config/environments/test.rb +1 -2
  21. data/features/support/env.rb +2 -1
  22. data/lib/generators/extension/extension_generator.rb +5 -0
  23. data/lib/generators/extension/templates/RSpecRakefile +11 -8
  24. data/lib/generators/extension/templates/cucumber.yml +1 -0
  25. data/lib/generators/extension/templates/cucumber_env.rb +16 -0
  26. data/lib/generators/extension/templates/cucumber_paths.rb +14 -0
  27. data/lib/generators/extension/templates/extension.rb +1 -1
  28. data/lib/generators/instance/instance_generator.rb +1 -1
  29. data/lib/generators/instance/templates/databases/db2.yml +40 -0
  30. data/lib/generators/instance/templates/instance_environment.rb +6 -6
  31. data/lib/local_time.rb +3 -9
  32. data/lib/radiant.rb +1 -1
  33. data/lib/radiant/cache.rb +10 -8
  34. data/lib/radiant/extension.rb +36 -0
  35. data/lib/radiant/extension/script.rb +1 -1
  36. data/lib/radiant/extension_loader.rb +5 -1
  37. data/lib/radiant/initializer.rb +52 -4
  38. data/lib/task_support.rb +33 -0
  39. data/lib/tasks/cucumber.rake +5 -1
  40. data/lib/tasks/radiant_config.rake +18 -0
  41. data/lib/tasks/release.rake +1 -0
  42. data/public/javascripts/admin/admin.js +1 -1
  43. data/spec/controllers/admin/layouts_controller_spec.rb +18 -12
  44. data/spec/controllers/admin/pages_controller_spec.rb +35 -29
  45. data/spec/controllers/admin/snippets_controller_spec.rb +11 -5
  46. data/spec/controllers/admin/welcome_controller_spec.rb +1 -1
  47. data/spec/controllers/application_controller_spec.rb +18 -0
  48. data/spec/fixtures/radiant_config.yml +10 -0
  49. data/spec/generators/extension_generator_spec.rb +12 -0
  50. data/spec/helpers/admin/node_helper_spec.rb +6 -0
  51. data/spec/helpers/application_helper_spec.rb +1 -1
  52. data/spec/lib/radiant/extension_loader_spec.rb +17 -0
  53. data/spec/lib/radiant/extension_spec.rb +28 -0
  54. data/spec/lib/radiant/initializer_spec.rb +34 -0
  55. data/spec/lib/task_support_spec.rb +42 -0
  56. data/spec/models/page_spec.rb +6 -2
  57. data/spec/models/radiant/config_spec.rb +42 -1
  58. data/spec/models/standard_tags_spec.rb +2 -2
  59. data/test/fixtures/extensions/01_basic/app/metal/basic_metal.rb +9 -0
  60. data/test/fixtures/extensions/02_overriding/app/metal/basic_metal.rb +9 -0
  61. data/vendor/extensions/textile_filter/textile.html +2 -2
  62. data/vendor/plugins/dataset/CHANGELOG +2 -1
  63. data/vendor/plugins/dataset/Rakefile +3 -0
  64. data/vendor/plugins/dataset/VERSION.yml +2 -2
  65. data/vendor/plugins/dataset/dataset.gemspec +9 -3
  66. data/vendor/plugins/dataset/lib/dataset.rb +3 -0
  67. data/vendor/radius/lib/radius.rb +5 -0
  68. data/vendor/radius/test/radius_test.rb +6 -0
  69. data/vendor/rails/actionmailer/CHANGELOG +8 -0
  70. data/vendor/rails/actionmailer/Rakefile +3 -2
  71. data/vendor/rails/actionmailer/lib/action_mailer/base.rb +2 -1
  72. data/vendor/rails/actionmailer/lib/action_mailer/version.rb +1 -1
  73. data/vendor/rails/actionmailer/test/abstract_unit.rb +0 -3
  74. data/vendor/rails/actionmailer/test/mail_service_test.rb +3 -2
  75. data/vendor/rails/actionpack/CHANGELOG +16 -0
  76. data/vendor/rails/actionpack/Rakefile +5 -3
  77. data/vendor/rails/actionpack/lib/action_controller.rb +2 -7
  78. data/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +13 -3
  79. data/vendor/rails/actionpack/lib/action_controller/base.rb +12 -3
  80. data/vendor/rails/actionpack/lib/action_controller/caching.rb +1 -1
  81. data/vendor/rails/actionpack/lib/action_controller/caching/actions.rb +9 -1
  82. data/vendor/rails/actionpack/lib/action_controller/caching/sweeper.rb +45 -0
  83. data/vendor/rails/actionpack/lib/action_controller/caching/sweeping.rb +0 -42
  84. data/vendor/rails/actionpack/lib/action_controller/cookies.rb +1 -1
  85. data/vendor/rails/actionpack/lib/action_controller/dispatcher.rb +21 -6
  86. data/vendor/rails/actionpack/lib/action_controller/failsafe.rb +40 -6
  87. data/vendor/rails/actionpack/lib/action_controller/flash.rb +11 -3
  88. data/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +7 -3
  89. data/vendor/rails/actionpack/lib/action_controller/integration.rb +5 -12
  90. data/vendor/rails/actionpack/lib/action_controller/middlewares.rb +0 -1
  91. data/vendor/rails/actionpack/lib/action_controller/params_parser.rb +6 -0
  92. data/vendor/rails/actionpack/lib/action_controller/reloader.rb +47 -7
  93. data/vendor/rails/actionpack/lib/action_controller/request.rb +6 -2
  94. data/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +2 -1
  95. data/vendor/rails/actionpack/lib/action_controller/resources.rb +17 -13
  96. data/vendor/rails/actionpack/lib/action_controller/response.rb +8 -2
  97. data/vendor/rails/actionpack/lib/action_controller/routing.rb +3 -0
  98. data/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb +20 -6
  99. data/vendor/rails/actionpack/lib/action_controller/streaming.rb +4 -2
  100. data/vendor/rails/actionpack/lib/action_controller/test_process.rb +9 -1
  101. data/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +1 -1
  102. data/vendor/rails/actionpack/lib/action_pack/version.rb +1 -1
  103. data/vendor/rails/actionpack/lib/action_view/helpers.rb +1 -1
  104. data/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +21 -9
  105. data/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb +1 -1
  106. data/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +2 -2
  107. data/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +26 -12
  108. data/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +71 -1
  109. data/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +10 -4
  110. data/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +1 -1
  111. data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +7 -7
  112. data/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +5 -5
  113. data/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +1 -1
  114. data/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +23 -14
  115. data/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +2 -2
  116. data/vendor/rails/actionpack/lib/action_view/locale/en.yml +4 -0
  117. data/vendor/rails/actionpack/lib/action_view/paths.rb +1 -1
  118. data/vendor/rails/actionpack/lib/action_view/template.rb +22 -33
  119. data/vendor/rails/actionpack/test/abstract_unit.rb +17 -1
  120. data/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +3 -3
  121. data/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +27 -0
  122. data/vendor/rails/actionpack/test/controller/caching_test.rb +40 -1
  123. data/vendor/rails/actionpack/test/controller/cookie_test.rb +16 -0
  124. data/vendor/rails/actionpack/test/controller/dispatcher_test.rb +59 -18
  125. data/vendor/rails/actionpack/test/controller/failsafe_test.rb +60 -0
  126. data/vendor/rails/actionpack/test/controller/filter_params_test.rb +3 -1
  127. data/vendor/rails/actionpack/test/controller/flash_test.rb +6 -1
  128. data/vendor/rails/actionpack/test/controller/http_basic_authentication_test.rb +25 -0
  129. data/vendor/rails/actionpack/test/controller/http_digest_authentication_test.rb +63 -9
  130. data/vendor/rails/actionpack/test/controller/integration_test.rb +31 -3
  131. data/vendor/rails/actionpack/test/controller/rack_test.rb +18 -1
  132. data/vendor/rails/actionpack/test/controller/redirect_test.rb +4 -1
  133. data/vendor/rails/actionpack/test/controller/reloader_test.rb +124 -0
  134. data/vendor/rails/actionpack/test/controller/render_test.rb +19 -9
  135. data/vendor/rails/actionpack/test/controller/request/json_params_parsing_test.rb +24 -4
  136. data/vendor/rails/actionpack/test/controller/request/multipart_params_parsing_test.rb +1 -62
  137. data/vendor/rails/actionpack/test/controller/request/test_request_test.rb +35 -0
  138. data/vendor/rails/actionpack/test/controller/request/url_encoded_params_parsing_test.rb +0 -38
  139. data/vendor/rails/actionpack/test/controller/request/xml_params_parsing_test.rb +15 -0
  140. data/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +6 -5
  141. data/vendor/rails/actionpack/test/controller/request_test.rb +218 -230
  142. data/vendor/rails/actionpack/test/controller/resources_test.rb +52 -0
  143. data/vendor/rails/actionpack/test/controller/routing_test.rb +28 -2
  144. data/vendor/rails/actionpack/test/controller/send_file_test.rb +12 -2
  145. data/vendor/rails/actionpack/test/controller/session/cookie_store_test.rb +9 -32
  146. data/vendor/rails/actionpack/test/controller/test_test.rb +8 -0
  147. data/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +29 -3
  148. data/vendor/rails/actionpack/test/fixtures/failsafe/500.html +1 -0
  149. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.css +23 -0
  150. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.js +63 -0
  151. data/vendor/rails/actionpack/test/template/active_record_helper_test.rb +1 -1
  152. data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +46 -0
  153. data/vendor/rails/actionpack/test/template/atom_feed_helper_test.rb +29 -0
  154. data/vendor/rails/actionpack/test/template/form_helper_test.rb +143 -6
  155. data/vendor/rails/actionpack/test/template/form_options_helper_i18n_test.rb +27 -0
  156. data/vendor/rails/actionpack/test/template/form_options_helper_test.rb +56 -0
  157. data/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +23 -6
  158. data/vendor/rails/actionpack/test/template/prototype_helper_test.rb +11 -11
  159. data/vendor/rails/actionpack/test/template/template_test.rb +32 -0
  160. data/vendor/rails/actionpack/test/template/text_helper_test.rb +23 -0
  161. data/vendor/rails/actionpack/test/template/url_helper_test.rb +8 -0
  162. data/vendor/rails/activerecord/CHANGELOG +18 -0
  163. data/vendor/rails/activerecord/Rakefile +26 -9
  164. data/vendor/rails/activerecord/examples/performance.rb +162 -0
  165. data/vendor/rails/activerecord/lib/active_record/associations.rb +104 -35
  166. data/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +10 -5
  167. data/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +2 -2
  168. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +22 -4
  169. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +5 -1
  170. data/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +16 -0
  171. data/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +1 -0
  172. data/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +13 -3
  173. data/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb +15 -9
  174. data/vendor/rails/activerecord/lib/active_record/autosave_association.rb +15 -9
  175. data/vendor/rails/activerecord/lib/active_record/base.rb +34 -31
  176. data/vendor/rails/activerecord/lib/active_record/batches.rb +23 -15
  177. data/vendor/rails/activerecord/lib/active_record/calculations.rb +7 -13
  178. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +16 -2
  179. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +2 -2
  180. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +7 -0
  181. data/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +17 -8
  182. data/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +98 -35
  183. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +15 -0
  184. data/vendor/rails/activerecord/lib/active_record/dirty.rb +1 -1
  185. data/vendor/rails/activerecord/lib/active_record/fixtures.rb +14 -11
  186. data/vendor/rails/activerecord/lib/active_record/i18n_interpolation_deprecation.rb +1 -1
  187. data/vendor/rails/activerecord/lib/active_record/locale/en.yml +4 -0
  188. data/vendor/rails/activerecord/lib/active_record/named_scope.rb +3 -8
  189. data/vendor/rails/activerecord/lib/active_record/reflection.rb +1 -1
  190. data/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +6 -3
  191. data/vendor/rails/activerecord/lib/active_record/serialization.rb +3 -2
  192. data/vendor/rails/activerecord/lib/active_record/serializers/json_serializer.rb +10 -18
  193. data/vendor/rails/activerecord/lib/active_record/serializers/xml_serializer.rb +6 -2
  194. data/vendor/rails/activerecord/lib/active_record/session_store.rb +9 -1
  195. data/vendor/rails/activerecord/lib/active_record/timestamp.rb +39 -9
  196. data/vendor/rails/activerecord/lib/active_record/validations.rb +149 -80
  197. data/vendor/rails/activerecord/lib/active_record/version.rb +1 -1
  198. data/vendor/rails/activerecord/test/cases/adapter_test.rb +12 -0
  199. data/vendor/rails/activerecord/test/cases/associations/belongs_to_associations_test.rb +102 -22
  200. data/vendor/rails/activerecord/test/cases/associations/eager_load_nested_include_test.rb +5 -5
  201. data/vendor/rails/activerecord/test/cases/associations/eager_test.rb +12 -0
  202. data/vendor/rails/activerecord/test/cases/associations/habtm_join_table_test.rb +56 -0
  203. data/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +62 -2
  204. data/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +46 -1
  205. data/vendor/rails/activerecord/test/cases/associations/has_one_through_associations_test.rb +18 -1
  206. data/vendor/rails/activerecord/test/cases/associations/inner_join_association_test.rb +5 -0
  207. data/vendor/rails/activerecord/test/cases/associations/join_model_test.rb +4 -4
  208. data/vendor/rails/activerecord/test/cases/autosave_association_test.rb +22 -0
  209. data/vendor/rails/activerecord/test/cases/base_test.rb +51 -6
  210. data/vendor/rails/activerecord/test/cases/calculations_test.rb +14 -14
  211. data/vendor/rails/activerecord/test/cases/column_definition_test.rb +34 -0
  212. data/vendor/rails/activerecord/test/cases/copy_table_test_sqlite.rb +5 -5
  213. data/vendor/rails/activerecord/test/cases/dirty_test.rb +10 -0
  214. data/vendor/rails/activerecord/test/cases/finder_test.rb +21 -50
  215. data/vendor/rails/activerecord/test/cases/fixtures_test.rb +6 -1
  216. data/vendor/rails/activerecord/test/cases/helper.rb +1 -2
  217. data/vendor/rails/activerecord/test/cases/i18n_test.rb +5 -0
  218. data/vendor/rails/activerecord/test/cases/json_serialization_test.rb +57 -57
  219. data/vendor/rails/activerecord/test/cases/method_scoping_test.rb +14 -4
  220. data/vendor/rails/activerecord/test/cases/migration_test.rb +39 -11
  221. data/vendor/rails/activerecord/test/cases/modules_test.rb +42 -0
  222. data/vendor/rails/activerecord/test/cases/named_scope_test.rb +6 -4
  223. data/vendor/rails/activerecord/test/cases/pk_test.rb +18 -0
  224. data/vendor/rails/activerecord/test/cases/reflection_test.rb +7 -7
  225. data/vendor/rails/activerecord/test/cases/schema_dumper_test.rb +35 -7
  226. data/vendor/rails/activerecord/test/cases/schema_test_postgresql.rb +76 -0
  227. data/vendor/rails/activerecord/test/cases/timestamp_test.rb +75 -0
  228. data/vendor/rails/activerecord/test/cases/validations_i18n_test.rb +656 -624
  229. data/vendor/rails/activerecord/test/cases/validations_test.rb +12 -2
  230. data/vendor/rails/activerecord/test/cases/xml_serialization_test.rb +20 -0
  231. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite +0 -0
  232. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  233. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite +0 -0
  234. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  235. data/vendor/rails/activerecord/test/fixtures/posts.yml +3 -0
  236. data/vendor/rails/activerecord/test/models/author.rb +5 -0
  237. data/vendor/rails/activerecord/test/models/comment.rb +5 -1
  238. data/vendor/rails/activerecord/test/models/company.rb +9 -7
  239. data/vendor/rails/activerecord/test/models/company_in_module.rb +1 -1
  240. data/vendor/rails/activerecord/test/models/contract.rb +5 -0
  241. data/vendor/rails/activerecord/test/models/developer.rb +10 -0
  242. data/vendor/rails/activerecord/test/models/essay.rb +3 -0
  243. data/vendor/rails/activerecord/test/models/organization.rb +2 -0
  244. data/vendor/rails/activerecord/test/models/pet.rb +1 -1
  245. data/vendor/rails/activerecord/test/models/project.rb +1 -1
  246. data/vendor/rails/activerecord/test/models/reply.rb +2 -1
  247. data/vendor/rails/activerecord/test/models/topic.rb +1 -2
  248. data/vendor/rails/activerecord/test/models/toy.rb +2 -0
  249. data/vendor/rails/activerecord/test/schema/postgresql_specific_schema.rb +13 -2
  250. data/vendor/rails/activerecord/test/schema/schema.rb +19 -0
  251. data/vendor/rails/activeresource/CHANGELOG +16 -0
  252. data/vendor/rails/activeresource/Rakefile +3 -2
  253. data/vendor/rails/activeresource/lib/active_resource/base.rb +89 -9
  254. data/vendor/rails/activeresource/lib/active_resource/connection.rb +73 -8
  255. data/vendor/rails/activeresource/lib/active_resource/exceptions.rb +66 -0
  256. data/vendor/rails/activeresource/lib/active_resource/formats/json_format.rb +2 -2
  257. data/vendor/rails/activeresource/lib/active_resource/validations.rb +20 -4
  258. data/vendor/rails/activeresource/lib/active_resource/version.rb +1 -1
  259. data/vendor/rails/activeresource/test/abstract_unit.rb +1 -3
  260. data/vendor/rails/activeresource/test/base/load_test.rb +16 -1
  261. data/vendor/rails/activeresource/test/base_errors_test.rb +56 -19
  262. data/vendor/rails/activeresource/test/base_test.rb +147 -0
  263. data/vendor/rails/activeresource/test/connection_test.rb +42 -0
  264. data/vendor/rails/activeresource/test/debug.log +7974 -0
  265. data/vendor/rails/activeresource/test/fixtures/proxy.rb +4 -0
  266. data/vendor/rails/activesupport/CHANGELOG +13 -0
  267. data/vendor/rails/activesupport/lib/active_support/all.rb +8 -0
  268. data/vendor/rails/activesupport/lib/active_support/cache.rb +14 -1
  269. data/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +16 -10
  270. data/vendor/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb +1 -1
  271. data/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +1 -0
  272. data/vendor/rails/activesupport/lib/active_support/core_ext/date/calculations.rb +2 -1
  273. data/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +2 -4
  274. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +14 -4
  275. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +4 -2
  276. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
  277. data/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +19 -5
  278. data/vendor/rails/activesupport/lib/active_support/core_ext/module/model_naming.rb +8 -6
  279. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +15 -9
  280. data/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +1 -0
  281. data/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +29 -5
  282. data/vendor/rails/activesupport/lib/active_support/core_ext/string/bytesize.rb +5 -0
  283. data/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +7 -7
  284. data/vendor/rails/activesupport/lib/active_support/deprecation.rb +9 -9
  285. data/vendor/rails/activesupport/lib/active_support/duration.rb +4 -2
  286. data/vendor/rails/activesupport/lib/active_support/json.rb +1 -22
  287. data/vendor/rails/activesupport/lib/active_support/json/backends/jsongem.rb +38 -0
  288. data/vendor/rails/activesupport/lib/active_support/json/backends/yaml.rb +88 -0
  289. data/vendor/rails/activesupport/lib/active_support/json/decoding.rb +23 -72
  290. data/vendor/rails/activesupport/lib/active_support/json/encoders/date.rb +9 -8
  291. data/vendor/rails/activesupport/lib/active_support/json/encoders/date_time.rb +9 -8
  292. data/vendor/rails/activesupport/lib/active_support/json/encoders/enumerable.rb +14 -9
  293. data/vendor/rails/activesupport/lib/active_support/json/encoders/false_class.rb +4 -2
  294. data/vendor/rails/activesupport/lib/active_support/json/encoders/hash.rb +21 -11
  295. data/vendor/rails/activesupport/lib/active_support/json/encoders/nil_class.rb +4 -2
  296. data/vendor/rails/activesupport/lib/active_support/json/encoders/numeric.rb +16 -0
  297. data/vendor/rails/activesupport/lib/active_support/json/encoders/object.rb +6 -2
  298. data/vendor/rails/activesupport/lib/active_support/json/encoders/regexp.rb +4 -0
  299. data/vendor/rails/activesupport/lib/active_support/json/encoders/string.rb +5 -32
  300. data/vendor/rails/activesupport/lib/active_support/json/encoders/symbol.rb +2 -2
  301. data/vendor/rails/activesupport/lib/active_support/json/encoders/time.rb +9 -8
  302. data/vendor/rails/activesupport/lib/active_support/json/encoders/true_class.rb +4 -2
  303. data/vendor/rails/activesupport/lib/active_support/json/encoding.rb +80 -9
  304. data/vendor/rails/activesupport/lib/active_support/memoizable.rb +1 -1
  305. data/vendor/rails/activesupport/lib/active_support/message_verifier.rb +16 -3
  306. data/vendor/rails/activesupport/lib/active_support/multibyte.rb +30 -6
  307. data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +23 -17
  308. data/vendor/rails/activesupport/lib/active_support/multibyte/utils.rb +61 -0
  309. data/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +28 -0
  310. data/vendor/rails/activesupport/lib/active_support/test_case.rb +9 -8
  311. data/vendor/rails/activesupport/lib/active_support/testing/deprecation.rb +2 -0
  312. data/vendor/rails/activesupport/lib/active_support/time_with_zone.rb +9 -8
  313. data/vendor/rails/activesupport/lib/active_support/vendor.rb +6 -7
  314. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -1
  315. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -1
  316. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -1
  317. data/vendor/rails/activesupport/lib/active_support/vendor/{memcache-client-1.6.5 → memcache-client-1.7.4}/memcache.rb +242 -70
  318. data/vendor/rails/activesupport/lib/active_support/version.rb +1 -1
  319. data/vendor/rails/activesupport/lib/active_support/xml_mini/jdom.rb +162 -0
  320. data/vendor/rails/railties/CHANGELOG +10 -0
  321. data/vendor/rails/railties/Rakefile +13 -9
  322. data/vendor/rails/railties/bin/about +2 -2
  323. data/vendor/rails/railties/bin/console +1 -1
  324. data/vendor/rails/railties/bin/dbconsole +1 -1
  325. data/vendor/rails/railties/bin/destroy +1 -1
  326. data/vendor/rails/railties/bin/generate +1 -1
  327. data/vendor/rails/railties/bin/performance/benchmarker +1 -1
  328. data/vendor/rails/railties/bin/performance/profiler +1 -1
  329. data/vendor/rails/railties/bin/plugin +1 -1
  330. data/vendor/rails/railties/bin/runner +1 -1
  331. data/vendor/rails/railties/bin/server +1 -1
  332. data/vendor/rails/railties/builtin/rails_info/rails/info.rb +4 -2
  333. data/vendor/rails/railties/configs/initializers/new_rails_defaults.rb +2 -0
  334. data/vendor/rails/railties/configs/routes.rb +1 -1
  335. data/vendor/rails/railties/configs/seeds.rb +7 -0
  336. data/vendor/rails/railties/environments/boot.rb +1 -1
  337. data/vendor/rails/railties/guides/files/javascripts/code_highlighter.js +188 -0
  338. data/vendor/rails/railties/guides/files/javascripts/guides.js +8 -0
  339. data/vendor/rails/railties/guides/files/javascripts/highlighters.js +90 -0
  340. data/vendor/rails/railties/guides/files/stylesheets/main.css +441 -0
  341. data/vendor/rails/railties/guides/files/stylesheets/print.css +52 -0
  342. data/vendor/rails/railties/guides/files/stylesheets/reset.css +43 -0
  343. data/vendor/rails/railties/guides/files/stylesheets/style.css +13 -0
  344. data/vendor/rails/railties/guides/files/stylesheets/syntax.css +31 -0
  345. data/vendor/rails/railties/guides/images/belongs_to.png +0 -0
  346. data/vendor/rails/railties/guides/images/book_icon.gif +0 -0
  347. data/vendor/rails/railties/guides/images/bullet.gif +0 -0
  348. data/vendor/rails/railties/guides/images/chapters_icon.gif +0 -0
  349. data/vendor/rails/railties/guides/images/check_bullet.gif +0 -0
  350. data/vendor/rails/railties/guides/images/credits_pic_blank.gif +0 -0
  351. data/vendor/rails/railties/guides/images/csrf.png +0 -0
  352. data/vendor/rails/railties/guides/images/customized_error_messages.png +0 -0
  353. data/vendor/rails/railties/guides/images/error_messages.png +0 -0
  354. data/vendor/rails/railties/guides/images/feature_tile.gif +0 -0
  355. data/vendor/rails/railties/guides/images/footer_tile.gif +0 -0
  356. data/vendor/rails/railties/guides/images/fxn.jpg +0 -0
  357. data/vendor/rails/railties/guides/images/grey_bullet.gif +0 -0
  358. data/vendor/rails/railties/guides/images/habtm.png +0 -0
  359. data/vendor/rails/railties/guides/images/has_many.png +0 -0
  360. data/vendor/rails/railties/guides/images/has_many_through.png +0 -0
  361. data/vendor/rails/railties/guides/images/has_one.png +0 -0
  362. data/vendor/rails/railties/guides/images/has_one_through.png +0 -0
  363. data/vendor/rails/railties/guides/images/header_backdrop.png +0 -0
  364. data/vendor/rails/railties/guides/images/header_tile.gif +0 -0
  365. data/vendor/rails/railties/guides/images/i18n/demo_localized_pirate.png +0 -0
  366. data/vendor/rails/railties/guides/images/i18n/demo_translated_en.png +0 -0
  367. data/vendor/rails/railties/guides/images/i18n/demo_translated_pirate.png +0 -0
  368. data/vendor/rails/railties/guides/images/i18n/demo_translation_missing.png +0 -0
  369. data/vendor/rails/railties/guides/images/i18n/demo_untranslated.png +0 -0
  370. data/vendor/rails/railties/guides/images/icons/README +5 -0
  371. data/vendor/rails/railties/guides/images/icons/callouts/1.png +0 -0
  372. data/vendor/rails/railties/guides/images/icons/callouts/10.png +0 -0
  373. data/vendor/rails/railties/guides/images/icons/callouts/11.png +0 -0
  374. data/vendor/rails/railties/guides/images/icons/callouts/12.png +0 -0
  375. data/vendor/rails/railties/guides/images/icons/callouts/13.png +0 -0
  376. data/vendor/rails/railties/guides/images/icons/callouts/14.png +0 -0
  377. data/vendor/rails/railties/guides/images/icons/callouts/15.png +0 -0
  378. data/vendor/rails/railties/guides/images/icons/callouts/2.png +0 -0
  379. data/vendor/rails/railties/guides/images/icons/callouts/3.png +0 -0
  380. data/vendor/rails/railties/guides/images/icons/callouts/4.png +0 -0
  381. data/vendor/rails/railties/guides/images/icons/callouts/5.png +0 -0
  382. data/vendor/rails/railties/guides/images/icons/callouts/6.png +0 -0
  383. data/vendor/rails/railties/guides/images/icons/callouts/7.png +0 -0
  384. data/vendor/rails/railties/guides/images/icons/callouts/8.png +0 -0
  385. data/vendor/rails/railties/guides/images/icons/callouts/9.png +0 -0
  386. data/vendor/rails/railties/guides/images/icons/caution.png +0 -0
  387. data/vendor/rails/railties/guides/images/icons/example.png +0 -0
  388. data/vendor/rails/railties/guides/images/icons/home.png +0 -0
  389. data/vendor/rails/railties/guides/images/icons/important.png +0 -0
  390. data/vendor/rails/railties/guides/images/icons/next.png +0 -0
  391. data/vendor/rails/railties/guides/images/icons/note.png +0 -0
  392. data/vendor/rails/railties/guides/images/icons/prev.png +0 -0
  393. data/vendor/rails/railties/guides/images/icons/tip.png +0 -0
  394. data/vendor/rails/railties/guides/images/icons/up.png +0 -0
  395. data/vendor/rails/railties/guides/images/icons/warning.png +0 -0
  396. data/vendor/rails/railties/guides/images/nav_arrow.gif +0 -0
  397. data/vendor/rails/railties/guides/images/polymorphic.png +0 -0
  398. data/vendor/rails/railties/guides/images/posts_index.png +0 -0
  399. data/vendor/rails/railties/guides/images/rails_guides_logo.gif +0 -0
  400. data/vendor/rails/railties/guides/images/rails_logo_remix.gif +0 -0
  401. data/vendor/rails/railties/guides/images/rails_welcome.png +0 -0
  402. data/vendor/rails/railties/guides/images/session_fixation.png +0 -0
  403. data/vendor/rails/railties/guides/images/tab_grey.gif +0 -0
  404. data/vendor/rails/railties/guides/images/tab_info.gif +0 -0
  405. data/vendor/rails/railties/guides/images/tab_note.gif +0 -0
  406. data/vendor/rails/railties/guides/images/tab_red.gif +0 -0
  407. data/vendor/rails/railties/guides/images/tab_yellow.gif +0 -0
  408. data/vendor/rails/railties/guides/images/tab_yellow.png +0 -0
  409. data/vendor/rails/railties/guides/images/validation_error_messages.png +0 -0
  410. data/vendor/rails/railties/guides/rails_guides.rb +42 -0
  411. data/vendor/rails/railties/guides/rails_guides/generator.rb +138 -0
  412. data/vendor/rails/railties/guides/rails_guides/helpers.rb +34 -0
  413. data/vendor/rails/railties/guides/rails_guides/indexer.rb +55 -0
  414. data/vendor/rails/railties/guides/rails_guides/textile_extensions.rb +41 -0
  415. data/vendor/rails/railties/guides/source/2_2_release_notes.textile +422 -0
  416. data/vendor/rails/railties/guides/source/2_3_release_notes.textile +610 -0
  417. data/vendor/rails/railties/guides/source/action_controller_overview.textile +776 -0
  418. data/vendor/rails/railties/guides/source/action_mailer_basics.textile +424 -0
  419. data/vendor/rails/railties/guides/source/active_record_basics.textile +135 -0
  420. data/vendor/rails/railties/guides/source/active_record_querying.textile +969 -0
  421. data/vendor/rails/railties/guides/source/activerecord_validations_callbacks.textile +1086 -0
  422. data/vendor/rails/railties/guides/source/association_basics.textile +1781 -0
  423. data/vendor/rails/railties/guides/source/caching_with_rails.textile +524 -0
  424. data/vendor/rails/railties/guides/source/command_line.textile +589 -0
  425. data/vendor/rails/railties/guides/source/configuring.textile +234 -0
  426. data/vendor/rails/railties/guides/source/contribute.textile +71 -0
  427. data/vendor/rails/railties/guides/source/contributing_to_rails.textile +239 -0
  428. data/vendor/rails/railties/guides/source/credits.erb.textile +52 -0
  429. data/vendor/rails/railties/guides/source/debugging_rails_applications.textile +709 -0
  430. data/vendor/rails/railties/guides/source/form_helpers.textile +766 -0
  431. data/vendor/rails/railties/guides/source/getting_started.textile +1297 -0
  432. data/vendor/rails/railties/guides/source/i18n.textile +912 -0
  433. data/vendor/rails/railties/guides/source/index.erb.textile +124 -0
  434. data/vendor/rails/railties/guides/source/layout.html.erb +103 -0
  435. data/vendor/rails/railties/guides/source/layouts_and_rendering.textile +979 -0
  436. data/vendor/rails/railties/guides/source/migrations.textile +591 -0
  437. data/vendor/rails/railties/guides/source/nested_model_forms.textile +222 -0
  438. data/vendor/rails/railties/guides/source/performance_testing.textile +531 -0
  439. data/vendor/rails/railties/guides/source/plugins.textile +1512 -0
  440. data/vendor/rails/railties/guides/source/rails_on_rack.textile +309 -0
  441. data/vendor/rails/railties/guides/source/routing.textile +903 -0
  442. data/vendor/rails/railties/guides/source/security.textile +986 -0
  443. data/vendor/rails/railties/guides/source/testing.textile +951 -0
  444. data/vendor/rails/railties/lib/commands/dbconsole.rb +8 -4
  445. data/vendor/rails/railties/lib/commands/performance/profiler.rb +1 -1
  446. data/vendor/rails/railties/lib/initializer.rb +27 -4
  447. data/vendor/rails/railties/lib/rails/gem_dependency.rb +35 -6
  448. data/vendor/rails/railties/lib/rails/plugin.rb +12 -0
  449. data/vendor/rails/railties/lib/rails/plugin/loader.rb +7 -0
  450. data/vendor/rails/railties/lib/rails/rack/metal.rb +1 -1
  451. data/vendor/rails/railties/lib/rails/version.rb +1 -1
  452. data/vendor/rails/railties/lib/rails_generator/base.rb +1 -1
  453. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +5 -0
  454. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/template_runner.rb +1 -1
  455. data/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +9 -2
  456. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +1 -0
  457. data/vendor/rails/railties/lib/tasks/databases.rake +17 -4
  458. data/vendor/rails/railties/lib/tasks/gems.rake +19 -6
  459. data/vendor/rails/railties/lib/tasks/routes.rake +4 -3
  460. data/vendor/rails/railties/lib/test_help.rb +4 -1
  461. metadata +158 -58
  462. data/spec/lib/local_time_spec.rb +0 -40
  463. data/vendor/rails/actionpack/lib/action_controller/rewindable_input.rb +0 -28
  464. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack.rb +0 -89
  465. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/adapter/camping.rb +0 -22
  466. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/handler.rb +0 -37
  467. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/request.rb +0 -37
  468. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/basic.rb +0 -58
  469. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/md5.rb +0 -124
  470. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/nonce.rb +0 -51
  471. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/params.rb +0 -55
  472. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/request.rb +0 -40
  473. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/openid.rb +0 -480
  474. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/builder.rb +0 -63
  475. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/cascade.rb +0 -36
  476. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/chunked.rb +0 -49
  477. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/commonlogger.rb +0 -61
  478. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/conditionalget.rb +0 -45
  479. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_length.rb +0 -29
  480. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_type.rb +0 -23
  481. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/deflater.rb +0 -85
  482. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/directory.rb +0 -153
  483. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/file.rb +0 -88
  484. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler.rb +0 -48
  485. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/cgi.rb +0 -61
  486. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/evented_mongrel.rb +0 -8
  487. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/fastcgi.rb +0 -89
  488. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/lsws.rb +0 -55
  489. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb +0 -84
  490. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/scgi.rb +0 -59
  491. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/swiftiplied_mongrel.rb +0 -8
  492. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/thin.rb +0 -18
  493. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/webrick.rb +0 -67
  494. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/head.rb +0 -19
  495. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lint.rb +0 -462
  496. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lobster.rb +0 -65
  497. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lock.rb +0 -16
  498. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/methodoverride.rb +0 -27
  499. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mime.rb +0 -204
  500. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mock.rb +0 -160
  501. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/recursive.rb +0 -57
  502. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/reloader.rb +0 -64
  503. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/request.rb +0 -241
  504. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/response.rb +0 -179
  505. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/abstract/id.rb +0 -142
  506. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/cookie.rb +0 -91
  507. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/memcache.rb +0 -109
  508. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/pool.rb +0 -100
  509. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showexceptions.rb +0 -349
  510. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showstatus.rb +0 -106
  511. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/static.rb +0 -38
  512. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/urlmap.rb +0 -55
  513. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/utils.rb +0 -392
@@ -1,3 +1,4 @@
1
+ # encoding: binary
1
2
  require 'active_record/connection_adapters/abstract_adapter'
2
3
 
3
4
  module ActiveRecord
@@ -15,6 +16,10 @@ module ActiveRecord
15
16
  db.results_as_hash = true if defined? SQLite::Version
16
17
  db.type_translation = false
17
18
 
19
+ message = "Support for SQLite2Adapter and DeprecatedSQLiteAdapter has been removed from Rails 3. "
20
+ message << "You should migrate to SQLite 3+ or use the plugin from git://github.com/rails/sqlite2_adapter.git with Rails 3."
21
+ ActiveSupport::Deprecation.warn(message)
22
+
18
23
  # "Downgrade" deprecated sqlite API
19
24
  if SQLite.const_defined?(:Version)
20
25
  ConnectionAdapters::SQLite2Adapter.new(db, logger, config)
@@ -26,6 +31,10 @@ module ActiveRecord
26
31
 
27
32
  private
28
33
  def parse_sqlite_config!(config)
34
+ if config.include?(:dbfile)
35
+ ActiveSupport::Deprecation.warn "Please update config/database.yml to use 'database' instead of 'dbfile'"
36
+ end
37
+
29
38
  config[:database] ||= config[:dbfile]
30
39
  # Require database.
31
40
  unless config[:database]
@@ -46,6 +55,7 @@ module ActiveRecord
46
55
  class SQLiteColumn < Column #:nodoc:
47
56
  class << self
48
57
  def string_to_binary(value)
58
+ value = value.dup.force_encoding(Encoding::BINARY) if value.respond_to?(:force_encoding)
49
59
  value.gsub(/\0|\%/n) do |b|
50
60
  case b
51
61
  when "\0" then "%00"
@@ -55,6 +65,7 @@ module ActiveRecord
55
65
  end
56
66
 
57
67
  def binary_to_string(value)
68
+ value = value.dup.force_encoding(Encoding::BINARY) if value.respond_to?(:force_encoding)
58
69
  value.gsub(/%00|%25/n) do |b|
59
70
  case b
60
71
  when "%00" then "\0"
@@ -101,6 +112,10 @@ module ActiveRecord
101
112
  true
102
113
  end
103
114
 
115
+ def supports_primary_key? #:nodoc:
116
+ true
117
+ end
118
+
104
119
  def requires_reloading?
105
120
  true
106
121
  end
@@ -143,7 +143,7 @@ module ActiveRecord
143
143
  if partial_updates?
144
144
  # Serialized attributes should always be written in case they've been
145
145
  # changed in place.
146
- update_without_dirty(changed | self.class.serialized_attributes.keys)
146
+ update_without_dirty(changed | (attributes.keys & self.class.serialized_attributes.keys))
147
147
  else
148
148
  update_without_dirty
149
149
  end
@@ -1,6 +1,7 @@
1
1
  require 'erb'
2
2
  require 'yaml'
3
3
  require 'csv'
4
+ require 'zlib'
4
5
  require 'active_support/dependencies'
5
6
  require 'active_support/test_case'
6
7
 
@@ -433,6 +434,7 @@ end
433
434
  # Any fixture labeled "DEFAULTS" is safely ignored.
434
435
 
435
436
  class Fixtures < (RUBY_VERSION < '1.9' ? YAML::Omap : Hash)
437
+ MAX_ID = 2 ** 31 - 1
436
438
  DEFAULT_FILTER_RE = /\.ya?ml$/
437
439
 
438
440
  @@all_cached_fixtures = {}
@@ -524,11 +526,10 @@ class Fixtures < (RUBY_VERSION < '1.9' ? YAML::Omap : Hash)
524
526
  cached_fixtures(connection, table_names)
525
527
  end
526
528
 
527
- # Returns a consistent identifier for +label+. This will always
528
- # be a positive integer, and will always be the same for a given
529
- # label, assuming the same OS, platform, and version of Ruby.
529
+ # Returns a consistent, platform-independent identifier for +label+.
530
+ # Identifiers are positive integers less than 2^32.
530
531
  def self.identify(label)
531
- label.to_s.hash.abs
532
+ Zlib.crc32(label.to_s) % MAX_ID
532
533
  end
533
534
 
534
535
  attr_reader :table_name, :name
@@ -620,7 +621,8 @@ class Fixtures < (RUBY_VERSION < '1.9' ? YAML::Omap : Hash)
620
621
  targets.each do |target|
621
622
  join_fixtures["#{label}_#{target}"] = Fixture.new(
622
623
  { association.primary_key_name => row[primary_key_name],
623
- association.association_foreign_key => Fixtures.identify(target) }, nil)
624
+ association.association_foreign_key => Fixtures.identify(target) },
625
+ nil, @connection)
624
626
  end
625
627
  end
626
628
  end
@@ -704,12 +706,12 @@ class Fixtures < (RUBY_VERSION < '1.9' ? YAML::Omap : Hash)
704
706
 
705
707
  yaml_value.each do |fixture|
706
708
  raise Fixture::FormatError, "Bad data for #{@class_name} fixture named #{fixture}" unless fixture.respond_to?(:each)
707
- fixture.each do |name, data|
709
+ fixture.each do |name, data|
708
710
  unless data
709
711
  raise Fixture::FormatError, "Bad data for #{@class_name} fixture named #{name} (nil)"
710
712
  end
711
713
 
712
- self[name] = Fixture.new(data, model_class)
714
+ self[name] = Fixture.new(data, model_class, @connection)
713
715
  end
714
716
  end
715
717
  end
@@ -722,7 +724,7 @@ class Fixtures < (RUBY_VERSION < '1.9' ? YAML::Omap : Hash)
722
724
  reader.each do |row|
723
725
  data = {}
724
726
  row.each_with_index { |cell, j| data[header[j].to_s.strip] = cell.to_s.strip }
725
- self["#{@class_name.to_s.underscore}_#{i+=1}"] = Fixture.new(data, model_class)
727
+ self["#{@class_name.to_s.underscore}_#{i+=1}"] = Fixture.new(data, model_class, @connection)
726
728
  end
727
729
  end
728
730
 
@@ -760,7 +762,8 @@ class Fixture #:nodoc:
760
762
 
761
763
  attr_reader :model_class
762
764
 
763
- def initialize(fixture, model_class)
765
+ def initialize(fixture, model_class, connection = ActiveRecord::Base.connection)
766
+ @connection = connection
764
767
  @fixture = fixture
765
768
  @model_class = model_class.is_a?(Class) ? model_class : model_class.constantize rescue nil
766
769
  end
@@ -782,14 +785,14 @@ class Fixture #:nodoc:
782
785
  end
783
786
 
784
787
  def key_list
785
- columns = @fixture.keys.collect{ |column_name| ActiveRecord::Base.connection.quote_column_name(column_name) }
788
+ columns = @fixture.keys.collect{ |column_name| @connection.quote_column_name(column_name) }
786
789
  columns.join(", ")
787
790
  end
788
791
 
789
792
  def value_list
790
793
  list = @fixture.inject([]) do |fixtures, (key, value)|
791
794
  col = model_class.columns_hash[key] if model_class.respond_to?(:ancestors) && model_class.ancestors.include?(ActiveRecord::Base)
792
- fixtures << ActiveRecord::Base.connection.quote(value, col).gsub('[^\]\\n', "\n").gsub('[^\]\\r', "\r")
795
+ fixtures << @connection.quote(value, col).gsub('[^\]\\n', "\n").gsub('[^\]\\r', "\r")
793
796
  end
794
797
  list * ', '
795
798
  end
@@ -10,7 +10,7 @@ module I18n
10
10
 
11
11
  protected
12
12
  def interpolate_with_deprecated_syntax(locale, string, values = {})
13
- return string unless string.is_a?(String)
13
+ return string unless string.is_a?(String) && !values.empty?
14
14
 
15
15
  string = string.gsub(/%d|%s/) do |s|
16
16
  instead = DEPRECATED_INTERPOLATORS[s]
@@ -23,8 +23,12 @@ en:
23
23
  less_than_or_equal_to: "must be less than or equal to {{count}}"
24
24
  odd: "must be odd"
25
25
  even: "must be even"
26
+ record_invalid: "Validation failed: {{errors}}"
26
27
  # Append your own errors here or at the model/attributes scope.
27
28
 
29
+ full_messages:
30
+ format: "{{attribute}} {{message}}"
31
+
28
32
  # You can define own errors for models or model attributes.
29
33
  # The values :model, :attribute and :value are always available for interpolation.
30
34
  #
@@ -89,12 +89,7 @@ module ActiveRecord
89
89
  when Hash
90
90
  options
91
91
  when Proc
92
- case parent_scope
93
- when Scope
94
- with_scope(:find => parent_scope.proxy_options) { options.call(*args) }
95
- else
96
- options.call(*args)
97
- end
92
+ options.call(*args)
98
93
  end, &block)
99
94
  end
100
95
  (class << self; self end).instance_eval do
@@ -114,7 +109,7 @@ module ActiveRecord
114
109
  end
115
110
  end
116
111
 
117
- delegate :scopes, :with_scope, :to => :proxy_scope
112
+ delegate :scopes, :with_scope, :scoped_methods, :to => :proxy_scope
118
113
 
119
114
  def initialize(proxy_scope, options, &block)
120
115
  options ||= {}
@@ -178,7 +173,7 @@ module ActiveRecord
178
173
  else
179
174
  with_scope({:find => proxy_options, :create => proxy_options[:conditions].is_a?(Hash) ? proxy_options[:conditions] : {}}, :reverse_merge) do
180
175
  method = :new if method == :build
181
- if current_scoped_methods_when_defined
176
+ if current_scoped_methods_when_defined && !scoped_methods.include?(current_scoped_methods_when_defined)
182
177
  with_scope current_scoped_methods_when_defined do
183
178
  proxy_scope.send(method, *args, &block)
184
179
  end
@@ -297,7 +297,7 @@ module ActiveRecord
297
297
  raise HasManyThroughAssociationPolymorphicError.new(active_record.name, self, source_reflection)
298
298
  end
299
299
 
300
- unless [:belongs_to, :has_many].include?(source_reflection.macro) && source_reflection.options[:through].nil?
300
+ unless [:belongs_to, :has_many, :has_one].include?(source_reflection.macro) && source_reflection.options[:through].nil?
301
301
  raise HasManyThroughSourceAssociationMacroError.new(self)
302
302
  end
303
303
  end
@@ -78,11 +78,13 @@ HEADER
78
78
  begin
79
79
  tbl = StringIO.new
80
80
 
81
+ # first dump primary key column
81
82
  if @connection.respond_to?(:pk_and_sequence_for)
82
83
  pk, pk_seq = @connection.pk_and_sequence_for(table)
84
+ elsif @connection.respond_to?(:primary_key)
85
+ pk = @connection.primary_key(table)
83
86
  end
84
- pk ||= 'id'
85
-
87
+
86
88
  tbl.print " create_table #{table.inspect}"
87
89
  if columns.detect { |c| c.name == pk }
88
90
  if pk != 'id'
@@ -94,6 +96,7 @@ HEADER
94
96
  tbl.print ", :force => true"
95
97
  tbl.puts " do |t|"
96
98
 
99
+ # then dump all non-primary key columns
97
100
  column_specs = columns.map do |column|
98
101
  raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" if @types[column.type].nil?
99
102
  next if column.name == pk
@@ -176,4 +179,4 @@ HEADER
176
179
  end
177
180
  end
178
181
  end
179
- end
182
+ end
@@ -5,8 +5,9 @@ module ActiveRecord #:nodoc:
5
5
  class Serializer #:nodoc:
6
6
  attr_reader :options
7
7
 
8
- def initialize(record, options = {})
9
- @record, @options = record, options.dup
8
+ def initialize(record, options = nil)
9
+ @record = record
10
+ @options = options ? options.dup : {}
10
11
  end
11
12
 
12
13
  # To replicate the behavior in ActiveRecord#attributes,
@@ -1,8 +1,10 @@
1
+ require 'active_support/json'
2
+ require 'active_support/core_ext/module/model_naming'
3
+
1
4
  module ActiveRecord #:nodoc:
2
5
  module Serialization
3
6
  def self.included(base)
4
7
  base.cattr_accessor :include_root_in_json, :instance_writer => false
5
- base.extend ClassMethods
6
8
  end
7
9
 
8
10
  # Returns a JSON string representing the model. Some configuration is
@@ -72,28 +74,18 @@ module ActiveRecord #:nodoc:
72
74
  # {"comments": [{"body": "Don't think too hard"}],
73
75
  # "title": "So I was thinking"}]}
74
76
  def to_json(options = {})
75
- if include_root_in_json
76
- "{#{self.class.json_class_name}: #{JsonSerializer.new(self, options).to_s}}"
77
- else
78
- JsonSerializer.new(self, options).to_s
79
- end
77
+ super
78
+ end
79
+
80
+ def as_json(options = nil) #:nodoc:
81
+ hash = Serializer.new(self, options).serializable_record
82
+ hash = { self.class.model_name.element => hash } if include_root_in_json
83
+ hash
80
84
  end
81
85
 
82
86
  def from_json(json)
83
87
  self.attributes = ActiveSupport::JSON.decode(json)
84
88
  self
85
89
  end
86
-
87
- class JsonSerializer < ActiveRecord::Serialization::Serializer #:nodoc:
88
- def serialize
89
- serializable_record.to_json
90
- end
91
- end
92
-
93
- module ClassMethods
94
- def json_class_name
95
- @json_class_name ||= name.demodulize.underscore.inspect
96
- end
97
- end
98
90
  end
99
91
  end
@@ -178,7 +178,7 @@ module ActiveRecord #:nodoc:
178
178
  end
179
179
 
180
180
  def root
181
- root = (options[:root] || @record.class.to_s.underscore).to_s
181
+ root = (options[:root] || @record.class.model_name.singular).to_s
182
182
  reformat_name(root)
183
183
  end
184
184
 
@@ -320,7 +320,11 @@ module ActiveRecord #:nodoc:
320
320
 
321
321
  protected
322
322
  def compute_type
323
- type = @record.class.serialized_attributes.has_key?(name) ? :yaml : @record.class.columns_hash[name].type
323
+ type = if @record.class.serialized_attributes.has_key?(name)
324
+ :yaml
325
+ else
326
+ @record.class.columns_hash[name].try(:type)
327
+ end
324
328
 
325
329
  case type
326
330
  when :text
@@ -295,7 +295,7 @@ module ActiveRecord
295
295
 
296
296
  def set_session(env, sid, session_data)
297
297
  Base.silence do
298
- record = env[SESSION_RECORD_KEY] ||= find_session(sid)
298
+ record = get_session_model(env, sid)
299
299
  record.data = session_data
300
300
  return false unless record.save
301
301
 
@@ -309,6 +309,14 @@ module ActiveRecord
309
309
 
310
310
  return true
311
311
  end
312
+
313
+ def get_session_model(env, sid)
314
+ if env[ENV_SESSION_OPTIONS_KEY][:id].nil?
315
+ env[SESSION_RECORD_KEY] = find_session(sid)
316
+ else
317
+ env[SESSION_RECORD_KEY] ||= find_session(sid)
318
+ end
319
+ end
312
320
 
313
321
  def find_session(id)
314
322
  @@session_class.find_by_session_id(id) ||
@@ -15,27 +15,57 @@ module ActiveRecord
15
15
  base.class_inheritable_accessor :record_timestamps, :instance_writer => false
16
16
  base.record_timestamps = true
17
17
  end
18
+
19
+ # Saves the record with the updated_at/on attributes set to the current time.
20
+ # If the save fails because of validation errors, an ActiveRecord::RecordInvalid exception is raised.
21
+ # If an attribute name is passed, that attribute is used for the touch instead of the updated_at/on attributes.
22
+ #
23
+ # Examples:
24
+ #
25
+ # product.touch # updates updated_at
26
+ # product.touch(:designed_at) # updates the designed_at attribute
27
+ def touch(attribute = nil)
28
+ current_time = current_time_from_proper_timezone
29
+
30
+ if attribute
31
+ write_attribute(attribute, current_time)
32
+ else
33
+ write_attribute('updated_at', current_time) if respond_to?(:updated_at)
34
+ write_attribute('updated_on', current_time) if respond_to?(:updated_on)
35
+ end
36
+
37
+ save!
38
+ end
39
+
18
40
 
19
41
  private
20
42
  def create_with_timestamps #:nodoc:
21
43
  if record_timestamps
22
- t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
23
- write_attribute('created_at', t) if respond_to?(:created_at) && created_at.nil?
24
- write_attribute('created_on', t) if respond_to?(:created_on) && created_on.nil?
44
+ current_time = current_time_from_proper_timezone
25
45
 
26
- write_attribute('updated_at', t) if respond_to?(:updated_at) && updated_at.nil?
27
- write_attribute('updated_on', t) if respond_to?(:updated_on) && updated_on.nil?
46
+ write_attribute('created_at', current_time) if respond_to?(:created_at) && created_at.nil?
47
+ write_attribute('created_on', current_time) if respond_to?(:created_on) && created_on.nil?
48
+
49
+ write_attribute('updated_at', current_time) if respond_to?(:updated_at) && updated_at.nil?
50
+ write_attribute('updated_on', current_time) if respond_to?(:updated_on) && updated_on.nil?
28
51
  end
52
+
29
53
  create_without_timestamps
30
54
  end
31
55
 
32
56
  def update_with_timestamps(*args) #:nodoc:
33
57
  if record_timestamps && (!partial_updates? || changed?)
34
- t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
35
- write_attribute('updated_at', t) if respond_to?(:updated_at)
36
- write_attribute('updated_on', t) if respond_to?(:updated_on)
58
+ current_time = current_time_from_proper_timezone
59
+
60
+ write_attribute('updated_at', current_time) if respond_to?(:updated_at)
61
+ write_attribute('updated_on', current_time) if respond_to?(:updated_on)
37
62
  end
63
+
38
64
  update_without_timestamps(*args)
39
65
  end
66
+
67
+ def current_time_from_proper_timezone
68
+ self.class.default_timezone == :utc ? Time.now.utc : Time.now
69
+ end
40
70
  end
41
- end
71
+ end
@@ -10,15 +10,122 @@ module ActiveRecord
10
10
  attr_reader :record
11
11
  def initialize(record)
12
12
  @record = record
13
- super("Validation failed: #{@record.errors.full_messages.join(", ")}")
13
+ errors = @record.errors.full_messages.join(I18n.t('support.array.words_connector', :default => ', '))
14
+ super(I18n.t('activerecord.errors.messages.record_invalid', :errors => errors))
14
15
  end
15
16
  end
16
17
 
18
+ class Error
19
+ attr_accessor :base, :attribute, :type, :message, :options
20
+
21
+ def initialize(base, attribute, type = nil, options = {})
22
+ self.base = base
23
+ self.attribute = attribute
24
+ self.type = type || :invalid
25
+ self.options = options
26
+ self.message = options.delete(:message) || self.type
27
+ end
28
+
29
+ def message
30
+ generate_message(@message, options.dup)
31
+ end
32
+
33
+ def full_message
34
+ attribute.to_s == 'base' ? message : generate_full_message(message, options.dup)
35
+ end
36
+
37
+ alias :to_s :message
38
+
39
+ def value
40
+ @base.respond_to?(attribute) ? @base.send(attribute) : nil
41
+ end
42
+
43
+ protected
44
+
45
+ # Translates an error message in it's default scope (<tt>activerecord.errrors.messages</tt>).
46
+ # Error messages are first looked up in <tt>models.MODEL.attributes.ATTRIBUTE.MESSAGE</tt>, if it's not there,
47
+ # it's looked up in <tt>models.MODEL.MESSAGE</tt> and if that is not there it returns the translation of the
48
+ # default message (e.g. <tt>activerecord.errors.messages.MESSAGE</tt>). The translated model name,
49
+ # translated attribute name and the value are available for interpolation.
50
+ #
51
+ # When using inheritence in your models, it will check all the inherited models too, but only if the model itself
52
+ # hasn't been found. Say you have <tt>class Admin < User; end</tt> and you wanted the translation for the <tt>:blank</tt>
53
+ # error +message+ for the <tt>title</tt> +attribute+, it looks for these translations:
54
+ #
55
+ # <ol>
56
+ # <li><tt>activerecord.errors.models.admin.attributes.title.blank</tt></li>
57
+ # <li><tt>activerecord.errors.models.admin.blank</tt></li>
58
+ # <li><tt>activerecord.errors.models.user.attributes.title.blank</tt></li>
59
+ # <li><tt>activerecord.errors.models.user.blank</tt></li>
60
+ # <li><tt>activerecord.errors.messages.blank</tt></li>
61
+ # <li>any default you provided through the +options+ hash (in the activerecord.errors scope)</li>
62
+ # </ol>
63
+ def generate_message(message, options = {})
64
+ keys = @base.class.self_and_descendants_from_active_record.map do |klass|
65
+ [ :"models.#{klass.name.underscore}.attributes.#{attribute}.#{message}",
66
+ :"models.#{klass.name.underscore}.#{message}" ]
67
+ end.flatten
68
+
69
+ keys << options.delete(:default)
70
+ keys << :"messages.#{message}"
71
+ keys << message if message.is_a?(String)
72
+ keys << @type unless @type == message
73
+ keys.compact!
74
+
75
+ options.reverse_merge! :default => keys,
76
+ :scope => [:activerecord, :errors],
77
+ :model => @base.class.human_name,
78
+ :attribute => @base.class.human_attribute_name(attribute.to_s),
79
+ :value => value
80
+
81
+ I18n.translate(keys.shift, options)
82
+ end
83
+
84
+ # Wraps an error message into a full_message format.
85
+ #
86
+ # The default full_message format for any locale is <tt>"{{attribute}} {{message}}"</tt>.
87
+ # One can specify locale specific default full_message format by storing it as a
88
+ # translation for the key <tt>:"activerecord.errors.full_messages.format"</tt>.
89
+ #
90
+ # Additionally one can specify a validation specific error message format by
91
+ # storing a translation for <tt>:"activerecord.errors.full_messages.[message_key]"</tt>.
92
+ # E.g. the full_message format for any validation that uses :blank as a message
93
+ # key (such as validates_presence_of) can be stored to <tt>:"activerecord.errors.full_messages.blank".</tt>
94
+ #
95
+ # Because the message key used by a validation can be overwritten on the
96
+ # <tt>validates_*</tt> class macro level one can customize the full_message format for
97
+ # any particular validation:
98
+ #
99
+ # # app/models/article.rb
100
+ # class Article < ActiveRecord::Base
101
+ # validates_presence_of :title, :message => :"title.blank"
102
+ # end
103
+ #
104
+ # # config/locales/en.yml
105
+ # en:
106
+ # activerecord:
107
+ # errors:
108
+ # full_messages:
109
+ # title:
110
+ # blank: This title is screwed!
111
+ def generate_full_message(message, options = {})
112
+ options.reverse_merge! :message => self.message,
113
+ :model => @base.class.human_name,
114
+ :attribute => @base.class.human_attribute_name(attribute.to_s),
115
+ :value => value
116
+
117
+ key = :"full_messages.#{@message}"
118
+ defaults = [:'full_messages.format', '{{attribute}} {{message}}']
119
+
120
+ I18n.t(key, options.merge(:default => defaults, :scope => [:activerecord, :errors]))
121
+ end
122
+ end
123
+
17
124
  # Active Record validation is reported to and from this object, which is used by Base#save to
18
125
  # determine whether the object is in a valid state to be saved. See usage example in Validations.
19
126
  class Errors
20
127
  include Enumerable
21
-
128
+
22
129
  class << self
23
130
  def default_error_messages
24
131
  ActiveSupport::Deprecation.warn("ActiveRecord::Errors.default_error_messages has been deprecated. Please use I18n.translate('activerecord.errors.messages').")
@@ -43,11 +150,19 @@ module ActiveRecord
43
150
  # error can be added to the same +attribute+ in which case an array will be returned on a call to <tt>on(attribute)</tt>.
44
151
  # If no +messsage+ is supplied, :invalid is assumed.
45
152
  # If +message+ is a Symbol, it will be translated, using the appropriate scope (see translate_error).
46
- def add(attribute, message = nil, options = {})
47
- message ||= :invalid
48
- message = generate_message(attribute, message, options) if message.is_a?(Symbol)
153
+ # def add(attribute, message = nil, options = {})
154
+ # message ||= :invalid
155
+ # message = generate_message(attribute, message, options)) if message.is_a?(Symbol)
156
+ # @errors[attribute.to_s] ||= []
157
+ # @errors[attribute.to_s] << message
158
+ # end
159
+
160
+ def add(error_or_attr, message = nil, options = {})
161
+ error, attribute = error_or_attr.is_a?(Error) ? [error_or_attr, error_or_attr.attribute] : [nil, error_or_attr]
162
+ options[:message] = options.delete(:default) if options.has_key?(:default)
163
+
49
164
  @errors[attribute.to_s] ||= []
50
- @errors[attribute.to_s] << message
165
+ @errors[attribute.to_s] << (error || Error.new(@base, attribute, message, options))
51
166
  end
52
167
 
53
168
  # Will add an error message to each of the attributes in +attributes+ that is empty.
@@ -66,49 +181,6 @@ module ActiveRecord
66
181
  add(attr, :blank, :default => custom_message) if value.blank?
67
182
  end
68
183
  end
69
-
70
- # Translates an error message in it's default scope (<tt>activerecord.errrors.messages</tt>).
71
- # Error messages are first looked up in <tt>models.MODEL.attributes.ATTRIBUTE.MESSAGE</tt>, if it's not there,
72
- # it's looked up in <tt>models.MODEL.MESSAGE</tt> and if that is not there it returns the translation of the
73
- # default message (e.g. <tt>activerecord.errors.messages.MESSAGE</tt>). The translated model name,
74
- # translated attribute name and the value are available for interpolation.
75
- #
76
- # When using inheritence in your models, it will check all the inherited models too, but only if the model itself
77
- # hasn't been found. Say you have <tt>class Admin < User; end</tt> and you wanted the translation for the <tt>:blank</tt>
78
- # error +message+ for the <tt>title</tt> +attribute+, it looks for these translations:
79
- #
80
- # <ol>
81
- # <li><tt>activerecord.errors.models.admin.attributes.title.blank</tt></li>
82
- # <li><tt>activerecord.errors.models.admin.blank</tt></li>
83
- # <li><tt>activerecord.errors.models.user.attributes.title.blank</tt></li>
84
- # <li><tt>activerecord.errors.models.user.blank</tt></li>
85
- # <li><tt>activerecord.errors.messages.blank</tt></li>
86
- # <li>any default you provided through the +options+ hash (in the activerecord.errors scope)</li>
87
- # </ol>
88
- def generate_message(attribute, message = :invalid, options = {})
89
-
90
- message, options[:default] = options[:default], message if options[:default].is_a?(Symbol)
91
-
92
- defaults = @base.class.self_and_descendants_from_active_record.map do |klass|
93
- [ :"models.#{klass.name.underscore}.attributes.#{attribute}.#{message}",
94
- :"models.#{klass.name.underscore}.#{message}" ]
95
- end
96
-
97
- defaults << options.delete(:default)
98
- defaults = defaults.compact.flatten << :"messages.#{message}"
99
-
100
- key = defaults.shift
101
- value = @base.respond_to?(attribute) ? @base.send(attribute) : nil
102
-
103
- options = { :default => defaults,
104
- :model => @base.class.human_name,
105
- :attribute => @base.class.human_attribute_name(attribute.to_s),
106
- :value => value,
107
- :scope => [:activerecord, :errors]
108
- }.merge(options)
109
-
110
- I18n.translate(key, options)
111
- end
112
184
 
113
185
  # Returns true if the specified +attribute+ has errors associated with it.
114
186
  #
@@ -138,8 +210,9 @@ module ActiveRecord
138
210
  # company.errors.on(:email) # => "can't be blank"
139
211
  # company.errors.on(:address) # => nil
140
212
  def on(attribute)
141
- errors = @errors[attribute.to_s]
142
- return nil if errors.nil?
213
+ attribute = attribute.to_s
214
+ return nil unless @errors.has_key?(attribute)
215
+ errors = @errors[attribute].map(&:to_s)
143
216
  errors.size == 1 ? errors.first : errors
144
217
  end
145
218
 
@@ -163,7 +236,11 @@ module ActiveRecord
163
236
  # # name - can't be blank
164
237
  # # address - can't be blank
165
238
  def each
166
- @errors.each_key { |attr| @errors[attr].each { |msg| yield attr, msg } }
239
+ @errors.each_key { |attr| @errors[attr].each { |error| yield attr, error.message } }
240
+ end
241
+
242
+ def each_error
243
+ @errors.each_key { |attr| @errors[attr].each { |error| yield attr, error } }
167
244
  end
168
245
 
169
246
  # Yields each full error message added. So <tt>Person.errors.add("first_name", "can't be empty")</tt> will be returned
@@ -194,22 +271,10 @@ module ActiveRecord
194
271
  # company.errors.full_messages # =>
195
272
  # ["Name is too short (minimum is 5 characters)", "Name can't be blank", "Address can't be blank"]
196
273
  def full_messages(options = {})
197
- full_messages = []
198
-
199
- @errors.each_key do |attr|
200
- @errors[attr].each do |message|
201
- next unless message
202
-
203
- if attr == "base"
204
- full_messages << message
205
- else
206
- attr_name = @base.class.human_attribute_name(attr)
207
- full_messages << attr_name + I18n.t('activerecord.errors.format.separator', :default => ' ') + message
208
- end
209
- end
274
+ @errors.values.inject([]) do |full_messages, errors|
275
+ full_messages + errors.map { |error| error.full_message }
210
276
  end
211
- full_messages
212
- end
277
+ end
213
278
 
214
279
  # Returns true if no errors have been added.
215
280
  def empty?
@@ -254,7 +319,11 @@ module ActiveRecord
254
319
  full_messages.each { |msg| e.error(msg) }
255
320
  end
256
321
  end
257
-
322
+
323
+ def generate_message(attribute, message = :invalid, options = {})
324
+ ActiveSupport::Deprecation.warn("ActiveRecord::Errors#generate_message has been deprecated. Please use ActiveRecord::Error#generate_message.")
325
+ Error.new(@base, attribute, message, options).to_s
326
+ end
258
327
  end
259
328
 
260
329
 
@@ -437,7 +506,7 @@ module ActiveRecord
437
506
 
438
507
  validates_each(attr_names, configuration) do |record, attr_name, value|
439
508
  unless record.send("#{attr_name}_confirmation").nil? or value == record.send("#{attr_name}_confirmation")
440
- record.errors.add(attr_name, :confirmation, :default => configuration[:message])
509
+ record.errors.add(attr_name, :confirmation, :default => configuration[:message])
441
510
  end
442
511
  end
443
512
  end
@@ -479,7 +548,7 @@ module ActiveRecord
479
548
 
480
549
  validates_each(attr_names,configuration) do |record, attr_name, value|
481
550
  unless value == configuration[:accept]
482
- record.errors.add(attr_name, :accepted, :default => configuration[:message])
551
+ record.errors.add(attr_name, :accepted, :default => configuration[:message])
483
552
  end
484
553
  end
485
554
  end
@@ -499,7 +568,7 @@ module ActiveRecord
499
568
  #
500
569
  # Configuration options:
501
570
  # * <tt>message</tt> - A custom error message (default is: "can't be blank").
502
- # * <tt>on</tt> - Specifies when this validation is active (default is <tt>:save</tt>, other options <tt>:create</tt>,
571
+ # * <tt>on</tt> - Specifies when this validation is active (default is <tt>:save</tt>, other options <tt>:create</tt>,
503
572
  # <tt>:update</tt>).
504
573
  # * <tt>if</tt> - Specifies a method, proc or string to call to determine if the validation should
505
574
  # occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>).
@@ -599,7 +668,7 @@ module ActiveRecord
599
668
  validates_each(attrs, options) do |record, attr, value|
600
669
  value = options[:tokenizer].call(value) if value.kind_of?(String)
601
670
  unless !value.nil? and value.size.method(validity_checks[option])[option_value]
602
- record.errors.add(attr, key, :default => custom_message, :count => option_value)
671
+ record.errors.add(attr, key, :default => custom_message, :count => option_value)
603
672
  end
604
673
  end
605
674
  end
@@ -687,7 +756,7 @@ module ActiveRecord
687
756
  # ActiveRecord::ConnectionAdapters::SchemaStatements#add_index. In the
688
757
  # rare case that a race condition occurs, the database will guarantee
689
758
  # the field's uniqueness.
690
- #
759
+ #
691
760
  # When the database catches such a duplicate insertion,
692
761
  # ActiveRecord::Base#save will raise an ActiveRecord::StatementInvalid
693
762
  # exception. You can either choose to let this error propagate (which
@@ -696,7 +765,7 @@ module ActiveRecord
696
765
  # that the title already exists, and asking him to re-enter the title).
697
766
  # This technique is also known as optimistic concurrency control:
698
767
  # http://en.wikipedia.org/wiki/Optimistic_concurrency_control
699
- #
768
+ #
700
769
  # Active Record currently provides no way to distinguish unique
701
770
  # index constraint errors from other types of database errors, so you
702
771
  # will have to parse the (database-specific) exception message to detect
@@ -726,7 +795,7 @@ module ActiveRecord
726
795
  comparison_operator = "IS ?"
727
796
  elsif column.text?
728
797
  comparison_operator = "#{connection.case_sensitive_equality_operator} ?"
729
- value = column.limit ? value.to_s[0, column.limit] : value.to_s
798
+ value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s
730
799
  else
731
800
  comparison_operator = "= ?"
732
801
  end
@@ -794,7 +863,7 @@ module ActiveRecord
794
863
 
795
864
  validates_each(attr_names, configuration) do |record, attr_name, value|
796
865
  unless value.to_s =~ configuration[:with]
797
- record.errors.add(attr_name, :invalid, :default => configuration[:message], :value => value)
866
+ record.errors.add(attr_name, :invalid, :default => configuration[:message], :value => value)
798
867
  end
799
868
  end
800
869
  end
@@ -802,7 +871,7 @@ module ActiveRecord
802
871
  # Validates whether the value of the specified attribute is available in a particular enumerable object.
803
872
  #
804
873
  # class Person < ActiveRecord::Base
805
- # validates_inclusion_of :gender, :in => %w( m f ), :message => "woah! what are you then!??!!"
874
+ # validates_inclusion_of :gender, :in => %w( m f )
806
875
  # validates_inclusion_of :age, :in => 0..99
807
876
  # validates_inclusion_of :format, :in => %w( jpg gif png ), :message => "extension {{value}} is not included in the list"
808
877
  # end
@@ -828,7 +897,7 @@ module ActiveRecord
828
897
 
829
898
  validates_each(attr_names, configuration) do |record, attr_name, value|
830
899
  unless enum.include?(value)
831
- record.errors.add(attr_name, :inclusion, :default => configuration[:message], :value => value)
900
+ record.errors.add(attr_name, :inclusion, :default => configuration[:message], :value => value)
832
901
  end
833
902
  end
834
903
  end
@@ -862,7 +931,7 @@ module ActiveRecord
862
931
 
863
932
  validates_each(attr_names, configuration) do |record, attr_name, value|
864
933
  if enum.include?(value)
865
- record.errors.add(attr_name, :exclusion, :default => configuration[:message], :value => value)
934
+ record.errors.add(attr_name, :exclusion, :default => configuration[:message], :value => value)
866
935
  end
867
936
  end
868
937
  end
@@ -970,7 +1039,7 @@ module ActiveRecord
970
1039
  case option
971
1040
  when :odd, :even
972
1041
  unless raw_value.to_i.method(ALL_NUMERICALITY_CHECKS[option])[]
973
- record.errors.add(attr_name, option, :value => raw_value, :default => configuration[:message])
1042
+ record.errors.add(attr_name, option, :value => raw_value, :default => configuration[:message])
974
1043
  end
975
1044
  else
976
1045
  record.errors.add(attr_name, option, :default => configuration[:message], :value => raw_value, :count => configuration[option]) unless raw_value.method(ALL_NUMERICALITY_CHECKS[option])[configuration[option]]