Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
evil.py 2.20 KiB
# -*- coding: utf-8 -*-


def ccall(func, pass_name=False):
    """
    def arguments(): pass
    res = func(False, None, 3, key="word", arguments=arguments)``
    # becomes
    class res(ccall(func), False, None, 3):
        key = "word"
        def arguments(): pass
    """

    class metaclass(type):
        def __new__(cls, name, a, d):
            d.pop("__module__", 0)
            if pass_name:
                d["__name__"] = name
            return func(*a[1:], **d)

        def __call__(*a, **d):
            return func(*a, **d)

    return type.__new__(metaclass, func.__name__, (), {})


def pin(loc, *skip):
    """
    def __init__(self, will, *have, **all):
        def the(): pass
        variables = 1
        del but
        pin(locals())
        these = 2
    """
    loc = dict(loc)
    loc.pop("self").__dict__.update(
        {
            k: v
            for k, v in loc.items()
            if not any(
                s is k or s is True and k.startswith("_") or s is v and isinstance(s, object)
                for s in skip
            )
        }
    )


def rebase(obj, want, dont=(), name=None, ns=None):
    if isinstance(obj, type):
        cls = obj
        obj = None
    else:
        assert obj is not None
        cls = type(obj)

    if not isinstance(want, (list, tuple)):
        want = (want,)
    if not isinstance(dont, (list, tuple)):
        dont = (dont,)
    assert want or dont

    want = tuple(w for w in want if w not in cls.__bases__)

    if name is None:
        name = cls.__name__
        for d in dont:
            name = name.replace(d.__name__, "", 1)
        for w in want:
            if w.__name__ not in name:
                name += w.__name__

    bases = []
    for base in cls.__bases__:
        if issubclass(base, dont):
            bases.extend(want)
            want = ()
        else:
            bases.append(base)
    if want:
        bases.extend(want)
    bases = tuple(bases)

    if cls.__bases__ != bases:
        if ns is None:
            ns = dict(cls.__dict__)
            ns.pop("__module__", 1)
        if obj is None:
            cls = type(name, bases, ns)
        else:
            obj.__class__ = type(name, bases, ns)

    return cls if obj is None else obj