Add FuzzyDatetimeArchiveSpecifier
This commit is contained in:
parent
c647995056
commit
d7f0e93144
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue