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.
- data/CHANGELOG +33 -1
- data/CONTRIBUTORS +15 -2
- data/INSTALL +9 -7
- data/README +11 -7
- data/app/controllers/admin/layouts_controller.rb +5 -2
- data/app/controllers/admin/pages_controller.rb +8 -5
- data/app/controllers/admin/snippets_controller.rb +5 -2
- data/app/controllers/application_controller.rb +7 -0
- data/app/helpers/admin/node_helper.rb +2 -2
- data/app/helpers/application_helper.rb +2 -2
- data/app/models/radiant/config.rb +36 -4
- data/app/models/standard_tags.rb +1 -1
- data/app/views/admin/layouts/index.html.haml +15 -12
- data/app/views/admin/page_parts/_page_part.html.haml +2 -2
- data/app/views/admin/pages/index.html.haml +1 -1
- data/app/views/admin/snippets/_form.html.haml +1 -1
- data/app/views/admin/snippets/index.html.haml +14 -10
- data/config/database.db2.yml +20 -0
- data/config/environment.rb +4 -4
- data/config/environments/test.rb +1 -2
- data/features/support/env.rb +2 -1
- data/lib/generators/extension/extension_generator.rb +5 -0
- data/lib/generators/extension/templates/RSpecRakefile +11 -8
- data/lib/generators/extension/templates/cucumber.yml +1 -0
- data/lib/generators/extension/templates/cucumber_env.rb +16 -0
- data/lib/generators/extension/templates/cucumber_paths.rb +14 -0
- data/lib/generators/extension/templates/extension.rb +1 -1
- data/lib/generators/instance/instance_generator.rb +1 -1
- data/lib/generators/instance/templates/databases/db2.yml +40 -0
- data/lib/generators/instance/templates/instance_environment.rb +6 -6
- data/lib/local_time.rb +3 -9
- data/lib/radiant.rb +1 -1
- data/lib/radiant/cache.rb +10 -8
- data/lib/radiant/extension.rb +36 -0
- data/lib/radiant/extension/script.rb +1 -1
- data/lib/radiant/extension_loader.rb +5 -1
- data/lib/radiant/initializer.rb +52 -4
- data/lib/task_support.rb +33 -0
- data/lib/tasks/cucumber.rake +5 -1
- data/lib/tasks/radiant_config.rake +18 -0
- data/lib/tasks/release.rake +1 -0
- data/public/javascripts/admin/admin.js +1 -1
- data/spec/controllers/admin/layouts_controller_spec.rb +18 -12
- data/spec/controllers/admin/pages_controller_spec.rb +35 -29
- data/spec/controllers/admin/snippets_controller_spec.rb +11 -5
- data/spec/controllers/admin/welcome_controller_spec.rb +1 -1
- data/spec/controllers/application_controller_spec.rb +18 -0
- data/spec/fixtures/radiant_config.yml +10 -0
- data/spec/generators/extension_generator_spec.rb +12 -0
- data/spec/helpers/admin/node_helper_spec.rb +6 -0
- data/spec/helpers/application_helper_spec.rb +1 -1
- data/spec/lib/radiant/extension_loader_spec.rb +17 -0
- data/spec/lib/radiant/extension_spec.rb +28 -0
- data/spec/lib/radiant/initializer_spec.rb +34 -0
- data/spec/lib/task_support_spec.rb +42 -0
- data/spec/models/page_spec.rb +6 -2
- data/spec/models/radiant/config_spec.rb +42 -1
- data/spec/models/standard_tags_spec.rb +2 -2
- data/test/fixtures/extensions/01_basic/app/metal/basic_metal.rb +9 -0
- data/test/fixtures/extensions/02_overriding/app/metal/basic_metal.rb +9 -0
- data/vendor/extensions/textile_filter/textile.html +2 -2
- data/vendor/plugins/dataset/CHANGELOG +2 -1
- data/vendor/plugins/dataset/Rakefile +3 -0
- data/vendor/plugins/dataset/VERSION.yml +2 -2
- data/vendor/plugins/dataset/dataset.gemspec +9 -3
- data/vendor/plugins/dataset/lib/dataset.rb +3 -0
- data/vendor/radius/lib/radius.rb +5 -0
- data/vendor/radius/test/radius_test.rb +6 -0
- data/vendor/rails/actionmailer/CHANGELOG +8 -0
- data/vendor/rails/actionmailer/Rakefile +3 -2
- data/vendor/rails/actionmailer/lib/action_mailer/base.rb +2 -1
- data/vendor/rails/actionmailer/lib/action_mailer/version.rb +1 -1
- data/vendor/rails/actionmailer/test/abstract_unit.rb +0 -3
- data/vendor/rails/actionmailer/test/mail_service_test.rb +3 -2
- data/vendor/rails/actionpack/CHANGELOG +16 -0
- data/vendor/rails/actionpack/Rakefile +5 -3
- data/vendor/rails/actionpack/lib/action_controller.rb +2 -7
- data/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +13 -3
- data/vendor/rails/actionpack/lib/action_controller/base.rb +12 -3
- data/vendor/rails/actionpack/lib/action_controller/caching.rb +1 -1
- data/vendor/rails/actionpack/lib/action_controller/caching/actions.rb +9 -1
- data/vendor/rails/actionpack/lib/action_controller/caching/sweeper.rb +45 -0
- data/vendor/rails/actionpack/lib/action_controller/caching/sweeping.rb +0 -42
- data/vendor/rails/actionpack/lib/action_controller/cookies.rb +1 -1
- data/vendor/rails/actionpack/lib/action_controller/dispatcher.rb +21 -6
- data/vendor/rails/actionpack/lib/action_controller/failsafe.rb +40 -6
- data/vendor/rails/actionpack/lib/action_controller/flash.rb +11 -3
- data/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +7 -3
- data/vendor/rails/actionpack/lib/action_controller/integration.rb +5 -12
- data/vendor/rails/actionpack/lib/action_controller/middlewares.rb +0 -1
- data/vendor/rails/actionpack/lib/action_controller/params_parser.rb +6 -0
- data/vendor/rails/actionpack/lib/action_controller/reloader.rb +47 -7
- data/vendor/rails/actionpack/lib/action_controller/request.rb +6 -2
- data/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +2 -1
- data/vendor/rails/actionpack/lib/action_controller/resources.rb +17 -13
- data/vendor/rails/actionpack/lib/action_controller/response.rb +8 -2
- data/vendor/rails/actionpack/lib/action_controller/routing.rb +3 -0
- data/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb +20 -6
- data/vendor/rails/actionpack/lib/action_controller/streaming.rb +4 -2
- data/vendor/rails/actionpack/lib/action_controller/test_process.rb +9 -1
- data/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +1 -1
- data/vendor/rails/actionpack/lib/action_pack/version.rb +1 -1
- data/vendor/rails/actionpack/lib/action_view/helpers.rb +1 -1
- data/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +21 -9
- data/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb +1 -1
- data/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +2 -2
- data/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +26 -12
- data/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +71 -1
- data/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +10 -4
- data/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +1 -1
- data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +7 -7
- data/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +5 -5
- data/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +1 -1
- data/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +23 -14
- data/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +2 -2
- data/vendor/rails/actionpack/lib/action_view/locale/en.yml +4 -0
- data/vendor/rails/actionpack/lib/action_view/paths.rb +1 -1
- data/vendor/rails/actionpack/lib/action_view/template.rb +22 -33
- data/vendor/rails/actionpack/test/abstract_unit.rb +17 -1
- data/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +3 -3
- data/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +27 -0
- data/vendor/rails/actionpack/test/controller/caching_test.rb +40 -1
- data/vendor/rails/actionpack/test/controller/cookie_test.rb +16 -0
- data/vendor/rails/actionpack/test/controller/dispatcher_test.rb +59 -18
- data/vendor/rails/actionpack/test/controller/failsafe_test.rb +60 -0
- data/vendor/rails/actionpack/test/controller/filter_params_test.rb +3 -1
- data/vendor/rails/actionpack/test/controller/flash_test.rb +6 -1
- data/vendor/rails/actionpack/test/controller/http_basic_authentication_test.rb +25 -0
- data/vendor/rails/actionpack/test/controller/http_digest_authentication_test.rb +63 -9
- data/vendor/rails/actionpack/test/controller/integration_test.rb +31 -3
- data/vendor/rails/actionpack/test/controller/rack_test.rb +18 -1
- data/vendor/rails/actionpack/test/controller/redirect_test.rb +4 -1
- data/vendor/rails/actionpack/test/controller/reloader_test.rb +124 -0
- data/vendor/rails/actionpack/test/controller/render_test.rb +19 -9
- data/vendor/rails/actionpack/test/controller/request/json_params_parsing_test.rb +24 -4
- data/vendor/rails/actionpack/test/controller/request/multipart_params_parsing_test.rb +1 -62
- data/vendor/rails/actionpack/test/controller/request/test_request_test.rb +35 -0
- data/vendor/rails/actionpack/test/controller/request/url_encoded_params_parsing_test.rb +0 -38
- data/vendor/rails/actionpack/test/controller/request/xml_params_parsing_test.rb +15 -0
- data/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +6 -5
- data/vendor/rails/actionpack/test/controller/request_test.rb +218 -230
- data/vendor/rails/actionpack/test/controller/resources_test.rb +52 -0
- data/vendor/rails/actionpack/test/controller/routing_test.rb +28 -2
- data/vendor/rails/actionpack/test/controller/send_file_test.rb +12 -2
- data/vendor/rails/actionpack/test/controller/session/cookie_store_test.rb +9 -32
- data/vendor/rails/actionpack/test/controller/test_test.rb +8 -0
- data/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +29 -3
- data/vendor/rails/actionpack/test/fixtures/failsafe/500.html +1 -0
- data/vendor/rails/actionpack/test/fixtures/public/absolute/test.css +23 -0
- data/vendor/rails/actionpack/test/fixtures/public/absolute/test.js +63 -0
- data/vendor/rails/actionpack/test/template/active_record_helper_test.rb +1 -1
- data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +46 -0
- data/vendor/rails/actionpack/test/template/atom_feed_helper_test.rb +29 -0
- data/vendor/rails/actionpack/test/template/form_helper_test.rb +143 -6
- data/vendor/rails/actionpack/test/template/form_options_helper_i18n_test.rb +27 -0
- data/vendor/rails/actionpack/test/template/form_options_helper_test.rb +56 -0
- data/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +23 -6
- data/vendor/rails/actionpack/test/template/prototype_helper_test.rb +11 -11
- data/vendor/rails/actionpack/test/template/template_test.rb +32 -0
- data/vendor/rails/actionpack/test/template/text_helper_test.rb +23 -0
- data/vendor/rails/actionpack/test/template/url_helper_test.rb +8 -0
- data/vendor/rails/activerecord/CHANGELOG +18 -0
- data/vendor/rails/activerecord/Rakefile +26 -9
- data/vendor/rails/activerecord/examples/performance.rb +162 -0
- data/vendor/rails/activerecord/lib/active_record/associations.rb +104 -35
- data/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +10 -5
- data/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +2 -2
- data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +22 -4
- data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +5 -1
- data/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +16 -0
- data/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +1 -0
- data/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +13 -3
- data/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb +15 -9
- data/vendor/rails/activerecord/lib/active_record/autosave_association.rb +15 -9
- data/vendor/rails/activerecord/lib/active_record/base.rb +34 -31
- data/vendor/rails/activerecord/lib/active_record/batches.rb +23 -15
- data/vendor/rails/activerecord/lib/active_record/calculations.rb +7 -13
- data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +16 -2
- data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +2 -2
- data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +7 -0
- data/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +17 -8
- data/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +98 -35
- data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +15 -0
- data/vendor/rails/activerecord/lib/active_record/dirty.rb +1 -1
- data/vendor/rails/activerecord/lib/active_record/fixtures.rb +14 -11
- data/vendor/rails/activerecord/lib/active_record/i18n_interpolation_deprecation.rb +1 -1
- data/vendor/rails/activerecord/lib/active_record/locale/en.yml +4 -0
- data/vendor/rails/activerecord/lib/active_record/named_scope.rb +3 -8
- data/vendor/rails/activerecord/lib/active_record/reflection.rb +1 -1
- data/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +6 -3
- data/vendor/rails/activerecord/lib/active_record/serialization.rb +3 -2
- data/vendor/rails/activerecord/lib/active_record/serializers/json_serializer.rb +10 -18
- data/vendor/rails/activerecord/lib/active_record/serializers/xml_serializer.rb +6 -2
- data/vendor/rails/activerecord/lib/active_record/session_store.rb +9 -1
- data/vendor/rails/activerecord/lib/active_record/timestamp.rb +39 -9
- data/vendor/rails/activerecord/lib/active_record/validations.rb +149 -80
- data/vendor/rails/activerecord/lib/active_record/version.rb +1 -1
- data/vendor/rails/activerecord/test/cases/adapter_test.rb +12 -0
- data/vendor/rails/activerecord/test/cases/associations/belongs_to_associations_test.rb +102 -22
- data/vendor/rails/activerecord/test/cases/associations/eager_load_nested_include_test.rb +5 -5
- data/vendor/rails/activerecord/test/cases/associations/eager_test.rb +12 -0
- data/vendor/rails/activerecord/test/cases/associations/habtm_join_table_test.rb +56 -0
- data/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +62 -2
- data/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +46 -1
- data/vendor/rails/activerecord/test/cases/associations/has_one_through_associations_test.rb +18 -1
- data/vendor/rails/activerecord/test/cases/associations/inner_join_association_test.rb +5 -0
- data/vendor/rails/activerecord/test/cases/associations/join_model_test.rb +4 -4
- data/vendor/rails/activerecord/test/cases/autosave_association_test.rb +22 -0
- data/vendor/rails/activerecord/test/cases/base_test.rb +51 -6
- data/vendor/rails/activerecord/test/cases/calculations_test.rb +14 -14
- data/vendor/rails/activerecord/test/cases/column_definition_test.rb +34 -0
- data/vendor/rails/activerecord/test/cases/copy_table_test_sqlite.rb +5 -5
- data/vendor/rails/activerecord/test/cases/dirty_test.rb +10 -0
- data/vendor/rails/activerecord/test/cases/finder_test.rb +21 -50
- data/vendor/rails/activerecord/test/cases/fixtures_test.rb +6 -1
- data/vendor/rails/activerecord/test/cases/helper.rb +1 -2
- data/vendor/rails/activerecord/test/cases/i18n_test.rb +5 -0
- data/vendor/rails/activerecord/test/cases/json_serialization_test.rb +57 -57
- data/vendor/rails/activerecord/test/cases/method_scoping_test.rb +14 -4
- data/vendor/rails/activerecord/test/cases/migration_test.rb +39 -11
- data/vendor/rails/activerecord/test/cases/modules_test.rb +42 -0
- data/vendor/rails/activerecord/test/cases/named_scope_test.rb +6 -4
- data/vendor/rails/activerecord/test/cases/pk_test.rb +18 -0
- data/vendor/rails/activerecord/test/cases/reflection_test.rb +7 -7
- data/vendor/rails/activerecord/test/cases/schema_dumper_test.rb +35 -7
- data/vendor/rails/activerecord/test/cases/schema_test_postgresql.rb +76 -0
- data/vendor/rails/activerecord/test/cases/timestamp_test.rb +75 -0
- data/vendor/rails/activerecord/test/cases/validations_i18n_test.rb +656 -624
- data/vendor/rails/activerecord/test/cases/validations_test.rb +12 -2
- data/vendor/rails/activerecord/test/cases/xml_serialization_test.rb +20 -0
- data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite +0 -0
- data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
- data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite +0 -0
- data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
- data/vendor/rails/activerecord/test/fixtures/posts.yml +3 -0
- data/vendor/rails/activerecord/test/models/author.rb +5 -0
- data/vendor/rails/activerecord/test/models/comment.rb +5 -1
- data/vendor/rails/activerecord/test/models/company.rb +9 -7
- data/vendor/rails/activerecord/test/models/company_in_module.rb +1 -1
- data/vendor/rails/activerecord/test/models/contract.rb +5 -0
- data/vendor/rails/activerecord/test/models/developer.rb +10 -0
- data/vendor/rails/activerecord/test/models/essay.rb +3 -0
- data/vendor/rails/activerecord/test/models/organization.rb +2 -0
- data/vendor/rails/activerecord/test/models/pet.rb +1 -1
- data/vendor/rails/activerecord/test/models/project.rb +1 -1
- data/vendor/rails/activerecord/test/models/reply.rb +2 -1
- data/vendor/rails/activerecord/test/models/topic.rb +1 -2
- data/vendor/rails/activerecord/test/models/toy.rb +2 -0
- data/vendor/rails/activerecord/test/schema/postgresql_specific_schema.rb +13 -2
- data/vendor/rails/activerecord/test/schema/schema.rb +19 -0
- data/vendor/rails/activeresource/CHANGELOG +16 -0
- data/vendor/rails/activeresource/Rakefile +3 -2
- data/vendor/rails/activeresource/lib/active_resource/base.rb +89 -9
- data/vendor/rails/activeresource/lib/active_resource/connection.rb +73 -8
- data/vendor/rails/activeresource/lib/active_resource/exceptions.rb +66 -0
- data/vendor/rails/activeresource/lib/active_resource/formats/json_format.rb +2 -2
- data/vendor/rails/activeresource/lib/active_resource/validations.rb +20 -4
- data/vendor/rails/activeresource/lib/active_resource/version.rb +1 -1
- data/vendor/rails/activeresource/test/abstract_unit.rb +1 -3
- data/vendor/rails/activeresource/test/base/load_test.rb +16 -1
- data/vendor/rails/activeresource/test/base_errors_test.rb +56 -19
- data/vendor/rails/activeresource/test/base_test.rb +147 -0
- data/vendor/rails/activeresource/test/connection_test.rb +42 -0
- data/vendor/rails/activeresource/test/debug.log +7974 -0
- data/vendor/rails/activeresource/test/fixtures/proxy.rb +4 -0
- data/vendor/rails/activesupport/CHANGELOG +13 -0
- data/vendor/rails/activesupport/lib/active_support/all.rb +8 -0
- data/vendor/rails/activesupport/lib/active_support/cache.rb +14 -1
- data/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +16 -10
- data/vendor/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb +1 -1
- data/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +1 -0
- data/vendor/rails/activesupport/lib/active_support/core_ext/date/calculations.rb +2 -1
- data/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +2 -4
- data/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +14 -4
- data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +4 -2
- data/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
- data/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +19 -5
- data/vendor/rails/activesupport/lib/active_support/core_ext/module/model_naming.rb +8 -6
- data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +15 -9
- data/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +1 -0
- data/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +29 -5
- data/vendor/rails/activesupport/lib/active_support/core_ext/string/bytesize.rb +5 -0
- data/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +7 -7
- data/vendor/rails/activesupport/lib/active_support/deprecation.rb +9 -9
- data/vendor/rails/activesupport/lib/active_support/duration.rb +4 -2
- data/vendor/rails/activesupport/lib/active_support/json.rb +1 -22
- data/vendor/rails/activesupport/lib/active_support/json/backends/jsongem.rb +38 -0
- data/vendor/rails/activesupport/lib/active_support/json/backends/yaml.rb +88 -0
- data/vendor/rails/activesupport/lib/active_support/json/decoding.rb +23 -72
- data/vendor/rails/activesupport/lib/active_support/json/encoders/date.rb +9 -8
- data/vendor/rails/activesupport/lib/active_support/json/encoders/date_time.rb +9 -8
- data/vendor/rails/activesupport/lib/active_support/json/encoders/enumerable.rb +14 -9
- data/vendor/rails/activesupport/lib/active_support/json/encoders/false_class.rb +4 -2
- data/vendor/rails/activesupport/lib/active_support/json/encoders/hash.rb +21 -11
- data/vendor/rails/activesupport/lib/active_support/json/encoders/nil_class.rb +4 -2
- data/vendor/rails/activesupport/lib/active_support/json/encoders/numeric.rb +16 -0
- data/vendor/rails/activesupport/lib/active_support/json/encoders/object.rb +6 -2
- data/vendor/rails/activesupport/lib/active_support/json/encoders/regexp.rb +4 -0
- data/vendor/rails/activesupport/lib/active_support/json/encoders/string.rb +5 -32
- data/vendor/rails/activesupport/lib/active_support/json/encoders/symbol.rb +2 -2
- data/vendor/rails/activesupport/lib/active_support/json/encoders/time.rb +9 -8
- data/vendor/rails/activesupport/lib/active_support/json/encoders/true_class.rb +4 -2
- data/vendor/rails/activesupport/lib/active_support/json/encoding.rb +80 -9
- data/vendor/rails/activesupport/lib/active_support/memoizable.rb +1 -1
- data/vendor/rails/activesupport/lib/active_support/message_verifier.rb +16 -3
- data/vendor/rails/activesupport/lib/active_support/multibyte.rb +30 -6
- data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +23 -17
- data/vendor/rails/activesupport/lib/active_support/multibyte/utils.rb +61 -0
- data/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +28 -0
- data/vendor/rails/activesupport/lib/active_support/test_case.rb +9 -8
- data/vendor/rails/activesupport/lib/active_support/testing/deprecation.rb +2 -0
- data/vendor/rails/activesupport/lib/active_support/time_with_zone.rb +9 -8
- data/vendor/rails/activesupport/lib/active_support/vendor.rb +6 -7
- data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -1
- data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -1
- data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -1
- data/vendor/rails/activesupport/lib/active_support/vendor/{memcache-client-1.6.5 → memcache-client-1.7.4}/memcache.rb +242 -70
- data/vendor/rails/activesupport/lib/active_support/version.rb +1 -1
- data/vendor/rails/activesupport/lib/active_support/xml_mini/jdom.rb +162 -0
- data/vendor/rails/railties/CHANGELOG +10 -0
- data/vendor/rails/railties/Rakefile +13 -9
- data/vendor/rails/railties/bin/about +2 -2
- data/vendor/rails/railties/bin/console +1 -1
- data/vendor/rails/railties/bin/dbconsole +1 -1
- data/vendor/rails/railties/bin/destroy +1 -1
- data/vendor/rails/railties/bin/generate +1 -1
- data/vendor/rails/railties/bin/performance/benchmarker +1 -1
- data/vendor/rails/railties/bin/performance/profiler +1 -1
- data/vendor/rails/railties/bin/plugin +1 -1
- data/vendor/rails/railties/bin/runner +1 -1
- data/vendor/rails/railties/bin/server +1 -1
- data/vendor/rails/railties/builtin/rails_info/rails/info.rb +4 -2
- data/vendor/rails/railties/configs/initializers/new_rails_defaults.rb +2 -0
- data/vendor/rails/railties/configs/routes.rb +1 -1
- data/vendor/rails/railties/configs/seeds.rb +7 -0
- data/vendor/rails/railties/environments/boot.rb +1 -1
- data/vendor/rails/railties/guides/files/javascripts/code_highlighter.js +188 -0
- data/vendor/rails/railties/guides/files/javascripts/guides.js +8 -0
- data/vendor/rails/railties/guides/files/javascripts/highlighters.js +90 -0
- data/vendor/rails/railties/guides/files/stylesheets/main.css +441 -0
- data/vendor/rails/railties/guides/files/stylesheets/print.css +52 -0
- data/vendor/rails/railties/guides/files/stylesheets/reset.css +43 -0
- data/vendor/rails/railties/guides/files/stylesheets/style.css +13 -0
- data/vendor/rails/railties/guides/files/stylesheets/syntax.css +31 -0
- data/vendor/rails/railties/guides/images/belongs_to.png +0 -0
- data/vendor/rails/railties/guides/images/book_icon.gif +0 -0
- data/vendor/rails/railties/guides/images/bullet.gif +0 -0
- data/vendor/rails/railties/guides/images/chapters_icon.gif +0 -0
- data/vendor/rails/railties/guides/images/check_bullet.gif +0 -0
- data/vendor/rails/railties/guides/images/credits_pic_blank.gif +0 -0
- data/vendor/rails/railties/guides/images/csrf.png +0 -0
- data/vendor/rails/railties/guides/images/customized_error_messages.png +0 -0
- data/vendor/rails/railties/guides/images/error_messages.png +0 -0
- data/vendor/rails/railties/guides/images/feature_tile.gif +0 -0
- data/vendor/rails/railties/guides/images/footer_tile.gif +0 -0
- data/vendor/rails/railties/guides/images/fxn.jpg +0 -0
- data/vendor/rails/railties/guides/images/grey_bullet.gif +0 -0
- data/vendor/rails/railties/guides/images/habtm.png +0 -0
- data/vendor/rails/railties/guides/images/has_many.png +0 -0
- data/vendor/rails/railties/guides/images/has_many_through.png +0 -0
- data/vendor/rails/railties/guides/images/has_one.png +0 -0
- data/vendor/rails/railties/guides/images/has_one_through.png +0 -0
- data/vendor/rails/railties/guides/images/header_backdrop.png +0 -0
- data/vendor/rails/railties/guides/images/header_tile.gif +0 -0
- data/vendor/rails/railties/guides/images/i18n/demo_localized_pirate.png +0 -0
- data/vendor/rails/railties/guides/images/i18n/demo_translated_en.png +0 -0
- data/vendor/rails/railties/guides/images/i18n/demo_translated_pirate.png +0 -0
- data/vendor/rails/railties/guides/images/i18n/demo_translation_missing.png +0 -0
- data/vendor/rails/railties/guides/images/i18n/demo_untranslated.png +0 -0
- data/vendor/rails/railties/guides/images/icons/README +5 -0
- data/vendor/rails/railties/guides/images/icons/callouts/1.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/10.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/11.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/12.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/13.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/14.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/15.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/2.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/3.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/4.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/5.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/6.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/7.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/8.png +0 -0
- data/vendor/rails/railties/guides/images/icons/callouts/9.png +0 -0
- data/vendor/rails/railties/guides/images/icons/caution.png +0 -0
- data/vendor/rails/railties/guides/images/icons/example.png +0 -0
- data/vendor/rails/railties/guides/images/icons/home.png +0 -0
- data/vendor/rails/railties/guides/images/icons/important.png +0 -0
- data/vendor/rails/railties/guides/images/icons/next.png +0 -0
- data/vendor/rails/railties/guides/images/icons/note.png +0 -0
- data/vendor/rails/railties/guides/images/icons/prev.png +0 -0
- data/vendor/rails/railties/guides/images/icons/tip.png +0 -0
- data/vendor/rails/railties/guides/images/icons/up.png +0 -0
- data/vendor/rails/railties/guides/images/icons/warning.png +0 -0
- data/vendor/rails/railties/guides/images/nav_arrow.gif +0 -0
- data/vendor/rails/railties/guides/images/polymorphic.png +0 -0
- data/vendor/rails/railties/guides/images/posts_index.png +0 -0
- data/vendor/rails/railties/guides/images/rails_guides_logo.gif +0 -0
- data/vendor/rails/railties/guides/images/rails_logo_remix.gif +0 -0
- data/vendor/rails/railties/guides/images/rails_welcome.png +0 -0
- data/vendor/rails/railties/guides/images/session_fixation.png +0 -0
- data/vendor/rails/railties/guides/images/tab_grey.gif +0 -0
- data/vendor/rails/railties/guides/images/tab_info.gif +0 -0
- data/vendor/rails/railties/guides/images/tab_note.gif +0 -0
- data/vendor/rails/railties/guides/images/tab_red.gif +0 -0
- data/vendor/rails/railties/guides/images/tab_yellow.gif +0 -0
- data/vendor/rails/railties/guides/images/tab_yellow.png +0 -0
- data/vendor/rails/railties/guides/images/validation_error_messages.png +0 -0
- data/vendor/rails/railties/guides/rails_guides.rb +42 -0
- data/vendor/rails/railties/guides/rails_guides/generator.rb +138 -0
- data/vendor/rails/railties/guides/rails_guides/helpers.rb +34 -0
- data/vendor/rails/railties/guides/rails_guides/indexer.rb +55 -0
- data/vendor/rails/railties/guides/rails_guides/textile_extensions.rb +41 -0
- data/vendor/rails/railties/guides/source/2_2_release_notes.textile +422 -0
- data/vendor/rails/railties/guides/source/2_3_release_notes.textile +610 -0
- data/vendor/rails/railties/guides/source/action_controller_overview.textile +776 -0
- data/vendor/rails/railties/guides/source/action_mailer_basics.textile +424 -0
- data/vendor/rails/railties/guides/source/active_record_basics.textile +135 -0
- data/vendor/rails/railties/guides/source/active_record_querying.textile +969 -0
- data/vendor/rails/railties/guides/source/activerecord_validations_callbacks.textile +1086 -0
- data/vendor/rails/railties/guides/source/association_basics.textile +1781 -0
- data/vendor/rails/railties/guides/source/caching_with_rails.textile +524 -0
- data/vendor/rails/railties/guides/source/command_line.textile +589 -0
- data/vendor/rails/railties/guides/source/configuring.textile +234 -0
- data/vendor/rails/railties/guides/source/contribute.textile +71 -0
- data/vendor/rails/railties/guides/source/contributing_to_rails.textile +239 -0
- data/vendor/rails/railties/guides/source/credits.erb.textile +52 -0
- data/vendor/rails/railties/guides/source/debugging_rails_applications.textile +709 -0
- data/vendor/rails/railties/guides/source/form_helpers.textile +766 -0
- data/vendor/rails/railties/guides/source/getting_started.textile +1297 -0
- data/vendor/rails/railties/guides/source/i18n.textile +912 -0
- data/vendor/rails/railties/guides/source/index.erb.textile +124 -0
- data/vendor/rails/railties/guides/source/layout.html.erb +103 -0
- data/vendor/rails/railties/guides/source/layouts_and_rendering.textile +979 -0
- data/vendor/rails/railties/guides/source/migrations.textile +591 -0
- data/vendor/rails/railties/guides/source/nested_model_forms.textile +222 -0
- data/vendor/rails/railties/guides/source/performance_testing.textile +531 -0
- data/vendor/rails/railties/guides/source/plugins.textile +1512 -0
- data/vendor/rails/railties/guides/source/rails_on_rack.textile +309 -0
- data/vendor/rails/railties/guides/source/routing.textile +903 -0
- data/vendor/rails/railties/guides/source/security.textile +986 -0
- data/vendor/rails/railties/guides/source/testing.textile +951 -0
- data/vendor/rails/railties/lib/commands/dbconsole.rb +8 -4
- data/vendor/rails/railties/lib/commands/performance/profiler.rb +1 -1
- data/vendor/rails/railties/lib/initializer.rb +27 -4
- data/vendor/rails/railties/lib/rails/gem_dependency.rb +35 -6
- data/vendor/rails/railties/lib/rails/plugin.rb +12 -0
- data/vendor/rails/railties/lib/rails/plugin/loader.rb +7 -0
- data/vendor/rails/railties/lib/rails/rack/metal.rb +1 -1
- data/vendor/rails/railties/lib/rails/version.rb +1 -1
- data/vendor/rails/railties/lib/rails_generator/base.rb +1 -1
- data/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +5 -0
- data/vendor/rails/railties/lib/rails_generator/generators/applications/app/template_runner.rb +1 -1
- data/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +9 -2
- data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +1 -0
- data/vendor/rails/railties/lib/tasks/databases.rake +17 -4
- data/vendor/rails/railties/lib/tasks/gems.rake +19 -6
- data/vendor/rails/railties/lib/tasks/routes.rake +4 -3
- data/vendor/rails/railties/lib/test_help.rb +4 -1
- metadata +158 -58
- data/spec/lib/local_time_spec.rb +0 -40
- data/vendor/rails/actionpack/lib/action_controller/rewindable_input.rb +0 -28
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack.rb +0 -89
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/adapter/camping.rb +0 -22
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/handler.rb +0 -37
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/request.rb +0 -37
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/basic.rb +0 -58
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/md5.rb +0 -124
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/nonce.rb +0 -51
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/params.rb +0 -55
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/request.rb +0 -40
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/openid.rb +0 -480
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/builder.rb +0 -63
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/cascade.rb +0 -36
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/chunked.rb +0 -49
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/commonlogger.rb +0 -61
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/conditionalget.rb +0 -45
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_length.rb +0 -29
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_type.rb +0 -23
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/deflater.rb +0 -85
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/directory.rb +0 -153
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/file.rb +0 -88
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler.rb +0 -48
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/cgi.rb +0 -61
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/evented_mongrel.rb +0 -8
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/fastcgi.rb +0 -89
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/lsws.rb +0 -55
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb +0 -84
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/scgi.rb +0 -59
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/swiftiplied_mongrel.rb +0 -8
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/thin.rb +0 -18
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/webrick.rb +0 -67
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/head.rb +0 -19
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lint.rb +0 -462
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lobster.rb +0 -65
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lock.rb +0 -16
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/methodoverride.rb +0 -27
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mime.rb +0 -204
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mock.rb +0 -160
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/recursive.rb +0 -57
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/reloader.rb +0 -64
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/request.rb +0 -241
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/response.rb +0 -179
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/abstract/id.rb +0 -142
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/cookie.rb +0 -91
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/memcache.rb +0 -109
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/pool.rb +0 -100
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showexceptions.rb +0 -349
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showstatus.rb +0 -106
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/static.rb +0 -38
- data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/urlmap.rb +0 -55
- 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+.
|
528
|
-
#
|
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
|
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) },
|
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
|
-
|
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|
|
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 <<
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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.
|
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)
|
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
|
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
|
-
|
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('
|
27
|
-
write_attribute('
|
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
|
-
|
35
|
-
|
36
|
-
write_attribute('
|
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
|
-
|
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
|
-
|
48
|
-
|
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
|
-
|
142
|
-
return 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 { |
|
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
|
-
|
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 )
|
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]]
|