o
    Ďi-                     @   s   d dl Z d dlZd dlmZmZ d dlmZ G dd deZG dd deZe	dZ
d	d
 Zdd 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)datetime	timedelta)	FieldMaskc                   @      e Zd Zdd ZdS )ObjectSerializerc                 C   s   || _ || _d S N)to_dict_valuefrom_dict_value)selfr   r	    r   S/home/jeff/fluffinator/venv/lib/python3.10/site-packages/kagglesdk/kaggle_object.py__init__	   s   
zObjectSerializer.__init__N__name__
__module____qualname__r   r   r   r   r   r          r   c                   @   r   )PredefinedSerializerc                 C      t | dd dd  dS )zOPredefined objects such as int, float etc are serialized/deserialized directly.c                 S      |S r   r   clsv_r   r   r   <lambda>       z/PredefinedSerializer.__init__.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r   r      r   Nr   r   r
   r   r   r   r      s   zPredefinedSerializer.__init__Nr   r   r   r   r   r      r   r   z(((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))c                 C   s   t d|  S )Nz_\1)!_pascal_to_upper_snake_case_regexsubupper)stringr   r   r    _pascal_case_to_upper_snake_case      r#   c                 C   s   t d| }dttj|S )Nz0[A-Z]?[a-z]+|[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)|\d+r   )refindalljoinmapstrlower)camel_inputwordsr   r   r   _convert   s   r-   c                   @   ,   e Zd Zdd Zedd Zedd ZdS )EnumSerializerc                 C   r   )a1  
        Enum objects are serialized using their ".name" field and deserialized by indexing the string in the Enum type.
        Example:
        class Foo(Enum):
           TEST = 1
        foo = Foo.TEST
        foo.name # => returns "TEST"
        Foo["TEST"] # => returns Foo.TEST enum value.
        c                 S      t | |S r   )r/   _to_strr   r   r   r   r   0       z)EnumSerializer.__init__.<locals>.<lambda>c                 S   r0   r   )r/   	_from_strr   r   r   r   r   1   r2   Nr   r   r   r   r   r   $   s
   
zEnumSerializer.__init__c                 C   s   |j S r   )namer   r   r   r   r1   4   s   zEnumSerializer._to_strc                 C   s   z| | W S  t yP   t| }| }t| }t| j }| D ])}| }||kr7||    Y S ||rA||sF||rN||    Y S q% w r   )	KeyErrorvarsr*   r-   r#   r   keys
startswithendswith)r   r   dctnnnenum_prefixkeykr   r   r   r3   :   s    
zEnumSerializer._from_strNr   r   r   r   staticmethodr1   r3   r   r   r   r   r/   "   s    
r/   c                   @      e Zd ZdefddZdS )ListSerializeritem_serializerc                    "   t |  fdd fdd dS )z
        Lists are serialized based on the type they contain. Since objects are generated from proto files, a list always
        contains objects of the same type, which is serialized/deserialized using "item_serializer".
        c                    s    fdd|D S )Nc                    s   g | ]	}  |qS r   r   .0r   r   ignore_defaultsrD   r   r   
<listcomp>W   s    =ListSerializer.__init__.<locals>.<lambda>.<locals>.<listcomp>r   )r   lrJ   rD   r   rJ   r   r   W   s    z)ListSerializer.__init__.<locals>.<lambda>c                    s    fdd|D S )Nc                    s   g | ]}  |qS r   r	   rG   r   rD   r   r   rK   X       rL   r   )r   rM   rN   r   r   r   X   s    Nr   r
   rD   r   rN   r   r   P   s
   

zListSerializer.__init__Nr   r   r   r   r   r   r   r   r   rC   N       rC   c                   @   rB   )MapSerializerrD   c                    rE   )z
        Maps are serialized based on type of their values. Since maps keys are always predefined types, we don't need a
        serializer for them.
        c                    s    fdd|  D S )Nc                    s    i | ]\}}|  |qS r   rF   rH   r?   r   rI   r   r   
<dictcomp>e   s    <MapSerializer.__init__.<locals>.<lambda>.<locals>.<dictcomp>items)r   drJ   rN   rO   r   r   e   s    z(MapSerializer.__init__.<locals>.<lambda>c                    s    fdd|  D S )Nc                    s   i | ]\}}|  |qS r   rP   rX   rQ   r   r   rY   h       rZ   r[   )r   r]   rN   rS   r   r   h   rR   Nr   rT   r   rN   r   r   ^   s
   

zMapSerializer.__init__NrU   r   r   r   r   rW   \   rV   rW   c                   @   r.   )DateTimeSerializerc                 C   r   )z@Date times are serialized/deserialized as a string in iso formatc                 S   
   t |S r   )r_   r1   )r   dtr   r   r   r   r   r      
 z-DateTimeSerializer.__init__.<locals>.<lambda>c                 S   r`   r   )r_   r3   )r   r   r   r   r   r   s   rb   Nr   r   r   r   r   r   n   
   zDateTimeSerializer.__init__c                 C   s   | j ddd S )Nmilliseconds)timespecZ)	isoformat)ra   r   r   r   r1   v      zDateTimeSerializer._to_strc                 C   sv   |  d} | jddd}t|dkrt| S |\}}|d d }zt| d| W S  ty:   t| Y S w )Nrf   .   )maxsplit   )rstriprsplitlenr   fromisoformat
ValueError)r   fieldsra   nanosmillisr   r   r   r3   z   s   

zDateTimeSerializer._from_strNr@   r   r   r   r   r_   l   s    
r_   c                   @   s@   e Zd Zg dZdd Zedd Zedd Zedd	 Zd
S )TimeDeltaSerializer)
r   i i @B i i'    d   
   rj   c                 C   r   )zkTime deltas are serialized/deserialized as a string in "<seconds>.<nanoseconds>s" format. Example: 151.500sc                 S   r`   r   )ru   _to_dict_value)r   tr   r   r   r   r      rb   z.TimeDeltaSerializer.__init__.<locals>.<lambda>c                 S   r`   r   )ru   _from_dict_valuer   r   r   r   r      rb   Nr   r   r   r   r   r      rc   zTimeDeltaSerializer.__init__c                 C   s4   | j }t| jd }|d u rd|S d||S )Nrw   z{}sz{}.{}s)secondsru   _nanos_to_strmicrosecondsformat)deltar}   	nanos_strr   r   r   rz      s
   
z"TimeDeltaSerializer._to_dict_valuec                 C   sZ   | dkrd S | dk r| d9 } | d dkrd | d S | d dkr(d | d S d | S )Nr   rv   z{}rw   )r   )rs   r   r   r   r~      s   
z!TimeDeltaSerializer._nanos_to_strc                 C   sF   |  dd\}}t|tjt|  }tt|tt|d dS )Nsri   rw   )r}   r   )rm   splitintru   SUBSECOND_SCALING_FACTORSro   r   )valuer}   nanosRawrs   r   r   r   r|      s   z$TimeDeltaSerializer._from_dict_valueN)	r   r   r   r   r   rA   rz   r~   r|   r   r   r   r   ru      s    

ru   c                   @   s    e Zd Zdd Zedd ZdS )FieldMaskSerializerc                 C   r   )zhField masks are serialized/deserialized as a string that contains a list of paths with a comma delimiterc                 S   s   |  S r   )ToJsonString)r   mr   r   r   r   r      s    z.FieldMaskSerializer.__init__.<locals>.<lambda>c                 S   r`   r   )r   _from_joined_pathsr   r   r   r   r      rb   Nr   r   r   r   r   r      rc   zFieldMaskSerializer.__init__c                 C   s   t  }||  |S r   )r   FromJsonString)joined_pathsmaskr   r   r   r      s   
z&FieldMaskSerializer._from_joined_pathsN)r   r   r   r   rA   r   r   r   r   r   r      s    r   c                   @   r   )KaggleObjectSerializerc                 C   r   )z
        Kaggle objects (i.e., proto-generated types that inherit from KaggleObject) have custom "to_dict" and "from_dict"
        methods that serialize/deserialize them to/from dictionaries.
        c                 S   s   |  ||S r   )to_dict)r   r   rJ   r   r   r   r      r2   z1KaggleObjectSerializer.__init__.<locals>.<lambda>c                 S   s
   |  |S r   )	from_dictr   r   r   r   r      rb   Nr   r   r   r   r   r      s
   zKaggleObjectSerializer.__init__Nr   r   r   r   r   r      r   r   c                   @   s*   e Zd Z	d
ddZdddZdd Zd	S )FieldMetadataFc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S r   )	json_name
field_nameprivate_field_name
field_typedefault_value
serializeroptional)r
   r   r   r   r   r   r   r   r   r   r   r      s   

zFieldMetadata.__init__Tc                 C   s<   t || j}|r|| jkrd S |d u rd S | j| j||S r   )getattrr   r   r   r   r   )r
   instancerJ   r   r   r   r   get_as_dict_item   s   zFieldMetadata.get_as_dict_itemc              
   C   sb   | j |vrd S || j  }|| jkrd S zt|| j| j| j| W d S  ty0 } z d }~ww r   )r   r   setattrr   r   r	   r   	Exception)r
   r   	json_dictr   er   r   r   set_from_dict   s   



zFieldMetadata.set_from_dictN)FT)r   r   r   r   r   r   r   r   r   r   r      s
    


r   c                   @   s   e Zd Zdd Zedd Zedd Zedd Zed	d
 Z	dd Z
dd Zd%ddZd%ddZedd Zedd Zd%ddZdd Zdd Zdd Zd d! Zd"d# Zd$S )&KaggleObjectc                 C   s   d)Nz5Error: endpoint must be defined by the request objectr   r   r   r   r   endpoint  s   zKaggleObject.endpointc                   C      d S r   r   r   r   r   r   endpoint_path     zKaggleObject.endpoint_pathc                   C   r   r   r   r   r   r   r   body_fields  r   zKaggleObject.body_fieldsc                 C   s   |  |jS r   )	from_jsontext)r   http_responser   r   r   prepare_from  s   zKaggleObject.prepare_fromc                   C   s   dS )NGETr   r   r   r   r   method  r   zKaggleObject.methodc                 C   s
   d| _ d S )NT)
_is_frozenr   r   r   r   _freeze!  s   
zKaggleObject._freezec                 C   s>   t | drt | |std| jj d| t| || d S )Nr   zUnknown field for z: )hasattrAttributeError	__class__r   object__setattr__)r
   r>   r   r   r   r   r   $  s   zKaggleObject.__setattr__Tc                    (    fddj D } fdd|D S )Nc                       g | ]}|j | fqS r   )r   r   rH   fieldrJ   r
   r   r   rK   *  r^   z(KaggleObject.to_dict.<locals>.<listcomp>c                    "   i | ]\}} r|d ur||qS r   r   rX   rJ   r   r   rY   +     " z(KaggleObject.to_dict.<locals>.<dictcomp>_fieldsr
   rJ   kv_pairsr   r   r   r   )     zKaggleObject.to_dictc                    r   )Nc                    r   r   )r   r   r   r   r   r   rK   .  r^   z-KaggleObject.to_field_map.<locals>.<listcomp>c                    r   r   r   rX   r   r   r   rY   /  r   z-KaggleObject.to_field_map.<locals>.<dictcomp>r   r   r   r   r   to_field_map-  r   zKaggleObject.to_field_mapc                 C   s"   |  }| j D ]}||| q|S r   )r   r   )r   r   r   r   r   r   r   r   1  s   
zKaggleObject.from_dictc                 C   s   |  t|S r   )r   jsonloads)r   json_strr   r   r   r   8  rh   zKaggleObject.from_jsonc                 C   s   t | |S r   )r   dumpsr   )r
   rJ   r   r   r   to_json<  r$   zKaggleObject.to_jsonc                 C      | j ddS NFr   r   r   r   r   r   __str__?     zKaggleObject.__str__c                 C   r   r   r   r   r   r   r   __repr__B  r   zKaggleObject.__repr__c                 C   sH   z|  |}W n
 ty   Y dS w t| |j}|jr|d uS ||jkS )NF)
_get_fieldrq   r   r   r   r   )r
   r   r   r   r   r   r   __contains__E  s   
zKaggleObject.__contains__c                 C   s   |  |}t| |j|j d S r   )r   r   r   r   r
   r   r   r   r   r   __delattr__P  s   
zKaggleObject.__delattr__c                    s@   t  fdd| jD d }|d u rtd| jj d  d|S )Nc                 3   s    | ]
}|j  kr|V  qd S r   r   )rH   fr   r   r   	<genexpr>U  s    z*KaggleObject._get_field.<locals>.<genexpr>zProtocol message z	 has no "z" field.)nextr   rq   r   r   r   r   r   r   r   T  s   zKaggleObject._get_fieldNr   )r   r   r   r   rA   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s0    








r   )r   r%   r   r   google.protobuf.field_mask_pb2r   r   r   r   compiler   r#   r-   r/   rC   rW   r_   ru   r   r   r   r   r   r   r   r   <module>   s$    
,3,