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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b7f77489a5f69bb5cf159039328259e7a0e52d18453b8777ab312b7051ec0542
4
- data.tar.gz: d2417b81c84dd93424983354ed42995bfc5af9ac30c8c115c75595a7746e5fc5
3
+ metadata.gz: 561e6151a9540c8eaa6c12fd16d625061843a053fb0b0c8a2f215eb1a518ef70
4
+ data.tar.gz: 5be61c15097d2e0007822fc6c4825f59795d6078d6cf9b5cbe6ed4dd2bd1d22e
5
5
  SHA512:
6
- metadata.gz: d20e857ab3284f3c2748da9b7324909d99f87cf8bfe52f44f2e77ba49154a34d39f3008106388e8c2cc644b83a72a1c71ef042617b780173a8dbb49e2c11bc6f
7
- data.tar.gz: a60ec27b5db745e3b77d7e9aa2fb75091941a84b4a6b39bf27bfd640361ca082b1861f3828efdfc31fa54090b3f851b68ba8cf5f11def050a4c49b319ce0b42d
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
- def inherited?(attr) data[attr] == INHERITED end
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
- sh_enum = Ractor.make_shareable(enum)
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