
    +d%                         d dl mZ 	 d dlZ eej                  Zn# e$ r dZY nw xY wddlmZ d Zd Z	d Z
d Zd	 Zdd
Zd ZdS )    )VersionN   )make_path_posixc                     | st          d          | d                                         r
| d d         } |                                 st          d          t          |           S )Nz<Format specifier must be set if no separator between fields.z&Format specifier must have a set width)
ValueErrorisalphaisdigitint)format_specs    3lib/python3.11/site-packages/intake/source/utils.py_validate_format_specr      sr     ^[]]]2   '!#2#&   CABBB{    c                    | }g }|d         dk    rM|                     |d                   r2|dt          |d                             }|dd         }|dd         }t          |          D ]<\  }}|dk    rW||vr"t          d                    |                    |                    |d          \  }}|r|                    |           c|dk    rj	 t          ||dz
                     }|                    |d|                    ||d         }# t          $ r |t          |          dz
  k    rTt          ||                   }|                    |d|                     |                    || d                    g }nt          ||dz
                      Y :w xY w|r|                    |           t          |          t          d |D                       k    r
|dd         }|S )ze
    Inner function of reverse_format, returns the resolved value for each
    field in pattern.
    r    Nz3Resolved string must match pattern. '{}' not found.   r   c                     g | ]}||S N ).0fss     r   
<listcomp>z/_get_parts_of_format_string.<locals>.<listcomp>B   s    DDDrRDDDDr   )	endswithlen	enumerater   formatsplitappendr   	Exception)	resolved_stringliteral_textsformat_specs_textbitsiliteral_textbitr   s	            r   _get_parts_of_format_stringr(      sG   
 EDRB )5>>-2C#D#D )/]2.////0%crc*#CRC($]33 ? ?<2 	?5( r "Z"a"abn"o"oqqq\155JC !C   !V 	??3LQ4GHHE!K-0111kll+ ? ? ?L))A-- ?"7Q"H"HKKKm|m 4555KK{lmm 4555EE),q1u*=>>>?  E
4yy3DD\DDDEEE ABBxKs   ?DBF('F(c                    ddl m}  |            }d |                    |           D             }d |D             }|D ]E}t          | |                                          D ] \  }}||                             |           !F|S )aH  
    Reverse the string method format for a list of strings.

    Given format_string and resolved_strings, for each resolved string
    find arguments that would give
    ``format_string.format(**arguments) == resolved_string``.

    Each item in the output corresponds to a new column with the key setting
    the name and the values representing a mapping from list of resolved_strings
    to the related value.

    Parameters
    ----------
    format_strings : str
        Format template string as used with str.format method
    resolved_strings : list
        List of strings with same pattern as format_string but with fields
        filled out.

    Returns
    -------
    args : dict
        Dict of the form ``{field: [value_0, ..., value_n], ...}`` where values are in
        the same order as resolved_strings, so:
        ``format_sting.format(**{f: v[0] for f, v in args.items()}) == resolved_strings[0]``

    Examples
    --------

    >>> paths = ['data_2014_01_03.csv', 'data_2014_02_03.csv', 'data_2015_12_03.csv']
    >>> reverse_formats('data_{year}_{month}_{day}.csv', paths)
    {'year':  ['2014', '2014', '2015'],
     'month': ['01', '02', '12'],
     'day':   ['03', '03', '03']}
    >>> reverse_formats('data_{year:d}_{month:d}_{day:d}.csv', paths)
    {'year': [2014, 2014, 2015], 'month': [1, 2, 12], 'day': [3, 3, 3]}
    >>> reverse_formats('data_{date:%Y_%m_%d}.csv', paths)
    {'date': [datetime.datetime(2014, 1, 3, 0, 0),
              datetime.datetime(2014, 2, 3, 0, 0),
              datetime.datetime(2015, 12, 3, 0, 0)]}
    >>> reverse_formats('{state:2}{zip:5}', ['PA19104', 'PA19143', 'MA02534'])
    {'state': ['PA', 'PA', 'MA'], 'zip': ['19104', '19143', '02534']}

    See also
    --------
    str.format : method that this reverses
    reverse_format : method for reversing just one string using a pattern
    r   	Formatterc                 .    g | ]}|d          
|d          S )r   r   )r   r%   s     r   r   z#reverse_formats.<locals>.<listcomp>}   s%    BBBAQqTB1Q4BBBr   c                     i | ]}|g S r   r   )r   
field_names     r   
<dictcomp>z#reverse_formats.<locals>.<dictcomp>   s    999zJ999r   )stringr+   parsereverse_formatitemsr   )	format_stringresolved_stringsr+   fmtfield_namesargsr    fieldvalues	            r   reverse_formatsr;   G   s    b !     
)++C CB=!9!9BBBK :9[999D+ & &*=/JJPPRR 	& 	&LE5Ku%%%%	& Kr   c                    ddl m } ddlm}  |            }i }t          |           } t	          |                    |            \  }}}}	t          |          si S t          |	          D ]/\  }
}|r(t          d	                    ||
                             0t          |          }t          |||          }t          t	          ||                    D ]\  }
\  }}|r	 |                    d          r |                    ||
         |          ||<   n|d         t          d          v rt          ||
                   ||<   n|d         t          d          v rt          ||
                   ||<   nO|d         dk    r$t          ||
         d	d                   d
z  ||<   n|                    ||
         |          ||<   # t"          $ r ||
         ||<   Y 
w xY w|S )a  
    Reverse the string method format.

    Given format_string and resolved_string, find arguments that would
    give ``format_string.format(**arguments) == resolved_string``

    Parameters
    ----------
    format_string : str
        Format template string as used with str.format method
    resolved_string : str
        String with same pattern as format_string but with fields
        filled out.

    Returns
    -------
    args : dict
        Dict of the form {field_name: value} such that
        ``format_string.(**args) == resolved_string``

    Examples
    --------

    >>> reverse_format('data_{year}_{month}_{day}.csv', 'data_2014_01_03.csv')
    {'year': '2014', 'month': '01', 'day': '03'}
    >>> reverse_format('data_{year:d}_{month:d}_{day:d}.csv', 'data_2014_01_03.csv')
    {'year': 2014, 'month': 1, 'day': 3}
    >>> reverse_format('data_{date:%Y_%m_%d}.csv', 'data_2016_10_01.csv')
    {'date': datetime.datetime(2016, 10, 1, 0, 0)}
    >>> reverse_format('{state:2}{zip:5}', 'PA19104')
    {'state': 'PA', 'zip': '19104'}

    See also
    --------
    str.format : method that this reverses
    reverse_formats : method for reversing a list of strings using one pattern
    r   )datetimer*   z$Conversion not allowed. Found on {}.%r   bcdoxXeEfFgGnNd   )r=   r0   r+   r   zipr1   anyr   r   r   r(   
startswithstrptimelistr   floatformat_fieldr   )r4   r    r=   r+   r6   r8   r!   r7   r"   conversionsr%   
conversionr$   r.   r   s                  r   r2   r2      sO   L "!!!!!      
)++CD $M22M =@=AYAY<Z9M;k{ 	";// ^ ^: 	^DKKKXYN[[]]]	^ &o66O '|TTD(1#k<2P2P(Q(Q + +$$J 	++))#.. 	N'/'8'8a+'N'ND$$ _X6 N'*47||D$$ _Y7 N',T!W~~D$$ _+ N',T!WSbS\':':S'@D$$'*'7'7Q'M'MD$ + + +#'7Z   +	+ Ks   #C$GG! G!c                     ddl m}  |            }t          | t                    s| S d}d}|                    |           D ]\  }}}}||z  }|r	|s||dz  }|}|S )a  
    Convert pattern style paths to glob style paths

    Returns path if path is not str

    Parameters
    ----------
    path : str
        Path to data optionally containing format_strings

    Returns
    -------
    glob : str
        Path with any format strings replaced with *

    Examples
    --------

    >>> path_to_glob('{year}/{month}/{day}.csv')
    '*/*/*.csv'
    >>> path_to_glob('data/{year:4}{month:02}{day:02}.csv')
    'data/*.csv'
    >>> path_to_glob('data/*.csv')
    'data/*.csv'
    r   r*   r   N*)r0   r+   
isinstancestrr1   )pathr+   r6   globprev_field_namer&   r.   _s           r   path_to_globrS      s    4 !     
)++CdC    DO*-))D// % %&j!Q 	< 	? 	CKD$Kr   c                     ddl m} t          | t                    sdS  ||           }|rK|                    d          }|r4t          d |D                       }|                    |          d         }|S )a  
    Remove source information from path when using chaching

    Returns None if path is not str

    Parameters
    ----------
    path : str
        Path to data optionally containing format_strings
    metadata : dict, optional
        Extra arguments to the class, contains any cache information

    Returns
    -------
    pattern : str
        Pattern style path stripped of everything to the left of cache regex.
    r   )strip_protocolNcachec              3   r   K   | ]2}|                     d           dk    |                     d          V  3dS )argkeyurlpathregexN)get)r   cs     r   	<genexpr>z"path_to_pattern.<locals>.<genexpr>!  s@      WWA!%%//Y:VWwWWWWWWr   r   )fsspec.corerU   rM   rN   r[   nextr   )rO   metadatarU   patternrV   rZ   s         r   path_to_patternrb     s    $ +*****dC   nT""G /W%% 	/WWWWWWWEmmE**2.GNr   c                       ddl m ddlm m d                     fdt          d          D                       S )Nr   )choice)ascii_lettersdigitsr   c                 ,    g | ]} z             S r   r   )r   nre   rd   rf   s     r   r   z!unique_string.<locals>.<listcomp>*  s(    EEEqFF=6122EEEr      )randomrd   r0   re   rf   joinrange)re   rd   rf   s   @@@r   unique_stringrm   &  sb    ,,,,,,,,77EEEEEEE!HHEEEFFFr   r   )packaging.versionr   dask__version__DASK_VERSIONImportErrorutilsr   r   r(   r;   r2   rS   rb   rm   r   r   r   <module>rt      s    & % % % % %KKK74+,,LL   LLL # # # # # #  ' ' 'T> > >BN N Nb* * *Z   @G G G G Gs    ''