net-imap 0.6.6 → 0.6.7
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/.simplecov +3 -2
- data/Gemfile +2 -2
- data/README.md +50 -24
- data/Rakefile +51 -4
- data/lib/net/imap/command_data.rb +13 -10
- data/lib/net/imap/config/attr_accessors.rb +2 -2
- data/lib/net/imap/config.rb +63 -3
- data/lib/net/imap/esearch_result.rb +2 -2
- data/lib/net/imap/fetch_data.rb +5 -5
- data/lib/net/imap/response_data.rb +79 -79
- data/lib/net/imap/response_parser.rb +2 -1
- data/lib/net/imap/sasl/client_adapter.rb +6 -6
- data/lib/net/imap/search_result.rb +4 -6
- data/lib/net/imap/sequence_set.rb +251 -8
- data/lib/net/imap.rb +194 -45
- data/rakelib/rdoc.rake +24 -0
- metadata +2 -2
|
@@ -73,15 +73,13 @@ module Net
|
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
# Hash equality. Unlike #==, order will be taken into account.
|
|
76
|
-
def hash
|
|
77
|
-
return super if modseq.nil?
|
|
78
|
-
[super, self.class, modseq].hash
|
|
79
|
-
end
|
|
76
|
+
def hash = [SearchResult, modseq, super].hash
|
|
80
77
|
|
|
81
78
|
# Hash equality. Unlike #==, order will be taken into account.
|
|
82
79
|
def eql?(other)
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
SearchResult === other &&
|
|
81
|
+
modseq == other.modseq &&
|
|
82
|
+
super
|
|
85
83
|
end
|
|
86
84
|
|
|
87
85
|
# Returns a string that represents the SearchResult.
|
|
@@ -256,6 +256,20 @@ module Net
|
|
|
256
256
|
# - #disjoint?:
|
|
257
257
|
# Returns whether +self+ and a given object have no common elements.
|
|
258
258
|
#
|
|
259
|
+
# <i>Comparison to a number:</i>
|
|
260
|
+
# - #all_above?:
|
|
261
|
+
# Returns whether every number in +self+ is greater than a given number.
|
|
262
|
+
# - #all_below?:
|
|
263
|
+
# Returns whether every number in +self+ is less than a given number.
|
|
264
|
+
# - #any_above?:
|
|
265
|
+
# Returns whether +self+ contains any numbers greater than a given number.
|
|
266
|
+
# - #any_below?:
|
|
267
|
+
# Returns whether +self+ contains any numbers less than a given number.
|
|
268
|
+
# - #none_above?:
|
|
269
|
+
# Returns whether +self+ contains no numbers greater than a given number.
|
|
270
|
+
# - #none_below?:
|
|
271
|
+
# Returns whether +self+ contains no numbers less than a given number.
|
|
272
|
+
#
|
|
259
273
|
# === Methods for Querying
|
|
260
274
|
# These methods do not modify +self+.
|
|
261
275
|
#
|
|
@@ -345,7 +359,7 @@ module Net
|
|
|
345
359
|
# - #above: Return a copy of +self+ which only contains numbers above a
|
|
346
360
|
# given number.
|
|
347
361
|
# - #below: Return a copy of +self+ which only contains numbers below a
|
|
348
|
-
# given
|
|
362
|
+
# given number.
|
|
349
363
|
# - #limit: Returns a copy of +self+ which has replaced <tt>*</tt> with a
|
|
350
364
|
# given maximum value and removed all members over that maximum.
|
|
351
365
|
#
|
|
@@ -774,6 +788,225 @@ module Net
|
|
|
774
788
|
empty? || import_runs(other).none? { intersect_run? _1 }
|
|
775
789
|
end
|
|
776
790
|
|
|
791
|
+
# :call-seq:
|
|
792
|
+
# all_above?(number) -> true or false
|
|
793
|
+
#
|
|
794
|
+
# Returns whether the set only contains numbers greater than +number+ (not
|
|
795
|
+
# inclusive of +number+).
|
|
796
|
+
#
|
|
797
|
+
# Net::IMAP::SequenceSet["5:8"].all_above?(9) => true
|
|
798
|
+
# Net::IMAP::SequenceSet["5:8"].all_above?(7) => false
|
|
799
|
+
# Net::IMAP::SequenceSet["5:8"].all_above?(5) => false
|
|
800
|
+
#
|
|
801
|
+
# <tt>"*"</tt> is evaluated as +UINT32_MAX+:
|
|
802
|
+
# Net::IMAP::SequenceSet["*"].all_above?(UINT32_MAX - 1) => true
|
|
803
|
+
# Net::IMAP::SequenceSet["*"].all_above?(UINT32_MAX) => false
|
|
804
|
+
#
|
|
805
|
+
# This is roughly equivalent to several other comparisons:
|
|
806
|
+
#
|
|
807
|
+
# # Given the following assumptions:
|
|
808
|
+
# set.empty? => false
|
|
809
|
+
# set.include_star? => false
|
|
810
|
+
# number => ^(1...UINT32_MAX)
|
|
811
|
+
#
|
|
812
|
+
# # Then these expressions will always return the same result:
|
|
813
|
+
# set.all_above?(number) => result
|
|
814
|
+
# set.none_below?(number + 1) => ^result
|
|
815
|
+
# !set.any_below?(number + 1) => ^result
|
|
816
|
+
#
|
|
817
|
+
# set == set.above(number) => ^result
|
|
818
|
+
# set.disjoint?(..number) => ^result
|
|
819
|
+
# number < set.min => ^result
|
|
820
|
+
#
|
|
821
|
+
# Related: {other comparison methods}[rdoc-ref:SequenceSet@Methods+for+Comparing],
|
|
822
|
+
# #above
|
|
823
|
+
def all_above?(number)
|
|
824
|
+
number = nz_number(number)
|
|
825
|
+
empty? || number < min(star: UINT32_MAX)
|
|
826
|
+
end
|
|
827
|
+
|
|
828
|
+
# :call-seq:
|
|
829
|
+
# all_below?(number) -> true or false
|
|
830
|
+
#
|
|
831
|
+
# Returns whether the set only contains numbers less than +number+ (not
|
|
832
|
+
# inclusive of +number+).
|
|
833
|
+
#
|
|
834
|
+
# Net::IMAP::SequenceSet["5:8"].all_below?(9) => true
|
|
835
|
+
# Net::IMAP::SequenceSet["5:8"].all_below?(8) => false
|
|
836
|
+
# Net::IMAP::SequenceSet["5:8"].all_below?(5) => false
|
|
837
|
+
#
|
|
838
|
+
# <tt>"*"</tt> is evaluated as +UINT32_MAX+:
|
|
839
|
+
# Net::IMAP::SequenceSet["*"].all_below?(UINT32_MAX) => false
|
|
840
|
+
#
|
|
841
|
+
# This is roughly equivalent to several other comparisons:
|
|
842
|
+
#
|
|
843
|
+
# # Given the following assumptions:
|
|
844
|
+
# set.empty? => false
|
|
845
|
+
# set.include_star? => false
|
|
846
|
+
# number => ^(2..UINT32_MAX)
|
|
847
|
+
#
|
|
848
|
+
# # Then these expressions will always return the same result:
|
|
849
|
+
# set.all_below?(number) => result
|
|
850
|
+
# set.none_above?(number - 1) => ^result
|
|
851
|
+
# !set.any_above?(number - 1) => ^result
|
|
852
|
+
#
|
|
853
|
+
# set == set.below(number) => ^result
|
|
854
|
+
# set.disjoint?(number..) => ^result
|
|
855
|
+
# set.max < number => ^result
|
|
856
|
+
#
|
|
857
|
+
# Related: {other comparison methods}[rdoc-ref:SequenceSet@Methods+for+Comparing],
|
|
858
|
+
# #below
|
|
859
|
+
def all_below?(number)
|
|
860
|
+
number = nz_number(number)
|
|
861
|
+
empty? || max(star: UINT32_MAX) < number
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
# :call-seq:
|
|
865
|
+
# any_above?(number) -> true or false
|
|
866
|
+
#
|
|
867
|
+
# Returns whether the set contains any numbers greater than +number+ (not
|
|
868
|
+
# inclusive of +number+).
|
|
869
|
+
#
|
|
870
|
+
# Net::IMAP::SequenceSet["5:8"].any_above?(1) => true
|
|
871
|
+
# Net::IMAP::SequenceSet["5:8"].any_above?(7) => true
|
|
872
|
+
# Net::IMAP::SequenceSet["5:8"].any_above?(8) => false
|
|
873
|
+
#
|
|
874
|
+
# <tt>"*"</tt> is evaluated as +UINT32_MAX+:
|
|
875
|
+
# Net::IMAP::SequenceSet["1:*"].any_above?(UINT32_MAX - 1) => true
|
|
876
|
+
# Net::IMAP::SequenceSet["1:*"].any_above?(UINT32_MAX) => false
|
|
877
|
+
#
|
|
878
|
+
# This is roughly equivalent to several other comparisons:
|
|
879
|
+
#
|
|
880
|
+
# # Given the following assumptions:
|
|
881
|
+
# set.empty? => false
|
|
882
|
+
# set.include_star? => false
|
|
883
|
+
# number => ^(1...UINT32_MAX)
|
|
884
|
+
#
|
|
885
|
+
# # Then these expressions will always return the same result:
|
|
886
|
+
# set.any_above?(number) => result
|
|
887
|
+
# !set.none_above?(number) => ^result
|
|
888
|
+
# !set.all_below?(number + 1) => ^result
|
|
889
|
+
#
|
|
890
|
+
# set.cover?(set.above(number)) => ^result
|
|
891
|
+
# set.intersect?(number + 1..) => ^result
|
|
892
|
+
# number < set.max => ^result
|
|
893
|
+
#
|
|
894
|
+
# Related: {other comparison methods}[rdoc-ref:SequenceSet@Methods+for+Comparing],
|
|
895
|
+
# #above
|
|
896
|
+
def any_above?(number)
|
|
897
|
+
number = nz_number(number)
|
|
898
|
+
valid? && number < max(star: UINT32_MAX)
|
|
899
|
+
end
|
|
900
|
+
|
|
901
|
+
# :call-seq:
|
|
902
|
+
# any_below?(number) -> true or false
|
|
903
|
+
#
|
|
904
|
+
# Returns whether the set contains any numbers less than +number+ (not
|
|
905
|
+
# inclusive of +number+).
|
|
906
|
+
#
|
|
907
|
+
# Net::IMAP::SequenceSet["5:8"].any_below? 5 => false
|
|
908
|
+
# Net::IMAP::SequenceSet["5:8"].any_below? 6 => true
|
|
909
|
+
# Net::IMAP::SequenceSet["5:8"].any_below? 9 => true
|
|
910
|
+
#
|
|
911
|
+
# <tt>"*"</tt> is evaluated as +UINT32_MAX+:
|
|
912
|
+
# Net::IMAP::SequenceSet["*"].any_below?(UINT32_MAX) => false
|
|
913
|
+
#
|
|
914
|
+
# This is roughly equivalent to several other comparisons:
|
|
915
|
+
#
|
|
916
|
+
# # Given the following assumptions:
|
|
917
|
+
# set.empty? => false
|
|
918
|
+
# set.include_star? => false
|
|
919
|
+
# number => ^(2..UINT32_MAX)
|
|
920
|
+
#
|
|
921
|
+
# # Then these expressions will always return the same result:
|
|
922
|
+
# set.any_below?(number) => result
|
|
923
|
+
# !set.none_below?(number) => ^result
|
|
924
|
+
# !set.all_above?(number - 1) => ^result
|
|
925
|
+
#
|
|
926
|
+
# set.cover?(set.below(number)) => ^result
|
|
927
|
+
# set.intersect?(...number) => ^result
|
|
928
|
+
# set.min < number => ^result
|
|
929
|
+
#
|
|
930
|
+
# Related: {other comparison methods}[rdoc-ref:SequenceSet@Methods+for+Comparing],
|
|
931
|
+
# #below
|
|
932
|
+
def any_below?(number)
|
|
933
|
+
number = nz_number(number)
|
|
934
|
+
valid? && min(star: UINT32_MAX) < number
|
|
935
|
+
end
|
|
936
|
+
|
|
937
|
+
# :call-seq:
|
|
938
|
+
# none_above?(number) -> true or false
|
|
939
|
+
#
|
|
940
|
+
# Returns whether the set contains no numbers greater than +number+ (not
|
|
941
|
+
# inclusive of +number+).
|
|
942
|
+
#
|
|
943
|
+
# Net::IMAP::SequenceSet["5:8"].none_above?(9) => true
|
|
944
|
+
# Net::IMAP::SequenceSet["5:8"].none_above?(8) => true
|
|
945
|
+
# Net::IMAP::SequenceSet["5:8"].none_above?(7) => false
|
|
946
|
+
#
|
|
947
|
+
# <tt>"*"</tt> is evaluated as +UINT32_MAX+:
|
|
948
|
+
# Net::IMAP::SequenceSet["*"].none_above?(UINT32_MAX - 1) => false
|
|
949
|
+
# Net::IMAP::SequenceSet["*"].none_above?(UINT32_MAX) => true
|
|
950
|
+
#
|
|
951
|
+
# This is roughly equivalent to several other comparisons:
|
|
952
|
+
#
|
|
953
|
+
# # Given the following assumptions:
|
|
954
|
+
# set.empty? => false
|
|
955
|
+
# set.include_star? => false
|
|
956
|
+
# number => ^(1...UINT32_MAX)
|
|
957
|
+
#
|
|
958
|
+
# # Then these expressions will always return the same result:
|
|
959
|
+
# set.none_above?(number) => result
|
|
960
|
+
# !set.any_above?(number) => ^result
|
|
961
|
+
# set.all_below?(number + 1) => ^result
|
|
962
|
+
#
|
|
963
|
+
# set.above(number).empty? => ^result
|
|
964
|
+
# set.disjoint?(number..) => ^result
|
|
965
|
+
# set.max <= number => ^result
|
|
966
|
+
#
|
|
967
|
+
# Related: {other comparison methods}[rdoc-ref:SequenceSet@Methods+for+Comparing],
|
|
968
|
+
# #above
|
|
969
|
+
def none_above?(number)
|
|
970
|
+
number = nz_number(number)
|
|
971
|
+
empty? || max(star: UINT32_MAX) <= number
|
|
972
|
+
end
|
|
973
|
+
|
|
974
|
+
# :call-seq:
|
|
975
|
+
# none_below?(number) -> true or false
|
|
976
|
+
#
|
|
977
|
+
# Returns whether the set contains no numbers less than +number+ (not
|
|
978
|
+
# inclusive of +number+).
|
|
979
|
+
#
|
|
980
|
+
# Net::IMAP::SequenceSet["5:8"].none_below?(4) => true
|
|
981
|
+
# Net::IMAP::SequenceSet["5:8"].none_below?(5) => true
|
|
982
|
+
# Net::IMAP::SequenceSet["5:8"].none_below?(6) => false
|
|
983
|
+
#
|
|
984
|
+
# <tt>"*"</tt> is evaluated as +UINT32_MAX+:
|
|
985
|
+
# Net::IMAP::SequenceSet["*"].none_below?(UINT32_MAX) => true
|
|
986
|
+
#
|
|
987
|
+
# This is roughly equivalent to several other comparisons:
|
|
988
|
+
#
|
|
989
|
+
# # Given the following assumptions:
|
|
990
|
+
# set.empty? => false
|
|
991
|
+
# set.include_star? => false
|
|
992
|
+
# number => ^(2..UINT32_MAX)
|
|
993
|
+
#
|
|
994
|
+
# # Then these expressions will always return the same result:
|
|
995
|
+
# set.none_below?(number) => result
|
|
996
|
+
# !set.any_below?(number) => ^result
|
|
997
|
+
# set.all_above?(number - 1) => ^result
|
|
998
|
+
#
|
|
999
|
+
# set.above(number).empty? => ^result
|
|
1000
|
+
# set.disjoint?(...number) => ^result
|
|
1001
|
+
# number <= set.min => ^result
|
|
1002
|
+
#
|
|
1003
|
+
# Related: {other comparison methods}[rdoc-ref:SequenceSet@Methods+for+Comparing],
|
|
1004
|
+
# #below
|
|
1005
|
+
def none_below?(number)
|
|
1006
|
+
number = nz_number(number)
|
|
1007
|
+
empty? || number <= min(star: UINT32_MAX)
|
|
1008
|
+
end
|
|
1009
|
+
|
|
777
1010
|
# :call-seq:
|
|
778
1011
|
# max(star: :*) => integer or star or nil
|
|
779
1012
|
# max(count) => SequenceSet
|
|
@@ -788,6 +1021,9 @@ module Net
|
|
|
788
1021
|
# Related: #min, #minmax, #slice
|
|
789
1022
|
def max(count = nil, star: :*)
|
|
790
1023
|
if count
|
|
1024
|
+
count = Integer(count.to_int)
|
|
1025
|
+
raise ArgumentError, 'negative count' if count < 0
|
|
1026
|
+
return remain_frozen_empty if count == 0
|
|
791
1027
|
if cardinality <= count
|
|
792
1028
|
frozen? ? self : dup
|
|
793
1029
|
else
|
|
@@ -812,6 +1048,8 @@ module Net
|
|
|
812
1048
|
# Related: #max, #minmax, #slice
|
|
813
1049
|
def min(count = nil, star: :*)
|
|
814
1050
|
if count
|
|
1051
|
+
count = Integer(count.to_int)
|
|
1052
|
+
raise ArgumentError, 'negative count' if count < 0
|
|
815
1053
|
slice(0...count) || remain_frozen_empty
|
|
816
1054
|
elsif (val = min_num)
|
|
817
1055
|
val != STAR_INT ? val : star
|
|
@@ -1453,7 +1691,7 @@ module Net
|
|
|
1453
1691
|
number = import_num number
|
|
1454
1692
|
each_minmax_with_index(minmaxes) do |min, max, idx_min|
|
|
1455
1693
|
number < min and return nil
|
|
1456
|
-
number <= max and return
|
|
1694
|
+
number <= max and return idx_min + (number - min)
|
|
1457
1695
|
end
|
|
1458
1696
|
nil
|
|
1459
1697
|
end
|
|
@@ -1466,7 +1704,7 @@ module Net
|
|
|
1466
1704
|
number = import_num number
|
|
1467
1705
|
each_minmax_with_index(each_entry_minmax) do |min, max, idx_min|
|
|
1468
1706
|
if min <= number && number <= max
|
|
1469
|
-
return
|
|
1707
|
+
return idx_min + (number - min)
|
|
1470
1708
|
end
|
|
1471
1709
|
end
|
|
1472
1710
|
nil
|
|
@@ -1560,7 +1798,9 @@ module Net
|
|
|
1560
1798
|
# Net::IMAP::SequenceSet["5,10:22,50"] & (21..) # to_s => "21:22,50"
|
|
1561
1799
|
# Net::IMAP::SequenceSet["5,10:22,50"] - (..20) # to_s => "21:22,50"
|
|
1562
1800
|
#
|
|
1563
|
-
# Related: #
|
|
1801
|
+
# Related: #below,
|
|
1802
|
+
# {other set operations}[rdoc-ref:SequenceSet@Methods+for+Set+Operations],
|
|
1803
|
+
# #all_above?, #any_above?, #none_above?
|
|
1564
1804
|
def above(num)
|
|
1565
1805
|
NumValidator.valid_nz_number?(num) or
|
|
1566
1806
|
raise ArgumentError, "not a valid sequence set number"
|
|
@@ -1591,7 +1831,9 @@ module Net
|
|
|
1591
1831
|
# Net::IMAP::SequenceSet["5,10:22,*"].below(30) # to_s => "5,10:22"
|
|
1592
1832
|
# Net::IMAP::SequenceSet["5,10:22,*"].limit(max: 29) # to_s => "5,10:22,29"
|
|
1593
1833
|
#
|
|
1594
|
-
# Related: #above,
|
|
1834
|
+
# Related: #above,
|
|
1835
|
+
# {other set operations}[rdoc-ref:SequenceSet@Methods+for+Set+Operations],
|
|
1836
|
+
# #all_below?, #any_below?, #none_below?
|
|
1595
1837
|
def below(num)
|
|
1596
1838
|
NumValidator.valid_nz_number?(num) or
|
|
1597
1839
|
raise ArgumentError, "not a valid sequence set number"
|
|
@@ -1869,8 +2111,9 @@ module Net
|
|
|
1869
2111
|
def remain_frozen_empty; frozen? ? SequenceSet.empty : SequenceSet.new end
|
|
1870
2112
|
|
|
1871
2113
|
# frozen clones are shallow copied
|
|
1872
|
-
def initialize_clone(other)
|
|
1873
|
-
@set_data = other.dup_set_data unless other.frozen?
|
|
2114
|
+
def initialize_clone(other, freeze: nil)
|
|
2115
|
+
@set_data = other.dup_set_data unless other.frozen? && freeze != false
|
|
2116
|
+
freeze_set_data if freeze
|
|
1874
2117
|
super
|
|
1875
2118
|
end
|
|
1876
2119
|
|
|
@@ -1922,7 +2165,7 @@ module Net
|
|
|
1922
2165
|
def number_input?(input)
|
|
1923
2166
|
case input
|
|
1924
2167
|
when *STARS, Integer then true
|
|
1925
|
-
when String then !input.
|
|
2168
|
+
when String then !input.match?(/[:,]/)
|
|
1926
2169
|
end
|
|
1927
2170
|
end
|
|
1928
2171
|
|