
    h~                       % S r SSKJr  SSKrSSKJrJr  SSKJr  SSK	J
s  Jr  SSKJrJrJrJr  SSKJr  SSKJr  \\\\\\\\   S	4   4   \4   4   rSFS
 jrSGS jrSHS jrSFS jrSFS jr SIS jr!SFS jr"SFS jr#SFS jr$SFS jr%SFS jr&SFS jr'SJS jr(SJS jr)SJS jr*SJS jr+SJS jr,SJS jr-SFS jr.SFS jr/SFS jr0SFS  jr1SFS! jr2SFS" jr3SFS# jr4SFS$ jr5SFS% jr6SFS& jr7SFS' jr8SFS( jr9SFS) jr:SFS* jr;SFS+ jr<SKSLS, jjr=\" \>\?4S-4\>\?4S-4\>\?4S-4\S-4\S-4\S-4S.9r@S\AS/'   SFS0 jrBSKSLS1 jjrC\" \>\?4S-4\>\?4S-4\S-4\S-4\S-4S29rDS\AS3'   SFS4 jrESFS5 jrFSFS6 jrGS7rHS8\AS9'   \" \S:4\>\?4S-4\>\?4S-4\>\?4S-4\>\?4S-4\>\?4S-4\>\?4S-4\S-4S;9rIS\AS<'   S= rJ   SM       SNS> jjrK      SOS? jrLSPS@ jrMSQSA jrNSBrOSPSC jrPSPSD jrQ\RSE:X  a  SSKSrS\SR                  " 5         gg)Rz"Various low level data validators.    )annotationsN)MappingSequence)open)AnyTypeOptionalUnion)IntFloat)numberTypes.c                f    [        U [        5      (       a  gS H  n[        X5      (       a  M    g   g)zM
Some objects will likely come in that aren't
dicts but are dict-ish enough.
T)keysvaluesitemsF)
isinstancer   hasattr)valueattrs     U/var/www/fran/franai/venv/lib/python3.13/site-packages/fontTools/ufoLib/validators.pyisDictEnoughr      s1    
 %!!+u## ,     c                    [        X5      $ ) 
Generic. (Added at version 2.)
)r   )r   typs     r   genericTypeValidatorr   #   s     e!!r   c                    [        U [        [        45      (       d  g[        U 5      n[        U5      nX#-
  (       a  gU  H  n[        U[        5      (       a  M    g   g)r   FT)r   listtuplesetint)r   validValues	valuesSetvalidValuesSetr   s        r   genericIntListValidatorr$   *   sS     ftUm,,FI%N!%%%  r   c                >    [        U [        5      (       d  gU S:  a  gg 
Generic. (Added at version 3.)
Fr   Tr   r    r   s    r   genericNonNegativeIntValidatorr*   :   !     eS!!qyr   c                >    [        U [        5      (       d  gU S:  a  ggr&   )r   r   r)   s    r   !genericNonNegativeNumberValidatorr-   E   s!     e[))qyr   GenericDictc                >   [        U [        5      (       d  gUR                  5        H  u  nu  p4U(       d  M  X ;  d  M    g   U R                  5        H
  nX!;  d  M
    g   U R                  5        H)  u  p%X   u  pdUc	  U(       d  M  [        XV5      (       a  M)    g   g)r'   FT)r   r   r   r   )r   	prototypekeyr   requiredvprototypeTypes          r   genericDictValidatorr5   P   s    
 eW%% ) 1_c	 !2 zz|  ++-"+.9X!++   r   c                    / SQnX;   $ )
Version 2+.
)regularitalicboldzbold italic )r   optionss     r   "fontInfoStyleMapStyleNameValidatorr=   r   s     ;Gr   c                d   [        U [        5      (       d  g[        U 5      S:X  a  g/ SQn[        [        S4[        S4S9n/ nU  HX  n[        XB5      (       d    gUS   nUS   n[        U5      nU(       d    g[        Xa5      nU(       d    gUR                  U5        MZ     U[        U5      :w  a  gg)
Version 3+.
Fr   T)r            )rangeMaxPPEMrangeGaspBehaviorrC   rD   )
r   r   lendictr    r5   r*   r$   appendsorted)	r   validBehaviorsdictPrototype	ppemOrderrangeRecordppembehaviorppemValiditybehaviorValiditys	            r   )fontInfoOpenTypeGaspRangeRecordsValidatorrQ   z   s     eT""
5zQ!N!%4[T4L"M I#K??>*235d;28L  F9%%r   c                   [        U [        5      (       d  g[        U 5      S:X  d  gU R                  S5      S:w  a  gU R	                  S5      u  pUR                  S5      S:w  a  gUR                  S5      S:w  a  gUR	                  S5      u  p4n[        U5      S:w  a  g[        U5      S:w  a  g[        U5      S:w  a  g [        U5      n[        U5      n[        U5      nUS:  d  US	:  a  g[        R                  " Xg5      S   n	US:  d  X:  a  gUR	                  S5      u  pn[        U
5      S:w  a  g[        U5      S:w  a  g[        U5      S:w  a  g [        U
5      n[        U5      n[        U5      nUS
:  d  US:  a  gUS
:  d  US:  a  gUS
:  d  US:  a  gg! [         a     gf = f! [         a     gf = f)r7   F    r@   /rA   :      r      ;   T)	r   strrE   countsplitr    
ValueErrorcalendar
monthrange)r   strDatestrTimestrYearstrMonthstrDayintYearintMonthintDaymonthMaxDaystrHour	strMinute	strSecondintHour	intMinute	intSeconds                   r   $fontInfoOpenTypeHeadCreatedValidatorrp      s   
 eS!!u:{{31{{3'G}}SQ}}SQ 'c 2Gv
7|q
8}
6{ag,x=V !|x"}%%g8;KzV)$+MM#$6!G	
7|q
9~
9~g,	N		N	 {gl1}	B1}	B9  &  s$   !F" !F2 "
F/.F/2
F?>F?c                    [        U [        5      (       d  g[        [        S4[        S4[        S4[        S4[        S4S9nU  H  n[        X!5      (       a  M    g   g)r?   FT)nameID
platformID
encodingID
languageIDstring)r   r   rF   r    r[   r5   )r   rJ   
nameRecords      r   $fontInfoOpenTypeNameRecordsValidatorrx      s`     eT""!%T{;;;T{"M 
#J>>  r   c                >    [        U [        5      (       d  gU S:  a  gg)r7   Fr   Tr(   r)   s    r   'fontInfoOpenTypeOS2WeightClassValidatorrz      r+   r   c                L    [        U [        5      (       d  gU S:  a  gU S:  a  gg)r7   Fr@   	   Tr(   r)   s    r   &fontInfoOpenTypeOS2WidthClassValidatorr}      s+     eS!!qyqyr   c                    [        U [        [        45      (       d  g[        U 5      S:w  a  gU  H  n[        U[        5      (       a  M    g   g)z
Version 2.
F
   Tr   r   r   rE   r    r   r   s     r   *fontInfoVersion2OpenTypeOS2PanoseValidatorr      sF     ftUm,,
6{b%%%  r   c                    [        U [        [        45      (       d  g[        U 5      S:w  a  gU  H"  n[        U[        5      (       d    gUS:  d  M"    g   g)r?   Fr   r   Tr   r   s     r   *fontInfoVersion3OpenTypeOS2PanoseValidatorr     sP     ftUm,,
6{b%%%19	  r   c                    [        U [        [        45      (       d  g[        U 5      S:w  a  gU  H  n[        U[        5      (       a  M    g   U u  p#US:  d  US:  a  gUS:  d  US:  a  gg)r7   FrA   r         Tr   )r   r   classID
subclassIDs       r   'fontInfoOpenTypeOS2FamilyClassValidatorr     sn     ftUm,,
6{a%%%  !G{glA~br   c                    [        U [        [        45      (       d  g[        U 5      S:  a  g[        U 5      S-  (       a  gU  H  n[        U[        5      (       a  M    g   g)r7   Fr   rA   Tr   r   r   rE   r   r   s     r    fontInfoPostscriptBluesValidatorr   2  T     ftUm,,
6{R
6{Q%--  r   c                    [        U [        [        45      (       d  g[        U 5      S:  a  g[        U 5      S-  (       a  gU  H  n[        U[        5      (       a  M    g   g)r7   Fr   rA   Tr   r   s     r   %fontInfoPostscriptOtherBluesValidatorr   B  r   r   c                    [        U [        [        45      (       d  g[        U 5      S:  a  gU  H  n[        U[        5      (       a  M    g   g)r7   FrX   Tr   r   s     r    fontInfoPostscriptStemsValidatorr   R  sF     ftUm,,
6{R%--  r   c                :    [        [        SS5      5      nX;  a  gg)r7   r@      FT)r   range)r   r!   s     r   .fontInfoPostscriptWindowsCharacterSetValidatorr   `  s      uQ|$Kr   c                D    [        [        S4S9n[        X5      (       d  gg)r?   T)idF)rF   r[   r5   r   rJ   s     r   %fontInfoWOFFMetadataUniqueIDValidatorr   j  s#     "&#t!5M55r   c                    [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  gg)r?   TF)nameurldirclassr   ltrrtlr[   r5   getr   s     r   #fontInfoWOFFMetadataVendorValidatorr   t  sT    
 dU|U|u	"M  55~%))E*.@r   c                2   [        [        S4S9n[        X5      (       d  g[        U S   5      (       d  g[        S4[        S4[        S4[        S4[        S4S.nU S    H4  n[        X!5      (       d    gSU;   d  M  UR                  S5      S;  d  M4    g   g)r?   T)creditsFr   )r   r   roler   r   r   r   )rF   r   r5   rE   r[   r   )r   rJ   credits      r   $fontInfoWOFFMetadataCreditsValidatorr     s     "&tTl!;M55uY  dU|eU|uM 	"#F::F?vzz%0F	 #
 r   c                    [        [        S4[        S4S9n[        X5      (       d  gU S    H  n[	        U5      (       a  M    g   g)r?   FT)r   textr   rF   r[   r   r5   fontInfoWOFFMetadataTextValuer   rJ   r   s      r   (fontInfoWOFFMetadataDescriptionValidatorr     sG     "&3,dD\!JM55f,T22  r   c                    [        [        S4[        S4[        S4S9n[        X5      (       d  gSU ;   a  U S    H  n[	        U5      (       a  M    g   g)r?   F)r   r   r   r   Tr   r   s      r   $fontInfoWOFFMetadataLicenseValidatorr     sY     "&%Le}#u"M  55&MD066 " r   c                    [        [        S4S9n[        X5      (       d  gU S    H  n[        U5      (       a  M    g   gr?   T)r   Fr   rF   r   r5   r   r   s      r   &fontInfoWOFFMetadataTrademarkValidatorr     A     "&D$<!8M55f,T22  r   c                    [        [        S4S9n[        X5      (       d  gU S    H  n[        U5      (       a  M    g   gr   r   r   s      r   &fontInfoWOFFMetadataCopyrightValidatorr     r   r   c                    [         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  gg)r?   TF)r   r   r   r   r   r   r   s     r   %fontInfoWOFFMetadataLicenseeValidatorr     sM    
 dU|u"M
  55~%))E*.@r   c                    [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  ggr?   TF)r   languager   r   r   r   r   r   s     r   r   r     T    
 d%LU|u	"M  55~%))E*.@r   c                v    [        U [        5      (       d  gU (       d  gU  H  n[        U5      (       a  M    g   g)r?   FT)r   r   &fontInfoWOFFMetadataExtensionValidator)r   	extensions     r   'fontInfoWOFFMetadataExtensionsValidatorr     s7     eT""	5i@@  r   c                    [        [        S4[        S4[        S4S9n[        X5      (       d  gSU ;   a  U S    H  n[	        U5      (       a  M    g   U S    H  n[        U5      (       a  M    g   g)r?   FT)namesr   r   r   r   )rF   r   r[   r5   *fontInfoWOFFMetadataExtensionNameValidator*fontInfoWOFFMetadataExtensionItemValidator)r   rJ   r   items       r   r   r     sx     "&UmD$<S%L"M  55%'ND=dCC # g9$??  r   c                    [        [        S4[        S4[        S4S9n[        X5      (       d  gU S    H  n[	        U5      (       a  M    g   U S    H  n[        U5      (       a  M    g   g)r?   FT)r   r   r   r   r   )rF   r[   r   r5   r   +fontInfoWOFFMetadataExtensionValueValidator)r   rJ   r   vals       r   r   r     sp     "&<d|T4L"M  55g9$??  X:3??  r   c                    [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  ggr   r   r   s     r   r   r   (  r   r   c                    [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  ggr   r   r   s     r   r   r   9  r   r   c                    [        U [        5      (       d  gUc
  [        5       nU  HC  n[        U5      (       d    gUR	                  S5      nUc  M+  X1;   a    gUR                  U5        ME     gr?   F
identifierT)r   r   r   guidelineValidatorr   add)r   identifiersguider   s       r   guidelinesValidatorr   O  sg     eT""e!%((YY|,
!(OOJ'  r   F)xyangler   colorr   _guidelineDictPrototypec                   [        U [        5      (       d  gU R                  S5      nU R                  S5      nU R                  S5      nUc  Uc  gUb  Uc  Ub  gUb  Ub  Uc  gUb  US:  a  gUS:  a  gU R                  S5      nUb  [        U5      (       d  gU R                  S5      nUb  [	        U5      (       d  gg	)
r?   Fr   r   r   r   ih  r   r   T)r5   r   r   identifierValidatorcolorValidator)r   r   r   r   r   r   s         r   r   r   l  s      '>??		#A		#AIIgEyQYyAI}5=193;<(J&9*&E&EIIgE!6!6r   c                    [        U [        5      (       d  gUc
  [        5       nU  HC  n[        U5      (       d    gUR	                  S5      nUc  M+  X1;   a    gUR                  U5        ME     gr   )r   r   r   anchorValidatorr   r   )r   r   anchorr   s       r   anchorsValidatorr     sg     eT""ev&&ZZ-
!(OOJ'  r   )r   r   r   r   r   _anchorDictPrototypec                   [        U [        5      (       d  gU R                  S5      nU R                  S5      nUb  Uc  gU R                  S5      nUb  [        U5      (       d  gU R                  S5      nUb  [	        U5      (       d  gg)r?   Fr   r   r   r   T)r5   r   r   r   r   )r   r   r   r   r   s        r   r   r     s      ';<<		#A		#AyAI<(J&9*&E&EIIgE!6!6r   c                    SnSn[        U [        5      (       d  gU (       d  g[        U 5      S:  a  gU  H  n[        U5      nXA:  d  XB:  d  M    g   g)z{
Version 3+.

>>> identifierValidator("a")
True
>>> identifierValidator("")
False
>>> identifierValidator("a" * 101)
False
    ~   Fd   T)r   r[   rE   ord)r   validCharactersMinvalidCharactersMaxcis        r   r   r     s[     eS!!
5zCF!Q%;  r   c                f   [        U [        5      (       d  gU R                  S5      n[        U5      S:w  a  gU HT  nUR	                  5       nSn [        U5      nSnU(       d   [        U5      nSnU(       d    gSWs=::  a
  S::  a  MP     g    g   g! [         a     NBf = f! [         a     N=f = f)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,rW   Tr   r@   )r   r[   r]   rE   stripr    r^   float)r   partspart	convertednumbers        r   r   r     s    V eS!!KKE
5zQzz|		YFI t 	 Fa  % &   		  s$   B%B#
B B #
B0/B0s   PNG

bytespngSignatureT)fileNamexScalexyScaleyxScaleyScalexOffsetyOffsetr   _imageDictPrototypec                    [        U [        5      (       d  gU S   (       d  gU R                  S5      nUb  [        U5      (       d  gg)r?   Fr   r   T)r5   r   r   r   )r   r   s     r   imageValidatorr   C  sD      ':;;IIgE!6!6r   c                "   U c  Uc  Uc   eU b'  [        U S5       nUR                  S5      nSSS5        O>Ub  USS nO5Ub2  UR                  5       nUR                  S5      nUR                  U5        W[        :w  a  gg! , (       d  f       N= f)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seekr   )pathdatafileObjf	signatureposs         r   pngValidatorr  S  s     t/73FFF$q	I 		!H			llnLLO	SL D s   B  
Bc                F   [        U[        R                  R                  5      (       a  UnO[        R                  R                  U5      nSn[        U [        5      (       d  SU4$ [        5       n[        5       n0 nU  GH  n[        U[        5      (       d  SU4s  $ [        U5      S:X  d  SU4s  $ U H   n[        U[        5      (       a  M  SU4s  s  $    Uu  pU
S:w  a  U
R                  S5      (       d	  SSU
-  4s  $ [        U	5      S:X  a    gUR                  U
5      (       d	  SS	U
-  4s  $ U	S
:X  a  U
S:w  a    gX;   a	  SSU	-  4s  $ UR                  U	5        X;   a	  SSU
-  4s  $ UR                  U
5        XU	'   GM     SUR                  5       ;   nU(       d  gg)z8
Check the validity of layercontents.plist.
Version 3+.
z1layercontents.plist in not in the correct format.FrA   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   rE   r[   
startswithexistsr   r   )r   ufoPathOrFileSystem
fileSystembogusFileMessageusedLayerNamesusedDirectoriescontentsentryr   	layerNamedirectoryNamefoundDefaults               r   layerContentsValidatorr"  q  s    %rwwzz22(
WW\\"56
JeT""&&&UNeOH%&&***5zQ***Aa%%...  $) 	H$ ++I66I#$ 
 y>QD  //<}LLL((]h-F
 &CiO  	9%+B]R  	M*+W Z x00LIr   c                h   Sn[        U 5      (       d  SU4$ 0 n0 nU R                  5        GH  u  pE[        U[        5      (       d  SU4s  $ [        U[        [
        45      (       d  SU4s  $ U(       d    gUR                  S5      (       d  Mc  UR                  S5      (       d  UR                  S5      (       d  M  [        S5      [        U5      :X  a    gUR                  S5      (       a  UnOUnU H7  n[        U[        5      (       d  SS	U-  4s  s  $ Xv;   a  SS
U-  4s  s  $ XFU'   M9     GM     g)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  rE   )r   bogusFormatMessagefirstSideMappingsecondSideMapping	groupName	glyphListd	glyphNames           r   groupsValidatorr+    sF   X H(((')(* %	)c++,,,)dE]33,,,6	**''88AUAUB B '3y>9 ##O44$%&	!)S11G)S  >KiW   )) '/ !.F r   c                ~   Sn[        U [        5      (       d  SU4$ U R                  5        H  u  p#[        U[        5      (       d  SU4s  $ [        U[        5      (       d  SU4s  $ UR                  5        H?  u  pE[        U[        5      (       d  SU4s  s  $ [        U[        5      (       a  M9  SU4s  s  $    M     g)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$  first
secondDictsecondr   s         r   kerningValidatorr0    s    . JdG$$(((!ZZ\%%%,,,J00,,,'--/MFfc**000{33000	 0 * r   z-The lib data is not in the correct format: %sc                   [        U 5      (       d#  S[        U 5      R                  -  nS[        U-  4$ U R	                  5        H  u  p [        U[        5      (       d!  SS[        U5      R                  < SU< 34s  $ US:X  d  MC  Sn[        U [        [        45      (       d   S[        U 5      R                  -  nSX1-  4s  $ U  H:  n[        U[        5      (       a  M  S[        U5      R                  -  nSX1-  4s  s  $    M     g	)
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 %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   r[   r   r   )r   reasonr1   bogusGlyphOrderMessager*  s        r   fontLibValidatorr8  G  s    Z 2T%[5I5II,v555kkm
#s##9%%s, 
 %%%V"edE]33;d5k>R>RR4==="	!)S115Y8P8PPF "8"AAA # $  r   c                   [        U 5      (       d#  S[        U 5      R                  -  nS[        U-  4$ U R	                  5        HF  u  p [        U[        5      (       d  SU-  nS[        U-  4s  $ US:X  d  M4  [        U 5      (       a  MF    g   g)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.
r2  Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r  )r   r3  r4  r5  r   r   r[   r   )r   r6  r1   s      r   glyphLibValidatorr:    s    0 2T%[5I5II,v555kkm
#s##2S8F06999$$!%((K $ r   __main__)r   r   returnbool)r   r   r   z	Type[Any]r<  r=  )r   r   r!   zSequence[int]r<  r=  )r   r   r0   r.   r<  r=  )r   r   r<  r=  )N)r   r   r   zOptional[set[str]]r<  r=  )NNN)r  zOptional[str]r	  zOptional[bytes]r
  zOptional[Any]r<  ztuple[bool, Any])r   r   r  zUnion[str, fs.base.FS]r<  tuple[bool, Optional[str]])r   r   r<  r>  )r	  r   r<  r>  )U__doc__
__future__r   r_   collections.abcr   r   ior   fontTools.misc.filesystemmisc
filesystemr  typingr   r   r	   r
   fontTools.annotationsr   fontTools.ufoLib.utilsr   rF   r[   r   r3  r=  r.   r   r   r$   r*   r-   r5   r=   rQ   rp   rx   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   __annotations__r   r   r   r   r   r   r   r   r   r  r"  r+  r0  r5  r8  r:  r4  doctesttestmodr;   r   r   <module>rL     s   ( "  -  & & - - * .3eD%S	3*?$?@$FGGH
" D<9x&
"&  "0
 

 "&$",& (,U|UU|U<

u,U|(  !R& %)U|UU|U
u,U|% k 6>CT +e *#'4[%L% 5\5!5\5!%L% 5\5!5\5!,	$ [ 	"  !

  	<DD%;DDXTx$V I @P#L zOO r   