o
    [h                     @   sJ   d Z ddlmZ ddlmZ G dd deZddd	ZG d
d deZdS )zeLegacy routines to resolve circular module imports at runtime.

These routines are replaced in 1.4.

    )update_wrapper   )compatc                   @   s"   e Zd ZdZdddZdd ZdS )_memoized_propertyzivendored version of langhelpers.memoized_property.

    not needed in the 1.4 version of preloaded.

    Nc                 C   s   || _ |p|j| _|j| _d S N)fget__doc____name__)selfr   doc r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/sqlalchemy/util/_preloaded.py__init__   s   z_memoized_property.__init__c                 C   s&   |d u r| S |  | |j| j< }|S r   )r   __dict__r	   )r
   objclsresultr   r   r   __get__   s   z_memoized_property.__get__r   )r	   
__module____qualname__r   r   r   r   r   r   r   r      s    
r   Tc           
      C   s0  t | rt | }n| }t j| }|d r|d d }n|d r(d|d  }nd}t |d |d |d d|d }d}|d rI|t|d 7 }|d rU|t|d 7 }|d |d  }|rh|d| d }nd}t j||d |d |d	d
 d}	|rt||||	dS t|dd ||dd |	dd dS )zlvendored version of langhelpers._format_argspec_plus.

    not needed in the 1.4 version of preloaded.

    r   r   z%s[0]N         r   c                 S   s   d|  S )N=r   )xr   r   r   <lambda>M   s    z&_format_argspec_plus.<locals>.<lambda>)formatvalue)argsself_arg	apply_posapply_kw)r   callableinspect_getfullargspecZinspect_formatargspeclendict)
fngroupedspecr   r   r   num_defaultsZ	name_argsZdefaulted_valsr    r   r   r   _format_argspec_plus&   sR   




r*   c                   @   sF   e Zd ZdZdd Zdd Zedd Ze Z	i Z
G dd	 d	eZd
S )dependenciesa  Apply imported dependencies as arguments to a function.

    E.g.::

        @util.dependencies(
            "sqlalchemy.sql.widget",
            "sqlalchemy.engine.default"
        );
        def some_func(self, widget, default, arg1, arg2, **kw):
            # ...

    Rationale is so that the impact of a dependency cycle can be
    associated directly with the few functions that cause the cycle,
    and not pollute the module-level namespace.

    c              
   G   sD   g | _ |D ]}|d}| j td|dd |d  qd S )N.r   r!   )import_depssplitappendr+   _importlaterjoin)r
   depsdeptokensr   r   r   r   q   s   
zdependencies.__init__c                 C   s   | j }t|}t|d }|d dv }tt|D ]}d| |d ||r'dnd < qt|dd}|D ]	}||r:dnd= q3||d d d < t|dd}	d|	d |d	 d
 }
t|
t }t	|d|j
|_
t||S )Nr   )r
   r   zimport_deps[%r]r   F)r'   z!lambda %(args)s: fn(%(apply_kw)s)r   r    )r   r    Zim_func)r-   r   r#   listranger$   r*   evallocalsgetattr__defaults__r   )r
   r&   r-   r(   Z	spec_zeroZhasselfiZ
inner_specZimpnameZ
outer_speccodeZ	decoratedr   r   r   __call__y   s$   

zdependencies.__call__c                 C   s(   t tjD ]}|j|r|  qd S r   )r5   r+   _unresolved
_full_path
startswith_resolve)r   pathmr   r   r   resolve_all   s
   zdependencies.resolve_allc                   @   sN   e Zd Ze Zi Zdd Zdd Zedd Z	e
dd Zd	d
 Zdd ZdS )zdependencies._importlaterc                 C   s8   |d | }|t jv rt j| S t|  t j|< }|S Nr,   )r+   _by_keyobject__new__)r   rB   addtlkeyimpr   r   r   rH      s
   

z!dependencies._importlater.__new__c                 C   s   || _ || _tj|  d S r   )_il_path	_il_addtlr+   r>   add)r
   rB   rI   r   r   r   r      s   z"dependencies._importlater.__init__c                 C   s   | j d | j S rE   )rL   rM   r
   r   r   r   r?      s   z$dependencies._importlater._full_pathc                 C   s,   | t jv rtd| j| jf t| j| jS )Nz<importlater.resolve_all() hasn't been called (this is %s %s))r+   r>   ImportErrorrL   rM   r9   _initial_importrO   r   r   r   module   s   

z dependencies._importlater.modulec                 C   s,   t j|  t| jt t | jg| _	d S r   )
r+   r>   discardr   import_rL   globalsr8   rM   rQ   rO   r   r   r   rA      s   
z"dependencies._importlater._resolvec                 C   sV   |dkrt d| j zt| j|}W n ty#   td| j|f w || j|< |S )NrR   zCould not resolve module %szModule %s has no attribute '%s')rP   r?   r9   rR   AttributeErrorr   )r
   rJ   attrr   r   r   __getattr__   s   
z%dependencies._importlater.__getattr__N)r	   r   r   setr>   rF   rH   r   propertyr?   r   rR   rA   rX   r   r   r   r   r0      s    


r0   N)r	   r   r   r   r   r=   classmethodrD   rY   r>   rF   rG   r0   r   r   r   r   r+   _   s    
r+   N)T)	r   	functoolsr    r   rG   r   r*   r+   r   r   r   r   <module>   s   
9