a
    —ÆàgUx  ã                
   @   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/var/www/sistema_ama/venv/lib/python3.9/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|| vr dS q|  ¡ D ]}||vr@ dS q@|  ¡ D ]2\}}|| \}}|du 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   g d¢}| |v S )ú
    Version 2+.
    )ZregularZitalicZboldzbold italicr   )r
   Úoptionsr   r   r   Ú"fontInfoStyleMapStyleNameValidatorm   s    r$   c           	      C   s¬   t | tƒsdS t| ƒdkrdS g d¢}ttdftdfd�}g }| D ]T}t||ƒsV dS |d }|d }t|ƒ}|sx dS t||ƒ}|sŒ dS | |¡ qB|t	|ƒkr¨dS dS )ú
    Version 3+.
    Fr   T)r   é   é   é   )Ú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,    


r0   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yÒ   Y dS 0 |dk sä|d	krèdS t ||¡d }|dk �s||k�rdS | d¡\}}}	t|ƒdk�r2dS t|ƒdk�rDdS t|	ƒdk�rVdS zt|ƒ}t|ƒ}t|	ƒ}	W n t�yˆ   Y dS 0 |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    
rG   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   r9   r!   )r
   r/   Z
nameRecordr   r   r   Ú$fontInfoOpenTypeNameRecordsValidatorÍ   s    
û
rI   c                 C   s   t | tƒsdS | dk rdS dS )r"   Fr   Tr   r   r   r   r   Ú'fontInfoOpenTypeOS2WeightClassValidatorà   s
    
rJ   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    
rL   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    
rP   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%   FrM   r   TrN   rO   r   r   r   Ú*fontInfoVersion3OpenTypeOS2PanoseValidator  s    
rQ   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   é   é   TrN   )r   r
   ZclassIDZ
subclassIDr   r   r   Ú'fontInfoOpenTypeOS2FamilyClassValidator  s    
rT   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"   FrR   r'   T©r   r   r   r+   r   rO   r   r   r   Ú fontInfoPostscriptBluesValidator+  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"   FrM   r'   TrU   rO   r   r   r   Ú%fontInfoPostscriptOtherBluesValidator;  s    
rW   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"   Fr6   TrU   rO   r   r   r   Ú fontInfoPostscriptStemsValidatorK  s    
rX   c                 C   s   t tddƒƒ}| |v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,   r9   r!   ©r
   r/   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| v rF|  d¡dvrFdS dS )r%   TF)ÚnameÚurlÚdirÚclassra   ©ZltrÚrtl©r9   r!   Úgetr]   r   r   r   Ú#fontInfoWOFFMetadataVendorValidatorm  s    ü
rg   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|v rX| d¡dvrX dS qXdS )r%   T)ÚcreditsFrh   )r_   r`   Úrolera   rb   ra   rc   )r,   r   r!   r+   r9   rf   )r
   r/   Zcreditr   r   r   Ú$fontInfoWOFFMetadataCreditsValidator~  s"    
û
rj   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)r`   Útextrk   ©r,   r9   r   r!   ÚfontInfoWOFFMetadataTextValue©r
   r/   rk   r   r   r   Ú(fontInfoWOFFMetadataDescriptionValidator–  s    
ro   c                 C   sP   t tdftdftdfd�}t| |ƒs(dS d| v rL| d D ]}t|ƒs8 dS q8dS )r%   F)r`   rk   r\   rk   Trl   rn   r   r   r   Ú$fontInfoWOFFMetadataLicenseValidator£  s    
rp   c                 C   s<   t tdfd�}t| |ƒsdS | d D ]}t|ƒs$ dS q$dS ©r%   T)rk   Frk   ©r,   r   r!   rm   rn   r   r   r   Ú&fontInfoWOFFMetadataTrademarkValidator±  s    
rs   c                 C   s<   t tdfd�}t| |ƒsdS | d D ]}t|ƒs$ dS q$dS rq   rr   rn   r   r   r   Ú&fontInfoWOFFMetadataCopyrightValidator¾  s    
rt   c                 C   sD   t dft dft dfdœ}t| |ƒs&dS d| v r@|  d¡dvr@dS dS )r%   TF)r_   ra   rb   ra   rc   re   r]   r   r   r   Ú%fontInfoWOFFMetadataLicenseeValidatorË  s    
ru   c                 C   sJ   t dft dft dft dfdœ}t| |ƒs,dS d| v rF|  d¡dvrFdS dS ©r%   TF)rk   Úlanguagera   rb   ra   rc   re   r]   r   r   r   rm   ×  s    ü
rm   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    
rz   c                 C   sl   t tdftdftdfd�}t| |ƒs(dS d| v rL| d D ]}t|ƒs8 dS q8| d D ]}t|ƒsT dS qTdS )r%   FT)Únamesr   r\   r{   r   )r,   r   r9   r!   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r
   r/   r_   Úitemr   r   r   rx   ö  s    
rx   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,   r9   r   r!   r|   Ú+fontInfoWOFFMetadataExtensionValueValidator)r
   r/   r_   Ú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| v rF|  d¡dvrFdS dS rv   re   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| v rF|  d¡dvrFdS dS rv   re   r]   r   r   r   r   (  s    ü
r   c                 C   sb   t | tƒsdS |du rtƒ }| D ]<}t|ƒs2 dS | d¡}|dur ||v rR dS | |¡ q dS ©r%   FNÚ
identifierT)r   r   r   ÚguidelineValidatorrf   Úadd)r
   ÚidentifiersZguider‚   r   r   r   ÚguidelinesValidator>  s    

r†   F)ÚxÚyÚangler_   Úcolorr‚   c                 C   sØ   t | tƒsdS |  d¡}|  d¡}|  d¡}|du r@|du r@dS |du sP|du r\|dur\dS |durx|durx|du rxdS |dur˜|dk rŒdS |dkr˜dS |  d¡}|dur¶t|ƒs¶dS |  d	¡}|durÔt|ƒsÔdS d
S )r%   Fr‡   rˆ   r‰   Nr   ih  r‚   rŠ   T)r!   Ú_guidelineDictPrototyperf   ÚidentifierValidatorÚcolorValidator)r
   r‡   rˆ   r‰   r‚   rŠ   r   r   r   rƒ   [  s0    





rƒ   c                 C   sb   t | tƒsdS |du rtƒ }| D ]<}t|ƒs2 dS | d¡}|dur ||v rR dS | |¡ q dS r�   )r   r   r   ÚanchorValidatorrf   r„   )r
   r…   Úanchorr‚   r   r   r   ÚanchorsValidator„  s    

r�   )r‡   rˆ   r_   rŠ   r‚   c                 C   sv   t | tƒsdS |  d¡}|  d¡}|du s2|du r6dS |  d¡}|durTt|ƒsTdS |  d¡}|durrt|ƒsrdS dS )r%   Fr‡   rˆ   Nr‚   rŠ   T)r!   Ú_anchorDictPrototyperf   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   r9   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y^   Y n0 |sˆzt|ƒ}d}W n ty†   Y n0 |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ú,r5   Tr   r&   )r   r9   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ur8t|ƒs8dS dS )r%   Frœ   rŠ   NT)r!   Ú_imageDictPrototyperf   r�   )r
   rŠ   r   r   r   ÚimageValidator3  s    

rž   c                 C   s¤   | dus|dus|dusJ ‚| durZt | dƒ�}| d¡}W d  ƒ q”1 sN0    Y  n:|durp|dd… }n$|du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)r   Ú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 |	|v �r,dd|	 f  S | |	¡ |
|v �rPdd|
 f  S | |
¡ |
||	< qJd| ¡ v }|�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+   r9   Ú
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 ||v 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   r9   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   r9   r   )r§   r´   ÚfirstZ
secondDictrF   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   r9   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   r9   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$   r0   rG   rI   rJ   rL   rP   rQ   rT   rV   rW   rX   r[   r^   rg   rj   ro   rp   rs   rt   ru   rm   rz   rx   r}   r|   r   r†   r,   r   r™   r9   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&
