Compare commits

..

No commits in common. "c4a71de83f364b70d3c7b5b8544c622baa0a3492" and "87d023ef7f087db9d88c4ddd9a548ce48363b823" have entirely different histories.

14 changed files with 89 additions and 279 deletions

View File

@ -39,7 +39,7 @@ class Schematic(GenerateSchematicABC):
[] []
) )
""" """
return self.build_code_str(code, Name=self._class_name, NameLower=self._class_name.lower()) return self.build_code_str(code, Name=self._class_name)
@classmethod @classmethod
def register(cls): def register(cls):

View File

@ -18,8 +18,7 @@ from cpl_core.type import T
class ServiceProvider(ServiceProviderABC): class ServiceProvider(ServiceProviderABC):
r"""Provider for the services r"""Provider for the services
Parameter Parameter:
---------
service_descriptors: list[:class:`cpl_core.dependency_injection.service_descriptor.ServiceDescriptor`] service_descriptors: list[:class:`cpl_core.dependency_injection.service_descriptor.ServiceDescriptor`]
Descriptor of the service Descriptor of the service
config: :class:`cpl_core.configuration.configuration_abc.ConfigurationABC` config: :class:`cpl_core.configuration.configuration_abc.ConfigurationABC`
@ -64,7 +63,7 @@ class ServiceProvider(ServiceProviderABC):
# raise Exception(f'Service {parameter.annotation} not found') # raise Exception(f'Service {parameter.annotation} not found')
def _get_services(self, t: type, *args, **kwargs) -> list[Optional[object]]: def _get_services(self, t: type) -> list[Optional[object]]:
implementations = [] implementations = []
for descriptor in self._service_descriptors: for descriptor in self._service_descriptors:
if descriptor.service_type == t or issubclass(descriptor.service_type, t): if descriptor.service_type == t or issubclass(descriptor.service_type, t):
@ -72,7 +71,7 @@ class ServiceProvider(ServiceProviderABC):
implementations.append(descriptor.implementation) implementations.append(descriptor.implementation)
continue continue
implementation = self.build_service(descriptor.service_type, *args, **kwargs) implementation = self.build_service(descriptor.service_type)
if descriptor.lifetime == ServiceLifetimeEnum.singleton: if descriptor.lifetime == ServiceLifetimeEnum.singleton:
descriptor.implementation = implementation descriptor.implementation = implementation
@ -108,7 +107,7 @@ class ServiceProvider(ServiceProviderABC):
return params return params
def build_service(self, service_type: type, *args, **kwargs) -> object: def build_service(self, service_type: type) -> object:
for descriptor in self._service_descriptors: for descriptor in self._service_descriptors:
if descriptor.service_type == service_type or issubclass(descriptor.service_type, service_type): if descriptor.service_type == service_type or issubclass(descriptor.service_type, service_type):
if descriptor.implementation is not None: if descriptor.implementation is not None:
@ -121,7 +120,7 @@ class ServiceProvider(ServiceProviderABC):
sig = signature(service_type.__init__) sig = signature(service_type.__init__)
params = self.build_by_signature(sig) params = self.build_by_signature(sig)
return service_type(*params, *args, **kwargs) return service_type(*params)
def set_scope(self, scope: ScopeABC): def set_scope(self, scope: ScopeABC):
self._scope = scope self._scope = scope
@ -132,7 +131,7 @@ class ServiceProvider(ServiceProviderABC):
) )
return sb.build() return sb.build()
def get_service(self, service_type: T, *args, **kwargs) -> Optional[T]: def get_service(self, service_type: T) -> Optional[T]:
result = self._find_service(service_type) result = self._find_service(service_type)
if result is None: if result is None:
@ -141,7 +140,7 @@ class ServiceProvider(ServiceProviderABC):
if result.implementation is not None: if result.implementation is not None:
return result.implementation return result.implementation
implementation = self.build_service(service_type, *args, **kwargs) implementation = self.build_service(service_type)
if ( if (
result.lifetime == ServiceLifetimeEnum.singleton result.lifetime == ServiceLifetimeEnum.singleton
or result.lifetime == ServiceLifetimeEnum.scoped or result.lifetime == ServiceLifetimeEnum.scoped
@ -151,7 +150,7 @@ class ServiceProvider(ServiceProviderABC):
return implementation return implementation
def get_services(self, service_type: T, *args, **kwargs) -> list[Optional[T]]: def get_services(self, service_type: T) -> list[Optional[T]]:
implementations = [] implementations = []
if typing.get_origin(service_type) != list: if typing.get_origin(service_type) != list:

View File

@ -25,16 +25,14 @@ class ServiceProviderABC(ABC):
pass pass
@abstractmethod @abstractmethod
def build_service(self, service_type: type, *args, **kwargs) -> object: def build_service(self, service_type: type) -> object:
r"""Creates instance of given type r"""Creates instance of given type
Parameter Parameter:
---------
instance_type: :class:`type` instance_type: :class:`type`
The type of the searched instance The type of the searched instance
Returns Returns:
-------
Object of the given type Object of the given type
""" """
pass pass
@ -43,8 +41,7 @@ class ServiceProviderABC(ABC):
def set_scope(self, scope: ScopeABC): def set_scope(self, scope: ScopeABC):
r"""Sets the scope of service provider r"""Sets the scope of service provider
Parameter Parameter:
---------
Object of type :class:`cpl_core.dependency_injection.scope_abc.ScopeABC` Object of type :class:`cpl_core.dependency_injection.scope_abc.ScopeABC`
Service scope Service scope
""" """
@ -54,38 +51,33 @@ class ServiceProviderABC(ABC):
def create_scope(self) -> ScopeABC: def create_scope(self) -> ScopeABC:
r"""Creates a service scope r"""Creates a service scope
Returns Returns:
-------
Object of type :class:`cpl_core.dependency_injection.scope_abc.ScopeABC` Object of type :class:`cpl_core.dependency_injection.scope_abc.ScopeABC`
""" """
pass pass
@abstractmethod @abstractmethod
def get_service(self, instance_type: T, *args, **kwargs) -> Optional[T]: def get_service(self, instance_type: Type[T]) -> Optional[T]:
r"""Returns instance of given type r"""Returns instance of given type
Parameter Parameter:
---------
instance_type: :class:`cpl_core.type.T` instance_type: :class:`cpl_core.type.T`
The type of the searched instance The type of the searched instance
Returns Returns:
-------
Object of type Optional[:class:`cpl_core.type.T`] Object of type Optional[:class:`cpl_core.type.T`]
""" """
pass pass
@abstractmethod @abstractmethod
def get_services(self, service_type: T, *args, **kwargs) -> list[Optional[T]]: def get_services(self, service_type: T) -> list[Optional[T]]:
r"""Returns instance of given type r"""Returns instance of given type
Parameter Parameter:
---------
instance_type: :class:`cpl_core.type.T` instance_type: :class:`cpl_core.type.T`
The type of the searched instance The type of the searched instance
Returns Returns:
-------
Object of type list[Optional[:class:`cpl_core.type.T`] Object of type list[Optional[:class:`cpl_core.type.T`]
""" """
pass pass
@ -94,12 +86,10 @@ class ServiceProviderABC(ABC):
def inject(cls, f=None): def inject(cls, f=None):
r"""Decorator to allow injection into static and class methods r"""Decorator to allow injection into static and class methods
Parameter Parameter:
---------
f: Callable f: Callable
Returns Returns:
-------
function function
""" """
if f is None: if f is None:
@ -110,7 +100,7 @@ class ServiceProviderABC(ABC):
if cls._provider is None: if cls._provider is None:
raise Exception(f"{cls.__name__} not build!") raise Exception(f"{cls.__name__} not build!")
injection = [x for x in cls._provider.build_by_signature(signature(f)) if x is not None] injection = cls._provider.build_by_signature(signature(f))
return f(*args, *injection, **kwargs) return f(*injection, *args, **kwargs)
return inner return inner

View File

@ -11,17 +11,15 @@ class Event(GenerateSchematicABC):
GenerateSchematicABC.__init__(self, name, schematic, path) GenerateSchematicABC.__init__(self, name, schematic, path)
event = None event = None
event_class = None
from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum
for event_type in DiscordEventTypesEnum: for event_type in DiscordEventTypesEnum:
event_name = event_type.value.__name__.replace("ABC", "") event_name = event_type.value.__name__.replace("ABC", "")
if name.endswith(event_name): if event_name in name:
name = name.replace(event_name, "") name = name.replace(event_name, "")
event = event_name event = event_name
event_class = event_type.value
break break
if event is None: if event is None:
@ -31,28 +29,15 @@ class Event(GenerateSchematicABC):
Console.write_line(f'\t{event_type.value.__name__.replace("ABC", "")}') Console.write_line(f'\t{event_type.value.__name__.replace("ABC", "")}')
sys.exit() sys.exit()
self._event_class_name = f"{event}ABC" self._event_class = f"{event}ABC"
event_snake_case = String.convert_to_snake_case(self._event_class_name.replace("ABC", "")) self._name = f'{String.convert_to_snake_case(self._event_class.replace("ABC", ""))}_{schematic}.py'
self._class_name = f'{self._event_class.replace("ABC", "")}{String.first_to_upper(schematic)}'
if event_snake_case.lower() not in dir(event_class):
Console.error(f"Error in event {event}: Function {event_snake_case} not found!")
sys.exit()
self._name = f"{event_snake_case}_{schematic}.py"
self._class_name = f'{self._event_class_name.replace("ABC", "")}{String.first_to_upper(schematic)}'
from inspect import signature
self._func_name = event_snake_case
self._signature = str(signature(getattr(event_class, event_snake_case)))[1:][:-1]
if name != "": if name != "":
self._name = f"{String.convert_to_snake_case(name)}_{self._name}" self._name = f"{String.convert_to_snake_case(name)}_{self._name}"
self._class_name = f"{String.first_to_upper(name)}{self._class_name}" self._class_name = f"{String.first_to_upper(name)}{self._class_name}"
def get_code(self) -> str: def get_code(self) -> str:
code = """\ code = """\
import discord
from cpl_core.logging import LoggerABC from cpl_core.logging import LoggerABC
from cpl_discord.events import $EventClass from cpl_discord.events import $EventClass
from cpl_discord.service import DiscordBotServiceABC from cpl_discord.service import DiscordBotServiceABC
@ -65,21 +50,15 @@ class Event(GenerateSchematicABC):
logger: LoggerABC, logger: LoggerABC,
bot: DiscordBotServiceABC, bot: DiscordBotServiceABC,
): ):
$EventClass.__init__(self) OnReadyABC.__init__(self)
self._logger = logger self._logger = logger
self._bot = bot self._bot = bot
async def $Func($Signature): async def on_ready(self):
pass pass
""" """
return self.build_code_str( return self.build_code_str(code, Name=self._class_name, EventClass=self._event_class)
code,
Name=self._class_name,
EventClass=self._event_class_name,
Func=self._func_name,
Signature=self._signature,
)
@classmethod @classmethod
def register(cls): def register(cls):

View File

@ -47,11 +47,6 @@ from cpl_discord.events.on_reaction_clear_emoji_abc import OnReactionClearEmojiA
from cpl_discord.events.on_reaction_remove_abc import OnReactionRemoveABC from cpl_discord.events.on_reaction_remove_abc import OnReactionRemoveABC
from cpl_discord.events.on_ready_abc import OnReadyABC from cpl_discord.events.on_ready_abc import OnReadyABC
from cpl_discord.events.on_resume_abc import OnResumeABC from cpl_discord.events.on_resume_abc import OnResumeABC
from cpl_discord.events.on_scheduled_event_create_abc import OnScheduledEventCreateABC
from cpl_discord.events.on_scheduled_event_delete_abc import OnScheduledEventDeleteABC
from cpl_discord.events.on_scheduled_event_update_abc import OnScheduledEventUpdateABC
from cpl_discord.events.on_scheduled_event_user_add_abc import OnScheduledEventUserAddABC
from cpl_discord.events.on_scheduled_event_user_remove_abc import OnScheduledEventUserRemoveABC
from cpl_discord.events.on_typing_abc import OnTypingABC from cpl_discord.events.on_typing_abc import OnTypingABC
from cpl_discord.events.on_user_update_abc import OnUserUpdateABC from cpl_discord.events.on_user_update_abc import OnUserUpdateABC
from cpl_discord.events.on_voice_state_update_abc import OnVoiceStateUpdateABC from cpl_discord.events.on_voice_state_update_abc import OnVoiceStateUpdateABC
@ -81,11 +76,6 @@ class DiscordEventTypesEnum(Enum):
on_guild_role_delete = OnGuildRoleDeleteABC on_guild_role_delete = OnGuildRoleDeleteABC
on_guild_role_update = OnGuildRoleUpdateABC on_guild_role_update = OnGuildRoleUpdateABC
on_guild_unavailable = OnGuildUnavailableABC on_guild_unavailable = OnGuildUnavailableABC
on_scheduled_event_create = OnScheduledEventCreateABC
on_scheduled_event_delete = OnScheduledEventDeleteABC
on_scheduled_event_update = OnScheduledEventUpdateABC
on_scheduled_event_user_add = OnScheduledEventUserAddABC
on_scheduled_event_user_remove = OnScheduledEventUserRemoveABC
on_guild_update = OnGuildUpdateABC on_guild_update = OnGuildUpdateABC
on_invite_create = OnInviteCreateABC on_invite_create = OnInviteCreateABC
on_invite_delete = OnInviteDeleteABC on_invite_delete = OnInviteDeleteABC

View File

@ -1,12 +0,0 @@
from abc import ABC, abstractmethod
import discord
class OnScheduledEventCreateABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
async def on_scheduled_event_create(self, event: discord.ScheduledEvent):
pass

View File

@ -1,12 +0,0 @@
from abc import ABC, abstractmethod
import discord
class OnScheduledEventDeleteABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
async def on_scheduled_event_delete(self, event: discord.ScheduledEvent):
pass

View File

@ -1,12 +0,0 @@
from abc import ABC, abstractmethod
import discord
class OnScheduledEventUpdateABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
async def on_scheduled_event_update(self, before: discord.ScheduledEvent, after: discord.ScheduledEvent):
pass

View File

@ -1,12 +0,0 @@
from abc import ABC, abstractmethod
import discord
class OnScheduledEventUserAddABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
async def on_scheduled_event_user_add(self, event: discord.ScheduledEvent, user: discord.User):
pass

View File

@ -1,12 +0,0 @@
from abc import ABC, abstractmethod
import discord
class OnScheduledEventUserRemoveABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
async def on_scheduled_event_user_remove(self, event: discord.ScheduledEvent, user: discord.User):
pass

View File

@ -21,8 +21,6 @@ class DiscordBotService(DiscordBotServiceABC):
env: ApplicationEnvironmentABC, env: ApplicationEnvironmentABC,
logging_st: LoggingSettings, logging_st: LoggingSettings,
discord_service: DiscordServiceABC, discord_service: DiscordServiceABC,
*args,
**kwargs,
): ):
# services # services
self._config = config self._config = config
@ -36,12 +34,7 @@ class DiscordBotService(DiscordBotServiceABC):
# setup super # setup super
DiscordBotServiceABC.__init__( DiscordBotServiceABC.__init__(
self, self, command_prefix=self._discord_settings.prefix, help_command=None, intents=discord.Intents().all()
*args,
command_prefix=self._discord_settings.prefix,
help_command=None,
intents=discord.Intents().all(),
**kwargs,
) )
self._base = super(DiscordBotServiceABC, self) self._base = super(DiscordBotServiceABC, self)

View File

@ -7,8 +7,8 @@ from cpl_query.extension.list import List
class DiscordBotServiceABC(commands.Bot): class DiscordBotServiceABC(commands.Bot):
def __init__(self, *args, **kwargs): def __init__(self, **kwargs):
commands.Bot.__init__(self, *args, **kwargs) commands.Bot.__init__(self, **kwargs)
@abstractmethod @abstractmethod
async def start_async(self): async def start_async(self):

View File

@ -57,11 +57,6 @@ from cpl_discord.events.on_reaction_clear_emoji_abc import OnReactionClearEmojiA
from cpl_discord.events.on_reaction_remove_abc import OnReactionRemoveABC from cpl_discord.events.on_reaction_remove_abc import OnReactionRemoveABC
from cpl_discord.events.on_ready_abc import OnReadyABC from cpl_discord.events.on_ready_abc import OnReadyABC
from cpl_discord.events.on_resume_abc import OnResumeABC from cpl_discord.events.on_resume_abc import OnResumeABC
from cpl_discord.events.on_scheduled_event_create_abc import OnScheduledEventCreateABC
from cpl_discord.events.on_scheduled_event_delete_abc import OnScheduledEventDeleteABC
from cpl_discord.events.on_scheduled_event_update_abc import OnScheduledEventUpdateABC
from cpl_discord.events.on_scheduled_event_user_add_abc import OnScheduledEventUserAddABC
from cpl_discord.events.on_scheduled_event_user_remove_abc import OnScheduledEventUserRemoveABC
from cpl_discord.events.on_typing_abc import OnTypingABC from cpl_discord.events.on_typing_abc import OnTypingABC
from cpl_discord.events.on_user_update_abc import OnUserUpdateABC from cpl_discord.events.on_user_update_abc import OnUserUpdateABC
from cpl_discord.events.on_voice_state_update_abc import OnVoiceStateUpdateABC from cpl_discord.events.on_voice_state_update_abc import OnVoiceStateUpdateABC
@ -342,31 +337,6 @@ class DiscordService(DiscordServiceABC, commands.Cog, metaclass=DiscordCogMeta):
self._logger.trace(__name__, f"Received on_guild_unavailable:\n\t{guild}") self._logger.trace(__name__, f"Received on_guild_unavailable:\n\t{guild}")
await self._handle_event(OnGuildUnavailableABC, guild) await self._handle_event(OnGuildUnavailableABC, guild)
@commands.Cog.listener()
async def on_scheduled_event_create(self, event: discord.ScheduledEvent):
self._logger.trace(__name__, f"Received on_scheduled_event_create:\n\t{event}")
await self._handle_event(OnScheduledEventCreateABC, event)
@commands.Cog.listener()
async def on_scheduled_event_delete(self, event: discord.ScheduledEvent):
self._logger.trace(__name__, f"Received on_scheduled_event_delete:\n\t{event}")
await self._handle_event(OnScheduledEventDeleteABC, event)
@commands.Cog.listener()
async def on_scheduled_event_update(self, before: discord.ScheduledEvent, after: discord.ScheduledEvent):
self._logger.trace(__name__, f"Received on_scheduled_event_update:\n\t{before}, {after}")
await self._handle_event(OnScheduledEventUpdateABC, before, after)
@commands.Cog.listener()
async def on_scheduled_event_user_add(self, event: discord.ScheduledEvent, user: discord.User):
self._logger.trace(__name__, f"Received on_scheduled_event_user_add:\n\t{event}, {user}")
await self._handle_event(OnScheduledEventUserAddABC, event, user)
@commands.Cog.listener()
async def on_scheduled_event_user_remove(self, event: discord.ScheduledEvent, user: discord.User):
self._logger.trace(__name__, f"Received on_scheduled_event_user_remove:\n\t{event}, {user}")
await self._handle_event(OnScheduledEventUserRemoveABC, event, user)
@commands.Cog.listener() @commands.Cog.listener()
async def on_voice_state_update( async def on_voice_state_update(
self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState

View File

@ -21,13 +21,11 @@ class QueryableABC(Sequence):
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
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
bool bool
""" """
if _func is None: if _func is None:
@ -38,13 +36,11 @@ class QueryableABC(Sequence):
def any(self, _func: Callable = None) -> bool: def any(self, _func: Callable = None) -> bool:
r"""Checks if list contains result found by function r"""Checks if list contains result found by function
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
bool bool
""" """
if _func is None: if _func is None:
@ -55,13 +51,11 @@ class QueryableABC(Sequence):
def average(self, _func: Callable = None) -> Union[int, float, complex]: def average(self, _func: Callable = None) -> Union[int, float, complex]:
r"""Returns average value of list r"""Returns average value of list
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
Union[int, float, complex] Union[int, float, complex]
""" """
if _func is None and not is_number(self.type): if _func is None and not is_number(self.type):
@ -72,13 +66,11 @@ class QueryableABC(Sequence):
def contains(self, _value: object) -> bool: def contains(self, _value: object) -> bool:
r"""Checks if list contains value given by function r"""Checks if list contains value given by function
Parameter Parameter:
---------
value: :class:`object` value: :class:`object`
value value
Returns Returns:
-------
bool bool
""" """
if _value is None: if _value is None:
@ -89,13 +81,11 @@ class QueryableABC(Sequence):
def count(self, _func: Callable = None) -> int: def count(self, _func: Callable = None) -> int:
r"""Returns length of list or count of found elements r"""Returns length of list or count of found elements
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
int int
""" """
if _func is None: if _func is None:
@ -106,13 +96,11 @@ class QueryableABC(Sequence):
def distinct(self, _func: Callable = None) -> "QueryableABC": def distinct(self, _func: Callable = None) -> "QueryableABC":
r"""Returns list without redundancies r"""Returns list without redundancies
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _func is None: if _func is None:
@ -133,13 +121,11 @@ class QueryableABC(Sequence):
def element_at(self, _index: int) -> any: def element_at(self, _index: int) -> any:
r"""Returns element at given index r"""Returns element at given index
Parameter Parameter:
---------
_index: :class:`int` _index: :class:`int`
index index
Returns Returns:
-------
Value at _index: any Value at _index: any
""" """
if _index is None: if _index is None:
@ -157,13 +143,11 @@ class QueryableABC(Sequence):
def element_at_or_default(self, _index: int) -> Optional[any]: def element_at_or_default(self, _index: int) -> Optional[any]:
r"""Returns element at given index or None r"""Returns element at given index or None
Parameter Parameter:
---------
_index: :class:`int` _index: :class:`int`
index index
Returns Returns:
-------
Value at _index: Optional[any] Value at _index: Optional[any]
""" """
if _index is None: if _index is None:
@ -177,8 +161,7 @@ class QueryableABC(Sequence):
def first(self) -> any: def first(self) -> any:
r"""Returns first element r"""Returns first element
Returns Returns:
-------
First element of list: any First element of list: any
""" """
if self.count() == 0: if self.count() == 0:
@ -189,8 +172,7 @@ class QueryableABC(Sequence):
def first_or_default(self) -> any: def first_or_default(self) -> any:
r"""Returns first element or None r"""Returns first element or None
Returns Returns:
-------
First element of list: Optional[any] First element of list: Optional[any]
""" """
if self.count() == 0: if self.count() == 0:
@ -201,8 +183,7 @@ class QueryableABC(Sequence):
def for_each(self, _func: Callable = None): def for_each(self, _func: Callable = None):
r"""Runs given function for each element of list r"""Runs given function for each element of list
Parameter Parameter:
---------
func: :class: `Callable` func: :class: `Callable`
function to call function to call
""" """
@ -215,8 +196,7 @@ class QueryableABC(Sequence):
def group_by(self, _func: Callable = None) -> "QueryableABC": def group_by(self, _func: Callable = None) -> "QueryableABC":
r"""Groups by func r"""Groups by func
Returns Returns:
-------
Grouped list[list[any]]: any Grouped list[list[any]]: any
""" """
if _func is None: if _func is None:
@ -239,8 +219,7 @@ class QueryableABC(Sequence):
def last(self) -> any: def last(self) -> any:
r"""Returns last element r"""Returns last element
Returns Returns:
-------
Last element of list: any Last element of list: any
""" """
if self.count() == 0: if self.count() == 0:
@ -251,8 +230,7 @@ class QueryableABC(Sequence):
def last_or_default(self) -> any: def last_or_default(self) -> any:
r"""Returns last element or None r"""Returns last element or None
Returns Returns:
-------
Last element of list: Optional[any] Last element of list: Optional[any]
""" """
if self.count() == 0: if self.count() == 0:
@ -263,13 +241,11 @@ class QueryableABC(Sequence):
def max(self, _func: Callable = None) -> object: def max(self, _func: Callable = None) -> object:
r"""Returns the highest value r"""Returns the highest value
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
object object
""" """
if _func is None and not is_number(self.type): if _func is None and not is_number(self.type):
@ -283,8 +259,7 @@ class QueryableABC(Sequence):
def median(self, _func=None) -> Union[int, float]: def median(self, _func=None) -> Union[int, float]:
r"""Return the median value of data elements r"""Return the median value of data elements
Returns Returns:
-------
Union[int, float] Union[int, float]
""" """
if _func is None: if _func is None:
@ -298,13 +273,11 @@ class QueryableABC(Sequence):
def min(self, _func: Callable = None) -> object: def min(self, _func: Callable = None) -> object:
r"""Returns the lowest value r"""Returns the lowest value
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
object object
""" """
if _func is None and not is_number(self.type): if _func is None and not is_number(self.type):
@ -315,17 +288,15 @@ class QueryableABC(Sequence):
return _func(min(self, key=_func)) return _func(min(self, key=_func))
def order_by(self, _func: Callable = None) -> "OrderedQueryableABC": def order_by(self, _func: Callable = None) -> "QueryableABC":
r"""Sorts elements by function in ascending order r"""Sorts elements by function in ascending order
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
------- :class: `cpl_query.base.queryable_abc.QueryableABC`
:class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC`
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = _default_lambda
@ -334,17 +305,15 @@ class QueryableABC(Sequence):
return OrderedQueryable(self.type, sorted(self, key=_func), _func) return OrderedQueryable(self.type, sorted(self, key=_func), _func)
def order_by_descending(self, _func: Callable = None) -> "OrderedQueryableABC": def order_by_descending(self, _func: Callable = None) -> "QueryableABC":
r"""Sorts elements by function in descending order r"""Sorts elements by function in descending order
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
------- :class: `cpl_query.base.queryable_abc.QueryableABC`
:class: `cpl_query.base.ordered_queryable_abc.OrderedQueryableABC`
""" """
if _func is None: if _func is None:
_func = _default_lambda _func = _default_lambda
@ -356,8 +325,7 @@ class QueryableABC(Sequence):
def reverse(self) -> "QueryableABC": def reverse(self) -> "QueryableABC":
r"""Reverses list r"""Reverses list
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
return type(self)(self._type, reversed(self._values)) return type(self)(self._type, reversed(self._values))
@ -365,8 +333,7 @@ class QueryableABC(Sequence):
def select(self, _func: Callable) -> "QueryableABC": def select(self, _func: Callable) -> "QueryableABC":
r"""Formats each element of list to a given format r"""Formats each element of list to a given format
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _func is None: if _func is None:
@ -377,8 +344,7 @@ class QueryableABC(Sequence):
def select_many(self, _func: Callable) -> "QueryableABC": def select_many(self, _func: Callable) -> "QueryableABC":
r"""Flattens resulting lists to one r"""Flattens resulting lists to one
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
# The line below is pain. I don't understand anything of it... # The line below is pain. I don't understand anything of it...
@ -388,12 +354,10 @@ class QueryableABC(Sequence):
def single(self) -> any: def single(self) -> any:
r"""Returns one single element of list r"""Returns one single element of list
Returns Returns:
-------
Found value: any Found value: any
Raises Raises:
------
ArgumentNoneException: when argument is None ArgumentNoneException: when argument is None
Exception: when argument is None or found more than one element Exception: when argument is None or found more than one element
""" """
@ -407,8 +371,7 @@ class QueryableABC(Sequence):
def single_or_default(self) -> Optional[any]: def single_or_default(self) -> Optional[any]:
r"""Returns one single element of list r"""Returns one single element of list
Returns Returns:
-------
Found value: Optional[any] Found value: Optional[any]
""" """
if self.count() > 1: if self.count() > 1:
@ -421,13 +384,11 @@ class QueryableABC(Sequence):
def skip(self, _index: int) -> "QueryableABC": def skip(self, _index: int) -> "QueryableABC":
r"""Skips all elements from index r"""Skips all elements from index
Parameter Parameter:
---------
_index: :class:`int` _index: :class:`int`
index index
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _index is None: if _index is None:
@ -438,13 +399,11 @@ class QueryableABC(Sequence):
def skip_last(self, _index: int) -> "QueryableABC": def skip_last(self, _index: int) -> "QueryableABC":
r"""Skips all elements after index r"""Skips all elements after index
Parameter Parameter:
---------
_index: :class:`int` _index: :class:`int`
index index
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _index is None: if _index is None:
@ -456,13 +415,11 @@ class QueryableABC(Sequence):
def sum(self, _func: Callable = None) -> Union[int, float, complex]: def sum(self, _func: Callable = None) -> Union[int, float, complex]:
r"""Sum of all values r"""Sum of all values
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
Union[int, float, complex] Union[int, float, complex]
""" """
if _func is None and not is_number(self.type): if _func is None and not is_number(self.type):
@ -481,13 +438,11 @@ class QueryableABC(Sequence):
r"""Splits the list by given function r"""Splits the list by given function
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
seperator seperator
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
groups = [] groups = []
@ -513,13 +468,11 @@ class QueryableABC(Sequence):
def take(self, _index: int) -> "QueryableABC": def take(self, _index: int) -> "QueryableABC":
r"""Takes all elements from index r"""Takes all elements from index
Parameter Parameter:
---------
_index: :class:`int` _index: :class:`int`
index index
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _index is None: if _index is None:
@ -530,13 +483,11 @@ class QueryableABC(Sequence):
def take_last(self, _index: int) -> "QueryableABC": def take_last(self, _index: int) -> "QueryableABC":
r"""Takes all elements after index r"""Takes all elements after index
Parameter Parameter:
---------
_index: :class:`int` _index: :class:`int`
index index
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
index = self.count() - _index index = self.count() - _index
@ -549,13 +500,11 @@ class QueryableABC(Sequence):
def where(self, _func: Callable = None) -> "QueryableABC": def where(self, _func: Callable = None) -> "QueryableABC":
r"""Select element by function r"""Select element by function
Parameter Parameter:
---------
func: :class:`Callable` func: :class:`Callable`
selected value selected value
Returns Returns:
-------
:class: `cpl_query.base.queryable_abc.QueryableABC` :class: `cpl_query.base.queryable_abc.QueryableABC`
""" """
if _func is None: if _func is None: