add 'from' and 'to' flags to parse_date

When given a day, allows you to select which end of the day
This commit is contained in:
William Minchin 2014-02-07 10:17:02 -07:00
parent 24a5712c4d
commit dd91d7a491
2 changed files with 78 additions and 5 deletions

View file

@ -208,8 +208,8 @@ class Journal(object):
If strict is True, all tags must be present in an entry. If false, the If strict is True, all tags must be present in an entry. If false, the
entry is kept if any tag is present.""" entry is kept if any tag is present."""
self.search_tags = set([tag.lower() for tag in tags]) self.search_tags = set([tag.lower() for tag in tags])
end_date = self.parse_date(end_date) end_date = self.parse_date(end_date, end_flag="to")
start_date = self.parse_date(start_date) start_date = self.parse_date(start_date, end_flag="from")
# If strict mode is on, all tags have to be present in entry # If strict mode is on, all tags have to be present in entry
tagged = self.search_tags.issubset if strict else self.search_tags.intersection tagged = self.search_tags.issubset if strict else self.search_tags.intersection
result = [ result = [
@ -235,7 +235,7 @@ class Journal(object):
e.body = '' e.body = ''
self.entries = result self.entries = result
def parse_date(self, date_str): def parse_date(self, date_str, end_flag=None):
"""Parses a string containing a fuzzy date and returns a datetime.datetime object""" """Parses a string containing a fuzzy date and returns a datetime.datetime object"""
if not date_str: if not date_str:
return None return None
@ -258,8 +258,14 @@ class Journal(object):
except TypeError: except TypeError:
return None return None
if flag is 1: # Date found, but no time. Use the default time. if flag is 1: # Date found, but no time.
date = datetime(*date[:3], hour=self.config['default_hour'], minute=self.config['default_minute']) if end_flag == "from":
date = datetime(*date[:3], hour=0, minute=0)
elif end_flag == "to":
date = datetime(*date[:3], hour=23, minute=59, second=59)
else:
# Use the default time.
date = datetime(*date[:3], hour=self.config['default_hour'], minute=self.config['default_minute'])
else: else:
date = datetime(*date[:6]) date = datetime(*date[:6])

67
parse-date-test.py Normal file
View file

@ -0,0 +1,67 @@
"""Parses a string containing a fuzzy date and returns a datetime.datetime object"""
from datetime import datetime
import dateutil
import argparse
try: import parsedatetime.parsedatetime_consts as pdt
except ImportError: import parsedatetime as pdt
parser = argparse.ArgumentParser()
parser.add_argument('-i', default='today')
parser.add_argument('-f', default=None)
args = parser.parse_args()
print "args: " + str(args)
date_str = args.i
end_flag = args.f
# Set up date parser
consts = pdt.Constants(usePyICU=False)
consts.DOWParseStyle = -1 # "Monday" will be either today or the last Monday
dateparse = pdt.Calendar(consts)
if not date_str:
print "Nothing supplied"
# return None
elif isinstance(date_str, datetime):
print date_str
# return date_str
try:
date = dateutil.parser.parse(date_str)
flag = 1 if date.hour == 0 and date.minute == 0 else 2
date = date.timetuple()
except:
date, flag = dateparse.parse(date_str)
if not flag: # Oops, unparsable.
try: # Try and parse this as a single year
year = int(date_str)
print datetime(year, 1, 1)
# return datetime(year, 1, 1)
except ValueError:
print "return None"
# return None
except TypeError:
print "return None"
# return None
if flag is 1: # Date found, but no time. Use the default time.
if end_flag == "from":
date = datetime(*date[:3], hour=0, minute=0)
elif end_flag == "to":
date = datetime(*date[:3], hour=23, minute=59, second=59)
else:
# Use the default time.
date = datetime(*date[:3], hour=9, minute=1)
else:
date = datetime(*date[:6])
# Ugly heuristic: if the date is more than 4 weeks in the future, we got the year wrong.
# Rather then this, we would like to see parsedatetime patched so we can tell it to prefer
# past dates
dt = datetime.now() - date
if dt.days < -28:
date = date.replace(date.year - 1)
print date
# return date