From 771a2b6ce271d3c284883340fd13e6e340a8650c Mon Sep 17 00:00:00 2001 From: Alex Ward Date: Sun, 15 Apr 2018 17:31:06 +0100 Subject: [PATCH 1/5] add tests around weekday names --- tests/test_maya.py | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/tests/test_maya.py b/tests/test_maya.py index b926d6f..6fd9a72 100644 --- a/tests/test_maya.py +++ b/tests/test_maya.py @@ -1,5 +1,6 @@ import copy import time +import calendar from datetime import timedelta, datetime as Datetime import pytz @@ -191,16 +192,40 @@ def test_parse(string, kwds, expected): @pytest.mark.usefixtures("frozen_now") def test_when_past(): - next_month = str(maya.now().add(months=1).month) - this_year = maya.now().year - last_year = this_year - 1 - future_date = maya.when(next_month) - past_date = maya.when(next_month, prefer_past=True) - assert future_date.year == this_year - if next_month == '1': - assert past_date.year == this_year - else: - assert past_date.year == last_year + two_days_away = maya.now().add(days=2) + + past_date = maya.when(two_days_away.slang_date(), prefer_past=True) + + assert past_date < maya.now() + + +@pytest.mark.usefixtures("frozen_now") +def test_when_future(): + two_days_away = maya.now().add(days=2) + + future_date = maya.when(two_days_away.slang_date(), prefer_past=False) + + assert future_date > maya.now() + + +@pytest.mark.usefixtures("frozen_now") +def test_when_past_day_name(): + two_days_away = maya.now().add(days=2) + + past_date = maya.when( + calendar.day_name[two_days_away.weekday], prefer_past=True) + + assert past_date < maya.now() + + +@pytest.mark.usefixtures("frozen_now") +def test_when_future_day_name(): + two_days_away = maya.now().add(days=2) + + future_date = maya.when( + calendar.day_name[two_days_away.weekday], prefer_past=False) + + assert future_date > maya.now() def test_datetime_to_timezone(): From be2cd961326d1873e2ab448c8815c0ecd2009a70 Mon Sep 17 00:00:00 2001 From: Alex Ward Date: Sun, 15 Apr 2018 19:22:56 +0100 Subject: [PATCH 2/5] add more options to .when pefer_past param --- maya/core.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/maya/core.py b/maya/core.py index d1b25a0..35dec43 100644 --- a/maya/core.py +++ b/maya/core.py @@ -675,7 +675,7 @@ def now(): return MayaDT(epoch=epoch) -def when(string, timezone='UTC', prefer_past=False): +def when(string, timezone='UTC', prefer_past=None): """"Returns a MayaDT instance for the human moment specified. Powered by dateparser. Useful for scraping websites. @@ -694,8 +694,12 @@ def when(string, timezone='UTC', prefer_past=False): 'RETURN_AS_TIMEZONE_AWARE': True, 'TO_TIMEZONE': 'UTC', } - if prefer_past: + + if prefer_past is False: + settings['PREFER_DATES_FROM'] = 'future' + if prefer_past is True: settings['PREFER_DATES_FROM'] = 'past' + dt = dateparser.parse(string, settings=settings) if dt is None: raise ValueError('invalid datetime input specified.') From 363fae1aafee614abf49001517cdbf790d56182c Mon Sep 17 00:00:00 2001 From: Alex Ward Date: Mon, 16 Apr 2018 11:33:18 +0100 Subject: [PATCH 3/5] update .when to use prefer_dates_from to align with dateparser --- maya/core.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/maya/core.py b/maya/core.py index 35dec43..19b34e2 100644 --- a/maya/core.py +++ b/maya/core.py @@ -675,7 +675,7 @@ def now(): return MayaDT(epoch=epoch) -def when(string, timezone='UTC', prefer_past=None): +def when(string, timezone='UTC', prefer_dates_from='current_period'): """"Returns a MayaDT instance for the human moment specified. Powered by dateparser. Useful for scraping websites. @@ -693,13 +693,9 @@ def when(string, timezone='UTC', prefer_past=None): 'TIMEZONE': timezone, 'RETURN_AS_TIMEZONE_AWARE': True, 'TO_TIMEZONE': 'UTC', + 'PREFER_DATES_FROM': prefer_dates_from, } - if prefer_past is False: - settings['PREFER_DATES_FROM'] = 'future' - if prefer_past is True: - settings['PREFER_DATES_FROM'] = 'past' - dt = dateparser.parse(string, settings=settings) if dt is None: raise ValueError('invalid datetime input specified.') From 9612d70707c57d256d23c785490f331367ac1884 Mon Sep 17 00:00:00 2001 From: Alex Ward Date: Mon, 16 Apr 2018 12:06:12 +0100 Subject: [PATCH 4/5] update .when tests to use new prefer_dates_from param --- tests/test_maya.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/test_maya.py b/tests/test_maya.py index 6fd9a72..dd8e361 100644 --- a/tests/test_maya.py +++ b/tests/test_maya.py @@ -194,7 +194,9 @@ def test_parse(string, kwds, expected): def test_when_past(): two_days_away = maya.now().add(days=2) - past_date = maya.when(two_days_away.slang_date(), prefer_past=True) + past_date = maya.when( + two_days_away.slang_date(), + prefer_dates_from='past') assert past_date < maya.now() @@ -203,7 +205,9 @@ def test_when_past(): def test_when_future(): two_days_away = maya.now().add(days=2) - future_date = maya.when(two_days_away.slang_date(), prefer_past=False) + future_date = maya.when( + two_days_away.slang_date(), + prefer_dates_from='future') assert future_date > maya.now() @@ -213,7 +217,8 @@ def test_when_past_day_name(): two_days_away = maya.now().add(days=2) past_date = maya.when( - calendar.day_name[two_days_away.weekday], prefer_past=True) + calendar.day_name[two_days_away.weekday], + prefer_dates_from='past') assert past_date < maya.now() @@ -223,7 +228,8 @@ def test_when_future_day_name(): two_days_away = maya.now().add(days=2) future_date = maya.when( - calendar.day_name[two_days_away.weekday], prefer_past=False) + calendar.day_name[two_days_away.weekday], + prefer_dates_from='future') assert future_date > maya.now() From a0983132bb6e66b5c85f5459a847878d1c8e6fdf Mon Sep 17 00:00:00 2001 From: Alex Ward Date: Mon, 16 Apr 2018 12:20:14 +0100 Subject: [PATCH 5/5] update .when docstring --- maya/core.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/maya/core.py b/maya/core.py index 19b34e2..d2fb23b 100644 --- a/maya/core.py +++ b/maya/core.py @@ -686,8 +686,12 @@ def when(string, timezone='UTC', prefer_dates_from='current_period'): Keyword Arguments: string -- string to be parsed timezone -- timezone referenced from (default: 'UTC') - prefer_past -- prefer parsing ambiguous date as in the past + prefer_dates_from -- what dates are prefered when `string` is ambigous. + options are 'past', 'future', and 'current_period' + (default: 'current_period'). see: [1] + Reference: + [1] dateparser.readthedocs.io/en/latest/usage.html#handling-incomplete-dates """ settings = { 'TIMEZONE': timezone,