Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions lib/net/imap/data_encoding.rb
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ def self.format_datetime(time)

# Common validators of number and nz_number types
module NumValidator # :nodoc
NUMBER_RE = /\A(?:0|[1-9]\d*)\z/
module_function

# Check if argument is a valid 'number' according to RFC 3501
Expand Down Expand Up @@ -216,6 +217,46 @@ def ensure_mod_sequence_valzer(num)
"mod-sequence-valzer must be unsigned 64-bit integer: #{num}"
end

# Like #ensure_number, but usable with numeric String input.
def coerce_number(num)
case num
when Integer then ensure_number num
when NUMBER_RE then ensure_number Integer num
else
raise DataFormatError, "%p is not a valid number" % [num]
end
end

# Like #ensure_nz_number, but usable with numeric String input.
def coerce_nz_number(num)
case num
when Integer then ensure_nz_number num
when NUMBER_RE then ensure_nz_number Integer num
else
raise DataFormatError, "%p is not a valid nz-number" % [num]
end
end

# Like #ensure_mod_sequence_value, but usable with numeric String input.
def coerce_mod_sequence_value(num)
case num
when Integer then ensure_mod_sequence_value num
when NUMBER_RE then ensure_mod_sequence_value Integer num
else
raise DataFormatError, "%p is not a valid mod-sequence-value" % [num]
end
end

# Like #ensure_mod_sequence_valzer, but usable with numeric String input.
def coerce_mod_sequence_valzer(num)
case num
when Integer then ensure_mod_sequence_valzer num
when NUMBER_RE then ensure_mod_sequence_valzer Integer num
else
raise DataFormatError, "%p is not a valid mod-sequence-valzer" % [num]
end
end

end

end
Expand Down
9 changes: 1 addition & 8 deletions lib/net/imap/sequence_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1921,14 +1921,7 @@ def import_range_minmax(range)
end

def import_num(obj) STARS.include?(obj) ? STAR_INT : nz_number(obj) end

def nz_number(num)
String === num && !/\A[1-9]\d*\z/.match?(num) and
raise DataFormatError, "%p is not a valid nz-number" % [num]
NumValidator.ensure_nz_number Integer num
rescue TypeError # To catch errors from Integer()
raise DataFormatError, $!.message
end
def nz_number(num) = NumValidator.coerce_nz_number(num)

######################################################################{{{2
# Export methods
Expand Down
52 changes: 52 additions & 0 deletions test/net/imap/test_num_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,56 @@ def assert_format_error
end
end

using_test_values_for :number do |label, value, valid|
result = valid ? "=> #{value}" : "raises DataFormatError"
[value, value.to_s].each do |input|
test "#coerce_number(%p) %s" % [input, result] do
if valid
assert_equal value, NumValidator.coerce_number(input)
else
assert_format_error do NumValidator.coerce_number(input) end
end
end
end
end

using_test_values_for :"nz-number" do |label, value, valid|
result = valid ? "=> #{value}" : "raises DataFormatError"
[value, value.to_s].each do |input|
test "#coerce_nz_number(%p) %s" % [input, result] do
if valid
assert_equal value, NumValidator.coerce_nz_number(input)
else
assert_format_error do NumValidator.coerce_nz_number(input) end
end
end
end
end

using_test_values_for :"mod-sequence-value" do |label, value, valid|
result = valid ? "=> #{value}" : "raises DataFormatError"
[value, value.to_s].each do |input|
test "#coerce_mod_sequence_value(%p) %s" % [input, result] do
if valid
assert_equal value, NumValidator.coerce_mod_sequence_value(input)
else
assert_format_error do NumValidator.coerce_mod_sequence_value(input) end
end
end
end
end

using_test_values_for :"mod-sequence-valzer" do |label, value, valid|
result = valid ? "=> #{value}" : "raises DataFormatError"
[value, value.to_s].each do |input|
test "#coerce_mod_sequence_valzer(%p) %s" % [input, result] do
if valid
assert_equal value, NumValidator.coerce_mod_sequence_valzer(input)
else
assert_format_error do NumValidator.coerce_mod_sequence_valzer(input) end
end
end
end
end

end