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 +4 -4
- data/Gemfile +1 -1
- data/lib/net/imap/config/attr_version_defaults.rb +93 -0
- data/lib/net/imap/config.rb +38 -90
- data/lib/net/imap/sequence_set.rb +17 -2
- data/lib/net/imap.rb +3 -2
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1da7db7eb1545ee4a81555ef7f46c65e82e48ad8e4b64a4112881698df4ebc5d
|
|
4
|
+
data.tar.gz: b3a668019d4d36c2a9cfc8d41c5e65d1054a630dc2c5cb8ea7050fbaaf264f6b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 731921ff022993cd51ada037fa764067d4da07e6a8119545f7b225354b32f19c3936a8c807c3badd3664dde424c924842ecb0ac9851d74bb9bf568ebbbb800e6
|
|
7
|
+
data.tar.gz: da993296fd57d59c56c483920d901c9b6b44329c0bb5812c495de2024f01e449b0117be5900013875902ff1101ac0dfeaf177f407ea34e69ae210bd87f91e86a
|
data/Gemfile
CHANGED
|
@@ -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
|
data/lib/net/imap/config.rb
CHANGED
|
@@ -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;
|
|
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 =
|
|
478
|
-
|
|
479
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|