From 717c31735a87a7cf49ab41729d0ddbc3512f5b6f Mon Sep 17 00:00:00 2001 From: niemeyer <> Date: Mon, 12 Nov 2007 21:47:59 +0000 Subject: =?UTF-8?q?Fixed=20bug=20in=20constructor=20of=20parser,=20and=20c?= =?UTF-8?q?onverted=20parser=20classes=20to=20new-style=20classes.=20=20Or?= =?UTF-8?q?iginal=20report=20and=20patch=20by=20Michael=20Elsd=C3=B6rfer.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dateutil/parser.py | 40 ++++++++++++++++++++++------------------ test.py | 18 +++++++++++++++--- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/dateutil/parser.py b/dateutil/parser.py index afa52a8..6de6829 100644 --- a/dateutil/parser.py +++ b/dateutil/parser.py @@ -8,17 +8,24 @@ datetime module. __author__ = "Gustavo Niemeyer " __license__ = "PSF License" -import os.path +import datetime import string -import sys import time +import sys +import os + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO -import datetime import relativedelta import tz + __all__ = ["parse", "parserinfo"] + # Some pointers: # # http://www.cl.cam.ac.uk/~mgk25/iso-time.html @@ -28,12 +35,9 @@ __all__ = ["parse", "parserinfo"] # http://search.cpan.org/author/MUIR/Time-modules-2003.0211/lib/Time/ParseDate.pm # http://stein.cshl.org/jade/distrib/docs/java.text.SimpleDateFormat.html -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO -class _timelex: +class _timelex(object): + def __init__(self, instream): if isinstance(instream, basestring): instream = StringIO(instream) @@ -139,6 +143,7 @@ class _timelex: return list(cls(s)) split = classmethod(split) + class _resultbase(object): def __init__(self): @@ -156,7 +161,8 @@ class _resultbase(object): def __repr__(self): return self._repr(self.__class__.__name__) -class parserinfo: + +class parserinfo(object): # m from a.m/p.m, t from ISO T separator JUMP = [" ", ".", ",", ";", "-", "/", "'", @@ -281,15 +287,10 @@ class parserinfo: return True -class parser: +class parser(object): - def __init__(self, info=parserinfo): - if issubclass(info, parserinfo): - self.info = parserinfo() - elif isinstance(info, parserinfo): - self.info = info - else: - raise TypeError, "Unsupported parserinfo type" + def __init__(self, info=None): + self.info = info or parserinfo() def parse(self, timestr, default=None, ignoretz=False, tzinfos=None, @@ -693,7 +694,8 @@ def parse(timestr, parserinfo=None, **kwargs): else: return DEFAULTPARSER.parse(timestr, **kwargs) -class _tzparser: + +class _tzparser(object): class _result(_resultbase): @@ -862,10 +864,12 @@ class _tzparser: return res + DEFAULTTZPARSER = _tzparser() def _parsetz(tzstr): return DEFAULTTZPARSER.parse(tzstr) + def _parsems(value): return int(value), int(value * 1000000) - int(value) * 1000000 diff --git a/test.py b/test.py index 3150e82..9a3c53c 100644 --- a/test.py +++ b/test.py @@ -1,6 +1,9 @@ #!/usr/bin/python -import unittest +# -*- encoding: utf-8 -*- from cStringIO import StringIO +import unittest +import calendar +import time import base64 import os @@ -21,8 +24,6 @@ from dateutil import zoneinfo from datetime import * -import calendar -import time class RelativeDeltaTest(unittest.TestCase): now = datetime(2003, 9, 17, 20, 54, 47, 282310) @@ -2949,6 +2950,7 @@ class RRuleTest(unittest.TestCase): class ParserTest(unittest.TestCase): + def setUp(self): self.tzinfos = {"BRST": -10800} self.brsttz = tzoffset("BRST", -10800) @@ -3555,6 +3557,16 @@ class ParserTest(unittest.TestCase): self.assertEquals(dt1.microsecond, 10000) self.assertEquals(dt2.microsecond, 10000) + def testCustomParserInfo(self): + # Custom parser info wasn't working, as Michael Elsdörfer discovered. + from dateutil.parser import parserinfo, parser + class myparserinfo(parserinfo): + MONTHS = parserinfo.MONTHS[:] + MONTHS[0] = ("Foo", "Foo") + myparser = parser(myparserinfo()) + dt = myparser.parse("01/Foo/2007") + self.assertEquals(dt, datetime(2007, 1, 1)) + class EasterTest(unittest.TestCase): easterlist = [ -- cgit v1.2.1