HEX
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/8.4.25
System: Windows NT DESKTOP-4TAV2RJ 10.0 build 19045 (Windows 10) AMD64
User: fred (0)
PHP: 8.4.25
Disabled: NONE
Upload Files
File: C:/Users/fred/anaconda3/Lib/site-packages/tables/undoredo.py
"""Support for undoing and redoing actions.

Functions:

* undo(file, operation, *args)
* redo(file, operation, *args)
* move_to_shadow(file, path)
* move_from_shadow(file, path)
* attr_to_shadow(file, path, name)
* attr_from_shadow(file, path, name)

Misc variables:

`__docformat__`
    The format of documentation strings in this module.

"""
from typing import Literal, TYPE_CHECKING

from .path import split_path

if TYPE_CHECKING:
    from .file import File

__docformat__ = 'reStructuredText'
"""The format of documentation strings in this module."""


def undo(file_: "File",
         operation: Literal["ADDATTR", "CREATE", "DELATTR", "MOVE", "REMOVE"],
         *args: str) -> None:
    if operation == 'CREATE':
        undo_create(file_, args[0])
    elif operation == 'REMOVE':
        undo_remove(file_, args[0])
    elif operation == 'MOVE':
        undo_move(file_, args[0], args[1])
    elif operation == 'ADDATTR':
        undo_add_attr(file_, args[0], args[1])
    elif operation == 'DELATTR':
        undo_del_attr(file_, args[0], args[1])
    else:
        raise NotImplementedError("the requested unknown operation %r can "
                                  "not be undone; please report this to the "
                                  "authors" % operation)


def redo(file_: "File",
         operation: Literal["ADDATTR", "CREATE", "DELATTR", "MOVE", "REMOVE"],
         *args: str) -> None:
    if operation == 'CREATE':
        redo_create(file_, args[0])
    elif operation == 'REMOVE':
        redo_remove(file_, args[0])
    elif operation == 'MOVE':
        redo_move(file_, args[0], args[1])
    elif operation == 'ADDATTR':
        redo_add_attr(file_, args[0], args[1])
    elif operation == 'DELATTR':
        redo_del_attr(file_, args[0], args[1])
    else:
        raise NotImplementedError("the requested unknown operation %r can "
                                  "not be redone; please report this to the "
                                  "authors" % operation)


def move_to_shadow(file_: "File", path: str) -> None:
    node = file_._get_node(path)

    (shparent, shname) = file_._shadow_name()
    node._g_move(shparent, shname)


def move_from_shadow(file_: "File", path: str) -> None:
    (shparent, shname) = file_._shadow_name()
    node = shparent._f_get_child(shname)

    (pname, name) = split_path(path)
    parent = file_._get_node(pname)
    node._g_move(parent, name)


def undo_create(file_: "File", path: str) -> None:
    move_to_shadow(file_, path)


def redo_create(file_: "File", path: str) -> None:
    move_from_shadow(file_, path)


def undo_remove(file_: "File", path: str) -> None:
    move_from_shadow(file_, path)


def redo_remove(file_: "File", path: str) -> None:
    move_to_shadow(file_, path)


def undo_move(file_: "File", origpath: str, destpath: str) -> None:
    (origpname, origname) = split_path(origpath)

    node = file_._get_node(destpath)
    origparent = file_._get_node(origpname)
    node._g_move(origparent, origname)


def redo_move(file_: "File", origpath: str, destpath: str) -> None:
    (destpname, destname) = split_path(destpath)

    node = file_._get_node(origpath)
    destparent = file_._get_node(destpname)
    node._g_move(destparent, destname)


def attr_to_shadow(file_: "File", path: str, name: str) -> None:
    node = file_._get_node(path)
    attrs = node._v_attrs
    value = getattr(attrs, name)

    (shparent, shname) = file_._shadow_name()
    shattrs = shparent._v_attrs

    # Set the attribute only if it has not been kept in the shadow.
    # This avoids re-pickling complex attributes on REDO.
    if shname not in shattrs:
        shattrs._g__setattr(shname, value)

    attrs._g__delattr(name)


def attr_from_shadow(file_: "File", path: str, name: str) -> None:
    (shparent, shname) = file_._shadow_name()
    shattrs = shparent._v_attrs
    value = getattr(shattrs, shname)

    node = file_._get_node(path)
    node._v_attrs._g__setattr(name, value)

    # Keeping the attribute in the shadow allows reusing it on Undo/Redo.
    # shattrs._g__delattr(shname)


def undo_add_attr(file_: "File", path: str, name: str) -> None:
    attr_to_shadow(file_, path, name)


def redo_add_attr(file_: "File", path: str, name: str) -> None:
    attr_from_shadow(file_, path, name)


def undo_del_attr(file_: "File", path: str, name: str) -> None:
    attr_from_shadow(file_, path, name)


def redo_del_attr(file_: "File", path: str, name: str) -> None:
    attr_to_shadow(file_, path, name)