
    hd*                         d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
  ej        e          ZdZdZdZ eeeeg          ZeZdZdZd	Zd
 Zd Zd Zd Zd Zd Zd Zd Zd ZddZ d Z!d Z"d Z#dS )z-Helper functions for commonly used utilities.    N)urllibWARNING	EXCEPTIONIGNOREzFile: {0}: Is a symbolic link.z{0}: Is a directoryz,Cannot access {0}: No such file or directoryc                       fd}t           t          j                  r|S t          j                   \  }}}} t          t          |          t          |          z
                       S )a  A decorator to declare that only the first N arguments my be positional.

    This decorator makes it easy to support Python 3 style keyword-only
    parameters. For example, in Python 3 it is possible to write::

        def fn(pos1, *, kwonly1=None, kwonly1=None):
            ...

    All named parameters after ``*`` must be a keyword::

        fn(10, 'kw1', 'kw2')  # Raises exception.
        fn(10, kwonly1='kw1')  # Ok.

    Example
    ^^^^^^^

    To define a function like above, do::

        @positional(1)
        def fn(pos1, kwonly1=None, kwonly2=None):
            ...

    If no default value is provided to a keyword argument, it becomes a
    required keyword argument::

        @positional(0)
        def fn(required_kw):
            ...

    This must be called with the keyword parameter::

        fn()  # Raises exception.
        fn(10)  # Raises exception.
        fn(required_kw=10)  # Ok.

    When defining instance or class methods always remember to account for
    ``self`` and ``cls``::

        class MyClass(object):

            @positional(2)
            def my_method(self, pos1, kwonly1=None):
                ...

            @classmethod
            @positional(2)
            def my_method(cls, pos1, kwonly1=None):
                ...

    The positional decorator behavior is controlled by
    ``_helpers.positional_parameters_enforcement``, which may be set to
    ``POSITIONAL_EXCEPTION``, ``POSITIONAL_WARNING`` or
    ``POSITIONAL_IGNORE`` to raise an exception, log a warning, or do
    nothing, respectively, if a declaration is violated.

    Args:
        max_positional_arguments: Maximum number of positional arguments. All
                                  parameters after the this index must be
                                  keyword only.

    Returns:
        A decorator that prevents using arguments after max_positional_args
        from being used as positional parameters.

    Raises:
        TypeError: if a key-word only argument is provided as a positional
                   parameter, but only if
                   _helpers.positional_parameters_enforcement is set to
                   POSITIONAL_EXCEPTION.
    c                 J     t          j                    fd            }|S )Nc                  6   t          |           k    r~d}dk    rd}d                    j        t          |           |          }t          t          k    rt          |          t          t          k    rt                              |            | i |S )N    szV{function}() takes at most {args_max} positional argument{plural} ({args_given} given))functionargs_max
args_givenplural)	lenformat__name__!positional_parameters_enforcementPOSITIONAL_EXCEPTION	TypeErrorPOSITIONAL_WARNINGloggerwarning)argskwargsplural_smessagemax_positional_argswrappeds       m/home/visionen/pythonvenv/lib/python3.11/site-packages/oauth2client-4.1.3-py3.11.egg/oauth2client/_helpers.pypositional_wrapperzDpositional.<locals>.positional_decorator.<locals>.positional_wrapperu   s    4yy...&!++"HCCI6(/(8(;*-d))&.	 DJ D0 D0  58LLL#G,,,6:LLLNN7+++7D+F+++    )	functoolswraps)r   r!   r   s   ` r    positional_decoratorz(positional.<locals>.positional_decoratort   s?    		!	!	, 	, 	, 	, 	, 
"	!	,  "!r"   )
isinstancesixinteger_typesinspect
getargspec
positionalr   )r   r%   r   _defaultss   `    r    r+   r+   ,   s    P" " " " "( %s'899 J##&12EFFaH4z#d))c(mm3445HIIIr"   c                 d    t          | t          j                  r| S d                    |           S )a_  Converts scope value to a string.

    If scopes is a string then it is simply passed through. If scopes is an
    iterable then a string is returned that is all the individual scopes
    concatenated with spaces.

    Args:
        scopes: string or iterable of strings, the scopes.

    Returns:
        The scopes formatted as a single string.
     )r&   r'   string_typesjoinscopess    r    scopes_to_stringr4      s0     &#*++  xxr"   c                 l    | sg S t          | t          j                  r|                     d          S | S )a+  Converts stringifed scope value to a list.

    If scopes is a list then it is simply passed through. If scopes is an
    string then a list of each individual scope is returned.

    Args:
        scopes: a string or iterable of strings, the scopes.

    Returns:
        The scopes in a list.
    r/   )r&   r'   r0   splitr2   s    r    string_to_scopesr7      s=      		FC,	-	- ||C   r"   c                    t           j                            |           }i }t          j        |          D ]M\  }}t          |          dk    r*d|dd                    |          }t          |          |d         ||<   N|S )a  Parses unique key-value parameters from urlencoded content.

    Args:
        content: string, URL-encoded key-value pairs.

    Returns:
        dict, The key-value pairs from ``content``.

    Raises:
        ValueError: if one of the keys is repeated.
    r   z.URL-encoded content contains a repeated value:z -> z, r   )r   parseparse_qsr'   	iteritemsr   r1   
ValueError)contenturlencoded_paramsparamskeyvaluemsgs         r    parse_unique_urlencodedrC      s     --g66Fm$566  
Uu::???!$dii&6&6&68CS//!AhsMr"   c                 :   t           j                            |           }t          |j                  }|                    |           t           j                            |          }|                    |          }t           j                            |          S )a  Updates a URI with new query parameters.

    If a given key from ``params`` is repeated in the ``uri``, then
    the URI will be considered invalid and an error will occur.

    If the URI is valid, then each value from ``params`` will
    replace the corresponding value in the query parameters (if
    it exists).

    Args:
        uri: string, A valid URI, with potential existing query parameters.
        params: dict, A dictionary of query parameters.

    Returns:
        The same URI but with the new query parameters added.
    )query)	r   r9   urlparserC   rE   update	urlencode_replace
urlunparse)urir?   partsquery_params	new_query	new_partss         r    update_query_paramsrP      sz    " L!!#&&E*5;77L&&|44IY//I<""9---r"   c                 .    || S t          | ||i          S )a\  Adds a query parameter to a url.

    Replaces the current value if it already exists in the URL.

    Args:
        url: string, url to add the query parameter to.
        name: string, query parameter name.
        value: string, query parameter value.

    Returns:
        Updated query parameter. Does not update the url if value is None.
    )rP   )urlnamerA   s      r    _add_query_parameterrT      s"     }
"3u666r"   c                    t           j                            |           r't          t                              |                     t           j                            |           r't          t                              |                     t           j                            |           s.t          j
        t                              |                      d S d S )N)ospathislinkIOError_SYM_LINK_MESSAGEr   isdir_IS_DIR_MESSAGEisfilewarningswarn_MISSING_FILE_MESSAGE)filenames    r    validate_filerb      s    	w~~h >'..x88999	x	 	  >o,,X66777W^^H%% >+228<<=====> >r"   c                 P    |                      d          }|dk    r
| |d         S dS )az  Identify and extract PEM keys.

    Determines whether the given key is in the format of PEM key, and extracts
    the relevant part of the key if it is.

    Args:
        raw_key_input: The contents of a private key file (either PEM or
                       PKCS12).

    Returns:
        string, The actual key if the contents are from a PEM file, or
        else None.
    s   -----BEGIN N)find)raw_key_inputoffsets     r    _parse_pem_keyrh     s6     //F||VWW%% |r"   c                 .    t          j        | d          S )N),:)
separators)jsondumps)datas    r    _json_encoderp     s    :dz2222r"   asciic                     t          | t          j                  r|                     |          n| }t          |t          j                  r|S t          d                    |                     )a4  Converts a string value to bytes, if necessary.

    Unfortunately, ``six.b`` is insufficient for this task since in
    Python2 it does not modify ``unicode`` objects.

    Args:
        value: The string/bytes value to be converted.
        encoding: The encoding to use to convert unicode to bytes. Defaults
                  to "ascii", which will not allow any characters from ordinals
                  larger than 127. Other useful values are "latin-1", which
                  which will only allows byte ordinals (up to 255) and "utf-8",
                  which will encode any unicode that needs to be.

    Returns:
        The original value converted to bytes (if unicode) or as passed in
        if it started out as bytes.

    Raises:
        ValueError if the value could not be converted to bytes.
    z%{0!r} could not be converted to bytes)r&   r'   	text_typeencodebinary_typer<   r   )rA   encodingresults      r    	_to_bytesrx     sh    , E3=11=ell8$$$7< &#/** P@GGNNOOOr"   c                     t          | t          j                  r|                     d          n| }t          |t          j                  r|S t          d                    |                     )aE  Converts bytes to a string value, if necessary.

    Args:
        value: The string/bytes value to be converted.

    Returns:
        The original value converted to unicode (if bytes) or as passed in
        if it started out as unicode.

    Raises:
        ValueError if the value could not be converted to unicode.
    utf-8z'{0!r} could not be converted to unicode)r&   r'   ru   decoders   r<   r   )rA   rw   s     r    _from_bytesr|   6  sq     E3?33?ell7###9> &#-(( E5<<UCCE E 	Er"   c                 r    t          | d          } t          j        |                               d          S )Nrz   )rv      =)rx   base64urlsafe_b64encoderstrip)	raw_bytess    r    _urlsafe_b64encoder   L  s3    )g666I#I..55d;;;r"   c                 ~    t          |           } | ddt          |           dz  z
  z  z   }t          j        |          S )Nr~      )rx   r   r   urlsafe_b64decode)	b64stringpaddeds     r    _urlsafe_b64decoder   Q  s?    )$$IS^^a%7!788F#F+++r"   )rq   )$__doc__r   r#   r)   rm   loggingrV   r^   r'   	six.movesr   	getLoggerr   r   r   r   POSITIONAL_IGNORE	frozensetPOSITIONAL_SETr   rZ   r\   r`   r+   r4   r7   rC   rP   rT   rb   rh   rp   rx   r|   r   r    r"   r    <module>r      s   4 3         				  



       
	8	$	$ "  .0D-/ 0 0 %7 !4 'F `J `J `JF     &  (  .. . .27 7 7&> > >& & &&3 3 3P P P P:E E E,< < <
, , , , ,r"   