o
    e8                     @   sN  d dl Z d dlZd dlmZ ddlmZ ddd Zdd	d Zd
gZ	 	 eG d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i Zdd  Zd!d
 Zee  D ]\ZZeeereee	redkree ee q[[dS )"    N)total_ordering   )utilsz$Revision: 1.14 $   z$Date: 2009/05/26 05:16:51 $   	lookupForc                   @   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 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
    information 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
    overridden 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 overriddenz Default value must be overridden
   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/venv/lib/python3.10/site-packages/tablib/packages/dbfpy/fields.py__init__M   s*   
zDbfFieldDef.__init__c                 C   s   t | t |kS Nreprr   otherr   r   r   __eq__j      zDbfFieldDef.__eq__c                 C   s   t | t |kS r   r   r!   r   r   r   __ne__m   r$   zDbfFieldDef.__ne__c                 C   s   t | t |k S r   r   r!   r   r   r   __lt__p   r$   zDbfFieldDef.__lt__c                 C   s
   t | jS r   )hashr
   r   r   r   r   __hash__s   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   
fromStringv   s
   zDbfFieldDef.fromStringc                 C   sD   | j dd}|| j tdd  t| j t| j tdd  S )zReturn encoded field definition.

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

        r    r         )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   r;      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   s4   z	|  | |W S  ty   | jrtj Y S  w )z2Return decoded field value from the record string.)decodeValuer?   	Exceptionr   r   INVALID_VALUEr=   r   r   r   decodeFromRecord   s   
zDbfFieldDef.decodeFromRecordc                 C      t )zReturn 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   rA      s   zDbfFieldDef.decodeValuec                 C   rE   )zReturn str object containing encoded field value.

        This is an abstract method and it must be overridden in child classes.
        rF   rH   r   r   r   encodeValue   s   zDbfFieldDef.encodeValue)NNNNF)F)__name__
__module____qualname____doc__	__slots__r   r   r   r   r#   r%   r&   r)   r3   classmethodr:   r<   r;   r?   rD   rA   rJ   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/   rH   r   r   r   rA      s   z DbfCharacterFieldDef.decodeValuec                 C   s   t |d| j | jS )z0Return raw data string encoded from a ``value``.N)r   r   r7   rH   r   r   r   rJ      s   z DbfCharacterFieldDef.encodeValueNrK   rL   rM   rN   r   r   rA   rJ   r   r   r   r   rR      s    rR   c                   @   rQ   )	DbfNumericFieldDefz Definition of the numeric field.Nr   c                 C   s*   | d}d|v rt|S |rt|S dS )zReturn 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   rH   r   r   r   rA      s   

zDbfNumericFieldDef.decodeValuec                 C   sz   d| j | j|f }t|| j kr;|d}d|  kr | j kr+n n	|d| j  }|S td| j d| d| j  d|S )	+Return string containing encoded ``value``.z%*.*f.r   N[z] Numeric overflow: z (field width: ))r   r   r   findr   r
   )r   rI   _rv_pposr   r   r   rJ      s   
zDbfNumericFieldDef.encodeValueNrW   r   r   r   r   rX      s    rX   c                   @   s   e Zd ZdZdZdS )DbfFloatFieldDefz0Definition of the float field - same as numeric.FN)rK   rL   rM   rN   r   r   r   r   r   rd   	  s    rd   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.Ir5   r   c                 C   s   t d|d S )z0Return an integer number decoded from ``value``.<ir   structunpackrH   r   r   r   rA     r@   zDbfIntegerFieldDef.decodeValuec                 C   s   t dt|S )r]   ri   )rk   packr   rH   r   r   r   rJ     r@   zDbfIntegerFieldDef.encodeValueN	rK   rL   rM   rN   r   r   r   rA   rJ   r   r   r   r   rg         rg   c                   @   rf   )
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     @rj   rH   r   r   r   rA   &     zDbfCurrencyFieldDef.decodeValuec                 C   s   t dt|d S )r]   rs   i'  )rk   rm   roundrH   r   r   r   rJ   *  rt   zDbfCurrencyFieldDef.encodeValueNrn   r   r   r   r   rp     ro   rp   c                   @   rf   )
DbfLogicalFieldDefz Definition of the logical field.Lr   c                 C   s:   |dkrdS |dv rdS |dv rdS t d| j d|)	z0Return True, False or -1 decoded from ``value``.?rx   zNnFf FYyTtTr_   z] Invalid logical value )r   r
   rH   r   r   r   rA   6  s   zDbfLogicalFieldDef.decodeValuec                 C   s   |du rdS |dkrdS dS )zReturn a character from the "TF?" set.

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

        TTrx   ry   re   r   rH   r   r   r   rJ   A  s
   zDbfLogicalFieldDef.encodeValueN	rK   rL   rM   rN   r   r   r   rA   rJ   r   r   r   r   rv   /  s    rv   c                   @   rf   )
DbfMemoFieldDefz[Definition of the memo field.

    Note: memos aren't currently completely supported.

    Mz
          r   c                 C   rE   )z<Return int .dbt block number decoded from the string object.rF   rH   r   r   r   rA   [  s   zDbfMemoFieldDef.decodeValuec                 C   rE   )zeReturn raw data string encoded from a ``value``.

        Note: this is an internal method.

        rF   rH   r   r   r   rJ   `  s   zDbfMemoFieldDef.encodeValueNr|   r   r   r   r   r}   P  s    r}   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r0   r   r   r   <lambda>n     
 zDbfDateFieldDef.<lambda>rr   c                 C   s   |  r	t|S dS )z;Return a ``datetime.date`` instance decoded from ``value``.N)r[   r   getDaterH   r   r   r   rA   r  s   
zDbfDateFieldDef.decodeValuec                 C   s   |r
t |dS d| j S )zReturn 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   rH   r   r   r   rJ   y  s   

zDbfDateFieldDef.encodeValueN)rK   rL   rM   rN   r   r   classpropertyr   r   rA   rJ   r   r   r   r   r   j  s    r   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 r{   c                 C   s
   t j  S r   )r   nowr   r   r   r   r     r   zDbfDateTimeFieldDef.<lambda>rr   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   rk   rl   r   fromordinalJDN_GDN_DIFF	timedelta)r   rI   _jdn_msecsrb   r   r   r   rA     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  r4   )r   getDateTimerk   rm   	toordinalr   hourminutesecondr   r   )r   rI   rb   r   r   r   rJ     s   

zDbfDateTimeFieldDef.encodeValueN)rK   rL   rM   rN   r   r   r   r   r   r   rA   rJ   r   r   r   r   r     s    r   c                 C   s    | j dus	J d| t| j < dS )zRegister 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   r8   )r   r   r   r   r     s   )r   rk   	functoolsr    r   __version____date____all__r	   rR   rX   rd   rg   rp   rv   r}   r   r   r   r   r   listglobalsitemsr9   _val
isinstancetype
issubclassappendr   r   r   r   <module>   s>     ,!'
