@@ -131,8 +131,25 @@ def self.default; @default end
131
131
def self . global ; @global if defined? ( @global ) end
132
132
133
133
# 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
134
144
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
+ }
136
153
137
154
# :call-seq:
138
155
# Net::IMAP::Config[number] -> versioned config
@@ -155,18 +172,17 @@ def self.[](config)
155
172
elsif config . nil? && global . nil? then nil
156
173
elsif config . respond_to? ( :to_hash ) then new ( global , **config ) . freeze
157
174
else
158
- version_defaults . fetch ( config ) do
175
+ version_defaults [ config ] or
159
176
case config
160
177
when Numeric
161
178
raise RangeError , "unknown config version: %p" % [ config ]
162
- when Symbol
179
+ when String , Symbol
163
180
raise KeyError , "unknown config name: %p" % [ config ]
164
181
else
165
182
raise TypeError , "no implicit conversion of %s to %s" % [
166
183
config . class , Config
167
184
]
168
185
end
169
- end
170
186
end
171
187
end
172
188
@@ -439,44 +455,52 @@ def defaults_hash
439
455
440
456
version_defaults [ :default ] = Config [ default . send ( :defaults_hash ) ]
441
457
442
- version_defaults [ 0 ] = Config [ :default ] . dup . update (
458
+ version_defaults [ 0 r ] = Config [ :default ] . dup . update (
443
459
sasl_ir : false ,
444
460
responses_without_block : :silence_deprecation_warning ,
445
461
enforce_logindisabled : false ,
446
462
parser_use_deprecated_uidplus_data : true ,
447
463
parser_max_deprecated_uidplus_data_size : 10_000 ,
448
464
) . 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 ]
453
469
454
- version_defaults [ 0.4 ] = Config [ 0.3 ] . dup . update (
470
+ version_defaults [ 0.4 r ] = Config [ 0.3 r ] . dup . update (
455
471
sasl_ir : true ,
456
472
parser_max_deprecated_uidplus_data_size : 1000 ,
457
473
) . freeze
458
474
459
- version_defaults [ 0.5 ] = Config [ 0.4 ] . dup . update (
475
+ version_defaults [ 0.5 r ] = Config [ 0.4 r ] . dup . update (
460
476
enforce_logindisabled : true ,
461
477
responses_without_block : :warn ,
462
478
parser_use_deprecated_uidplus_data : :up_to_max_size ,
463
479
parser_max_deprecated_uidplus_data_size : 100 ,
464
480
) . freeze
465
481
466
- version_defaults [ 0.6 ] = Config [ 0.5 ] . dup . update (
482
+ version_defaults [ 0.6 r ] = Config [ 0.5 r ] . dup . update (
467
483
responses_without_block : :frozen_dup ,
468
484
parser_use_deprecated_uidplus_data : false ,
469
485
parser_max_deprecated_uidplus_data_size : 0 ,
470
486
) . freeze
471
487
472
- version_defaults [ 0.7 ] = Config [ 0.6 ] . dup . update (
488
+ version_defaults [ 0.7 r ] = Config [ 0.6 r ] . dup . update (
473
489
) . freeze
474
490
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
476
500
version_defaults [ :original ] = Config [ 0 ]
477
501
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 ]
480
504
481
505
version_defaults . freeze
482
506
0 commit comments