
     #e7                    J   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlmZmZ d d	lmZ d d
lmZ d dl m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+ erd dl,m-Z- d dl.m/Z/  G d de      Z0d&dZ1d&dZ2	 	 	 	 	 	 d'dZ3d(dZ4d)dZ5e6jn                  Z8d*dZ9d+dZ:d,dZ; G d de<      Z= e=d      Z> edd       Z?eree@e<f   ZAneZAe G d! deA             ZBeree@ef   ZCneZC ed"d#       ZD G d$ d#eC      ZEd-d%ZFy).    )annotationsN)abstractmethod)MappingMutableMapping)deepcopy)	lru_cache)TYPE_CHECKINGAnyDictIterator
NamedTupleOptionalSequenceSetTypeTypeVarcast)definefield)	unionRect)	Transform)	BoundsPenControlBoundsPen)	UFOReader	UFOWriter)OBJECT_LIBS_KEY)DrawableGlyphSetHasIdentifier)AttrsInstance)	Converterc                  :    e Zd ZU dZded<   ded<   ded<   ded<   y)BoundingBoxzARepresents a bounding box as a tuple of (xMin, yMin, xMax, yMax).floatxMinyMinxMaxyMaxN)__name__
__module____qualname____doc____annotations__     6/usr/lib/python3/dist-packages/ufoLib2/objects/misc.pyr#   r#   )   s    K
K
K
K
Kr/   r#   c                    t        |      }d|_        | j                  |       |j                  d S t	        |j                   S NF)r   skipMissingComponentsdrawboundsr#   drawablelayerpens      r0   	getBoundsr:   2   s=    
E
C %CMM#::%4C;

+CCr/   c                    t        |      }d|_        | j                  |       |j                  d S t	        |j                   S r2   )r   r3   r4   r5   r#   r6   s      r0   getControlBoundsr<   :   s=    
5
!C %CMM#::%4C;

+CCr/   c                6    | |S || S t        t        | |       S N)r#   r   )bounds1bounds2s     r0   unionBoundsrA   B   s*     	'7344r/   c                j   | j                   r| j                           | j                  di t        j                  | j                        D ci c]Z  }|j
                  rL|j                  d   dk7  r|j                  n|j                  dd  t        t        | |j                        |      \ c}S c c}w )Nr   _   r.   )	_lazyunlazify	__class__attrsfieldsinitnamer   getattr)selfmemoas      r0   _deepcopy_unlazify_attrsrP   L   s    zz4>> 
 \\$..1	
 vv	 vvayC'QVVQVVABZ(aff%t; 
 
s   AB0c                   | j                   r| j                          t        j                  | j                        D ci c];  }|j
                  |j                  rt        | |j
                        n|j                  = c}S c c}w r>   )	rE   rF   rH   rI   rG   rK   rJ   rL   default)rM   rO   s     r0   _getstate_unlazify_attrsrS   Z   sa    zz dnn- 	
aff%QYY>  s   A Bc                    t         j                  | t        j                        }t        j                  | j
                        D ]1  }|j                  |v s ||j                  ||j                            3 y r>   )_obj_setattr__get__rH   	AttributerI   rG   rK   )rM   state_bound_setattrrO   s       r0   _setstate_attrsrZ   i   sU    !))$@N\\$..) 266U?1665=12r/   c                0   |j                   "t        t        j                               |_         d| vri x}| d<   n+| d   }t	        |t
        j                  j                        sJ |j                   |v r||j                      }|S i }|||j                   <   |S )Nzpublic.objectLibs)
identifierstruuiduuid4
isinstancecollectionsabcr   )
parent_libobjobject_libs
object_liblibs        r0   _object_librh   p   s    
~~ TZZ\* *,8::j!45 !45+{'E'EFFF
~~$%0%@
C"%KJr/   c                    t         | vry| t            }|j                         D ci c]  \  }}||v s|s|| c}}| t         <   yc c}}w )zPrune non-existing objects and empty libs from a lib's
    public.objectLibs.

    Empty object libs are pruned, but object identifiers stay.
    N)r   items)rc   identifiersre   kvs        r0   _prune_object_libsrn      sR     j(_-K$**,#A[0@Q1#J #s   AAAc                      e Zd ZdZy)DataPlaceholderzSRepresents a sentinel value to signal a "lazy" DataSet item hasn't been loaded yet.N)r)   r*   r+   r,   r.   r/   r0   rp   rp      s    ]r/   rp   s   __UFOLIB2_DATA_NOT_LOADED__Tds	DataStore)boundc                     e Zd ZU dZ ee      Zded<    edddd      Zded	<    ed
ddd      Z	ded<    ee
ddd      Zded<   d#dZd#dZed$d%d       Zeed&d              Zeed'd              Zeed(d              Zeed)d              Zd*dZeZeZeZd+dZd,dZd-dZd.dZ d/dZ!d0dZ"d1d2dZ#e$d3d        Z%d4d!Z&e	 	 	 	 	 	 	 	 d5d"       Z'y
)6rr   zRepresents the base class for ImageSet and DataSet.

    Both behave like a dictionary that loads its "values" lazily by default and only
    differ in which reader and writer methods they call.
    )factoryzDict[str, bytes]_dataFT)rR   kw_onlyeqrJ   zOptional[bool]rE   N)rR   rJ   reprrx   zOptional[UFOReader]_reader)ru   rJ   ry   rx   zSet[str]_scheduledForDeletionc                    |j                   | j                   urt        S t        t        |      }| |fD ]  }|j                  s|j                          ! | j                  |j                  k(  S r>   )rG   NotImplementedr   rr   rE   rF   rv   )rM   other
data_stores      r0   __eq__zDataStore.__eq__   sc    
 ??$..0!!Y&- 	&J##%	& zzU[[((r/   c                F    | j                  |      }|t        u rt        S | S r>   )r   r}   )rM   r~   results      r0   __ne__zDataStore.__ne__   s&    U#^#!!zr/   c                     |        }| j                  |      D ]7  }|rt        |j                  |<   | j                  ||      |j                  |<   9 ||_        |r||_        |S )zFInstantiate the data store from a :class:`fontTools.ufoLib.UFOReader`.)list_contents_DATA_NOT_LOADEDrv   	read_datarE   rz   )clsreaderlazyrM   fileNames        r0   readzDataStore.read   si     u))&1 	GH'7

8$'*}}VX'F

8$		G
 
!DLr/   c                     y)z;Returns a list of POSIX filename strings in the data store.Nr.   )r   s    r0   r   zDataStore.list_contents        	r/   c                     y)z.Returns the data at filename within the store.Nr.   )r   filenames     r0   r   zDataStore.read_data   r   r/   c                     y)z-Writes the data to filename within the store.Nr.   )writerr   datas      r0   
write_datazDataStore.write_data   r   r/   c                     y)z-Remove the data at filename within the store.Nr.   )r   r   s     r0   remove_datazDataStore.remove_data   r   r/   c                l    | j                   r!| j                  | j                         D ]  } d| _         y)zLoad all data into memory.NF)rE   rz   rj   )rM   rC   s     r0   rF   zDataStore.unlazify   s1    ::$,,2ZZ\ 
r/   c                ,    t        | j                        S r>   )lenrv   rM   s    r0   __len__zDataStore.__len__  s    4::r/   c                ,    t        | j                        S r>   )iterrv   r   s    r0   __iter__zDataStore.__iter__  s    DJJr/   c                    | j                   |   }|t        u r+| j                  | j                  |      x}| j                   |<   |S r>   )rv   r   r   rz   )rM   r   data_objects      r0   __getitem__zDataStore.__getitem__  sA    jj***15h1WWK$**X.r/   c                v    || j                   |<   || j                  v r| j                  j                  |       y y r>   )rv   r{   remove)rM   r   r   s      r0   __setitem__zDataStore.__setitem__  s7    #

8t111&&--h7 2r/   c                T    | j                   |= | j                  j                  |       y r>   )rv   r{   add)rM   r   s     r0   __delitem__zDataStore.__delitem__  s"    JJx ""&&x0r/   c           
        t        | j                        }dj                  | j                  j                  | j                  j
                  |dk(  rdndj                  ||dkD  rdnd      t        t        |                   S )Nz<{}.{} ({}) at {}>r   emptyz	{} file{}rD   s )r   rv   formatrG   r*   r)   hexid)rM   ns     r0   __repr__zDataStore.__repr__  sg    

O#**NN%%NN##AvG;#5#5aA2#N4M	
 	
r/   c                x   || j                   |u}|s#| j                  D ]  }| j                  ||        | j                  j	                         D ]O  \  }}|t
        u r/|r,| j                  | j                   |      }|| j                  |<   n=| j                  |||       Q t               | _        |rd| _         yy)z>Write the data store to a :class:`fontTools.ufoLib.UFOWriter`.N)	rz   r{   r   rv   rj   r   r   r   set)rM   r   saveAsr   r   s        r0   writezDataStore.write   s    >\\/F 66 3  23 #jj..0 	4NHd ''>>$,,AD+/DJJx(OOFHd3	4 &)U"DL r/   c                H    t        | j                  j                               S )z.Returns a list of filenames in the data store.)listrv   keysr   s    r0   	fileNameszDataStore.fileNames;  s     DJJOO%&&r/   c                <   |j                  d      }t        |t              rt        |       S t        |t              st        t        |            | j                         D ci c]  \  }}||j                  |       }}}| j                  rd| _        |S c c}}w )N    F)	unstructurer`   bytesdictr]   NotImplementedErrortyperj   rE   )rM   	convertertestrl   rm   r   s         r0   _unstructurezDataStore._unstructure@  s    $$U+dE" :D#&%d4j11HL

U19#8#8#; ;UU::DJ	  Vs   $Bc                    |       }| j                         D ]e  \  }}t        |t              r|j                  |t              ||<   0t        |t              r|||<   Ft        dt        |      j                         |S )Nz'Expected (base64) str or bytes, found: )rj   r`   r]   	structurer   	TypeErrorr   r)   )r   r   r   rM   rl   rm   s         r0   
_structurezDataStore._structureQ  s     uJJL 	DAq!S!#--a7QAu%Q=d1g>N>N=QR 	 r/   )r~   objectreturnbool)T)r   z	type[Tds]r   r   r   r   r   rq   )r   r   r   	list[str])r   r   r   r]   r   r   )r   r   r   r]   r   r   r   None)r   r   r   r]   r   r   )r   r   r   intr   zIterator[str])r   r]   r   r   )r   r]   r   r   r   r   )r   r]   r   r   )r   r]   r>   )r   r   r   zbool | Noner   r   )r   r   )r   r!   r   dict[str, str])r   zMapping[str, Any]r   zType[DataStore]r   r!   r   rr   )(r)   r*   r+   r,   r   r   rv   r-   rE   rz   r   r{   r   r   classmethodr   staticmethodr   r   r   r   r   rF   rP   __deepcopy__rS   __getstate__rZ   __setstate__r   r   r   r   r   r   r   propertyr   r   r   r.   r/   r0   rr   rr      sx    $D1E1!%%eTE>T#(ERW#XG X&+%e'8 )               ,L+L"L 81
 6 ' '"   
	 r/   _TAttrDictMixinc                      e Zd ZdZe ed      	 d
	 	 	 	 	 dd              ZddZddZddZ	edd       Z
e	 	 	 	 	 	 dd	       Zy)r   zRead attribute values using mapping interface.

    For use with Anchors, Guidelines and WoffMetadata classes, where client code
    expects them to behave as dict.
    N)maxsizec                    i }t        j                  |       D ]:  }|j                  }|}d|j                  v r|j                  d   }|r|||<   6|||<   < |S )Nrename_attr)rH   rI   rK   metadata)r   reverser   rO   	attr_namekeys         r0   _key_to_attr_mapzAttrDictMixin._key_to_attr_mapw  sf    
 c" 	(AIC

*jj/$'y!'s	( r/   c                    | j                         |   }	 t        | |      }|t        |      |S # t        $ r}t        |      |d }~ww xY wr>   )r   rL   AttributeErrorKeyError)rM   r   r   valuees        r0   r   zAttrDictMixin.__getitem__  sZ    ))+C0		'D),E =3-	  	'3-Q&	's   0 	A
AA
c              #     K   | j                  d      }t        d| j                        }t        j                  |      D ]  }t        | |      ||     y w)NT)r   Type[AttrsInstance])r   r   rG   rH   fields_dictrL   )rM   key_mapr   r   s       r0   r   zAttrDictMixin.__iter__  s\     '''5($..9**3/ 	)ItY'3i((	)s   AA
Ac                &    t        d | D              S )Nc              3      K   | ]  }d   yw)rD   Nr.   ).0rC   s     r0   	<genexpr>z(AttrDictMixin.__len__.<locals>.<genexpr>  s     #1#s   )sumr   s    r0   r   zAttrDictMixin.__len__  s    #d###r/   c           
         t        ||       r|S t        |t              r=| j                         } | di |j                         D ci c]  \  }}||   | c}}S t	        d| j
                   dt        |      j
                         c c}}w )Nz	Expected z or mapping, found: r.   )r`   r   r   rj   r   r)   r   )r   r   attr_maprl   rm   s        r0   coerce_from_dictzAttrDictMixin.coerce_from_dict  s    eS!Lw'++-HDU[[]CTQ(1+q.CDD~%9$u+:N:N9OP
 	
 Ds   B
c                *    |y | j                  |      S r>   )r   )r   r   s     r0   coerce_from_optional_dictz'AttrDictMixin.coerce_from_optional_dict  s     =##E**r/   )F)r   r   r   r   r   r   )r   r]   r   r
   r   r   )r   Type[_T]r   z_T | Mapping[str, Any]r   r   )r   r   r   z_T | Mapping[str, Any] | Noner   z	_T | None)r)   r*   r+   r,   r   r   r   r   r   r   r   r   r.   r/   r0   r   r   n  s     t27 +/	  )$ 
 
 ++;+	+ +r/   c                6    t        | t              r| S t        |  S )zjReturn a passed-in Transform as is, otherwise convert a sequence of
    numbers to a Transform if need be.)r`   r   )ts    r0   _convert_transformr     s     1i(1;im;r/   )r7   r   r8   zGlyphSet | Noner   BoundingBox | None)r?   r   r@   r   r   r   )rM   r
   rN   r
   r   r
   )rM   r
   r   Dict[str, Any])rM   r
   rX   r   r   r   )rc   dict[str, Any]rd   r   r   r   )rc   r   rk   zset[str]r   r   )r   zTransform | Sequence[float]r   r   )G
__future__r   collections.abcra   r^   rb   r   r   r   copyr   	functoolsr   typingr	   r
   r   r   r   r   r   r   r   r   r   rH   r   r   fontTools.misc.arrayToolsr   fontTools.misc.transformr   fontTools.pens.boundsPenr   r   fontTools.ufoLibr   r   ufoLib2.constantsr   ufoLib2.typingr   r   r   attrr    cattrsr!   r#   r:   r<   rA   rP   rS   r   __setattr__rU   rZ   rh   rn   r   rp   r   rq   r]   DataStoreMappingrr   AttrDictMixinMappingr   r   r   r.   r/   r0   <module>r     sP   "    3        / . @ 1 - < < # * DD55*<55 !!2, ^e ^ ##AB  e;' %c5j1% x  x xx "38," T)?+( ?+D<r/   