o
    ChtJ                     @   s@  U d dl mZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZmZmZ d dlmZmZ dd	lmZmZ dd
lmZmZmZmZ ddlmZ ddlm Z  ddl!m"Z" dZ#dZ$dZ%dZ&i a'ee(e"f e)d< dee(e"f fddZ*de(de"ddfddZ+de(ddfddZ,eddd	dCd e-d!e(de-fd"d#Z.de/fd$d%Z0		 	dDd e-d&e/d'ee dee(e"f fd(d)Z1G d*d+ d+eZ2G d,d- d-e2Z3G d.d/ d/e2Z4dddde3fd0ee(ef d e-d1e-d2e-d3e-d'ee deeee( e/ef eddef f fd4d5Z5					dEd0ee(ef d e-d1e-d2e-d3e-d'ee dee( fd6d7Z6						dFd0ee(ef d e-d8e-d1e-d2e-d3e-d'ee deee(e f  fd9d:Z7					dEd0ee(ef d e-d1e-d2e-d3e-d'ee deed; ee(e(e(f f fd<d=Z8			dGd>ee(ef d2e-d3e-d'ee de-f
d?d@Z9dHde(ddfdAdBZ:dS )I    )unicode_literalsN)open)	lru_cache)isabs)DictListOptionalTupleTypeUnion)SplitResulturlsplit   )BaseTLDSourceParserRegistry)	TldBadUrlTldDomainNotFoundTldImproperlyConfigured
TldIOError)project_dir)Result)TriezArtur Barseghyanz2013-2025 Artur Barseghyanz,MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later)BaseMozillaTLDSourceParserget_fldget_tldget_tld_namesget_tld_names_containeris_tldMozillaTLDSourceParser MozillaPublicOnlyTLDSourceParser	parse_tldpop_tld_names_containerprocess_urlreset_tld_namesr   	tld_namesupdate_tld_namesupdate_tld_names_cliupdate_tld_names_containerr$   returnc                   C   s   t S )zCGet container of all tld names.

    :return:
    :rtype dict:
    r$    r*   r*   J/home/air/segue/gemini/back/venv/lib/python3.10/site-packages/tld/utils.pyr   3   s   r   tld_names_local_pathtrie_objc                 C   s   |t | < dS )ziUpdate TLD Names container item.

    :param tld_names_local_path:
    :param trie_obj:
    :return:
    Nr)   )r,   r-   r*   r*   r+   r'   =   s   r'   c                 C   s   t | d dS )zTRemove TLD names container item.

    :param tld_names_local_path:
    :return:
    N)r$   popr,   r*   r*   r+   r!   K   s   r!      T)maxsizetypedFfail_silently
parser_uidc                 C   sp   g }|j }|rt|d}|r|jr||j| d t|S t D ]\}}|r3|jr3||j| d q"t|S )zUUpdate TLD names.

    :param fail_silently:
    :param parser_uid:
    :return:
    Nr3   )appendr   get
source_urlr%   itemsall)r3   r4   resultsresults_append
parser_clsr*   r*   r+   r%   U   s    





r%   c                  C   sd   t jdd} | jddddd | jdd	d
ddd | tjdd }|j}|j}tt	||d S )zCLI wrapper for update_tld_names.

    Since update_tld_names returns True on success, we need to negate the
    result to match CLI semantics.
    zUpdate TLD names)descriptionr4   ?Nz*UID of the parser to update TLD names for.)nargsdefaulthelpz--fail-silentlyr3   F
store_truezFail silently)destrA   actionrB   r   )r4   r3   )
argparseArgumentParseradd_argument
parse_argssysargvr4   r3   intr%   )parserargsr4   r3   r*   r*   r+   r&   q   s(   r&   retry_countparser_classc                 C   s   |st }|j| |dS )a  Build the ``tlds`` list if empty. Recursive.

    :param fail_silently: If set to True, no exceptions are raised and None
        is returned on failure.
    :param retry_count: If greater than 1, we raise an exception in order
        to avoid infinite loops.
    :param parser_class:
    :type fail_silently: bool
    :type retry_count: int
    :type parser_class: BaseTLDSourceParser
    :return: List of TLD names
    :rtype: obj:`tld.utils.Trie`
    r3   rO   )r   r   )r3   rO   rP   r*   r*   r+   r      s
   r   c                   @   s6   e Zd Ze	d	dededeeee	f  fddZ
dS )
r   Fr   r3   rO   r(   c                 C   s  |dkr
|rdS t t}| j|v r|| j dur|S zzWt| jr%| j}nt| j}t|ddd}t }|j}d}| j}	|D ](}
d|
v rFd}|rL|	sL nd	|
v rV|
	 d }
|
d
 dv r]q>||

  |d q>t| j| |  W nQ ty   | j|d |d7 }| j||d Y W z|  W S  ty   Y S w  ty } z|rW Y d}~W z|  W dS  ty   Y dS w |d}~ww W z|  W |S  ty   Y |S w z|  W w  ty   Y w w )z[Parse.

        :param fail_silently:
        :param retry_count:
        :return:
        r   Nrutf8)encodingFz===BEGIN PRIVATE DOMAINS===Tz// xn--r   )/
)privater5   rQ   )r   r$   
local_pathr   r   codecs_openr   addinclude_privatesplitstripr'   closeIOErrorr%   r   	Exception)clsr3   rO   
_tld_namesrX   
local_filetrietrie_addprivate_sectionr[   lineerrr*   r*   r+   r      s   




	
z(BaseMozillaTLDSourceParser.get_tld_namesN)Fr   )__name__
__module____qualname__classmethodboolrL   r   r   strr   r   r*   r*   r*   r+   r      s    r   c                   @   s6   e Zd ZU dZdZeed< dZeed< dZeed< dS )	r   Mozilla TLD source.mozillauidz4https://publicsuffix.org/list/public_suffix_list.datr8   zres/effective_tld_names.dat.txtrX   N)	ri   rj   rk   __doc__rq   rn   __annotations__r8   rX   r*   r*   r*   r+   r      s
   
 r   c                   @   sB   e Zd ZU dZdZeed< dZeed< dZeed< dZ	e
ed	< d
S )r   ro   mozilla_public_onlyrq   z?https://publicsuffix.org/list/public_suffix_list.dat?publiconlyr8   z+res/effective_tld_names_public_only.dat.txtrX   Fr[   N)ri   rj   rk   rr   rq   rn   rs   r8   rX   r[   rm   r*   r*   r*   r+   r     s   
 
r   urlfix_protocolsearch_publicsearch_privatec              
   C   s  |s|st dt||d}t| tsA|r| dsd|  } zt| }W n ty@ } z|r:dd| fW  Y d}~S |d}~ww | }|j}	|	sT|rOdd|fS t| d|		 }	|	
drb|	d}	|	d}
|j}|| j}d}d}d}t|
}t|d	 d
d
D ]7}|
| }|jdu r n+||jkr n$|j|}|du r|jd}|du r n|d	7 }|}|jr|}|}q|du s|jr|s|jr|s|jr|rdd|fS t|	d||krd
}ntd	|| }|
||fS )zProcess URL.

    :param parser_class:
    :param url:
    :param fail_silently:
    :param fix_protocol:
    :param search_public:
    :param search_private:
    :return:
    zJEither `search_public` or `search_private` (or both) shall be set to True.)r3   rP   )z//zhttp://https://ry   N)ru   .r   r   *)domain_name)r   r   
isinstancer   
startswithr   
ValueErrorhostnamer   lowerendswithrstripr\   rX   rootlenrangechildren	exceptionr7   leafrW   r   max)ru   r3   rv   rw   rx   rP   rb   
parsed_urler}   domain_partsr,   nodecurrent_length
tld_lengthmatchlen_domain_partsipartchild
non_zero_ir*   r*   r+   r"     s   












r"   c           
      K   sv   d|v rt d|s|rtnt}t| |||||d\}}}	|du r#dS |dus)J |dk r0|	jS d||d d S )a?  Extract the first level domain.

    Extract the top level domain based on the mozilla's effective TLD names
    dat file. Returns a string. May throw ``TldBadUrl`` or
    ``TldDomainNotFound`` exceptions if there's bad URL provided or no TLD
    match found respectively.

    :param url: URL to get top level domain from.
    :param fail_silently: If set to True, no exceptions are raised and None
        is returned on failure.
    :param fix_protocol: If set to True, missing or wrong protocol is
        ignored (https is appended instead).
    :param search_public: If set to True, search in public domains.
    :param search_private: If set to True, search in private domains.
    :param parser_class:
    :type url: str | SplitResult
    :type fail_silently: bool
    :type fix_protocol: bool
    :type search_public: bool
    :type search_private: bool
    :return: String with top level domain (if ``as_object`` argument
        is set to False) or a ``tld.utils.Result`` object (if ``as_object``
        argument is set to True); returns None on failure.
    :rtype: str
    	as_objectzH`as_object` argument is deprecated for `get_fld`. Use `get_tld` instead.ru   r3   rv   rw   rx   rP   Nr   rz   r   )r   r   r   r"   r   join)
ru   r3   rv   rw   rx   rP   kwargsr   r   r   r*   r*   r+   r     s.   "	r   r   c                 C   s   |s|rt nt}t| |||||d\}}}	|du rdS |dus!J |s3|dk r*|	jS d||d S |dk rHd}
d}|	jdusDJ d|	j}nd|d|d  }
d||d | }d||d }t|
|||	dS )	a  Extract the top level domain.

    Extract the top level domain based on the mozilla's effective TLD names
    dat file. Returns a string. May throw ``TldBadUrl`` or
    ``TldDomainNotFound`` exceptions if there's bad URL provided or no TLD
    match found respectively.

    :param url: URL to get top level domain from.
    :param fail_silently: If set to True, no exceptions are raised and None
        is returned on failure.
    :param as_object: If set to True, ``tld.utils.Result`` object is returned,
        ``domain``, ``suffix`` and ``tld`` properties.
    :param fix_protocol: If set to True, missing or wrong protocol is
        ignored (https is appended instead).
    :param search_public: If set to True, search in public domains.
    :param search_private: If set to True, search in private domains.
    :param parser_class:
    :type url: str | SplitResult
    :type fail_silently: bool
    :type as_object: bool
    :type fix_protocol: bool
    :type search_public: bool
    :type search_private: bool
    :return: String with top level domain (if ``as_object`` argument
        is set to False) or a ``tld.utils.Result`` object (if ``as_object``
        argument is set to True); returns None on failure.
    :rtype: str
    r   Nr   rz    zNo hostname in URLr   )	subdomaindomaintldr   )r   r   r"   r   r   r   )ru   r3   r   rv   rw   rx   rP   r   r   r   r   r   _tldr*   r*   r+   r     s>   %	r   NNNc                 C   sd   |s|rt nt}zt| |d||||d}|du rW dS |j|j|jfW S  tttt	fy1   Y dS w )zParse TLD into parts.

    :param url:
    :param fail_silently:
    :param fix_protocol:
    :param search_public:
    :param search_private:
    :param parser_class:
    :return: Tuple (tld, domain, subdomain)
    :rtype: tuple
    T)r3   r   rv   rw   rx   rP   Nr   )
r   r   r   r   r   r   r   r   r   r   )ru   r3   rv   rw   rx   rP   objr*   r*   r+   r    &  s,   	r    valuec                 C   s,   |s|rt nt}t| dd|||d}| |kS )ag  Check if given URL is tld.

    :param value: URL to get top level domain from.
    :param search_public: If set to True, search in public domains.
    :param search_private: If set to True, search in private domains.
    :param parser_class:
    :type value: str
    :type search_public: bool
    :type search_private: bool
    :return:
    :rtype: bool
    Tr   )r   r   r   )r   rw   rx   rP   r   r*   r*   r+   r   U  s   r   c                 C   s   | rt |  dS i adS )zReset the ``tld_names`` to empty value.

    If ``tld_names_local_path`` is given, removes specified
    entry from ``tld_names`` instead.

    :param tld_names_local_path:
    :type tld_names_local_path: str
    :return:
    N)r!   r$   r/   r*   r*   r+   r#   y  s   r#   )FN)Fr   N)FFTTN)FFFTTN)TTN)N);
__future__r   rF   rJ   codecsr   rY   	functoolsr   os.pathr   typingr   r   r   r	   r
   r   urllib.parser   r   baser   r   
exceptionsr   r   r   r   helpersr   resultr   rd   r   
__author____copyright____license____all__r$   rn   rs   r   r'   r!   rm   r%   rL   r&   r   r   r   r   r"   r   r   r    r   r#   r*   r*   r*   r+   <module>   s,    





S
"
x

G

V

1

$