U
    +5i}                     @  s   d dl mZ d dlZd dlmZmZ ddlmZmZ dddgZ	d	d
ddZ
edZedeZG dd deZdddddZdS )    )annotationsN)NewTypecast   )
EXCEPTIONSLICENSESInvalidLicenseExpressionNormalizedLicenseExpressioncanonicalize_license_expressionz	list[str])returnc                   C  s   t S )N)__all__ r   r   ?/tmp/pip-unpacked-wheel-xj899fla/packaging/licenses/__init__.py__dir__/   s    r   z^[A-Za-z0-9.-]*$c                   @  s   e Zd ZdZdS )r   a<  Raised when a license-expression string is invalid

    >>> from packaging.licenses import canonicalize_license_expression
    >>> canonicalize_license_expression("invalid")
    Traceback (most recent call last):
        ...
    packaging.licenses.InvalidLicenseExpression: Invalid license expression: 'invalid'
    N)__name__
__module____qualname____doc__r   r   r   r   r   <   s   str)raw_license_expressionr   c                   sH  | sd| }t || dddd}d  fdd| D }| }| }g }|D ]z}|d	krt|d
 q\|dkr|d q\|dkr|r|d dks|dkr|r|d dkrd| }t |q\|| q\d|}zt|dd W n* tk
r   d| }t |dY nX g }|D ]}|d	krF||  q&|r|d dkr|t	krvd|}t ||t	| d  n|
dr|dd }	d}
n|}	d}
|	drt|	sd|	}t ||||	 |
  n2|	tkr
d|	}t ||t|	 d |
  q&d|}td|ddddS )a  
    This function takes a valid License-Expression, and returns the normalized
    form of it.

    The return type is typed as :class:`NormalizedLicenseExpression`. This
    allows type checkers to help require that a string has passed through this
    function before use.

    :param str raw_license_expression: The License-Expression to canonicalize.
    :raises InvalidLicenseExpression: If the License-Expression is invalid due to an
        invalid/unknown license identifier or invalid syntax.

    .. doctest::

        >>> from packaging.licenses import canonicalize_license_expression
        >>> canonicalize_license_expression("mit")
        'MIT'
        >>> canonicalize_license_expression("mit and (apache-2.0 or bsd-2-clause)")
        'MIT AND (Apache-2.0 OR BSD-2-Clause)'
        >>> canonicalize_license_expression("(mit")
        Traceback (most recent call last):
          ...
        InvalidLicenseExpression: Invalid license expression: '(mit'
        >>> canonicalize_license_expression("Use-it-after-midnight")
        Traceback (most recent call last):
          ...
        InvalidLicenseExpression: Unknown license: 'Use-it-after-midnight'
    zInvalid license expression: (z ( )z ) LicenseRef-c                   s8   i | ]0}|     r|  d |t d  qS )r   N)lower
startswithlen).0refZlicenseref_prefixr   r   
<dictcomp>n   s    z3canonicalize_license_expression.<locals>.<dictcomp>>   andorr   withr   Falser"   r!   >   r    r!   r     evalNZWITHzUnknown license exception: id+zlicenseref-zInvalid licenseref: zUnknown license: r	   z( z ))r   replacesplitr   appendjoincompileSyntaxErrorupperr   endswithr   license_ref_allowedmatchr   r   )r   messageZlicense_expressionZlicense_refstokensZpython_tokenstokenZpython_expressionZnormalized_tokensZfinal_tokensuffixZnormalized_expressionr   r   r   r
   G   s    














)
__future__r   retypingr   r   Z_spdxr   r   r   r   r.   r2   r   r	   
ValueErrorr   r
   r   r   r   r   <module>    s   

