U
    d8                     @   s^  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 d
dl	m
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 )#z3DBF fields definitions.

TODO:
  - make memos work
z$Revision: 1.14 $   z$Date: 2009/05/26 05:16:51 $   	lookupFor    N)total_ordering   )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 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-_3ph8cfy/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   sn   d| j | j|f }t|| j krj|d}d|  kr@| j krTn n|d| j  }n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   _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   r`   )rb   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     @ra   rD   r   r   r   r?   %  s    zDbfCurrencyFieldDef.decodeValuec                 C   s   t dt|d S )rX   ri   i'  )rb   rd   roundrD   r   r   r   rF   )  s    zDbfCurrencyFieldDef.encodeValueNre   r   r   r   r   rf     s   rf   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``.?rm   zNnFf FZYyTtT[z] Invalid logical value N)r   r
   rD   r   r   r   r?   5  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Trm   rn   r]   r   rD   r   r   r   rF   @  s
    zDbfLogicalFieldDef.encodeValueN	rG   rH   rI   rJ   r   r   r   r?   rF   r   r   r   r   rk   .  s   rk   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?   Z  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.encodeValueNrq   r   r   r   r   rr   O  s   rr   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>m  rO   zDbfDateFieldDef.<lambda>rh   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?   q  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   x  s    
zDbfDateFieldDef.encodeValueN)rG   rH   rI   rJ   r   r   classpropertyr   r   r?   rF   r   r   r   r   rt   i  s   rt   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 rp   c                 C   s
   t j  S r   )rv   nowry   r   r   r   rz     rO   zDbfDateTimeFieldDef.<lambda>rh   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   rb   rc   rv   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getDateTimerb   rd   	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    )!rJ   __version____date____all__rv   rb   sys	functoolsr    r   r	   rM   rS   r\   r^   rf   rk   rr   rt   r   r   r   r   listglobalsitemsr8   Z_val
isinstancetype
issubclassappendr   r   r   r   <module>   s<    +!'
