B
    Jde              
   @   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rddlCZCeCD  dS )mz"Various low level data validators.    N)open)Mapping)numberTypesc             C   s.   t | trdS xdD ]}t| |sdS qW 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   M/var/www/html/venv/lib/python3.7/site-packages/fontTools/ufoLib/validators.pyisDictEnough   s    


r   c             C   s
   t | |S )z"
	Generic. (Added at version 2.)
	)r   )r
   typr   r   r   genericTypeValidator   s    r   c             C   sN   t | ttfsdS t| }t|}|| r.dS x| D ]}t |ts4dS q4W dS )z"
	Generic. (Added at version 2.)
	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 )z"
	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 )z"
	Generic. (Added at version 3.)
	Fr   T)r   r   )r
   r   r   r   !genericNonNegativeNumberValidator;   s
    
r   c             C   s   t | tsdS x*| D ]\}\}}|s*q|| krdS qW x|  D ]}||krDdS qDW x<|  D ]0\}}|| \}}|dkr|sqbt ||sbdS qbW dS )z"
	Generic. (Added at version 3.)
	FNT)r   r   r   r   )r
   Z	prototypekeyr   requiredvZprototypeTyper   r   r   genericDictValidatorE   s"    

r   c             C   s   ddddg}| |kS )z
	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 ddddg}ttdftdfd}g }xV| D ]N}t||sZdS |d }|d	 }t|}|szdS t||}|sdS || qHW |t	|krdS dS )
z
	Version 3+.
	Fr   T         )rangeMaxPPEMrangeGaspBehaviorr$   r%   )
r   r   lendictr   r   r   r   appendsorted)	r
   ZvalidBehaviorsdictPrototypeZ	ppemOrderZrangeRecordZppemZbehaviorZppemValidityZbehaviorValidityr   r   r   )fontInfoOpenTypeGaspRangeRecordsValidatorl   s,    



r+   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rdS t|dkrdS t|dkrdS yt|}t|}t|}W n tk
r   dS X |dk s|d	krd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 yt|}t|}t|	}	W n tk
r   dS X |d
k s|dkrdS |d
k s|dkrdS |	d
k s|	dkrdS dS )z
	Version 2+.
	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    
rB   c             C   sT   t | tsdS ttdftdftdftdftdfd}x| D ]}t||s:dS q:W dS )z
	Version 3+.
	FT)ZnameIDZ
platformIDZ
encodingIDZ
languageIDstring)r   r   r'   r   r4   r   )r
   r*   Z
nameRecordr   r   r   $fontInfoOpenTypeNameRecordsValidator   s    
&

rD   c             C   s   t | tsdS | dk rdS dS )z
	Version 2+.
	Fr   T)r   r   )r
   r   r   r   'fontInfoOpenTypeOS2WeightClassValidator   s
    
rE   c             C   s*   t | tsdS | dk rdS | dkr&dS dS )z
	Version 2+.
	Fr!   	   T)r   r   )r
   r   r   r   &fontInfoOpenTypeOS2WidthClassValidator   s    
rG   c             C   sB   t | ttfsdS t| dkr"dS x| D ]}t |ts(dS q(W dS )z
	Version 2.
	F
   T)r   r   r   r&   r   )r   r
   r   r   r   *fontInfoVersion2OpenTypeOS2PanoseValidator   s    

rI   c             C   sN   t | ttfsdS t| dkr"dS x&| D ]}t |ts:dS |dk r(dS q(W dS )z
	Version 3+.
	FrH   r   T)r   r   r   r&   r   )r   r
   r   r   r   *fontInfoVersion3OpenTypeOS2PanoseValidator   s    

rJ   c             C   sr   t | ttfsdS t| dkr"dS x| D ]}t |ts(dS q(W | \}}|dk sV|dkrZdS |dk sj|dkrndS dS )z
	Version 2+.
	Fr"   r         T)r   r   r   r&   r   )r   r
   ZclassIDZ
subclassIDr   r   r   'fontInfoOpenTypeOS2FamilyClassValidator  s    

rM   c             C   sR   t | ttfsdS t| dkr"dS t| d r2dS x| D ]}t |ts8dS q8W dS )z
	Version 2+.
	FrK   r"   T)r   r   r   r&   r   )r   r
   r   r   r    fontInfoPostscriptBluesValidator  s    

rN   c             C   sR   t | ttfsdS t| dkr"dS t| d r2dS x| D ]}t |ts8dS q8W dS )z
	Version 2+.
	FrH   r"   T)r   r   r   r&   r   )r   r
   r   r   r   %fontInfoPostscriptOtherBluesValidator#  s    

rO   c             C   sB   t | ttfsdS t| dkr"dS x| D ]}t |ts(dS q(W dS )z
	Version 2+.
	Fr1   T)r   r   r   r&   r   )r   r
   r   r   r    fontInfoPostscriptStemsValidator2  s    

rP   c             C   s   t tdd}| |krdS dS )z
	Version 2+.
	r!      FT)r   range)r
   r   r   r   r   .fontInfoPostscriptWindowsCharacterSetValidator?  s    rS   c             C   s    t tdfd}t| |sdS dS )z
	Version 3+.
	T)idF)r'   r4   r   )r
   r*   r   r   r   %fontInfoWOFFMetadataUniqueIDValidatorH  s    
rU   c             C   sJ   t dft dft dft dfd}t| |s,dS d| krF| ddkrFdS dS )z
	Version 3+.
	TF)nameurldirclassrX   )ltrrtl)r4   r   get)r
   r*   r   r   r   #fontInfoWOFFMetadataVendorValidatorQ  s    
r]   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}x8| d D ],}t||sldS d|krZ|ddkrZdS qZW dS )z
	Version 3+.
	T)creditsFr^   )rV   rW   ZrolerX   rY   rX   )rZ   r[   )r'   r   r   r&   r4   r\   )r
   r*   Zcreditr   r   r   $fontInfoWOFFMetadataCreditsValidator\  s    
$
r_   c             C   sD   t tdftdfd}t| |s"dS x| d D ]}t|s,dS q,W dS )z
	Version 3+.
	FT)rW   textr`   )r'   r4   r   r   fontInfoWOFFMetadataTextValue)r
   r*   r`   r   r   r   (fontInfoWOFFMetadataDescriptionValidatorm  s    
rb   c             C   sR   t tdftdftdfd}t| |s(dS d| krNx| d D ]}t|s:dS q:W dS )z
	Version 3+.
	F)rW   r`   rT   r`   T)r'   r4   r   r   ra   )r
   r*   r`   r   r   r   $fontInfoWOFFMetadataLicenseValidatory  s    
rc   c             C   s>   t tdfd}t| |sdS x| d D ]}t|s&dS q&W dS )z
	Version 3+.
	T)r`   Fr`   )r'   r   r   ra   )r
   r*   r`   r   r   r   &fontInfoWOFFMetadataTrademarkValidator  s    
rd   c             C   s>   t tdfd}t| |sdS x| d D ]}t|s&dS q&W dS )z
	Version 3+.
	T)r`   Fr`   )r'   r   r   ra   )r
   r*   r`   r   r   r   &fontInfoWOFFMetadataCopyrightValidator  s    
re   c             C   sD   t dft dft dfd}t| |s&dS d| kr@| ddkr@dS dS )z
	Version 3+.
	TF)rV   rX   rY   rX   )rZ   r[   )r4   r   r\   )r
   r*   r   r   r   %fontInfoWOFFMetadataLicenseeValidator  s    
rf   c             C   sJ   t dft dft dft dfd}t| |s,dS d| krF| ddkrFdS dS )z
	Version 3+.
	TF)r`   languagerX   rY   rX   )rZ   r[   )r4   r   r\   )r
   r*   r   r   r   ra     s    
ra   c             C   s4   t | tsdS | sdS x| D ]}t|sdS qW dS )z
	Version 3+.
	FT)r   r   &fontInfoWOFFMetadataExtensionValidator)r
   	extensionr   r   r   'fontInfoWOFFMetadataExtensionsValidator  s    

rj   c             C   sp   t tdftdftdfd}t| |s(dS d| krNx| d D ]}t|s:dS q:W x| d D ]}t|sXdS qXW dS )z
	Version 3+.
	FT)namesr   rT   rk   r   )r'   r   r4   r   *fontInfoWOFFMetadataExtensionNameValidator*fontInfoWOFFMetadataExtensionItemValidator)r
   r*   rV   itemr   r   r   rh     s    
rh   c             C   sh   t tdftdftdfd}t| |s(dS x| d D ]}t|s2dS q2W x| d D ]}t|sPdS qPW dS )z
	Version 3+.
	FT)rT   rk   r   rk   r   )r'   r4   r   r   rl   +fontInfoWOFFMetadataExtensionValueValidator)r
   r*   rV   valr   r   r   rm     s    
rm   c             C   sJ   t dft dft dft dfd}t| |s,dS d| krF| ddkrFdS dS )z
	Version 3+.
	TF)r`   rg   rX   rY   rX   )rZ   r[   )r4   r   r\   )r
   r*   r   r   r   rl     s    
rl   c             C   sJ   t dft dft dft dfd}t| |s,dS d| krF| ddkrFdS dS )z
	Version 3+.
	TF)r`   rg   rX   rY   rX   )rZ   r[   )r4   r   r\   )r
   r*   r   r   r   ro     s    
ro   c             C   sb   t | tsdS |dkrt }x@| D ]8}t|s2dS |d}|dk	r"||krPdS || q"W dS )z
	Version 3+.
	FN
identifierT)r   r   r   guidelineValidatorr\   add)r
   identifiersZguiderq   r   r   r   guidelinesValidator  s    


ru   F)xyanglerV   colorrq   c             C   s   t | tsdS | d}| d}| d}|dkr@|dkr@dS |dksP|dkr\|dk	r\dS |dk	rx|dk	rx|dkrxdS |dk	r|dk rdS |dkrdS | d}|dk	rt|sdS | d	}|dk	rt|sdS d
S )z
	Version 3+.
	Frv   rw   rx   Nr   ih  rq   ry   T)r   _guidelineDictPrototyper\   identifierValidatorcolorValidator)r
   rv   rw   rx   rq   ry   r   r   r   rr     s0    





rr   c             C   sb   t | tsdS |dkrt }x@| D ]8}t|s2dS |d}|dk	r"||krPdS || q"W dS )z
	Version 3+.
	FNrq   T)r   r   r   anchorValidatorr\   rs   )r
   rt   anchorrq   r   r   r   anchorsValidator8  s    


r   )rv   rw   rV   ry   rq   c             C   sv   t | tsdS | d}| d}|dks2|dkr6dS | d}|dk	rTt|sTdS | d}|dk	rrt|srdS dS )z
	Version 3+.
	Frv   rw   Nrq   ry   T)r   _anchorDictPrototyper\   r{   r|   )r
   rv   rw   rq   ry   r   r   r   r}   P  s    




r}   c             C   s\   d}d}t | tsdS | sdS t| dkr.dS x(| D ] }t|}||k sP||kr4dS q4W dS )z
	Version 3+.

	>>> identifierValidator("a")
	True
	>>> identifierValidator("")
	False
	>>> identifierValidator("a" * 101)
	False
	    ~   Fd   T)r   r4   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 x|D ]}| }d}yt|}d}W n tk
rb   Y nX |syt|}d}W n tk
r   Y nX |sdS |dk rdS |dkr.dS q.W 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,r0   Tr   r!   )r   r4   r6   r&   stripr   r7   float)r
   partspartZ	convertedr   r   r   r|     s4    +


r|   s   PNG

T)fileNameZxScaleZxyScaleZyxScaleZyScaleZxOffsetZyOffsetry   c             C   s<   t | tsdS | d sdS | d}|dk	r8t|s8dS dS )z
	Version 3+.
	Fr   ry   NT)r   _imageDictPrototyper\   r|   )r
   ry   r   r   r   imageValidator  s    

r   c          	   C   s   | dk	s|dk	s|dk	st | dk	rFt| d}|d}W dQ R X n:|dk	r\|dd }n$|dk	r| }|d}|| |tkrd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)AssertionErrorr   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 }x| D ]}t |tsbd|fS t|dksvd|fS x|D ]}t |t	s|d|fS q|W |\}	}
|
dkr|

dsdd|
 fS t|	dkrdS ||
sdd	|
 fS |	d
kr|
dkrdS |	|krdd|	 fS ||	 |
|kr,dd|
 fS ||
 |
||	< qLW d| k}|sXd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.)TN)r   fsbaseZFSZosfsZOSFSr   r   r&   r4   
startswithexistsrs   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 }x|  D ]\}}t|ts@d|fS t|ttfsVd|fS |s^dS |dr&|ds|dsq&ntdt|krdS |dr|}n|}x>|D ]6}t|tsdd	| fS ||krdd
| fS |||< qW q&W 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.)TN)r   r   r   r4   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 xr|  D ]f\}}t |ts:d|fS t |tsLd|fS x8| D ],\}}t |tspd|fS t |tsVd|fS qVW q W 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.F)TN)r   r   r   r4   r   )r   r   firstZ
secondDictrA   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 x|  D ]\}} t|tsTddt|j|f fS |dkr,d}t| ttfsdt| j }d|| fS x0| D ](}t|tsdt|j }d|| fS qW q,W 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,...
	z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 %s)TN)	r   type__name___bogusLibFormatMessager   r   r4   r   r   )r
   reasonr   ZbogusGlyphOrderMessager   r   r   r   fontLibValidator  s$    -


r   c             C   sn   t | s"dt| j }dt| fS xF|  D ]:\}} t|tsRd| }dt| fS |dkr,t| s,dS q,W 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.
	zexpected a dictionary, found %sFzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.)TN)r   r   r   r   r   r   r4   r|   )r
   r   r   r   r   r   glyphLibValidator  s    
r   __main__)N)N)NNN)E__doc__r8   ior   Zfs.baser   Zfs.osfscollections.abcr   ZfontTools.ufoLib.utilsr   r   r   r   r   r   r   r    r+   rB   rD   rE   rG   rI   rJ   rM   rN   rO   rP   rS   rU   r]   r_   rb   rc   rd   re   rf   ra   rj   rh   rm   rl   ro   ru   r'   r   r   r4   rz   rr   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&
