
    ܖiXe                        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 d dlm	Z	 	  e	       Z
d ZeZdAdZe
fd	Zd
 Zd Ze
j#                  dddd      d        Zd Zd Zd Ze
j#                  ddd      d        Ze
j#                  d      d        Ze
j#                  dd      d        ZdZ ej4                  dej6                        Ze
j#                  dd       d!        Ze
j#                  d"      d#        Zd$Z ed%e       d&Z  ed%e        d'Z! ed(e!       d)Z" ed(e"       e
j#                  d*      d+        Z#d,Z$ ed-e$       d.Z% ed/e%       e
j#                  d0      d1        Z&d2Z' ed/e'       e
j#                  d3      d4        Z(d5Z)e
j#                  d6      d7        Z*e
j#                  d8      d9        Z+d:Z, ed;e,       d<Z- ed=e-       d>Z. ed=e.       e
j#                  d?      d@        Z/y)B    N)unquote_plus)urlparse)
PackageURL)NoRouteAvailable)Routerc                 h    | r	 t         j                  |       S y# t        $ r t        |       cY S w xY w)zE
    Return a PackageURL inferred from the `url` string or None.
    N)purl_routerprocessr   build_generic_purl)urls    _/var/www/html/content-pipeline/venv/lib/python3.12/site-packages/packageurl/contrib/url2purl.pyurl2purlr   0   s@     	+&&s++    	+ &c**	+s    11c                    t        |      }t        j                  |t        j                        }|j	                  |      }|sy |j                         j                         D ci c]  \  }}|t        j                  v s|| }}}|xs i }|j                         j                  d      }	|	r|j                  d|	i       |rd|v r|d   j                  |       n||d<   t        | fi |S c c}}w )Nversion_prefix
qualifiers)r   recompileVERBOSEmatch	groupdictitemsr   _fieldsgetupdate)
type_patternr   r   compiled_patternr   fieldvalue	purl_datar   s
             r   purl_from_patternr!   @   s    
s
Czz'2::6""3'E */):)@)@)B%ezOaOaFauI  !rJ__&**+;<N+^<=9$l#**:6&0Il#e)y))!s   %C. C.c                 8      fd}|j                  |       y)z+
    Register a pattern with its type.
    c                     t        |       S Nr!   )r   r   r   s    r   endpointz"register_pattern.<locals>.endpoint`   s     55    N)append)r   r   routerr&   s   ``  r   register_patternr*   [   s    
6 MM'8$r'   c                     t        t        |       j                        }|j                  d      D cg c]  }|s|	 }}|S c c}w )z=
    Return a list of path segments from a `url` string.
    /)r   r   pathsplit)r   r-   segsegmentss       r   get_path_segmentsr1   f   s?     **+D#zz#6#6H6O 7s
   AAc                     t        |       }|j                  r=|j                  r0|j                  r#t	        |       }|r|d   }t        d|d| i      S yyyy)z
    Return a PackageURL from `uri`, if `uri` is a parsable URL, or None

    `uri` is assumed to be a download URL, e.g. https://example.com/example.tar.gz
    genericdownload_urltypenamer   N)r   schemenetlocr-   r1   r   )uri
parsed_uriuri_path_segments	file_names       r   r   r   o   sb     #JZ..:??-c2)"-I99.Z]I^__  4C.r'   zhttps?://registry.npmjs.*/.*z https?://registry.yarnpkg.com/.*z"https?://(www\.)?npmjs.*/package.*z&https?://(www\.)?yarnpkg.com/package.*c                 T    d| v rt        |       S d| v rt        |       S t        |       S )N	/package/z/-/)build_npm_web_purlbuild_npm_download_purlbuild_npm_api_purl)r;   s    r   build_npm_purlrD   ~   s4     c!#&&	#&s++!#&&r'   c                 l   t        t        |       j                        }|j                  d      D cg c]  }|s|	 }}t	        |      dk  ry t	        |      dk(  rt        d|d   |d   |d         S |d   j                  d      rt        d|d   |d   	      S t        d|d   |d   
      S c c}w )Nr,         npmr      )	namespacer8   version@)rJ   r8   r8   rK   )r   r   r-   r.   lenr   
startswith)r;   r-   r/   r0   s       r   rC   rC      s    **+D#zz#6#6H6
8}q 8}%8A;Xa[RZ[\R]^^ {c"%8A;Xa[II e(1+x{CC 7s
   B1B1c                    t        t        |       j                        }|j                  d      D cg c]  }|s|dk7  s| }}t	        |      }|dk(  r|\  }}}n|dk(  rd }|\  }}ny t
        j                  j                  |      \  }}	|j                  |d      }
|
j                  d      r|
dd  }
t        d|||
      S c c}w )Nr,   -rG   rF    rI   rH   )
r   r   r-   r.   rN   ossplitextreplacerO   r   )r;   r-   r/   r0   len_segmentsrJ   r8   filenamebase_filenameextrK   s              r   rB   rB      s    **+D#zz#E##*EHEx=L q$,!	4 
		!h 	))(3M3##D"-G#!"+eYg66) Fs   CC Cc                    t        t        |       j                        }|j                  d      r|dd  }|j	                  d      D cg c]  }|s|	 }}t        |      }d x}}|dk(  r|d   }|d   }|d   }nG|dk(  rd }|d   }|d   }n5|dk(  r|d   }|d   }n%|dk(  rt        |      dkD  r|d   d   d	k7  r|d   }ny t        d
|||      S c c}w )Nr@   	   r,      r   rI   rG   rF   rL   rH   )r   r   r-   rO   r.   rN   r   )r;   r-   r/   r0   rV   rJ   rK   r8   s           r   rA   rA      s   **+D{#ABx#zz#6#6H6x=LI qQK	{1+ 
		{1+ 
	QK	{ 
	s8}q0Xa[^s5J{ 	eYg669 7s   CCz"https?://repo1.maven.org/maven2/.*z$https?://central.maven.org/maven2/.*z maven-index://repo1.maven.org/.*c                    t        t        |       j                        }|j                  d      D cg c]  }|s|dk7  s| }}t	        |      dk  ry |dd  \  }}||v }d }|r|j                         }|d   }|d   }	dj                  |d d       }
i }|rS|	 d| }|j                  |      \  }}}|j                  d      \  }}}|sy |j                  d      |d<   d	}||v r||d
<   t        d|
|	||      S c c}w )Nr,   maven2rG   r3   .rQ   
classifier)
aarearmarpomrarrpmsarztar.gzwarzipr7   maven)r   r   r-   r.   rN   popjoin
rpartition	partitionstripr   )r;   r-   r/   r0   before_last_segmentlast_segmenthas_filenamerW   rK   r8   rJ   r   name_version_classifier_extra   	extensionvalid_typess                     r   build_maven_purlry      s/    **+D#zz#J##/JHJ
8}q(0%&,6LH<<>rlGB<D#2'IJq	*'22<@1n#1#;#;C#@ 
Ay#-#3#3C#8
< _#!*Jvgy$DD= Ks   C9C9 C9z)https?://rubygems.org/(downloads|gems)/.*c                      d}t        d||       S )NzL^https?://rubygems.org/(downloads|gems)/(?P<name>.+)-(?P<version>.+)(\.gem)$gemr%   )r;   rubygems_patterns     r   build_rubygems_purlr}     s     	X  U$4c::r'   zhttps?://cran.r-project.org/.*z+https?://packagemanager.rstudio.com/cran/.*c                 8    d}i }d| vr| |d<   t        d|| |      S )Nzw^https?://(cran\.r-project\.org|packagemanager\.rstudio\.com/cran)/.*?src/contrib/(?P<name>.+)_(?P<version>.+)\.tar.gz$z//cran.r-project.org/r5   cranr%   )r;   cran_patternr   s      r   build_cran_purlr     s2    
 NLJc)%(
>"V\3
CCr'   zP(?P<name>(\w\.?)+(-\w+)*)-(?P<version>.+)\.(zip|tar.gz|tar.bz2|tgz|egg|rpm|exe)$zu^(?P<namever>(?P<name>.+?)-(?P<version>.*?))((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)\.whl)$z'https?://pypi.org/(packages|project)/.+z,https?://.+python.+org/(packages|project)/.*c                    t        t        |       j                        }|j                  d      }|d   }|j	                  d      rCt
        j                  |      }|r,t        d|j                  d      |j                  d            S |d   d	k(  r)t        d|d
   t        |      dkD  r
|d         S d       S t        dt        |      S )Nr,   r3   z.whlpypir8   rK   rM   rI   projectrF   rG   )r   r   r-   r.   endswithwheel_file_rer   r   grouprN   r!   pypi_pattern)r;   r-   r0   rr   r   s        r   build_pypi_purlr   9  s    
 **+Dzz#HB<L V$##L1[[(I.  {i!#&x=1#4HQK
 	
 ;?
 	
 V\<@@r'   z"https?://packagist.org/packages/.*c                      d}t        d||       S )Nz]^https?://packagist\.org/packages/(?P<namespace>[^/]+)/(?P<name>[^\#]+?)(\#(?P<version>.+))?$composerr%   )r;   composer_patterns     r   build_composer_purlr   W  s     xZ)93??r'   zG^https?://.*nuget.org/(api/v2/)?packages?/(?P<name>.+)/(?P<version>.+)$nugetzP^https?://api.nuget.org/v3-flatcontainer/(?P<name>.+)/(?P<version>.+)/.*(nupkg)$z^https?://.*sourceforge.net/projects/(?P<name>.+)/files/(?i:(?P=name)/)?v?(?P<version>[0-9\.]+)/(?i:(?P=name)).*(?P=version).*(/download)$sourceforgezj^https?://.*sourceforge.net/projects/(?P<name>.+)/files/(?i:(?P=name))_*(?P<version>[0-9_]+).*(/download)$z%https?://.*sourceforge.net/project/.*c                     d}t        d||       }|sL| j                  d      }t        |      dk\  r-|d   }|j                  d      }|r|d   }t        d|d| i	      }|S )
Nz^https?://.*sourceforge.net/projects?/(?P<namespace>([^/]+))/(OldFiles/)?(?P<name>.+)/(?P<version>[v0-9\.]+)/(?P=name).*(?P=version).*[^/]$r   z	/project/rF   rI   r,   r   r5   r6   )r!   r.   rN   r   )r;   sourceforge_patternsourceforge_purl	split_uriremaining_uri_pathremaining_uri_path_segmentsproject_names          r   build_sourceforge_purlr     s    	  )8KSQ IIk*	 y>Q!*1*<*B*B3*G'*:1=#-&\~WZF[$  r'   zK^https?://crates.io/api/v1/crates/(?P<name>.+)/(?P<version>.+)(\/download)$cargozkhttps?://raw.githubusercontent.com/(?P<namespace>[^/]+)/(?P<name>[^/]+)/(?P<version>[^/]+)/(?P<subpath>.*)$githubz!https?://api.github\.com/repos/.*c                     t        |       }t        |      dk\  sy|d   }|d   }d}t        |      dk(  r|d   dk7  r|d   }t        |      dk(  r|d   dk(  r|d   }t        d|||	      S )
a  
    Return a PackageURL object from GitHub API `url`.
    For example:
    https://api.github.com/repos/nexB/scancode-toolkit/commits/40593af0df6c8378d2b180324b97cb439fa11d66
    https://api.github.com/repos/nexB/scancode-toolkit/
    and returns a `PackageURL` object
    rG   NrI   rF   r\   commits   r   )r7   rJ   r8   rK   )r1   rN   r   )r   r0   rJ   r8   rK   s        r   build_github_api_purlr     s     !%HMQIA;DG 8}hqkY61+ 8}hqkY61+8ytWUUr'   zkhttps?://codeload.github.com/(?P<namespace>.+)/(?P<name>.+)/(zip|tar.gz|tar.bz2|tgz)/(.*/)*(?P<version>.+)$zhttps?://github\.com/.*c                    d}d}d}d}d}d}d}d}||||||||f}	|	D ]7  }
t        j                  |
|       }i }|s|
|k(  r| |d	<   t        d
|
| |      c S  t        |       }t	        |      dk\  sy|d   }|d   }d}d}t	        |      dk\  r!|d   dk7  r|d   }dj                  |dd       }t	        |      dk\  r!|d   dk(  r|d   }dj                  |dd       }t        d
||||      S )z7
    Return a PackageURL object from GitHub `url`.
    znhttps?://github.com/(?P<namespace>.+)/(?P<name>.+)/archive/refs/tags/(?P<version>.+).(zip|tar.gz|tar.bz2|.tgz)z}https?://github.com/(?P<namespace>.+)/(?P<name>.+)/archive/(.*/)*((?P=name)(-|_|@))?(?P<version>.+).(zip|tar.gz|tar.bz2|.tgz)zxhttps?://github.com/downloads/(?P<namespace>.+)/(?P<name>.+)/((?P=name)(-|@)?)?(?P<version>.+).(zip|tar.gz|tar.bz2|.tgz)zZhttps?://github.com/(?P<namespace>.+)/(?P<name>.+)/raw/(?P<version>[^/]+)/(?P<subpath>.*)$z[https?://github.com/(?P<namespace>.+)/(?P<name>.+)/blob/(?P<version>[^/]+)/(?P<subpath>.*)$z[https?://github.com/(?P<namespace>.+)/(?P<name>.+)/releases/download/(?P<version>[^/]+)/.*$z8https?://github.com/(?P<namespace>.+)/(?P<name>.+).(git)zahttps?://github.com/(?P<namespace>[^/]+)/(?P<name>[^/]+)/commit/(?P<version>[0-9a-fA-F]{7,40})/?$r5   r   )r   r   r   r   rF   Nr   rI   rG   treer,   r\   r7   rJ   r8   rK   subpath)r   searchr!   r1   rN   rm   r   )r   archive_tags_patternarchive_patterndownload_patternraw_patternblob_patternreleases_download_patterngit_patterncommit_patternpatternsr   matchesr   r0   rJ   r8   rK   r   s                     r   build_github_purlr     s   	5 	5 	5 	4 	5 	5  NK	Y  	!	H  ))GS)
33-0
>*$SZ  !%Hx=AIA;DGG 8}hqkV31+((8AB<( 8}hqkV31+((8AB<( r'   zehttps?://bitbucket.org/(?P<namespace>[^/]+)/(?P<name>[^/]+)/commits/(?P<version>[0-9a-fA-F]{7,64})/?$zhttps?://bitbucket\.org/.*c                 B   t        j                  t        |       }|r>t        d|j	                  d      |j	                  d      |j	                  d      i d      S t        |       }t        |      dk\  sy|d	   }|d
   }d}t        j                  ||       }i }|r| |d<   t        d|||      S d}d}	t        |      dk\  r!|d   dk7  r|d   }dj                  |dd       }	t        |      dk\  r!|d   dk(  r|d   }dj                  |dd       }	t        d||||	      S )aW  
    Return a PackageURL object from BitBucket `url`.
    For example:
    https://bitbucket.org/TG1999/first_repo/src/master or
    https://bitbucket.org/TG1999/first_repo/src or
    https://bitbucket.org/TG1999/first_repo/src/master/new_folder
    https://bitbucket.org/TG1999/first_repo/commits/16a60c4a74ef477cd8c16ca82442eaab2fbe8c86
    	bitbucketrJ   r8   rK   rR   r7   rJ   r8   rK   r   r   rF   Nr   rI   zqhttps?://bitbucket.org/(?P<namespace>.+)/(?P<name>.+)/downloads/(?P<version>.+).(zip|tar.gz|tar.bz2|.tgz|exe|msi)r5   r7   rJ   r8   r   rG   srcr,   r\   r   )r   r   bitbucket_commit_patternr   r   r1   rN   rm   )
r   commit_matcher0   rJ   r8   bitbucket_download_patternr   r   rK   r   s
             r   build_bitbucket_purlr   `  sX    II6<M#))+6$$V,!''	2
 	
 !%Hx=AIA;D	= 
 ii2C8GJ%(
>"{idWabbGG 8}hqkU21+((8AB<( 8}hqkU21+((8AB<( r'   z&https?://gitlab\.com/(?!.*/archive/).*c                    d}t        j                  ||       }|r>t        d|j                  d      |j                  d      |j                  d      i d      S t	        |       }t        |      dk\  sy	|d
   }|d   }d	}d	}t        |      dk\  r)|d   dk7  r!|d   dk7  r|d   }dj                  |dd	       }t        |      dk\  r)|d   dk(  r!|d   dk(  r|d   }dj                  |dd	       }t        d||||      S )aq  
    Return a PackageURL object from Gitlab `url`.
    For example:
    https://gitlab.com/TG1999/firebase/-/tree/1a122122/views
    https://gitlab.com/TG1999/firebase/-/tree
    https://gitlab.com/TG1999/firebase/-/master
    https://gitlab.com/tg1999/Firebase/-/tree/master
    https://gitlab.com/tg1999/Firebase/-/commit/bf04e5f289885cf2f20a92b387bcc6df33e30809
    zchttps?://gitlab.com/(?P<namespace>[^/]+)/(?P<name>[^/]+)/-/commit/(?P<version>[0-9a-fA-F]{7,64})/?$gitlabrJ   r8   rK   rR   r   rF   Nr   rI   rG   rQ   r   r,   r   r\   r   )r   r   r   r   r1   rN   rm   )r   r   r   r0   rJ   r8   rK   r   s           r   build_gitlab_purlr     s6   	-  IInc2M#))+6$$V,!''	2
 	
 !%Hx=AIA;DGG 	Hs 2x{f7L1+((8AB<( 8}x{c1hqkV6K1+((8AB<( r'   zk^https?://gitlab.com/(?P<namespace>.+)/(?P<name>.+)/-/archive/(?P<version>.+)/(?P=name)-(?P=version).*[^/]$r   z`^https?://hackage.haskell.org/package/(?P<name>.+)-(?P<version>.+)/(?P=name)-(?P=version).*[^/]$hackagezF^https?://hackage.haskell.org/package/(?P<name>.+)-(?P<version>[^/]+)/zShttps?://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/.*c                     | j                  d      \  }}|r*|j                  d      }|r|d   }t        dd|d| i      S y y )NzPhttps://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/r,   r   r4   zcode.google.comr5   r   )r.   r   )r;   ru   remaining_urisplit_remaining_urir8   s        r   &build_generic_google_code_archive_purlr     se     yyZA} +11#6&q)D+*C0	   r'   r$   )0rS   r   urllib.parser   r   
packageurlr   packageurl.contrib.router   r   r	   r   get_purlr!   r*   r1   r   routerD   rC   rB   rA   ry   r}   r   r   r   r   r   r   r   nuget_www_patternnuget_api_patternsourceforge_download_pattern sourceforge_download_pattern_bisr   cargo_patterngithub_raw_content_patternr   github_codeload_patternr   r   r   r   gitlab_archive_patternhackage_download_patternhackage_project_patternr    r'   r   <module>r      s   6 
 	 % ! ! 5 + h
+ *6 -8 %` "&)-	''D&72!7H (*&
 E
 EH >?; @;" $1D	D c 

 JJ	 -2A	A4 78
@ 9
@ _  + ,
  + ,   < =
 !  @ A :;$ <$P _ - (
+ 
 5 6 78V 9V<  2 3 -.c /cPV  01: 2:z <=5 >5t  1 2
  4 5 d  3 4 Yr'   