net-imap 0.5.11 → 0.6.0
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 +5 -4
- data/lib/net/imap/command_data.rb +0 -68
- data/lib/net/imap/config/attr_inheritance.rb +14 -1
- data/lib/net/imap/config/attr_type_coercion.rb +1 -2
- data/lib/net/imap/config/attr_version_defaults.rb +93 -0
- data/lib/net/imap/config.rb +210 -122
- data/lib/net/imap/connection_state.rb +1 -1
- data/lib/net/imap/data_encoding.rb +77 -28
- data/lib/net/imap/esearch_result.rb +6 -0
- data/lib/net/imap/response_data.rb +2 -3
- data/lib/net/imap/response_parser.rb +8 -13
- data/lib/net/imap/search_result.rb +6 -0
- data/lib/net/imap/sequence_set.rb +621 -311
- data/lib/net/imap/uidplus_data.rb +2 -63
- data/lib/net/imap.rb +17 -23
- data/net-imap.gemspec +1 -1
- metadata +4 -4
- data/lib/net/imap/data_lite.rb +0 -226
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 561e6151a9540c8eaa6c12fd16d625061843a053fb0b0c8a2f215eb1a518ef70
|
|
4
|
+
data.tar.gz: 5be61c15097d2e0007822fc6c4825f59795d6078d6cf9b5cbe6ed4dd2bd1d22e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f84a8adf89f177e953fe57e390b027232bc4c7325ecb0049221a88db87fccc76a09281aea87c4f48de05bc547db1248b628b9c271134a466aedba953305001cc
|
|
7
|
+
data.tar.gz: 0b82898fb8581bab9a30c5b3edb96c89d81c4bddf197ade29a25ef166db827983a6c2c25d1eda9989a9f985cfcbec52f4bf484dbc1b57cfde32f432dcd0dfbc3
|
data/Gemfile
CHANGED
|
@@ -4,9 +4,10 @@ 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
|
+
gem "psych", ">= 5.3.0" # 5.2.5 for Data serialization, 5.3.0 for TruffleRuby
|
|
10
11
|
|
|
11
12
|
gem "irb"
|
|
12
13
|
gem "rake"
|
|
@@ -19,7 +20,7 @@ gem "benchmark-driver", require: false
|
|
|
19
20
|
gem "vernier", require: false, platform: :mri
|
|
20
21
|
|
|
21
22
|
group :test do
|
|
22
|
-
gem "simplecov", require: false
|
|
23
|
-
gem "simplecov-html", require: false
|
|
24
|
-
gem "simplecov-json", require: false
|
|
23
|
+
gem "simplecov", require: false, platforms: %i[mri windows]
|
|
24
|
+
gem "simplecov-html", require: false, platforms: %i[mri windows]
|
|
25
|
+
gem "simplecov-json", require: false, platforms: %i[mri windows]
|
|
25
26
|
end
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
require "date"
|
|
4
4
|
|
|
5
5
|
require_relative "errors"
|
|
6
|
-
require_relative "data_lite"
|
|
7
6
|
|
|
8
7
|
module Net
|
|
9
8
|
class IMAP < Protocol
|
|
@@ -185,73 +184,6 @@ module Net
|
|
|
185
184
|
end
|
|
186
185
|
end
|
|
187
186
|
|
|
188
|
-
# *DEPRECATED*. Replaced by SequenceSet.
|
|
189
|
-
class MessageSet < CommandData # :nodoc:
|
|
190
|
-
def send_data(imap, tag)
|
|
191
|
-
imap.__send__(:put_string, format_internal(data))
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def validate
|
|
195
|
-
validate_internal(data)
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
private
|
|
199
|
-
|
|
200
|
-
def initialize(data:)
|
|
201
|
-
super
|
|
202
|
-
warn("DEPRECATED: #{MessageSet} should be replaced with #{SequenceSet}.",
|
|
203
|
-
uplevel: 1, category: :deprecated)
|
|
204
|
-
begin
|
|
205
|
-
# to ensure the input works with SequenceSet, too
|
|
206
|
-
SequenceSet.new(data)
|
|
207
|
-
rescue
|
|
208
|
-
warn "MessageSet input is incompatible with SequenceSet: [%s] %s" % [
|
|
209
|
-
$!.class, $!.message
|
|
210
|
-
]
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
def format_internal(data)
|
|
215
|
-
case data
|
|
216
|
-
when "*"
|
|
217
|
-
return data
|
|
218
|
-
when Integer
|
|
219
|
-
if data == -1
|
|
220
|
-
return "*"
|
|
221
|
-
else
|
|
222
|
-
return data.to_s
|
|
223
|
-
end
|
|
224
|
-
when Range
|
|
225
|
-
return format_internal(data.first) +
|
|
226
|
-
":" + format_internal(data.last)
|
|
227
|
-
when Array
|
|
228
|
-
return data.collect {|i| format_internal(i)}.join(",")
|
|
229
|
-
when ThreadMember
|
|
230
|
-
return data.seqno.to_s +
|
|
231
|
-
":" + data.children.collect {|i| format_internal(i).join(",")}
|
|
232
|
-
end
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
def validate_internal(data)
|
|
236
|
-
case data
|
|
237
|
-
when "*"
|
|
238
|
-
when Integer
|
|
239
|
-
NumValidator.ensure_nz_number(data)
|
|
240
|
-
when Range
|
|
241
|
-
when Array
|
|
242
|
-
data.each do |i|
|
|
243
|
-
validate_internal(i)
|
|
244
|
-
end
|
|
245
|
-
when ThreadMember
|
|
246
|
-
data.children.each do |i|
|
|
247
|
-
validate_internal(i)
|
|
248
|
-
end
|
|
249
|
-
else
|
|
250
|
-
raise DataFormatError, data.inspect
|
|
251
|
-
end
|
|
252
|
-
end
|
|
253
|
-
end
|
|
254
|
-
|
|
255
187
|
class ClientID < CommandData # :nodoc:
|
|
256
188
|
|
|
257
189
|
def send_data(imap, tag)
|
|
@@ -54,9 +54,22 @@ module Net
|
|
|
54
54
|
# Creates a new config, which inherits from +self+.
|
|
55
55
|
def new(**attrs) self.class.new(self, **attrs) end
|
|
56
56
|
|
|
57
|
+
# :call-seq:
|
|
58
|
+
# inherited?(attr) -> true or false
|
|
59
|
+
# inherited?(*attrs) -> true or false
|
|
60
|
+
# inherited? -> true or false
|
|
61
|
+
#
|
|
57
62
|
# Returns +true+ if +attr+ is inherited from #parent and not overridden
|
|
58
63
|
# by this config.
|
|
59
|
-
|
|
64
|
+
#
|
|
65
|
+
# When multiple +attrs+ are given, returns +true+ if *all* of them are
|
|
66
|
+
# inherited, or +false+ if any of them are overriden. When no +attrs+
|
|
67
|
+
# are given, returns +true+ if *all* attributes are inherited, or
|
|
68
|
+
# +false+ if any attribute is overriden.
|
|
69
|
+
def inherited?(*attrs)
|
|
70
|
+
attrs = data.members if attrs.empty?
|
|
71
|
+
attrs.all? { data[_1] == INHERITED }
|
|
72
|
+
end
|
|
60
73
|
|
|
61
74
|
# :call-seq:
|
|
62
75
|
# reset -> self
|
|
@@ -60,8 +60,7 @@ module Net
|
|
|
60
60
|
NilOrInteger = safe{->val { Integer val unless val.nil? }}
|
|
61
61
|
|
|
62
62
|
Enum = ->(*enum) {
|
|
63
|
-
|
|
64
|
-
safe_enum = safe{sh_enum}
|
|
63
|
+
safe_enum = safe{enum}
|
|
65
64
|
expected = -"one of #{safe_enum.map(&:inspect).join(", ")}"
|
|
66
65
|
safe{->val {
|
|
67
66
|
return val if safe_enum.include?(val)
|
|
@@ -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
|