net-imap 0.5.12 → 0.5.13

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57bfc92d10c2b8f139254627f6998a5c6e1c83111c41dac22a1cae22fdc11a75
4
- data.tar.gz: 7ca4ce789ff544967728d1b4b9106617f5c7a1b0b79beae999d0e22505e2b49c
3
+ metadata.gz: 1da7db7eb1545ee4a81555ef7f46c65e82e48ad8e4b64a4112881698df4ebc5d
4
+ data.tar.gz: b3a668019d4d36c2a9cfc8d41c5e65d1054a630dc2c5cb8ea7050fbaaf264f6b
5
5
  SHA512:
6
- metadata.gz: 8ec55fe5a02b72fa061cb77f23c592806fd8361d4b371f8f124fed106c93ac01359af7bb4f194341ad66035ba24e1ddee3a100ab2de08d60367e0af2a9c3c94b
7
- data.tar.gz: b97339aae765227112a0e7308a68e969028495b243438e0dc37f049cfa310c385f4735bf5bd2460711d907c99a43abb1f8411aa72d742b5e4a3c337916500167
6
+ metadata.gz: 731921ff022993cd51ada037fa764067d4da07e6a8119545f7b225354b32f19c3936a8c807c3badd3664dde424c924842ecb0ac9851d74bb9bf568ebbbb800e6
7
+ data.tar.gz: da993296fd57d59c56c483920d901c9b6b44329c0bb5812c495de2024f01e449b0117be5900013875902ff1101ac0dfeaf177f407ea34e69ae210bd87f91e86a
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
- gem "digest"
7
+ # gem "digest" # not included as a workaround for #576
8
8
  gem "strscan"
9
9
  gem "base64"
10
10
 
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Net
6
+ class IMAP
7
+ class Config
8
+ # >>>
9
+ # *NOTE:* This module is an internal implementation detail, with no
10
+ # guarantee of backward compatibility.
11
+ #
12
+ # Adds a +defaults+ parameter to +attr_accessor+, which is used to compile
13
+ # Config.version_defaults.
14
+ module AttrVersionDefaults
15
+ # The <tt>x.y</tt> part of Net::IMAP::VERSION, as a Rational number.
16
+ CURRENT_VERSION = VERSION.to_r
17
+
18
+ # The config version used for <tt>Config[:next]</tt>.
19
+ NEXT_VERSION = CURRENT_VERSION + 0.1r
20
+
21
+ # The config version used for <tt>Config[:future]</tt>.
22
+ FUTURE_VERSION = 1.0r
23
+
24
+ VERSIONS = ((0.0r..FUTURE_VERSION) % 0.1r).to_a.freeze
25
+
26
+ # See Config.version_defaults.
27
+ singleton_class.attr_accessor :version_defaults
28
+
29
+ @version_defaults = Hash.new {|h, k|
30
+ # NOTE: String responds to both so the order is significant.
31
+ # And ignore non-numeric conversion to zero, because: "wat!?".to_r == 0
32
+ (h.fetch(k.to_r, nil) || h.fetch(k.to_f, nil) if k.is_a?(Numeric)) ||
33
+ (h.fetch(k.to_sym, nil) if k.respond_to?(:to_sym)) ||
34
+ (h.fetch(k.to_r, nil) if k.respond_to?(:to_r) && k.to_r != 0r) ||
35
+ (h.fetch(k.to_f, nil) if k.respond_to?(:to_f) && k.to_f != 0.0)
36
+ }
37
+
38
+ # :stopdoc: internal APIs only
39
+
40
+ def attr_accessor(name, defaults: nil, default: (unset = true), **kw)
41
+ unless unset
42
+ version = DEFAULT_TO_INHERIT.include?(name) ? nil : 0.0r
43
+ defaults = { version => default }
44
+ end
45
+ defaults&.each_pair do |version, default|
46
+ AttrVersionDefaults.version_defaults[version] ||= {}
47
+ AttrVersionDefaults.version_defaults[version][name] = default
48
+ end
49
+ super(name, **kw)
50
+ end
51
+
52
+ def self.compile_default!
53
+ raise "Config.default already compiled" if Config.default
54
+ default = VERSIONS.select { _1 <= CURRENT_VERSION }
55
+ .filter_map { version_defaults[_1] }
56
+ .prepend(version_defaults.delete(nil))
57
+ .inject(&:merge)
58
+ Config.new(**default).freeze
59
+ end
60
+
61
+ def self.compile_version_defaults!
62
+ # Temporarily assign Config.default, enabling #load_defaults(:default)
63
+ version_defaults[:default] = Config.default
64
+ # Use #load_defaults so some attributes are inherited from global.
65
+ version_defaults[:default] = Config.new.load_defaults(:default).freeze
66
+ version_defaults[0.0r] = Config[version_defaults.fetch(0.0r)]
67
+
68
+ VERSIONS.each_cons(2) do |prior, version|
69
+ updates = version_defaults[version]
70
+ version_defaults[version] = version_defaults[prior]
71
+ .then { updates ? _1.dup.update(**updates).freeze : _1 }
72
+ end
73
+
74
+ # Safe conversions one way only:
75
+ # 0.6r.to_f == 0.6 # => true
76
+ # 0.6 .to_r == 0.6r # => false
77
+ version_defaults.to_a.each do |k, v|
78
+ next unless k in Rational
79
+ version_defaults[k.to_f] = v
80
+ end
81
+
82
+ version_defaults[:original] = Config[0.0r]
83
+ version_defaults[:current] = Config[CURRENT_VERSION]
84
+ version_defaults[:next] = Config[NEXT_VERSION]
85
+ version_defaults[:future] = Config[FUTURE_VERSION]
86
+
87
+ version_defaults.freeze
88
+ end
89
+
90
+ end
91
+ end
92
+ end
93
+ end
@@ -3,6 +3,7 @@
3
3
  require_relative "config/attr_accessors"
4
4
  require_relative "config/attr_inheritance"
5
5
  require_relative "config/attr_type_coercion"
6
+ require_relative "config/attr_version_defaults"
6
7
 
7
8
  module Net
8
9
  class IMAP
@@ -141,15 +142,7 @@ module Net
141
142
  # Net::IMAP::Config[0.5] == Net::IMAP::Config[0.5r] # => true
142
143
  # Net::IMAP::Config["current"] == Net::IMAP::Config[:current] # => true
143
144
  # Net::IMAP::Config["0.5.6"] == Net::IMAP::Config[0.5r] # => true
144
- def self.version_defaults; @version_defaults end
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 != 0r) ||
151
- (h.fetch(k.to_f, nil) if k.respond_to?(:to_f) && k.to_f != 0.0)
152
- }
145
+ def self.version_defaults; AttrVersionDefaults.version_defaults end
153
146
 
154
147
  # :call-seq:
155
148
  # Net::IMAP::Config[number] -> versioned config
@@ -189,6 +182,7 @@ module Net
189
182
  include AttrAccessors
190
183
  include AttrInheritance
191
184
  include AttrTypeCoercion
185
+ extend AttrVersionDefaults
192
186
 
193
187
  # The debug mode (boolean). The default value is +false+.
194
188
  #
@@ -200,7 +194,7 @@ module Net
200
194
  #
201
195
  # *NOTE:* Versioned default configs inherit #debug from Config.global, and
202
196
  # #load_defaults will not override #debug.
203
- attr_accessor :debug, type: :boolean
197
+ attr_accessor :debug, type: :boolean, default: false
204
198
 
205
199
  # method: debug?
206
200
  # :call-seq: debug? -> boolean
@@ -218,7 +212,7 @@ module Net
218
212
  # See Net::IMAP.new and Net::IMAP#starttls.
219
213
  #
220
214
  # The default value is +30+ seconds.
221
- attr_accessor :open_timeout, type: Integer
215
+ attr_accessor :open_timeout, type: Integer, default: 30
222
216
 
223
217
  # Seconds to wait until an IDLE response is received, after
224
218
  # the client asks to leave the IDLE state.
@@ -226,7 +220,7 @@ module Net
226
220
  # See Net::IMAP#idle and Net::IMAP#idle_done.
227
221
  #
228
222
  # The default value is +5+ seconds.
229
- attr_accessor :idle_response_timeout, type: Integer
223
+ attr_accessor :idle_response_timeout, type: Integer, default: 5
230
224
 
231
225
  # Whether to use the +SASL-IR+ extension when the server and \SASL
232
226
  # mechanism both support it. Can be overridden by the +sasl_ir+ keyword
@@ -242,7 +236,10 @@ module Net
242
236
  #
243
237
  # [+true+ <em>(default since +v0.4+)</em>]
244
238
  # Use +SASL-IR+ when it is supported by the server and the mechanism.
245
- attr_accessor :sasl_ir, type: :boolean
239
+ attr_accessor :sasl_ir, type: :boolean, defaults: {
240
+ 0.0r => false,
241
+ 0.4r => true,
242
+ }
246
243
 
247
244
  # Controls the behavior of Net::IMAP#login when the +LOGINDISABLED+
248
245
  # capability is present. When enforced, Net::IMAP will raise a
@@ -266,7 +263,10 @@ module Net
266
263
  #
267
264
  attr_accessor :enforce_logindisabled, type: Enum[
268
265
  false, :when_capabilities_cached, true
269
- ]
266
+ ], defaults: {
267
+ 0.0r => false,
268
+ 0.5r => true,
269
+ }
270
270
 
271
271
  # The maximum allowed server response size. When +nil+, there is no limit
272
272
  # on response size.
@@ -300,7 +300,10 @@ module Net
300
300
  #
301
301
  # * original: +nil+ <em>(no limit)</em>
302
302
  # * +0.5+: 512 MiB
303
- attr_accessor :max_response_size, type: Integer?
303
+ attr_accessor :max_response_size, type: Integer?, defaults: {
304
+ 0.0r => nil,
305
+ 0.5r => 512 << 20, # 512 MiB
306
+ }
304
307
 
305
308
  # Controls the behavior of Net::IMAP#responses when called without any
306
309
  # arguments (+type+ or +block+).
@@ -330,7 +333,11 @@ module Net
330
333
  # Note: #responses_without_args is an alias for #responses_without_block.
331
334
  attr_accessor :responses_without_block, type: Enum[
332
335
  :silence_deprecation_warning, :warn, :frozen_dup, :raise,
333
- ]
336
+ ], defaults: {
337
+ 0.0r => :silence_deprecation_warning,
338
+ 0.5r => :warn,
339
+ 0.6r => :frozen_dup,
340
+ }
334
341
 
335
342
  alias responses_without_args responses_without_block # :nodoc:
336
343
  alias responses_without_args= responses_without_block= # :nodoc:
@@ -375,7 +382,11 @@ module Net
375
382
  # ResponseParser _only_ uses AppendUIDData and CopyUIDData.
376
383
  attr_accessor :parser_use_deprecated_uidplus_data, type: Enum[
377
384
  true, :up_to_max_size, false
378
- ]
385
+ ], defaults: {
386
+ 0.0r => true,
387
+ 0.5r => :up_to_max_size,
388
+ 0.6r => false,
389
+ }
379
390
 
380
391
  # The maximum +uid-set+ size that ResponseParser will parse into
381
392
  # deprecated UIDPlusData. This limit only applies when
@@ -399,7 +410,13 @@ module Net
399
410
  # * +0.5+: <tt>100</tt>
400
411
  # * +0.6+: <tt>0</tt>
401
412
  #
402
- attr_accessor :parser_max_deprecated_uidplus_data_size, type: Integer
413
+ attr_accessor :parser_max_deprecated_uidplus_data_size, type: Integer,
414
+ defaults: {
415
+ 0.0r => 10_000,
416
+ 0.4r => 1_000,
417
+ 0.5r => 100,
418
+ 0.6r => 0,
419
+ }
403
420
 
404
421
  # Creates a new config object and initialize its attribute with +attrs+.
405
422
  #
@@ -474,79 +491,10 @@ module Net
474
491
  to_h.reject {|k,v| DEFAULT_TO_INHERIT.include?(k) }
475
492
  end
476
493
 
477
- @default = new(
478
- debug: false,
479
- open_timeout: 30,
480
- idle_response_timeout: 5,
481
- sasl_ir: true,
482
- enforce_logindisabled: true,
483
- max_response_size: 512 << 20, # 512 MiB
484
- responses_without_block: :warn,
485
- parser_use_deprecated_uidplus_data: :up_to_max_size,
486
- parser_max_deprecated_uidplus_data_size: 100,
487
- ).freeze
488
-
489
- @global = default.new
490
-
491
- version_defaults[:default] = Config[default.send(:defaults_hash)]
492
-
493
- version_defaults[0r] = Config[:default].dup.update(
494
- sasl_ir: false,
495
- responses_without_block: :silence_deprecation_warning,
496
- enforce_logindisabled: false,
497
- max_response_size: nil,
498
- parser_use_deprecated_uidplus_data: true,
499
- parser_max_deprecated_uidplus_data_size: 10_000,
500
- ).freeze
501
- version_defaults[0.0r] = Config[0r]
502
- version_defaults[0.1r] = Config[0r]
503
- version_defaults[0.2r] = Config[0r]
504
- version_defaults[0.3r] = Config[0r]
505
-
506
- version_defaults[0.4r] = Config[0.3r].dup.update(
507
- sasl_ir: true,
508
- parser_max_deprecated_uidplus_data_size: 1000,
509
- ).freeze
494
+ @default = AttrVersionDefaults.compile_default!
495
+ @global = default.new
496
+ AttrVersionDefaults.compile_version_defaults!
510
497
 
511
- version_defaults[0.5r] = Config[0.4r].dup.update(
512
- enforce_logindisabled: true,
513
- max_response_size: 512 << 20, # 512 MiB
514
- responses_without_block: :warn,
515
- parser_use_deprecated_uidplus_data: :up_to_max_size,
516
- parser_max_deprecated_uidplus_data_size: 100,
517
- ).freeze
518
-
519
- version_defaults[0.6r] = Config[0.5r].dup.update(
520
- responses_without_block: :frozen_dup,
521
- parser_use_deprecated_uidplus_data: false,
522
- parser_max_deprecated_uidplus_data_size: 0,
523
- ).freeze
524
-
525
- version_defaults[0.7r] = Config[0.6r].dup.update(
526
- ).freeze
527
-
528
- # Safe conversions one way only:
529
- # 0.6r.to_f == 0.6 # => true
530
- # 0.6 .to_r == 0.6r # => false
531
- version_defaults.to_a.each do |k, v|
532
- next unless k in Rational
533
- version_defaults[k.to_f] = v
534
- end
535
-
536
- current = VERSION.to_r
537
- version_defaults[:original] = Config[0]
538
- version_defaults[:current] = Config[current]
539
- version_defaults[:next] = Config[current + 0.1r]
540
- version_defaults[:future] = Config[current + 0.2r]
541
-
542
- version_defaults.freeze
543
-
544
- if ($VERBOSE || $DEBUG) && self[:current].to_h != self[:default].to_h
545
- warn "Misconfigured Net::IMAP::Config[:current] => %p,\n" \
546
- " not equal to Net::IMAP::Config[:default] => %p" % [
547
- self[:current].to_h, self[:default].to_h
548
- ]
549
- end
550
498
  end
551
499
  end
552
500
  end
@@ -755,7 +755,13 @@ module Net
755
755
  # Related: #min, #minmax, #slice
756
756
  def max(count = nil, star: :*)
757
757
  if count
758
- slice(-[count, size].min..) || remain_frozen_empty
758
+ # n.b: #cardinality has not been backported to 0.5
759
+ cardinality = @tuples.sum(@tuples.count) { _2 - _1 }
760
+ if cardinality <= count
761
+ frozen? ? self : dup
762
+ else
763
+ slice(-count..) || remain_frozen_empty
764
+ end
759
765
  elsif (val = @tuples.last&.last)
760
766
  val == STAR_INT ? star : val
761
767
  end
@@ -1024,8 +1030,9 @@ module Net
1024
1030
  # Related: #delete, #delete_at, #subtract, #difference, #disjoint?
1025
1031
  def delete?(element)
1026
1032
  modifying! # short-circuit before input_to_tuple
1033
+ element = input_try_convert(element)
1027
1034
  tuple = input_to_tuple element
1028
- if tuple.first == tuple.last
1035
+ if number_input?(element)
1029
1036
  return unless include_tuple? tuple
1030
1037
  tuple_subtract tuple
1031
1038
  normalize!
@@ -1790,6 +1797,14 @@ module Net
1790
1797
  input
1791
1798
  end
1792
1799
 
1800
+ # NOTE: input_try_convert must be called on input first
1801
+ def number_input?(input)
1802
+ case input
1803
+ when *STARS, Integer then true
1804
+ when String then !input.include?(/[:,]/)
1805
+ end
1806
+ end
1807
+
1793
1808
  def range_to_tuple(range)
1794
1809
  first = to_tuple_int(range.begin || 1)
1795
1810
  last = to_tuple_int(range.end || :*)
data/lib/net/imap.rb CHANGED
@@ -788,7 +788,7 @@ module Net
788
788
  # * {IMAP URLAUTH Authorization Mechanism Registry}[https://www.iana.org/assignments/urlauth-authorization-mechanism-registry/urlauth-authorization-mechanism-registry.xhtml]
789
789
  #
790
790
  class IMAP < Protocol
791
- VERSION = "0.5.12"
791
+ VERSION = "0.5.13"
792
792
 
793
793
  # Aliases for supported capabilities, to be used with the #enable command.
794
794
  ENABLE_ALIASES = {
@@ -2675,6 +2675,7 @@ module Net
2675
2675
  # # fetch should return quickly and allocate little memory
2676
2676
  # results.size # => 0..500
2677
2677
  # break if results.empty?
2678
+ # results.sort_by!(&:uid) # server may return results out of order
2678
2679
  # next_uid_to_fetch = results.last.uid + 1
2679
2680
  # process results
2680
2681
  # end
@@ -3232,7 +3233,7 @@ module Net
3232
3233
  warn(RESPONSES_DEPRECATION_MSG, uplevel: 1, category: :deprecated)
3233
3234
  when :frozen_dup
3234
3235
  synchronize {
3235
- responses = @responses.transform_values(&:freeze)
3236
+ responses = @responses.transform_values { _1.dup.freeze }
3236
3237
  responses.default_proc = nil
3237
3238
  responses.default = [].freeze
3238
3239
  return responses.freeze
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.5.12
4
+ version: 0.5.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shugo Maeda
@@ -60,6 +60,7 @@ files:
60
60
  - lib/net/imap/config/attr_accessors.rb
61
61
  - lib/net/imap/config/attr_inheritance.rb
62
62
  - lib/net/imap/config/attr_type_coercion.rb
63
+ - lib/net/imap/config/attr_version_defaults.rb
63
64
  - lib/net/imap/connection_state.rb
64
65
  - lib/net/imap/data_encoding.rb
65
66
  - lib/net/imap/data_lite.rb