U
    *e3                     @   sf   d dl mZ d dlmZ d dlmZ G dd deZG dd deZG dd	 d	eZG d
d dZ	dS )   )UserFileException)OLDEST_SUPPORTED_MINOR)	toml_loadc                       s&   e Zd ZdZdd fdd
Z  ZS )PyProjectExceptionz0 An exception related to a pyproject.toml file. Ndetailc                   s   t  jd||d dS ) Initialise the exception. pyproject.tomlr   Nsuper__init__)selftextr   	__class__ 1lib/python3.8/site-packages/sipbuild/pyproject.pyr       s    zPyProjectException.__init____name__
__module____qualname____doc__r   __classcell__r   r   r   r   r      s   r   c                       s(   e Zd ZdZddd fdd
Z  ZS )PyProjectOptionExceptionzE An exception related to a specific option of a pyproject.toml file. N)section_namer   c                   s*   |dkrd}t  jd||||d dS )r   Nztool.sip.projectz'{0}.{1}': {2}r   )r   r   format)r   namer   r   r   r   r   r   r   )   s
    z!PyProjectOptionException.__init__r   r   r   r   r   r   &   s   r   c                       s&   e Zd ZdZdd fdd
Z  ZS )!PyProjectUndefinedOptionExceptionzK An exception related to an undefined option of a pyproject.toml file.
    Nr   c                   s   t  j|d|d dS )r   zmust be definedr   Nr
   )r   r   r   r   r   r   r   7   s    z*PyProjectUndefinedOptionException.__init__r   r   r   r   r   r   3   s   r   c                   @   s:   e Zd ZdZdd Zdd Zdddd	Zed
d ZdS )	PyProjectz+ Encapsulate a parsed pyproject.toml file. c              
   C   s^   d| _ ztd| _W nD tk
r.   d| _ Y n, tk
rX } zt|| _ W 5 d}~X Y nX dS )z Initialise the object. Nr	   z.there is no such file in the current directory)
toml_errorr   
_pyprojectFileNotFoundError	Exceptionstr)r   er   r   r   r   @   s    
zPyProject.__init__c           
      C   s\  | j rtdddS t }d}d}d}d}| jddd D ]\}}| }|dkrt|tsjt|d	d
d|dkr|dd	 stdd
|d
d|}q|dkr|}q|dkr|}q|dkr|}n6t|tr|n|g}|D ]}	t|	tst|dd
dq|||< q:|dkrtdd
d|dkr.d|d< |dkr@d|d< |dkrXd
t|d< |S )z1 Return a dict containing the PEP 566 meta-data. unknownz0.1)r   versionNztool.sip.metadataTrequired)r   r'   metadata-versionrequires-pythonzmust be a stringztool.sipr   r   -_z '{0}' is an invalid project namer'   r*   r+   z%must be a string or a list of stringsz2.1z>=3.{})r    dictget_sectionitemslower
isinstancer$   r   replaceisidentifierr   listr   r   )
r   Zmetadatar   r'   Zmetadata_versionZrequires_pythonZmd_nameZmd_valueZ
value_listvaluer   r   r   get_metadataL   sd    






zPyProject.get_metadataFr(   c             	   C   st   | j r
dS | j}|dD ]<}z|| }W q tk
rT   |rLtd|Y  dS X q| |sptd||S )z* Return a sub-section with a dotted name. N.zthe '[{0}]' section is missingz'{0}' is not a section)r    r!   splitKeyErrorr   r   _is_section)r   r   r)   Zsectionpartr   r   r   r/      s&    
zPyProject.get_sectionc                 C   s   t | ttfS )z6 Returns True if a section value is itself a section. )r2   r.   r5   )r6   r   r   r   r;      s    zPyProject._is_sectionN)	r   r   r   r   r   r7   r/   staticmethodr;   r   r   r   r   r   =   s   Br   N)

exceptionsr   Zpy_versionsr   Ztomlr   r   r   r   r   r   r   r   r   <module>   s   	
