Add FuzzyDatetimeArchiveSpecifier

This commit is contained in:
Conor Hughes 2014-10-25 09:48:45 -07:00
parent c647995056
commit d7f0e93144
1 changed files with 32 additions and 0 deletions

View File

@ -1,6 +1,11 @@
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import dateutil.parser
import dateutil.tz
import datetime
import itertools
CONCRETE_SPECIFIERS = set()
class ArchiveSpecifierMeta(type):
@ -23,10 +28,12 @@ class ArchiveSpecifierMeta(type):
def concrete(self):
return not self.__dict__.get("ABSTRACT", False)
class ArchiveSpecifier(object):
__metaclass__ = ArchiveSpecifierMeta
ABSTRACT = True
class OrdinalArchiveSpecifier(ArchiveSpecifier):
@classmethod
def acceptable_specifier(cls, specifier_str):
@ -42,6 +49,7 @@ class OrdinalArchiveSpecifier(ArchiveSpecifier):
def evaluate(self, archive, ordinal):
return ordinal == self.ordinal
class TimestampArchiveSpecifier(ArchiveSpecifier):
@classmethod
def acceptable_specifier(cls, specifier_str):
@ -57,3 +65,27 @@ class TimestampArchiveSpecifier(ArchiveSpecifier):
def evaluate(self, archive, ordinal):
return archive.timestamp == self.timestamp
class FuzzyDatetimeArchiveSpecifier(ArchiveSpecifier):
@classmethod
def acceptable_specifier(cls, specifier_str):
try:
dateutil.parser.parse(specifier_str)
except:
return False
return True
def __init__(self, specifier_str):
default = datetime.datetime(year=1, month=1, day=1)
dt = dateutil.parser.parse(specifier_str, default=default)
if dt.tzinfo is None:
dt = dt.replace(tzinfo=dateutil.tz.tzlocal())
self.datetime = dt
def evaluate(self, archive, ordinal):
timezone_corrected_archive_time = archive.datetime.astimezone(self.datetime.tzinfo)
check = ["year", "month", "day", "hour", "minute", "second"]
check = reversed(list(itertools.dropwhile(lambda k: getattr(self.datetime, k) == 0 and k != "day", reversed(check))))
return all((getattr(self.datetime, k) == getattr(timezone_corrected_archive_time, k) for k in check))