From dd91d7a4919ff4e806a0d1b742a6e16b7c8dbe02 Mon Sep 17 00:00:00 2001 From: William Minchin Date: Fri, 7 Feb 2014 10:17:02 -0700 Subject: [PATCH] add 'from' and 'to' flags to `parse_date` When given a day, allows you to select which end of the day --- jrnl/Journal.py | 16 +++++++---- parse-date-test.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 parse-date-test.py diff --git a/jrnl/Journal.py b/jrnl/Journal.py index b5d7a664..a5a345b8 100644 --- a/jrnl/Journal.py +++ b/jrnl/Journal.py @@ -208,8 +208,8 @@ class Journal(object): If strict is True, all tags must be present in an entry. If false, the entry is kept if any tag is present.""" self.search_tags = set([tag.lower() for tag in tags]) - end_date = self.parse_date(end_date) - start_date = self.parse_date(start_date) + end_date = self.parse_date(end_date, end_flag="to") + start_date = self.parse_date(start_date, end_flag="from") # 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 result = [ @@ -235,7 +235,7 @@ class Journal(object): e.body = '' 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""" if not date_str: return None @@ -258,8 +258,14 @@ class Journal(object): except TypeError: return None - if flag is 1: # Date found, but no time. Use the default time. - date = datetime(*date[:3], hour=self.config['default_hour'], minute=self.config['default_minute']) + if flag is 1: # Date found, but no 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=self.config['default_hour'], minute=self.config['default_minute']) else: date = datetime(*date[:6]) diff --git a/parse-date-test.py b/parse-date-test.py new file mode 100644 index 00000000..5ff9e42e --- /dev/null +++ b/parse-date-test.py @@ -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 \ No newline at end of file