U
    ꥡcF!                     @   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zddl	m
Z
 W n ek
rp   ddlZ
Y nX z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   2/tmp/pip-unpacked-wheel-xq_7ditv/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   zt |}W n, tk
r8   | j|t d t Y nX |L zt|W W  5 Q R  S  tk
r   | j	|t d t Y nX W 5 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 r+   )r,   r-   r.   r(   r/   r   r   r   r(   K   s    z_Outputter.parsing_errorc                 K   s   | j | jjf | d S r+   )r,   r-   r.   validation_errorr/   r   r   r   r1   N   s    z_Outputter.validation_errorc                 K   s   | j | jjf | d S r+   )_stdoutr-   r.   validation_successr/   r   r   r   r3   Q   s    z_Outputter.validation_successN)r   r   r   attribr.   r2   r,   classmethodr   r'   r$   r(   r1   r3   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 r7   )join	tracebackformat_exceptionr:   r;   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 )Nr7   )r:   r;   	__class__r   r)   instance_patherrorr   r   r   r1   t   s
    z!_PrettyFormatter.validation_errorc                 C   s   | j j|dS )N)r    )_SUCCESS_MSGr;   r)   rF   r   r   r   r3   {   s    z#_PrettyFormatter.validation_successN)
r   r   r   r   r:   rH   r$   r(   r1   r3   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.
)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 {}: {}
<stdin>   )r;   reprr<   r   r   r   r(      s    z_PlainFormatter.parsing_errorc                 C   s   | j j||dS )N)	file_namerG   )_error_formatr;   rE   r   r   r   r1      s    z _PlainFormatter.validation_errorc                 C   s   dS )Nr=   r   rI   r   r   r   r3      s    z"_PlainFormatter.validation_successN)
r   r   r   r4   r5   rN   r$   r(   r1   r3   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    rQ   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.
    )rW   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defaultrW   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.
    )r8   rW   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)rU   rZ   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_argsrG   )r]   r   r   r   r   r`      s    r`   c                 C   s:   d}| |D ]}d}|j| |d q|s6|j| d |S )NFTrF   rG   )rF   )Ziter_errorsr1   r3   )rF   instance	validator	outputterinvalidrG   r   r   r   _validate_instance   s    rf   rK   c                 C   s   t tt| dd d S )Nr\   )r   )r%   exitrunr`   r\   r   r   r   main   s    ri   c              
      sN  t j| ||d z | d }W n tk
r8   Y dS X | d d krRt|| d< z| d | W n: tk
r } z j| d |d W Y 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}
|D ]B}z||}W n tk
r0   d}
Y nX |
t	|||	 dO }
q|
S )N)r   r   r   r[   rK   rc   ra   rT   c                    s>   zt W S  tk
r8    jdt d t Y nX d S )NrJ   r   )r&   r'   r   r(   r%   r!   r   )_rd   stdinr   r   r'     s     zrun.<locals>.loadrJ   base_uri)rm   Zreferrer)resolverr   )rF   rb   rc   rd   )
r   r   r'   r   r	   Zcheck_schemar   r1   r   rf   )r   r   r   rl   r[   rG   r'   rT   rn   rc   Z	exit_codeZeachrb   r   rk   r   rh      sX    

rh   )+__doc__r&   r   textwrapr   argparser%   r?   warnings	importlibr   ImportErrorZimportlib_metadatapkgutilr   Zpkgutil_resolve_namer4   Zjsonschema.exceptionsr   Zjsonschema.validatorsr   r	   warnDeprecationWarning	Exceptionr   sr   r   r   rQ   ArgumentParserr_   add_argumentrZ   r`   rf   argvri   r   r   rl   rh   r   r   r   r   <module>   s   )) 
  
 	