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 +4 -4
- data/ChangeLog +7 -1
- data/lib/rangesmaller/rangesmaller.rb +202 -28
- data/rangesmaller.gemspec +2 -2
- data/test/test_rangesmaller.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a8fc91323af75d4f7492a97d055976a3f333edd
|
4
|
+
data.tar.gz: faaae7c9bdeddc5865edf8887b3daafcff404913
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
29
|
-
# @option opts
|
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 {
|
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
|
-
|
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
|
-
|
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 :
|
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
|
-
|
569
|
-
|
591
|
+
alias :eql_prerangesmaller? :eql?
|
592
|
+
|
593
|
+
# Same as {#==}, but the comparison is made with eql?() method.
|
570
594
|
def eql?(r)
|
571
|
-
|
572
|
-
|
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
|
-
|
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
|
-
|
710
|
+
nil # eg. (nil..nil)
|
579
711
|
end
|
580
|
-
end # def
|
581
|
-
|
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.
|
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-
|
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}
|
data/test/test_rangesmaller.rb
CHANGED
@@ -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.
|
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-
|
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
|