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.
@@ -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
- return super if modseq.nil?
84
- self.class == other.class && hash == other.hash
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 value.
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 export_num(idx_min + (number - min))
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 export_num(idx_min + (number - min))
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: #above, #-, #&
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, #-, #&, #limit
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.include?(/[:,]/)
2168
+ when String then !input.match?(/[:,]/)
1926
2169
  end
1927
2170
  end
1928
2171