net-imap 0.4.13 → 0.4.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a7254a9f8865dfd12d8887a0ce62f58d764f43acb3eea019fadd13ff3f6983c
4
- data.tar.gz: 8a3ae5456b5a7d78f72d862e6dcf8f8df86ec6a3d32956314c1eadc36bf5def0
3
+ metadata.gz: 06be993e038a4432ec954b11701ce86f946c456f9125d2b539e6c21d05e728ab
4
+ data.tar.gz: 7807fb77537a843e9d9a2ad0ad892dc3e75af3a734f2c4c68a1e2cbae4d34ef1
5
5
  SHA512:
6
- metadata.gz: 41ee8dd354e77a06f4875ad559efb6dbae6f60c39ad714d0de46efe8a49e125194b48e02cce4d1425c73122c57ec300dcd4e7707409bcf964318146b3b9e6168
7
- data.tar.gz: 215057347ecca04a9816df24b5250f124b2b655615507ef84e6b2a12567b23810da9f394f74801cd046c18e7d01072a567b95eb241bb7db7896982e9d24e414f
6
+ metadata.gz: 182edade4a45d1c6f4772332f2f9cd4704827895770764202aa843bfbb754defff11a8037c1955e352642201c57cea850ea51aa8e4fe6c1761b36c78562b1c5b
7
+ data.tar.gz: 2fff884a15a87ae7cb4a5ac422f743b5accd1ea98b34bf994cbb18238577cc259a1a672a04e5dac14864ad61bdafd90c43c160ede8ba369246fd3bb265e5cff2
@@ -59,6 +59,11 @@ module Net
59
59
 
60
60
  private
61
61
 
62
+ def initialize_clone(other)
63
+ super
64
+ @data = other.data.clone
65
+ end
66
+
62
67
  def initialize_dup(other)
63
68
  super
64
69
  @data = other.data.dup
@@ -54,25 +54,117 @@ module Net
54
54
  # plain_client.config.inherited?(:debug) # => true
55
55
  # plain_client.config.debug? # => false
56
56
  #
57
+ # == Versioned defaults
58
+ #
59
+ # The effective default configuration for a specific +x.y+ version of
60
+ # +net-imap+ can be loaded with the +config+ keyword argument to
61
+ # Net::IMAP.new. Requesting default configurations for previous versions
62
+ # enables extra backward compatibility with those versions:
63
+ #
64
+ # client = Net::IMAP.new(hostname, config: 0.3)
65
+ # client.config.sasl_ir # => false
66
+ # client.config.responses_without_block # => :silence_deprecation_warning
67
+ #
68
+ # client = Net::IMAP.new(hostname, config: 0.4)
69
+ # client.config.sasl_ir # => true
70
+ # client.config.responses_without_block # => :silence_deprecation_warning
71
+ #
72
+ # client = Net::IMAP.new(hostname, config: 0.5)
73
+ # client.config.sasl_ir # => true
74
+ # client.config.responses_without_block # => :warn
75
+ #
76
+ # client = Net::IMAP.new(hostname, config: :future)
77
+ # client.config.sasl_ir # => true
78
+ # client.config.responses_without_block # => :raise
79
+ #
80
+ # The versioned default configs inherit certain specific config options from
81
+ # Config.global, for example #debug:
82
+ #
83
+ # client = Net::IMAP.new(hostname, config: 0.4)
84
+ # Net::IMAP.debug = false
85
+ # client.config.debug? # => false
86
+ #
87
+ # Net::IMAP.debug = true
88
+ # client.config.debug? # => true
89
+ #
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
+ #
96
+ # === Named defaults
97
+ # In addition to +x.y+ version numbers, the following aliases are supported:
98
+ #
99
+ # [+:default+]
100
+ # An alias for +:current+.
101
+ #
102
+ # >>>
103
+ # *NOTE*: This is _not_ the same as Config.default. It inherits some
104
+ # attributes from Config.global, for example: #debug.
105
+ # [+:current+]
106
+ # An alias for the current +x.y+ version's defaults.
107
+ # [+:next+]
108
+ # The _planned_ config for the next +x.y+ version.
109
+ # [+:future+]
110
+ # The _planned_ eventual config for some future +x.y+ version.
111
+ #
112
+ # For example, to raise exceptions for all current deprecations:
113
+ # client = Net::IMAP.new(hostname, config: :future)
114
+ # client.responses # raises an ArgumentError
57
115
  #
58
116
  # == Thread Safety
59
117
  #
60
118
  # *NOTE:* Updates to config objects are not synchronized for thread-safety.
61
119
  #
62
120
  class Config
121
+ # Array of attribute names that are _not_ loaded by #load_defaults.
122
+ DEFAULT_TO_INHERIT = %i[debug].freeze
123
+ private_constant :DEFAULT_TO_INHERIT
124
+
63
125
  # The default config, which is hardcoded and frozen.
64
126
  def self.default; @default end
65
127
 
66
128
  # The global config object. Also available from Net::IMAP.config.
67
- def self.global; @global end
129
+ def self.global; @global if defined?(@global) end
130
+
131
+ # A hash of hard-coded configurations, indexed by version number.
132
+ def self.version_defaults; @version_defaults end
133
+ @version_defaults = {}
68
134
 
69
- def self.[](config) # :nodoc: unfinished API
70
- if config.is_a?(Config) || config.nil? && global.nil?
71
- config
135
+ # :call-seq:
136
+ # Net::IMAP::Config[number] -> versioned config
137
+ # Net::IMAP::Config[symbol] -> named config
138
+ # Net::IMAP::Config[hash] -> new frozen config
139
+ # Net::IMAP::Config[config] -> same config
140
+ #
141
+ # Given a version number, returns the default configuration for the target
142
+ # version. See Config@Versioned+defaults.
143
+ #
144
+ # Given a version name, returns the default configuration for the target
145
+ # version. See Config@Named+defaults.
146
+ #
147
+ # Given a Hash, creates a new _frozen_ config which inherits from
148
+ # Config.global. Use Config.new for an unfrozen config.
149
+ #
150
+ # Given a config, returns that same config.
151
+ def self.[](config)
152
+ if config.is_a?(Config) then config
153
+ elsif config.nil? && global.nil? then nil
154
+ elsif config.respond_to?(:to_hash) then new(global, **config).freeze
72
155
  else
73
- raise TypeError, "no implicit conversion of %s to %s" % [
74
- config.class, Config
75
- ]
156
+ version_defaults.fetch(config) do
157
+ case config
158
+ when Numeric
159
+ raise RangeError, "unknown config version: %p" % [config]
160
+ when Symbol
161
+ raise KeyError, "unknown config name: %p" % [config]
162
+ else
163
+ raise TypeError, "no implicit conversion of %s to %s" % [
164
+ config.class, Config
165
+ ]
166
+ end
167
+ end
76
168
  end
77
169
  end
78
170
 
@@ -143,10 +235,72 @@ module Net
143
235
  # If a block is given, the new config object is yielded to it.
144
236
  def initialize(parent = Config.global, **attrs)
145
237
  super(parent)
146
- attrs.each do send(:"#{_1}=", _2) end
238
+ update(**attrs)
147
239
  yield self if block_given?
148
240
  end
149
241
 
242
+ # :call-seq: update(**attrs) -> self
243
+ #
244
+ # Assigns all of the provided +attrs+ to this config, and returns +self+.
245
+ #
246
+ # An ArgumentError is raised unless every key in +attrs+ matches an
247
+ # assignment method on Config.
248
+ #
249
+ # >>>
250
+ # *NOTE:* #update is not atomic. If an exception is raised due to an
251
+ # invalid attribute value, +attrs+ may be partially applied.
252
+ def update(**attrs)
253
+ unless (bad = attrs.keys.reject { respond_to?(:"#{_1}=") }).empty?
254
+ raise ArgumentError, "invalid config options: #{bad.join(", ")}"
255
+ end
256
+ attrs.each do send(:"#{_1}=", _2) end
257
+ self
258
+ end
259
+
260
+ # :call-seq:
261
+ # with(**attrs) -> config
262
+ # with(**attrs) {|config| } -> result
263
+ #
264
+ # Without a block, returns a new config which inherits from self. With a
265
+ # block, yields the new config and returns the block's result.
266
+ #
267
+ # If no keyword arguments are given, an ArgumentError will be raised.
268
+ #
269
+ # If +self+ is frozen, the copy will also be frozen.
270
+ def with(**attrs)
271
+ attrs.empty? and
272
+ raise ArgumentError, "expected keyword arguments, none given"
273
+ copy = new(**attrs)
274
+ copy.freeze if frozen?
275
+ block_given? ? yield(copy) : copy
276
+ end
277
+
278
+ # :call-seq: load_defaults(version) -> self
279
+ #
280
+ # Resets the current config to behave like the versioned default
281
+ # configuration for +version+. #parent will not be changed.
282
+ #
283
+ # Some config attributes default to inheriting from their #parent (which
284
+ # is usually Config.global) and are left unchanged, for example: #debug.
285
+ #
286
+ # See Config@Versioned+defaults and Config@Named+defaults.
287
+ def load_defaults(version)
288
+ [Numeric, Symbol, String].any? { _1 === version } or
289
+ raise ArgumentError, "expected number or symbol, got %p" % [version]
290
+ update(**Config[version].defaults_hash)
291
+ end
292
+
293
+ # :call-seq: to_h -> hash
294
+ #
295
+ # Returns all config attributes in a hash.
296
+ def to_h; data.members.to_h { [_1, send(_1)] } end
297
+
298
+ protected
299
+
300
+ def defaults_hash
301
+ to_h.reject {|k,v| DEFAULT_TO_INHERIT.include?(k) }
302
+ end
303
+
150
304
  @default = new(
151
305
  debug: false,
152
306
  open_timeout: 30,
@@ -157,6 +311,29 @@ module Net
157
311
 
158
312
  @global = default.new
159
313
 
314
+ version_defaults[0.4] = Config[default.send(:defaults_hash)]
315
+
316
+ version_defaults[0] = Config[0.4].dup.update(
317
+ sasl_ir: false,
318
+ ).freeze
319
+ version_defaults[0.0] = Config[0]
320
+ version_defaults[0.1] = Config[0]
321
+ version_defaults[0.2] = Config[0]
322
+ version_defaults[0.3] = Config[0]
323
+
324
+ version_defaults[0.5] = Config[0.4].dup.update(
325
+ responses_without_block: :warn,
326
+ ).freeze
327
+
328
+ version_defaults[:default] = Config[0.4]
329
+ version_defaults[:current] = Config[0.4]
330
+ version_defaults[:next] = Config[0.5]
331
+
332
+ version_defaults[:future] = Config[0.5].dup.update(
333
+ responses_without_block: :raise,
334
+ ).freeze
335
+
336
+ version_defaults.freeze
160
337
  end
161
338
  end
162
339
  end
data/lib/net/imap.rb CHANGED
@@ -717,7 +717,7 @@ module Net
717
717
  # * {IMAP URLAUTH Authorization Mechanism Registry}[https://www.iana.org/assignments/urlauth-authorization-mechanism-registry/urlauth-authorization-mechanism-registry.xhtml]
718
718
  #
719
719
  class IMAP < Protocol
720
- VERSION = "0.4.13"
720
+ VERSION = "0.4.14"
721
721
 
722
722
  # Aliases for supported capabilities, to be used with the #enable command.
723
723
  ENABLE_ALIASES = {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-imap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.13
4
+ version: 0.4.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shugo Maeda
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2024-06-16 00:00:00.000000000 Z
12
+ date: 2024-06-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: net-protocol