B
    4dF!                 @   s  d Z ddlmZ ddlmZ ddlZddlZddlZddlZddlZyddl	m
Z
 W n ek
rp   ddlZ
Y nX yddlmZ W n  ek
r   ddlmZ Y nX ddlZddlmZ ddlmZmZ ejd	ed
d G dd deZejG dd dZejG dd dZejG dd dZdd ZejddZ e j!dddddd e j!ddd d! e j!d"d#d$d%gd$d&d' e j!d(d)ed*d+ e j!d,d-d! e j!d.d/e
"d0d1 e j!d2d3d! d4d5 Z#d6d7 Z$ej%d8d fd9d:Z&ej'ej(ej)fd;d<Z*dS )=z"
The ``jsonschema`` command line.
    )JSONDecodeError)dedentN)metadata)resolve_name)SchemaError)RefResolvervalidator_forzThe jsonschema CLI is deprecated and will be removed in a future version. Please use check-jsonschema instead, which can be installed from https://pypi.org/project/check-jsonschema/   )
stacklevelc               @   s   e Zd ZdS )_CannotLoadFileN)__name__
__module____qualname__ r   r   [/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/jsonschema/cli.pyr   '   s   r   c               @   sX   e Zd Ze Ze Ze Zedd Z	dd Z
dd Zdd Zd	d
 Zdd ZdS )
_Outputterc             C   s:   |d dkrt |d }n|d dkr,t }| |||dS )Noutputplainerror_formatpretty)	formatterstdoutstderr)_PlainFormatter_PrettyFormatter)cls	argumentsr   r   r   r   r   r   from_arguments2   s
    z_Outputter.from_argumentsc          	   C   s   yt |}W n, tk
r8   | j|t d t Y nX |> y
t|S  tk
rv   | j	|t d t Y nX W d Q R X d S )N)pathexc_info)
openFileNotFoundErrorfilenotfound_errorsysr   r   jsonloadr   parsing_error)selfr   filer   r   r   r%   :   s    
z_Outputter.loadc             K   s   | j | jjf | d S )N)_stderrwrite
_formatterr"   )r'   kwargsr   r   r   r"   H   s    z_Outputter.filenotfound_errorc             K   s   | j | jjf | d S )N)r)   r*   r+   r&   )r'   r,   r   r   r   r&   K   s    z_Outputter.parsing_errorc             K   s   | j | jjf | d S )N)r)   r*   r+   validation_error)r'   r,   r   r   r   r-   N   s    z_Outputter.validation_errorc             K   s   | j | jjf | d S )N)_stdoutr*   r+   validation_success)r'   r,   r   r   r   r/   Q   s    z_Outputter.validation_successN)r   r   r   attribr+   r.   r)   classmethodr   r%   r"   r&   r-   r/   r   r   r   r   r   +   s   r   c               @   s8   e Zd ZedZdZdd Zdd Zdd Zd	d
 Z	dS )r   z`        ===[{type}]===({path})===

        {body}
        -----------------------------
        z===[SUCCESS]===({path})===
c             C   s   | j j|dd|dS )Nr!   z{!r} does not exist.)r   typebody)
_ERROR_MSGformat)r'   r   r   r   r   r   r"   b   s    z#_PrettyFormatter.filenotfound_errorc             C   s2   |\}}}d t|||}| jj||j|dS )N )r   r3   r4   )join	tracebackformat_exceptionr5   r6   r   )r'   r   r   exc_type	exc_valueexc_tracebackZ	exc_linesr   r   r   r&   i   s    
z_PrettyFormatter.parsing_errorc             C   s   | j j||jj|dS )N)r   r3   r4   )r5   r6   	__class__r   )r'   instance_patherrorr   r   r   r-   t   s    z!_PrettyFormatter.validation_errorc             C   s   | j j|dS )N)r   )_SUCCESS_MSGr6   )r'   r?   r   r   r   r/   {   s    z#_PrettyFormatter.validation_successN)
r   r   r   r   r5   rA   r"   r&   r-   r/   r   r   r   r   r   U   s   r   c               @   s4   e Zd Ze Zdd Zdd Zdd Zdd Z	d	S )
r   c             C   s
   d |S )Nz{!r} does not exist.
)r6   )r'   r   r   r   r   r   r"      s    z"_PlainFormatter.filenotfound_errorc             C   s    d |dkrdnt||d S )NzFailed to parse {}: {}
z<stdin>   )r6   repr)r'   r   r   r   r   r   r&      s    z_PlainFormatter.parsing_errorc             C   s   | j j||dS )N)	file_namer@   )_error_formatr6   )r'   r?   r@   r   r   r   r-      s    z _PlainFormatter.validation_errorc             C   s   dS )Nr7   r   )r'   r?   r   r   r   r/      s    z"_PlainFormatter.validation_successN)
r   r   r   r0   r1   rE   r"   r&   r-   r/   r   r   r   r   r      s
   r   c             C   s   d| krd|  } t | S )N.zjsonschema.)r   )namer   r   r   _resolve_name_with_default   s    rH   zJSON Schema Validation CLI)descriptionz-iz
--instanceappend	instancesz
        a path to a JSON instance (i.e. filename.json) to validate (may
        be specified multiple times). If no instances are provided via this
        option, one will be expected on standard input.
    )actiondesthelpz-Fz--error-formata  
        the format to use for each validation error message, specified
        in a form suitable for str.format. This string will be passed
        one formatted object named 'error' for each ValidationError.
        Only provide this option when using --output=plain, which is the
        default. If this argument is unprovided and --output=plain is
        used, a simple default representation will be used.
    )rN   z-oz--outputr   r   z
        an output format to use. 'plain' (default) will produce minimal
        text with one line for each error, while 'pretty' will produce
        more detailed human-readable output on multiple lines.
    )choicesdefaultrN   z-Vz--validatorz
        the fully qualified object name of a validator to use, or, for
        validators that are registered with jsonschema, simply the name
        of the class.
    )r3   rN   z
--base-uriz
        a base URI to assign to the provided schema, even if it does not
        declare one (via e.g. $id). This option can be used if you wish to
        resolve relative references to a particular URI (or local path)
    z	--versionversionZ
jsonschema)rL   rQ   schemaz=the path to a JSON Schema to validate with (i.e. schema.json)c             C   sX   t tj| pdgd}|d dkr4|d r4td|d dkrT|d d krTd|d< |S )Nz--help)argsr   r   r   z3--error-format can only be used with --output plainz"{error.instance}: {error.message}
)varsparser
parse_argsr@   )rS   r   r   r   r   rV      s    rV   c             C   s>   d}x$| |D ]}d}|j| |d qW |s:|j| d |S )NFT)r?   r@   )r?   )Ziter_errorsr-   r/   )r?   instance	validator	outputterinvalidr@   r   r   r   _validate_instance   s    r[   rB   c             C   s   t tt| dd d S )N)rS   )r   )r#   exitrunrV   )rS   r   r   r   main   s    r^   c          
      sJ  t j| ||d y | d }W n tk
r6   dS X | d d krPt|| d< y| d | W n4 tk
r } z j| d |d dS d }~X Y nX | d r j| d  }}n fdd}d	g}| d
 d k	rt| d
 |dnd }| d ||d}	d}
xJ|D ]B}y||}W n tk
r*   d}
Y nX |
t	|||	 dO }
q W |
S )N)r   r   r   rR   rB   rX   )r?   r@   rK   c                s<   y
t S  tk
r6    jdt d t Y nX d S )Nz<stdin>)r   r   )r$   r%   r   r&   r#   r   r   )_)rY   stdinr   r   r%     s    
zrun.<locals>.loadz<stdin>base_uri)ra   Zreferrer)resolverr   )r?   rW   rX   rY   )
r   r   r%   r   r   Zcheck_schemar   r-   r   r[   )r   r   r   r`   rR   r@   r%   rK   rb   rX   	exit_codeZeachrW   r   )rY   r`   r   r]      sF     

r]   )+__doc__r$   r   textwrapr   argparser#   r9   warnings	importlibr   ImportErrorimportlib_metadatapkgutilr   Zpkgutil_resolve_namer0   Zjsonschema.exceptionsr   Zjsonschema.validatorsr   r   warnDeprecationWarning	Exceptionr   sr   r   r   rH   ArgumentParserrU   add_argumentrQ   rV   r[   argvr^   r   r   r`   r]   r   r   r   r   <module>   sx   **