Kouhei Sutou
null+****@clear*****
Mon Feb 6 12:45:12 JST 2017
Kouhei Sutou 2017-02-06 12:45:12 +0900 (Mon, 06 Feb 2017) New Revision: de99d5dc3fd35f58e1ccbc5303c17a1dd60aa595 https://github.com/ranguba/groonga-client-model/commit/de99d5dc3fd35f58e1ccbc5303c17a1dd60aa595 Message: Support i18n for key type validation message Added files: lib/groonga_client_model/locale/en.yml Modified files: lib/groonga-client-model.rb lib/groonga_client_model/record.rb lib/groonga_client_model/validations/type_validator.rb test/unit/test_record.rb Modified: lib/groonga-client-model.rb (+4 -0) =================================================================== --- lib/groonga-client-model.rb 2017-02-03 21:46:53 +0900 (4e88b73) +++ lib/groonga-client-model.rb 2017-02-06 12:45:12 +0900 (b2ae844) @@ -44,3 +44,7 @@ ActiveSupport.run_load_hooks(:groonga_client_model, GroongaClientModel) if defined?(Rails) require "groonga_client_model/railtie" end + +ActiveSupport.on_load(:i18n) do + I18n.load_path << "#{__dir__}/groonga_client_model/locale/en.yml" +end Added: lib/groonga_client_model/locale/en.yml (+7 -0) 100644 =================================================================== --- /dev/null +++ lib/groonga_client_model/locale/en.yml 2017-02-06 12:45:12 +0900 (fdf65fe) @@ -0,0 +1,7 @@ +en: + errors: + messages: + uint: + "must be positive integer: %{inspected_value}" + uint32: + "must be less than 2 ** 32: %{inspected_value}" Modified: lib/groonga_client_model/record.rb (+5 -2) =================================================================== --- lib/groonga_client_model/record.rb 2017-02-03 21:46:53 +0900 (7229beb) +++ lib/groonga_client_model/record.rb 2017-02-06 12:45:12 +0900 (5563c42) @@ -138,10 +138,13 @@ module GroongaClientModel attr_reader :attributes - validates :_key, + validates(:_key, presence: true, + if: ->(record) {record.class.have_key?}) + validates(:_key, "groonga_client_model/validations/type": true, - if: ->(record) {record.class.have_key?} + if: ->(record) {record.class.have_key?}, + allow_blank: true) def initialize(attributes=nil) @attributes = {} Modified: lib/groonga_client_model/validations/type_validator.rb (+19 -7) =================================================================== --- lib/groonga_client_model/validations/type_validator.rb 2017-02-03 21:46:53 +0900 (93a86b4) +++ lib/groonga_client_model/validations/type_validator.rb 2017-02-06 12:45:12 +0900 (30d7289) @@ -30,7 +30,7 @@ module GroongaClientModel end private - def validate_uint32(record, attribute, value) + def validate_uint(record, attribute, value, n_bits) if value.is_a?(String) begin value = Integer(value) @@ -40,16 +40,28 @@ module GroongaClientModel case value when Numeric - return if value >= 0 - record.errors.add(attribute, - "must be positive integer: #{value.inspect}", - options) + if value < 0 + record.errors.add(attribute, + :uint, + options.merge(inspected_value: value.inspect)) + return + end + if value > ((2 ** n_bits) - 1) + record.errors.add(attribute, + :"uint#{n_bits}", + options.merge(inspected_value: value.inspect)) + return + end else record.errors.add(attribute, - "must be positive integer: #{value.inspect}", - options) + :uint, + options.merge(inspected_value: value.inspect)) end end + + def validate_uint32(record, attribute, value) + validate_uint(record, attribute, value, 32) + end end end end Modified: test/unit/test_record.rb (+92 -16) =================================================================== --- test/unit/test_record.rb 2017-02-03 21:46:53 +0900 (eac8ea6) +++ test/unit/test_record.rb 2017-02-06 12:45:12 +0900 (02d1b4f) @@ -56,7 +56,7 @@ class TestRecord < Test::Unit::TestCase end sub_test_case("validations") do - sub_test_case("_key presence") do + sub_test_case("_key") do class NoKey < GroongaClientModel::Record class << self def columns @@ -68,7 +68,7 @@ class TestRecord < Test::Unit::TestCase end end - class HaveKey < GroongaClientModel::Record + class Key < GroongaClientModel::Record class << self def columns raw_columns = { @@ -76,7 +76,7 @@ class TestRecord < Test::Unit::TestCase "_key" => Column.new(nil, { "name" => "_key", "value_type" => { - "name" => "ShortText", + "name" => key_type, }, }), } @@ -85,23 +85,99 @@ class TestRecord < Test::Unit::TestCase end end - test "no key" do - record = NoKey.new - assert do - record.valid? + class ShortTextKey < Key + class << self + def key_type + "ShortText" + end + end + end + + class UInt32Key < Key + class << self + def key_type + "UInt32" + end end - assert_equal({}, record.errors.messages) end - test "have key" do - record = HaveKey.new - assert do - not record.save + sub_test_case("presence") do + test "no key" do + record = NoKey.new + assert do + record.valid? + end + assert_equal({}, record.errors.messages) + end + + test "missing key" do + record = ShortTextKey.new + assert do + not record.valid? + end + message = record.errors.generate_message(:_key, :blank) + assert_equal({ + :_key => [message], + }, + record.errors.messages) + end + + test "blank key" do + record = UInt32Key.new(_key: "") + assert do + not record.valid? + end + message = record.errors.generate_message(:_key, :blank) + assert_equal({ + :_key => [message], + }, + record.errors.messages) + end + + test "have key" do + record = ShortTextKey.new(_key: "String") + assert do + record.valid? + end + assert_equal({}, + record.errors.messages) + end + end + + sub_test_case("type") do + sub_test_case("UInt32") do + test("invalid") do + key = "String" + record = UInt32Key.new(_key: key) + assert do + not record.valid? + end + options = { + inspected_value: key.inspect + } + message = record.errors.generate_message(:_key, :uint, options) + assert_equal({ + :_key => [message], + }, + record.errors.messages) + end + + test("too large") do + key = 2 ** 32 + record = UInt32Key.new(_key: key) + assert do + not record.valid? + end + options = { + inspected_value: key.inspect + } + message = record.errors.generate_message(:_key, :uint32, options) + assert_equal({ + :_key => [message], + }, + record.errors.messages) + end end - assert_equal({ - :_key => [record.errors.generate_message(:_key, :blank)], - }, - record.errors.messages) end end end -------------- next part -------------- HTML����������������������������...Download