
    .Phl                        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
mZmZmZmZmZmZ d dlmZ ej        dk    rd dlmZ nd dlmZ d dlmZ d dlmZ d d	lm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+m,Z, d dl-m.Z. d dl/m0Z0 dZ1dZ2dZ3dZ4dee5         dee5         fdZ6de j7        j        de5dej8        de5de9de5ded         dee5         de)fd Z:dej8        d!ee5         d"ee5e
f         d#e5de'f
d$Z;dej8        d!ee5         d%ee5e
f         d&ee&         de'f
d'Z<d(e5d)ee5         de5fd*Z= G d+ d,e          Z>d-e5de>fd.Z?d/e5dee5ee5         ee5         f         fd0Z@d1d2d3d-e5d#e5ded         de5de&f
d4ZAd5d6hd7d8ej8        d!ee5         d"ee5e
f         d9ee5         d:e5d;e5d#e5d<e	e5         de'fd=ZBdej8        d!ee5         d"ee5e
f         d#e5de'f
d>ZCd?ej8        dee5         fd@ZDd?ej8        d!ee5         d#e5de'fdAZEdS )B    N)partial)AbstractSetAnyDictListMappingOptionalSequenceTuple)	urldefrag)      )load)Requirement)canonicalize_name)Literal)get_in)encode_poetry_version)pypi_name_to_conda_name)
DependencyLockSpecificationPathDependencyPoetryMappedDependencySpecURLDependencyVCSDependencyVersionedDependency)conda_spec_to_versioned_dep)evaluate_markerz`{depname}` in file {filename} is part of the `{category}` extra but is not defined in [tool.poetry.dependencies]. Conda-Lock will treat it as part of the extra. Note that Poetry may have different behavior.z`{depname}` in file {filename} is part of the `{category}` extra but is not specified as optional. Conda-Lock will treat it as part of the extra. Note that Poetry may have different behavior.z`{depname}` in file {filename} is specified as optional but is not in any extra. Conda-Lock will treat it as part of the `main` category. Note that Poetry may have different behavior.z`{depname}` in file {filename} is specified with the `optional` flag. Conda-Lock will follows Poetry behavior and ignore the flag. It will be treated as part of the `{category}` category.version_stringreturnc                 X    | dS t          |           }|                    dd          }|S )a  Convert a Poetry-style version string to a Conda-compatible version string.

    >>> poetry_version_to_conda_version("1.2.3.4")
    '1.2.3.4'

    >>> poetry_version_to_conda_version("1.2.3, 2.3, <=3.4")
    '1.2.3,2.3,<=3.4'

    >>> poetry_version_to_conda_version("^0.14.2")
    '>=0.14.2,<0.15.0'

    >>> poetry_version_to_conda_version("^1.2.3")
    '>=1.2.3,<2.0.0'

    >>> poetry_version_to_conda_version("^0.0.1")
    '>=0.0.1,<0.0.2'

    >>> poetry_version_to_conda_version("~1.2.3")
    '>=1.2.3,<1.3.0'

    >>> poetry_version_to_conda_version("~1.2")
    '>=1.2.0,<1.3.0'

    >>> poetry_version_to_conda_version("~1")
    '>=1.0.0,<2.0.0'

    >>> poetry_version_to_conda_version(None)

    >>> poetry_version_to_conda_version("~1.2.3, ^2.3")
    '>=1.2.3,<1.3.0,>=2.3.0,<3.0.0'
    Nz===z==)r   replace)r   conda_versions     d/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/conda_lock/src_parser/pyproject_toml.pypoetry_version_to_conda_versionr%   J   s:    @ t).99M "))%66M    depattrsdepnamepathcategoryin_extradefault_categorymanager)condapippoetry_version_specc           
         d| v rs|                      dd          }d}|                      d|                      d|                      dd                              }	|	|d|	z   z  }d| v r|d	| d         z   z  }nId
| v r|                      d
d          }d}n,|                      dd          }|                      dd          }|                      dg           }
|                      d          }|dur6|r4t          j        t                              ||j        |                     |du r;|s9|dk    r3t          j        t                              ||j                             |:|dk    r4t          j        t                              ||j        |                     |                      dd          dk    s|d}t          |||
||                      dd                    S )z>Handle a dependency in mapping form from a pyproject.toml filegitNr/   branchtagrev@subdirectory#subdirectory=r)   versionurlextrasoptionalTr(   filenamer*   main)r(   r>   sourcepypimarkers)r:   r-   r;   r0   rB   )	getwarningswarnPOETRY_EXTRA_NOT_OPTIONALformatnamePOETRY_OPTIONAL_NO_EXTRAPOETRY_OPTIONAL_NOT_MAINr   )r'   r(   r)   r*   r+   r,   r-   r0   r:   branch_identr;   optional_flags               r$   handle_mappingrM   v   s4    %\\%66||hll5(,,ud*C*CDD
 
 #3%%CX%%#h~&>>>C	8		ll64((&ll9d;;ll5$''\\(B''F$,LL$<$<M D  X %,,$)h -  	
 	
 	
 X(f2D2D$++Gdi+PP	
 	
 	

  %5%?%?$++$)h ,  	
 	
 	
 ||Hd##v--1D1L%/Y--   r&   	platformscontentsmapping_urlc                    g }ddd}i }t          g d|i                                           D ]\  }}|D ]}	|||	<   t          g d|i                                           D ]\  }
}t          d|
dg          }|
||<   t          g d|d	          }|                                D ]\  }}t          d
dg||i                                           D ]\  }}|                    |          p|}|}d}g }d}d}|dk    rd	}|dk    r|dk    }n:||k    r4t	          j        t                              || j        |                     d}t          |t          j        j                  r=t          ||| |||||          }|j        |j        |j        |j        |j        f\  }}}}}nct          |t&                    r9|}|r4t	          j        t(                              || j        |                     nt+          d| d|           |d	k    rt-          ||          n|}t/          |          }d|v r@|>t1          |          \  }}}|                    t5          ||||d||                     d|v ry|wt7          j        |          } |                                  |                                 }|                    t?          |||                                  ||                      |S|tC          d| d          tE          |          \  }}|                    tG          ||||g|||                     u|                    tI          ||||||                     tK          | |||          S )aQ  
    Parse dependencies from a poetry pyproject.toml file

    Each dependency is assigned a category depending on which section it appears in:
    * dependencies in [tool.poetry.dependencies] have category main
    * dependencies in [tool.poetry.dev-dependencies] have category dev
    * dependencies in each `key` of [tool.poetry.extras] have category `key`
    * dependencies in [tool.poetry.{group}.dependencies] have category `group`

    * By default, dependency names are translated to the conda equivalent, with three exceptions:
        - If a dependency has `source = "pypi"`, it is treated as a pip dependency (by name)
        - If a dependency has a url, it is treated as a direct pip dependency (by url)
        - If all dependencies are default-sourced to pip, `default-non-conda-source = "pip"`

    * markers are not supported

    r?   dev))dependencies)dev-dependencies)toolpoetryr;   )rU   rV   grouprW   rS   rU   
conda-lockzdefault-non-conda-sourcer.   rU   rV   NFpythonr=   !Unsupported type for dependency: : rP   r2   )rH   rB   r@   r-   vcsr5   r7   r)   )rH   rB   r)   is_directoryr-   zdependency z has neither version nor url)rH   rB   r:   hashesr-   r*   r;   )rH   rB   r9   r-   r*   r;   )&r   itemstuplerC   rD   rE   POETRY_INVALID_EXTRA_LOCrG   rH   
isinstancecollectionsabcr   rM   r:   r-   r;   r0   rB   strrF   	TypeErrorr   r%   unpack_git_urlappendr   pathlibPathresolveis_dirr   as_posix
ValueErrorr   r   r   specification_with_dependencies) r)   rN   rO   rP   rS   
categoriesdep_to_extracatdepsdep
group_name_	group_keydefault_non_conda_sourcesectionr,   r(   r'   r*   r-   r:   r;   r+   rB   r0   pvsrH   r9   r5   subdirrn   r`   s                                    r$   parse_poetry_pyproject_tomlr~      s   . &(L "$. .J
 L888(BGGMMOO $ $	T 	$ 	$C #L	$
   ; ; ;XrJJPPRR + +
A7J?@@	 *
9%:::   
 &0%5%5%7%7 w w!!!'X(((B"
 "

%''v	 v	GX ),,W55I9IH/GGC "F"H%)G (""!  6))#v----,33 '$)h 4    
 26(KO$;<< $$'	 	 GKJ+KFBWf&977 Hc** &.# M188$+di( 9      MMM8MM   g%% ([IIII 
 66IJJG  S_#1##6#6 S&##!! '" '!%+  
 
 
 
 8##|C((##"! '!]]__%+ '      ;$KgKKK   (nnV##!! ' &x '!)%  
 
 
 
 ##'! ' ' '!)%  	 	 	 	[v	p +4HlSSSr&   toml_contentsrS   c                    t                      }t          g d|i                                           D ]\  }}t          |t                    r)|                    t          | d| d                     Ct          |t          j        j	                  r0|
                    dd           dk    r|                    |           t          d| d|d          |r|D ]}|j        |v rd	|_        t          g d
|g           }	 |                    d           n# t           $ r Y nw xY wt          g d|g           }	i }
|D ]fd|D             |
<   t#          |
||	| gt          g d|d                    S )N)rU   rY   rS    r?   r@   rA   r[   r\   rr/   )rU   rY   channels
nodefaults)rU   rY   zpip-repositoriesc                 >    g | ]}t          |j                  |S  )r   rB   ).0dplatforms     r$   
<listcomp>z3specification_with_dependencies.<locals>.<listcomp>  s:     4
 4
 4
qy('K'K4
4
 4
 4
r&   )rU   rY   zallow-pypi-requestsT)rS   r   pip_repositoriessourcesallow_pypi_requests)setr   ra   rd   rg   rj   r   re   rf   r   rC   addrh   rH   r-   removerp   r   )r)   rN   r   rS   
force_pypir(   r'   rv   r   r   platform_specific_dependenciesr   s              @r$   rq   rq   d  s!    J#...r eggY Y h$$ 	Y+w,C,C,C,CVLL    +/"9:: 	Y||Hd++v55w'''WWW8WWWXXX $ 	$ 	$Cx:%%#888-LLH%%%%    222M2  CE" 
 
4
 4
 4
 4
#4
 4
 4
&x00 3)"999=$
 
   s   D 
D+*D+conda_dep_namer#   c                      |r|  d| }n|  }|S )Nr   r   )r   r#   specs      r$   to_match_specr     s,     # 22=22 "Kr&   c                   ,     e Zd ZdZdeddf fdZ xZS )RequirementWithHashzRequirement with support for pip hash checking.

    Pip offers hash checking where the requirement string is
    my_package == 1.23 --hash=sha256:1234...
    requirement_stringr    Nc                     	 |                     d          \  }}n# t          $ r d }Y nw xY w|| _        t                                          |           d S )Nz --hash=)splitrp   hashsuper__init__)selfr   r   	__class__s      r$   r   zRequirementWithHash.__init__  sm    	'9'?'?
'K'K$ 	 	 	DDD	#'	+,,,,,s    ++)__name__
__module____qualname____doc__rg   r   __classcell__)r   s   @r$   r   r     sU         -3 -4 - - - - - - - - - -r&   r   requirementc                 p   |                      d          s*|                      d          s|                      d          ri|                     d          d         }|                    d          d         }|                    d          r
|d	d
         }t          | d|            S t          |           S )z'Parse a url requirement to a conda specgit+https://ssh:///r6   r   .gitNz @ )
startswithr   endswithr   )r   repo_name_and_maybe_tag	repo_names      r$   parse_requirement_specifierr     s    
 	v&&0!!*--0 !!(++0 #."3"3C"8"8"<+11#66q9	f%% 	'!#2#I"i#A#AK#A#ABBB";///r&   r:   c                 h   |                      d          r
| d d         } |                     d          r
| dd          } d }d }d| v rJ	 |                     d          \  } }n0# t          $ r# |                     d          \  }}}| d| } Y nw xY w|rd|v r|                    d          \  }}| ||fS )Nr   r   r      r6   r8   )r   r   r   rp   )r:   r5   r}   url1url2s        r$   ri   ri     s    
||F #2#h
~~f !""g
CF
czz	#yy~~HC 	# 	# 	#!iinnOD$""D""CCC	#  23&&ii 011VVs   A! !*BBr.   r?   )r-   r*   c                   d| v r$d |                      dd          D             \  } }nd}t          |           }t          |j                  }t	          |j                  }t          |          }|r5d                    t          |	                    d                              }|dk    rt          ||          }	n|}	t          |j                  }
|j        rI|j                            d          r/t          |j                  \  }}}t!          |	|||d	|||
          S |j        r |dv sJ |j                            d          s4|j                            d          s|j                            d          rBt#          |j                  \  }}t%          |	|||
||                    dd          g|          S |j        }|                    d          r
|dd         }t)          j        |          }|                                 |                                }t1          |	|||
|                                ||          S t5          |	|pd|||
|j        |          S )aF  Parse a requirements.txt like requirement to a conda spec.

    >>> from conda_lock.lookup import DEFAULT_MAPPING_URL
    >>> parse_python_requirement(
    ...     "my_package",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    VersionedDependency(name='my-package', manager='conda', category='main', extras=[],
        markers=None, version='*', build=None, conda_channel=None, hash=None)

    The PyPI name `build` will be translated to `python-build` for conda.
    >>> parse_python_requirement(
    ...     "build",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    VersionedDependency(name='python-build', manager='conda', category='main',
        extras=[], markers=None, version='*', build=None, conda_channel=None, hash=None)

    No translation is done for `manager="pip"`.
    >>> parse_python_requirement(
    ...     "build",
    ...     manager="pip",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    VersionedDependency(name='build', manager='pip', category='main',
        extras=[], markers=None, version='*', build=None, conda_channel=None, hash=None)

    >>> parse_python_requirement(
    ...     "My_Package[extra]==1.23",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    VersionedDependency(name='my-package', manager='conda', category='main',
        extras=['extra'], markers=None, version='==1.23', build=None,
        conda_channel=None, hash=None)

    >>> parse_python_requirement(
    ...     "conda-lock @ git+https://github.com/conda/conda-lock.git@v2.4.1",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    VCSDependency(name='conda-lock', manager='conda', category='main', extras=[],
        markers=None, source='https://github.com/conda/conda-lock.git', vcs='git',
        rev='v2.4.1', subdirectory=None)

    >>> parse_python_requirement(
    ...     "conda-lock @ git+https://github.com/conda/conda-lock.git@v2.4.1#subdirectory=src",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    VCSDependency(name='conda-lock', manager='conda', category='main', extras=[],
        markers=None, source='https://github.com/conda/conda-lock.git', vcs='git',
        rev='v2.4.1', subdirectory='src')

    >>> parse_python_requirement(
    ...     "some-package @ https://some-repository.org/some-package-1.2.3.tar.gz",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    URLDependency(name='some-package', manager='conda', category='main', extras=[],
        markers=None, url='https://some-repository.org/some-package-1.2.3.tar.gz',
        hashes=[''])

    >>> parse_python_requirement(
    ...     "some-package ; sys_platform == 'darwin'",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    VersionedDependency(name='some-package', manager='conda', category='main',
        extras=[], markers="sys_platform == 'darwin'", version='*', build=None,
        conda_channel=None, hash=None)

    >>> parse_python_requirement(
    ...     "mypkg @ /path/to/some-package",
    ...     manager="pip",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    PathDependency(name='mypkg', manager='pip', category='main',
        extras=[], markers=None, path='/path/to/some-package', is_directory=False,
        subdirectory=None)

    >>> parse_python_requirement(
    ...     "mypkg @ file:///path/to/some-package",
    ...     manager="pip",
    ...     mapping_url=DEFAULT_MAPPING_URL,
    ... )  # doctest: +NORMALIZE_WHITESPACE
    PathDependency(name='mypkg', manager='pip', category='main',
        extras=[], markers=None, path='/path/to/some-package', is_directory=False,
        subdirectory=None)
    ;c              3   >   K   | ]}|                                 V  d S )N)strip)r   ss     r$   	<genexpr>z+parse_python_requirement.<locals>.<genexpr>4  s*      NNa		NNNNNNr&      N,r.   r]   r   r2   )rH   r@   r-   r*   r^   r5   rB   r7   >   N *r   r   =:)rH   r-   r*   r;   r:   r`   rB   zfile://   )rH   r-   r*   r;   r)   r_   rB   r   )rH   r9   r-   r*   r;   r   rB   )rsplitr   canonicalize_pypi_namerH   rg   	specifierr%   joinsortedr   r   listr;   r:   r   ri   r   r   r   r"   rk   rl   rm   rn   r   ro   r   r   )r   rP   r-   r*   rB   
parsed_reqrH   collapsed_versionr#   r   r;   r:   r5   r}   fragr)   rn   s                    r$   parse_python_requirementr     s   x kNN;3E3Ec13M3MNNNWW,[99J!*/22DJ01134EFFM C(;(;C(@(@!A!ABB'0;OOO*#$$F~ 6
*.33F;; 6
)*.99S&	
 	
 	
 		
 
 *
////N%%f--	~((44	 ~((22	
 "*.11IC #!S#../    n>>)$$ 	abb'C|C  
 
 
 	
 #!(S
 
 
 	
r&   rR   test)dev_tagspyproject_toml_pathprefixmain_tagoptional_tagr   c          
         g }g ||R di}	|D ]}
d|	g |||
R <   t          t          g |||i                                                                         |          D ]}
|
|	g |||
R <   t          g d|d          }|	                                D ]L\  }}t          t          |          |g           D ](}|                    t          ||||                     )Mt          | |||          S )z
    PEP621 and flit
    r?   rR   rX   r.   r-   r*   rP   )	r   r   keys
differencera   r   rj   r   rq   )r   rN   rO   r   r   r   rP   r   rS   sectionsextrarz   r)   r*   rv   s                  r$   !parse_requirements_pyproject_tomlr   }  sz    &(L#&#(##V,H 9 938/6/<///00V3f3l3XrBBGGIIJJUU  9 9 49/6/<///00%:::   
 #..** 	 	h$t**h33 	 	C(4% +	     	 +Y,  r&   c           	      Z  	 t          | ||ddd          }g }t          g d|d          	t          g d|                                          D ]'\  }}|                    	fd|D                        (|j                                        D ]}|                    |           |S )	z
    PDM support. First, a regular PEP621 pass; then, add all dependencies listed
    in the 'tool.pdm.dev-dependencies' table with the 'dev' category.
    projectrS   optional-dependencies)rN   rO   rP   r   r   r   rX   r.   )rU   pdmrT   c                 6    g | ]}t          |d           S )rR   r   )r   )r   rv   rz   rP   s     r$   r   z,parse_pdm_pyproject_toml.<locals>.<listcomp>  sF         )4" +	    r&   )r   r   ra   extendrS   values)
r)   rN   rO   rP   resdev_reqsr{   ru   dep_listrz   s
      `     @r$   parse_pdm_pyproject_tomlr     s	    ,,  C H%:::   
   C C CXNNTTVV 
 
        
	
 
	
 
	
 
	
 $++-- " "!!!!Jr&   pyproject_tomlc                     |                      d          5 }t          |          }d d d            n# 1 swxY w Y   t          g d|g           S )Nrb)rU   rY   rN   )open	toml_loadr   )r   fprO   s      r$   #parse_platforms_from_pyproject_tomlr     s     
		T	"	" !bR==! ! ! ! ! ! ! ! ! ! ! ! ! ! !555xDDD   266c                   |                      d          5 }t          |          }d d d            n# 1 swxY w Y   t          ddg|          }t          g d|d          rg }t          | |||          S dt          ddg|g           v rt	          j        d	           d }nt          ddg|          }t          d
dg|          }t          }	|#|t          t          ddd          }	ngt          }	n_|
                    d          rt          }	nB|
                    d          rt          t          ddd          }	ndd l}
 |
j        d            |	| |||          S )Nr   zbuild-systemzbuild-backend)rU   rY   zskip-non-conda-lockFrS   r   dynamiczgconda-lock does not yet support reading dynamic dependencies from pyproject.toml. They will be ignored.rU   r   r   r   )r   r   r   rV   flit)rU   r   metadatarequireszrequires-extrar   zACould not detect build-system in pyproject.toml.  Assuming poetry)rN   rO   rP   )r   r   r   rq   loggingwarningr~   r   r   r   r   rD   rE   )r   rN   rP   r   rO   build_systemrS   pep_621_probe	pdm_probeparserD   s              r$   parse_pyproject_tomlr     s    
		T	"	" !bR==! ! ! ! ! ! ! ! ! ! ! ! ! ! !>?;XFFL555  

 *,.Ix
 
 	
 I 6"EEEE 	9	
 	
 	
 	>:HEE11I'E 1#'4	  EE -EE		 	 	*	* 
+		 	 	(	( 
-/)	
 
 
 	O	
 	
 	
 5)hK   r   )Fre   collections.abcr   rk   sysrD   	functoolsr   typingr   r   r   r   r   r	   r
   r   urllib.parser   version_infotomllibr   r   tomlipackaging.requirementsr   packaging.utilsr   r   typing_extensionsr   conda_lock.commonr   (conda_lock.interfaces.vendored_grayskullr   conda_lock.lookupr   conda_lock.models.lock_specr   r   r   r   r   r   r   "conda_lock.src_parser.conda_commonr   conda_lock.src_parser.markersr   rc   rF   rI   rJ   rg   r%   rf   rl   boolrM   r~   rq   r   r   r   ri   r   r   r   r   r   r   r&   r$   <module>r     s             



       	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 # " " " " " w)))))))'''''' . . . . . . G G G G G G % % % % % % $ $ $ $ $ $ J J J J J J 5 5 5 5 5 5                  K J J J J J 9 9 9 9 9 94 4 4 ? )HSM )hsm ) ) ) )XAo%AA ,A 	A
 A A ^$A "#A  A A A AHgT
,gTCygT c3hgT 	gT
 gT gT gT gTT1
,1Cy1 38$1 z"	1
 1 1 1 1h# hsm     - - - - -+ - - - 000 0 0 0( c8C=(3-&G H    . (/c
 c
 c
c
 c
 ^$	c

 c
 c
 c
 c
 c
^ #(* * * * Cy* c3h	*
 SM* * * * #* * * * *Z*
,*Cy* c3h* 	*
 * * * *ZELE	#YE E E EBLB CyB 	B
 B B B B B Br&   