
    <`e                     ~   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 Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+d<d'Z, e-e.e/fd(fe.e/fd(fe.e/fd(fe0d(fe0d(fe0d(f)          Z1d* Z2d<d+Z3 e-e.e/fd(fe.e/fd(fe0d(fe0d(fe0d(f,          Z4d- Z5d. Z6d/ Z7d0Z8 e-e0d1fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe0d(f2          Z9d3 Z:d=d4Z;d5 Z<d6 Z=d7 Z>d8Z?d9 Z@d: ZAeBd;k    rddlCZC eCjD                     dS dS )>z"Various low level data validators.    N)open)Mapping)numberTypesc                 d    t          | t                    rdS dD ]}t          | |          s dS 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attrs     ;lib/python3.11/site-packages/fontTools/ufoLib/validators.pyisDictEnoughr      sM    
 %!! t+  ud## 	55	4    c                 "    t          | |          S )"
	Generic. (Added at version 2.)
	)r
   )r   typs     r   genericTypeValidatorr      s     	5#r   c                     t          | t          t          f          sdS t          |           }t          |          }||z
  rdS | D ]}t          |t                    s dS dS )r   FT)r
   listtuplesetint)r   validValues	valuesSetvalidValuesSetr   s        r   genericIntListValidatorr   "   s{     	6D%=)) 	[[k"" 	  U	E3		 
%%r   c                 D    t          | t                    sdS | dk     rdS dS "
	Generic. (Added at version 3.)
	Fr   Tr
   r   r   s    r   genericNonNegativeIntValidatorr#   1   .     	5# 		AII	r   c                 D    t          | t                    sdS | dk     rdS dS r   )r
   r   r"   s    r   !genericNonNegativeNumberValidatorr&   ;   s.     	5+&& 		AII	r   c                 8   t          | t                    sdS |                                D ]\  }\  }}|s|| vr dS |                                 D ]	}||vr dS 
|                                 D ](\  }}||         \  }}||st          ||          s dS )dS )r    FNT)r
   r   r	   r   )r   	prototypekeyr   requiredvprototypeTypes          r   genericDictValidatorr-   E   s    
 	5'"" 	&__..  S/3	 
%%  JJLL  S	
%%  {{}}  VS!%cN-YxY	A}	%	% 
%%r   c                     g d}| |v S )
	Version 2+.
	)regularitalicboldzbold italic )r   optionss     r   "fontInfoStyleMapStyleNameValidatorr5   e   s     877r   c                    t          | t                    sdS t          |           dk    rdS g d}t          t          dft          df          }g }| D ]c}t          ||          s dS |d         }|d         }t          |          }|s dS t          ||          }|s dS |                    |           d|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   validBehaviorsdictPrototype	ppemOrderrangeRecordppembehaviorppemValiditybehaviorValiditys	            r   )fontInfoOpenTypeGaspRangeRecordsValidatorrI   l   s    	5$ 	JJ!OO	,,C;4,OOO  [	k=	9	9 
%%	^	$$,-(/55,	 
%%,X~FF	 
%%4	""""	r   c                 R   t          | t                    sdS t          |           dk    sdS |                     d          dk    rdS |                     d          \  }}|                    d          dk    rdS |                    d          dk    rdS |                    d          \  }}}t          |          dk    rdS t          |          dk    rdS t          |          dk    rdS 	 t          |          }t          |          }t          |          }n# t          $ r Y dS w xY w|dk     s|d	k    rdS t          j        ||          d         }|dk     s||k    rdS |                    d          \  }}}	t          |          dk    rdS t          |          dk    rdS t          |	          dk    rdS 	 t          |          }t          |          }t          |	          }	n# t          $ r Y dS w xY w|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    r8   /r9   :      r      ;   T)	r
   strr=   countsplitr   
ValueErrorcalendar
monthrange)
r   datetimeyearmonthdaymonthMaxDayhourminuteseconds
             r   $fontInfoOpenTypeHeadCreatedValidatorrb      s^   
 	5# 	E

b		KK	kk#tJJsOOq	JJsOOq	JJsOOucIINN	JJ!OO	HHMM		T$
e**%C##   		AII	"4//2!GGs[  	

3vvIINN	KK1	KK1		T$v;;&v;;&&   	1HHr			
QJJ&2++	
QJJ&2++	s$   /-D 
D+*D+>-G, ,
G:9G:c                     t          | t                    sdS t          t          dft          dft          dft          dft          df          }| D ]}t          ||          s dS dS )r7   FT)nameID
platformID
encodingID
languageIDstring)r
   r   r>   r   rS   r-   )r   rB   
nameRecords      r   $fontInfoOpenTypeNameRecordsValidatorrj      s     	5$ 	c4[c4[cSW[fikoepz}  @D  zE  F  F  F  Z	j-	8	8 
%%r   c                 D    t          | t                    sdS | dk     rdS dS )r/   Fr   Tr!   r"   s    r   'fontInfoOpenTypeOS2WeightClassValidatorrl      r$   r   c                 T    t          | t                    sdS | dk     rdS | dk    rdS dS )r/   Fr8   	   Tr!   r"   s    r   &fontInfoOpenTypeOS2WidthClassValidatorro      s<     	5# 		AII		AII	r   c                     t          | t          t          f          sdS t          |           dk    rdS | D ]}t          |t                    s dS dS )z
	Version 2.
	F
   Tr
   r   r   r=   r   r   r   s     r   *fontInfoVersion2OpenTypeOS2PanoseValidatorrt      si     	6D%=)) 	KK2	  U	E3		 
%% 	r   c                     t          | t          t          f          sdS t          |           dk    rdS | D ]#}t          |t                    s dS |dk     r dS $dS )r7   Frq   r   Trr   rs   s     r   *fontInfoVersion3OpenTypeOS2PanoseValidatorrv      sy     	6D%=)) 	KK2	  U	E3		 
%%
QYY
%%  	r   c                     t          | t          t          f          sdS t          |           dk    rdS | D ]}t          |t                    s dS | \  }}|dk     s|dk    rdS |dk     s|dk    rdS dS )r/   Fr9   r         Trr   )r   r   classID
subclassIDs       r   'fontInfoOpenTypeOS2FamilyClassValidatorr|     s     	6D%=)) 	KK1	  U	E3		 
%%*aKK7R<<	NNj2oo	r   c                     t          | t          t          f          sdS t          |           dk    rdS t          |           dz  rdS | D ]}t          |t                    s dS dS )r/   Frx   r9   Tr
   r   r   r=   r   rs   s     r    fontInfoPostscriptBluesValidatorr     ~     	6D%=)) 	KK"	KK!O 	  U	E;	'	' 
%%r   c                     t          | t          t          f          sdS t          |           dk    rdS t          |           dz  rdS | D ]}t          |t                    s dS dS )r/   Frq   r9   Tr~   rs   s     r   %fontInfoPostscriptOtherBluesValidatorr   #  r   r   c                     t          | t          t          f          sdS t          |           dk    rdS | D ]}t          |t                    s dS dS )r/   FrP   Tr~   rs   s     r    fontInfoPostscriptStemsValidatorr   2  sg     	6D%=)) 	KK"	  U	E;	'	' 
%%r   c                 L    t          t          dd                    }| |vrdS dS )r/   r8      FT)r   range)r   r   s     r   .fontInfoPostscriptWindowsCharacterSetValidatorr   ?  s.     E!RLL!!		r   c                 X    t          t          df          }t          | |          sdS dS )r7   T)idF)r>   rS   r-   r   rB   s     r   %fontInfoWOFFMetadataUniqueIDValidatorr   H  s4     #t%%%UM22 	r   c                     t           df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 )r7   TF)nameurldirclassr   ltrrtlrS   r-   getr   s     r   #fontInfoWOFFMetadataVendorValidatorr   Q  sh      ;esEl_bdi^jkkUM22 		UNNuyy''~==	r   c                 T   t          t          df          }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 ]3}t          ||          s dS d|v r|                    d          dvr dS 4dS )r7   T)creditsFr   )r   r   roler   r   r   r   )r>   r   r-   r=   rS   r   )r   rB   credits      r   $fontInfoWOFFMetadataCreditsValidatorr   \  s     tTl+++UM22 	E) 	;eU|^ach]ivy  |A  vB  C  CY  V	fm	4	4 
%%
f__E**.@@
%%r   c                     t          t          dft          df          }t          | |          sdS | d         D ]}t	          |          s dS dS )r7   FT)r   textr   r>   rS   r   r-   fontInfoWOFFMetadataTextValuer   rB   r   s      r   (fontInfoWOFFMetadataDescriptionValidatorr   m  si     3,dD\:::UM22 	6]  T	&t	,	, 
%%r   c                     t          t          dft          dft          df          }t          | |          sdS d| v r| d         D ]}t	          |          s dS dS )r7   F)r   r   r   r   Tr   r   s      r   $fontInfoWOFFMetadataLicenseValidatorr   y  sx     3,dE]U|LLLUM22 	
eOOFm  d
'
-
- 55r   c                     t          t          df          }t          | |          sdS | d         D ]}t          |          s dS dS r7   T)r   Fr   r>   r   r-   r   r   s      r   &fontInfoWOFFMetadataTrademarkValidatorr     c     D$<(((UM22 	6]  T	&t	,	, 
%%r   c                     t          t          df          }t          | |          sdS | d         D ]}t          |          s dS dS r   r   r   s      r   &fontInfoWOFFMetadataCopyrightValidatorr     r   r   c                     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 )r7   TF)r   r   r   r   r   r   r   s     r   %fontInfoWOFFMetadataLicenseeValidatorr     s_      ;eeUUUM22 		UNNuyy''~==	r   c                     t           df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 r7   TF)r   languager   r   r   r   r   r   s     r   r   r     i      ;c5\CQV<dgincoppUM22 		UNNuyy''~==	r   c                 j    t          | t                    sdS | sdS | D ]}t          |          s dS dS )r7   FT)r
   r   &fontInfoWOFFMetadataExtensionValidator)r   	extensions     r   'fontInfoWOFFMetadataExtensionsValidatorr     sX     	5$ 	 	  Y	/		:	: 
%%r   c                     t          t          dft          dft          df          }t          | |          sdS d| v r| d         D ]}t	          |          s dS | d         D ]}t          |          s dS dS )r7   FT)namesr	   r   r   r	   )r>   r   rS   r-   *fontInfoWOFFMetadataExtensionNameValidator*fontInfoWOFFMetadataExtensionItemValidator)r   rB   r   items       r   r   r     s     T5M$3,OOOUM22 	uGn  d
4T
:
: 557^  T	3D	9	9 
%%r   c                     t          t          dft          dft          df          }t          | |          sdS | d         D ]}t	          |          s dS | d         D ]}t          |          s dS dS )r7   FT)r   r   r   r   r   )r>   rS   r   r-   r   +fontInfoWOFFMetadataExtensionValueValidator)r   rB   r   vals       r   r   r     s     #udD\4,OOOUM22 	7^  T	3D	9	9 
%%(O  S	4S	9	9 
%%r   c                     t           df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   r   r   s     r   r   r     r   r   c                     t           df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   r   r   s     r   r   r     r   r   c                     t          | t                    sdS |t                      }| D ]G}t          |          s dS |                    d          }|||v r dS |                    |           HdS r7   FN
identifierT)r
   r   r   guidelineValidatorr   add)r   identifiersguider   s       r   guidelinesValidatorr     s     	5$ 	+  U	E	"	" 
%%yy&&*K55??:r   F)xyangler   colorr   c                    t          | t                    sdS |                     d          }|                     d          }|                     d          }||dS |||dS |||dS ||dk     rdS |dk    rdS |                     d          }|t          |          sdS |                     d	          }|t	          |          sdS d
S )r7   Fr   r   r   Nr   ih  r   r   T)r-   _guidelineDictPrototyper   identifierValidatorcolorValidator)r   r   r   r   r   r   s         r   r   r     s     	U$;<< 	
YYs^^
YYs^^	7		I!)	I

%Mam		
QYY
%
S[[
%ii%%#6z#B#B		7			nU33	r   c                     t          | t                    sdS |t                      }| D ]G}t          |          s dS |                    d          }|||v r dS |                    |           HdS r   )r
   r   r   anchorValidatorr   r   )r   r   anchorr   s       r   anchorsValidatorr   8  s     	5$ 	+  V		 	  
%%zz,''*K55??:r   )r   r   r   r   r   c                 4   t          | t                    sdS |                     d          }|                     d          }||dS |                     d          }|t          |          sdS |                     d          }|t	          |          sdS dS )r7   Fr   r   Nr   r   T)r-   _anchorDictPrototyper   r   r   )r   r   r   r   r   s        r   r   r   P  s     	U$899 	
YYs^^
YYs^^I	ii%%#6z#B#B		7			nU33	r   c                     d}d}t          | t                    sdS | sdS t          |           dk    rdS | D ] }t          |          }||k     s||k    r dS !dS )z
	Version 3+.

	>>> identifierValidator("a")
	True
	>>> identifierValidator("")
	False
	>>> identifierValidator("a" * 101)
	False
	    ~   Fd   T)r
   rS   r=   ord)r   validCharactersMinvalidCharactersMaxcs       r   r   r   i  s     5# 	 	JJ	
  Q	!ff!	q#555
%%  6r   c                 |   t          | t                    sdS |                     d          }t          |          dk    rdS |D ]w}|                                }d}	 t          |          }d}n# t          $ r Y nw xY w|s#	 t          |          }d}n# t          $ r Y nw xY w|s dS |dk     r dS |dk    r dS xd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,rO   Tr   r8   )r
   rS   rU   r=   stripr   rV   float)r   partspart	converteds       r   r   r     s   V 	5# 		S		JJ!OO	  T	$)
d))499	   4	 		;;DII
 	 	 	D		 
%%	AXX
%%	AXX
%% s$   A//
A<;A<B
B! B!s   PNG

T)fileNamexScalexyScaleyxScaleyScalexOffsetyOffsetr   c                     t          | t                    sdS | d         sdS |                     d          }|t          |          sdS dS )r7   Fr   r   NT)r-   _imageDictPrototyper   r   )r   r   s     r   imageValidatorr     s\     	U$788 	j 		7			nU33	r   c                 J   | ||J | >t          | d          5 }|                    d          }ddd           n# 1 swxY w Y   nM||dd         }n@|>|                                }|                    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datafileObjf	signatureposs         r   pngValidatorr     s     	D,0C0C0CD$ 1vvayy9              
2A2h))#ll1oo)	,,s	>	>
s   =AAc                 R   t          |t          j        j                  r|}nt          j                            |          }d}t          | t                    sd|fS t                      }t                      }i }| D ]}t          |t                    sd|fc S t          |          dk    sd|fc S |D ]}t          |t                    sd|fc c S  |\  }	}
|
dk    r|

                    d          s	dd|
z  fc S t          |	          dk    r dS |                    |
          s	dd	|
z  fc S |	d
k    r	|
dk    r dS |	|v r	dd|	z  fc S |                    |	           |
|v r	dd|
z  fc S |                    |
           |
||	<   d|                                v }|sdS dS )z;
	Check the validity of layercontents.plist.
	Version 3+.
	z1layercontents.plist in not in the correct format.Fr9   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baseFSosfsOSFSr   r   r=   rS   
startswithexistsr   r   )r   ufoPathOrFileSystem
fileSystembogusFileMessageusedLayerNamesusedDirectoriescontentsentryi	layerNamedirectoryNamefoundDefaults               r   layerContentsValidatorr    sN   
 "BGJ// 1"**w||/00*G5$ !	 	  %%55 & &U	E4	 	  "
!
!!!!	Uq
!
!!!! # #a
Q

 #"""""""#")]h

"
"9
-
- XG-WWWWW^^q
;
;
;			=	)	) D
3mC
CCCC"""}'@'@
\
\
\.  
DyP
PPPPYo%%
CmS
SSSSm$$$%(9HOO--- D	C	C
r   c                 \   d}t          |           sd|fS i }i }|                                 D ]\  }}t          |t                    sd|fc S t          |t          t
          f          sd|fc S |s dS |                    d          r|                    d          s|                    d          st          d          t          |          k    r dS |                    d          r|}n|}|D ]6}t          |t                    sdd	|z  fc c S ||v rdd
|z  fc c S |||<   7d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
   rS   r   r   r  r=   )r   bogusFormatMessagefirstSideMappingsecondSideMapping	groupName	glyphListd	glyphNames           r   groupsValidatorr  <  s   X EU #	"	"""[[]]  Y		I	%	% $
#
####	Ie}	-	- $
#
####	 .
-
-
-)$$ 



/
/ V	8L8L_8]8] V
?s9~~--UUU?++ AAA  yi%% OBYNNNNNNNA~~H9TTTTTTTAiLL
r   c                    d}t          | t                    sd|fS |                                 D ]\  }}t          |t                    sd|fc S t          |t                    sd|fc S |                                D ]?\  }}t          |t                    sd|fc c S t          |t                    sd|fc c S @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	   rS   r   )r   r  first
secondDictra   r   s         r   kerningValidatorr    s   . G4!! #	"	""**,, 	% 	%UJ	E3		 $
#
####j'** $
#
####!'')) % %mfe
VS
!
! %$$$$$$$uk** %$$$$$$$%%
 	
r   z-The lib data is not in the correct format: %sc                    t          |           s#dt          |           j        z  }dt          |z  fS |                                 D ]\  }} t          |t                    sddt          |          j        d|fc S |dk    rzd}t          | t          t          f          s dt          |           j        z  }d||z  fc S | D ]9}t          |t                    s"dt          |          j        z  }d||z  fc c S :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 %sFz;The lib key is not properly formatted: expected str, found z: zpublic.glyphOrderz/public.glyphOrder is not properly formatted: %sz expected list or tuple, found %szexpected str, found %sr   )	r   type__name___bogusLibFormatMessager	   r
   rS   r   r   )r   reasonr)   bogusGlyphOrderMessager  s        r   fontLibValidatorr'    sL   Z 	U 0,tE{{/CC&	&/	//;;== 3 3ZS%	C		 
%	#YY    	M
UT5M
*
* 2/$u++2FFF(611111 3 3yi%% 3&i)AAV)F22222223 	
r   c                    t          |           s#dt          |           j        z  }dt          |z  fS |                                 D ]E\  }} t          |t                    sd|z  }dt          |z  fc S |dk    rt          |           s dS Fd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
   rS   r   )r   r%  r)   s      r   glyphLibValidatorr)    s    0 	U 0,tE{{/CC&	&/	//;;== @ @ZS%	C		 1)C/6
'&0
0000


 @???
r   __main__)N)NNN)E__doc__rW   ior   fs.baser   fs.osfscollections.abcr   fontTools.ufoLib.utilsr   r   r   r   r#   r&   r-   r5   rI   rb   rj   rl   ro   rt   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>   r   r   rS   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r$  r'  r)  r#  doctesttestmodr3   r   r   <module>r3     sl   ( (          # # # # # # . . . . . .
 
 
          @    69 9 9v
 
 
  
 
 
       $          	 	 	  "
 
 
  
 
 

 
 
	 	 		 	 	       	 	 		 	 	   $ $%L%c5\513,9N
El3,C<   
! ! !N   $ t%L%c5\51
El3,%L     2  :D D DT $d+
uuee'<,	ee'<,	#uu(=U|        05 5 5vI I I^$ $ $T I ? ? ?J# # #L z r   