U
    Æ½„b�   ã                   @   sl   d Z ddlZddlmZ ddlZG dd„ dƒZeeejƒZedejƒZdd„ Zd	d
„ Zdd„ Zddd„ZdS )z6
some helper functions that might be generally useful
é    N)Úpartialc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚLazyEvalaÈ  
    Lightweight wrapper around lazily evaluated func(*args, **kwargs).

    func is only evaluated when any attribute of its return value is accessed.
    Every attribute access is passed through to the wrapped value.
    (This only excludes special cases like method-wrappers, e.g., __hash__.)
    The sole additional attribute is the lazy_self function which holds the
    return value (or, prior to evaluation, func and arguments), in its closure.
    c                    s$   ‡ ‡‡‡fdd„}t  ˆd|¡ d S )Nc                      s$   ˆˆˆŽ‰ t  ˆd‡ fdd„¡ ˆ S )NÚ	lazy_selfc                      s   ˆ S ©N© r   ©Zreturn_valuer   ú4/tmp/pip-unpacked-wheel-ctuyz3qg/ruamel/yaml/util.pyÚ<lambda>!   ó    z6LazyEval.__init__.<locals>.lazy_self.<locals>.<lambda>©ÚobjectÚ__setattr__r   ©ÚargsÚfuncÚkwargsÚselfr   r   r      s    
z$LazyEval.__init__.<locals>.lazy_selfr   r   )r   r   r   r   r   r   r   r   Ú__init__   s    zLazyEval.__init__c                 C   s$   t  | d¡}|dkr|S t|ƒ |ƒS )Nr   )r   Ú__getattribute__Úgetattr)r   Únamer   r   r   r   r   &   s    zLazyEval.__getattribute__c                 C   s   t |  ¡ ||ƒ d S r   )Úsetattrr   )r   r   Úvaluer   r   r   r   -   s    zLazyEval.__setattr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r      s   

r   a’  ^(?P<year>[0-9][0-9][0-9][0-9])
       -(?P<month>[0-9][0-9]?)
       -(?P<day>[0-9][0-9]?)
       (?:((?P<t>[Tt])|[ \t]+)   # explictly not retaining extra spaces
       (?P<hour>[0-9][0-9]?)
       :(?P<minute>[0-9][0-9])
       :(?P<second>[0-9][0-9])
       (?:\.(?P<fraction>[0-9]*))?
        (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
       (?::(?P<tz_minute>[0-9][0-9]))?))?)?$c              	   C   sD  d}t | ƒ} t |ƒ}t |ƒ}|s.t | ||¡S t |ƒ}t |ƒ}t |ƒ}d}|r°|d d… }t|ƒdk rp|d7 }qZt |ƒ}t|ƒdkrœt |d ƒdkrœ|d7 }||krªd}q´|}nd}d }|	�rt |
ƒ}
|rÒt |ƒnd}tj|
|||krêdndd�}|	dk�r| }n||k�rtjdd	� }t | ||||||¡}|�r@||8 }|S )
Ni?B r   é   Ú0é   é   )ÚhoursÚminutesÚsecondsú-)r#   )ÚintÚdatetimeÚdateÚlenÚ	timedelta)ÚyearÚmonthÚdayÚtÚhourÚminuteÚsecondÚfractionÚtzZtz_signZtz_hourZ	tz_minuteZMAX_FRACÚfracZfrac_sÚdeltaÚdatar   r   r   Úcreate_timestampC   sL    
  ÿ

	r6   c                 K   s|  ddl m} dd„ }t| tƒr$| }nt| tƒr:|  d¡}n|  ¡ }d}d}d}d}d}	| ¡ D ]ê}
|
 ¡ }| 	¡ }| 
d¡rÆ||
ƒ}||	 }|d }|
| d	krª|d7 }q”|
| d
kr¸q^||	 } �qJ|dk�r|dk	�r|�rd}|
| dkrú|d7 }qä||k�r|| }| d¡�rD||
ƒ}	d}|
| d	k�r>|d7 }�q$|}q^d}q^|dk�rb|dk	�rb|}|ƒ }|j|f|Ž||fS )at  guess the indent and block sequence indent of yaml stream/string

    returns round_trip_loaded stream, indent level, block sequence indent
    - block sequence indent is the number of spaces before a dash relative to previous indent
    - if there are no block sequences, indent is taken from nested mappings, block sequence
      indent is unset (None) in that case
    r    )ÚYAMLc                 S   s*   d}|t | ƒk r&| | dkr&|d7 }q|S )Nr   ú r    )r(   )ÚlineÚidxr   r   r   Úleading_spaces‰   s    
z.load_yaml_guess_indent.<locals>.leading_spaceszutf-8Nr   z- r8   ú#z -ú:)Úmainr7   Ú
isinstanceÚstrÚbytesÚdecodeÚreadÚ
splitlinesÚrstripÚlstripÚ
startswithÚendswithÚload)ÚstreamÚkwr7   r;   Zyaml_strZ
map_indentÚindentZblock_seq_indentZprev_line_key_onlyZ
key_indentr9   ZrlineZllineZl_sr:   Zyamlr   r   r   Úload_yaml_guess_indent}   sV    	





rM   c                 c   sn   ddl m} t| |ƒst‚| jD ]}| ¡ r |V  q t| ƒD ]}| ¡ r<|V  q<| jD ]}| ¡ rV|V  qVdS )zv
    walks over a ConfigObj (INI file with comments) generating
    corresponding YAML output (including comments
    r   )Ú	ConfigObjN)Ú	configobjrN   r?   ÚAssertionErrorZinitial_commentÚstripÚ_walk_sectionZfinal_comment)ÚcfgrN   ÚcÚsr   r   r   Úconfigobj_walker½   s    

rV   c           
      c   sJ  ddl m} t| |ƒst‚d| }| jD ]¢}| j| D ]}|| ¡  V  q6| | }d|kr€|d }d| | ¡  dd| ¡ }nd|krœd| dd¡ d }d	 |||¡}| j	| }|rÄ|d
| 7 }|V  q(| j
D ]r}| j| D ]}|| ¡  V  qàd ||¡}| j	| }|�r|d
| 7 }|V  t| | |d d�D ]}	|	V  �q6qÒd S )Nr   )ÚSectionz  Ú
z|
r=   ú'z''z{0}{1}: {2}r8   z{0}{1}:r    )Úlevel)rO   rW   r?   rP   ZscalarsÚcommentsrQ   ÚreplaceÚformatZinline_commentsÚsectionsrR   )
rU   rZ   rW   rL   r   rT   ÚxÚir9   Úvalr   r   r   rR   Ñ   s6    



rR   )r   )r   r&   Ú	functoolsr   ÚreÚAnyÚDictÚOptionalÚListÚTextZStreamTextTyper   ÚcompileZRegExpÚXZtimestamp_regexpr6   rM   rV   rR   r   r   r   r   Ú<module>   s   !
õ:@