From d8c238ac5bd3a9d7eaa9cef1e8cfa2f93afcb7c4 Mon Sep 17 00:00:00 2001 From: David Payne Date: Mon, 9 Oct 2017 03:28:04 -0700 Subject: [PATCH 1/3] Fix arrow.Arrow.interval() arrow.Arrow.interval() produces unexpected results if the interval doesn't evenly divide the range. It leaves off the last chunk of time. >>> start = datetime(2013, 5, 5, 12, 30) >>> end = datetime(2013, 5, 5, 17, 15) >>> for r in arrow.Arrow.interval('hour', start, end, 4): print (r) (, ) # Expected result: # (, ) # (, ) --- arrow/arrow.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arrow/arrow.py b/arrow/arrow.py index 7cd5dcb1f..9ed9c5fa5 100644 --- a/arrow/arrow.py +++ b/arrow/arrow.py @@ -355,7 +355,11 @@ def interval(cls, frame, start, end, interval=1, tz=None): spanRange = cls.span_range(frame,start,end,tz) bound = (len(spanRange) // interval) * interval - return [ (spanRange[i][0],spanRange[i+ interval - 1][1]) for i in range(0,bound, interval) ] + _range = [ (spanRange[i][0],spanRange[i+ interval - 1][1]) for i in range(0,bound, interval) ] + + if (bound < len(spanRange)): + _range.append((spanRange[bound][0], spanRange[-1][1])) + return _range # representations From f7ff96cff818abfbdfe22003db4116f83d83846f Mon Sep 17 00:00:00 2001 From: David Payne Date: Wed, 11 Oct 2017 10:31:51 -0700 Subject: [PATCH 2/3] Add new test for interval() Test that interval() works correctly when the range isn't evenly divisible by the interval. --- tests/arrow_tests.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/arrow_tests.py b/tests/arrow_tests.py index e5a8b5223..e65b623c9 100644 --- a/tests/arrow_tests.py +++ b/tests/arrow_tests.py @@ -1001,9 +1001,20 @@ def test_incorrect_input(self): def test_correct(self): result = arrow.Arrow.interval('hour', datetime(2013, 5, 5, 12, 30), datetime(2013, 5, 5, 17, 15),2) - assertEqual(result,[(arrow.Arrow(2013, 5, 5, 12), arrow.Arrow(2013, 5, 5, 13, 59, 59, 999999)), + assertEqual(result,[ + (arrow.Arrow(2013, 5, 5, 12), arrow.Arrow(2013, 5, 5, 13, 59, 59, 999999)), (arrow.Arrow(2013, 5, 5, 14), arrow.Arrow(2013, 5, 5, 15, 59, 59, 999999)), - (arrow.Arrow(2013, 5, 5, 16), arrow.Arrow(2013, 5, 5, 17, 59, 59, 999999))]) + (arrow.Arrow(2013, 5, 5, 16), arrow.Arrow(2013, 5, 5, 17, 59, 59, 999999)) + ]) + + def test_correct2(self): + result = arrow.Arrow.interval('hour', datetime(2013, 5, 5, 12, 30), datetime(2013, 5, 5, 22, 15),4) + + assertEqual(result,[ + (arrow.Arrow(2013, 5, 5, 12), arrow.Arrow(2013, 5, 5, 15, 59, 59, 999999)), + (arrow.Arrow(2013, 5, 5, 16), arrow.Arrow(2013, 5, 5, 19, 59, 59, 999999)), + (arrow.Arrow(2013, 5, 5, 20), arrow.Arrow(2013, 5, 5, 22, 59, 59, 999999)) + ]) class ArrowSpanTests(Chai): From ad630859a68c46b17267d872a4fdb42187d1ea7e Mon Sep 17 00:00:00 2001 From: David Payne Date: Wed, 29 Nov 2017 02:19:32 -0800 Subject: [PATCH 3/3] PEP8 fixes. --- arrow/arrow.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/arrow/arrow.py b/arrow/arrow.py index 9ed9c5fa5..89678e6da 100644 --- a/arrow/arrow.py +++ b/arrow/arrow.py @@ -351,14 +351,11 @@ def interval(cls, frame, start, end, interval=1, tz=None): ''' if interval < 1: raise ValueError("interval has to be a positive integer") - - spanRange = cls.span_range(frame,start,end,tz) - - bound = (len(spanRange) // interval) * interval - _range = [ (spanRange[i][0],spanRange[i+ interval - 1][1]) for i in range(0,bound, interval) ] - - if (bound < len(spanRange)): - _range.append((spanRange[bound][0], spanRange[-1][1])) + range_span = cls.span_range(frame, start, end, tz) + bound = (len(range_span) // interval) * interval + _range = [(range_span[i][0], range_span[i + interval - 1][1]) for i in range(0,bound, interval) ] + if bound < len(range_span): + _range.append((range_span[bound][0], range_span[-1][1])) return _range # representations