o
    poi                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ dededdfddZ			
d#dededededededefddZdedee fddZdedede
e defddZ		d$dededeeee f d ee deddfd!d"ZdS )%    N)Iterable)OptionalUnionpath_inpath_outreturnc                 C   s   t | }| }W d   n1 sw   Y  d}t|D ]*\}}|dr5|dd dd  }q|drH|dd| d	}|||< qt |d
}|| W d   dS 1 s_w   Y  dS )zAdjust changelog titles so not to be duplicated.

    Args:
        path_in: input MD file
        path_out: output also MD file

    N z##    -r   z### z###z -w)open	readlines	enumerate
startswithsplitstripreplace
writelines)r   r   fpchlog_lines	chlog_veriln r   W/home/ubuntu/.local/lib/python3.10/site-packages/lightning_utilities/docs/formatting.py_transform_changelog   s   



"r   masterrelease/stabledomaininfogithub_usergithub_repomain_branchstable_branchc           	         s   dt tttf f fdd}| dks d sdS zd|  }W n ty3    d dd	d
 }Y nw |d	d }|d||}d	|g|d	dd  }d| d	| d| S )Nr   c                     s   t jd  } d dD ]}t| |} qtt|  t fdddD r?tj	
tj	ddd}ttj	j |d n d	tj	j tj	
dd  t| \}} ||t| d
 fS )Nmodulefullname.c                 3   s    | ]}| v V  qd S )Nr   ).0sfnamer   r   	<genexpr>5   s    z9_linkcode_resolve.<locals>.find_source.<locals>.<genexpr>)readthedocsrtfd	checkoutsz..)start/   )sysmodulesr   getattrstrinspectgetsourcefileanyospathabspathjoinrelpathgetsourcelineslen)objpartpath_topsource
line_startr   r"   r)   r   find_source-   s   "z&_linkcode_resolve.<locals>.find_sourcepyr$   r   z
%s#L%d-L%dr&   r0   .pyr   )lateststabler1   zhttps://github.com/z/blob/)tupler5   int	Exceptionr   r   getr<   )	r   r   r    r!   r"   r#   rF   filenamebranchr   rE   r   _linkcode_resolve%   s   rQ   package_namec                 C   sX   ddl m} ddl}d|  d}|j|dd }|d  }d	d
 |D }t||dS )zLoad the versions of the package from PyPI.

    >>> _load_pypi_versions("numpy")  # doctest: +ELLIPSIS
    ['0.9.6', '0.9.8', '1.0', ...]
    >>> _load_pypi_versions("scikit-learn")  # doctest: +ELLIPSIS
    ['0.9', '0.10', '0.11', '0.12', ...]

    r   )LooseVersionNzhttps://pypi.org/pypi/z/json
   )timeoutreleasesc                 S   s   h | ]
}t d |r|qS )z^\d+(\.\d+)*$)rematch)r'   kr   r   r   	<setcomp>a   s    z&_load_pypi_versions.<locals>.<setcomp>)key)distutils.versionrS   requestsrN   jsonkeyssorted)rR   rS   r]   urldataversionsr   r   r   _load_pypi_versionsP   s   	rd   linkpkg_verversion_digitsc              
   C   s   | d}z
t|d d }W n ty+   td|dd }t||d }Y nw | dd }d| dd| }| d| d|S )a2  Adjust the linked external docs to be local.

    Args:
        link: the source link to be replaced
        pkg_ver: the target link to be replaced, if ``{package.version}`` is included it will be replaced accordingly
        version_digits: for semantic versioning, how many digits to be considered

    r&   r   N+{})r   rd   rM   	importlibimport_moduler<   r4   r   )re   rf   rg   pkg_attverr$   r   r   r   #_update_link_based_imported_packagee   s   
	rp   z.rstrH   r	   source_linktarget_linkbrowse_folderfile_extensionsc              
   C   s  g }t |tr
|g}|D ]}|D ]}|tjtj|dd| dd7 }qq|s6td| d| d dS t	d	|}|D ]}	t
||	|}q>t|D ]y}
t|
d
d}| }W d   n1 sbw   Y  d\}}t|D ]&\}}tj d|v r}d}|s| |v r|| |||< d}|rd|v rd}qo|sqKtd|
 d|  d| d t|
dd
d}|| W d   n1 sw   Y  qKdS )a|  Adjust the linked external docs to be local.

    Args:
        source_link: the link to be replaced
        target_link: the link to be replaced, if ``{package.version}`` is included it will be replaced accordingly
        browse_folder: the location of the browsable folder
        file_extensions: what kind of files shall be scanned
        version_digits: for semantic versioning, how many digits to be considered

    Examples:
        >>> adjust_linked_external_docs(
        ...     "https://numpy.org/doc/stable/",
        ...     "https://numpy.org/doc/{numpy.__version__}/",
        ...     "docs/source",
        ... )

    z***T)	recursivez No files were listed in folder "z" and pattern ""Nz{(.+)}zUTF-8)encoding)FF()Fzlinks adjusting in z: "z" -> "r   )
isinstancer5   globr9   r:   r<   loggingwarningrW   findallrp   setr   r   r   adjust_linked_external_docs__name__r   debugr   )rr   rs   rt   ru   rg   
list_filesfolderextpkg_ver_allrf   fpathfopenlinesfoundskipr   r   fwr   r   r   r   ~   sF   
&
r   )r   r   )rq   r	   )r}   rl   r6   r~   r9   rW   r2   collections.abcr   typingr   r   r5   r   dictrQ   listrd   rL   rp   r   r   r   r   r   <module>   sX   
+