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:
@@ -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:
|
||||
|
Reference in New Issue
Block a user