o
    „s¢Y¼8  ã                   @   sF  d Z 	 ddd… Zddd… ZdgZddlZddlZddlZd	d
lm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i Zdd „ Zd!d„ Zeƒ  ¡ D ]\ZZeeeƒržeee
ƒržedkrže e¡ eeƒ qƒ[[dS )"z3DBF fields definitions.

TODO:
  - make memos work
z$Revision: 1.14 $é   éþÿÿÿz$Date: 2009/05/26 05:16:51 $é   Ú	lookupForé    Né   )Úutilsc                   @   sˆ   e Zd ZdZdZdZdZdZ		ddd„Zdd„ Z	d	d
„ Z
ddd„ZeeƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚDbfFieldDefa\  Abstract field definition.

    Child classes must override ``type`` class attribute to provide datatype
    infromation of the field definition. For more info about types visit
    `http://www.clicketyclick.dk/databases/xbase/format/data_types.html`

    Also child classes must override ``defaultValue`` field to provide
    default value for the field value.

    If child class has fixed length ``length`` class attribute must be
    overriden and set to the valid value. None value means, that field
    isn't of fixed length.

    Note: ``name`` field must not be changed after instantiation.

    )ÚnameÚlengthÚdecimalCountÚstartÚendÚignoreErrorsNFc                 C   sÀ   | j dus	J dƒ‚| jdusJ dƒ‚t|ƒdkrtd| ƒ‚t|ƒ ¡ }| jjdu rC|du r4td| ƒ‚t|ƒ}|dkrBtd| ƒ‚n| j}|du rLd}|| _	|| _|| _
|| _|| _|| _dS )	zInitialize instance.NzType code must be overridenzDefault value must be overridené
   zField name "%s" is too longz[%s] Length isn't specifiedr   z&[%s] Length must be a positive integer)ÚtypeCodeÚdefaultValueÚlenÚ
ValueErrorÚstrÚupperÚ	__class__r
   Úintr	   r   r   r   r   )Úselfr	   r
   r   r   Ústopr   © r   úN/var/www/html/env/lib/python3.10/site-packages/tablib/packages/dbfpy/fields.pyÚ__init__K   s.   ÿÿ
zDbfFieldDef.__init__c                 C   s   t | jt|ƒ ¡ ƒS ©N)Úcmpr	   r   r   )r   Úotherr   r   r   Ú__cmp__j   s   zDbfFieldDef.__cmp__c                 C   s
   t | jƒS r   )Úhashr	   ©r   r   r   r   Ú__hash__m   s   
zDbfFieldDef.__hash__c                 C   sJ   t |ƒdksJ ‚t|d ƒ}| t |¡dd… |t|d ƒ||| |d�S )az  Decode dbf field definition from the string data.

        Arguments:
            string:
                a string, dbf definition is decoded from. length of
                the string must be 32 bytes.
            start:
                position in the database file.
            ignoreErrors:
                initial error processing mode for the new field (boolean)

        é    é   Nr   é   )r   )r   Úordr   Úunzfill)ÚclsÚstringr   r   Ú_lengthr   r   r   Ú
fromStringp   s
   
ÿzDbfFieldDef.fromStringc                 C   sp   t jdk r| jdd… ddt| jƒ   }n| j dd¡}|| j tdƒd  t| jƒ t| jƒ tdƒd  S )z Return encoded field definition.

        Return:
            Return value is a string object containing encoded
            definition of this field.

        )é   é   Nr   ú r   r.   é   )	ÚsysÚversion_infor	   r   Úljustr   Úchrr
   r   )r   Ú_namer   r   r   ÚtoStringƒ   s   
"ÿ
ýüû
úÿzDbfFieldDef.toStringc                 C   s   d|   ¡  S )Nz%-10s %1s %3d %3d)Ú	fieldInfor"   r   r   r   Ú__repr__š   s   zDbfFieldDef.__repr__c                 C   s   | j | j| j| jfS )zxReturn field information.

        Return:
            Return value is a (name, type, length, decimals) tuple.

        )r	   r   r
   r   r"   r   r   r   r7   �   s   zDbfFieldDef.fieldInfoc                 C   s   || j | j… S )z2Return a "raw" field value from the record string.)r   r   ©r   Úrecordr   r   r   ÚrawFromRecord¦   ó   zDbfFieldDef.rawFromRecordc                 C   s,   z	|   |  |¡¡W S    | jrtj Y S ‚ )z2Return decoded field value from the record string.)ÚdecodeValuer;   r   r   ÚINVALID_VALUEr9   r   r   r   ÚdecodeFromRecordª   s   
zDbfFieldDef.decodeFromRecordc                 C   ó   t ‚)zéReturn decoded value from string value.

        This method shouldn't be used publicly. It's called from the
        `decodeFromRecord` method.

        This is an abstract method and it must be overridden in child classes.
        ©ÚNotImplementedError©r   Úvaluer   r   r   r=   ´   s   zDbfFieldDef.decodeValuec                 C   r@   )z‰Return str object containing encoded field value.

        This is an abstract method and it must be overriden in child classes.
        rA   rC   r   r   r   ÚencodeValue¾   s   zDbfFieldDef.encodeValue)NNNNF)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r
   r   r   r   r    r#   r,   Úclassmethodr6   r8   r7   r;   r?   r=   rE   r   r   r   r   r   )   s(    
ÿ
	

r   c                   @   ó(   e Zd ZdZdZdZdd„ Zdd„ ZdS )	ÚDbfCharacterFieldDefz"Definition of the character field.ÚCÚ c                 C   s
   |  d¡S )ziReturn string object.

        Return value is a ``value`` argument with stripped right spaces.

        ú )ÚrstriprC   r   r   r   r=   Í   s   
z DbfCharacterFieldDef.decodeValuec                 C   s   t |ƒd| j…  | j¡S )z0Return raw data string encoded from a ``value``.N)r   r
   r3   rC   r   r   r   rE   Õ   s   z DbfCharacterFieldDef.encodeValueN©rF   rG   rH   rI   r   r   r=   rE   r   r   r   r   rM   Ç   s    rM   c                   @   rL   )	ÚDbfNumericFieldDefz Definition of the numeric field.ÚNr   c                 C   s*   |  d¡}d|v rt|ƒS |rt|ƒS dS )zâReturn a number decoded from ``value``.

        If decimals is zero, value will be decoded as an integer;
        or as a float otherwise.

        Return:
            Return value is a int (long) or float instance.

        z  Ú.r   )ÚstripÚfloatr   rC   r   r   r   r=   ä   s   

zDbfNumericFieldDef.decodeValuec                 C   sp   d| j | j|f }t|ƒ| j kr6| d¡}d|  kr | j kr+n n	|d| j … }|S td| j|| j f ƒ‚|S )ú+Return string containing encoded ``value``.z%*.*frU   r   Nz+[%s] Numeric overflow: %s (field width: %i))r
   r   r   Úfindr   r	   )r   rD   Ú_rvÚ_pposr   r   r   rE   ø   s   
þÿzDbfNumericFieldDef.encodeValueNrR   r   r   r   r   rS   Ú   s    rS   c                   @   s   e Zd ZdZdZdS )ÚDbfFloatFieldDefz0Definition of the float field - same as numeric.ÚFN)rF   rG   rH   rI   r   r   r   r   r   r\     s    r\   c                   @   ó,   e Zd ZdZdZdZdZdd„ Zdd„ Zd	S )
ÚDbfIntegerFieldDefz Definition of the integer field.ÚIr.   r   c                 C   s   t  d|¡d S )z0Return an integer number decoded from ``value``.ú<ir   ©ÚstructÚunpackrC   r   r   r   r=     r<   zDbfIntegerFieldDef.decodeValuec                 C   s   t  dt|ƒ¡S )rX   ra   )rc   Úpackr   rC   r   r   r   rE     r<   zDbfIntegerFieldDef.encodeValueN©	rF   rG   rH   rI   r   r
   r   r=   rE   r   r   r   r   r_   	  ó    r_   c                   @   r^   )
ÚDbfCurrencyFieldDefz!Definition of the currency field.ÚYé   g        c                 C   s   t  d|¡d d S )z+Return float number decoded from ``value``.ú<qr   g     ˆÃ@rb   rC   r   r   r   r=     ó   zDbfCurrencyFieldDef.decodeValuec                 C   s   t  dt|d ƒ¡S )rX   rk   i'  )rc   re   ÚroundrC   r   r   r   rE   #  rl   zDbfCurrencyFieldDef.encodeValueNrf   r   r   r   r   rh     rg   rh   c                   @   r^   )
ÚDbfLogicalFieldDefz Definition of the logical field.ÚLéÿÿÿÿr   c                 C   s6   |dkrdS |dv rdS |dv rdS t d| j|f ƒ‚)z0Return True, False or -1 decoded from ``value``.ú?rp   zNnFf FÚYyTtTz[%s] Invalid logical value %r)r   r	   rC   r   r   r   r=   .  s   zDbfLogicalFieldDef.decodeValuec                 C   s   |du rdS |dkrdS dS )z©Return a character from the "TF?" set.

        Return:
            Return value is "T" if ``value`` is True
            "?" if value is -1 or False otherwise.

        TÚTrp   rq   r]   r   rC   r   r   r   rE   9  s
   zDbfLogicalFieldDef.encodeValueN©	rF   rG   rH   rI   r   r   r
   r=   rE   r   r   r   r   rn   '  s    rn   c                   @   r^   )
ÚDbfMemoFieldDefzZDefinition of the memo field.

    Note: memos aren't currenly completely supported.

    ÚMz
          r   c                 C   r@   )z<Return int .dbt block number decoded from the string object.rA   rC   r   r   r   r=   S  s   zDbfMemoFieldDef.decodeValuec                 C   r@   )zeReturn raw data string encoded from a ``value``.

        Note: this is an internal method.

        rA   rC   r   r   r   rE   X  s   zDbfMemoFieldDef.encodeValueNrt   r   r   r   r   ru   H  s    ru   c                   @   s6   e Zd ZdZdZe dd„ ¡ZdZdd„ Z	dd	„ Z
d
S )ÚDbfDateFieldDefzDefinition of the date field.ÚDc                 C   s
   t j ¡ S r   )ÚdatetimeÚdateÚtoday©r)   r   r   r   Ú<lambda>f  ó   
 zDbfDateFieldDef.<lambda>rj   c                 C   s   |  ¡ r	t |¡S dS )z;Return a ``datetime.date`` instance decoded from ``value``.N)rV   r   ÚgetDaterC   r   r   r   r=   j  s   
zDbfDateFieldDef.decodeValuec                 C   s   |r
t  |¡ d¡S d| j S )zÑReturn a string-encoded value.

        ``value`` argument should be a value suitable for the
        `utils.getDate` call.

        Return:
            Return value is a string in format "yyyymmdd".

        z%Y%m%drP   )r   r   Ústrftimer
   rC   r   r   r   rE   q  s   

zDbfDateFieldDef.encodeValueN)rF   rG   rH   rI   r   r   Úclasspropertyr   r
   r=   rE   r   r   r   r   rw   b  s    rw   c                   @   s:   e Zd ZdZdZdZe dd„ ¡ZdZ	dd„ Z
d	d
„ ZdS )ÚDbfDateTimeFieldDefz"Definition of the timestamp field.iQD rs   c                 C   s
   t j  ¡ S r   )ry   Únowr|   r   r   r   r}   ˆ  r~   zDbfDateTimeFieldDef.<lambda>rj   c                 C   s\   t |ƒ| jks	J ‚t d|¡\}}|dkr*tj || j ¡}|t d|d ¡7 }|S d}|S )z&Return a `datetime.datetime` instance.ú<2Ir   r   g     @�@N)r   r
   rc   rd   ry   ÚfromordinalÚJDN_GDN_DIFFÚ	timedelta)r   rD   Ú_jdnÚ_msecsrZ   r   r   r   r=   Ž  s   ÿzDbfDateTimeFieldDef.decodeValuec                 C   sb   |r!t  |¡}t d| ¡ | j |jd |jd  |j d ¡}nd| j	 }t
|ƒ| j	ks/J ‚|S )z"Return a string-encoded ``value``.r„   i  é<   iè  r/   )r   ÚgetDateTimerc   re   Ú	toordinalr†   ÚhourÚminuteÚsecondr
   r   )r   rD   rZ   r   r   r   rE   ›  s   
ÿ
zDbfDateTimeFieldDef.encodeValueN)rF   rG   rH   rI   r†   r   r   r�   r   r
   r=   rE   r   r   r   r   r‚   �  s    r‚   c                 C   s    | j dus	J dƒ‚| t| j < dS )z¯Register field definition class.

    ``fieldCls`` should be subclass of the `DbfFieldDef`.

    Use `lookupFor` to retrieve field definition class
    by the type code.

    NzType code isn't defined)r   Ú_fieldsRegistry)ÚfieldClsr   r   r   ÚregisterFieldª  s   	r’   c                 C   s   t |  S )a  Return field definition class for the given type code.

    ``typeCode`` must be a single character. That type should be
    previously registered.

    Use `registerField` to register new field class.

    Return:
        Return value is a subclass of the `DbfFieldDef`.

    )r�   )r   r   r   r   r   ¹  s   )rI   Ú__version__Ú__date__Ú__all__ry   rc   r1   rO   r   Úobjectr   rM   rS   r\   r_   rh   rn   ru   rw   r‚   r�   r’   r   ÚglobalsÚitemsr5   Ú_valÚ
isinstanceÚtypeÚ
issubclassÚappendr   r   r   r   Ú<module>   s<     *!'
€