a
    d3                     @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlZd dlZejed	ZG d
d deZG dd deZG dd deZG dd deZi fddZdS )    )OrderedDict)	JSONValue)LocalRefResolver)
strategies)
descenders)SchemaErrorJSONMergeError)Draft4ValidatorN)namec                   @   s<   e Zd ZejejejgZdd Zdd Z	dd Z
dd Zd	S )
Walkc                 C   s2   || _ || _|jj| _d| _dd | jD | _d S )Nc                 S   s   g | ]
}| qS  r   ).0clsr   r   [/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/jsonmerge/__init__.py
<listcomp>       z!Walk.__init__.<locals>.<listcomp>)mergermerge_options	validatorresolverlvl
DESCENDERSr   )selfr   r   r   r   r   __init__   s
    
zWalk.__init__c                 C   s
   d| j  S )Nz  )r   r   r   r   r   _indent    s    zWalk._indentc                 C   s,   t |tsJ | rdS | jj|j|S )z*Check if instance if a specific JSON type.F)
isinstancer   is_undefr   r   is_typeval)r   instancetyper   r   r   r   #   s    zWalk.is_typec              
   G   s  t |tsJ |  jd7  _td|  |jf  | sx| j	|j}|j
|u sZJ W d    n1 sn0    Y  dd i}| s| jD ]6}| j||g|R  }|d ur|  jd8  _|  S q|j
d}| j||j
dfD ]}|d ur|| qnd }|d u r,| j|g|R i |}td|  |f  z| jj| }	W n" tyt   td| |Y n0 z| j|	|g|R i |}W n: ty }
 z |
jd u r||
_ W Y d }
~
n
d }
~
0 0 |  jd8  _|S )N   zdescend: %sschema %smetamergeStrategymergeOptionszdescend: %sinvoke strategy %szUnknown strategy '%s')r   r   r   logdebugr   refr   r   	resolvingr    r   call_descendergetr   updatedefault_strategyr   r   KeyErrorr   workr   Zstrategy_name)r   schemaargsresolvedopts	descenderrvr
   vstrategyexcr   r   r   descend,   sF    ,





zWalk.descendN)__name__
__module____qualname__r   ZRefZOneOfZ
AnyOfAllOfr   r   r   r   r:   r   r   r   r   r      s   	r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
WalkInstancec                 C   s.   t | || td|j| _td|j| _d S )N )r   r   r   r    base_resolverhead_resolver)r   r   baseheadr   r   r   r   r   a   s    zWalkInstance.__init__c                 K   s,   t d|  f  | |dr$dS dS d S )Nz       : %sdefault strategyobjectobjectMerge	overwrite)r'   r(   r   r   )r   r1   rB   rC   kwargsr   r   r   r.   f   s    zWalkInstance.default_strategyc                 C   s   | | |||S N)Zdescend_instance)r   r5   r1   rB   rC   r   r   r   r+   m   s    zWalkInstance.call_descenderc                 K   s   t |tsJ t |tsJ t |ts*J td|  |j|jf  | s| j|j}|j	|u slJ W d    n1 s0    Y  | s| j
|j}|j	|u sJ W d    n1 s0    Y  |j| |||fd| jji|}t |tsJ |S )Nzwork   : %sbase %s, head %sobjclass_menu)r   r   r'   r(   r   r)   r   r@   r*   r    rA   merger   rI   )r   r8   r1   rB   rC   rG   r3   r6   r   r   r   r0   p   s    ,, zWalkInstance.workN)r;   r<   r=   r   r.   r+   r0   r   r   r   r   r>   _   s   r>   c                   @   sN   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd Zdd Z	dd Z
dS )
WalkSchemac                 C   s   | j j| jjddkS )Nidr?   )r   Zbase_urir   r1   r,   r   r   r   r   is_base_context   s    zWalkSchema.is_base_contextc                 C   s   |S rH   r   )r   r1   r   r   r   resolve_refs   s    zWalkSchema.resolve_refsc                 C   s@   t |}|jjj| jj t|i d}|jt|ddj}|S )N)r   T)resolve_base)	Mergerr   r   storer-   rK   _resolve_refsr   r    )r   Z	subschemamwr   r   r   resolve_subschema_option_refs   s
    z(WalkSchema.resolve_subschema_option_refsFc                    s   t |tsJ |s  r|S  |drDt fdd|D |jS  |dr|jd}|d ur j| } 	t||W  d    S 1 s0    Y  qtt
 fdd| D |jS n|S d S )Narrayc                    s   g | ]}  |jqS r   rR   r    )r   r7   r   r   r   r      r   z,WalkSchema._resolve_refs.<locals>.<listcomp>rD   z$refc                 3   s"   | ]\}}|  |jfV  qd S rH   rW   )r   kr7   r   r   r   	<genexpr>   r   z+WalkSchema._resolve_refs.<locals>.<genexpr>)r   r   rM   r   r)   r    r,   r   r*   rR   dictitems)r   r1   rO   r)   r3   r   r   r   rR      s    0$zWalkSchema._resolve_refsc                 C   s6   d}|D ]}||j v r dS q|j ddkr2dS dS )N)ZmaxPropertiesZminPropertiesrequiredZadditionalPropertiesZ
propertiesZpatternPropertiesZdependenciesTr"   rD   F)r    r,   )r   r1   ZobjonlyrX   r   r   r   schema_is_object   s    	
zWalkSchema.schema_is_objectc                 K   s   |  |rdS dS d S )NrE   rF   )r]   )r   r1   rG   r   r   r   r.      s    
zWalkSchema.default_strategyc                 C   s   | | |S rH   )Zdescend_schema)r   r5   r1   r   r   r   r+      s    zWalkSchema.call_descenderc                 K   sb   t |tsJ tt|j|j}|jdd  |jdd  |j| |fi |}t |ts^J |S )Nr%   r&   )r   r   rZ   r    r)   pop
get_schema)r   r8   r1   rG   r6   r   r   r   r0      s    zWalkSchema.workN)F)r;   r<   r=   rM   rN   rU   rR   r]   r.   r+   r0   r   r   r   r   rK      s   
rK   c                   @   sl   e Zd Ze e e e e e	 e
 dZdddefddZdddZdd	d
ZdddZdS )rP   )discardrF   versionappendrE   ZarrayMergeByIdZarrayMergeByIndexr   rZ   Nc                 C   s   || _ t|dr"tj||jd}n
t|}|||d| _t| j| _| j	| tt
d| _|rn| j	| | j| | jd< dS )a  Create a new Merger object.

        schema -- JSON schema to use when merging.
        strategies -- Any additional merge strategies to use during merge.
        objclass_def -- Name of the default class for JSON objects.
        objclass_menu -- Any additional classes for JSON objects.
        validatorclass -- JSON Schema validator class.

        strategies argument should be a dict mapping strategy names to
        instances of Strategy subclasses.

        objclass_def specifies the default class used for JSON objects when one
        is not specified in the schema. It should be 'dict' (dict built-in),
        'OrderedDict' (collections.OrderedDict) or one of the names specified
        in the objclass_menu argument. If not specified, 'dict' is used.

        objclass_menu argument should be a dictionary that maps a string name
        to a function or class that will return an empty dictionary-like object
        to use as a JSON object. The function must accept either no arguments
        or a dictionary-like object.

        validatorclass argument can be used to supply a validator class from
        jsonschema. This can be used for example to specify which JSON Schema
        draft version will be used during merge.
        ID_OF)Zid_of)r   )rZ   r   _defaultN)r1   hasattrr   Zfrom_schemarc   r   rZ   
STRATEGIESr   r-   r   rI   )r   r1   r   Zobjclass_defrI   Zvalidatorclassr   r   r   r   r      s    

zMerger.__init__c                 C   sH   |du r.t | jdr"| j|}n|dd}| jjj||ff dS )a  Cache an external schema reference.

        schema -- JSON schema to cache
        uri -- Optional URI for the schema

        If the JSON schema for merging contains external references, they will
        be fetched using HTTP from their respective URLs. Alternatively, this
        method can be used to pre-populate the cache with any external schemas
        that are already known.

        If URI is omitted, it is obtained from the schema itself ('id' or '$id'
        keyword, depending on the JSON Schema draft used)
        Nrc   rL   r?   )re   r   rc   r,   r   rQ   r-   )r   r1   urir   r   r   cache_schema  s
    zMerger.cache_schemac                 C   sz   t | j}|du rt dd}nt |}t |}|du r:i }|dur\tdtd d|i|d< t| |||}||||jS )a%  Merge head into base.

        base -- Old JSON document you are merging into.
        head -- New JSON document for merging into base.
        merge_options -- Optional dictionary with merge options.

        Keys of merge_options must be names of the strategies. Values must be
        dictionaries of merge options as in the mergeOptions schema element.
        Options in merge_options are applied to all instances of a strategy.
        Values in schema override values given in merge_options.

        Returns an updated base document
        NT)ZundefzW'meta' argument is deprecated. Please use merge_options={'version': {'metadata': ...}}.   metadatara   )r   r1   warningswarnDeprecationWarningr>   r:   r    )r   rB   rC   r$   r   r1   walkr   r   r   rJ   +  s    
zMerger.mergec                 C   sN   |du ri }|dur.t dtd d|i|d< t| j}t| |}||jS )a  Get JSON schema for the merged document.

        merge_options -- Optional dictionary with merge options.

        Keys of merge_options must be names of the strategies. Values must be
        dictionaries of merge options as in the mergeOptions schema element.
        Options in merge_options are applied to all instances of a strategy.
        Values in schema override values given in merge_options.

        Returns a JSON schema for documents returned by the
        merge() method.
        Nz]'meta' argument is deprecated. Please use merge_options={'version': {'metadataSchema': ...}}.ri   ZmetadataSchemara   )rk   rl   rm   r   r1   rK   r:   r    )r   r$   r   r1   rn   r   r   r   r_   Q  s    

zMerger.get_schema)N)NN)NN)r;   r<   r=   r   ZDiscardZ	OverwriteVersionZAppendZObjectMergeZArrayMergeByIdZArrayMergeByIndexrf   r	   r   rh   rJ   r_   r   r   r   r   rP      s   

.

&rP   c                 C   s   t |}|| |S )a  Merge two JSON documents using strategies defined in schema.

    base -- Old JSON document you are merging into.
    head -- New JSON document for merging into base.
    schema -- JSON schema to use when merging.

    Merge strategy for each value can be specified in the schema
    using the "mergeStrategy" keyword. If not specified, default
    strategy is to use "objectMerge" for objects and "overwrite"
    for all other types.
    )rP   rJ   )rB   rC   r1   r   r   r   r   rJ   n  s    rJ   )collectionsr   Zjsonmerge.jsonvaluer   Zjsonmerge.resolverr   Z	jsonmerger   r   Zjsonmerge.exceptionsr   r   Zjsonschema.validatorsr	   loggingrk   	getLoggerr;   r'   rD   r   r>   rK   rP   rJ   r   r   r   r   <module>   s   O%U 