o
    3g                     @  s   d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZ d*ddZ	d+d,ddZd-ddZedZG dd  d ee Zd.d"d#Zd.d$d%Zd.d&d'Zd.d(d)ZdS )/z
Contains various backwards compatibility/deprecation helpers relevant to HPI itself.
(as opposed to .compat module which implements compatibility between python versions)
    )annotationsN)IteratorSequence)
ModuleType)TypeVar   )warningsparent_module_namestrlegacy_submodule_nameparent_module_path	list[str]returnboolc                 C  s   ddl m} ||| |d d < |dd  |d d  |d d < d}d}t D ](}t|j}|jd| kr9d}d|j	p?g }t
d|  d	| |rOd}q'd
tjv }	|pX| }
|
rp|	sptd|  d|  d| d|  d	 |
S )Nr   )extend_pathr   FparentT
zfrom\s+z\s+import\s+_HPI_COMPLETEz
importing z% is DEPRECATED! Instead, import from .z or za.all See https://github.com/karlicoss/HPI/blob/master/doc/MODULE_DESIGN.org#allpy for more info.
)pkgutilr   inspectstackgetargvaluesframelocalsgetjoincode_contextrematchosenvironr   high)r	   r   r   r   imported_as_parentimporting_submodulefargslineautocompleting_module_cliis_legacy_import r*   ,/home/garg/my-data/HPI/my/core/hpi_compat.pyhandle_legacy_import   s8    

r,   r*   nameeModuleNotFoundErrorrequiresSequence[str]r   c                 C  sd   |j | kr|zt|| }tjdd| d dd W n ty)   d}Y nw |du r0||S )z4
    https://github.com/karlicoss/HPI/issues/79
    zd
Specifying modules' dependencies in the config or in my/config/repos is deprecated!
Please install  z> as PIP packages (see the corresponding README instructions).
   )
stacklevelN)r-   _get_dalr   r"   r   stripr/   )r-   r.   cfgr0   dalr*   r*   r+   pre_pip_dal_handlerJ   s"   
	

r9   module_namec                 C  sF   t | |d }|d urddlm} ||dS ddlm} |d| dS )Nr   )
import_dirz.dalr   )import_modulezmy.config.repos.)getattrutils.importsr;   	importlibr<   )r7   r:   mpathr;   r<   r*   r*   r+   r5   i   s   
r5   Vc                   @  sX   e Zd ZdZdddZddd	ZdddZdd ZedddZ	dddZ
dddZdS )always_supports_sequencezo
    Helper to make migration from Sequence/List to Iterable/Iterator type backwards compatible in runtime
    itIterator[V]r   Nonec                 C  s   || _ d | _d | _d S N)_it_list_lit)selfrC   r*   r*   r+   __init__~   s   
z!always_supports_sequence.__init__c                 C  s   | j d urt| j | _| S rF   )rH   iterrI   rJ   r*   r*   r+   __iter__   s   
z!always_supports_sequence.__iter__rA   c                 C  s4   | j d ur| jd usJ | j}t|S | j}t|S rF   )rH   rI   rG   next)rJ   delegater*   r*   r+   __next__   s   
z!always_supports_sequence.__next__c                 C  s   t | j|S rF   )r=   rG   )rJ   r-   r*   r*   r+   __getattr__   s   z$always_supports_sequence.__getattr__list[V]c                 C  sH   | j d u r!t| jdd}td| d t| j| _ t| j | _| j S )N__qualname__z<no qualname>zUsing zR as list is deprecated. Migrate to iterative processing or call list() explicitly.)rH   r=   rG   r   mediumlistrL   rI   )rJ   qualnamer*   r*   r+   _aslist   s   
z always_supports_sequence._aslistintc                 C  s
   t | jS rF   )lenrX   rM   r*   r*   r+   __len__      
z always_supports_sequence.__len__ic                 C  s
   | j | S rF   )rX   )rJ   r]   r*   r*   r+   __getitem__   r\   z$always_supports_sequence.__getitem__N)rC   rD   r   rE   )r   rD   )r   rA   )r   rS   )r   rY   )r]   rY   r   rA   )__name__
__module__rT   __doc__rK   rN   rQ   rR   propertyrX   r[   r^   r*   r*   r*   r+   rB   y   s    



rB   rE   c                    sh   d d fdd} t |  }t|}|g dksJ  dks J t|}|g dks,J  dks2J d S )	Nr   r   Iterator[str]c                   3      g dE d H   d7  d S Nabcr   r*   r*   	exhaustedr*   r+   rC         z:test_always_supports_sequence_list_constructor.<locals>.itrf   r   r   rc   )rB   rV   )rC   sitresr*   rj   r+   .test_always_supports_sequence_list_constructor   s   
rp   c                    s   d d fdd} t |  }t|dksJ  dksJ |d d	ks$J |d d
ks,J |d dks4J  dks:J t|g dksDJ dd |D g dksQJ t|g dks[J dd |D g dkshJ  dksnJ d S )Nr   r   rc   c                   3  rd   re   r*   r*   rj   r*   r+   rC      rl   z2test_always_supports_sequence_indexing.<locals>.it   r   r3   ri   rh   rg   rf   c                 S     g | ]}|qS r*   r*   .0xr*   r*   r+   
<listcomp>       z:test_always_supports_sequence_indexing.<locals>.<listcomp>c                 S  rr   r*   r*   rs   r*   r*   r+   rv      rw   rm   )rB   rZ   rV   )rC   rn   r*   rj   r+   &test_always_supports_sequence_indexing   s   
rx   c                    s`   d d fdd} t |  }t|}|dksJ  dksJ t|}|dks(J  dks.J d S )	Nr   r   rc   c                   3  rd   re   r*   r*   rj   r*   r+   rC      rl   z.test_always_supports_sequence_next.<locals>.itrg   rh   rm   )rB   rO   )rC   rn   ru   r*   rj   r+   "test_always_supports_sequence_next   s   
ry   c                    s   d d
 fdd} t |  }|D ]}|dksJ  t|}|dks#J  dks)J t|}|dks3J  dks9J |D ]}t d	ksEJ d S )Nr   r   rc   c                   3  rd   re   r*   r*   rj   r*   r+   rC      rl   z.test_always_supports_sequence_iter.<locals>.itrg   rh   ri   r   rm   )rB   rO   RuntimeError)rC   rn   ru   _r*   rj   r+   "test_always_supports_sequence_iter   s   
r|   )r	   r
   r   r
   r   r   r   r   )r*   )r-   r
   r.   r/   r0   r1   r   r   )r:   r
   )r   rE   )ra   
__future__r   r   r    r   collections.abcr   r   typesr   typingr    r   r,   r9   r5   rA   rB   rp   rx   ry   r|   r*   r*   r*   r+   <module>   s&    
<

-

