GRAYBYTE WORDPRESS FILE MANAGER1719

Server IP : 198.54.121.189 / Your IP : 216.73.216.112
System : Linux premium69.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
PHP Version : 7.4.33
Disable Function : NONE
cURL : ON | WGET : ON | Sudo : OFF | Pkexec : OFF
Directory : /opt/hc_python/lib/python3.12/site-packages/sqlalchemy/orm/
Upload Files :
Current_dir [ Not Writeable ] Document_root [ Writeable ]

Command :


Current File : /opt/hc_python/lib/python3.12/site-packages/sqlalchemy/orm//state_changes.py
# orm/state_changes.py
# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
# <see AUTHORS file>
#
# This module is part of SQLAlchemy and is released under
# the MIT License: https://www.opensource.org/licenses/mit-license.php

"""State tracking utilities used by :class:`_orm.Session`.

"""

from __future__ import annotations

import contextlib
from enum import Enum
from typing import Any
from typing import Callable
from typing import cast
from typing import Iterator
from typing import NoReturn
from typing import Optional
from typing import Tuple
from typing import TypeVar
from typing import Union

from .. import exc as sa_exc
from .. import util
from ..util.typing import Literal

_F = TypeVar("_F", bound=Callable[..., Any])


class _StateChangeState(Enum):
    pass


class _StateChangeStates(_StateChangeState):
    ANY = 1
    NO_CHANGE = 2
    CHANGE_IN_PROGRESS = 3


class _StateChange:
    """Supplies state assertion decorators.

    The current use case is for the :class:`_orm.SessionTransaction` class. The
    :class:`_StateChange` class itself is agnostic of the
    :class:`_orm.SessionTransaction` class so could in theory be generalized
    for other systems as well.

    """

    _next_state: _StateChangeState = _StateChangeStates.ANY
    _state: _StateChangeState = _StateChangeStates.NO_CHANGE
    _current_fn: Optional[Callable[..., Any]] = None

    def _raise_for_prerequisite_state(
        self, operation_name: str, state: _StateChangeState
    ) -> NoReturn:
        raise sa_exc.IllegalStateChangeError(
            f"Can't run operation '{operation_name}()' when Session "
            f"is in state {state!r}",
            code="isce",
        )

    @classmethod
    def declare_states(
        cls,
        prerequisite_states: Union[
            Literal[_StateChangeStates.ANY], Tuple[_StateChangeState, ...]
        ],
        moves_to: _StateChangeState,
    ) -> Callable[[_F], _F]:
        """Method decorator declaring valid states.

        :param prerequisite_states: sequence of acceptable prerequisite
         states.   Can be the single constant _State.ANY to indicate no
         prerequisite state

        :param moves_to: the expected state at the end of the method, assuming
         no exceptions raised.   Can be the constant _State.NO_CHANGE to
         indicate state should not change at the end of the method.

        """
        assert prerequisite_states, "no prequisite states sent"
        has_prerequisite_states = (
            prerequisite_states is not _StateChangeStates.ANY
        )

        prerequisite_state_collection = cast(
            "Tuple[_StateChangeState, ...]", prerequisite_states
        )
        expect_state_change = moves_to is not _StateChangeStates.NO_CHANGE

        @util.decorator
        def _go(fn: _F, self: Any, *arg: Any, **kw: Any) -> Any:
            current_state = self._state

            if (
                has_prerequisite_states
                and current_state not in prerequisite_state_collection
            ):
                self._raise_for_prerequisite_state(fn.__name__, current_state)

            next_state = self._next_state
            existing_fn = self._current_fn
            expect_state = moves_to if expect_state_change else current_state

            if (
                # destination states are restricted
                next_state is not _StateChangeStates.ANY
                # method seeks to change state
                and expect_state_change
                # destination state incorrect
                and next_state is not expect_state
            ):
                if existing_fn and next_state in (
                    _StateChangeStates.NO_CHANGE,
                    _StateChangeStates.CHANGE_IN_PROGRESS,
                ):
                    raise sa_exc.IllegalStateChangeError(
                        f"Method '{fn.__name__}()' can't be called here; "
                        f"method '{existing_fn.__name__}()' is already "
                        f"in progress and this would cause an unexpected "
                        f"state change to {moves_to!r}",
                        code="isce",
                    )
                else:
                    raise sa_exc.IllegalStateChangeError(
                        f"Cant run operation '{fn.__name__}()' here; "
                        f"will move to state {moves_to!r} where we are "
                        f"expecting {next_state!r}",
                        code="isce",
                    )

            self._current_fn = fn
            self._next_state = _StateChangeStates.CHANGE_IN_PROGRESS
            try:
                ret_value = fn(self, *arg, **kw)
            except:
                raise
            else:
                if self._state is expect_state:
                    return ret_value

                if self._state is current_state:
                    raise sa_exc.IllegalStateChangeError(
                        f"Method '{fn.__name__}()' failed to "
                        "change state "
                        f"to {moves_to!r} as expected",
                        code="isce",
                    )
                elif existing_fn:
                    raise sa_exc.IllegalStateChangeError(
                        f"While method '{existing_fn.__name__}()' was "
                        "running, "
                        f"method '{fn.__name__}()' caused an "
                        "unexpected "
                        f"state change to {self._state!r}",
                        code="isce",
                    )
                else:
                    raise sa_exc.IllegalStateChangeError(
                        f"Method '{fn.__name__}()' caused an unexpected "
                        f"state change to {self._state!r}",
                        code="isce",
                    )

            finally:
                self._next_state = next_state
                self._current_fn = existing_fn

        return _go

    @contextlib.contextmanager
    def _expect_state(self, expected: _StateChangeState) -> Iterator[Any]:
        """called within a method that changes states.

        method must also use the ``@declare_states()`` decorator.

        """
        assert self._next_state is _StateChangeStates.CHANGE_IN_PROGRESS, (
            "Unexpected call to _expect_state outside of "
            "state-changing method"
        )

        self._next_state = expected
        try:
            yield
        except:
            raise
        else:
            if self._state is not expected:
                raise sa_exc.IllegalStateChangeError(
                    f"Unexpected state change to {self._state!r}", code="isce"
                )
        finally:
            self._next_state = _StateChangeStates.CHANGE_IN_PROGRESS

[ Back ]
Name
Size
Last Modified
Owner / Group
Permissions
Options
..
--
April 04 2025 08:00:23
root / root
0755
__pycache__
--
April 04 2025 08:00:24
root / root
0755
__init__.py
8.265 KB
April 04 2025 08:00:23
root / root
0644
_orm_constructors.py
101.197 KB
April 04 2025 08:00:23
root / root
0644
_typing.py
4.856 KB
April 04 2025 08:00:23
root / root
0644
attributes.py
90.365 KB
April 04 2025 08:00:23
root / root
0644
base.py
26.856 KB
April 04 2025 08:00:23
root / root
0644
bulk_persistence.py
70.96 KB
April 04 2025 08:00:23
root / root
0644
clsregistry.py
17.553 KB
April 04 2025 08:00:23
root / root
0644
collections.py
51.027 KB
April 04 2025 08:00:23
root / root
0644
context.py
112.415 KB
April 04 2025 08:00:23
root / root
0644
decl_api.py
63.446 KB
April 04 2025 08:00:23
root / root
0644
decl_base.py
81.336 KB
April 04 2025 08:00:23
root / root
0644
dependency.py
46.515 KB
April 04 2025 08:00:23
root / root
0644
descriptor_props.py
36.358 KB
April 04 2025 08:00:23
root / root
0644
dynamic.py
9.586 KB
April 04 2025 08:00:23
root / root
0644
evaluator.py
12.063 KB
April 04 2025 08:00:23
root / root
0644
events.py
124.786 KB
April 04 2025 08:00:23
root / root
0644
exc.py
7.239 KB
April 04 2025 08:00:23
root / root
0644
identity.py
9.032 KB
April 04 2025 08:00:23
root / root
0644
instrumentation.py
23.751 KB
April 04 2025 08:00:23
root / root
0644
interfaces.py
47.653 KB
April 04 2025 08:00:23
root / root
0644
loading.py
56.911 KB
April 04 2025 08:00:23
root / root
0644
mapped_collection.py
19.221 KB
April 04 2025 08:00:23
root / root
0644
mapper.py
167.632 KB
April 04 2025 08:00:23
root / root
0644
path_registry.py
25.309 KB
April 04 2025 08:00:23
root / root
0644
persistence.py
60.255 KB
April 04 2025 08:00:23
root / root
0644
properties.py
28.384 KB
April 04 2025 08:00:23
root / root
0644
query.py
115.954 KB
April 04 2025 08:00:23
root / root
0644
relationships.py
125.878 KB
April 04 2025 08:00:23
root / root
0644
scoping.py
76.774 KB
April 04 2025 08:00:23
root / root
0644
session.py
191.518 KB
April 04 2025 08:00:23
root / root
0644
state.py
36.787 KB
April 04 2025 08:00:23
root / root
0644
state_changes.py
6.655 KB
April 04 2025 08:00:23
root / root
0644
strategies.py
117.057 KB
April 04 2025 08:00:23
root / root
0644
strategy_options.py
83.05 KB
April 04 2025 08:00:23
root / root
0644
sync.py
5.644 KB
April 04 2025 08:00:23
root / root
0644
unitofwork.py
26.399 KB
April 04 2025 08:00:23
root / root
0644
util.py
78.937 KB
April 04 2025 08:00:23
root / root
0644
writeonly.py
21.782 KB
April 04 2025 08:00:23
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2025
CONTACT ME
Static GIF