
    Mh
                        d Z ddlmZ ddlmZ ddlmZmZ ddlZ	 ddl	m
Z
 n# e$ r	 ddlm
Z
 Y nw xY wddlmZ er
ddlmZmZmZ  e
d	e
          Zdej        ej        fddZdS )z2
Helpers related to (dynamic) resource retrieval.
    )annotations	lru_cache)TYPE_CHECKINGCallableN)TypeVar)Resource)URIDRetrieve_T)defaultcache+Callable[[Retrieve[D]], Retrieve[D]] | NoneloadsCallable[[_T], D]from_contentsCallable[[D], Resource[D]]return,Callable[[Callable[[URI], _T]], Retrieve[D]]c                @      t          d           d fd}|S )aG  
    Create a retriever which caches its return values from a simpler callable.

    Takes a function which returns things like serialized JSON (strings) and
    returns something suitable for passing to `Registry` as a retrieve
    function.

    This decorator both reduces a small bit of boilerplate for a common case
    (deserializing JSON from strings and creating `Resource` objects from the
    result) as well as makes the probable need for caching a bit easier.
    Retrievers which otherwise do expensive operations (like hitting the
    network) might otherwise be called repeatedly.

    Examples
    --------

    .. testcode::

        from referencing import Registry
        from referencing.typing import URI
        import referencing.retrieval


        @referencing.retrieval.to_cached_resource()
        def retrieve(uri: URI):
            print(f"Retrieved {uri}")

            # Normally, go get some expensive JSON from the network, a file ...
            return '''
                {
                    "$schema": "https://json-schema.org/draft/2020-12/schema",
                    "foo": "bar"
                }
            '''

        one = Registry(retrieve=retrieve).get_or_retrieve("urn:example:foo")
        print(one.value.contents["foo"])

        # Retrieving the same URI again reuses the same value (and thus doesn't
        # print another retrieval message here)
        two = Registry(retrieve=retrieve).get_or_retrieve("urn:example:foo")
        print(two.value.contents["foo"])

    .. testoutput::

        Retrieved urn:example:foo
        bar
        bar

    N)maxsizeretrieveCallable[[URI], _T]c                *     d fd            }|S )Nurir
   c                F     |           } |          } |          S )N )r   responsecontentsr   r   r   s      U/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/referencing/retrieval.pycached_retrievez>to_cached_resource.<locals>.decorator.<locals>.cached_retrieveT   s-    x}}HuXH =***    )r   r
   r   )r   r"   r   r   r   s   ` r!   	decoratorz%to_cached_resource.<locals>.decoratorS   s>    		+ 	+ 	+ 	+ 	+ 	+ 	+ 
	+
 r#   )r   r   r   )r   r   r   r$   s   ``` r!   to_cached_resourcer%      sM    n }$'''        r#   )r   r   r   r   r   r   r   r   )__doc__
__future__r   	functoolsr   typingr   r   jsontyping_extensionsr   ImportErrorreferencingr	   referencing.typingr
   r   r   strr   r   r   r%   r   r#   r!   <module>r0      s-    # " " " " "       * * * * * * * * )))))))    !           43333333333 WT3 :>#z080FC C C C C C Cs   # 11