a
    ܌xd'                      @   s   d Z ddlZddlmZ ddlZddlmZmZmZm	Z	m
Z
mZmZ ddlmZ G dd dZeeejZed	ejZeeeeeeeeeeeeeejejf d
ddZeeedddZeedddZdeeedddZdS )z6
some helper functions that might be generally useful
    N)partial)AnyDictOptionalListTextCallableUnion   )StreamTextTypec                   @   sN   e Zd ZdZedef eeddddZeeddd	Zeedd
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.
    .N)funcargskwargsreturnc                    s*   t d fdd}td| d S )N)r   c                      s(   i  t d fdd  S )N	lazy_selfc                      s    S N r   Zreturn_valuer   H/var/www/html/Ranjet/env/lib/python3.9/site-packages/ruamel/yaml/util.py<lambda>       z6LazyEval.__init__.<locals>.lazy_self.<locals>.<lambda>)object__setattr__r   r   r   r   selfr   r   r      s    z$LazyEval.__init__.<locals>.lazy_selfr   )r   r   r   )r   r   r   r   r   r   r   r   __init__   s    zLazyEval.__init__)namer   c                 C   s$   t | d}|dkr|S t| |S )Nr   )r   __getattribute__getattr)r   r   r   r   r   r   r   #   s    zLazyEval.__getattribute__)r   valuer   c                 C   s   t |  || d S r   )setattrr   )r   r   r    r   r   r   r   )   s    zLazyEval.__setattr__)
__name__
__module____qualname____doc__r   r   r   strr   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]))?))?)?$)yearmonthdaythourminutesecondfractiontztz_signtz_hour	tz_minuter   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rt |d dkr|d7 }||krd}q|}nd}d }|	rt |
}
|rt |nd}tj|
|||krdndd}|	dkr| }n||krtjdd	 }t| ||||||}|r@||8 }|S )
Ni?B r      0   r
   )hoursminutesseconds-)r8   )intdatetimedatelen	timedelta)r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   ZMAX_FRACfracZfrac_sdeltadatar   r   r   create_timestamp>   sH    


	rB   )streamkwr   c                 K   s  ddl m} ttddd}t| tr,| }nt| trB| d}n|  }d}d}d}d}d}	|	 D ]}
|

 }| }|d	r||
}||	 }|d }|
| d
kr|d7 }q|
| dkrqf||	 } qT|du r|dur|rd}|
| dv r|d7 }q||kr|| }|drN||
}	d}|
| d
krH|d7 }q.|}qfd}qf|du rl|durl|}| }|j|fi |||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
   )YAML)liner   c                 S   s*   d}|t | k r&| | dkr&|d7 }q|S )Nr    r
   )r=   )rF   idxr   r   r   leading_spaces   s    
z.load_yaml_guess_indent.<locals>.leading_spaceszutf-8Nr   z- rG   #z -:)mainrE   r   r:   
isinstancer&   bytesdecoderead
splitlinesrstriplstrip
startswithendswithload)rC   rD   rE   rI   Zyaml_strZ
map_indentindentZblock_seq_indentZprev_line_key_onlyZ
key_indentrF   ZrlineZllineZl_srH   yamlr   r   r   load_yaml_guess_indent   sV    





rY   )cfgr   c                 c   sn   ddl m} t| |sJ | 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)	configobjr[   rM   Zinitial_commentstrip_walk_sectionZfinal_comment)rZ   r[   csr   r   r   configobj_walker   s    

ra   )r`   levelr   c           
      c   sP  ddl m} t| |sJ d| }| jD ]}| j| D ]}||  V  q6| | }d|v r|d }d| | dd|  }nd|v rd|dd d }| | d	| }| j| }|r|d
| 7 }|V  q(| jD ]t}| j| D ]}||  V  q| | d}| j| }|r"|d
| 7 }|V  t	| | |d dD ]}	|	V  q<qd S )Nr   )Sectionz  
z|
rK   'z''z: rG   r
   )rb   )
r\   rc   rM   Zscalarscommentsr]   replaceZinline_commentssectionsr^   )
r`   rb   rc   rW   r   r_   xirF   valr   r   r   r^      s6    



r^   )r   )r%   r;   	functoolsr   retypingr   r   r   r   r   r   r	   compatr   r   compileZRegExpXZtimestamp_regexpr<   rB   rY   ra   r:   r^   r   r   r   r   <module>   s8   $
D>