Merge branch 'master' into 2023.4

# Conflicts:
#	src/cpl_cli/.cpl/__init__.py
#	src/cpl_cli/__init__.py
#	src/cpl_cli/_templates/__init__.py
#	src/cpl_cli/_templates/build/__init__.py
#	src/cpl_cli/_templates/publish/__init__.py
#	src/cpl_cli/abc/__init__.py
#	src/cpl_cli/command/__init__.py
#	src/cpl_cli/configuration/__init__.py
#	src/cpl_cli/cpl-cli.json
#	src/cpl_cli/helper/__init__.py
#	src/cpl_cli/live_server/__init__.py
#	src/cpl_cli/migrations/__init__.py
#	src/cpl_cli/migrations/base/__init__.py
#	src/cpl_cli/migrations/service/__init__.py
#	src/cpl_cli/publish/__init__.py
#	src/cpl_cli/source_creator/__init__.py
#	src/cpl_cli/validators/__init__.py
#	src/cpl_core/__init__.py
#	src/cpl_core/application/__init__.py
#	src/cpl_core/configuration/__init__.py
#	src/cpl_core/console/__init__.py
#	src/cpl_core/cpl-core.json
#	src/cpl_core/database/__init__.py
#	src/cpl_core/database/connection/__init__.py
#	src/cpl_core/database/context/__init__.py
#	src/cpl_core/dependency_injection/__init__.py
#	src/cpl_core/dependency_injection/service_provider.py
#	src/cpl_core/dependency_injection/service_provider_abc.py
#	src/cpl_core/environment/__init__.py
#	src/cpl_core/logging/__init__.py
#	src/cpl_core/mailing/__init__.py
#	src/cpl_core/pipes/__init__.py
#	src/cpl_core/time/__init__.py
#	src/cpl_core/utils/__init__.py
#	src/cpl_discord/.cpl/__init__.py
#	src/cpl_discord/.cpl/schematic_discord_event.py
#	src/cpl_discord/__init__.py
#	src/cpl_discord/application/__init__.py
#	src/cpl_discord/command/__init__.py
#	src/cpl_discord/configuration/__init__.py
#	src/cpl_discord/container/__init__.py
#	src/cpl_discord/cpl-discord.json
#	src/cpl_discord/events/__init__.py
#	src/cpl_discord/helper/__init__.py
#	src/cpl_discord/service/__init__.py
#	src/cpl_discord/service/discord_bot_service.py
#	src/cpl_discord/service/discord_bot_service_abc.py
#	src/cpl_discord/service/discord_service.py
#	src/cpl_query/__init__.py
#	src/cpl_query/base/__init__.py
#	src/cpl_query/base/queryable_abc.py
#	src/cpl_query/cpl-query.json
#	src/cpl_query/enumerable/__init__.py
#	src/cpl_query/extension/__init__.py
#	src/cpl_query/iterable/__init__.py
This commit is contained in:
2023-04-04 13:29:45 +02:00
14 changed files with 414 additions and 246 deletions

View File

@@ -2,12 +2,7 @@ from typing import Optional, Callable, Union, Iterable
from cpl_query._helper import is_number
from cpl_query.base.sequence import Sequence
from cpl_query.exceptions import (
InvalidTypeException,
ArgumentNoneException,
ExceptionArgument,
IndexOutOfRangeException,
)
from cpl_query.exceptions import InvalidTypeException, ArgumentNoneException, ExceptionArgument, IndexOutOfRangeException
def _default_lambda(x: object) -> object:
@@ -15,17 +10,20 @@ def _default_lambda(x: object) -> object:
class QueryableABC(Sequence):
def __init__(self, t: type, values: Iterable = None):
Sequence.__init__(self, t, values)
def all(self, _func: Callable = None) -> bool:
r"""Checks if every element of list equals result found by function
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
bool
"""
if _func is None:
@@ -36,11 +34,13 @@ class QueryableABC(Sequence):
def any(self, _func: Callable = None) -> bool:
r"""Checks if list contains result found by function
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
bool
"""
if _func is None:
@@ -51,11 +51,13 @@ class QueryableABC(Sequence):
def average(self, _func: Callable = None) -> Union[int, float, complex]:
r"""Returns average value of list
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
Union[int, float, complex]
"""
if _func is None and not is_number(self.type):
@@ -66,11 +68,13 @@ class QueryableABC(Sequence):
def contains(self, _value: object) -> bool:
r"""Checks if list contains value given by function
Parameter:
Parameter
---------
value: :class:`object`
value
Returns:
Returns
-------
bool
"""
if _value is None:
@@ -81,11 +85,13 @@ class QueryableABC(Sequence):
def count(self, _func: Callable = None) -> int:
r"""Returns length of list or count of found elements
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
int
"""
if _func is None:
@@ -93,14 +99,16 @@ class QueryableABC(Sequence):
return self.where(_func).count()
def distinct(self, _func: Callable = None) -> "QueryableABC":
def distinct(self, _func: Callable = None) -> 'QueryableABC':
r"""Returns list without redundancies
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
if _func is None:
@@ -121,11 +129,13 @@ class QueryableABC(Sequence):
def element_at(self, _index: int) -> any:
r"""Returns element at given index
Parameter:
Parameter
---------
_index: :class:`int`
index
Returns:
Returns
-------
Value at _index: any
"""
if _index is None:
@@ -143,11 +153,13 @@ class QueryableABC(Sequence):
def element_at_or_default(self, _index: int) -> Optional[any]:
r"""Returns element at given index or None
Parameter:
Parameter
---------
_index: :class:`int`
index
Returns:
Returns
-------
Value at _index: Optional[any]
"""
if _index is None:
@@ -161,7 +173,8 @@ class QueryableABC(Sequence):
def first(self) -> any:
r"""Returns first element
Returns:
Returns
-------
First element of list: any
"""
if self.count() == 0:
@@ -172,7 +185,8 @@ class QueryableABC(Sequence):
def first_or_default(self) -> any:
r"""Returns first element or None
Returns:
Returns
-------
First element of list: Optional[any]
"""
if self.count() == 0:
@@ -183,7 +197,8 @@ class QueryableABC(Sequence):
def for_each(self, _func: Callable = None):
r"""Runs given function for each element of list
Parameter:
Parameter
---------
func: :class: `Callable`
function to call
"""
@@ -193,10 +208,11 @@ class QueryableABC(Sequence):
return self
def group_by(self, _func: Callable = None) -> "QueryableABC":
def group_by(self, _func: Callable = None) -> 'QueryableABC':
r"""Groups by func
Returns:
Returns
-------
Grouped list[list[any]]: any
"""
if _func is None:
@@ -219,7 +235,8 @@ class QueryableABC(Sequence):
def last(self) -> any:
r"""Returns last element
Returns:
Returns
-------
Last element of list: any
"""
if self.count() == 0:
@@ -230,7 +247,8 @@ class QueryableABC(Sequence):
def last_or_default(self) -> any:
r"""Returns last element or None
Returns:
Returns
-------
Last element of list: Optional[any]
"""
if self.count() == 0:
@@ -241,11 +259,13 @@ class QueryableABC(Sequence):
def max(self, _func: Callable = None) -> object:
r"""Returns the highest value
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
object
"""
if _func is None and not is_number(self.type):
@@ -259,7 +279,8 @@ class QueryableABC(Sequence):
def median(self, _func=None) -> Union[int, float]:
r"""Return the median value of data elements
Returns:
Returns
-------
Union[int, float]
"""
if _func is None:
@@ -268,16 +289,22 @@ class QueryableABC(Sequence):
result = self.order_by(_func).select(_func).to_list()
length = len(result)
i = int(length / 2)
return result[i] if length % 2 == 1 else (float(result[i - 1]) + float(result[i])) / float(2)
return (
result[i]
if length % 2 == 1
else (float(result[i - 1]) + float(result[i])) / float(2)
)
def min(self, _func: Callable = None) -> object:
r"""Returns the lowest value
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
object
"""
if _func is None and not is_number(self.type):
@@ -288,52 +315,56 @@ class QueryableABC(Sequence):
return _func(min(self, key=_func))
def order_by(self, _func: Callable = None) -> "QueryableABC":
def order_by(self, _func: Callable = None) -> 'OrderedQueryableABC':
r"""Sorts elements by function in ascending order
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
:class: `cpl_query.base.queryable_abc.QueryableABC`
Returns
-------
:class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC`
"""
if _func is None:
_func = _default_lambda
from cpl_query.base.ordered_queryable import OrderedQueryable
return OrderedQueryable(self.type, sorted(self, key=_func), _func)
def order_by_descending(self, _func: Callable = None) -> "QueryableABC":
def order_by_descending(self, _func: Callable = None) -> 'OrderedQueryableABC':
r"""Sorts elements by function in descending order
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
:class: `cpl_query.base.queryable_abc.QueryableABC`
Returns
-------
:class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC`
"""
if _func is None:
_func = _default_lambda
from cpl_query.base.ordered_queryable import OrderedQueryable
return OrderedQueryable(self.type, sorted(self, key=_func, reverse=True), _func)
def reverse(self) -> "QueryableABC":
def reverse(self) -> 'QueryableABC':
r"""Reverses list
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
return type(self)(self._type, reversed(self._values))
def select(self, _func: Callable) -> "QueryableABC":
def select(self, _func: Callable) -> 'QueryableABC':
r"""Formats each element of list to a given format
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
if _func is None:
@@ -341,10 +372,11 @@ class QueryableABC(Sequence):
return type(self)(object, [_func(_o) for _o in self])
def select_many(self, _func: Callable) -> "QueryableABC":
def select_many(self, _func: Callable) -> 'QueryableABC':
r"""Flattens resulting lists to one
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
# The line below is pain. I don't understand anything of it...
@@ -354,41 +386,46 @@ class QueryableABC(Sequence):
def single(self) -> any:
r"""Returns one single element of list
Returns:
Returns
-------
Found value: any
Raises:
Raises
------
ArgumentNoneException: when argument is None
Exception: when argument is None or found more than one element
"""
if self.count() > 1:
raise Exception("Found more than one element")
raise Exception('Found more than one element')
elif self.count() == 0:
raise Exception("Found no element")
raise Exception('Found no element')
return self._values[0]
def single_or_default(self) -> Optional[any]:
r"""Returns one single element of list
Returns:
Returns
-------
Found value: Optional[any]
"""
if self.count() > 1:
raise Exception("Index out of range")
raise Exception('Index out of range')
elif self.count() == 0:
return None
return self._values[0]
def skip(self, _index: int) -> "QueryableABC":
def skip(self, _index: int) -> 'QueryableABC':
r"""Skips all elements from index
Parameter:
Parameter
---------
_index: :class:`int`
index
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
if _index is None:
@@ -396,14 +433,16 @@ class QueryableABC(Sequence):
return type(self)(self.type, self._values[_index:])
def skip_last(self, _index: int) -> "QueryableABC":
def skip_last(self, _index: int) -> 'QueryableABC':
r"""Skips all elements after index
Parameter:
Parameter
---------
_index: :class:`int`
index
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
if _index is None:
@@ -415,11 +454,13 @@ class QueryableABC(Sequence):
def sum(self, _func: Callable = None) -> Union[int, float, complex]:
r"""Sum of all values
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
Union[int, float, complex]
"""
if _func is None and not is_number(self.type):
@@ -434,15 +475,17 @@ class QueryableABC(Sequence):
return result
def split(self, _func: Callable) -> "QueryableABC":
def split(self, _func: Callable) -> 'QueryableABC':
r"""Splits the list by given function
Parameter:
Parameter
---------
func: :class:`Callable`
seperator
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
groups = []
@@ -465,14 +508,16 @@ class QueryableABC(Sequence):
return type(self)(self._type, query_groups)
def take(self, _index: int) -> "QueryableABC":
def take(self, _index: int) -> 'QueryableABC':
r"""Takes all elements from index
Parameter:
Parameter
---------
_index: :class:`int`
index
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
if _index is None:
@@ -480,14 +525,16 @@ class QueryableABC(Sequence):
return type(self)(self._type, self._values[:_index])
def take_last(self, _index: int) -> "QueryableABC":
def take_last(self, _index: int) -> 'QueryableABC':
r"""Takes all elements after index
Parameter:
Parameter
---------
_index: :class:`int`
index
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
index = self.count() - _index
@@ -497,14 +544,16 @@ class QueryableABC(Sequence):
return type(self)(self._type, self._values[index:])
def where(self, _func: Callable = None) -> "QueryableABC":
def where(self, _func: Callable = None) -> 'QueryableABC':
r"""Select element by function
Parameter:
Parameter
---------
func: :class:`Callable`
selected value
Returns:
Returns
-------
:class: `cpl_query.base.queryable_abc.QueryableABC`
"""
if _func is None: