o
    )Ti                     @   s   d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZ dd	lmZmZmZ dd
lmZ dgZG dd deZdS )zAction to support jsonschemas.    N)OptionalUnion   )_is_action_value_list)Actionparser_context)get_loader_exceptions
load_value)remove_meta)get_jsonschema_exceptionsimport_jsonschemapyyaml_available)parse_value_or_configActionJsonSchemac                       sb   e Zd ZdZ	ddeeeef  dedef fddZ	d	d
 Z
dd Zedd Zdd Z  ZS )r   z:Action to parse option as JSON validated by a JSON Schema.NTschemaenable_path	with_metac                    s  |dur\t |trAtrdnd}t|d% zt|}W n t|y1 } ztd| |d}~ww W d   n1 s<w   Y  tdd }|| | 	||| _
|| _|| _dS d|vrdtd	|d| _
|d
| _|d| _t jdi | dS )az  Initializer for ActionJsonSchema instance.

        Args:
            schema: Schema to validate values against.
            enable_path: Whether to try to load JSON from path.
            with_meta: Whether to include metadata.

        Raises:
            ValueError: If a parameter is invalid.
            jsonschema.exceptions.SchemaError: If the schema is invalid.
        Nyamljson)load_value_modezProblems parsing schema: r   r   
_validatorz!Expected schema keyword argument._enable_path
_with_meta )
isinstancestrr   r   r	   r   
ValueErrorr   check_schema"_extend_jsonvalidator_with_defaultr   r   r   popsuper__init__)selfr   r   r   kwargsmodeexjsonvalidator	__class__r   L/home/ubuntu/.local/lib/python3.10/site-packages/jsonargparse/_jsonschema.pyr!      s.   


zActionJsonSchema.__init__c                 O   s   t |dkrF| j|d< | j|d< | j|d< d|v r9t|d tr9d|d v r9ddl}|d |j| jjdd	 |d< |	d
t
}|di |S | |d }| jsTt|}t|d | j| dS )zParses an argument validating against the corresponding JSON Schema.

        Raises:
            TypeError: If the argument is not valid.
        r   r   r   r   helpz%sNT)	sort_keys_class_type   r   r   )lenr   r   r   r   r   r   dumpsr   r   r   _check_typer
   setattrdest)r"   argsr#   r   
class_typevalr   r   r)   __call__:   s   


"zActionJsonSchema.__call__c           	      C   s  t | }|s	|g}t|D ]m\}}z:t|| jd\}}t|tr)d|v r)|dnd }| j| |d ur9||d< t|trF|d urF||d< |||< W q t	t
ft  t  yz } z|s_dndt|d  }t	d| j d| d| |d }~ww |r|S |d	 S )
N)r   __path__ z	 element r   zParser key ""z: r   )r   	enumerater   r   r   dictr   r   validate	TypeErrorr   r   r   r   r2   )	r"   valueislistnumr5   fpath	path_metar%   elemr   r   r)   r0   P   s&    zActionJsonSchema._check_typec                    s6   | j d  fdd}tdd   j| d|iS )zCExtends a json schema validator so that it fills in default values.
propertiesc                 3   sh    d}| |||D ]}t | jjrd}|V  q
|r0| D ]\}}d|v r/|||d  qd S d S )NTFdefault)r   
exceptionsValidationErroritems
setdefault)	validatorrD   instancer   valid
validationprop	subschema
jsonschemavalidate_propertiesr   r)   set_defaultsh   s   zIActionJsonSchema._extend_jsonvalidator_with_default.<locals>.set_defaultsr   r   )
VALIDATORSr   
validatorsextend)validator_classrS   r   rP   r)   r   c   s   
z3ActionJsonSchema._extend_jsonvalidator_with_defaultc              	   K   s   t ttjd dkrXddlm} z| dkrt | j	t
| d}W n tft  t  y8   d}Y nw dd	l}|j| jjd
dddd}|d| d7 }|||S d	S )z=Used by argcomplete, validates value and shows expected type.	COMP_TYPE?r   )argcomplete_warn_redraw_promptr8   zvalue already valid, zvalue not yet valid, r   Nr-   T)indentr+   
z
  z,required to be valid according to schema:
  )chrintosenviron_completionsrZ   stripr   r   r<   r	   r   r   r   r/   r   replace)r"   prefixr#   rZ   msgr   r   r   r   r)   	completerv   s   
zActionJsonSchema.completer)NTT)__name__
__module____qualname____doc__r   r   r   r;   boolr!   r6   r0   staticmethodr   rf   __classcell__r   r   r'   r)   r      s    #
)rj   r_   typingr   r   _actionsr   _commonr   r   _loaders_dumpersr   r	   
_namespacer
   
_optionalsr   r   r   _utilr   __all__r   r   r   r   r)   <module>   s    