o
    viE                     @   s*  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZ e ZG dd deZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    N)ABCabstractmethod)BytesIO)Anyc                   @   sH   e Zd ZedfddZdd ZdddZd	d
 Zedd Z	dd Z
dS )	ValidatorFc                 C      || _ || _d S Ndefaulthiddenselfr
   r    r   S/data/cameron/vidgen/cosmos-policy/cosmos_policy/_src/imaginaire/utils/validator.py__init__$      
zValidator.__init__c                 C   s   d| | _ d S )N_)private_name)r   ownernamer   r   r   __set_name__*      zValidator.__set_name__Nc                 C   s>   t || j| j}|tu rt | ddd}td| d|S )Nr   unknownr   zParameter 'z]' is mandatory but has not been set. No default value was provided and no value was assigned.)getattrr   r
   _UNSETlstrip
ValueError)r   objobjtypevalue	attr_namer   r   r   __get__-   s   
zValidator.__get__c                 C   s   |  |}t|| j| d S r   )validatesetattrr   )r   r   r   r   r   r   __set__8   s   
zValidator.__set__c                 C      d S r   r   r   r   r   r   r   r"   <   s   zValidator.validatec                 C   r%   r   r   r   r   r   r   json@   s   zValidator.jsonr   )__name__
__module____qualname__r   r   r   r!   r$   r   r"   r(   r   r   r   r   r   #   s    

r   c                       sJ   e Zd Zeddf fdd	Zdd Zdd Zd	efd
dZdd Z	  Z
S )BoolFNc                    s$   t  || || _|| _|| _d S r   )superr   r
   r   tooltipr   r
   r   r.   	__class__r   r   r   E   s   
zBool.__init__c                 C   sv   t |tr|dk}|S t |tr,| }|dv rd}|S |dv r$d}|S td|dt |ts9td|d|S )	Nr   )true1T)false0F	Expected z) to be one of ['True', 'False', '1', '0']z to be an bool)
isinstanceintstrlowerr   bool	TypeErrorr&   r   r   r   r"   K   s   


zBool.validatec                 C   s   ddgS )NTFr   r'   r   r   r   get_range_iterator[   s   zBool.get_range_iteratorreturnc                 C      d| j d| jd| jdS )NzBool(self.private_name= self.default= self.hidden=)r   r
   r   r'   r   r   r   __repr__^      zBool.__repr__c                 C      t j| j| jdS N)typer
   r.   )r;   r)   r
   r.   r'   r   r   r   r(   a      z	Bool.json)r)   r*   r+   r   r   r"   r=   r9   rD   r(   __classcell__r   r   r0   r   r,   D   s    r,   c                   @   H   e Zd ZedddddfddZdd Zdd	 Zd
efddZdd Z	dS )IntN   Fc                 C   (   || _ || _|| _|| _|| _|| _d S r   minmaxr
   stepr   r.   r   r
   rP   rQ   rR   r   r.   r   r   r   r   j      
zInt.__init__c                 C   s   t |tr
t|}nt |tstd|d| jd ur,|| jk r,td|d| j| jd urA|| jkrAtd|d| j|S )Nr6    to be an int to be at least  to be no more than )r7   r9   r8   r<   rP   r   rQ   r&   r   r   r   r"   r   s   


zInt.validatec                    sz   | j tu rd}nt| j tttfrt| j nd}| jd ur | jn|}| jd ur*| jn|d  t	 fddt
|| jS )Nr   d   c                       |  kS r   r   xZiter_maxr   r   <lambda>       z(Int.get_range_iterator.<locals>.<lambda>r
   r   r7   r8   floatr9   rP   rQ   	itertools	takewhilecountrR   r   default_valZiter_minr   r\   r   r=   ~      
 zInt.get_range_iteratorr>   c                 C   .   d| j d| jd| jd| jd| jdS )NzInt(self.private_name=r@   , self.min=, self.max=rA   rB   r   r
   rP   rQ   r   r'   r   r   r   rD         .zInt.__repr__c                 C      t j| j| j| j| j| jdS N)rH   r
   rP   rQ   rR   r.   )r8   r)   r
   rP   rQ   rR   r.   r'   r   r   r   r(         zInt.json
r)   r*   r+   r   r   r"   r=   r9   rD   r(   r   r   r   r   rL   i       	rL   c                   @   rK   )FloatNg      ?Fc                 C   rN   r   rO   rS   r   r   r   r      rT   zFloat.__init__c                 C   s   t |ts
t |trt|}nt |tstd|d| jd ur1|| jk r1td|d| j| jd urF|| jkrFtd|d| j|S )Nr6   z to be floatrV   rW   )r7   r9   r8   r`   r<   rP   r   rQ   r&   r   r   r   r"      s   

zFloat.validatec                    sz   | j tu rd}nt| j tttfrt| j nd}| jd ur | jn|}| jd ur*| jn|d  t	 fddt
|| jS )Ng        g      Y@c                    rY   r   r   rZ   r\   r   r   r]      r^   z*Float.get_range_iterator.<locals>.<lambda>r_   rd   r   r\   r   r=      rf   zFloat.get_range_iteratorr>   c                 C   rg   )NzFloat(self.private_name=r@   rh   ri   rA   rB   rj   r'   r   r   r   rD      rk   zFloat.__repr__c                 C   rl   rm   )r`   r)   r
   rP   rQ   rR   r.   r'   r   r   r   r(      rn   z
Float.jsonro   r   r   r   r   rq      rp   rq   c                   @   sH   e Zd ZedddddfddZdd Zdd Zd	efd
dZdd Z	dS )StringNFc                 C   s(   || _ || _|| _|| _|| _|| _d S r   )rP   rQ   	predicater
   r   r.   )r   r
   rP   rQ   rs   r   r.   r   r   r   r      rT   zString.__init__c                 C   s   |d u r|S t |tstd|d| jd ur*t|| jk r*td|d| j| jd urAt|| jkrAtd|d| j| jd urV| |sVtd| j d||S )Nr6   z to be an str or Nonez to be no smaller than z to be no bigger than z to be true for )r7   r9   r<   rP   lenr   rQ   rs   r&   r   r   r   r"      s   
zString.validatec                 C      t | jgS r   iterr
   r'   r   r   r   r=         zString.get_range_iteratorr>   c                 C   rg   )NString(self.private_name=r@   rh   ri   rA   rB   rj   r'   r   r   r   rD      rk   zString.__repr__c                 C   rF   rG   )r9   r)   r
   r.   r'   r   r   r   r(      rI   zString.jsonro   r   r   r   r   rr      s    rr   c                   @   s:   e Zd ZeddfddZdd Zdd Zd	efd
dZdS )PathFNc                 C      || _ || _|| _d S r   r
   r   r.   r/   r   r   r   r         
zPath.__init__c                 C   sR   |d u r|S t |tst| j d|dtj|s't| j d|d|S )Nz validator: Expected  to be an str to be a valid path)r7   r9   r<   r   ospathexistsr   r&   r   r   r   r"      s   
zPath.validatec                 C   ru   r   rv   r'   r   r   r   r=      rx   zPath.get_range_iteratorr>   c                 C   r?   )Nry   r@   , self.hidden=rB   rC   r'   r   r   r   rD      rE   zPath.__repr__)	r)   r*   r+   r   r   r"   r=   r9   rD   r   r   r   r   rz      s
    
rz   c                   @   sH   e Zd Zeddg dfddZdd Zdd	 Zd
efddZdd Z	dS )
InputImageFN)jpegjpgpngbmpgifc                 C   s   || _ || _|| _|| _d S r   )r
   r   r.   supported_formats)r   r
   r   r.   r   r   r   r   r      s   
zInputImage.__init__c                 C   sf   t j|d  }|| jvrtd| t|ts#td|dt j	|s1td|d|S )NrM   zUnsupported image format: r6   r~   r   )
r   r   splitextr:   r   r   r7   r9   r<   r   )r   r   extr   r   r   r"     s   

zInputImage.validatec                 C   ru   r   rv   r'   r   r   r   r=     rx   zInputImage.get_range_iteratorr>   c                 C   r?   )Nry   r@   rA   rB   rC   r'   r   r   r   rD     rE   zInputImage.__repr__c                 C      t j| j| j| jdS N)rH   r
   valuesr.   )r   r)   r
   r   r.   r'   r   r   r   r(     
   zInputImage.jsonro   r   r   r   r   r      s    
r   c                   @   4   e Zd ZdZedfddZdd Zdefdd	Zd
S )JsonDictz~
    JSON stringified version of a python dict.
    Example: '{"ema_customization_iter.pt": "ema_customization_iter.pt"}'
    Fc                 C   r   r   r	   r   r   r   r   r   '  r   zJsonDict.__init__c              
   C   sL   |si S zt |}|W S  t jy% } ztd|dt| d }~ww )Nr6   z& to be json  stringified dict. Error: )r(   loadsJSONDecodeErrorr   r9   )r   r   dicter   r   r   r"   +  s   
zJsonDict.validater>   c                 C      d| j d| jdS )NzDict(self.default=rA   rB   r	   r'   r   r   r   rD   4     zJsonDict.__repr__N	r)   r*   r+   __doc__r   r   r"   r9   rD   r   r   r   r   r   !  s
    	r   c                   @   r   )Dicta,  
    Python dict.
    Example: {'key': 'value'}

    This allows a single level of parameter nesting, but not a full nested dict.
    For now we validate the individual keys here and store the dict as is.
    Alternatively, we could have a validator that gets/sets another ValidatorParams class.
    Fc                 C   r   r   r	   r   r   r   r   r   B  r   zDict.__init__c                 C   s   t |tstd|d|S )Nr6   z to be an dict)r7   r   r<   r&   r   r   r   r"   F  s   
zDict.validater>   c                 C   s>   t | | j| j}d| jd| jd| jdtj|dd d	S )NzDict(self.private_name=r@   rA   z value=   )indentrB   )r   r   r
   r   r(   dumpsr&   r   r   r   rD   K  s   .zDict.__repr__Nr   r   r   r   r   r   8  s
    	r   c                   @   sF   e Zd ZeddddfddZdd Zdd Zd	efd
dZdd Z	dS )OneOfNFc                 C   s4   |d urt |nt  | _|| _|| _|| _|| _d S r   )setoptionsr
   	type_castr.   r   )r   r
   r   r   r   r.   r   r   r   r   R  s
   
zOneOf.__init__c                 C   s^   | j rz|  |}W n ty   td|d| j w || jvr-td|d| j|S )Nr6    to be castable to  to be one of )r   r   r   r&   r   r   r   r"   Y  s   
zOneOf.validatec                 C   s   | j S r   )r   r'   r   r   r   r=   e  s   zOneOf.get_range_iteratorr>   c                 C   r?   )NzOneOf(self.private_name=z self.options=rA   rB   )r   r   r   r'   r   r   r   rD   h  rE   zOneOf.__repr__c                 C   s   t j| jt| j| jdS r   )r   r)   r
   listr   r.   r'   r   r   r   r(   k  s
   z
OneOf.jsonro   r   r   r   r   r   Q  s    r   c                   @   sL   e Zd ZeddddfdefddZdd Zd	d
 ZdefddZ	dd Z
dS )
MultipleOfrM   NFmultiple_ofc                 C   s>   t |turtd|d|| _|| _|| _|| _|| _d S )Nr6   rU   )rH   r8   r   r   r
   r   r   r.   )r   r
   r   r   r   r.   r   r   r   r   u  s   
zMultipleOf.__init__c                 C   sb   | j rz|  |}W n ty   td|d| j w || j dkr/td|d| j|S )Nr6   r   r   z to be a multiple of )r   r   r   r&   r   r   r   r"     s   zMultipleOf.validatec                 C   s   t d| jS )Nr   )ra   rc   r   r'   r   r   r   r=     r   zMultipleOf.get_range_iteratorr>   c                 C   r?   )NzMultipleOf(self.private_name=z self.multiple_of=rA   rB   )r   r   r   r'   r   r   r   rD     rE   zMultipleOf.__repr__c                 C   r   )N)rH   r
   r   r.   )r   r)   r
   r   r.   r'   r   r   r   r(     r   zMultipleOf.json)r)   r*   r+   r   r8   r   r"   r=   r9   rD   r(   r   r   r   r   r   t  s    r   c                   @   s`   e Zd ZeddfddZg dg dddgg d	d
Zdd Zdd ZdefddZ	dd Z
dS )HumanAttributesFNc                 C   r{   r   r|   r/   r   r   r   r     r}   zHumanAttributes.__init__)ZangryZcontemptfulZ	disgustedZfearfulZhappyZneutralsadZ	surprised)ZasianZindianblackwhitezmiddle easternzlatino hispanicZmaleZfemale)ZyoungZteenzadult early twentieszadult late twentieszadult early thirtieszadult late thirtieszadult middle agedzolder adultemotionracegender	age groupc                 C   sD   | j d }| j d }| j d }| j d }tt||||}t|S )Nr   r   r   r   )valid_attributesr   ra   productrw   )r   l1l2l3l4Zall_combinationsr   r   r   r=     s   



z"HumanAttributes.get_range_iteratorc                 C   sz   |  }|dvr;|}dD ].}d}| j| D ]}||r*|t|d d  }d} nq|du r:td|d| jq|S )N)nonerandomr   FrM   Tr6   r   )r:   r   
startswithrt   r   )r   r   Zhuman_attributesZattr_stringattr_keyZattr_detectedZ
attr_labelr   r   r   r"     s   
zHumanAttributes.validater>   c                 C   r   )Nz"HumanAttributes(self.private_name=rA   rB   )r   r   r'   r   r   r   rD     r   zHumanAttributes.__repr__c                 C   r   r   )r   r)   r
   r   r.   r'   r   r   r   r(     r   zHumanAttributes.json)r)   r*   r+   r   r   r   r=   r"   r9   rD   r(   r   r   r   r   r     s    	r   c                   @   sH   e Zd ZdZeddfddZdedefdd	Zde	fd
dZ
dd ZdS )BytesIOTypez
    Validator class for BytesIO. Valid inputs are either:
    - bytes
    - objects of class BytesIO
    - str which can be successfully  decoded into BytesIO
    FNc                 C   r{   r   r|   r/   r   r   r   r     r}   zBytesIOType.__init__r   r>   c              
   C   s|   t |tr&z
t|}t|W S  tjtfy% } ztd| d }~ww t |tr/t|S t |tr6|S t	d|d)NzInvalid Base64 encoded string: r6   z1 to be a Base64 encoded string, bytes, or BytesIO)
r7   r9   base64	b64decoder   binasciiErrorr   bytesr<   )r   r   Zdecoded_bytesr   r   r   r   r"     s   




zBytesIOType.validatec                 C   r   )NzBytesIOValidator(self.default=r   rB   r	   r'   r   r   r   rD     r   zBytesIOType.__repr__c                 C   rF   rG   )r   r)   r
   r.   r'   r   r   r   r(     rI   zBytesIOType.json)r)   r*   r+   r   r   r   r   r   r"   r9   rD   r(   r   r   r   r   r     s    r   )r   r   ra   r(   r   abcr   r   ior   typingr   objectr   r   r,   rL   rq   rr   rz   r   r   r   r   r   r   r   r   r   r   r   <module>   s,   !%,,%$#)@