a
    Døg  ã                   @   sj   d dl mZ d dlmZ d dlmZ i Zddd„ZG dd„ deƒZdd d	œd
d„Z	da
dd„ Zdd„ ZdS )é    )ÚContextDecorator)Ú
itemgetter)Úget_app_submodulesNc                    s@   |du r‡ ‡fdd„}|S ˆ t vr*g t ˆ < t ˆ   |ˆf¡ dS )a  
    Register hook for ``hook_name``. Can be used as a decorator::

        @register('hook_name')
        def my_hook(...):
            pass

    or as a function call::

        def my_hook(...):
            pass
        register('hook_name', my_hook)
    Nc                    s   t ˆ | ˆd | S )N©Úorder)Úregister)Úfn©Ú	hook_namer   © úL/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/hooks.pyÚ	decorator   s    zregister.<locals>.decorator)Ú_hooksÚappend)r
   r   r   r   r   r	   r   r   	   s    r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTemporaryHookc                 C   s   || _ || _d S ©N)Úhooksr   )Úselfr   r   r   r   r   Ú__init__'   s    zTemporaryHook.__init__c                 C   s8   | j D ],\}}|tvrg t|< t|  || jf¡ qd S r   )r   r   r   r   )r   r
   r   r   r   r   Ú	__enter__+   s    zTemporaryHook.__enter__c                 C   s(   | j D ]\}}t|  || jf¡ qd S r   )r   r   Úremover   )r   Úexc_typeÚ	exc_valueÚ	tracebackr
   r   r   r   r   Ú__exit__1   s    zTemporaryHook.__exit__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   &   s   r   r   c                C   s,   t | tƒs|dur| |fg}n| }t||ƒS )a}  
    Register hook for ``hook_name`` temporarily. This is useful for testing hooks.

    Can be used as a decorator::

        def my_hook(...):
            pass

        class TestMyHook(Testcase):
            @hooks.register_temporarily('hook_name', my_hook)
            def test_my_hook(self):
                pass

    or as a context manager::

        def my_hook(...):
            pass

        with hooks.register_temporarily('hook_name', my_hook):
            # Hook is registered here

        # Hook is unregistered here

    To register multiple hooks at the same time, pass in a list of 2-tuples:

        def my_hook(...):
            pass

        def my_other_hook(...):
            pass

        with hooks.register_temporarily([
                ('hook_name', my_hook),
                ('hook_name', my_other_hook),
            ]):
            # Hooks are registered here
    N)Ú
isinstanceÚlistr   )Zhook_name_or_hooksr   r   r   r   r   r   Úregister_temporarily6   s    &r    Fc                   C   s   t sttdƒƒ da d S )NZwagtail_hooksT)Ú_searched_for_hooksr   r   r   r   r   r   Úsearch_for_hooksg   s    r"   c                 C   s0   t ƒ  t | g ¡}t|tdƒd}dd„ |D ƒS )z0Return the hooks function sorted by their order.é   )Úkeyc                 S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úhookr   r   r   Ú
<listcomp>s   ó    zget_hooks.<locals>.<listcomp>)r"   r   ÚgetÚsortedr   )r
   r   r   r   r   Ú	get_hooksn   s    r+   )Nr   )N)Ú
contextlibr   Úoperatorr   Zwagtail.utils.appsr   r   r   r   r    r!   r"   r+   r   r   r   r   Ú<module>   s   
.