o
    i3                     @   st  U d dl Z d dlmZ d dlmZ d dlZd dlZd dlmZ d dl	Z	d dl
Z
d dlmZ d dlZd dlmZ d dlmZ d dlmZ eeZed	d
efdefgZdaejejeeje f  e d< edejeef fddZ!dejee"e f fddZ#edddedeje$eef  fddZ%eddd
edefddZ&dededefddZ'da(eje) e d< g a*eje e d< de"e fdd Z+d!edefd"d#Z,edeje-eef  fd$d%Z.ede/fd&d'Z0ed(dd)ej1eef deje fd*d+Z2ed,dd-edeje fd.d/Z3ee
4d05 Z6ee
4d15 Z7ee
4d25 Z8ee
4d35 Z9ed,dd!ede:fd4d5Z;ed,dd!ede:fd6d7Z<ede:fd8d9Z=e=j>d!ede:fd:d;Z?e=>eeddd!ede:fd<d;Z?ed,dd
ede:fd=d>Z@dejee"e f fd?d@ZAdAdB ZBdeje fdCdDZCdefdEdFZDdGdH ZEeeFffdIdJZGdS )K    N)	lru_cache)singledispatch)Path)
ModuleType)origin)config)callonceDistributionnameversion_PACKAGE_DISTRIBUTIONSreturnc                  C   sL   ddl m}  i }|  D ]}|j}|d }|d }|r#|r#||| < q|S )z\returns the mapping from distribution name to version for all distributions in a python pathr   Nr
   r   )importlib.metadatametadatadistributionslower)importlib_metadatapkgsdistr   r
   r    r   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/packages.pyget_distributions   s   r   c                  C   s4   t du rddlm}  t| dr|  a t S t a t S )zCa mapping of importable package names to their distribution name(s)Nr   packages_distributions)r   r   r   hasattrr   _packages_distributions)r   r   r   r   get_package_distributions+   s   
r   i   )maxsizemodule_namec                 C   s   | sd S g }t  }t }|g kr8|| }|r| |fS || g }|s4| d}|dkr3| d | } nn|g kst|dkr@d S |d t|d fS )N.r      )r   r   getrfindlenget_version_for_package)r   namesr   dist_mapr   pr   r   r    get_module_distribution_versions9   s&   

r'   c                 C   s.   ddl m} z|| W S  ty   Y dS w )z returns the version of a packager   N )r   r   r   	Exceptionr
   r   r   r   r   r#   U   s   r#   rel_pathparentc                 C   s>   | j d }|| }| r|d  r|S d| j d d S )Nr   __init__.py/   )partsis_direxistsjoin)r+   r,   baserootr   r   r   _effective_root`   s   
,r6   _SYS_PATH_HASH_RESOLVED_SYS_PATHc                  C   s.   t ttj } tkr| add tjD atS )Nc                 S   s   g | ]}t | qS r   )r   resolve).0_r   r   r   
<listcomp>p   s    z$resolve_sys_path.<locals>.<listcomp>)hashtuplesyspathr7   r8   )hr   r   r   resolve_sys_pathk   s   rB   r@   c              	   C   s   t tfD ]}zt|  ||W   S  ty   Y qw d  }}t D ]%}z| |}|d u s:t|jt|jk r?||}}W q$ tyI   Y q$w |d urbz
t|t	
t|W S  tya   Y nw | jD ]}|jjdkrr|j  S qed|  }t|)Nzsite-packagesz$Could not find root module for path )purelib_pathplatlib_pathr6   r9   relative_to
ValueErrorrB   r"   parentstcastr   
IndexErrorr,   r
   )r@   parent_pathmin_relative_pathmax_parent_pathrelativesmsgr   r   r   _root_moduleu   s8   





rQ   c            	         s   dd l m}  i  d| jf fdd}zNi }|  D ]D}|j }s!q|j}t|d |d d}|D ],}|jd }|dsE|d	sE|d
krFq0||rTd|jd d }||vr\|||< q0q|W S  t	yq   t
jddd Y d S w )Nr   fc                    s   | j d }z | W S  ty   Y nw t| j dk r!d |< dS tt|  }|jt| j d  }| rC|d 	 sCd |< dS d |< dS )Nr   r/   Fr-   T)
r0   KeyErrorr"   rH   rI   r   locaterG   r1   r2   )rR   r5   	located_fr,   
namespacesr   r   is_namespace   s    

z6_package_for_root_module_mapping.<locals>.is_namespacer
   r   )r
   r   z
.dist-infoz	.egg-infoz..r.   r/   ziUnable to build package file mapping, please report this to https://github.com/DataDog/dd-trace-py/issuesT)exc_info)r   r   PackagePathr   filesr	   r0   endswithr3   r)   LOGwarning)	r   rX   mappingr   r[   r   drR   r5   r   rV   r    _package_for_root_module_mapping   s8   

	ra   c                  C   s@   ddl m}  ddlm} t| |ddd tjB tj	 S )Nr   )
decompress)read_binaryzddtrace.internalzthird-party.tar.gzzutf-8)
gziprb   importlib.resourcesrc   setdecode
splitlines	tp_configincludesexcludes)rb   rc   r   r   r   _third_party_packages   s   rl   i @  filenamec              	   C   s   t  }|d u r	d S z,t| trt| n| }t|}||v r"|| W S | D ]}|j|kr2|  W S q&W d S  ttfyA   Y d S w N)	ra   
isinstancestrr   rQ   valuesr
   rF   OSError)rm   r_   r@   root_module_pathdistributionr   r   r   filename_to_package   s    


ru      modulec                 C   s   t | }|durt|S dS )z-Returns the package distribution for a moduleN)r   ru   )rw   module_originr   r   r   module_to_package   s   ry   stdlib
platstdlibpurelibplatlibc                 C   sF   | }|  r
| r| }|ts|to"|tp!|t S rn   )is_absolute
is_symlinkr9   is_relative_tostdlib_pathplatstdlib_pathrC   rD   )r@   rpathr   r   r   	is_stdlib   s   r   c                 C   s    t | }|d u r
dS |jt v S )NF)ru   r
   rl   )r@   packager   r   r   is_third_party  s   r   c                 C   s   t dt|  )NzUnsupported type )NotImplementedErrortyper@   r   r   r   is_user_code     r   c                 C   s   t | pt|  S rn   )r   r   r   r   r   r   r;     r   r;   c                 C   s   t | }t|pt| S rn   )r   r   r   )r@   _pathr   r   r   r;     s   c                 C   s4   ddl m} z||  W dS  |jy   Y dS w )zDDetermine if a distribution is available in the current environment.r   NFT)r   r   rt   PackageNotFoundErrorr*   r   r   r   is_distribution_available&  s   r   c                  C   sV   ddl m}  tt}|  D ]}t|pt|D ]}|| |jd  qqt	|S )z
    Return a mapping of top-level packages to their
    distributions.
    >>> import collections.abc
    >>> pkgs = packages_distributions()
    >>> all(isinstance(dist, collections.abc.Sequence) for dist in pkgs.values())
    True
    r   NName)
r   r   collectionsdefaultdictlistr   _top_level_declared_top_level_inferredappenddict)r   pkg_to_distr   pkgr   r   r   r   8  s   	
r   c                 C   s   |  dpd S )Nztop_level.txtr(   )	read_textsplit)r   r   r   r   r   J  s   r   c                 C   s   | j ^}}|r	|S dS )zB
    Return the top-most parent as long as there is a parent.
    N)r0   )r
   toprestr   r   r   _topmostN  s   
r   c                 C   s   t | pt| pt| S )a  
    Infer a possibly importable module name from a name presumed on
    sys.path.
    >>> _get_toplevel_name(PackagePath('foo.py'))
    'foo'
    >>> _get_toplevel_name(PackagePath('foo'))
    'foo'
    >>> _get_toplevel_name(PackagePath('foo.pyc'))
    'foo'
    >>> _get_toplevel_name(PackagePath('foo/__init__.py'))
    'foo'
    >>> _get_toplevel_name(PackagePath('foo.pth'))
    'foo.pth'
    >>> _get_toplevel_name(PackagePath('foo.dist-info'))
    'foo.dist-info'
    )r   inspectgetmodulenamerp   r
   r   r   r   _get_toplevel_nameV  s   r   c                 C   s&   t ttt| j}dd }t||S )Nc                 S   s   d| vS )Nr   r   r   r   r   r   importable_namep  s   z,_top_level_inferred.<locals>.importable_name)rf   mapr   _always_iterabler[   filter)r   	opt_namesr   r   r   r   r   m  s   
r   c                 C   sT   | du rt dS |durt| |rt | fS zt | W S  ty)   t | f Y S w )am  If *obj* is iterable, return an iterator over its items::
        >>> obj = (1, 2, 3)
        >>> list(always_iterable(obj))
        [1, 2, 3]
    If *obj* is not iterable, return a one-item iterable containing *obj*::
        >>> obj = 1
        >>> list(always_iterable(obj))
        [1]
    If *obj* is ``None``, return an empty iterable:
        >>> obj = None
        >>> list(always_iterable(None))
        []
    By default, binary and text strings are not considered iterable::
        >>> obj = 'foo'
        >>> list(always_iterable(obj))
        ['foo']
    If *base_type* is set, objects for which ``isinstance(obj, base_type)``
    returns ``True`` won't be considered iterable.
        >>> obj = {'a': 1}
        >>> list(always_iterable(obj))  # Iterate over the dict's keys
        ['a']
        >>> list(always_iterable(obj, base_type=dict))  # Treat dicts as a unit
        [{'a': 1}]
    Set *base_type* to ``None`` to avoid any special handling and treat objects
    Python considers iterable as iterable:
        >>> obj = 'foo'
        >>> list(always_iterable(obj, base_type=None))
        ['f', 'o', 'o']
    Nr   )iterro   	TypeError)obj	base_typer   r   r   r   w  s   

r   )Hr   	functoolsr   cachedr   r   loggingpathlibr   r?   	sysconfigtypesr   typingrH   ddtrace.internal.moduler   %ddtrace.internal.settings.third_partyr   ri   ddtrace.internal.utils.cacher   	getLogger__name__r]   
NamedTuplerp   r	   r   OptionalMappingList__annotations__r   r   r   r>   r'   r#   r6   r7   intr8   rB   rQ   r   ra   rf   rl   Unionru   ry   get_pathr9   r   r   rC   rD   boolr   r   r   registerr;   r   r   r   r   r   r   bytesr   r   r   r   r   <module>   sv   
 
""

&4
$

