U
    >Ke8                     @   sR  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r
eee	r
edkr
e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k	std| jdk	s$tdt|dkr<td| t| }| jjdkr|dkrhtd| t	|}|dkrtd| n| j}|dkrd}|| _
|| _|| _|| _|| _|| _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AssertionErrordefaultValuelen
ValueErrorstrupper	__class__lengthintr
   r   r   r   r   )selfr
   r   r   r   stopr    r   @/tmp/pip-unpacked-wheel-5xrpv5dc/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   s    zDbfFieldDef.__eq__c                 C   s   t | t |kS r   r    r"   r   r   r   __ne__m   s    zDbfFieldDef.__ne__c                 C   s   t | t |k S r   r    r"   r   r   r   __lt__p   s    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t|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   r   Z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   s    zDbfFieldDef.rawFromRecordc                 C   s>   z|  | |W S  tk
r8   | jr2tj Y S  Y nX dS )z2Return decoded field value from the record string.N)decodeValuer>   	Exceptionr   r   ZINVALID_VALUEr<   r   r   r   decodeFromRecord   s    
zDbfFieldDef.decodeFromRecordc                 C   s   t dS )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.
        NNotImplementedErrorr   valuer   r   r   r?      s    zDbfFieldDef.decodeValuec                 C   s   t dS )zReturn str object containing encoded field value.

        This is an abstract method and it must be overridden in child classes.
        NrB   rD   r   r   r   encodeValue   s    zDbfFieldDef.encodeValue)NNNNF)F)__name__
__module____qualname____doc__	__slots__r   r   r   r   r$   r%   r&   r)   r2   classmethodr9   r;   r:   r>   rA   r?   rF   r   r   r   r   r	   +   s.         

	

r	   c                   @   s(   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   r6   rD   r   r   r   rF      s    z DbfCharacterFieldDef.encodeValueNrG   rH   rI   rJ   r   r   r?   rF   r   r   r   r   rM      s
   rM   c                   @   s(   e Zd ZdZdZdZdd Zdd ZdS )	DbfNumericFieldDefz Definition of the numeric field.Nr   c                 C   s.   | d}d|krt|S |r&t|S d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   N)stripfloatr   rD   r   r   r   r?      s    

zDbfNumericFieldDef.decodeValuec                 C   sx   d| j | j|f }t|| j krt|d}d|  kr@| j krTn n|d| j  }n 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   rE   _rvZ_pposr   r   r   rF      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)rG   rH   rI   rJ   r   r   r   r   r   r^   	  s   r^   c                   @   s,   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.Ir4   r   c                 C   s   t d|d S )z0Return an integer number decoded from ``value``.<ir   structunpackrD   r   r   r   r?     s    zDbfIntegerFieldDef.decodeValuec                 C   s   t dt|S )rX   rb   )rd   packr   rD   r   r   r   rF     s    zDbfIntegerFieldDef.encodeValueN	rG   rH   rI   rJ   r   r   r   r?   rF   r   r   r   r   r`     s   r`   c                   @   s,   e Zd ZdZdZdZdZdd Zdd Zd	S )
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     @rc   rD   r   r   r   r?   &  s    zDbfCurrencyFieldDef.decodeValuec                 C   s   t dt|d S )rX   rk   i'  )rd   rf   roundrD   r   r   r   rF   *  s    zDbfCurrencyFieldDef.encodeValueNrg   r   r   r   r   rh     s   rh   c                   @   s,   e Zd ZdZdZdZdZdd Zdd Zd	S )
DbfLogicalFieldDefz Definition of the logical field.Lr   c                 C   s>   |dkrdS |dkrdS |dkr$dS t d| j d|d	S )
z0Return True, False or -1 decoded from ``value``.?ro   zNnFf FZYyTtTrZ   z] Invalid logical value N)r   r
   rD   r   r   r   r?   6  s    zDbfLogicalFieldDef.decodeValuec                 C   s   |dk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Tro   rp   r_   r   rD   r   r   r   rF   A  s
    zDbfLogicalFieldDef.encodeValueN	rG   rH   rI   rJ   r   r   r   r?   rF   r   r   r   r   rm   /  s   rm   c                   @   s,   e Zd ZdZdZdZdZdd Zdd Zd	S )
DbfMemoFieldDefz[Definition of the memo field.

    Note: memos aren't currently completely supported.

    Mz
          r   c                 C   s   t dS )z<Return int .dbt block number decoded from the string object.NrB   rD   r   r   r   r?   [  s    zDbfMemoFieldDef.decodeValuec                 C   s   t dS )zeReturn raw data string encoded from a ``value``.

        Note: this is an internal method.

        NrB   rD   r   r   r   rF   `  s    zDbfMemoFieldDef.encodeValueNrr   r   r   r   r   rs   P  s   rs   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>n  rO   zDbfDateFieldDef.<lambda>rj   c                 C   s   |  rt|S dS dS )z;Return a ``datetime.date`` instance decoded from ``value``.N)rV   r   getDaterD   r   r   r   r?   r  s    
zDbfDateFieldDef.decodeValuec                 C   s"   |rt |dS d| j S d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 N)r   r|   strftimer   rD   r   r   r   rF   y  s    
zDbfDateFieldDef.encodeValueN)rG   rH   rI   rJ   r   r   classpropertyr   r   r?   rF   r   r   r   r   ru   j  s   ru   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 rq   c                 C   s
   t j  S r   )rw   nowrz   r   r   r   r{     rO   zDbfDateTimeFieldDef.<lambda>rj   c                 C   sZ   t || jksttd|\}}|dkrRtj|| j }|td|d 7 }nd}|S )z&Return a `datetime.datetime` instance.<2Ir   r   g     @@N)	r   r   r   rd   re   rw   fromordinalJDN_GDN_DIFF	timedelta)r   rE   Z_jdnZ_msecsr]   r   r   r   r?     s    zDbfDateTimeFieldDef.decodeValuec                 C   sb   |rBt |}td| | j |jd |jd  |j d }n
d| j	 }t
|| j	ks^t|S )z"Return a string-encoded ``value``.r   i  <   i  r3   )r   ZgetDateTimerd   rf   	toordinalr   hourminutesecondr   r   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k	st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   r   _fieldsRegistry)Z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   r7   )r   r   r   r   r     s    )rw   rd   	functoolsr    r   __version____date____all__r	   rM   rS   r^   r`   rh   rm   rs   ru   r   r   r   r   listglobalsitemsr8   Z_val
isinstancetype
issubclassappendr   r   r   r   <module>   s8   ! ,!'
