@@ -131,8 +131,25 @@ def self.default; @default end
131131 def self . global ; @global if defined? ( @global ) end
132132
133133 # A hash of hard-coded configurations, indexed by version number or name.
134+ # Values can be accessed with any object that responds to +to_sym+ or
135+ # +to_r+/+to_f+ with a non-zero number.
136+ #
137+ # Config::[] gets named or numbered versions from this hash.
138+ #
139+ # For example:
140+ # Net::IMAP::Config.version_defaults[0.5] == Net::IMAP::Config[0.5]
141+ # Net::IMAP::Config[0.5] == Net::IMAP::Config[0.5r] # => true
142+ # Net::IMAP::Config["current"] == Net::IMAP::Config[:current] # => true
143+ # Net::IMAP::Config["0.5.6"] == Net::IMAP::Config[0.5r] # => true
134144 def self . version_defaults ; @version_defaults end
135- @version_defaults = { }
145+ @version_defaults = Hash . new { |h , k |
146+ # NOTE: String responds to both so the order is significant.
147+ # And ignore non-numeric conversion to zero, because: "wat!?".to_r == 0
148+ ( h . fetch ( k . to_r , nil ) || h . fetch ( k . to_f , nil ) if k . is_a? ( Numeric ) ) ||
149+ ( h . fetch ( k . to_sym , nil ) if k . respond_to? ( :to_sym ) ) ||
150+ ( h . fetch ( k . to_r , nil ) if k . respond_to? ( :to_r ) && k . to_r != 0 r) ||
151+ ( h . fetch ( k . to_f , nil ) if k . respond_to? ( :to_f ) && k . to_f != 0.0 )
152+ }
136153
137154 # :call-seq:
138155 # Net::IMAP::Config[number] -> versioned config
@@ -155,18 +172,17 @@ def self.[](config)
155172 elsif config . nil? && global . nil? then nil
156173 elsif config . respond_to? ( :to_hash ) then new ( global , **config ) . freeze
157174 else
158- version_defaults . fetch ( config ) do
175+ version_defaults [ config ] or
159176 case config
160177 when Numeric
161178 raise RangeError , "unknown config version: %p" % [ config ]
162- when Symbol
179+ when String , Symbol
163180 raise KeyError , "unknown config name: %p" % [ config ]
164181 else
165182 raise TypeError , "no implicit conversion of %s to %s" % [
166183 config . class , Config
167184 ]
168185 end
169- end
170186 end
171187 end
172188
@@ -439,44 +455,52 @@ def defaults_hash
439455
440456 version_defaults [ :default ] = Config [ default . send ( :defaults_hash ) ]
441457
442- version_defaults [ 0 ] = Config [ :default ] . dup . update (
458+ version_defaults [ 0 r ] = Config [ :default ] . dup . update (
443459 sasl_ir : false ,
444460 responses_without_block : :silence_deprecation_warning ,
445461 enforce_logindisabled : false ,
446462 parser_use_deprecated_uidplus_data : true ,
447463 parser_max_deprecated_uidplus_data_size : 10_000 ,
448464 ) . 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 ]
465+ version_defaults [ 0.0 r ] = Config [ 0 r ]
466+ version_defaults [ 0.1 r ] = Config [ 0 r ]
467+ version_defaults [ 0.2 r ] = Config [ 0 r ]
468+ version_defaults [ 0.3 r ] = Config [ 0 r ]
453469
454- version_defaults [ 0.4 ] = Config [ 0.3 ] . dup . update (
470+ version_defaults [ 0.4 r ] = Config [ 0.3 r ] . dup . update (
455471 sasl_ir : true ,
456472 parser_max_deprecated_uidplus_data_size : 1000 ,
457473 ) . freeze
458474
459- version_defaults [ 0.5 ] = Config [ 0.4 ] . dup . update (
475+ version_defaults [ 0.5 r ] = Config [ 0.4 r ] . dup . update (
460476 enforce_logindisabled : true ,
461477 responses_without_block : :warn ,
462478 parser_use_deprecated_uidplus_data : :up_to_max_size ,
463479 parser_max_deprecated_uidplus_data_size : 100 ,
464480 ) . freeze
465481
466- version_defaults [ 0.6 ] = Config [ 0.5 ] . dup . update (
482+ version_defaults [ 0.6 r ] = Config [ 0.5 r ] . dup . update (
467483 responses_without_block : :frozen_dup ,
468484 parser_use_deprecated_uidplus_data : false ,
469485 parser_max_deprecated_uidplus_data_size : 0 ,
470486 ) . freeze
471487
472- version_defaults [ 0.7 ] = Config [ 0.6 ] . dup . update (
488+ version_defaults [ 0.7 r ] = Config [ 0.6 r ] . dup . update (
473489 ) . freeze
474490
475- current = VERSION . to_f
491+ # Safe conversions one way only:
492+ # 0.6r.to_f == 0.6 # => true
493+ # 0.6 .to_r == 0.6r # => false
494+ version_defaults . to_a . each do |k , v |
495+ next unless k in Rational
496+ version_defaults [ k . to_f ] = v
497+ end
498+
499+ current = VERSION . to_r
476500 version_defaults [ :original ] = Config [ 0 ]
477501 version_defaults [ :current ] = Config [ current ]
478- version_defaults [ :next ] = Config [ current + 0.1 ]
479- version_defaults [ :future ] = Config [ current + 0.2 ]
502+ version_defaults [ :next ] = Config [ current + 0.1 r ]
503+ version_defaults [ :future ] = Config [ current + 0.2 r ]
480504
481505 version_defaults . freeze
482506
0 commit comments