o
    „s¢YØ8  ã                   @   sJ  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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Ú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__ÚlengthÚintr	   r
   r   r   r   )Úselfr	   r   r
   r   Ústopr   © r   úO/var/www/html/env/lib/python3.10/site-packages/tablib/packages/dbfpy3/fields.pyÚ__init__L   s.   ÿÿ
zDbfFieldDef.__init__c                 C   s   t | jt|ƒ ¡ ƒS ©N)Úcmpr	   r   r   )r   Úotherr   r   r   Ú__cmp__k   s   zDbfFieldDef.__cmp__c                 C   s
   t | jƒS r   )Úhashr	   ©r   r   r   r   Ú__hash__n   s   
zDbfFieldDef.__hash__c                 C   sH   t |ƒdksJ ‚|d }| t |¡dd…  d¡||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   úutf-8é   )r   )r   r   ÚunzfillÚdecode)ÚclsÚstringr   r   Ú_lengthr   r   r   Ú
fromStringq   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   r8   ž   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_VALUEr:   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   rA   )z‰Return str object containing encoded field value.

        This is an abstract method and it must be overriden in child classes.
        rB   rD   r   r   r   ÚencodeValue¿   s   zDbfFieldDef.encodeValue)NNNNF)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   r   r    r#   r-   Úclassmethodr7   r9   r8   r<   r@   r>   rF   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¡ d¡S )ziReturn string object.

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

        ó    r&   )Úrstripr)   rD   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   r4   rD   r   r   r   rF   Ö   s   z DbfCharacterFieldDef.encodeValueN©rG   rH   rI   rJ   r   r   r>   rF   r   r   r   r   rN   È   s    rN   c                   @   rM   )	Ú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.

        s     ó   .r   )ÚstripÚfloatr   rD   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%*.*fÚ.r   Nz+[%s] Numeric overflow: %s (field width: %i))r   r
   r   Úfindr   r	   )r   rE   Ú_rvÚ_pposr   r   r   rF   ù   s   
þÿzDbfNumericFieldDef.encodeValueNrS   r   r   r   r   rT   Û   s    rT   c                   @   s   e Zd ZdZdZdS )ÚDbfFloatFieldDefz0Definition of the float field - same as numeric.ÚFN)rG   rH   rI   rJ   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ÚunpackrD   r   r   r   r>     r=   zDbfIntegerFieldDef.decodeValuec                 C   s   t  dt|ƒ¡S )rY   rc   )re   Úpackr   rD   r   r   r   rF     r=   zDbfIntegerFieldDef.encodeValueN©	rG   rH   rI   rJ   r   r   r   r>   rF   r   r   r   r   ra   
  ó    ra   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     ˆÃ@rd   rD   r   r   r   r>      ó   zDbfCurrencyFieldDef.decodeValuec                 C   s   t  dt|d ƒ¡S )rY   rm   i'  )re   rg   ÚroundrD   r   r   r   rF   $  rn   zDbfCurrencyFieldDef.encodeValueNrh   r   r   r   r   rj     ri   rj   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``.ú?rr   zNnFf FÚYyTtTz[%s] Invalid logical value %r)r   r	   rD   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ÚTrr   rs   r_   r   rD   r   r   r   rF   :  s
   zDbfLogicalFieldDef.encodeValueN©	rG   rH   rI   rJ   r   r   r   r>   rF   r   r   r   r   rp   (  s    rp   c                   @   r`   )
ÚDbfMemoFieldDefzZDefinition of the memo field.

    Note: memos aren't currenly completely supported.

    ÚMz
          r   c                 C   rA   )z<Return int .dbt block number decoded from the string object.rB   rD   r   r   r   r>   T  s   zDbfMemoFieldDef.decodeValuec                 C   rA   )zeReturn raw data string encoded from a ``value``.

        Note: this is an internal method.

        rB   rD   r   r   r   rF   Y  s   zDbfMemoFieldDef.encodeValueNrv   r   r   r   r   rw   I  s    rw   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>g  ó   
 zDbfDateFieldDef.<lambda>rl   c                 C   s   |  ¡ r	t |¡S dS )z;Return a ``datetime.date`` instance decoded from ``value``.N)rW   r   ÚgetDaterD   r   r   r   r>   k  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%dú )r   r�   Ústrftimer   rD   r   r   r   rF   r  s   

zDbfDateFieldDef.encodeValueN)rG   rH   rI   rJ   r   r   Úclasspropertyr   r   r>   rF   r   r   r   r   ry   c  s    ry   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 ru   c                 C   s
   t j  ¡ S r   )r{   Únowr~   r   r   r   r   ‰  r€   zDbfDateTimeFieldDef.<lambda>rl   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   re   rf   r{   ÚfromordinalÚJDN_GDN_DIFFÚ	timedelta)r   rE   Ú_jdnÚ_msecsr\   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è  r0   )r   ÚgetDateTimere   rg   Ú	toordinalr‰   ÚhourÚminuteÚsecondr   r   )r   rE   r\   r   r   r   rF   œ  s   
ÿ
zDbfDateTimeFieldDef.encodeValueN)rG   rH   rI   rJ   r‰   r   r   r„   r   r   r>   rF   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 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“   r5   )r   r   r   r   r   º  s   ) rJ   Ú__version__Ú__date__Ú__all__r{   re   r2   Ú r   Úobjectr   rN   rT   r^   ra   rj   rp   rw   ry   r…   r“   r•   r   ÚlistÚglobalsÚitemsr6   Ú_valÚ
isinstanceÚtypeÚ
issubclassÚappendr   r   r   r   Ú<module>   s<      *!'
€