Revision: 6500 Author: russblau Date: 2009-03-08 11:55:20 +0000 (Sun, 08 Mar 2009)
Log Message: ----------- Add a class for handling timestamp conversions, in place of functions.
Modified Paths: -------------- branches/rewrite/pywikibot/__init__.py branches/rewrite/pywikibot/data/logentries.py branches/rewrite/pywikibot/date.py branches/rewrite/pywikibot/site.py
Modified: branches/rewrite/pywikibot/__init__.py =================================================================== --- branches/rewrite/pywikibot/__init__.py 2009-03-08 09:12:46 UTC (rev 6499) +++ branches/rewrite/pywikibot/__init__.py 2009-03-08 11:55:20 UTC (rev 6500) @@ -9,6 +9,7 @@ # __version__ = '$Id$'
+import datetime import difflib import logging import re @@ -22,6 +23,56 @@ logging.basicConfig(fmt="%(message)s")
+class Timestamp(datetime.datetime): + """Class for handling Mediawiki timestamps. + + This inherits from datetime.datetime, so it can use all of the methods + and operations of a datetime object. To ensure that the results of any + operation are also a Timestamp object, be sure to use only Timestamp + objects (and datetime.timedeltas) in any operation. + + Use Timestamp.fromISOformat() and Timestamp.fromtimestampformat() to + create Timestamp objects from Mediawiki string formats. + + Use Timestamp.utcnow() [not .now()] for the current time. + + """ + mediawikiTSFormat = "%Y%m%d%H%M%S" + ISO8601Format = "%Y-%m-%dT%H:%M:%SZ" + + @classmethod + def fromISOformat(cls, ts): + """Convert an ISO 8601 timestamp to a Timestamp object.""" + return cls.strptime(ts, cls.ISO8601Format) + + @classmethod + def fromtimestampformat(cls, ts): + """Convert the internal MediaWiki timestamp format to a Timestamp object.""" + return cls.strptime(ts, cls.mediawikiTSFormat) + + def __str__(self): + """Return a string format recognized by the API""" + return self.strftime(self.ISO8601Format) + + def __add__(self, other): + newdt = datetime.datetime.__add__(self, other) + if isinstance(newdt, datetime.datetime): + return Timestamp(newdt.year, newdt.month, newdt.day, newdt.hour, + newdt.minute, newdt.second, newdt.microsecond, + newdt.tzinfo) + else: + return newdt + + def __sub__(self, other): + newdt = datetime.datetime.__sub__(self, other) + if isinstance(newdt, datetime.datetime): + return Timestamp(newdt.year, newdt.month, newdt.day, newdt.hour, + newdt.minute, newdt.second, newdt.microsecond, + newdt.tzinfo) + else: + return newdt + + def deprecated(instead=None): """Decorator to output a method deprecation warning.
Modified: branches/rewrite/pywikibot/data/logentries.py =================================================================== --- branches/rewrite/pywikibot/data/logentries.py 2009-03-08 09:12:46 UTC (rev 6499) +++ branches/rewrite/pywikibot/data/logentries.py 2009-03-08 11:55:20 UTC (rev 6500) @@ -67,9 +67,10 @@ return self.data['user']
def timestamp(self): - """datetime object corresponding to event timestamp""" + """Timestamp object corresponding to event timestamp""" if not hasattr(self, '_timestamp'): - self._timestamp = date.ISO2datetime(self.data['timestamp']) + self._timestamp = pywikibot.Timestamp.fromISOformat( + self.data['timestamp']) return self._timestamp
def comment(self): @@ -138,12 +139,13 @@
def expiry(self): """ - Returns a datetime.datetime representing the block expiry date + Returns a Timestamp representing the block expiry date Raises an Error if the entry is an unblocking log entry """ if hasattr(self, '_expiry'): return self._expiry - self._expiry = date.ISO2datetime(self._getBlockDetails()['expiry']) + self._expiry = pywikibot.Timestamp.fromISOformat( + self._getBlockDetails()['expiry']) return self._expiry
class ProtectEntry(LogEntry):
Modified: branches/rewrite/pywikibot/date.py =================================================================== --- branches/rewrite/pywikibot/date.py 2009-03-08 09:12:46 UTC (rev 6499) +++ branches/rewrite/pywikibot/date.py 2009-03-08 11:55:20 UTC (rev 6500) @@ -1509,19 +1509,6 @@ else: return formats['YearAD'][lang](year)
-mediawikiTSFormat = "%Y%m%d%H%M%S" -ISO8601Format = "%Y-%m-%dT%H:%M:%SZ" -def timestamp2datetime(ts): - from datetime import datetime - return datetime.strptime(ts, mediawikiTSFormat) - -def datetime2timestamp(dt): - return dt.strftime(mediawikiTSFormat) - -def ISO2datetime(ts): - from datetime import datetime - return datetime.strptime(ts, ISO8601Format) - # # # Map testing methods
Modified: branches/rewrite/pywikibot/site.py =================================================================== --- branches/rewrite/pywikibot/site.py 2009-03-08 09:12:46 UTC (rev 6499) +++ branches/rewrite/pywikibot/site.py 2009-03-08 11:55:20 UTC (rev 6500) @@ -790,10 +790,9 @@ return re.search('\d+', result['parse']['text']['*']).group()
def getcurrenttime(self): - """Returns a datetime object representing server time""" + """Returns a Timestamp object representing server time""" ts = self.getcurrenttimestamp() - from date import timestamp2datetime - return timestamp2datetime(ts) + return pywikibot.Timestamp.fromtimestampformat(ts)
def _getsiteinfo(self): """Retrieve siteinfo and namespaces from site."""
pywikipedia-l@lists.wikimedia.org