]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Supplied a custom strftime() function which
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 19 Sep 2008 20:42:51 +0000 (20:42 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 19 Sep 2008 20:42:51 +0000 (20:42 +0000)
handles dates before 1900.  [ticket:968]
- removed a few bogus classes from util

CHANGES
lib/sqlalchemy/databases/sqlite.py
lib/sqlalchemy/util.py
test/sql/testtypes.py

diff --git a/CHANGES b/CHANGES
index 206d2cb5fa5b24672feb27cd0b37f080a1dc11b6..433f812ad134a3ae72b53322cd034894b48bc4ff 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -24,6 +24,10 @@ CHANGES
 - mysql
     - Added MSMediumInteger type [ticket:1146].
 
+- sqlite
+    - Supplied a custom strftime() function which
+      handles dates before 1900.  [ticket:968]
+      
 - oracle
     - has_sequence() now takes schema name into account
       [ticket:1155]
index b4af462211867ca095df3f14b6a4390ce3f09708..aef819d0c7de14292a261e91b5475f25b973a44b 100644 (file)
@@ -65,11 +65,11 @@ class DateTimeMixin(object):
             elif value is not None:
                 if self.__microsecond__ and getattr(value, 'microsecond', None) is not None:
                     if self.__legacy_microseconds__:
-                        return value.strftime(self.__format__ + '.' + str(value.microsecond))
+                        return util.strftime(value, self.__format__ + '.' + str(value.microsecond))
                     else:
-                        return value.strftime(self.__format__ + ('.%06d' % value.microsecond))
+                        return util.strftime(value, self.__format__ + ('.%06d' % value.microsecond))
                 else:
-                    return value.strftime(self.__format__)
+                    return util.strftime(value, self.__format__)
             else:
                 return None
         return process
index af768ff36ddd76fb3710ea35021be60f4eb03527..18e4c6fa26a4e4181560cbbecf34f991d172e02b 100644 (file)
@@ -7,6 +7,7 @@
 import inspect, itertools, new, operator, sets, sys, warnings, weakref
 import __builtin__
 types = __import__('types')
+import re
 
 from sqlalchemy import exceptions
 
@@ -410,43 +411,31 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
         exec py in env
         setattr(into_cls, method, env[method])
 
-class SimpleProperty(object):
-    """A *default* property accessor."""
-
-    def __init__(self, key):
-        self.key = key
-
-    def __set__(self, obj, value):
-        setattr(obj, self.key, value)
-
-    def __delete__(self, obj):
-        delattr(obj, self.key)
-
-    def __get__(self, obj, owner):
-        if obj is None:
-            return self
-        else:
-            return getattr(obj, self.key)
-
-
-class NotImplProperty(object):
-  """a property that raises ``NotImplementedError``."""
-
-  def __init__(self, doc):
-      self.__doc__ = doc
-
-  def __set__(self, obj, value):
-      raise NotImplementedError()
-
-  def __delete__(self, obj):
-      raise NotImplementedError()
-
-  def __get__(self, obj, owner):
-      if obj is None:
-          return self
-      else:
-          raise NotImplementedError()
-
+_strftime_conversions = {
+    "Y":lambda dt: "%4.4d" % getattr(dt, 'year', 0),
+    "m":lambda dt: "%2.2d" % getattr(dt, 'month', 0),
+    "d":lambda dt: "%2.2d" % getattr(dt, 'day', 0),
+    "H":lambda dt: "%2.2d" % getattr(dt, 'hour', 0),
+    "M":lambda dt: "%2.2d" % getattr(dt, 'minute', 0),
+    "S":lambda dt: "%2.2d" % getattr(dt, 'second', 0),
+    "c":lambda dt: '%06d' % getattr(dt, 'microsecond', 0)
+}
+_strftime_regexp = re.compile(r'%(\w)')
+    
+def strftime(dt, format):
+    """format a date, time or datetime object.
+    
+    Partially compatible with datetime.strftime().
+    
+    handles years before 1900.
+    
+    Also adds "c", representing microseconds.
+    
+    """
+    def repl(m):
+        return _strftime_conversions[m.group(1)](dt)
+    return _strftime_regexp.sub(repl, format)
+    
 class OrderedProperties(object):
     """An object that maintains the order in which attributes are set upon it.
 
index 154e21bf9a6bfcbe74b4243b2cd6443bc65611d6..35322a1e01bb9bcabdea0323ad6ad97911347af4 100644 (file)
@@ -549,19 +549,19 @@ class DateTest(TestBase, AssertsExecutionResults):
         if testing.against('oracle'):
             import sqlalchemy.databases.oracle as oracle
             insert_data =  [
-                    [7, 'jack',
+                    (7, 'jack',
                      datetime.datetime(2005, 11, 10, 0, 0),
                      datetime.date(2005,11,10),
-                     datetime.datetime(2005, 11, 10, 0, 0, 0, 29384)],
-                    [8, 'roy',
+                     datetime.datetime(2005, 11, 10, 0, 0, 0, 29384)),
+                    (8, 'roy',
                      datetime.datetime(2005, 11, 10, 11, 52, 35),
                      datetime.date(2005,10,10),
-                     datetime.datetime(2006, 5, 10, 15, 32, 47, 6754)],
-                    [9, 'foo',
+                     datetime.datetime(2006, 5, 10, 15, 32, 47, 6754)),
+                    (9, 'foo',
                      datetime.datetime(2006, 11, 10, 11, 52, 35),
                      datetime.date(1970,4,1),
-                     datetime.datetime(2004, 9, 18, 4, 0, 52, 1043)],
-                    [10, 'colber', None, None, None]
+                     datetime.datetime(2004, 9, 18, 4, 0, 52, 1043)),
+                    (10, 'colber', None, None, None),
              ]
             fnames = ['user_id', 'user_name', 'user_datetime',
                       'user_date', 'user_time']
@@ -583,20 +583,22 @@ class DateTest(TestBase, AssertsExecutionResults):
                 time_micro = 0
 
             insert_data =  [
-                [7, 'jack',
+                (7, 'jack',
                  datetime.datetime(2005, 11, 10, 0, 0),
                  datetime.date(2005, 11, 10),
-                 datetime.time(12, 20, 2)],
-                [8, 'roy',
+                 datetime.time(12, 20, 2)),
+                (8, 'roy',
                  datetime.datetime(2005, 11, 10, 11, 52, 35),
                  datetime.date(2005, 10, 10),
-                 datetime.time(0, 0, 0)],
-                [9, 'foo',
+                 datetime.time(0, 0, 0)),
+                (9, 'foo',
                  datetime.datetime(2005, 11, 10, 11, 52, 35, datetime_micro),
                  datetime.date(1970, 4, 1),
-                 datetime.time(23, 59, 59, time_micro)],
-                [10, 'colber', None, None, None]
+                 datetime.time(23, 59, 59, time_micro)),
+                (10, 'colber', None, None, None),
             ]
+            
+            
             fnames = ['user_id', 'user_name', 'user_datetime',
                       'user_date', 'user_time']
 
@@ -606,6 +608,14 @@ class DateTest(TestBase, AssertsExecutionResults):
                        Column('user_date', Date),
                        Column('user_time', Time)]
 
+        if testing.against('sqlite', 'postgres'):
+            insert_data.append(
+                (11, 'historic',
+                datetime.datetime(1850, 11, 10, 11, 52, 35, datetime_micro),
+                datetime.date(1727,4,1),
+                None),
+            )
+
         users_with_date = Table('query_users_with_date',
                                 MetaData(testing.db), *collist)
         users_with_date.create()
@@ -620,7 +630,7 @@ class DateTest(TestBase, AssertsExecutionResults):
     def testdate(self):
         global insert_data
 
-        l = map(list, users_with_date.select().execute().fetchall())
+        l = map(tuple, users_with_date.select().execute().fetchall())
         self.assert_(l == insert_data,
                      'DateTest mismatch: got:%s expected:%s' % (l, insert_data))