B w1`G@s~dZddlZddlZddlZddlmZddlmZddl m Z ddl m Z dd Z d d Zd d ZddZGdddZdS)z JSON Schema URI resolution scopes and dereferencing https://tools.ietf.org/id/draft-zyp-json-schema-04.html#rfc.section.7 Code adapted from https://github.com/Julian/jsonschema N)parse)unquote)urlopen)JsonSchemaDefinitionExceptioncCs|d|ddS)z9 Originally ID was `id` and since v7 it's `$id`. z$idid)get)schemar ?/tmp/pip-unpacked-wheel-vlg95h98/fastjsonschema/ref_resolver.pyget_idsr cCs~|d}|rt|dng}xX|D]P}|dddd}t|trV|t|}q&||krh||}q&td|q&W|S)zk Return definition from path. Path is unescaped according https://tools.ietf.org/html/rfc6901 /z~1z~0~zUnresolvable ref: {}) lstriprsplitreplace isinstancelistintrformat)r fragmentpartspartr r r resolve_paths    rcCst|S)N)urlparseurlsplitgeturl)urir r r normalize-src Cst|j}||kr"|||}ndt|}|p8d}yt| |}Wn2t k r}zt d ||Wdd}~XYnX|S)z Resolve a remote ``uri``. .. note:: urllib library is used to fetch requests from the remote ``uri`` if handlers does notdefine otherwise. zutf-8z{} failed to decode: {}N) rrschemerinfoget_content_charsetjsonloadsreaddecode ValueErrorrr)rhandlersr resultreqencodingexcr r r resolve_remote1s "r-c@sveZdZdZidifddZeifddZeje ddd Z eje d d d Z d dZ ddZ edddZdS) RefResolverz" Resolve JSON References. TcCs2||_||_||_||_||_||_||dS)zP `base_uri` is URI of the referring document from the `schema`. N)base_uriresolution_scoper storecacher(walk)selfr/r r1r2r(r r r __init__MszRefResolver.__init__cKs(|t|trt|nd|fd|i|S)zA Construct a resolver from a JSON schema object. rr()rdictr )clsr r(kwargsr r r from_schemaYs zRefResolver.from_schema)scopeccs,|j}t|||_z dVWd||_XdS)z: Context manager to handle current scope. N)r0rurljoin)r4r:Z old_scoper r r in_scopees  zRefResolver.in_scope)refc cst|j|}t|\}}|r>t||jkr>|jt|}n6|rL||jkrT|j}n t||j }|j rt||jt|<|j|j}}|||_|_z&| |t ||VWdQRXWd|||_|_XdS)zt Context manager which resolves a JSON ``ref`` and enters the resolution scope of this ref. N) rr;r0 urldefragrr1r/r r-r(r2r<r)r4r=Znew_urirrr Z old_base_uriZ old_schemar r r resolvingqs  zRefResolver.resolvingcCs t|jS)N)rr0)r4r r r get_uriszRefResolver.get_uricCsFdt|jdddddd}tdd|}|d}|S)zK Get current scope and return it as a valid function name. Z validate_z~1_z~0"rz($[^a-zA-Z]|[^a-zA-Z0-9]))rr0rresublowerrstrip)r4namer r r get_scope_names&zRefResolver.get_scope_name)nodec Cst|tr nd|kr>t|dtr>|d}t|j||d<nd|ksNd|krtt|tr|t|@||jt |j<x(| D]\}}t|t r| |qWWdQRXn*x(| D]\}}t|t r| |qWdS)zR Walk thru schema and dereferencing ``id`` and ``$ref`` instances z$refz$idrN) rboolstrrr;r0r r<r1ritemsr6r3)r4rIr=rAitemr r r r3s   zRefResolver.walkN)__name__ __module__ __qualname____doc__r5 classmethodr9 contextlibcontextmanagerrKr<r?r@rHr6r3r r r r r.Gs    r.)rQrSr#rCurllibrr urllib.parserurllib.requestr exceptionsrr rrr-r.r r r r s