ó
‹'=[c           @  sM  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 d  d l m	 Z
 Wn/ e k
 r¡ Z d Z e e e ƒ e ƒ ‚ n Xd  d l m Z i  Z d „  Z d „  Z d d e d	 „ Z d
 „  Z d d d d „ Z d „  Z d Z d Z d „  Z d e f d „  ƒ  YZ d „  Z d d d e d „ Z d S(   iÿÿÿÿ(   t   print_functionN(   t   ValidationError(   t   Draft4Validators”   

    Jupyter notebook format depends on the jsonschema package:

        https://pypi.python.org/pypi/jsonschema

    Please install it first.
    (   t   import_itemc         C  s   t  |  t ƒ rZ x‡ |  j ƒ  D]7 \ } } | d k r= t } n t | ƒ } | |  | <q Wn? t  |  t ƒ r™ x- t |  ƒ D] \ } } t | ƒ |  | <qv Wn  |  S(   s    relax any `additionalProperties`t   additionalProperties(   t
   isinstancet   dictt   itemst   Truet   _relax_additional_propertiest   listt	   enumerate(   t   objt   keyt   valuet   i(    (    s1   lib/python2.7/site-packages/nbformat/validator.pyR	      s    	c         C  sD   |  d d d j  i d d 6ƒ |  d d d j  i d d 6ƒ |  S(   Nt   definitionst   cellt   oneOfs   #/definitions/unrecognized_cells   $reft   outputs!   #/definitions/unrecognized_output(   t   append(   t   schema(    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   _allow_undefined,   s
    c         C  s%  |  d k r% d d l m } | }  n  t d |  ƒ } t | d d ƒ } | d k r\ | } n  |  | f } | t k rÓ y t | ƒ } Wn t k
 r˜ d SX| | k  rÀ t | ƒ } t	 | ƒ } n  t
 | ƒ t | <n  | ry t | ƒ } Wn t k
 rý d SXt | ƒ } t
 | ƒ t | <n  t | S(   s%   Load the JSON schema into a Validatori   (   t   current_nbformats   nbformat.v%st   nbformat_minori    N(   t   Nonet    R   R   t   getattrt
   validatorst   _get_schema_jsont   AttributeErrorR	   R   t	   Validator(   t   versiont   version_minort   relax_add_propsR   t   vt   current_minort   version_tuplet   schema_json(    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   get_validator5   s2    		c         C  sO   t  j j t  j j |  j ƒ |  j ƒ } t | ƒ  } t j | ƒ } Wd QX| S(   sP   
    Gets the json schema from a given imported library a nbformat version.
    N(	   t   ost   patht   joint   dirnamet   __file__t   nbformat_schemat   opent   jsont   load(   R#   t   schema_patht   fR&   (    (    s1   lib/python2.7/site-packages/nbformat/validator.pyR   ^   s    'c         C  s4   y t  |  | | | ƒ Wn t k
 r+ t SXt Sd S(   s  Checks whether the given notebook JSON conforms to the current
    notebook format schema. Returns True if the JSON is valid, and
    False otherwise.

    To see the individual errors that were encountered, please use the
    `validate` function instead.
    N(   t   validateR   t   FalseR   (   t   nbjsont   refR    R!   (    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   isvalidg   s
    c         C  s%   |  s
 d Sd d j  d „  |  Dƒ ƒ S(   sÚ   
    (from jsonschema._utils.format_as_index, copied to avoid relying on private API)

    Construct a single string containing indexing operations for the indices.

    For example, [1, 2, "foo"] -> [1][2]["foo"]
    R   s   [%s]s   ][c         s  s   |  ] } t  | ƒ Vq d  S(   N(   t   repr(   t   .0t   index(    (    s1   lib/python2.7/site-packages/nbformat/validator.pys	   <genexpr>   s    (   R*   (   t   indices(    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   _format_as_indexv   s    	i   i@   c         C  sv  t  |  t ƒ rÌ d „  t |  j ƒ  ƒ t  Dƒ } t  | j d ƒ t ƒ re d t |  d ƒ g | d <n  t  | j d ƒ t ƒ r› d t |  d ƒ g | d <n  t |  ƒ t k rÈ d t |  ƒ t | d <n  | St  |  t ƒ r2g  |  t  D] } t | ƒ ^ qæ } t |  ƒ t k r.| j d t |  ƒ t ƒ n  | St  |  t	 ƒ rn|  t
  } t |  ƒ t
 k rj| d 7} n  | S|  Sd	 S(
   s†   Truncate objects for use in validation tracebacks

    Cell and output lists are squashed, as are long strings, lists, and dicts.
    c         S  s%   i  |  ] \ } } t  | ƒ | “ q S(    (   t   _truncate_obj(   R9   t   kR#   (    (    s1   lib/python2.7/site-packages/nbformat/validator.pys
   <dictcomp>Œ   s   	 t   cellss   ...%i cells...t   outputss   ...%i outputs...s   %i keys truncateds   ...s   ...%i items truncated...N(   R   R   R
   R   t   _ITEM_LIMITt   gett   lenR=   R   t   strt
   _STR_LIMIT(   R   t	   truncatedt   item(    (    s1   lib/python2.7/site-packages/nbformat/validator.pyR=   †   s(     #
t   NotebookValidationErrorc           B  sD   e  Z d  Z d d „ Z d „  Z d „  Z e j d k rB e Z	 n  RS(   sc   Schema ValidationError with truncated representation

    to avoid massive verbose tracebacks.
    c         C  s4   | |  _  t |  j  d | ƒ |  _ |  j  j |  _ d  S(   NR6   (   t   originalR   R6   t   message(   t   selfRI   R6   (    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   __init__§   s    	c         C  s   t  |  j | ƒ S(   N(   R   RI   (   RK   R   (    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   __getattr__¬   s    c      
   C  s‚   |  j  } t | j ƒ } d j | j d d | j |  j p< d t t | j	 ƒ d  ƒ f d d t | j
 ƒ t j | d d ƒg ƒ S(	   sb   Custom str for validation errors

        avoids dumping full schema and notebook to logs
        u   
u    u   Failed validating %r in %s%s:t   notebookiÿÿÿÿu   On instance%s:t   widthiN   (   RI   R=   t   instanceR*   RJ   t	   validatorR6   R<   R
   t   relative_schema_patht   relative_patht   pprintt   pformat(   RK   t   errorRP   (    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   __unicode__¯   s    	i   N(   i   (
   t   __name__t
   __module__t   __doc__R   RL   RM   RW   t   syst   version_infot   __str__(    (    (    s1   lib/python2.7/site-packages/nbformat/validator.pyRH   ¢   s   		c         C  s%  |  j  d } d } | j d ƒ rt |  j t ƒ ry d |  j k rW |  j d d } qy d |  j k ry |  j d } qy n  | ry  t |  j | d | d | ƒWqt k
 r} |  j j	 | j ƒ |  j | _ t
 | | | ƒ } | j d k rý | | _ n  | St k
 rqXqn  t |  | ƒ S(	   sÎ   Get better ValidationError on oneOf failures

    oneOf errors aren't informative.
    if it's a cell type or output_type error,
    try validating directly based on the type for a better error message
    iÿÿÿÿt   Oft	   cell_typet   _cellt   output_typeR    R!   N(   R1   R   t   endswithR   RP   R   R3   R   RS   t   extendt   better_validation_errorR6   t	   ExceptionRH   (   RV   R    R!   R   R6   t	   sub_errort   better(    (    s1   lib/python2.7/site-packages/nbformat/validator.pyRd   Æ   s0    	
c         C  sÈ   | d k r1 d d l m } | |  ƒ \ } } n  t | | d | ƒ} | d k rj t j d | t ƒ d Sy2 | rŽ | j |  i d | d 6ƒ S| j |  ƒ SWn% t k
 rÃ } t	 | | | ƒ ‚ n Xd S(   s‰   Checks whether the given notebook JSON conforms to the current
    notebook format schema.

    Raises ValidationError if not valid.
    i   (   t   get_versionR"   s&   No schema for validating v%s notebooksNs   #/definitions/%ss   $ref(
   R   t   readerRh   R'   t   warningst   warnt   UserWarningR3   R   Rd   (   R5   R6   R    R!   R"   Rh   RQ   t   e(    (    s1   lib/python2.7/site-packages/nbformat/validator.pyR3   í   s    (    t
   __future__R    R/   R(   RT   R[   Rj   t
   jsonschemaR   R   R   t   ImportErrorRm   t   verbose_msgRD   t   ipython_genutils.importstringR   R   R	   R   R   R4   R'   R   R7   R<   RA   RE   R=   RH   Rd   R3   (    (    (    s1   lib/python2.7/site-packages/nbformat/validator.pyt   <module>   s2   			)				$	'