Skip to content

Commit

Permalink
Merge pull request #19 from Shopify/add-properties-and-replace
Browse files Browse the repository at this point in the history
Add lower and upper properties and replace method which works similarly to date.replace
  • Loading branch information
intiocean committed Aug 19, 2015
2 parents e839859 + 24f003d commit 0b15346
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 24 deletions.
16 changes: 16 additions & 0 deletions pyinter/interval.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ class Interval(object):

lower_value = property(fget=lambda self: self._lower_value, doc='This intervals lower value')
upper_value = property(fget=lambda self: self._upper_value, doc='This intervals upper value')
lower = property(fget=lambda self: self._lower, doc='Whether lower is Interval.OPEN or Interval.CLOSED')
upper = property(fget=lambda self: self._upper, doc='Whether upper is Interval.OPEN or Interval.CLOSED')

def __init__(self, lower, lower_value, upper_value, upper):
"""Create a new :class:`~pyinter.Interval` object, lower and upper should be one of
Expand All @@ -100,6 +102,20 @@ def copy(self):
"""Returns a new :class:`~pyinter.Interval` object with the same bounds and values."""
return Interval(self._lower, self._lower_value, self._upper_value, self._upper)

def replace(self, lower=None, lower_value=None, upper_value=None, upper=None):
interval = self.copy()

if lower is not None:
interval._lower = lower
if lower_value is not None:
interval._lower_value = lower_value
if upper_value is not None:
interval._upper_value = upper_value
if upper is not None:
interval._upper = upper

return interval

def __repr__(self):
lower_string = '(' if self._lower == self.OPEN else '['
upper_string = ')' if self._upper == self.OPEN else ']'
Expand Down
7 changes: 7 additions & 0 deletions tests/test_interval.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ def test_interval_copy_returns_a_new_instance():
assert one is not one.copy()


def test_replace():
assert i.open(1, 4).replace(upper_value=5) == i.open(1, 5)
assert i.open(1, 4).replace(upper=i.Interval.CLOSED) == i.openclosed(1, 4)
assert i.open(1, 4).replace(lower=i.Interval.CLOSED) == i.closedopen(1, 4)
assert i.open(1, 4).replace(lower_value=0) == i.open(0, 4)


def test_overlaps():
assert i.open(1, 4).overlaps(i.open(3, 6))
assert i.open(3, 6).overlaps(i.open(1, 4))
Expand Down
48 changes: 24 additions & 24 deletions tests/test_interval_construction.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ def test_open_interval_construction():
expected_upper_value = 100
expected_upper = i.Interval.OPEN
result = i.Interval(i.Interval.OPEN, 10, 100, i.Interval.OPEN)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper


def test_closed_interval_construction():
Expand All @@ -19,10 +19,10 @@ def test_closed_interval_construction():
expected_upper_value = 100
expected_upper = i.Interval.CLOSED
result = i.Interval(i.Interval.CLOSED, 10, 100, i.Interval.CLOSED)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper


def test_openclosed_interval_construction():
Expand All @@ -31,10 +31,10 @@ def test_openclosed_interval_construction():
expected_upper_value = 100
expected_upper = i.Interval.CLOSED
result = i.Interval(i.Interval.OPEN, 10, 100, i.Interval.CLOSED)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper


def test_closedopen_interval_construction():
Expand All @@ -43,10 +43,10 @@ def test_closedopen_interval_construction():
expected_upper_value = 100
expected_upper = i.Interval.OPEN
result = i.Interval(i.Interval.CLOSED, 10, 100, i.Interval.OPEN)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper


def test_open_interval_construction_using_helper():
Expand All @@ -55,10 +55,10 @@ def test_open_interval_construction_using_helper():
expected_upper_value = 100
expected_upper = i.Interval.OPEN
result = i.open(10, 100)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper


def test_closed_interval_construction_using_helper():
Expand All @@ -67,21 +67,21 @@ def test_closed_interval_construction_using_helper():
expected_upper_value = 100
expected_upper = i.Interval.CLOSED
result = i.closed(10, 100)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper

def test_openclosed_interval_construction_using_helper():
expected_lower = i.Interval.OPEN
expectedlower_value = 10
expected_upper_value = 100
expected_upper = i.Interval.CLOSED
result = i.openclosed(10, 100)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper


def test_closedopen_interval_construction_using_helper():
Expand All @@ -90,7 +90,7 @@ def test_closedopen_interval_construction_using_helper():
expected_upper_value = 100
expected_upper = i.Interval.OPEN
result = i.closedopen(10, 100)
assert result._lower == expected_lower
assert result.lower == expected_lower
assert result.lower_value == expectedlower_value
assert result._upper_value == expected_upper_value
assert result._upper == expected_upper
assert result.upper_value == expected_upper_value
assert result.upper == expected_upper

0 comments on commit 0b15346

Please sign in to comment.