rangesmaller 1.0.3 → 1.0.4

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
  SHA1:
3
- metadata.gz: bb2dd52eccdf235b18ce0aa93c9a55fb4816eaf7
4
- data.tar.gz: bccb5a3d21d6f41ee58cca2692cc06c77178df69
3
+ metadata.gz: 7a8fc91323af75d4f7492a97d055976a3f333edd
4
+ data.tar.gz: faaae7c9bdeddc5865edf8887b3daafcff404913
5
5
  SHA512:
6
- metadata.gz: 187dd3c240b5cad7f8f084bcca0ba36f242d5a7d8ff9272e1fac16b36f535dc64c650ff66c88fc870ebec0e4b9afd7098edc430bcb11f6237d60d3d8350455dc
7
- data.tar.gz: 6f3f41877a00fb9e17e5c4d8216c9b7224dd53289e42e2a257555fb01d1d3a7bcecd77abcca0176f32e251e07e98e58574c075aabd8cc6541d7c6e3af6dafbf4
6
+ metadata.gz: a9e077d5e101043cd3a2f379ae30d5fb652481f784e653060f85f7c1b71d20c7322fb485ef4110f5ff313fed4147af82ddfb1a30af76c476b0a7e1534bb0b575
7
+ data.tar.gz: 3c96ed1780b5dbccfea2d458c390646b8fc1dafc94855c4111b1224e31ae293e800d00cc001f947489bf133e66265f3411699db9f05ea824ddc3b3e2ef023f7c
data/ChangeLog CHANGED
@@ -1,6 +1,12 @@
1
+ -----
2
+ (Version: v1.0.4)
3
+ 2014-04-25 Masa Saskano
4
+ * The methods ==() and eql?() now calls the method of the same name for each element, like Range and Array.
5
+
1
6
  -----
2
7
  (Version: v1.0.3)
3
- 2014-04-24 Masa Saskano
8
+ 2014-04-24 Masa Sakano
9
+
4
10
  * Cosmetic minor changes.
5
11
 
6
12
  -----
@@ -25,8 +25,8 @@ class Rangesmaller < Range
25
25
  # @param [Rangesmaller] key describe key param
26
26
  #
27
27
  # @overload new(range, opts)
28
- # @param range range [Range] standard Range object
29
- # @option opts opts [Object] :exclude_begin the begin boundary is excluded, if false (Default)
28
+ # @param range [Range] standard Range object
29
+ # @option opts [Object] :exclude_begin the begin boundary is excluded, if false (Default)
30
30
  #
31
31
  # @overload new(obj_begin, obj_end, exclude_end=false)
32
32
  # This form is not recomended, but for the sake of compatibility with Range.
@@ -151,27 +151,17 @@ class Rangesmaller < Range
151
151
  end
152
152
 
153
153
 
154
- # Like {Range}, returns true only if it is either {Rangesmaller} or {Range}, and in addition if both {#exclude_begin?} and {#exclude_end?} match between the two objects.
154
+ # Like {Range}, returns true only if it is either {Range} (or its subclasses), and in addition if both {#exclude_begin?} and {#exclude_end?} match between the two objects.
155
+ # See {#eql?}
155
156
  # @return [Boolean]
156
157
  def ==(r)
157
- if defined? r.rangepart
158
- rangepart = r.rangepart
159
- else
160
- rangepart = r
161
- end
162
-
163
- if super(rangepart) # Check the Range part, ie., ignoring exclude_begin?
164
- if defined? r.exclude_begin?
165
- (@exclude_begin == r.exclude_begin?) # && (exclude_end? == r.exclude_end?)
166
- else
167
- ! @exclude_begin
168
- end
169
- else
170
- false
171
- end
158
+ rs_equal_core(r, :==)
172
159
  end # def ==(r)
173
160
 
174
- alias :eql? :==
161
+ # The same as {:==} but uses eql?() as each comparison.
162
+ def eql?(r)
163
+ rs_equal_core(r, :eql?)
164
+ end # def eql?(r)
175
165
 
176
166
 
177
167
  # See also {#cover?} and {Range#===}
@@ -555,6 +545,31 @@ class Rangesmaller < Range
555
545
  "<.."
556
546
  end
557
547
  end
548
+
549
+ # @param r [Object] to compare.
550
+ # @param method [Symbol] of the method name.
551
+ def rs_equal_core(r, method)
552
+ if ! defined? r.exclude_end?
553
+ false # Not Range family.
554
+ elsif empty? && defined?(r.is_none?) && r.is_none? # r is RangeOpen::NONE
555
+ true
556
+ elsif defined? r.exclude_begin?
557
+ (self.exclude_begin? ^! r.exclude_begin?) &&
558
+ (self.exclude_end? ^! r.exclude_end?) &&
559
+ (self.begin.send(method, r.begin)) &&
560
+ (self.end.send( method, r.end))
561
+ # (self.begin == r.begin) &&
562
+ # (self.end == r.end)
563
+ else
564
+ # r is Range
565
+ if self.exclude_begin?
566
+ false
567
+ else
568
+ @rangepart.send(method, r) # Comparison as two Range-s.
569
+ end
570
+ end
571
+ end # def rs_equal_core(r, method)
572
+
558
573
  end # class Rangesmaller < Range
559
574
 
560
575
 
@@ -563,23 +578,182 @@ end # class Rangesmaller < Range
563
578
  #
564
579
  class Range
565
580
 
566
- alias :eql_orig? :==
581
+ alias :equal_prerangesmaller? :==
582
+
583
+ # When compared with either {Rangesmaller} object,
584
+ # it will deal with it. For each element, that is, {#begin} and {#end},
585
+ # this uses ==() method of each element. See {#eql?}.
586
+ def ==(r)
587
+ equal_core(r, :==, :equal_prerangesmaller?)
588
+ end
589
+
567
590
 
568
- # When compared with a {Rangesmaller} object, it compares with {Rangesmaller#rangepart}.
569
- # Namely, if {#begin}, {#end}, {#exclude_end?} agree between them and if {Rangesmaller#exclude_begin?} of the argument is false, it returns true, or false otherwise.
591
+ alias :eql_prerangesmaller? :eql?
592
+
593
+ # Same as {#==}, but the comparison is made with eql?() method.
570
594
  def eql?(r)
571
- if defined? r.exclude_begin?
572
- if r.exclude_begin?
595
+ equal_core(r, :eql?, :eql_prerangesmaller?)
596
+ end
597
+
598
+
599
+ ############## pravate methods of Range ##############
600
+
601
+ private
602
+
603
+ # Returns true if self is valid as a Range (or Rangesmaller or RangeOpen),
604
+ # even if it is empty. To construct a valid range, the elements have to
605
+ # be Comparable, and {#end} is larger than, or equal to, {#begin}.
606
+ #
607
+ # === Examples
608
+ #
609
+ # (nil..nil).valid? # => false
610
+ # (0..0).valid? # => true
611
+ # (0...0).valid? # => false
612
+ # (2..-1).valid? # => false
613
+ # Rangesmaller(0...0, :exclude_begin => false) # => false
614
+ # Rangesmaller(0...0, :exclude_begin => true) # => true
615
+ # RangeOpen::NONE.valid? #=> true
616
+ # RangeOpen(5).valid? #=> true
617
+ # RangeOpen::ALL.valid? #=> true
618
+ #
619
+ # See {#empty?} and {#null?}
620
+ def valid?
621
+ if defined?(self.is_none?) && self.is_none?
622
+ return true
623
+ end
624
+ begin
625
+ t = (self.begin() <=> self.end())
626
+ rescue NoMethodError
627
+ false # return
628
+ else
629
+ case t
630
+ when -1
631
+ true
632
+ when 0
633
+ if is_comparable?(self.begin())
634
+ if defined?(self.exclude_begin?)
635
+ t = self.exclude_begin?
636
+ else
637
+ t = false
638
+ end
639
+ (t ^! exclude_end?) # True if single value or empty.
640
+ else
641
+ false # Not Comparable; eg., nil..nil
642
+ end
643
+ when 1
573
644
  false
574
645
  else
575
- eql_orig?(r)
646
+ false # Not Comparable.
576
647
  end
648
+ # All statements of return above.
649
+ end
650
+ end # def valid?
651
+
652
+
653
+ # Returns true if self is empty, namely, there is
654
+ # no possible member, and if it is still valid.
655
+ # If it is not valid, it returns nil.
656
+ # Otherwise, false.
657
+ #
658
+ # === Examples
659
+ #
660
+ # (nil..nil).empty? # => nil
661
+ # Rangesmaller(1..2).empty? # => false
662
+ # Rangesmaller(1...2).empty? # => nil
663
+ # Rangesmaller(1...2, :exclude_begin => true).empty? => true
664
+ # Rangesmaller(1.0...2, :exclude_begin => true).empty? => true
665
+ # Rangesmaller(1...2, :exclude_begin => true).empty? => true
666
+ # Rangesmaller(1.0...2, :exclude_begin => true).empty? => false
667
+ # Rangesmaller(?a...?b, :exclude_begin => true).empty? => true
668
+ # RangeOpen::NONE.empty? # => true
669
+ #
670
+ # @note to check whether it is either empty or invalid, use {#null?}.
671
+ # See {#valid?}, too.
672
+ def empty?
673
+ if !valid?
674
+ return nil
675
+ elsif defined?(self.is_none?) && self.is_none?
676
+ return true
677
+ end
678
+
679
+ t = (self.begin() <=> self.end())
680
+ case t
681
+ when -1
682
+ if (defined?(self.exclude_begin?)) &&
683
+ exclude_begin? &&
684
+ exclude_end? &&
685
+ defined?(self.begin().succ) &&
686
+ (self.begin().succ == self.end())
687
+ true # e.g., ("a"<..."b")
688
+ else
689
+ false
690
+ end
691
+ when 0
692
+ if defined?(self.boundary) && self.boundary.nil?
693
+ # RangeOpen::NONE or RangeOpen::All
694
+ if self.exclude_end?
695
+ true # RangeOpen::Null
696
+ else
697
+ false # RangeOpen::All
698
+ end
699
+ else
700
+ if defined?(self.exclude_begin?)
701
+ t2 = self.exclude_begin?
702
+ else
703
+ t2 = false
704
+ end
705
+ (t2 && exclude_end?)
706
+ end
707
+ when 1
708
+ nil
577
709
  else
578
- eql_orig?(r)
710
+ nil # eg. (nil..nil)
579
711
  end
580
- end # def :eql?(r)
581
- alias :== :eql?
712
+ end # def empty?
713
+
582
714
 
715
+ # Returns true if it is either empty or invalid.
716
+ # See {#empty?} and {#valid?}.
717
+ def null?
718
+ (! valid?) || empty?
719
+ end
720
+
721
+
722
+ # True if obj is Comparable.
723
+ def is_comparable?(obj)
724
+ if defined?(obj.<=) # Comparable?
725
+ true
726
+ else
727
+ false
728
+ end
729
+ end
730
+
731
+ # @param r [Object] to compare.
732
+ # @param method [Symbol] of the method name.
733
+ # @param method_pre [Symbol] of the backed-up original method name.
734
+ def equal_core(r, method, method_pre)
735
+ if ! defined? r.exclude_end?
736
+ false # Not Range family.
737
+ elsif defined? r.exclude_begin?
738
+ # Either Rangesmaller or RangeOpen object.
739
+ if r.exclude_begin?
740
+ false # self(Range) has always the inclusive begin.
741
+ else
742
+ # It could do with a single line,
743
+ # self.begin.send(method_pre, r)
744
+ # if this was for Rangesmaller===r, but not for RangeOpen.
745
+ if (self.exclude_end? ^ r.exclude_end?)
746
+ false
747
+ elsif (self.begin.send(method, r.begin) && self.end.send(method, r.end))
748
+ true
749
+ else
750
+ false
751
+ end
752
+ end
753
+ else
754
+ self.send(method_pre, r) # r is Range.
755
+ end
756
+ end # def equal_core(r, method, method_pre)
583
757
  end # class Range
584
758
 
585
759
 
data/rangesmaller.gemspec CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rangesmaller}
5
- s.version = "1.0.3"
5
+ s.version = "1.0.4"
6
6
  # s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
7
7
  # s.executables << 'hola'
8
8
  # s.bindir = 'bin'
9
9
  s.authors = ["Masa Sakano"]
10
- s.date = %q{2014-04-24}
10
+ s.date = %q{2014-04-25}
11
11
  s.summary = %q{Rangesmaller class -- Range with include_begin?()}
12
12
  s.description = %q{This defines a subclass of Range, Rangesmaller class. Users can define whether the begin boundary is exclusive or inclusive, in addition to the end boundary as in the standard Range.}
13
13
  # s.email = %q{abc@example.com}
@@ -1,5 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ $stdout.sync=true
4
+ $stderr.sync=true
3
5
  libfilebase = 'rangesmaller.rb'
4
6
  libfilepath = nil
5
7
  er=nil
@@ -200,6 +202,16 @@ p $LOADED_FEATURES.grep(/#{Regexp.quote(libfilebase)}$/)
200
202
  assert (sc1 != sc2)
201
203
  end # def test_eql
202
204
 
205
+ def test_eql2
206
+ assert ((1..2) == (1..2))
207
+ assert ((1..2) == (1.0..2))
208
+ assert ((1..2).eql? (1..2)) # 1==(1.0) == true
209
+ assert !((1..2).eql? (1.0..2)) # 1.eql?(1.0) == false
210
+ r12 = Rangesmaller(1..2, :exclude_begin => true)
211
+ assert (r12.eql? Rangesmaller(1..2, :exclude_begin => true))
212
+ assert !(r12.eql? Rangesmaller(1.0..2, :exclude_begin => true))
213
+ end
214
+
203
215
  def test_begin
204
216
  assert_equal(@ib, @s11.begin)
205
217
  assert_equal(@ib, @s12.begin)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rangesmaller
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masa Sakano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-24 00:00:00.000000000 Z
11
+ date: 2014-04-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This defines a subclass of Range, Rangesmaller class. Users can define
14
14
  whether the begin boundary is exclusive or inclusive, in addition to the end boundary