Skip to content

Commit 66fdb1c

Browse files
committed
♻️ Avoid Float errors in Config.version_defaults
Using Rational internally, with aliases for Float and Integer versions. Fixes #428.
1 parent 9b3317b commit 66fdb1c

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

lib/net/imap/config.rb

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -439,44 +439,54 @@ def defaults_hash
439439

440440
version_defaults[:default] = Config[default.send(:defaults_hash)]
441441

442-
version_defaults[0] = Config[:default].dup.update(
442+
version_defaults[0r] = Config[:default].dup.update(
443443
sasl_ir: false,
444444
responses_without_block: :silence_deprecation_warning,
445445
enforce_logindisabled: false,
446446
parser_use_deprecated_uidplus_data: true,
447447
parser_max_deprecated_uidplus_data_size: 10_000,
448448
).freeze
449-
version_defaults[0.0] = Config[0]
450-
version_defaults[0.1] = Config[0]
451-
version_defaults[0.2] = Config[0]
452-
version_defaults[0.3] = Config[0]
449+
version_defaults[0.0r] = Config[0r]
450+
version_defaults[0.1r] = Config[0r]
451+
version_defaults[0.2r] = Config[0r]
452+
version_defaults[0.3r] = Config[0r]
453453

454-
version_defaults[0.4] = Config[0.3].dup.update(
454+
version_defaults[0.4r] = Config[0.3r].dup.update(
455455
sasl_ir: true,
456456
parser_max_deprecated_uidplus_data_size: 1000,
457457
).freeze
458458

459-
version_defaults[0.5] = Config[0.4].dup.update(
459+
version_defaults[0.5r] = Config[0.4r].dup.update(
460460
enforce_logindisabled: true,
461461
responses_without_block: :warn,
462462
parser_use_deprecated_uidplus_data: :up_to_max_size,
463463
parser_max_deprecated_uidplus_data_size: 100,
464464
).freeze
465465

466-
version_defaults[0.6] = Config[0.5].dup.update(
466+
version_defaults[0.6r] = Config[0.5r].dup.update(
467467
responses_without_block: :frozen_dup,
468468
parser_use_deprecated_uidplus_data: false,
469469
parser_max_deprecated_uidplus_data_size: 0,
470470
).freeze
471471

472-
version_defaults[0.7] = Config[0.6].dup.update(
472+
version_defaults[0.7r] = Config[0.6r].dup.update(
473473
).freeze
474474

475-
current = VERSION.to_f
475+
# Safe conversions one way only:
476+
# 0.6r.to_f == 0.6 # => true
477+
# 0.6 .to_r == 0.6r # => false
478+
version_defaults.to_a.each do |k, v|
479+
next unless k in Rational
480+
version_defaults[k.to_f] = v
481+
next unless k.to_i.to_r == k
482+
version_defaults[k.to_i] = v
483+
end
484+
485+
current = VERSION.to_r
476486
version_defaults[:original] = Config[0]
477487
version_defaults[:current] = Config[current]
478-
version_defaults[:next] = Config[current + 0.1]
479-
version_defaults[:future] = Config[current + 0.2]
488+
version_defaults[:next] = Config[current + 0.1r]
489+
version_defaults[:future] = Config[current + 0.2r]
480490

481491
version_defaults.freeze
482492

test/net/imap/test_config.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class ConfigTest < Test::Unit::TestCase
140140

141141
test ".version_defaults are all frozen, and inherit debug from global" do
142142
Config.version_defaults.each do |name, config|
143-
assert [0, Float, Symbol].any? { _1 === name }
143+
assert [0, Float, Rational, Symbol].any? { _1 === name }
144144
assert_kind_of Config, config
145145
assert config.frozen?, "#{name} isn't frozen"
146146
assert config.inherited?(:debug), "#{name} doesn't inherit debug"

0 commit comments

Comments
 (0)