a
    èÝEbïe  ã                
   @   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   ú[/home/ja/django-apps/lartica_env/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   ÚgenericNonNegativeIntValidator1   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   ÚgenericDictValidatorE   s"    

r!   c                 C   s   g d¢}| |v S )ú
	Version 2+.
	)ZregularÚitalicÚboldzbold italicr   )r
   Úoptionsr   r   r   Ú"fontInfoStyleMapStyleNameValidatore   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   Ú)fontInfoOpenTypeGaspRangeRecordsValidatorl   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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    
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   Ú fontInfoPostscriptStemsValidator2  s    
rZ   c                 C   s   t tddƒƒ}| |vrdS dS )r"   r(   é   FT)r   Úrange)r
   r   r   r   r   Ú.fontInfoPostscriptWindowsCharacterSetValidator?  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   Ú%fontInfoWOFFMetadataUniqueIDValidatorH  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Úclassrc   ©ZltrÚrtl©r;   r!   Úgetr_   r   r   r   Ú#fontInfoWOFFMetadataVendorValidatorQ  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|v rX| d¡dvrX dS qXdS )r'   T)ÚcreditsFrj   )ra   rb   Úrolerc   rd   rc   re   )r.   r   r!   r-   r;   rh   )r
   r1   Zcreditr   r   r   Ú$fontInfoWOFFMetadataCreditsValidator\  s    
$
rl   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   Útextrm   ©r.   r;   r   r!   ÚfontInfoWOFFMetadataTextValue©r
   r1   rm   r   r   r   Ú(fontInfoWOFFMetadataDescriptionValidatorm  s    
rq   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)rb   rm   r^   rm   Trn   rp   r   r   r   Ú$fontInfoWOFFMetadataLicenseValidatory  s    
rr   c                 C   s<   t tdfd�}t| |ƒsdS | d D ]}t|ƒs$ dS q$dS ©r'   T)rm   Frm   ©r.   r   r!   ro   rp   r   r   r   Ú&fontInfoWOFFMetadataTrademarkValidator†  s    
ru   c                 C   s<   t tdfd�}t| |ƒsdS | d D ]}t|ƒs$ dS q$dS rs   rt   rp   r   r   r   Ú&fontInfoWOFFMetadataCopyrightValidator’  s    
rv   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)ra   rc   rd   rc   re   rg   r_   r   r   r   Ú%fontInfoWOFFMetadataLicenseeValidatorž  s    
rw   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)rm   Úlanguagerc   rd   rc   re   rg   r_   r   r   r   ro   ©  s    
ro   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| 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   r;   r!   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r
   r1   ra   Úitemr   r   r   rz   Á  s    
rz   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| v rF|  d¡dvrFdS dS rx   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| v rF|  d¡dvrFdS dS rx   rg   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   Ú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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!   Ú_guidelineDictPrototyperh   Ú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   ÚanchorValidatorrh   r†   )r
   r‡   Úanchorr„   r   r   r   ÚanchorsValidator8  s    

r’   )r‰   rŠ   ra   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!   Ú_anchorDictPrototyperh   rŽ   r�   )r
   r‰   rŠ   r„   rŒ   r   r   r   r�   P  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Ž   i  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ú,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ur8t|ƒs8dS dS )r'   Frž   rŒ   NT)r!   Ú_imageDictPrototyperh   r�   )r
   rŒ   r   r   r   ÚimageValidatorÚ  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 )z>
	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   ÚpngValidatoré  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 )z;
	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  sL    










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   r;   r   r   r°   r-   )r
   ÚbogusFormatMessageZfirstSideMappingZsecondSideMappingZ	groupNameZ	glyphListÚdÚ	glyphNamer   r   r   ÚgroupsValidator<  s6    ,



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 )a  
	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 )	ab  
	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   ÚfontLibValidator·  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   ÚglyphLibValidatorü  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   rl   rq   rr   ru   rv   rw   ro   r|   rz   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’   

 ;
		
þ'
ýJû
;O*E&
