Changeset 193

Show
Ignore:
Timestamp:
03/15/06 15:39:47 (3 years ago)
Author:
matt
Message:

Add a Decimal type for Python 2.4's decimal.Decimal to get accurate precision
numbers.
Decimal is not available if you're using Python 2.3.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/forms/__init__.py

    r192 r193  
    44 
    55 
    6 version_info = (0, 7, 2
     6version_info = (0, 8, 0
    77version = '.'.join([str(i) for i in version_info]) 
    88 
     
    5656registerAdapter(converters.NullConverter, File, iforms.IFileConvertible) 
    5757registerAdapter(converters.NullConverter, Sequence, iforms.ISequenceConvertible) 
     58try: 
     59    Decimal 
     60except NameError: 
     61    pass 
     62else: 
     63    registerAdapter(TextInput, Decimal, iforms.IWidget) 
     64    registerAdapter(converters.DecimalToStringConverter, Decimal, iforms.IStringConvertible) 
    5865del SequenceKeyLabelAdapter 
    5966del registerAdapter 
  • trunk/forms/converters.py

    r63 r193  
    44 
    55from datetime import date, time 
     6try: 
     7    import decimal 
     8    haveDecimal = True 
     9except ImportError: 
     10    haveDecimal = False 
    611from nevow.compy import Adapter 
    712from forms import iforms, validation 
     
    3742        if not value: 
    3843            return None 
     44        # "Cast" the value to the correct type. For some strange reason, 
     45        # Python's decimal.Decimal type raises an ArithmeticError when it's 
     46        # given a dodgy value. 
    3947        try: 
    4048            value = self.cast(value) 
    41         except ValueError
     49        except (ValueError, ArithmeticError)
    4250            raise validation.FieldValidationError("Not a valid number") 
    4351        return value 
     
    5058class FloatToStringConverter(NumberToStringConverter): 
    5159    cast = float 
     60 
     61 
     62if haveDecimal: 
     63    class DecimalToStringConverter(NumberToStringConverter): 
     64        cast = decimal.Decimal 
    5265 
    5366 
  • trunk/forms/examples/types.py

    r134 r193  
     1try: 
     2    import decimal 
     3    haveDecimal = True 
     4except ImportError: 
     5    haveDecimal = False 
    16import forms 
    27from forms.examples import main 
     
    1217        form.addField('aInteger', forms.Integer()) 
    1318        form.addField('aFloat', forms.Float()) 
     19        if haveDecimal: 
     20            form.addField('aDecimal', forms.Decimal()) 
    1421        form.addField('aBoolean', forms.Boolean()) 
    1522        form.addField('aDate', forms.Date()) 
  • trunk/forms/forms.css

    r175 r193  
    4949.nevow-form .field.date .inputs input { 
    5050  width: auto; 
     51} 
     52 
     53.nevow-form .field.decimal .inputs input { 
     54  width: 8em; 
    5155} 
    5256 
  • trunk/forms/test/test_converters.py

    r63 r193  
    11from datetime import date, time 
     2try: 
     3    import decimal 
     4    haveDecimal = True 
     5except ImportError: 
     6    haveDecimal = False 
    27from twisted.trial import unittest 
    38from forms import converters, validation 
     
    3944        self.assertEquals(c.toType('-1.5'), -1.5) 
    4045        self.assertRaises(validation.FieldValidationError, c.toType, 'foo') 
     46         
     47    if haveDecimal: 
     48        def test_decimalToString(self): 
     49            from decimal import Decimal 
     50            c = converters.DecimalToStringConverter(None) 
     51            self.assertEquals(c.fromType(None), None) 
     52            self.assertEquals(c.fromType(Decimal("1")), '1') 
     53            self.assertEquals(c.fromType(Decimal("0")), '0') 
     54            self.assertEquals(c.fromType(Decimal("-1")), '-1') 
     55            self.assertEquals(c.fromType(Decimal("1.5")), '1.5') 
     56            self.assertEquals(c.toType(''), None) 
     57            self.assertEquals(c.toType(' '), None) 
     58            self.assertEquals(c.toType('1'), Decimal("1")) 
     59            self.assertEquals(c.toType('0'), Decimal("0")) 
     60            self.assertEquals(c.toType('-1'), Decimal("-1")) 
     61            self.assertEquals(c.toType('-1.5'), Decimal("-1.5")) 
     62            self.assertEquals(c.toType('-1.863496'), Decimal("-1.863496")) 
     63            self.assertRaises(validation.FieldValidationError, c.toType, 'foo') 
    4164         
    4265    def test_booleanToString(self): 
  • trunk/forms/test/test_types.py

    r179 r193  
    11from datetime import date, time 
     2try: 
     3    import decimal 
     4    haveDecimal = True 
     5except ImportError: 
     6    haveDecimal = False 
    27from twisted.trial import unittest 
    38import forms 
     
    7075        self.assertRaises(forms.FieldValidationError, forms.Float(required=True).validate, None) 
    7176 
     77    if haveDecimal: 
     78        def testDecimal(self): 
     79            from decimal import Decimal 
     80            self.assertEquals(forms.Decimal().validate(None), None) 
     81            self.assertEquals(forms.Decimal().validate(Decimal('0')), Decimal('0')) 
     82            self.assertEquals(forms.Decimal().validate(Decimal('0.0')), Decimal('0.0')) 
     83            self.assertEquals(forms.Decimal().validate(Decimal('.1')), Decimal('0.1')) 
     84            self.assertEquals(forms.Decimal().validate(Decimal('1')), Decimal('1')) 
     85            self.assertEquals(forms.Decimal().validate(Decimal('-1')), Decimal('-1')) 
     86            self.assertEquals(forms.Decimal().validate(Decimal('-1.86')), 
     87                    Decimal('-1.86')) 
     88            self.assertEquals(forms.Decimal(missing=Decimal("1.0")).validate(None), 
     89                    Decimal("1.0")) 
     90            self.assertEquals(forms.Decimal(missing=Decimal("1.0")).validate(Decimal("2.0")), 
     91                    Decimal("2.0")) 
     92            self.assertRaises(forms.FieldValidationError, forms.Decimal(required=True).validate, None) 
     93 
    7294    def testBoolean(self): 
    7395        self.assertEquals(forms.Boolean().validate(None), None) 
  • trunk/forms/test/test_widget.py

    r58 r193  
    7272            r = processInput(type(forms.String()), 'foo', ['\xc2\xa3']) 
    7373            self.assert_(r == u'\xa3') 
    74         test.func_name = 'test_%s'%type.__name__ 
    7574        return test 
    7675 
  • trunk/forms/types.py

    r181 r193  
    33""" 
    44 
     5try: 
     6    import decimal 
     7    haveDecimal = True 
     8except ImportError: 
     9    haveDecimal = False 
     10from zope.interface import implements 
     11 
    512from forms import iforms, validation 
    6 from zope.interface import implements 
    713 
    814 
     
    98104 
    99105 
     106if haveDecimal: 
     107    class Decimal(Type): 
     108        """ 
     109        Forms type for Python 2.4's decimal.Decimal type. 
     110        """ 
     111 
     112 
    100113class Sequence(Type): 
    101114 
     
    123136    ] 
    124137 
     138if haveDecimal: 
     139    __all__.append('Decimal')