@@ -87,6 +87,12 @@ class IMAP
8787 # Net::IMAP.debug = true
8888 # client.config.debug? # => true
8989 #
90+ # Use #load_defaults to globally behave like a specific version:
91+ # client = Net::IMAP.new(hostname)
92+ # client.config.sasl_ir # => true
93+ # Net::IMAP.config.load_defaults 0.3
94+ # client.config.sasl_ir # => false
95+ #
9096 # === Named defaults
9197 # In addition to +x.y+ version numbers, the following aliases are supported:
9298 #
@@ -270,11 +276,32 @@ def with(**attrs)
270276 block_given? ? yield ( copy ) : copy
271277 end
272278
279+ # :call-seq: load_defaults(version) -> self
280+ #
281+ # Resets the current config to behave like the versioned default
282+ # configuration for +version+. #parent will not be changed.
283+ #
284+ # Some config attributes default to inheriting from their #parent (which
285+ # is usually Config.global) and are left unchanged, for example: #debug.
286+ #
287+ # See Config@Versioned+defaults and Config@Named+defaults.
288+ def load_defaults ( version )
289+ [ Numeric , Symbol , String ] . any? { _1 === version } or
290+ raise ArgumentError , "expected number or symbol, got %p" % [ version ]
291+ update ( **Config [ version ] . defaults_hash )
292+ end
293+
273294 # :call-seq: to_h -> hash
274295 #
275296 # Returns all config attributes in a hash.
276297 def to_h ; data . members . to_h { [ _1 , send ( _1 ) ] } end
277298
299+ protected
300+
301+ def defaults_hash
302+ to_h . reject { |k , v | DEFAULT_TO_INHERIT . include? ( k ) }
303+ end
304+
278305 @default = new (
279306 debug : false ,
280307 open_timeout : 30 ,
@@ -285,9 +312,7 @@ def to_h; data.members.to_h { [_1, send(_1)] } end
285312
286313 @global = default . new
287314
288- version_defaults [ 0.4 ] = Config [
289- default . to_h . reject { |k , v | DEFAULT_TO_INHERIT . include? ( k ) }
290- ]
315+ version_defaults [ 0.4 ] = Config [ default . send ( :defaults_hash ) ]
291316
292317 version_defaults [ 0 ] = Config [ 0.4 ] . dup . update (
293318 sasl_ir : false ,
0 commit comments