Ask AI

Source code for dagster._config.config_schema

from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Sequence, Type, Union

from typing_extensions import TypeAlias

if TYPE_CHECKING:
    from dagster._config import ConfigType, Field

# Eventually, the below `UserConfigSchema` should be renamed to `ConfigSchema` and the class
# definition should be dropped. The reason we don't do this now is that sphinx autodoc doesn't
# support type aliases, so there is no good way to gracefully attach a docstring to this and have it
# show up in the docs. See: https://github.com/sphinx-doc/sphinx/issues/8934
#
# Unfortunately mypy doesn't support recursive types, which would be used to properly define the
# List/Dict elements of this union: `Dict[str, ConfigSchema]`, `List[ConfigSchema]`.
UserConfigSchema: TypeAlias = Union[
    Type[Union[bool, float, int, str]],
    Type[Union[Dict[Any, Any], List[Any]]],
    "ConfigType",
    "Field",
    Mapping[str, Any],
    Sequence[Any],
]


[docs]class ConfigSchema: """Placeholder type for config schemas. Any time that it appears in documentation, it means that any of the following types are acceptable: #. A Python scalar type that resolves to a Dagster config type (:py:class:`~python:int`, :py:class:`~python:float`, :py:class:`~python:bool`, or :py:class:`~python:str`). For example: * ``@op(config_schema=int)`` * ``@op(config_schema=str)`` #. A built-in python collection (:py:class:`~python:list`, or :py:class:`~python:dict`). :py:class:`~python:list` is exactly equivalent to :py:class:`~dagster.Array` [ :py:class:`~dagster.Any` ] and :py:class:`~python:dict` is equivalent to :py:class:`~dagster.Permissive`. For example: * ``@op(config_schema=list)`` * ``@op(config_schema=dict)`` #. A Dagster config type: * :py:data:`~dagster.Any` * :py:class:`~dagster.Array` * :py:data:`~dagster.Bool` * :py:data:`~dagster.Enum` * :py:data:`~dagster.Float` * :py:data:`~dagster.Int` * :py:data:`~dagster.IntSource` * :py:data:`~dagster.Noneable` * :py:class:`~dagster.Permissive` * :py:class:`~dagster.Map` * :py:class:`~dagster.ScalarUnion` * :py:class:`~dagster.Selector` * :py:class:`~dagster.Shape` * :py:data:`~dagster.String` * :py:data:`~dagster.StringSource` #. A bare python dictionary, which will be automatically wrapped in :py:class:`~dagster.Shape`. Values of the dictionary are resolved recursively according to the same rules. For example: * ``{'some_config': str}`` is equivalent to ``Shape({'some_config: str})``. * ``{'some_config1': {'some_config2': str}}`` is equivalent to ``Shape({'some_config1: Shape({'some_config2: str})})``. #. A bare python list of length one, whose single element will be wrapped in a :py:class:`~dagster.Array` is resolved recursively according to the same rules. For example: * ``[str]`` is equivalent to ``Array[str]``. * ``[[str]]`` is equivalent to ``Array[Array[str]]``. * ``[{'some_config': str}]`` is equivalent to ``Array(Shape({'some_config: str}))``. #. An instance of :py:class:`~dagster.Field`. """ def __init__(self): raise NotImplementedError( "ConfigSchema is a placeholder type and should not be instantiated." )