[pypy-svn] r29775 - in pypy/dist/pypy/module/rctime: . test

rhymes at codespeak.net rhymes at codespeak.net
Fri Jul 7 19:29:02 CEST 2006


Author: rhymes
Date: Fri Jul  7 19:29:00 2006
New Revision: 29775

Modified:
   pypy/dist/pypy/module/rctime/__init__.py
   pypy/dist/pypy/module/rctime/interp_time.py
   pypy/dist/pypy/module/rctime/test/test_rctime.py
Log:
implemented time.mktime(). thanks to arre and arigo for the hints.


Modified: pypy/dist/pypy/module/rctime/__init__.py
==============================================================================
--- pypy/dist/pypy/module/rctime/__init__.py	(original)
+++ pypy/dist/pypy/module/rctime/__init__.py	Fri Jul  7 19:29:00 2006
@@ -3,12 +3,13 @@
 
 class Module(MixedModule):
     interpleveldefs = {
-        'accept2dyear'      : 'interp_time.accept2dyear',
+        'accept2dyear': 'interp_time.accept2dyear',
         'time': 'interp_time.time',
         'clock': 'interp_time.clock',
         'ctime': 'interp_time.ctime',
         'gmtime': 'interp_time.gmtime',
         'localtime': 'interp_time.localtime',
+        'mktime': 'interp_time.mktime',
     }
 
     # def init(self, space):

Modified: pypy/dist/pypy/module/rctime/interp_time.py
==============================================================================
--- pypy/dist/pypy/module/rctime/interp_time.py	(original)
+++ pypy/dist/pypy/module/rctime/interp_time.py	Fri Jul  7 19:29:00 2006
@@ -4,10 +4,10 @@
 from pypy.rpython.rctypes.aerrno import geterrno
 from pypy.interpreter.error import OperationError
 from pypy.interpreter.gateway import ObjSpace
-from pypy.interpreter.gateway import W_Root, NoneNotWrapped
-from pypy.objspace.std.noneobject import W_NoneObject
+from pypy.interpreter.gateway import W_Root
 from ctypes import *
 import os
+import math
 
 _POSIX = os.name == "posix"
 
@@ -50,6 +50,8 @@
 libc.gmtime.restype = POINTER(cConfig.tm)
 libc.localtime.argtypes = [POINTER(cConfig.time_t)]
 libc.localtime.restype = POINTER(cConfig.tm)
+libc.mktime.argtypes = [POINTER(cConfig.tm)]
+libc.mktime.restype = cConfig.time_t
 
 def _init_accept2dyear():
     return (1, 0)[bool(os.getenv("PYTHONY2K"))]
@@ -125,6 +127,40 @@
     w_time_tuple = space.newtuple(time_tuple)
     return space.call_function(w_struct_time, w_time_tuple)
 
+def _gettmarg(space, w_tup, buf):
+    y = space.int_w(w_tup[0])
+    buf.tm_mon = space.int_w(w_tup[1])
+    buf.tm_mday = space.int_w(w_tup[2])
+    buf.tm_hour = space.int_w(w_tup[3])
+    buf.tm_min = space.int_w(w_tup[4])
+    buf.tm_sec = space.int_w(w_tup[5])
+    buf.tm_wday = space.int_w(w_tup[6])
+    buf.tm_yday = space.int_w(w_tup[7])
+    buf.tm_isdst = space.int_w(w_tup[8])
+
+    w_accept2dyear = _get_app_object(space, "accept2dyear")
+    accept2dyear = space.int_w(w_accept2dyear)
+    
+    if y < 1900:
+        if not accept2dyear:
+            raise OperationError(space.w_ValueError,
+                space.wrap("year >= 1900 required"))
+
+        if 69 <= y <= 99:
+            y += 1900
+        elif 0 <= y <= 68:
+            y += 2000
+        else:
+            raise OperationError(space.w_ValueError,
+                space.wrap("year out of range"))
+
+    buf.tm_year = y - 1900
+    buf.tm_mon = buf.tm_mon - 1
+    buf.tm_wday = int(math.fmod((buf.tm_wday + 1), 7))
+    buf.tm_yday = buf.tm_yday - 1
+
+    return buf
+
 def time(space):
     secs = _floattime()
     return space.wrap(secs)
@@ -191,6 +227,7 @@
     if not p:
         raise OperationError(space.w_ValueError, space.wrap(_get_error_msg()))
     return _tm_to_tuple(space, p.contents)
+gmtime.unwrap_spec = [ObjSpace, W_Root]
 
 def localtime(space, w_seconds=None):
     """localtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,
@@ -206,4 +243,36 @@
     if not p:
         raise OperationError(space.w_ValueError, space.wrap(_get_error_msg()))
     return _tm_to_tuple(space, p.contents)
+localtime.unwrap_spec = [ObjSpace, W_Root]
+
+def mktime(space, w_tup):
+    """mktime(tuple) -> floating point number
+
+    Convert a time tuple in local time to seconds since the Epoch."""
+    
+    if space.is_w(w_tup, space.w_None):
+        raise OperationError(space.w_TypeError, 
+            space.wrap("argument must be 9-item sequence not None"))
+    else:
+        tup = space.unpackiterable(w_tup)
+    
+    if 1 < len(tup) < 9:
+        raise OperationError(space.w_TypeError,
+            space.wrap("argument must be a sequence of length 9, not %d"\
+                % len(tup)))
+
+    tt = cConfig.time_t(int(_floattime()))
+    
+    buf = libc.localtime(byref(tt))
+    if not buf:
+        raise OperationError(space.w_ValueError, space.wrap(_get_error_msg()))
+    
+    buf = _gettmarg(space, tup, buf.contents)
+
+    tt = libc.mktime(byref(buf))
+    if tt == -1:
+        raise OperationError(space.w_OverflowError,
+            space.wrap("mktime argument out of range"))
 
+    return space.wrap(float(tt))
+mktime.unwrap_spec = [ObjSpace, W_Root]

Modified: pypy/dist/pypy/module/rctime/test/test_rctime.py
==============================================================================
--- pypy/dist/pypy/module/rctime/test/test_rctime.py	(original)
+++ pypy/dist/pypy/module/rctime/test/test_rctime.py	Fri Jul  7 19:29:00 2006
@@ -1,10 +1,6 @@
 from py.test import raises
 from pypy.conftest import gettestobjspace
 
-# def setup_module(mod):
-#     mod.t = rctime.time()
-#     mod.tup = (1, 2, 3, 4, 5, 6, 7, 8, 9)
-#     mod.st_time = rctime.struct_time(mod.tup)
 class AppTestRCTime:
     def setup_class(cls):
         space = gettestobjspace(usemodules=('rctime',))
@@ -55,10 +51,11 @@
         rctime.gmtime(0)
         res = rctime.gmtime(rctime.time())
         assert res[-1] == 0 # DST is always zero in gmtime()
-#         t0 = rctime.mktime(rctime.gmtime())
-#         t1 = rctime.mktime(rctime.gmtime(None))
-#         assert 0 <= (t1 - t0) < 0.2
-#         assert rctime.gmtime(t) == rctime.gmtime(t)
+        t0 = rctime.mktime(rctime.gmtime())
+        t1 = rctime.mktime(rctime.gmtime(None))
+        assert 0 <= (t1 - t0) < 0.2
+        t = rctime.time()
+        assert rctime.gmtime(t) == rctime.gmtime(t)
 
     def test_localtime(self):
         import rctime
@@ -67,53 +64,51 @@
         rctime.localtime(None)
         rctime.localtime(0)
         rctime.localtime(rctime.time())
-    #     t0 = rctime.mktime(rctime.gmtime())
-    #     t1 = rctime.mktime(rctime.gmtime(None))
-    #     assert 0 <= (t1 - t0) < 0.2
-    #     assert rctime.localtime(t) == rctime.localtime(t)
-    # 
-    # def test_mktime():
-    #     py.test.raises(TypeError, rctime.mktime, "foo")
-    #     py.test.raises(TypeError, rctime.mktime, None)
-    #     py.test.raises(TypeError, rctime.mktime, (1, 2))
-    # 
-    #     arg = rctime.localtime(t)
-    # 
-    #     assert rctime.mktime(arg) != None
-    #     assert rctime.mktime(arg) != 0.0
-    # 
-    #     rctime.accept2dyear == 0
-    #     arg = list(arg)
-    #     arg[0] = 1899
-    #     arg = tuple(arg)
-    #     py.test.raises(ValueError, rctime.mktime, arg)
-    #     rctime.accept2dyear == 1
-    # 
-    #     arg = list(arg)
-    #     arg[0] = 67
-    #     arg = tuple(arg)
-    #     py.test.raises(ValueError, rctime.mktime, arg)
-    # 
-    #     arg = list(arg)
-    #     arg[0] = 100
-    #     arg = tuple(arg)
-    #     py.test.raises(ValueError, rctime.mktime, arg)
-    # 
-    #     assert long(rctime.mktime(rctime.localtime(t))) == long(t)
-    #     assert long(rctime.mktime(rctime.gmtime(t))) != long(t)
-    #     lt = rctime.localtime()
-    #     assert rctime.mktime(tuple(lt)) == rctime.mktime(lt)
-    # 
-    # def test_asrctime():
-    #     py.test.raises(TypeError, rctime.asrctime, "foo")
-    #     py.test.raises(TypeError, rctime.asrctime, None)
-    #     py.test.raises(TypeError, rctime.asrctime, (1, 2))
-    #     assert rctime.asrctime() != None
-    #     assert rctime.asrctime() != ""
-    #     assert rctime.rctime(t) == rctime.asrctime(rctime.localtime(t))
-    #     assert rctime.rctime(t) != rctime.asrctime(rctime.gmtime(t))
+        t0 = rctime.mktime(rctime.gmtime())
+        t1 = rctime.mktime(rctime.gmtime(None))
+        assert 0 <= (t1 - t0) < 0.2
+        t = rctime.time()
+        assert rctime.localtime(t) == rctime.localtime(t)
+    
+    def test_mktime(self):
+        import rctime
+        raises(TypeError, rctime.mktime, "foo")
+        raises(TypeError, rctime.mktime, None)
+        raises(TypeError, rctime.mktime, (1, 2))
+        rctime.mktime(rctime.localtime())
+
+        ltime = rctime.localtime()
+        rctime.accept2dyear == 0
+        ltime = list(ltime)
+        ltime[0] = 1899
+        raises(ValueError, rctime.mktime, tuple(ltime))
+        rctime.accept2dyear == 1
+    
+        ltime = list(ltime)
+        ltime[0] = 67
+        ltime = tuple(ltime)
+        raises(OverflowError, rctime.mktime, ltime)
+    
+        ltime = list(ltime)
+        ltime[0] = 100
+        raises(ValueError, rctime.mktime, tuple(ltime))
+    
+        t = rctime.time()
+        assert long(rctime.mktime(rctime.localtime(t))) == long(t)
+        assert long(rctime.mktime(rctime.gmtime(t))) != long(t)
+        ltime = rctime.localtime()
+        assert rctime.mktime(tuple(ltime)) == rctime.mktime(ltime)
+    # 
+    # def test_asctime():
+    #     py.test.raises(TypeError, rctime.asctime, "foo")
+    #     py.test.raises(TypeError, rctime.asctime, None)
+    #     py.test.raises(TypeError, rctime.asctime, (1, 2))
+    #     assert rctime.asctime() != None
+    #     assert rctime.asctime() != ""
+    #     assert rctime.rctime(t) == rctime.asctime(rctime.localtime(t))
+    #     assert rctime.rctime(t) != rctime.asctime(rctime.gmtime(t))
     #     lt = rctime.localtime()
-    #     assert rctime.asrctime(tuple(lt)) == rctime.asrctime(lt)
+    #     assert rctime.asctime(tuple(lt)) == rctime.asctime(lt)
     # 
     def test_struct_time(self):
         import rctime



More information about the Pypy-commit mailing list