Compare commits
No commits in common. "b893ec1fcff8ed9b2762e469ca891a3b4f79453f" and "e054ac364e873776e86b459397fb8423cfc98f23" have entirely different histories.
b893ec1fcf
...
e054ac364e
@ -15,7 +15,7 @@ __title__ = 'cpl_query'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||||
__version__ = '2022.12.dev134'
|
__version__ = '2022.12.0'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2022', minor='12', micro='dev134')
|
version_info = VersionInfo(major='2022', minor='12', micro='0')
|
||||||
|
@ -15,7 +15,7 @@ __title__ = 'cpl_query.base'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||||
__version__ = '2022.12.dev134'
|
__version__ = '2022.12.0'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ from collections import namedtuple
|
|||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2022', minor='12', micro='dev134')
|
version_info = VersionInfo(major='2022', minor='12', micro='0')
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from typing import Optional, Callable, Union
|
from typing import Optional, Callable, Union
|
||||||
|
|
||||||
from cpl_query._helper import is_number
|
from cpl_query._helper import is_number
|
||||||
from cpl_query.base.sequence import Sequence
|
from cpl_query.base.sequence_abc import SequenceABC
|
||||||
from cpl_query.exceptions import InvalidTypeException, ArgumentNoneException, ExceptionArgument, IndexOutOfRangeException
|
from cpl_query.exceptions import InvalidTypeException, ArgumentNoneException, ExceptionArgument, IndexOutOfRangeException
|
||||||
|
|
||||||
|
|
||||||
@ -9,10 +9,10 @@ def _default_lambda(x: object):
|
|||||||
return x
|
return x
|
||||||
|
|
||||||
|
|
||||||
class QueryableABC(Sequence):
|
class QueryableABC(SequenceABC):
|
||||||
|
|
||||||
def __init__(self, t: type = None, values: list = None):
|
def __init__(self, t: type = None, values: list = None):
|
||||||
Sequence.__init__(self, t, values)
|
SequenceABC.__init__(self, t, values)
|
||||||
|
|
||||||
def all(self, _func: Callable = None) -> bool:
|
def all(self, _func: Callable = None) -> bool:
|
||||||
r"""Checks if every element of list equals result found by function
|
r"""Checks if every element of list equals result found by function
|
||||||
@ -141,9 +141,6 @@ class QueryableABC(Sequence):
|
|||||||
if _index is None:
|
if _index is None:
|
||||||
raise ArgumentNoneException(ExceptionArgument.index)
|
raise ArgumentNoneException(ExceptionArgument.index)
|
||||||
|
|
||||||
if _index < 0 or _index >= self.count():
|
|
||||||
raise IndexOutOfRangeException
|
|
||||||
|
|
||||||
result = self[_index]
|
result = self[_index]
|
||||||
if result is None:
|
if result is None:
|
||||||
raise IndexOutOfRangeException
|
raise IndexOutOfRangeException
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
|
from itertools import islice
|
||||||
|
|
||||||
|
from cpl_query.base.sequence_values import SequenceValues
|
||||||
|
|
||||||
|
|
||||||
class Sequence(list):
|
class SequenceABC(ABC):
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def __init__(self, t: type = None, values: list = None):
|
def __init__(self, t: type = None, values: list = None):
|
||||||
list.__init__(self)
|
|
||||||
ABC.__init__(self)
|
ABC.__init__(self)
|
||||||
values = [] if values is None else values
|
if values is None:
|
||||||
list.__init__(self, values)
|
values = []
|
||||||
|
|
||||||
if t is None and len(values) > 0:
|
if t is None and len(values) > 0:
|
||||||
t = type(values[0])
|
t = type(values[0])
|
||||||
@ -17,11 +19,36 @@ class Sequence(list):
|
|||||||
t = any
|
t = any
|
||||||
|
|
||||||
self._type = t
|
self._type = t
|
||||||
|
self._set_values(values)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def __class_getitem__(cls, _t: type):
|
def __class_getitem__(cls, _t: type):
|
||||||
return _t
|
return _t
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self._values)
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return iter(self._values)
|
||||||
|
|
||||||
|
def next(self):
|
||||||
|
return next(self._values)
|
||||||
|
|
||||||
|
def __next__(self):
|
||||||
|
return self.next()
|
||||||
|
|
||||||
|
def __getitem__(self, n):
|
||||||
|
values = [x for x in self]
|
||||||
|
if isinstance(n, slice):
|
||||||
|
try:
|
||||||
|
return values[n]
|
||||||
|
except Exception as e:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
for i in range(len(values)):
|
||||||
|
if i == n:
|
||||||
|
return values[i]
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'<{type(self).__name__} {list(self).__repr__()}>'
|
return f'<{type(self).__name__} {list(self).__repr__()}>'
|
||||||
|
|
||||||
@ -36,6 +63,9 @@ class Sequence(list):
|
|||||||
if self._type is not None and type(__object) != self._type and not isinstance(type(__object), self._type) and not issubclass(type(__object), self._type):
|
if self._type is not None and type(__object) != self._type and not isinstance(type(__object), self._type) and not issubclass(type(__object), self._type):
|
||||||
raise Exception(f'Unexpected type: {type(__object)}\nExpected type: {self._type}')
|
raise Exception(f'Unexpected type: {type(__object)}\nExpected type: {self._type}')
|
||||||
|
|
||||||
|
def _set_values(self, values: list):
|
||||||
|
self._values = SequenceValues(values, self._type)
|
||||||
|
|
||||||
def to_list(self) -> list:
|
def to_list(self) -> list:
|
||||||
r"""Converts :class: `cpl_query.base.sequence_abc.SequenceABC` to :class: `list`
|
r"""Converts :class: `cpl_query.base.sequence_abc.SequenceABC` to :class: `list`
|
||||||
|
|
||||||
@ -45,17 +75,17 @@ class Sequence(list):
|
|||||||
"""
|
"""
|
||||||
return [x for x in self]
|
return [x for x in self]
|
||||||
|
|
||||||
def copy(self) -> 'Sequence':
|
def copy(self) -> 'SequenceABC':
|
||||||
r"""Creates a copy of sequence
|
r"""Creates a copy of sequence
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
Sequence
|
SequenceABC
|
||||||
"""
|
"""
|
||||||
return type(self)(self._type, self.to_list())
|
return type(self)(self._type, self.to_list())
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def empty(cls) -> 'Sequence':
|
def empty(cls) -> 'SequenceABC':
|
||||||
r"""Returns an empty sequence
|
r"""Returns an empty sequence
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
@ -64,7 +94,7 @@ class Sequence(list):
|
|||||||
"""
|
"""
|
||||||
return cls()
|
return cls()
|
||||||
|
|
||||||
def index_of(self, _object: object) -> int:
|
def index(self, _object: object) -> int:
|
||||||
r"""Returns the index of given element
|
r"""Returns the index of given element
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
@ -82,5 +112,5 @@ class Sequence(list):
|
|||||||
raise IndexError
|
raise IndexError
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls, start: int, length: int) -> 'Sequence':
|
def range(cls, start: int, length: int) -> 'SequenceABC':
|
||||||
return cls(int, list(range(start, length)))
|
return cls(int, list(range(start, length)))
|
47
src/cpl_query/base/sequence_values.py
Normal file
47
src/cpl_query/base/sequence_values.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import io
|
||||||
|
import itertools
|
||||||
|
|
||||||
|
from cpl_query.exceptions import IndexOutOfRangeException
|
||||||
|
|
||||||
|
|
||||||
|
class SequenceValues:
|
||||||
|
def __init__(self, data: list, _t: type):
|
||||||
|
if len(data) > 0:
|
||||||
|
def type_check(_t: type, _l: list):
|
||||||
|
return all([_t == any or isinstance(x, _t) for x in _l])
|
||||||
|
|
||||||
|
if not type_check(_t, data):
|
||||||
|
print([type(x) for x in data])
|
||||||
|
raise Exception(f'Unexpected type\nExpected type: {_t}')
|
||||||
|
|
||||||
|
if not hasattr(data, '__iter__'):
|
||||||
|
raise TypeError(f'{type(self).__name__} must be instantiated with an iterable object')
|
||||||
|
|
||||||
|
self._new_cycle = lambda: itertools.cycle(data)
|
||||||
|
self._len = lambda: len(data)
|
||||||
|
|
||||||
|
self._index = 0
|
||||||
|
self._cycle = self._new_cycle()
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return self._len()
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
i = 0
|
||||||
|
while i < self._len():
|
||||||
|
yield next(self._cycle)
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
def __next__(self):
|
||||||
|
if self._index >= len(self):
|
||||||
|
raise IndexOutOfRangeException()
|
||||||
|
self._index += 1
|
||||||
|
|
||||||
|
return self.next()
|
||||||
|
|
||||||
|
def next(self):
|
||||||
|
return next(self._cycle)
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
self._index = 0
|
||||||
|
self._cycle = self._new_cycle()
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "2022",
|
"Major": "2022",
|
||||||
"Minor": "12",
|
"Minor": "12",
|
||||||
"Micro": "dev134"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -15,7 +15,7 @@ __title__ = 'cpl_query.enumerable'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||||
__version__ = '2022.12.dev134'
|
__version__ = '2022.12.0'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -25,4 +25,4 @@ from .enumerable import Enumerable
|
|||||||
from .enumerable_abc import EnumerableABC
|
from .enumerable_abc import EnumerableABC
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2022', minor='12', micro='dev134')
|
version_info = VersionInfo(major='2022', minor='12', micro='0')
|
||||||
|
@ -11,6 +11,13 @@ class EnumerableABC(QueryableABC):
|
|||||||
def __init__(self, t: type = None, values: list = None):
|
def __init__(self, t: type = None, values: list = None):
|
||||||
QueryableABC.__init__(self, t, values)
|
QueryableABC.__init__(self, t, values)
|
||||||
|
|
||||||
|
self._remove_error_check = True
|
||||||
|
|
||||||
|
def set_remove_error_check(self, _value: bool):
|
||||||
|
r"""Set flag to check if element exists before removing
|
||||||
|
"""
|
||||||
|
self._remove_error_check = _value
|
||||||
|
|
||||||
def to_iterable(self) -> 'IterableABC':
|
def to_iterable(self) -> 'IterableABC':
|
||||||
r"""Converts :class: `cpl_query.enumerable.enumerable_abc.EnumerableABC` to :class: `cpl_query.iterable.iterable_abc.IterableABC`
|
r"""Converts :class: `cpl_query.enumerable.enumerable_abc.EnumerableABC` to :class: `cpl_query.iterable.iterable_abc.IterableABC`
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ __title__ = 'cpl_query.extension'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||||
__version__ = '2022.12.dev134'
|
__version__ = '2022.12.0'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -24,4 +24,4 @@ from collections import namedtuple
|
|||||||
from .list import List
|
from .list import List
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2022', minor='12', micro='dev134')
|
version_info = VersionInfo(major='2022', minor='12', micro='0')
|
||||||
|
@ -15,7 +15,7 @@ __title__ = 'cpl_query.iterable'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||||
__version__ = '2022.12.dev134'
|
__version__ = '2022.12.0'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@ -25,4 +25,4 @@ from .iterable_abc import IterableABC
|
|||||||
from .iterable import Iterable
|
from .iterable import Iterable
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2022', minor='12', micro='dev134')
|
version_info = VersionInfo(major='2022', minor='12', micro='0')
|
||||||
|
@ -12,6 +12,17 @@ class IterableABC(QueryableABC):
|
|||||||
def __init__(self, t: type = None, values: Iterable = None):
|
def __init__(self, t: type = None, values: Iterable = None):
|
||||||
QueryableABC.__init__(self, t, values)
|
QueryableABC.__init__(self, t, values)
|
||||||
|
|
||||||
|
def __setitem__(self, i, val):
|
||||||
|
self._check_type(val)
|
||||||
|
values = [*self._values]
|
||||||
|
values[i] = val
|
||||||
|
self._set_values(values)
|
||||||
|
|
||||||
|
def __delitem__(self, i):
|
||||||
|
values = [*self._values]
|
||||||
|
del values[i]
|
||||||
|
self._set_values(values)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type(self) -> type:
|
def type(self) -> type:
|
||||||
return self._type
|
return self._type
|
||||||
@ -30,7 +41,8 @@ class IterableABC(QueryableABC):
|
|||||||
value
|
value
|
||||||
"""
|
"""
|
||||||
self._check_type(_object)
|
self._check_type(_object)
|
||||||
super().append(_object)
|
values = [*self._values, _object]
|
||||||
|
self._set_values(values)
|
||||||
|
|
||||||
def extend(self, __iterable: Iterable) -> 'IterableABC':
|
def extend(self, __iterable: Iterable) -> 'IterableABC':
|
||||||
r"""Adds elements of given list to list
|
r"""Adds elements of given list to list
|
||||||
@ -54,16 +66,9 @@ class IterableABC(QueryableABC):
|
|||||||
if _object not in self:
|
if _object not in self:
|
||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
self.remove(_object)
|
values = [*self._values]
|
||||||
|
values.remove(_object)
|
||||||
def remove_at(self, _index: int):
|
self._set_values(values)
|
||||||
r"""Removes element from list
|
|
||||||
Parameter
|
|
||||||
---------
|
|
||||||
_object: :class:`object`
|
|
||||||
value
|
|
||||||
"""
|
|
||||||
self.pop(_index)
|
|
||||||
|
|
||||||
def to_enumerable(self) -> 'EnumerableABC':
|
def to_enumerable(self) -> 'EnumerableABC':
|
||||||
r"""Converts :class: `cpl_query.iterable.iterable_abc.IterableABC` to :class: `cpl_query.enumerable.enumerable_abc.EnumerableABC`
|
r"""Converts :class: `cpl_query.iterable.iterable_abc.IterableABC` to :class: `cpl_query.enumerable.enumerable_abc.EnumerableABC`
|
||||||
|
@ -16,12 +16,12 @@ class EnumerableTestCase(unittest.TestCase):
|
|||||||
self.assertEqual(Enumerable.empty().to_list(), [])
|
self.assertEqual(Enumerable.empty().to_list(), [])
|
||||||
self.assertEqual(Enumerable.range(0, 100).to_list(), list(range(0, 100)))
|
self.assertEqual(Enumerable.range(0, 100).to_list(), list(range(0, 100)))
|
||||||
|
|
||||||
# def test_iter(self):
|
def test_iter(self):
|
||||||
# n = 0
|
n = 0
|
||||||
# elements = Enumerable.range(0, 100)
|
elements = Enumerable.range(0, 100)
|
||||||
# while n < 100:
|
while n < 100:
|
||||||
# self.assertEqual(elements.next(), n)
|
self.assertEqual(elements.next(), n)
|
||||||
# n += 1
|
n += 1
|
||||||
|
|
||||||
def test_for(self):
|
def test_for(self):
|
||||||
n = 0
|
n = 0
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "2022",
|
"Major": "2022",
|
||||||
"Minor": "12",
|
"Minor": "12",
|
||||||
"Micro": "dev134"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
@ -17,7 +17,7 @@
|
|||||||
"LicenseDescription": "",
|
"LicenseDescription": "",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core>=2022.12.0",
|
"cpl-core>=2022.12.0",
|
||||||
"cpl-query>=2022.12.dev134"
|
"cpl-query>=2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
Loading…
Reference in New Issue
Block a user