Changeset 299
- Timestamp:
- 09/21/11 22:00:41
- Files:
-
- trunk/geniusql/dbtypes.py (modified) (1 diff)
- trunk/geniusql/providers/postgres.py (modified) (3 diffs)
- trunk/geniusql/test/zoo_fixture.py (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/geniusql/dbtypes.py
r296 r299 654 654 655 655 def dbtype_for_datetime_datetime(self, hints): 656 if hints.get('timezone_aware'): 657 for type in self.known_types['datetime']: 658 if getattr(type, 'timezone_aware', False): 659 return type() 660 656 661 return self.known_types['datetime'][0]() 657 662 trunk/geniusql/providers/postgres.py
r292 r299 108 108 h, m = 0, 0 109 109 else: 110 h, m = divmod(value.tzinfo.utcoffset(value), 60) 110 offset = value.tzinfo.utcoffset(value) 111 m = (offset.days * 3600 + offset.seconds) / 60 112 h, m = divmod(m, 60) 111 113 112 114 if h < 0: … … 115 117 else: 116 118 sign = "+" 117 119 118 120 return ("TIMESTAMP WITH TIME ZONE " 119 "'%04d-%02d-%02d %02d:%02d:%02d %s%02d:%02d'" %121 "'%04d-%02d-%02d %02d:%02d:%02d.%06d%s%02d:%02d'" % 120 122 (value.year, value.month, value.day, 121 value.hour, value.minute, value.second, 123 value.hour, value.minute, value.second, value.microsecond, 122 124 sign, h, m)) 123 125 … … 599 601 600 602 class TIMESTAMP(dbtypes.SQL92TIMESTAMP): 601 """A date and time. """602 pass603 """A date and time. Timezone naive.""" 604 default_adapters = {datetime.datetime: datetime_to_PgTIMESTAMPTZ_Adapter()} 603 605 604 606 class TIMESTAMPTZ(dbtypes.SQL92TIMESTAMP): 605 """A date and time.""" 606 default_adapters = {datetime.datetime: datetime_to_PgTIMESTAMPTZ_Adapter()} 607 """A date and time. Timezone aware.""" 608 default_adapters = {datetime.datetime: datetime_tz_to_PgTIMESTAMPTZ_Adapter()} 609 timezone_aware = True 610 611 def ddl(self): 612 return "TIMESTAMP WITH TIME ZONE" 607 613 608 614 class DATE(dbtypes.SQL92DATE): trunk/geniusql/test/zoo_fixture.py
r298 r299 51 51 self.assertEqual(set(a), set(b)) 52 52 53 def test_ 1_create_tables(self):53 def test_01_create_tables(self): 54 54 Animal = self.schema.table('Animal') 55 55 Animal['ID'] = self.schema.column(int, autoincrement=True, key=True) … … 61 61 Animal['PreviousZoos'] = self.schema.column(list, hints={'bytes': 8000}) 62 62 Animal['LastEscape'] = self.schema.column(datetime.datetime) 63 Animal['Birthdate'] = self.schema.column(datetime.datetime, hints={'timezone_aware': True}) 63 64 Animal['Lifespan'] = self.schema.column(float, hints={'precision': 4}) 64 65 Animal['Age'] = self.schema.column(datetime.timedelta) … … 164 165 self.schema['NothingToDoWithZoos'] = t 165 166 166 def test_ 2_populate(self):167 def test_02_populate(self): 167 168 wap = self.schema['Zoo'].insert(Name='Wild Animal Park', 168 169 Founded=datetime.date(2000, 1, 1), … … 276 277 PreferredFoodID=live_fish, AlternateFoodID=dead_fish) 277 278 278 def test_ 3_Properties(self):279 def test_03_Properties(self): 279 280 # Zoos 280 281 WAP = self.schema['Zoo'].select(Name='Wild Animal Park') … … 357 358 self.assertEqual(float(tr['Acreage']), 4) 358 359 self.assertEqual(tr['PettingAllowed'], False) 359 360 def test_ 4_Expressions(self):360 361 def test_04_Expressions(self): 361 362 def matches(lam, tkey='Animal'): 362 363 data = self.schema[tkey].select_all(lam) … … 456 457 "but differ by %r instead." % (dt1, dt2, tolerance, diff)) 457 458 458 def test_ 4a_Binary_Expressions(self):459 def test_04a_Binary_Expressions(self): 459 460 460 461 def results(tablekey, fieldlist, restriction=None): … … 580 581 #for name, f in opens]) 581 582 582 def test_ 5_Aggregates(self):583 def test_05_Aggregates(self): 583 584 try: 584 585 Animal = self.schema['Animal'] … … 705 706 ) 706 707 # Assert that the expected interval and actual interval are 707 # no more than 1second apart.708 # no more than 5 second apart. 708 709 diff = abs(elapsed[4][1] - WAP_elapsed) 709 self.assert_(diff <= datetime.timedelta(0, 1), diff)710 self.assert_(diff <= datetime.timedelta(0, 5), diff) 710 711 finally: 711 712 self.db.connections.commit() 712 713 713 def test_ 6_Editing(self):714 def test_06_Editing(self): 714 715 Zoo = self.schema['Zoo'] 715 716 … … 762 763 self.assertEqual(list(data)[0][0], d) 763 764 764 def test_ 6a_Edit_expressions(self):765 def test_06a_Edit_expressions(self): 765 766 Vet = self.schema['Vet'] 766 767 … … 779 780 self.assertEqual(gp['NameLen'], 5) 780 781 781 def test_ 7_Multiselect(self):782 def test_07_Multiselect(self): 782 783 try: 783 784 f = (lambda z, a: z.Name == 'San Diego Zoo') … … 863 864 f = (lambda a, z, v: z.Name == 'Sea_World') 864 865 entries = list(self.db.select((tree, [('ID',), ('ID',), ('ID', 'Name')], f))) 865 self.assertEqual(len(entries), 4)866 self.assertEqual(len(entries), 2) 866 867 867 868 # Let's try three joined classes just for the sadistic fun of it. … … 885 886 self.db.connections.commit() 886 887 887 def test_ 8_CustomAssociations(self):888 def test_08_CustomAssociations(self): 888 889 try: 889 890 # Try different association paths … … 901 902 self.db.connections.commit() 902 903 903 def test_ 9_delete(self):904 def test_09_delete(self): 904 905 ostrich = self.schema['Animal'].select(Species='Ostrich') 905 906 self.assert_(ostrich is not None) … … 920 921 ostrich = self.schema['Animal'].select(Species='Ostrich') 921 922 self.assertEqual(ostrich, None) 922 923 924 def test_10_timezone_aware(self): 925 926 if self.db.__class__.__name__.endswith('PgDatabase'): 927 # Exercise the timezone aware dbtype supported by postgresql. 928 class Timezone(datetime.tzinfo): 929 def __init__(self, offset=0): 930 self._offset = offset 931 self._timedelta = datetime.timedelta(seconds=offset * 60) 932 def utcoffset(self, dt): 933 return self._timedelta 934 def dst(self, dt): 935 return datetime.timedelta(0) 936 937 eagle = self.schema['Animal'].insert( 938 Species='Eagle', 939 Birthdate=datetime.datetime(2011, 01, 01, 07, 31, 12, 100, tzinfo=Timezone(240)) 940 )['ID'] 941 942 eagle = self.schema['Animal'].select(Species='Eagle') 943 d = eagle['Birthdate'].astimezone(Timezone(240)) 944 self.assertEqual(2011, d.year) 945 self.assertEqual(01, d.month) 946 self.assertEqual(01, d.day) 947 self.assertEqual(07, d.hour) 948 self.assertEqual(31, d.minute) 949 self.assertEqual(12, d.second) 950 self.assertEqual(100, d.microsecond) 951 923 952 def test_primary_key_support(self): 924 953 # Drop and re-add the PK on, oh, how about the Animal table?
