U
    Pet=                     @   sN  d Z dZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZ ddlmZ dd Zd	d
 Zdd ZdddZdd Zdd Zdd Zdd ZdddZdd Zdddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0dd1d2d3d4d4d5d6d7d8d9d:d;d<d=d>d?d?d@dAdBdCdDdDdEdFdGdHdIdJdKdLdMdNdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`d`dadbdcdddededfdgdhdidjdIdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddZdd e D Zg ZdddZG dd deZ G dd de!Z"dddZ#dd Z$e$ Zdd Z%G dd de&Z'dd Z(e( Z)dS )a9  
Utils
=====

The Utils module provides a selection of general utility functions and classes
that may be useful for various applications. These include maths, color,
algebraic and platform functions.

.. versionchanged:: 1.6.0
    The OrderedDict class has been removed. Use collections.OrderedDict
    instead.

)intersection
difference
strtotupleget_color_from_hexget_hex_from_colorget_random_coloris_color_transparenthex_colormapcolormapboundary
deprecatedSafeListinterpolate	QueryDictplatformescape_markupreifyrgba
pi_version    )environpath)r   )matchsplitsearch	MULTILINE
IGNORECASE)string_typesc                 C   s   t t| ||S )z.Limit a value between a minvalue and maxvalue.)minmax)valueZminvalueZmaxvalue r    ./tmp/pip-unpacked-wheel-xzebddm3/kivy/utils.pyr
      s    r
   c                    s    fdd| D S )z#Return the intersection of 2 lists.c                    s   g | ]}| kr|qS r    r    .0sset2r    r!   
<listcomp>$   s      z intersection.<locals>.<listcomp>r    Zset1r&   r    r%   r!   r   "   s    r   c                    s    fdd| D S )z&Return the difference between 2 lists.c                    s   g | ]}| kr|qS r    r    r"   r%   r    r!   r'   )   s      zdifference.<locals>.<listcomp>r    r(   r    r%   r!   r   '   s    r   
   c                 C   sV   t | ttfkr>g }t| |D ]\}}|t||| q|S | ||  t|  S dS )a  Interpolate between two values. This can be useful for smoothing some
    transitions. For example::

        # instead of setting directly
        self.pos = pos

        # use interpolate, and you'll have a nicer transition
        self.pos = interpolate(self.pos, new_pos)

    .. warning::
        These interpolations work only on lists/tuples/doubles with the same
        dimensions. No test is done to check the dimensions are the same.
    N)typelisttuplezipappendr   float)Z
value_fromZvalue_tostepoutxyr    r    r!   r   ,   s    r   c                 C   sn   t d| std| d| dkr.td| d| dkrJtdt| }t|ttfkrjtd	|S )
zConvert a tuple string into a tuple
    with some security checks. Designed to be used
    with the eval() function::

        a = (12, 54, 68)
        b = str(a)         # return '(12, 54, 68)'
        c = strtotuple(b)  # return (12, 54, 68)

    z^[,.0-9 ()\[\]]*$z1Invalid characters in string for tuple conversion()zInvalid count of ( and )[]zInvalid count of [ and ]zConversion failed)r   	Exceptioncountevalr*   r+   r,   )r$   rr    r    r!   r   C   s    
r   c                 G   s   t | trt| S t | ttfrHdd | D } t| dkrD| d | S t | ttfr| d g} | 	dd |D  t| dkr| d | S t
dd	S )
zReturn a Kivy color (4 value from 0-1 range) from either a hex string or
    a list of 0-255 values.

    .. versionadded:: 1.10.0
    c                 S   s   g | ]}|d  qS )     o@r    r#   r2   r    r    r!   r'   d   s     zrgba.<locals>.<listcomp>      r<   c                 s   s   | ]}|d  V  qdS )r<   Nr    r=   r    r    r!   	<genexpr>j   s     zrgba.<locals>.<genexpr>z+Invalid value (not a string / list / tuple)N)
isinstancer   r   r+   r,   lenr.   intr/   extendr8   )r$   argsr    r    r!   r   [   s    



r   c                 C   sL   |  drt| dd S dd td|  D }t|dkrH|d |S )	zNTransform a hex string color to a kivy
    :class:`~kivy.graphics.Color`.
    #r?   Nc                 S   s"   g | ]}|d krt |dd qS )    r<   rC   r=   r    r    r!   r'   x   s    z&get_color_from_hex.<locals>.<listcomp>z([0-9a-f]{2})r>         ?)
startswithr   r   lowerrB   r.   )r$   r   r    r    r!   r   q   s    

r   c                 C   s   dd dd | D  S )zTransform a kivy :class:`~kivy.graphics.Color` to a hex value::

        >>> get_hex_from_color((0, 1, 0))
        '#00ff00'
        >>> get_hex_from_color((.25, .77, .90, .5))
        '#3fc4e57f'

    .. versionadded:: 1.5.0
    rF   rG   c                 S   s   g | ]}d  t|d qS )z{0:02x}   )formatrC   r=   r    r    r!   r'      s     z&get_hex_from_color.<locals>.<listcomp>)join)colorr    r    r!   r      s    
r   rJ   c                 C   s>   ddl m } | dkr(| | | | gS | | | | gS dS )zReturns a random color (4 tuple).

    :Parameters:
        `alpha`: float, defaults to 1.0
            If alpha == 'random', a random alpha value is generated.
    r   randomrR   NrQ   )alpharR   r    r    r!   r      s    r   c                 C   s(   t | dk rdS t| d dkr$dS dS )z&Return True if the alpha channel is 0.   Fr>   g        T)rB   r/   )cr    r    r!   r      s
    r   z#f0f8ffz#faebd7z#00ffffz#7fffd4z#f0ffffz#f5f5dcz#ffe4c4z#000000z#ffebcdz#0000ffz#8a2be2z#a52a2az#deb887z#5f9ea0z#7fff00z#d2691ez#ff7f50z#6495edz#fff8dcz#dc143cz#00008bz#008b8bz#b8860bz#a9a9a9z#006400z#bdb76bz#8b008bz#556b2fz#ff8c00z#9932ccz#8b0000z#e9967az#8fbc8fz#483d8bz#2f4f4fz#00ced1z#9400d3z#ff1493z#00bfffz#696969z#1e90ffz#b22222z#fffaf0z#228b22z#ff00ffz#dcdcdcz#f8f8ffz#ffd700z#daa520z#808080z#008000z#adff2fz#f0fff0z#ff69b4z#cd5c5cz#4b0082z#fffff0z#f0e68cz#e6e6faz#fff0f5z#7cfc00z#fffacdz#add8e6z#f08080z#e0ffffz#fafad2z#90ee90z#d3d3d3z#ffb6c1z#ffa07az#20b2aaz#87cefaz#778899z#b0c4dez#ffffe0z#00ff00z#32cd32z#faf0e6z#800000z#66cdaaz#0000cdz#ba55d3z#9370dbz#3cb371z#7b68eez#00fa9az#48d1ccz#c71585z#191970z#f5fffaz#ffe4e1z#ffe4b5z#ffdeadz#000080z#fdf5e6z#808000z#6b8e23z#ffa500z#ff4500z#da70d6z#eee8aaz#98fb98z#afeeeez#db7093z#ffefd5z#ffdab9z#cd853fz#ffc0cbz#dda0ddz#b0e0e6z#800080z#ff0000z#bc8f8fz#4169e1z#8b4513z#fa8072z#f4a460z#2e8b57z#fff5eez#a0522dz#c0c0c0z#87ceebz#6a5acdz#708090z#fffafaz#00ff7fz#4682b4z#d2b48cz#008080z#d8bfd8z#ff6347z#40e0d0z#ee82eez#f5deb3z#ffffffz#f5f5f5z#ffff00z#9acd32)Z	aliceblueZantiquewhiteZaquaZ
aquamarineZazureZbeigeZbisqueZblackZblanchedalmondZblueZ
bluevioletZbrownZ	burlywoodZ	cadetblueZ
chartreuseZ	chocolateZcoralZcornflowerblueZcornsilkZcrimsonZcyanZdarkblueZdarkcyanZdarkgoldenrodZdarkgrayZdarkgreyZ	darkgreenZ	darkkhakiZdarkmagentaZdarkolivegreenZ
darkorangeZ
darkorchidZdarkredZ
darksalmonZdarkseagreenZdarkslateblueZdarkslategrayZdarkslategreyZdarkturquoiseZ
darkvioletZdeeppinkZdeepskyblueZdimgrayZdimgreyZ
dodgerblueZ	firebrickZfloralwhiteZforestgreenZfuchsiaZ	gainsboroZ
ghostwhiteZgoldZ	goldenrodZgrayZgreyZgreenZgreenyellowZhoneydewZhotpinkZ	indianredZindigoZivoryZkhakiZlavenderZlavenderblushZ	lawngreenZlemonchiffonZ	lightblueZ
lightcoralZ	lightcyanZlightgoldenrodyellowZ
lightgreenZ	lightgrayZ	lightgreyZ	lightpinkZlightsalmonZlightseagreenZlightskyblueZlightslategrayZlightslategreyZlightsteelblueZlightyellowZlimeZ	limegreenZlinenZmagentaZmaroonZmediumaquamarineZ
mediumblueZmediumorchidZmediumpurpleZmediumseagreenZmediumslateblueZmediumspringgreenZmediumturquoiseZmediumvioletredZmidnightblueZ	mintcreamZ	mistyroseZmoccasinZnavajowhiteZnavyZoldlaceZoliveZ	olivedrabZorangeZ	orangeredZorchidZpalegoldenrodZ	palegreenZpaleturquoiseZpalevioletredZ
papayawhipZ	peachpuffZperuZpinkZplumZ
powderblueZpurpleZredZ	rosybrownZ	royalblueZsaddlebrownZsalmonZ
sandybrownZseagreenZseashellZsiennaZsilverZskyblueZ	slateblueZ	slategrayZ	slategreyZsnowZspringgreenZ	steelbluetanZtealZthistleZtomatoZ	turquoiseZvioletZwheatZwhiteZ
whitesmokeZyellowZyellowgreenc                 C   s   i | ]\}}|t |qS r    )r   )r#   kvr    r    r!   
<dictcomp>9  s      rY   NrG   c                    sD   ddl ddl} dkr&|jtdS |  fdd}|S )zThis is a decorator which can be used to mark functions
    as deprecated. It will result in a warning being emitted the first time
    the function is used.r   N)msgc                     s     d dd \}}}d|||f }|tkrt| d j jj jjd |||f }rld|}d| }ddlm	} |
|  jr|
 j  | |S )	Nr?   rT   z%s:%s:%szLCall to deprecated function %s in %s line %d.Called from %s line %d by %s().z{}: {}zDeprecated: r   )Logger)stackDEPRECATED_CALLERSr.   __name____code__co_filenameco_firstlinenorN   Zkivy.loggerr[   warning__doc__)rE   kwargsfilelineZcallerZ	caller_idrb   r[   funcinspectrZ   r    r!   new_funcI  s,    

  	
zdeprecated.<locals>.new_func)ri   	functoolspartialr   wraps)rh   rZ   rk   rj   r    rg   r!   r   >  s    r   c                       s:   e Zd ZdZe fddZdd Zed	ddZ  ZS )
r   zzList with a clear() method.

    .. warning::
        Usage of the iterate() function will decrease your performance.
    c                    s   t  j|| d S N)super__init__)selfrE   rd   	__class__r    r!   rp   l  s    zSafeList.__init__c                 C   s   | d d = d S rn   r    )rq   r    r    r!   clearp  s    zSafeList.clearFc                 C   s   |rt t| S t | S rn   )iterreversed)rq   reverser    r    r!   iterates  s    zSafeList.iterate)F)	r^   
__module____qualname__rc   r   rp   rt   rx   __classcell__r    r    rr   r!   r   e  s   r   c                       s(   e Zd ZdZ fddZdd Z  ZS )r   zQueryDict is a dict() that can be queried with dot.

    ::

        d = QueryDict()
        # create a key named toto, with the value 1
        d.toto = 1
        # it's the same as
        d['toto'] = 1

    .. versionadded:: 1.0.4
    c                    s6   z|  |W S  tk
r0   tt| | Y S X d S rn   )__getitem__KeyErrorro   r   __getattr__)rq   attrrr   r    r!   r~     s    zQueryDict.__getattr__c                 C   s   |  || d S rn   )__setitem__)rq   r   r   r    r    r!   __setattr__  s    zQueryDict.__setattr__)r^   ry   rz   rc   r~   r   r{   r    r    rr   r!   r   z  s   r      c                 C   s>   t | } d| }dD ]$}| dk r0|| |f   S | d } qdS )a  Format a byte value to a human readable representation (B, KB, MB...).

    .. versionadded:: 1.0.8

    :Parameters:
        `size`: int
            Number that represents the bytes value
        `precision`: int, defaults to 2
            Precision after the comma

    Examples::

        >>> format_bytes_to_human(6463)
        '6.31 KB'
        >>> format_bytes_to_human(646368746541)
        '601.98 GB'

    z%%1.%df %%s)BZKBZMBZGBZTBg      @NrI   )sizeZ	precisionfmtunitr    r    r!   format_bytes_to_human  s    r   c                  C   sh   t dd} | dkr| S dt kr$dS dt kr0dS tdkr<dS td	krHd
S tdrVdS tdrddS dS )NZ
KIVY_BUILDrG   >   iosandroidZP4A_BOOTSTRAPr   ZANDROID_ARGUMENT)win32cygwinwindarwinmacosxlinuxZfreebsdunknown)r   get_sys_platformrK   )Z
kivy_buildr    r    r!   _get_platform  s     

r   c                 C   s   |  dd dd ddS )aB  
    Escape markup characters found in the text. Intended to be used when markup
    text is activated on the Label::

        untrusted_text = escape_markup('Look at the example [1]')
        text = '[color=ff0000]' + untrusted_text + '[/color]'
        w = Label(text=text, markup=True)

    .. versionadded:: 1.3.0
    &z&amp;r6   z&bl;r7   z&br;)replace)textr    r    r!   r     s    r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   a  
    Put the result of a method which uses this (non-data) descriptor decorator
    in the instance dict after the first call, effectively replacing the
    decorator with an instance variable.

    It acts like @property, except that the function is only ever called once;
    after that, the value is cached as a regular attribute. This gives you lazy
    attribute creation on objects that are meant to be immutable.

    Taken from the `Pyramid project <https://pypi.python.org/pypi/pyramid/>`_.

    To use this as a decorator::

         @reify
         def lazy(self):
              ...
              return hard_to_compute_int
         first_time = self.lazy   # lazy is reify obj, reify.__get__() runs
         second_time = self.lazy  # lazy is hard_to_compute_int
    c                 C   s   || _ |j| _d S rn   )rh   rc   )rq   rh   r    r    r!   rp     s    zreify.__init__c                 C   s*   |d kr| S |  |}t|| j j| |S rn   )rh   setattrr^   )rq   instclsretvalr    r    r!   __get__  s
    
zreify.__get__N)r^   ry   rz   rc   rp   r   r    r    r    r!   r     s   r   c               	   C   st   t dsdS tdd} |  }W 5 Q R X td|ttB d}|sFdS t|ddd}|d	@ rp|d
@ d? d S dS )a*  Detect the version of the Raspberry Pi by reading the revision field value from '/proc/cpuinfo'
    See: https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
    Based on: https://github.com/adafruit/Adafruit_Python_GPIO/blob/master/Adafruit_GPIO/Platform.py
    z/proc/cpuinfoNr;   z^Revision\s+:\s+(\w+)$)flagsr?   rH   )basei   i      )	r   isfileopenreadr   r   r   rC   group)fZcpuinforevisionr    r    r!   _get_pi_version  s    
r   )r)   )rJ   )NrG   )r   )*rc   __all__osr   r   sysr   r   rer   r   r   r   r   Zkivy.compatr   r
   r   r   r   r   r   r   r   r   r   r   itemsr	   r]   r   r+   r   dictr   r   r   r   objectr   r   r   r    r    r    r!   <module>   sb  


  
'
"