net-imap 0.4.13 → 0.4.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of net-imap might be problematic. Click here for more details.

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