diff --git a/src/cpl_query/_query/all_query.py b/src/cpl_query/_query/all_query.py index 33c9e4c6..07c40a51 100644 --- a/src/cpl_query/_query/all_query.py +++ b/src/cpl_query/_query/all_query.py @@ -1,9 +1,16 @@ from collections import Callable from cpl_query._query.where_query import where_query +from cpl_query.exceptions import ExceptionArgument, ArgumentNoneException from cpl_query.extension.iterable_abc import IterableABC def all_query(_list: IterableABC, _func: Callable) -> bool: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + result = where_query(_list, _func) return len(result) == len(_list) diff --git a/src/cpl_query/_query/any_query.py b/src/cpl_query/_query/any_query.py index ff85fa98..ede1c0d8 100644 --- a/src/cpl_query/_query/any_query.py +++ b/src/cpl_query/_query/any_query.py @@ -1,9 +1,16 @@ from collections import Callable from cpl_query._query.where_query import where_query +from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument from cpl_query.extension.iterable_abc import IterableABC def any_query(_list: IterableABC, _func: Callable) -> bool: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + result = where_query(_list, _func) return len(result) > 0 diff --git a/src/cpl_query/_query/avg_query.py b/src/cpl_query/_query/avg_query.py index bd884893..6d140da8 100644 --- a/src/cpl_query/_query/avg_query.py +++ b/src/cpl_query/_query/avg_query.py @@ -1,6 +1,6 @@ from typing import Callable, Union -from cpl_query.exceptions import InvalidTypeException, WrongTypeException +from cpl_query.exceptions import InvalidTypeException, WrongTypeException, ExceptionArgument, ArgumentNoneException from cpl_query.extension.iterable_abc import IterableABC @@ -8,6 +8,12 @@ def avg_query(_list: IterableABC, _t: type, _func: Callable) -> Union[int, float average = 0 count = len(_list) + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + if _t != int and _t != float and _t != complex: raise InvalidTypeException() diff --git a/src/cpl_query/_query/first_query.py b/src/cpl_query/_query/first_query.py index d0917117..6f3859ae 100644 --- a/src/cpl_query/_query/first_query.py +++ b/src/cpl_query/_query/first_query.py @@ -1,9 +1,13 @@ from typing import Optional +from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument from cpl_query.extension.iterable_abc import IterableABC def first_query(_list: IterableABC) -> any: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + if len(_list) == 0: raise Exception('Index out of range') @@ -11,6 +15,9 @@ def first_query(_list: IterableABC) -> any: def first_or_default_query(_list: IterableABC) -> Optional[any]: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + if len(_list) == 0: return None diff --git a/src/cpl_query/_query/for_each_query.py b/src/cpl_query/_query/for_each_query.py index 6681bd0f..62411c4d 100644 --- a/src/cpl_query/_query/for_each_query.py +++ b/src/cpl_query/_query/for_each_query.py @@ -1,8 +1,15 @@ from collections import Callable +from cpl_query.exceptions import ExceptionArgument, ArgumentNoneException from cpl_query.extension.iterable_abc import IterableABC -def for_each_query(_list: IterableABC, func: Callable): +def for_each_query(_list: IterableABC, _func: Callable): + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + for element in _list: - func(element) + _func(element) diff --git a/src/cpl_query/_query/order_by.py b/src/cpl_query/_query/order_by.py index 12cea7b3..2012486c 100644 --- a/src/cpl_query/_query/order_by.py +++ b/src/cpl_query/_query/order_by.py @@ -1,5 +1,6 @@ from collections import Callable +from cpl_query.exceptions import ExceptionArgument, ArgumentNoneException from cpl_query.extension.iterable_abc import IterableABC from cpl_query.extension.ordered_iterable_abc import OrderedIterableABC @@ -12,6 +13,12 @@ def order_by_query(_list: IterableABC, _func: Callable) -> OrderedIterableABC: def order_by_descending_query(_list: IterableABC, _func: Callable) -> OrderedIterableABC: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + result = OrderedIterableABC(_func) _list.sort(key=_func, reverse=True) result.extend(_list) @@ -19,10 +26,22 @@ def order_by_descending_query(_list: IterableABC, _func: Callable) -> OrderedIte def then_by_query(_list: OrderedIterableABC, _func: Callable) -> OrderedIterableABC: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + _list.sort(key=_func) return _list def then_by_descending_query(_list: OrderedIterableABC, _func: Callable) -> OrderedIterableABC: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + _list.sort(key=_func, reverse=True) return _list diff --git a/src/cpl_query/_query/single_query.py b/src/cpl_query/_query/single_query.py index 8ad30cef..7112a2c8 100644 --- a/src/cpl_query/_query/single_query.py +++ b/src/cpl_query/_query/single_query.py @@ -1,9 +1,13 @@ from typing import Optional +from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument from cpl_query.extension.iterable_abc import IterableABC def single_query(_list: IterableABC) -> any: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + if len(_list) > 1: raise Exception('Found more than one element') elif len(_list) == 0: @@ -13,6 +17,9 @@ def single_query(_list: IterableABC) -> any: def single_or_default_query(_list: IterableABC) -> Optional[any]: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + if len(_list) > 1: raise Exception('Index out of range') elif len(_list) == 0: diff --git a/src/cpl_query/_query/where_query.py b/src/cpl_query/_query/where_query.py index 92593fdd..94d555fe 100644 --- a/src/cpl_query/_query/where_query.py +++ b/src/cpl_query/_query/where_query.py @@ -1,9 +1,16 @@ from collections import Callable +from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument from cpl_query.extension.iterable_abc import IterableABC def where_query(_list: IterableABC, _func: Callable) -> IterableABC: + if _list is None: + raise ArgumentNoneException(ExceptionArgument.list) + + if _func is None: + raise ArgumentNoneException(ExceptionArgument.func) + result = IterableABC() for element in _list: if _func(element): diff --git a/src/cpl_query/exceptions.py b/src/cpl_query/exceptions.py index 1bf256e9..b0a320ea 100644 --- a/src/cpl_query/exceptions.py +++ b/src/cpl_query/exceptions.py @@ -1,3 +1,20 @@ +from enum import Enum + + +# models +class ExceptionArgument(Enum): + list = 'list' + func = 'func' + type = 'type' + + +# exceptions +class ArgumentNoneException(Exception): + + def __init__(self, arg: ExceptionArgument): + Exception.__init__(self, f'Argument {arg} is None') + + class InvalidTypeException(Exception): pass diff --git a/src/cpl_query/tests/iterable_test.py b/src/cpl_query/tests/iterable_test.py index 9b12b28e..a8936a88 100644 --- a/src/cpl_query/tests/iterable_test.py +++ b/src/cpl_query/tests/iterable_test.py @@ -18,11 +18,4 @@ class IterableTest(unittest.TestCase): self._list.append(3) self.assertEqual(self._list, [1, 2, 3]) - self._clear() - - def test_append_wrong_type(self): - self._list.append(1) - self._list.append(2) - self.assertRaises(Exception, lambda v: self._list.append(v), '3') - self._clear() diff --git a/src/cpl_query/tests/query_test.py b/src/cpl_query/tests/query_test.py index 0af4dbaa..d26f2f88 100644 --- a/src/cpl_query/tests/query_test.py +++ b/src/cpl_query/tests/query_test.py @@ -3,7 +3,7 @@ import unittest from random import randint from cpl.utils import String -from cpl_query.exceptions import InvalidTypeException, WrongTypeException +from cpl_query.exceptions import InvalidTypeException, WrongTypeException, ArgumentNoneException from cpl_query.extension.list import List from cpl_query.tests.models import User, Address @@ -70,17 +70,14 @@ class QueryTest(unittest.TestCase): self.assertEqual(res, avg) - def test_avg_invalid(self): - def _(): - res = self._tests.average(str, lambda u: u.address.nr) + def invalid(): + e_res = self._tests.average(str, lambda u: u.address.nr) - self.assertRaises(InvalidTypeException, _) + def wrong(): + e_res = self._tests.average(int, lambda u: u.address.street) - def test_avg_wrong(self): - def _(): - res = self._tests.average(int, lambda u: u.address.street) - - self.assertRaises(WrongTypeException, _) + self.assertRaises(InvalidTypeException, invalid) + self.assertRaises(WrongTypeException, wrong) def test_first(self): results = [] @@ -179,3 +176,8 @@ class QueryTest(unittest.TestCase): res = self._tests.where(lambda u: u.address.nr == 5) self.assertEqual(len(results), len(res)) + + def ex(): + e_res = self._tests.where(None) + + self.assertRaises(ArgumentNoneException, ex)