
lR\8                 @   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 Gd d   d e	  Z
 Gd d   d e
  Z Gd d   d e
  Z Gd d   d e  Z Gd d   d e
  Z Gd d   d e
  Z Gd d   d e
  Z Gd d   d e
  Z Gd d   d e
  Z Gd d   d e
  Z i  Z d d    Z d! d   Z xa e   j   D]P \ Z Z e e e  rme e e
  rme d k rme j e  e e  qmqmW[ [ 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 d 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 k	 s t d   |  j d k	 s6 t d   t |  d k r[ t d |   n  t |  j   } |  j j d k r | d k r t d |   n  t	 |  } | d k r t d |   q n	 |  j } | d k r d } n  | |  _
 | |  _ | |  _ | |  _ | |  _ | |  _ 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AssertionErrordefaultValuelen
ValueErrorstrupper	__class__r
   intr	   r   r   r   r   )selfr	   r
   r   r   stopr    r   Q/var/www/dbchiro/venv/lib/python3.4/site-packages/tablib/packages/dbfpy/fields.py__init__K   s*    							zDbfFieldDef.__init__c             C   s   t  |  j t |  j    S)N)cmpr	   r   r   )r   otherr   r   r   __cmp__j   s    zDbfFieldDef.__cmp__c             C   s   t  |  j  S)N)hashr	   )r   r   r   r   __hash__m   s    zDbfFieldDef.__hash__c             C   se   t  |  d k s t  t | d  } |  t j |  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   r   ordr   Zunzfill)clsstringr   r   Z_lengthr   r   r   
fromStringp   s    )zDbfFieldDef.fromStringc             C   s   t  j d k  r: |  j d d  d d t |  j  } n |  j 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      Nr    r      )r   r*   )	sysversion_infor	   r   ljustr   chrr
   r   )r   _namer   r   r   toString   s
    +2zDbfFieldDef.toStringc             C   s   d |  j    S)Nz%-10s %1s %3d %3d)	fieldInfo)r   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   r3      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<   y |  j  |  j |   SWn |  j r0 t j S  Yn Xd S)z2Return decoded field value from the record string.N)decodeValuer6   r   r   ZINVALID_VALUE)r   r5   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   r7      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 overriden in child classes.
        N)r9   )r   r:   r   r   r   encodeValue   s    zDbfFieldDef.encodeValue)znamezlengthzdecimalCountzstartzendzignoreErrors)__name__
__module____qualname____doc__	__slots__r
   r   r   r   r    r"   r)   classmethodr2   r4   r3   r6   r8   r7   r;   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   | j  d  S)ziReturn string object.

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

         )rstrip)r   r:   r   r   r   r7      s    z DbfCharacterFieldDef.decodeValuec             C   s#   t  |  d |  j  j |  j  S)z0Return raw data string encoded from a ``value``.N)r   r
   r/   )r   r:   r   r   r   r;      s    z DbfCharacterFieldDef.encodeValueN)r<   r=   r>   r?   r   r   r7   r;   r   r   r   r   rB      s
   rB   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=   | j  d  } d | k r% t |  S| r5 t |  Sd Sd 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.

        z  .r   N)stripfloatr   )r   r:   r   r   r   r7      s    


zDbfNumericFieldDef.decodeValuec             C   s   d |  j  |  j | f } t |  |  j  k r | j d  } d | k oW |  j  k n rr | d |  j   } q t d |  j | |  j  f   n  | S)z+Return string containing encoded ``value``.z%*.*frI   r   Nz+[%s] Numeric overflow: %s (field width: %i))r
   r   r   findr   r	   )r   r:   _rvZ_pposr   r   r   r;      s    zDbfNumericFieldDef.encodeValueN)r<   r=   r>   r?   r   r   r7   r;   r   r   r   r   rG      s
   rG   c               @   s   e  Z d  Z d Z d Z d S)DbfFloatFieldDefz0Definition of the float field - same as numeric.FN)r<   r=   r>   r?   r   r   r   r   r   rN     s   rN   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.Ir*   r   c             C   s   t  j d |  d S)z0Return an integer number decoded from ``value``.z<ir   )structunpack)r   r:   r   r   r   r7     s    zDbfIntegerFieldDef.decodeValuec             C   s   t  j d t |   S)z+Return string containing encoded ``value``.z<i)rR   packr   )r   r:   r   r   r   r;     s    zDbfIntegerFieldDef.encodeValueN)	r<   r=   r>   r?   r   r
   r   r7   r;   r   r   r   r   rP   	  s   rP   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  j d |  d d S)z+Return float number decoded from ``value``.z<qr   g     @)rR   rS   )r   r:   r   r   r   r7     s    zDbfCurrencyFieldDef.decodeValuec             C   s   t  j d t | d   S)z+Return string containing encoded ``value``.z<qi'  )rR   rT   round)r   r:   r   r   r   r;   #  s    zDbfCurrencyFieldDef.encodeValueN)	r<   r=   r>   r?   r   r
   r   r7   r;   r   r   r   r   rU     s   rU   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   sM   | d k r d	 S| d k r  d S| d k r0 d St  d |  j | f   d S)
z0Return True, False or -1 decoded from ``value``.?r   zNnFf FZYyTtTz[%s] Invalid logical value %rN)r   r	   )r   r:   r   r   r   r7   .  s    zDbfLogicalFieldDef.decodeValuec             C   s$   | d k r d S| d k r  d Sd 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Tr   r[   rO   r\   r   )r   r:   r   r   r   r;   9  s
    zDbfLogicalFieldDef.encodeValueNr\   )	r<   r=   r>   r?   r   r   r
   r7   r;   r   r   r   r   rY   '  s   rY   c               @   s@   e  Z d  Z d Z d Z d
 Z d Z d d   Z d d   Z d	 S)DbfMemoFieldDefzZDefinition of the memo field.

    Note: memos aren't currenly completely supported.

    MrE   r   c             C   s
   t   d S)z<Return int .dbt block number decoded from the string object.N)r9   )r   r:   r   r   r   r7   S  s    zDbfMemoFieldDef.decodeValuec             C   s
   t   d S)zeReturn raw data string encoded from a ``value``.

        Note: this is an internal method.

        N)r9   )r   r:   r   r   r   r;   X  s    zDbfMemoFieldDef.encodeValueNz
          )	r<   r=   r>   r?   r   r   r
   r7   r;   r   r   r   r   r^   H  s   r^   c               @   sO   e  Z d  Z d Z d Z e j d d    Z d Z d d   Z	 d d	   Z
 d
 S)DbfDateFieldDefzDefinition of the date field.Dc             C   s   t  j j   S)N)datetimedatetoday)r'   r   r   r   <lambda>f  s    zDbfDateFieldDef.<lambda>rW   c             C   s!   | j    r t j |  Sd Sd S)z;Return a ``datetime.date`` instance decoded from ``value``.N)rJ   r   getDate)r   r:   r   r   r   r7   j  s    zDbfDateFieldDef.decodeValuec             C   s+   | r t  j |  j d  Sd |  j Sd 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%drE   N)r   rf   strftimer
   )r   r:   r   r   r   r;   q  s    
zDbfDateFieldDef.encodeValueN)r<   r=   r>   r?   r   r   classpropertyr   r
   r7   r;   r   r   r   r   r`   b  s   r`   c               @   sU   e  Z d  Z d Z d Z d Z e j 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  j   S)N)rb   now)r'   r   r   r   re     s    zDbfDateTimeFieldDef.<lambda>rW   c             C   s   t  |  |  j k s t  t j d |  \ } } | d k ru t j j | |  j  } | t j d | d  7} n d } | S)z&Return a `datetime.datetime` instance.z<2Ir   r   g     @@N)	r   r
   r   rR   rS   rb   fromordinalJDN_GDN_DIFF	timedelta)r   r:   Z_jdnZ_msecsrM   r   r   r   r7     s    zDbfDateTimeFieldDef.decodeValuec             C   s   | rW t  j |  } t j d | j   |  j | j d | j d | j d  } n d |  j	 } t
 |  |  j	 k s t  | S)z"Return a string-encoded ``value``.z<2Ii  <   i  r+   )r   ZgetDateTimerR   rT   	toordinalrl   hourminutesecondr
   r   r   )r   r:   rM   r   r   r   r;     s    )zDbfDateTimeFieldDef.encodeValueN)r<   r=   r>   r?   rl   r   r   rh   r   r
   r7   r;   r   r   r   r   ri     s   ri   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    	rt   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`.

    )rs   )r   r   r   r   r     s    ru   )r?   __version____date____all__rb   rR   r-   rD   r   objectr   rB   rG   rN   rP   rU   rY   r^   r`   ri   rs   rt   r   globalsitemsr1   Z_val
isinstancetype
issubclassappendr   r   r   r   <module>   s4   	*!'