From 534db463060caead27c7b048cd8b3f0f450f63e5 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Thu, 14 Apr 2016 17:43:27 +0200 Subject: [PATCH] gnu: python-pandas: Fix test failures. * gnu/packages/patches/python-pandas-fix-tslib-test-failure.patch: New file. * gnu-system.am (dist_patch_DATA): Register it. * gnu/packages/python.scm (python-pandas)[source]: Add patch. --- gnu-system.am | 1 + ...python-pandas-fix-tslib-test-failure.patch | 141 ++++++++++++++++++ gnu/packages/python.scm | 6 +- 3 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 gnu/packages/patches/python-pandas-fix-tslib-test-failure.patch diff --git a/gnu-system.am b/gnu-system.am index 40c566c099..b08812db1f 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -689,6 +689,7 @@ dist_patch_DATA = \ gnu/packages/patches/python-paste-remove-website-test.patch \ gnu/packages/patches/python-paste-remove-timing-test.patch \ gnu/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \ + gnu/packages/patches/python-pandas-fix-tslib-test-failure.patch \ gnu/packages/patches/qemu-CVE-2015-8558.patch \ gnu/packages/patches/qemu-CVE-2015-8567.patch \ gnu/packages/patches/qemu-CVE-2015-8613.patch \ diff --git a/gnu/packages/patches/python-pandas-fix-tslib-test-failure.patch b/gnu/packages/patches/python-pandas-fix-tslib-test-failure.patch new file mode 100644 index 0000000000..62d6a38086 --- /dev/null +++ b/gnu/packages/patches/python-pandas-fix-tslib-test-failure.patch @@ -0,0 +1,141 @@ +This patch is required to fix a test failure when python-dateutil version +2.5.2 or later is used. It is derived from the following commits: + +80ef4e06526b9b60cf24268454c9456585a790a3 +845ff974af6f7c3b3067cce8a7149b771c2be87 + +diff --git a/pandas/tseries/tests/test_tslib.py b/pandas/tseries/tests/test_tslib.py +index f0d5bf7..863bc6f 100644 +--- a/pandas/tseries/tests/test_tslib.py ++++ b/pandas/tseries/tests/test_tslib.py +@@ -474,6 +474,11 @@ def test_does_not_convert_mixed_integer(self): + good_date_string)) + + def test_parsers(self): ++ ++ # https://github.com/dateutil/dateutil/issues/217 ++ import dateutil ++ yearfirst = dateutil.__version__ >= LooseVersion('2.5.0') ++ + cases = {'2011-01-01': datetime.datetime(2011, 1, 1), + '2Q2005': datetime.datetime(2005, 4, 1), + '2Q05': datetime.datetime(2005, 4, 1), +@@ -527,20 +532,26 @@ def test_parsers(self): + } + + for date_str, expected in compat.iteritems(cases): +- result1, _, _ = tools.parse_time_string(date_str) +- result2 = to_datetime(date_str) +- result3 = to_datetime([date_str]) +- result4 = to_datetime(np.array([date_str], dtype=object)) +- result5 = Timestamp(date_str) +- result6 = DatetimeIndex([date_str])[0] +- result7 = date_range(date_str, freq='S', periods=1) ++ result1, _, _ = tools.parse_time_string(date_str, ++ yearfirst=yearfirst) ++ result2 = to_datetime(date_str, yearfirst=yearfirst) ++ result3 = to_datetime([date_str], yearfirst=yearfirst) ++ result4 = to_datetime(np.array([date_str], dtype=object), ++ yearfirst=yearfirst) ++ result6 = DatetimeIndex([date_str], yearfirst=yearfirst)[0] + self.assertEqual(result1, expected) + self.assertEqual(result2, expected) + self.assertEqual(result3, expected) + self.assertEqual(result4, expected) +- self.assertEqual(result5, expected) + self.assertEqual(result6, expected) +- self.assertEqual(result7, expected) ++ ++ # these really need to have yearfist, but we don't support ++ if not yearfirst: ++ result5 = Timestamp(date_str) ++ self.assertEqual(result5, expected) ++ result7 = date_range(date_str, freq='S', periods=1, ++ yearfirst=yearfirst) ++ self.assertEqual(result7, expected) + + # NaT + result1, _, _ = tools.parse_time_string('NaT') +@@ -589,23 +589,62 @@ def test_parsers_quarter_invalid(self): + self.assertRaises(ValueError, tools.parse_time_string, case) + + def test_parsers_dayfirst_yearfirst(self): ++ ++ # https://github.com/dateutil/dateutil/issues/217 ++ # this issue was closed ++ import dateutil ++ is_compat_version = dateutil.__version__ >= LooseVersion('2.5.2') ++ if is_compat_version: ++ dayfirst_yearfirst1 = datetime.datetime(2010, 12, 11) ++ dayfirst_yearfirst2 = datetime.datetime(2020, 12, 21) ++ else: ++ dayfirst_yearfirst1 = datetime.datetime(2010, 11, 12) ++ dayfirst_yearfirst2 = datetime.datetime(2020, 12, 21) ++ + # str : dayfirst, yearfirst, expected +- cases = {'10-11-12': [(False, False, datetime.datetime(2012, 10, 11)), +- (True, False, datetime.datetime(2012, 11, 10)), +- (False, True, datetime.datetime(2010, 11, 12)), +- (True, True, datetime.datetime(2010, 11, 12))], +- '20/12/21': [(False, False, datetime.datetime(2021, 12, 20)), +- (True, False, datetime.datetime(2021, 12, 20)), +- (False, True, datetime.datetime(2020, 12, 21)), +- (True, True, datetime.datetime(2020, 12, 21))]} ++ cases = {'10-11-12': [(False, False, False, ++ datetime.datetime(2012, 10, 11)), ++ (True, False, False, ++ datetime.datetime(2012, 11, 10)), ++ (False, True, False, ++ datetime.datetime(2010, 11, 12)), ++ (True, True, False, dayfirst_yearfirst1)], ++ '20/12/21': [(False, False, False, ++ datetime.datetime(2021, 12, 20)), ++ (True, False, False, ++ datetime.datetime(2021, 12, 20)), ++ (False, True, False, ++ datetime.datetime(2020, 12, 21)), ++ (True, True, True, dayfirst_yearfirst2)]} + + tm._skip_if_no_dateutil() + from dateutil.parser import parse + for date_str, values in compat.iteritems(cases): +- for dayfirst, yearfirst, expected in values: +- result1, _, _ = tools.parse_time_string(date_str, +- dayfirst=dayfirst, +- yearfirst=yearfirst) ++ for dayfirst, yearfirst, is_compat, expected in values: ++ ++ f = lambda x: tools.parse_time_string(x, ++ dayfirst=dayfirst, ++ yearfirst=yearfirst) ++ ++ # we now have an invalid parse ++ if is_compat and is_compat_version: ++ self.assertRaises(tslib.DateParseError, f, date_str) ++ ++ def f(date_str): ++ return to_datetime(date_str, dayfirst=dayfirst, ++ yearfirst=yearfirst) ++ ++ self.assertRaises(ValueError, f, date_str) ++ ++ def f(date_str): ++ return DatetimeIndex([date_str], dayfirst=dayfirst, ++ yearfirst=yearfirst)[0] ++ ++ self.assertRaises(ValueError, f, date_str) ++ ++ continue ++ ++ result1, _, _ = f(date_str) + + result2 = to_datetime(date_str, dayfirst=dayfirst, + yearfirst=yearfirst) +@@ -614,7 +653,6 @@ def test_parsers_dayfirst_yearfirst(self): + yearfirst=yearfirst)[0] + + # Timestamp doesn't support dayfirst and yearfirst +- + self.assertEqual(result1, expected) + self.assertEqual(result2, expected) + self.assertEqual(result3, expected) diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm index 4238965fd0..a5c0eaad79 100644 --- a/gnu/packages/python.scm +++ b/gnu/packages/python.scm @@ -7,7 +7,7 @@ ;;; Copyright © 2014, 2015 Federico Beffa ;;; Copyright © 2015 Omar Radwan ;;; Copyright © 2015 Pierre-Antoine Rault -;;; Copyright © 2015 Ricardo Wurmus +;;; Copyright © 2015, 2016 Ricardo Wurmus ;;; Copyright © 2015, 2016 Christopher Allan Webber ;;; Copyright © 2015 Eric Dvorsak ;;; Copyright © 2015, 2016 David Thompson @@ -987,7 +987,9 @@ datetime module, available in Python 2.3+.") (method url-fetch) (uri (pypi-uri "pandas" version)) (sha256 - (base32 "050qw0ap5bhyv5flp78x3lcq1dlminl3xaj6kbrm0jqmx0672xf9")))) + (base32 "050qw0ap5bhyv5flp78x3lcq1dlminl3xaj6kbrm0jqmx0672xf9")) + (patches (search-patches + "python-pandas-fix-tslib-test-failure.patch")))) (build-system python-build-system) (propagated-inputs `(("python-numpy" ,python-numpy)