U
    ºmœdUx  ã                
   @   s’  d Z ddlZddlmZ ddlZddlZddlmZ ddl	m
Z
 dd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z d2d3„ Z!d4d5„ Z"d6d7„ Z#d8d9„ Z$d:d;„ Z%d<d=„ Z&d>d?„ Z'd@dA„ Z(dBdC„ Z)dDdE„ Z*dFdG„ Z+djdHdI„Z,e-e.e/fdJfe.e/fdJfe.e/fdJfe0dJfe0dJfe0dJfdK�Z1dLdM„ Z2dkdNdO„Z3e-e.e/fdJfe.e/fdJfe0dJfe0dJfe0dJfdP�Z4dQdR„ Z5dSdT„ Z6dUdV„ Z7dWZ8e-e0dXfe.e/fdJfe.e/fdJfe.e/fdJfe.e/fdJfe.e/fdJfe.e/fdJfe0dJfdY�Z9dZd[„ Z:dld\d]„Z;d^d_„ Z<d`da„ Z=dbdc„ Z>ddZ?dedf„ Z@dgdh„ ZAeBdik�rŽddlCZCeC D¡  dS )mz"Various low level data validators.é    N)Úopen)ÚMapping)ÚnumberTypesc                 C   s,   t | tƒrdS dD ]}t| |ƒs dS qdS )zY
    Some objects will likely come in that aren't
    dicts but are dict-ish enough.
    T)ÚkeysÚvaluesÚitemsF)Ú
isinstancer   Úhasattr)ÚvalueÚattr© r   úT/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/ufoLib/validators.pyÚisDictEnough   s    

r   c                 C   s
   t | |ƒS )ú(
    Generic. (Added at version 2.)
    )r   )r
   Útypr   r   r   ÚgenericTypeValidator   s    r   c                 C   sL   t | ttfƒsdS t| ƒ}t|ƒ}|| r.dS | D ]}t |tƒs2 dS q2dS )r   FT)r   ÚlistÚtupleÚsetÚint)r   ÚvalidValuesZ	valuesSetZvalidValuesSetr
   r   r   r   ÚgenericIntListValidator%   s    
r   c                 C   s   t | tƒsdS | dk rdS dS ©ú(
    Generic. (Added at version 3.)
    Fr   T©r   r   ©r
   r   r   r   ÚgenericNonNegativeIntValidator5   s
    
r   c                 C   s   t | tƒsdS | dk rdS dS r   )r   r   r   r   r   r   Ú!genericNonNegativeNumberValidator@   s
    
r   c                 C   s”   t | tƒsdS | ¡ D ] \}\}}|s(q|| kr dS q|  ¡ D ]}||kr@ dS q@|  ¡ D ]2\}}|| \}}|dkr~|s~q\t ||ƒs\ dS q\dS )r   FNT)r   r   r   r   )r
   Z	prototypeÚkeyr   ÚrequiredÚvZprototypeTyper   r   r   ÚgenericDictValidatorK   s"    

r!   c                 C   s   ddddg}| |kS )ú
    Version 2+.
    ZregularÚitalicÚboldzbold italicr   )r
   Úoptionsr   r   r   Ú"fontInfoStyleMapStyleNameValidatorm   s    r&   c           	      C   s°   t | tƒsdS t| ƒdkrdS ddddg}ttdftdfd�}g }| D ]T}t||ƒsZ dS |d }|d	 }t|ƒ}|s| dS t||ƒ}|s� dS | |¡ qF|t	|ƒkr¬dS dS )
ú
    Version 3+.
    Fr   Té   é   é   )ÚrangeMaxPPEMÚrangeGaspBehaviorr+   r,   )
r   r   ÚlenÚdictr   r!   r   r   ÚappendÚsorted)	r
   ZvalidBehaviorsÚdictPrototypeZ	ppemOrderZrangeRecordZppemZbehaviorZppemValidityZbehaviorValidityr   r   r   Ú)fontInfoOpenTypeGaspRangeRecordsValidatoru   s,    


r2   c           
      C   sÚ  t | tƒsdS t| ƒdksdS |  d¡dkr0dS |  d¡\}}| d¡dkrPdS | d¡dkrbdS | d¡\}}}t|ƒdkr‚dS t|ƒdkr’dS t|ƒdkr¢dS zt|ƒ}t|ƒ}t|ƒ}W n tk
rÔ   Y dS X |dk sæ|d	krêdS t ||¡d }|dk �s||k�rdS | d¡\}}}	t|ƒdk�r4dS t|ƒdk�rFdS t|	ƒdk�rXdS zt|ƒ}t|ƒ}t|	ƒ}	W n tk
�rŒ   Y dS X |d
k �s¢|dk�r¦dS |d
k �sº|dk�r¾dS |	d
k �sÒ|	dk�rÖdS dS )r"   Fé   ú r(   ú/r)   ú:é   é   r   é   é;   T)	r   Ústrr-   ÚcountÚsplitr   Ú
ValueErrorÚcalendarÚ
monthrange)
r
   ÚdateÚtimeÚyearÚmonthÚdayZmonthMaxDayÚhourÚminuteÚsecondr   r   r   Ú$fontInfoOpenTypeHeadCreatedValidator‘   sb    
rI   c                 C   sR   t | tƒsdS ttdftdftdftdftdfd�}| D ]}t||ƒs8 dS q8dS )r'   FT)ZnameIDZ
platformIDZ
encodingIDZ
languageIDÚstring)r   r   r.   r   r;   r!   )r
   r1   Z
nameRecordr   r   r   Ú$fontInfoOpenTypeNameRecordsValidatorÍ   s    
û
rK   c                 C   s   t | tƒsdS | dk rdS dS )r"   Fr   Tr   r   r   r   r   Ú'fontInfoOpenTypeOS2WeightClassValidatorà   s
    
rL   c                 C   s*   t | tƒsdS | dk rdS | dkr&dS dS )r"   Fr(   é	   Tr   r   r   r   r   Ú&fontInfoOpenTypeOS2WidthClassValidatorë   s    
rN   c                 C   s@   t | ttfƒsdS t| ƒdkr"dS | D ]}t |tƒs& dS q&dS )z
    Version 2.
    Fé
   T©r   r   r   r-   r   ©r   r
   r   r   r   Ú*fontInfoVersion2OpenTypeOS2PanoseValidatorø   s    
rR   c                 C   sN   t | ttfƒsdS t| ƒdkr"dS | D ]"}t |tƒs: dS |dk r& dS q&dS )r'   FrO   r   TrP   rQ   r   r   r   Ú*fontInfoVersion3OpenTypeOS2PanoseValidator  s    
rS   c                 C   sp   t | ttfƒsdS t| ƒdkr"dS | D ]}t |tƒs& dS q&| \}}|dk sT|dkrXdS |dk sh|dkrldS dS )r"   Fr)   r   é   é   TrP   )r   r
   ZclassIDZ
subclassIDr   r   r   Ú'fontInfoOpenTypeOS2FamilyClassValidator  s    
rV   c                 C   sP   t | ttfƒsdS t| ƒdkr"dS t| ƒd r2dS | D ]}t |tƒs6 dS q6dS )r"   FrT   r)   T©r   r   r   r-   r   rQ   r   r   r   Ú fontInfoPostscriptBluesValidator+  s    
rX   c                 C   sP   t | ttfƒsdS t| ƒdkr"dS t| ƒd r2dS | D ]}t |tƒs6 dS q6dS )r"   FrO   r)   TrW   rQ   r   r   r   Ú%fontInfoPostscriptOtherBluesValidator;  s    
rY   c                 C   s@   t | ttfƒsdS t| ƒdkr"dS | D ]}t |tƒs& dS q&dS )r"   Fr8   TrW   rQ   r   r   r   Ú fontInfoPostscriptStemsValidatorK  s    
rZ   c                 C   s   t tddƒƒ}| |krdS dS )r"   r(   é   FT)r   Úrange)r
   r   r   r   r   Ú.fontInfoPostscriptWindowsCharacterSetValidatorY  s    r]   c                 C   s    t tdfd�}t| |ƒsdS dS )r'   T)ÚidF)r.   r;   r!   ©r
   r1   r   r   r   Ú%fontInfoWOFFMetadataUniqueIDValidatorc  s    
r`   c                 C   sJ   t dft dft dft dfdœ}t| |ƒs,dS d| krF|  d¡dkrFdS dS )r'   TF)ÚnameÚurlÚdirÚclassrc   ©ZltrÚrtl©r;   r!   Úgetr_   r   r   r   Ú#fontInfoWOFFMetadataVendorValidatorm  s    ü
ri   c                 C   sŽ   t tdfd�}t| |ƒsdS t| d ƒs,dS tdftdftdftdftdfdœ}| d D ]0}t||ƒsl dS d|krX| d¡dkrX dS qXdS )r'   T)ÚcreditsFrj   )ra   rb   Zrolerc   rd   rc   re   )r.   r   r!   r-   r;   rh   )r
   r1   Zcreditr   r   r   Ú$fontInfoWOFFMetadataCreditsValidator~  s"    
û
rk   c                 C   sB   t tdftdfd�}t| |ƒs"dS | d D ]}t|ƒs* dS q*dS )r'   FT)rb   Útextrl   ©r.   r;   r   r!   ÚfontInfoWOFFMetadataTextValue©r
   r1   rl   r   r   r   Ú(fontInfoWOFFMetadataDescriptionValidator–  s    
rp   c                 C   sP   t tdftdftdfd�}t| |ƒs(dS d| krL| d D ]}t|ƒs8 dS q8dS )r'   F)rb   rl   r^   rl   Trm   ro   r   r   r   Ú$fontInfoWOFFMetadataLicenseValidator£  s    
rq   c                 C   s<   t tdfd�}t| |ƒsdS | d D ]}t|ƒs$ dS q$dS ©r'   T)rl   Frl   ©r.   r   r!   rn   ro   r   r   r   Ú&fontInfoWOFFMetadataTrademarkValidator±  s    
rt   c                 C   s<   t tdfd�}t| |ƒsdS | d D ]}t|ƒs$ dS q$dS rr   rs   ro   r   r   r   Ú&fontInfoWOFFMetadataCopyrightValidator¾  s    
ru   c                 C   sD   t dft dft dfdœ}t| |ƒs&dS d| kr@|  d¡dkr@dS dS )r'   TF)ra   rc   rd   rc   re   rg   r_   r   r   r   Ú%fontInfoWOFFMetadataLicenseeValidatorË  s    
rv   c                 C   sJ   t dft dft dft dfdœ}t| |ƒs,dS d| krF|  d¡dkrFdS dS ©r'   TF)rl   Úlanguagerc   rd   rc   re   rg   r_   r   r   r   rn   ×  s    ü
rn   c                 C   s2   t | tƒsdS | sdS | D ]}t|ƒs dS qdS )r'   FT)r   r   Ú&fontInfoWOFFMetadataExtensionValidator)r
   Ú	extensionr   r   r   Ú'fontInfoWOFFMetadataExtensionsValidatorè  s    
r{   c                 C   sl   t tdftdftdfd�}t| |ƒs(dS d| krL| d D ]}t|ƒs8 dS q8| d D ]}t|ƒsT dS qTdS )r'   FT)Únamesr   r^   r|   r   )r.   r   r;   r!   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r
   r1   ra   Úitemr   r   r   ry   ö  s    
ry   c                 C   sd   t tdftdftdfd�}t| |ƒs(dS | d D ]}t|ƒs0 dS q0| d D ]}t|ƒsL dS qLdS )r'   FT)r^   r|   r   r|   r   )r.   r;   r   r!   r}   Ú+fontInfoWOFFMetadataExtensionValueValidator)r
   r1   ra   Úvalr   r   r   r~     s    
r~   c                 C   sJ   t dft dft dft dfdœ}t| |ƒs,dS d| krF|  d¡dkrFdS dS rw   rg   r_   r   r   r   r}     s    ü
r}   c                 C   sJ   t dft dft dft dfdœ}t| |ƒs,dS d| krF|  d¡dkrFdS dS rw   rg   r_   r   r   r   r€   (  s    ü
r€   c                 C   sb   t | tƒsdS |dkrtƒ }| D ]<}t|ƒs2 dS | d¡}|dk	r ||krR dS | |¡ q dS ©r'   FNÚ
identifierT)r   r   r   ÚguidelineValidatorrh   Úadd)r
   ÚidentifiersZguiderƒ   r   r   r   ÚguidelinesValidator>  s    

r‡   F)ÚxÚyÚanglera   Úcolorrƒ   c                 C   sØ   t | tƒsdS |  d¡}|  d¡}|  d¡}|dkr@|dkr@dS |dksP|dkr\|dk	r\dS |dk	rx|dk	rx|dkrxdS |dk	r˜|dk rŒdS |dkr˜dS |  d¡}|dk	r¶t|ƒs¶dS |  d	¡}|dk	rÔt|ƒsÔdS d
S )r'   Frˆ   r‰   rŠ   Nr   ih  rƒ   r‹   T)r!   Ú_guidelineDictPrototyperh   ÚidentifierValidatorÚcolorValidator)r
   rˆ   r‰   rŠ   rƒ   r‹   r   r   r   r„   [  s0    





r„   c                 C   sb   t | tƒsdS |dkrtƒ }| D ]<}t|ƒs2 dS | d¡}|dk	r ||krR dS | |¡ q dS r‚   )r   r   r   ÚanchorValidatorrh   r…   )r
   r†   Úanchorrƒ   r   r   r   ÚanchorsValidator„  s    

r‘   )rˆ   r‰   ra   r‹   rƒ   c                 C   sv   t | tƒsdS |  d¡}|  d¡}|dks2|dkr6dS |  d¡}|dk	rTt|ƒsTdS |  d¡}|dk	rrt|ƒsrdS dS )r'   Frˆ   r‰   Nrƒ   r‹   T)r!   Ú_anchorDictPrototyperh   r�   rŽ   )r
   rˆ   r‰   rƒ   r‹   r   r   r   r�      s    




r�   c                 C   sZ   d}d}t | tƒsdS | sdS t| ƒdkr.dS | D ]"}t|ƒ}||k sN||kr2 dS q2dS )z›
    Version 3+.

    >>> identifierValidator("a")
    True
    >>> identifierValidator("")
    False
    >>> identifierValidator("a" * 101)
    False
    é    é~   Féd   T)r   r;   r-   Úord)r
   ZvalidCharactersMinZvalidCharactersMaxÚcr   r   r   r�   »  s    
r�   c              	   C   s¸   t | tƒsdS |  d¡}t|ƒdkr(dS |D ]†}| ¡ }d}zt|ƒ}d}W n tk
r`   Y nX |sŒzt|ƒ}d}W n tk
rŠ   Y nX |s– dS |dk r¤ dS |dkr, dS q,dS )a  
    Version 3+.

    >>> colorValidator("0,0,0,0")
    True
    >>> colorValidator(".5,.5,.5,.5")
    True
    >>> colorValidator("0.5,0.5,0.5,0.5")
    True
    >>> colorValidator("1,1,1,1")
    True

    >>> colorValidator("2,0,0,0")
    False
    >>> colorValidator("0,2,0,0")
    False
    >>> colorValidator("0,0,2,0")
    False
    >>> colorValidator("0,0,0,2")
    False

    >>> colorValidator("1r,1,1,1")
    False
    >>> colorValidator("1,1g,1,1")
    False
    >>> colorValidator("1,1,1b,1")
    False
    >>> colorValidator("1,1,1,1a")
    False

    >>> colorValidator("1 1 1 1")
    False
    >>> colorValidator("1 1,1,1")
    False
    >>> colorValidator("1,1 1,1")
    False
    >>> colorValidator("1,1,1 1")
    False

    >>> colorValidator("1, 1, 1, 1")
    True
    Fú,r7   Tr   r(   )r   r;   r=   r-   Ústripr   r>   Úfloat)r
   ÚpartsÚpartZ	convertedr   r   r   rŽ   Ú  s4    +

rŽ   s   ‰PNG

T)ÚfileNameZxScaleZxyScaleZyxScaleZyScaleZxOffsetZyOffsetr‹   c                 C   s<   t | tƒsdS | d sdS |  d¡}|dk	r8t|ƒs8dS dS )r'   Fr�   r‹   NT)r!   Ú_imageDictPrototyperh   rŽ   )r
   r‹   r   r   r   ÚimageValidator3  s    

rŸ   c              	   C   s�   | dk	s|dk	s|dk	st ‚| dk	rFt| dƒ�}| d¡}W 5 Q R X n:|dk	r\|dd… }n$|dk	r€| ¡ }| d¡}| |¡ |tkrŒdS dS )zG
    Version 3+.

    This checks the signature of the image data.
    NÚrbé   )Fz,Image does not begin with the PNG signature.©TN)ÚAssertionErrorr   ÚreadÚtellÚseekÚpngSignature)ÚpathÚdataZfileObjÚfÚ	signatureÚposr   r   r   ÚpngValidatorC  s    

r­   c                 C   s~  t |tjjƒr|}ntj |¡}d}t | tƒs6d|fS tƒ }tƒ }i }| D �]}t |tƒsfd|f  S t|ƒdks~d|f  S |D ]}t |t	ƒs‚d|f    S q‚|\}	}
|
dkrÌ|
 
d¡sÌdd|
 f  S t|	ƒdkrÞ dS | |
¡sødd	|
 f  S |	d
k�r|
dk�r dS |	|k�r,dd|	 f  S | |	¡ |
|k�rPdd|
 f  S | |
¡ |
||	< qJd| ¡ k}|�szdS dS )zD
    Check the validity of layercontents.plist.
    Version 3+.
    z1layercontents.plist in not in the correct format.Fr)   Zglyphszglyphs.z3Invalid directory name (%s) in layercontents.plist.r   )Fz(Empty layer name in layercontents.plist.z A glyphset does not exist at %s.zpublic.default)FzIThe name public.default is being used by a layer that is not the default.z1The layer name %s is used by more than one layer.z0The directory %s is used by more than one layer.)Fz1The required default glyph set is not in the UFO.r¢   )r   ÚfsÚbaseZFSZosfsZOSFSr   r   r-   r;   Ú
startswithÚexistsr…   r   )r
   ZufoPathOrFileSystemZ
fileSystemZbogusFileMessageZusedLayerNamesZusedDirectoriesÚcontentsÚentryÚiZ	layerNameZdirectoryNameZfoundDefaultr   r   r   ÚlayerContentsValidator]  s\    




ÿþ

þ

þ

rµ   c                 C   s  d}t | ƒsd|fS i }i }|  ¡ D ]Ú\}}t|tƒsBd|f  S t|ttfƒs\d|f  S |sf dS | d¡r$| d¡sˆ| d¡sˆq$ntdƒt|ƒkrž dS | d¡r®|}n|}|D ]F}t|tƒsØdd	| f    S ||krôdd
| f    S |||< q¶q$dS )aª  
    Check the validity of the groups.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> groups = {"A" : ["A", "A"], "A2" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    A group has an empty name.

    >>> groups = {"public.awesome" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.
    >>> groups = {"public.kern2." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.

    >>> groups = {"public.kern1.A" : ["A"], "public.kern2.A" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1.A1" : ["A"], "public.kern1.A2" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The glyph "A" occurs in too many kerning groups.
    z,The group data is not in the correct format.F)FzA group has an empty name.zpublic.zpublic.kern1.zpublic.kern2.zpublic.kernN.)Fz@The group data contains a kerning group with an incomplete name.z-The group data %s contains an invalid member.z1The glyph "%s" occurs in too many kerning groups.r¢   )r   r   r   r;   r   r   r°   r-   )r
   ÚbogusFormatMessageZfirstSideMappingZsecondSideMappingZ	groupNameZ	glyphListÚdÚ	glyphNamer   r   r   ÚgroupsValidator§  sB    ,

ÿ

þþr¹   c                 C   sž   d}t | tƒsd|fS |  ¡ D ]z\}}t |tƒs<d|f  S t |tƒsRd|f  S | ¡ D ]<\}}t |tƒs|d|f    S t |tƒsZd|f    S qZqdS )aA  
    Check the validity of the kerning data structure.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> kerning = {"A" : {"B" : 100}}
    >>> kerningValidator(kerning)
    (True, None)

    >>> kerning = {"A" : ["B"]}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.

    >>> kerning = {"A" : {"B" : "100"}}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.
    z.The kerning data is not in the correct format.Fr¢   )r   r   r   r;   r   )r©   r¶   ÚfirstZ
secondDictrH   r
   r   r   r   ÚkerningValidator  s    




r»   z-The lib data is not in the correct format: %sc                 C   sÊ   t | ƒs"dt| ƒj }dt| fS |  ¡ D ]š\}} t|tƒsVddt|ƒj|f f  S |dkr*d}t| ttfƒsŽdt| ƒj }d|| f  S | D ]0}t|tƒs’dt|ƒj }d|| f    S q’q*dS )	aÎ  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.glyphOrder" : ["A", "C", "B"]}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = "hello"
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    The lib data is not in the correct format: expected a dictionary, ...

    >>> lib = {1: "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    The lib key is not properly formatted: expected str, found int: 1

    >>> lib = {"public.glyphOrder" : "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected list or tuple,...

    >>> lib = {"public.glyphOrder" : ["A", 1, "B"]}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected str,...
    úexpected a dictionary, found %sFzAThe lib key is not properly formatted: expected str, found %s: %rzpublic.glyphOrderz/public.glyphOrder is not properly formatted: %sz expected list or tuple, found %szexpected str, found %sr¢   )	r   ÚtypeÚ__name__Ú_bogusLibFormatMessager   r   r;   r   r   )r
   Úreasonr   ZbogusGlyphOrderMessager¸   r   r   r   ÚfontLibValidator1  s(    -
ÿÿ
rÁ   c                 C   sp   t | ƒs"dt| ƒj }dt| fS |  ¡ D ]@\}} t|tƒsTd| }dt| f  S |dkr*t| ƒs* dS q*dS )a,  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : "1,0,0,0.5"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : 1}
    >>> valid, msg = glyphLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    public.markColor is not properly formatted.
    r¼   Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r¢   )r   r½   r¾   r¿   r   r   r;   rŽ   )r
   rÀ   r   r   r   r   ÚglyphLibValidatory  s    
rÂ   Ú__main__)N)N)NNN)EÚ__doc__r?   Úior   Zfs.baser®   Zfs.osfsÚcollections.abcr   ZfontTools.ufoLib.utilsr   r   r   r   r   r   r!   r&   r2   rI   rK   rL   rN   rR   rS   rV   rX   rY   rZ   r]   r`   ri   rk   rp   rq   rt   ru   rv   rn   r{   ry   r~   r}   r€   r‡   r.   r   rš   r;   rŒ   r„   r‘   r’   r�   r�   rŽ   r§   rž   rŸ   r­   rµ   r¹   r»   r¿   rÁ   rÂ   r¾   ÚdoctestÚtestmodr   r   r   r   Ú<module>   s¤   "<





ú
)


û	K





ø
J\+H&
