From d2ab94dda7b397701666f76b69a5e8406432ea1f Mon Sep 17 00:00:00 2001
From: Piotr Maslanka <piotr.maslanka@henrietta.com.pl>
Date: Sun, 10 Dec 2017 00:05:19 +0100
Subject: [PATCH] NotInDomainError is better now

---
 firanka/exceptions.py  |  9 +++++++--
 firanka/intervals.py   | 10 ++++++++++
 firanka/series/base.py | 13 ++++---------
 3 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/firanka/exceptions.py b/firanka/exceptions.py
index d827061..7721760 100644
--- a/firanka/exceptions.py
+++ b/firanka/exceptions.py
@@ -14,11 +14,16 @@ class FirankaError(Exception):
     """
 
 
-class DomainError(FirankaError):
+class DomainError(FirankaError, ValueError):
     """Has something to do with the domain :)"""
 
 
-class NotInDomainError(DomainError, ValueError):
+class NotInDomainError(DomainError):
     """
     Requested index is beyond this domain
     """
+
+    def __init__(self, index, domain):
+        super(NotInDomainError, self).__init__('NotInDomainError: %s not in %s' % (index, domain))
+        self.index = index
+        self.domain = domain
diff --git a/firanka/intervals.py b/firanka/intervals.py
index 0ed8eb7..a1eee1c 100644
--- a/firanka/intervals.py
+++ b/firanka/intervals.py
@@ -5,6 +5,8 @@ import math
 
 import six
 
+from .exceptions import NotInDomainError
+
 __all__ = [
     'Interval',
     'REAL_SET',
@@ -156,6 +158,14 @@ class Interval(object):
             repr(self.start), repr(self.stop), repr(self.left_inc),
             repr(self.right_inc))
 
+    def contains_or_fail(self, p):
+        """
+        If p is not in this interval, NotInDomainError will be thrown
+        :param p: float
+        """
+        if p not in self:
+            raise NotInDomainError(p, self)
+
     def __getitem__(self, item):
         if not isinstance(item, slice):
             raise TypeError('must be a slice')
diff --git a/firanka/series/base.py b/firanka/series/base.py
index aee8b22..381e749 100644
--- a/firanka/series/base.py
+++ b/firanka/series/base.py
@@ -5,7 +5,7 @@ import inspect
 
 from sortedcontainers import SortedList
 
-from firanka.exceptions import NotInDomainError, DomainError
+from firanka.exceptions import DomainError
 from firanka.intervals import Interval, EMPTY_SET
 
 
@@ -39,14 +39,10 @@ class Series(object):
             if isinstance(item, slice):
                 item = Interval(item)
 
-            if item not in self.domain:
-                raise NotInDomainError('slicing beyond series domain')
-
+            self.domain.contains_or_fail(item)
             return AlteredSeries(self, domain=self.domain.intersection(item))
         else:
-            if item not in self.domain:
-                raise NotInDomainError('item not in domain')
-
+            self.domain.contains_or_fail(item)
             return self._get_for(item)
 
     def _get_for(self, item):
@@ -82,8 +78,7 @@ class Series(object):
 
         domain = domain or Interval(points[0], points[-1], True, True)
 
-        if domain not in self.domain:
-            raise NotInDomainError('points not inside this series!')
+        self.domain.contains_or_fail(domain)
 
         return DiscreteSeries([(i, self[i]) for i in points], domain)
 
-- 
GitLab