
    &                     f   d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZ G d de	      Z
dZd	Zd
Zej                  d   r(ej                  j!                  ej                  d         ndZdez  ZdZdZd Zd Zd Zd Zd Z G d de      Z G d de      Z G d de      Z G d de      Zd Zy)z<This package defines Tag a way of representing an image uri.    )absolute_import)division)print_functionNc                       e Zd ZdZy)BadNameExceptionz.Exceptions when a bad docker name is supplied.N)__name__
__module____qualname____doc__     8lib/third_party/containerregistry/client/docker_name_.pyr   r      s    6r   r   z(abcdefghijklmnopqrstuvwxyz0123456789_-./zAabcdefghijklmnopqrstuvwxyz0123456789_-.ABCDEFGHIJKLMNOPQRSTUVWXYZzsh:0123456789abcdefconsolez//containerregistry/client:%szindex.docker.iolatestc           	          t        |      }|r||k  rt        d| d|d|d      |r||kD  rt        d| d|d|d      |j                  |      rt        d| d|d|      y)a  Checks a given named element matches character and length restrictions.

  Args:
    name: the name of the element being validated
    element: the actual element being checked
    characters: acceptable characters for this element, or None
    min_len: minimum element length, or None
    max_len: maximum element length, or None

  Raises:
    BadNameException: one of the restrictions was not met.
  zInvalid z: z, must be at least z charactersz, must be at most z!, acceptable characters include: N)lenr   strip)nameelement
charactersmin_lenmax_lenlengths         r   _check_elementr   ,   s     w<&'!
 '74 5 5 '!
 '74 5 5 ]]:
 ':7 8 8 r   c                 *    t        d| t        dd       y )N
repository      )r   _REPOSITORY_CHARS)r   s    r   _check_repositoryr    H   s    z+<aEr   c                 *    t        d| t        dd       y )Ntag      )r   
_TAG_CHARS)r"   s    r   
_check_tagr&   L   s    ZC0r   c                 *    t        d| t        dd       y )NdigestG   )r   _DIGEST_CHARS)r(   s    r   _check_digestr+   P   s    6=&&Ar   c                     t         j                  j                  j                  j	                  d| z         }| |j
                  k7  rt        d| z        y )Nz//zInvalid registry: %s)sixmovesurllibparseurlparsenetlocr   )registryparsed_hostnames     r   _check_registryr5   T   sL    II$$**33D8OD/ '''
1X>
?? (r   c                   L    e Zd ZdZddZed        Zd Zd Zd Z	d Z
d Zd	 Zy
)Registryz3Stores a docker registry name in a structured form.c                 F    |r|st        d      t        |       || _        y )Nz+A Docker registry domain must be specified.)r   r5   	_registry)selfr   stricts      r   __init__zRegistry.__init__a   s#    LMMdDNr   c                 *    | j                   xs t        S N)r9   DEFAULT_DOMAINr:   s    r   r3   zRegistry.registryi   s    >>+^+r   c                     | j                   S r>   )r9   r@   s    r   __str__zRegistry.__str__m   s    >>r   c                 "    | j                         S r>   )rB   r@   s    r   __repr__zRegistry.__repr__p   s    <<>r   c                     t        |      xr2 t        |       t        |      k(  xr | j                  |j                  k(  S r>   )booltyper3   r:   others     r   __eq__zRegistry.__eq__s   s:    K ,J$u+%, MMU^^+-r   c                 &    | j                  |       S r>   rJ   rH   s     r   __ne__zRegistry.__ne__y       {{5!!!r   c                 ,    t        | j                        S r>   )hashr3   r@   s    r   __hash__zRegistry.__hash__|   s    r   c                      y)Nzregistry:catalog:*r   )r:   unused_actions     r   scopezRegistry.scope   s    r   NT)r   r	   r
   r   r<   propertyr3   rB   rD   rJ   rM   rQ   rT   r   r   r   r7   r7   ^   s<    ; , ,-" r   r7   c                   \     e Zd ZdZd
 fd	Zd Zed        Z fdZd Z	d Z
d Zd	 Z xZS )
Repositoryz5Stores a docker repository name in a structured form.c                     |st        d      d}|}|j                  dd      }t        |      dk(  rd|d   v sd|d   v r
|d   }|d   }t        t        |   ||	       || _        t        | j                         y )
Nz%A Docker image name must be specified /r#   r   .r   :r;   )r   splitr   superrX   r<   _repositoryr    )r:   r   r;   domainrepoparts	__class__s         r   r<   zRepository.__init__   s    DEEFDJJsAE
5zQ 
aC58OqQx	*d$VF$;Dd&&'r   c                     t        d|z        S )NzBDocker image name must have the form: registry/repository, saw: %sr   r:   r   s     r   _validation_exceptionz Repository._validation_exception   s     ;=AB C Cr   c                     | j                   S r>   )ra   r@   s    r   r   zRepository.repository   s    r   c                 ~    t         t        |          }|rdj                  || j                        S | j                  S )Nz{registry}/{repository})r3   r   )r`   rX   rB   formatra   r:   basere   s     r   rB   zRepository.__str__   sF    T*,D&--D$4$4 . 6 6 r   c                     t        |      xrM t        |       t        |      k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r>   )rF   rG   r3   r   rH   s     r   rJ   zRepository.__eq__   sS    K 0J$u+%0 MMU^^+0 OOu///	1r   c                 &    | j                  |       S r>   rL   rH   s     r   rM   zRepository.__ne__   rN   r   c                 D    t        | j                  | j                  f      S r>   )rP   r3   r   r@   s    r   rQ   zRepository.__hash__   s    011r   c                 <    dj                  | j                  |      S )Nzrepository:{resource}:{action})resourceaction)rl   ra   )r:   rt   s     r   rT   zRepository.scope   s&    +22!! 3  r   rU   )r   r	   r
   r   r<   ri   rV   r   rB   rJ   rM   rQ   rT   __classcell__re   s   @r   rX   rX      s>    =((C  1"2r   rX   c                   Z     e Zd ZdZd	 fd	Zed        Z fdZ fdZd Z	d Z
d Z xZS )
Tagz4Stores a docker repository tag in a structured form.c                     |j                  dd      }t        |      dk7  r|}d}n
|d   }|d   }|| _        | j                  s|rt        | j                         t        t
        |   ||       y )Nr]   r#   r   rZ   r   r^   )rsplitr   _tagr&   r`   rx   r<   )r:   r   r;   rd   rn   r"   re   s         r   r<   zTag.__init__   sl    KKQE
5zQdc1Xd!HcDI
 yyF	#td62r   c                 *    | j                   xs t        S r>   )r{   DEFAULT_TAGr@   s    r   r"   zTag.tag   s    99##r   c                 ~    t         t        |          }| j                  rdj	                  || j                        S |S )Nz{base}:{tag})rn   r"   )r`   rx   rB   r{   rl   rm   s     r   rB   zTag.__str__   s8    d#%Dyy""$))"<<kr   c                 >    t        t        t        |          d      S NFr^   )rX   r`   rx   rB   r:   re   s    r   as_repositoryzTag.as_repository   s     eC.0??r   c                     t        |      xrh t        |       t        |      k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r>   )rF   rG   r3   r   r"   rH   s     r   rJ   z
Tag.__eq__   sj    K "J$u+%" MMU^^+" OOu///	"
 HH		!#r   c                 &    | j                  |       S r>   rL   rH   s     r   rM   z
Tag.__ne__   rN   r   c                 Z    t        | j                  | j                  | j                  f      S r>   )rP   r3   r   r"   r@   s    r   rQ   zTag.__hash__   s     :;;r   rU   )r   r	   r
   r   r<   rV   r"   rB   r   rJ   rM   rQ   ru   rv   s   @r   rx   rx      s9    <3& $ $@#"<r   rx   c                   `     e Zd ZdZd
 fd	Zd Zed        Z fdZ fdZ	d Z
d Zd	 Z xZS )Digestz7Stores a docker repository digest in a structured form.c                 v   |j                  d      }t        |      dk7  r| j                  |      |d   | _        t	        | j                         	 t        |d   |      }t        t        | #  |j                         j                         |       y # t        $ r t        t        | #  |d   |       Y y w xY w)N@r   r#   r   r^   )r_   r   ri   _digestr+   rx   r`   r   r<   r   rB   r   )r:   r   r;   rd   r"   re   s        r   r<   zDigest.__init__   s    JJsOE
5zQ&&t,,8DL$,,<a(cFD"3#4#4#6#>#>#@"P <FD"58F";<s   AB !B87B8c                     t        d|z        S )NzRDocker image name must be fully qualified (e.g.registry/repository@digest) saw: %srg   rh   s     r   ri   zDigest._validation_exception  s      BDHI J Jr   c                     | j                   S r>   )r   r@   s    r   r(   zDigest.digest  s    <<r   c                 b    t         t        |          }dj                  || j                        S )Nz{base}@{digest})rn   r(   )r`   r   rB   rl   r(   rm   s     r   rB   zDigest.__str__  s,    &(D##dkk#BBr   c                 >    t        t        t        |          d      S r   )rX   r`   r   rB   r   s    r   r   zDigest.as_repository  s     eFD13EBBr   c                     t        |      xrh t        |       t        |      k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r>   )rF   rG   r3   r   r(   rH   s     r   rJ   zDigest.__eq__  sj    K (J$u+%( MMU^^+( OOu///	(
 KK5<<')r   c                 &    | j                  |       S r>   rL   rH   s     r   rM   zDigest.__ne__$  rN   r   c                 Z    t        | j                  | j                  | j                  f      S r>   )rP   r3   r   r(   r@   s    r   rQ   zDigest.__hash__'  s     =>>r   rU   )r   r	   r
   r   r<   ri   rV   r(   rB   r   rJ   rM   rQ   ru   rv   s   @r   r   r      s@    ?<J  CC)"?r   r   c                     t         t        t        t        fD ]  }	  || d      c S  t	        d| z        # t        $ r Y *w xY w)a+  Parses the given name string.

  Parsing is done strictly; registry is required and a Tag will only be returned
  if specified explicitly in the given name string.
  Args:
    name: The name to convert.
  Returns:
    The parsed name.
  Raises:
    BadNameException: The name could not be parsed.
  Tr^   z7'%s' is not a valid Tag, Digest, Repository or Registry)r   rx   rX   r7   r   )r   	name_types     r   from_stringr   +  sY     CX6itD)) 7 	 $'+- 	. .  
s   	6	AA) r   
__future__r   r   r   ossyssix.moves.urllib.parser-   	Exceptionr   r   r%   r*   argvpathbasename_APP
USER_AGENTr?   r}   r   r    r&   r+   r5   objectr7   rX   rx   r   r   r   r   r   <module>r      s    C &  % 	 
 7y 7 ? P
% ),rww$,t3
"88F1B@# v # L7 7t5<* 5<p2?Z 2?j.r   