Source code for calute.core.basics

# Copyright 2025 The EasyDeL/Calute Author @erfanzar (Erfan Zare Chavoshi).
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


"""Basic utilities and registration system for Calute components.

This module provides a registration system for tracking and managing
different Calute components including clients, agents, and calute instances.
It also includes utility functions for pretty-printing and object serialization.
"""

import pprint
from typing import Any, Literal, TypeVar

CLIENT_REGISTRY: dict[str, Any] = dict()
"""Registry for client instances."""

AGENTS_REGISTRY: dict[str, Any] = dict()
"""Registry for agent instances."""

CALUTE_REGISTRY: dict[str, Any] = dict()
"""Registry for calute instances."""

REGISTRY: dict[str, dict[str, Any]] = {
    "client": CLIENT_REGISTRY,
    "agents": AGENTS_REGISTRY,
    "calute": CALUTE_REGISTRY,
}
"""Master registry containing all component registries."""

T = TypeVar("T")


def _pretty_print(dict_in: dict[str, Any], indent: int = 0) -> str:
    """Helper function for pretty-printing a dictionary.

    Recursively formats a dictionary with proper indentation for
    improved readability.

    Args:
        dict_in: The dictionary to pretty-print.
        indent: The current indentation level (spaces).

    Returns:
        The pretty-printed string representation of the dictionary.

    Example:
        >>> d = {"key1": "value1", "nested": {"key2": "value2"}}
        >>> print(_pretty_print(d))
        key1:
          value1
        nested:
          key2:
            value2
    """
    result = []
    for key, value in dict_in.items():
        result.append(" " * indent + str(key) + ":")
        if isinstance(value, dict):
            result.append(_pretty_print(value, indent + 2))
        else:
            result.append(" " * (indent + 2) + str(value))
    return "\n".join(result)


[docs]def basic_registry( register_type: Literal["calute", "agents", "client"], register_name: str, ) -> callable: """Decorator for registering Calute components and adding utility methods. This decorator registers a class in the appropriate registry and adds utility methods for serialization and string representation. Args: register_type: The type of component to register ('calute', 'agents', or 'client'). register_name: The name to register the component under. Returns: A decorator function that registers the class and adds utility methods. Raises: AssertionError: If register_type is not one of the valid options. Example: >>> @basic_registry("agents", "my_agent") ... class MyAgent: ... def __init__(self, name): ... self.name = name >>> >>> agent = MyAgent("test") >>> print(agent.to_dict()) {'name': 'test'} """ assert register_type in ["calute", "agents", "client"], "Unknown Registry!" def to_dict(self) -> dict[str, Any]: """Convert the class instance into a dictionary. Returns: A dictionary representation of the instance, excluding private attributes. """ return {k: v for k, v in self.__dict__.items() if not k.startswith("_")} def str_func(self) -> str: """Return a formatted string representation of the instance. Returns: A formatted string showing the instance configuration. """ return f"{self.__class__.__name__}(\n\t" + pprint.pformat(self.to_dict(), indent=2).replace("\n", "\n\t") + "\n)" def wraper(obj: T) -> T: """Inner wrapper that applies the registration and method additions. Args: obj: The class to be registered and enhanced. Returns: The enhanced class with added utility methods. """ obj.to_dict = to_dict obj.__str__ = str_func obj.__repr__ = str_func REGISTRY[register_type][register_name] = obj return obj return wraper