Gentoo Archives: gentoo-commits

From: Justin Lecher <jlec@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-python/pandas/files/, dev-python/pandas/
Date: Sat, 03 Dec 2016 13:45:47
Message-Id: 1480772741.c8028ecb0e960b735506bf249ba143f96aad989f.jlec@gentoo
1 commit: c8028ecb0e960b735506bf249ba143f96aad989f
2 Author: Justin Lecher <jlec <AT> gentoo <DOT> org>
3 AuthorDate: Sat Dec 3 13:45:01 2016 +0000
4 Commit: Justin Lecher <jlec <AT> gentoo <DOT> org>
5 CommitDate: Sat Dec 3 13:45:41 2016 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=c8028ecb
7
8 dev-python/pandas: Version Bump
9
10 Gentoo-Bug: https://bugs.gentoo.org/show_bug.cgi?id=585184
11
12 Move to modern virtualx.eclass usage
13
14 Package-Manager: portage-2.3.2
15 Signed-off-by: Justin Lecher <jlec <AT> gentoo.org>
16
17 dev-python/pandas/Manifest | 1 +
18 dev-python/pandas/files/pandas-0.19.1-gapi.patch | 27 ++
19 dev-python/pandas/files/pandas-0.19.1-seqf.patch | 357 +++++++++++++++++++++++
20 dev-python/pandas/pandas-0.19.1.ebuild | 166 +++++++++++
21 dev-python/pandas/pandas-9999.ebuild | 130 +++++----
22 5 files changed, 631 insertions(+), 50 deletions(-)
23
24 diff --git a/dev-python/pandas/Manifest b/dev-python/pandas/Manifest
25 index bb4cfe6..c7d4b01 100644
26 --- a/dev-python/pandas/Manifest
27 +++ b/dev-python/pandas/Manifest
28 @@ -1,3 +1,4 @@
29 DIST pandas-0.16.2.tar.gz 4931751 SHA256 e01853dfe111f3aea005315573400b7216ddbabbf1f28d482a71217d67ae4f81 SHA512 44874e12a42a01dd7ed88f3f97e954732a534a5e2dc4815ef6203bdb2d88850a607e6631a35ae8fc79f4621a5dfaa34f39bb1c9a0ecfb17da1cf0c10f35ff27b WHIRLPOOL 6f2874ac07b49f4b2aaefdb87375b7c5adb31e3ff60c6b808f3e3467ad82999dd894de884ebbfd64fc7235e875d17ce871b516c96ff71a17310b708597168702
30 DIST pandas-0.17.0.tar.gz 6508621 SHA256 320d4fdf734b82adebc8fde9d8ca4b05fe155a72b6f7aa95d76242da8748d6a4 SHA512 bae6964e263c7ff6cac722cdfe23081f23c357d9bc39a670b5627bef4630c236a58aa8c0393eae921721bf7049c8e5266b4dea71dd957da5d89dafc14a04797b WHIRLPOOL d654eb2f9ffbfedbde60e4a6e6ce6f54650a8a68b4d20035744aa55111525d6bba4dae2ccbfce65acf71bb200e2e6029c7f6c9bcc9d0c582d808444738baedb1
31 DIST pandas-0.17.1.tar.gz 6674479 SHA256 cfd7214a7223703fe6999fbe34837749540efee1c985e6aee9933f30e3f72837 SHA512 9d9f9064585b1f3551625e0c8f4eedaaa1253790c2a5cb28e58e70eb805cc18f9770d793aa748cbd76798488ff60efdd01eb4b21daf5ad8f1dc4d9c050487234 WHIRLPOOL 5238575bd64b8d38db4f9a0ea987a7f78ffd1821e5a22bad65c84c407feca3af6f3b536a0a2f337291aa04e94c86fdb40382dad4ce50f8a33a5e26d655c628c2
32 +DIST pandas-0.19.1.tar.gz 8360233 SHA256 2509feaeda72fce03675e2eccd2284bb1cadb6a0737008a5e741fe2431d47421 SHA512 6451990a7fae8c6db8ab0b014a13b4f1828754d3998f13c17b111f891fb9fd23f8e09b907623096dfa55668c42298eee1373210a9fddb95f56dd7d552b964e6f WHIRLPOOL 700c0d819ab62134baf56430b7fa8840636ea377d00397341d33ec5f13474d9eeefea245aede80a80f7c16348ef811788947e5fe0020c9770005c74dd1288ef3
33
34 diff --git a/dev-python/pandas/files/pandas-0.19.1-gapi.patch b/dev-python/pandas/files/pandas-0.19.1-gapi.patch
35 new file mode 100644
36 index 00000000..7a0456f
37 --- /dev/null
38 +++ b/dev-python/pandas/files/pandas-0.19.1-gapi.patch
39 @@ -0,0 +1,27 @@
40 +From 1d6dbb41b26a39121ec8c4f19f5da78bb0ab4af7 Mon Sep 17 00:00:00 2001
41 +From: Jeff Reback <jeff@××××××.net>
42 +Date: Sat, 12 Nov 2016 12:44:06 -0500
43 +Subject: [PATCH] TST: skip test_gbq.test_upload_data_if_table_exists_replace
44 + for now
45 +
46 +---
47 + pandas/io/tests/test_gbq.py | 3 +++
48 + 1 file changed, 3 insertions(+)
49 +
50 +diff --git a/pandas/io/tests/test_gbq.py b/pandas/io/tests/test_gbq.py
51 +index cca1580b8..f6ff35a6d 100644
52 +--- a/pandas/io/tests/test_gbq.py
53 ++++ b/pandas/io/tests/test_gbq.py
54 +@@ -824,6 +824,9 @@ class TestToGBQIntegration(tm.TestCase):
55 + private_key=_get_private_key_path())
56 +
57 + def test_upload_data_if_table_exists_replace(self):
58 ++
59 ++ raise nose.SkipTest("buggy test")
60 ++
61 + destination_table = DESTINATION_TABLE + "4"
62 +
63 + test_size = 10
64 +--
65 +2.11.0
66 +
67
68 diff --git a/dev-python/pandas/files/pandas-0.19.1-seqf.patch b/dev-python/pandas/files/pandas-0.19.1-seqf.patch
69 new file mode 100644
70 index 00000000..c82c14f
71 --- /dev/null
72 +++ b/dev-python/pandas/files/pandas-0.19.1-seqf.patch
73 @@ -0,0 +1,357 @@
74 +From f8bd08e9c2fc6365980f41b846bbae4b40f08b83 Mon Sep 17 00:00:00 2001
75 +From: Jeff Reback <jeff@××××××.net>
76 +Date: Sat, 12 Nov 2016 10:58:54 -0500
77 +Subject: [PATCH] BUG: segfault manifesting with dateutil=2.6 w.r.t. replace
78 + when timezones are present
79 +
80 +closes #14621
81 +
82 +Author: Jeff Reback <jeff@××××××.net>
83 +
84 +Closes #14631 from jreback/replace and squashes the following commits:
85 +
86 +3f95042 [Jeff Reback] BUG: segfault manifesting with dateutil=2.6 w.r.t. replace when timezones are present
87 +---
88 + ci/requirements-3.5_OSX.pip | 2 +-
89 + doc/source/whatsnew/v0.19.2.txt | 3 ++
90 + pandas/tseries/offsets.py | 1 +
91 + pandas/tseries/tests/test_offsets.py | 20 ++++---
92 + pandas/tseries/tests/test_timezones.py | 89 +++++++++++++++++++++++++++++--
93 + pandas/tseries/tests/test_tslib.py | 5 +-
94 + pandas/tslib.pyx | 95 ++++++++++++++++++++++++++++------
95 + 7 files changed, 188 insertions(+), 27 deletions(-)
96 +
97 +diff --git a/pandas/tseries/offsets.py b/pandas/tseries/offsets.py
98 +index 051cc8aa4..2e3852a7e 100644
99 +--- a/pandas/tseries/offsets.py
100 ++++ b/pandas/tseries/offsets.py
101 +@@ -68,6 +68,7 @@ def apply_wraps(func):
102 + other = other.tz_localize(None)
103 +
104 + result = func(self, other)
105 ++
106 + if self._adjust_dst:
107 + result = tslib._localize_pydatetime(result, tz)
108 +
109 +diff --git a/pandas/tseries/tests/test_offsets.py b/pandas/tseries/tests/test_offsets.py
110 +index 1735ac4e2..768e9212e 100644
111 +--- a/pandas/tseries/tests/test_offsets.py
112 ++++ b/pandas/tseries/tests/test_offsets.py
113 +@@ -1,4 +1,5 @@
114 + import os
115 ++from distutils.version import LooseVersion
116 + from datetime import date, datetime, timedelta
117 + from dateutil.relativedelta import relativedelta
118 + from pandas.compat import range, iteritems
119 +@@ -4851,6 +4852,7 @@ class TestDST(tm.TestCase):
120 +
121 + def _test_offset(self, offset_name, offset_n, tstart, expected_utc_offset):
122 + offset = DateOffset(**{offset_name: offset_n})
123 ++
124 + t = tstart + offset
125 + if expected_utc_offset is not None:
126 + self.assertTrue(get_utc_offset_hours(t) == expected_utc_offset)
127 +@@ -4890,17 +4892,23 @@ class TestDST(tm.TestCase):
128 + return Timestamp(string + offset_string).tz_convert(tz)
129 +
130 + def test_fallback_plural(self):
131 +- """test moving from daylight savings to standard time"""
132 ++ # test moving from daylight savings to standard time
133 ++ import dateutil
134 + for tz, utc_offsets in self.timezone_utc_offsets.items():
135 + hrs_pre = utc_offsets['utc_offset_daylight']
136 + hrs_post = utc_offsets['utc_offset_standard']
137 +- self._test_all_offsets(
138 +- n=3, tstart=self._make_timestamp(self.ts_pre_fallback,
139 +- hrs_pre, tz),
140 +- expected_utc_offset=hrs_post)
141 ++
142 ++ if dateutil.__version__ != LooseVersion('2.6.0'):
143 ++ # buggy ambiguous behavior in 2.6.0
144 ++ # GH 14621
145 ++ # https://github.com/dateutil/dateutil/issues/321
146 ++ self._test_all_offsets(
147 ++ n=3, tstart=self._make_timestamp(self.ts_pre_fallback,
148 ++ hrs_pre, tz),
149 ++ expected_utc_offset=hrs_post)
150 +
151 + def test_springforward_plural(self):
152 +- """test moving from standard to daylight savings"""
153 ++ # test moving from standard to daylight savings
154 + for tz, utc_offsets in self.timezone_utc_offsets.items():
155 + hrs_pre = utc_offsets['utc_offset_standard']
156 + hrs_post = utc_offsets['utc_offset_daylight']
157 +diff --git a/pandas/tseries/tests/test_timezones.py b/pandas/tseries/tests/test_timezones.py
158 +index 00e8ee631..db8cda5c7 100644
159 +--- a/pandas/tseries/tests/test_timezones.py
160 ++++ b/pandas/tseries/tests/test_timezones.py
161 +@@ -4,7 +4,7 @@ import nose
162 +
163 + import numpy as np
164 + import pytz
165 +-
166 ++from distutils.version import LooseVersion
167 + from pandas.types.dtypes import DatetimeTZDtype
168 + from pandas import (Index, Series, DataFrame, isnull, Timestamp)
169 +
170 +@@ -518,8 +518,12 @@ class TestTimeZoneSupportPytz(tm.TestCase):
171 +
172 + times = date_range("2013-10-26 23:00", "2013-10-27 01:00", freq="H",
173 + tz=tz, ambiguous='infer')
174 +- self.assertEqual(times[0], Timestamp('2013-10-26 23:00', tz=tz))
175 +- self.assertEqual(times[-1], Timestamp('2013-10-27 01:00', tz=tz))
176 ++ self.assertEqual(times[0], Timestamp('2013-10-26 23:00', tz=tz,
177 ++ freq="H"))
178 ++ if dateutil.__version__ != LooseVersion('2.6.0'):
179 ++ # GH 14621
180 ++ self.assertEqual(times[-1], Timestamp('2013-10-27 01:00', tz=tz,
181 ++ freq="H"))
182 +
183 + def test_ambiguous_nat(self):
184 + tz = self.tz('US/Eastern')
185 +@@ -1163,6 +1167,85 @@ class TestTimeZones(tm.TestCase):
186 + def setUp(self):
187 + tm._skip_if_no_pytz()
188 +
189 ++ def test_replace(self):
190 ++ # GH 14621
191 ++ # GH 7825
192 ++ # replacing datetime components with and w/o presence of a timezone
193 ++ dt = Timestamp('2016-01-01 09:00:00')
194 ++ result = dt.replace(hour=0)
195 ++ expected = Timestamp('2016-01-01 00:00:00')
196 ++ self.assertEqual(result, expected)
197 ++
198 ++ for tz in self.timezones:
199 ++ dt = Timestamp('2016-01-01 09:00:00', tz=tz)
200 ++ result = dt.replace(hour=0)
201 ++ expected = Timestamp('2016-01-01 00:00:00', tz=tz)
202 ++ self.assertEqual(result, expected)
203 ++
204 ++ # we preserve nanoseconds
205 ++ dt = Timestamp('2016-01-01 09:00:00.000000123', tz=tz)
206 ++ result = dt.replace(hour=0)
207 ++ expected = Timestamp('2016-01-01 00:00:00.000000123', tz=tz)
208 ++ self.assertEqual(result, expected)
209 ++
210 ++ # test all
211 ++ dt = Timestamp('2016-01-01 09:00:00.000000123', tz=tz)
212 ++ result = dt.replace(year=2015, month=2, day=2, hour=0, minute=5,
213 ++ second=5, microsecond=5, nanosecond=5)
214 ++ expected = Timestamp('2015-02-02 00:05:05.000005005', tz=tz)
215 ++ self.assertEqual(result, expected)
216 ++
217 ++ # error
218 ++ def f():
219 ++ dt.replace(foo=5)
220 ++ self.assertRaises(ValueError, f)
221 ++
222 ++ def f():
223 ++ dt.replace(hour=0.1)
224 ++ self.assertRaises(ValueError, f)
225 ++
226 ++ # assert conversion to naive is the same as replacing tzinfo with None
227 ++ dt = Timestamp('2013-11-03 01:59:59.999999-0400', tz='US/Eastern')
228 ++ self.assertEqual(dt.tz_localize(None), dt.replace(tzinfo=None))
229 ++
230 ++ def test_ambiguous_compat(self):
231 ++ # validate that pytz and dateutil are compat for dst
232 ++ # when the transition happens
233 ++ tm._skip_if_no_dateutil()
234 ++ tm._skip_if_no_pytz()
235 ++
236 ++ pytz_zone = 'Europe/London'
237 ++ dateutil_zone = 'dateutil/Europe/London'
238 ++ result_pytz = (Timestamp('2013-10-27 01:00:00')
239 ++ .tz_localize(pytz_zone, ambiguous=0))
240 ++ result_dateutil = (Timestamp('2013-10-27 01:00:00')
241 ++ .tz_localize(dateutil_zone, ambiguous=0))
242 ++ self.assertEqual(result_pytz.value, result_dateutil.value)
243 ++ self.assertEqual(result_pytz.value, 1382835600000000000)
244 ++
245 ++ # dateutil 2.6 buggy w.r.t. ambiguous=0
246 ++ if dateutil.__version__ != LooseVersion('2.6.0'):
247 ++ # GH 14621
248 ++ # https://github.com/dateutil/dateutil/issues/321
249 ++ self.assertEqual(result_pytz.to_pydatetime().tzname(),
250 ++ result_dateutil.to_pydatetime().tzname())
251 ++ self.assertEqual(str(result_pytz), str(result_dateutil))
252 ++
253 ++ # 1 hour difference
254 ++ result_pytz = (Timestamp('2013-10-27 01:00:00')
255 ++ .tz_localize(pytz_zone, ambiguous=1))
256 ++ result_dateutil = (Timestamp('2013-10-27 01:00:00')
257 ++ .tz_localize(dateutil_zone, ambiguous=1))
258 ++ self.assertEqual(result_pytz.value, result_dateutil.value)
259 ++ self.assertEqual(result_pytz.value, 1382832000000000000)
260 ++
261 ++ # dateutil < 2.6 is buggy w.r.t. ambiguous timezones
262 ++ if dateutil.__version__ > LooseVersion('2.5.3'):
263 ++ # GH 14621
264 ++ self.assertEqual(str(result_pytz), str(result_dateutil))
265 ++ self.assertEqual(result_pytz.to_pydatetime().tzname(),
266 ++ result_dateutil.to_pydatetime().tzname())
267 ++
268 + def test_index_equals_with_tz(self):
269 + left = date_range('1/1/2011', periods=100, freq='H', tz='utc')
270 + right = date_range('1/1/2011', periods=100, freq='H', tz='US/Eastern')
271 +diff --git a/pandas/tseries/tests/test_tslib.py b/pandas/tseries/tests/test_tslib.py
272 +index 21cfe84f1..b45f867be 100644
273 +--- a/pandas/tseries/tests/test_tslib.py
274 ++++ b/pandas/tseries/tests/test_tslib.py
275 +@@ -327,8 +327,9 @@ class TestTimestamp(tm.TestCase):
276 +
277 + # dateutil zone change (only matters for repr)
278 + import dateutil
279 +- if dateutil.__version__ >= LooseVersion(
280 +- '2.3') and dateutil.__version__ <= LooseVersion('2.4.0'):
281 ++ if (dateutil.__version__ >= LooseVersion('2.3') and
282 ++ (dateutil.__version__ <= LooseVersion('2.4.0') or
283 ++ dateutil.__version__ >= LooseVersion('2.6.0'))):
284 + timezones = ['UTC', 'Asia/Tokyo', 'US/Eastern',
285 + 'dateutil/US/Pacific']
286 + else:
287 +diff --git a/pandas/tslib.pyx b/pandas/tslib.pyx
288 +index d4eaaa0b5..685de214c 100644
289 +--- a/pandas/tslib.pyx
290 ++++ b/pandas/tslib.pyx
291 +@@ -98,6 +98,7 @@ except NameError: # py3
292 + cdef inline object create_timestamp_from_ts(
293 + int64_t value, pandas_datetimestruct dts,
294 + object tz, object freq):
295 ++ """ convenience routine to construct a Timestamp from its parts """
296 + cdef _Timestamp ts_base
297 + ts_base = _Timestamp.__new__(Timestamp, dts.year, dts.month,
298 + dts.day, dts.hour, dts.min,
299 +@@ -112,6 +113,7 @@ cdef inline object create_timestamp_from_ts(
300 + cdef inline object create_datetime_from_ts(
301 + int64_t value, pandas_datetimestruct dts,
302 + object tz, object freq):
303 ++ """ convenience routine to construct a datetime.datetime from its parts """
304 + return datetime(dts.year, dts.month, dts.day, dts.hour,
305 + dts.min, dts.sec, dts.us, tz)
306 +
307 +@@ -378,7 +380,6 @@ class Timestamp(_Timestamp):
308 + # Mixing pydatetime positional and keyword arguments is forbidden!
309 +
310 + cdef _TSObject ts
311 +- cdef _Timestamp ts_base
312 +
313 + if offset is not None:
314 + # deprecate offset kwd in 0.19.0, GH13593
315 +@@ -412,17 +413,7 @@ class Timestamp(_Timestamp):
316 + from pandas.tseries.frequencies import to_offset
317 + freq = to_offset(freq)
318 +
319 +- # make datetime happy
320 +- ts_base = _Timestamp.__new__(cls, ts.dts.year, ts.dts.month,
321 +- ts.dts.day, ts.dts.hour, ts.dts.min,
322 +- ts.dts.sec, ts.dts.us, ts.tzinfo)
323 +-
324 +- # fill out rest of data
325 +- ts_base.value = ts.value
326 +- ts_base.freq = freq
327 +- ts_base.nanosecond = ts.dts.ps / 1000
328 +-
329 +- return ts_base
330 ++ return create_timestamp_from_ts(ts.value, ts.dts, ts.tzinfo, freq)
331 +
332 + def _round(self, freq, rounder):
333 +
334 +@@ -660,8 +651,80 @@ class Timestamp(_Timestamp):
335 + astimezone = tz_convert
336 +
337 + def replace(self, **kwds):
338 +- return Timestamp(datetime.replace(self, **kwds),
339 +- freq=self.freq)
340 ++ """
341 ++ implements datetime.replace, handles nanoseconds
342 ++
343 ++ Parameters
344 ++ ----------
345 ++ kwargs: key-value dict
346 ++
347 ++ accepted keywords are:
348 ++ year, month, day, hour, minute, second, microsecond, nanosecond, tzinfo
349 ++
350 ++ values must be integer, or for tzinfo, a tz-convertible
351 ++
352 ++ Returns
353 ++ -------
354 ++ Timestamp with fields replaced
355 ++ """
356 ++
357 ++ cdef:
358 ++ pandas_datetimestruct dts
359 ++ int64_t value
360 ++ object tzinfo, result, k, v
361 ++ _TSObject ts
362 ++
363 ++ # set to naive if needed
364 ++ tzinfo = self.tzinfo
365 ++ value = self.value
366 ++ if tzinfo is not None:
367 ++ value = tz_convert_single(value, 'UTC', tzinfo)
368 ++
369 ++ # setup components
370 ++ pandas_datetime_to_datetimestruct(value, PANDAS_FR_ns, &dts)
371 ++ dts.ps = self.nanosecond * 1000
372 ++
373 ++ # replace
374 ++ def validate(k, v):
375 ++ """ validate integers """
376 ++ if not isinstance(v, int):
377 ++ raise ValueError("value must be an integer, received {v} for {k}".format(v=type(v), k=k))
378 ++ return v
379 ++
380 ++ for k, v in kwds.items():
381 ++ if k == 'year':
382 ++ dts.year = validate(k, v)
383 ++ elif k == 'month':
384 ++ dts.month = validate(k, v)
385 ++ elif k == 'day':
386 ++ dts.day = validate(k, v)
387 ++ elif k == 'hour':
388 ++ dts.hour = validate(k, v)
389 ++ elif k == 'minute':
390 ++ dts.min = validate(k, v)
391 ++ elif k == 'second':
392 ++ dts.sec = validate(k, v)
393 ++ elif k == 'microsecond':
394 ++ dts.us = validate(k, v)
395 ++ elif k == 'nanosecond':
396 ++ dts.ps = validate(k, v) * 1000
397 ++ elif k == 'tzinfo':
398 ++ tzinfo = v
399 ++ else:
400 ++ raise ValueError("invalid name {} passed".format(k))
401 ++
402 ++ # reconstruct & check bounds
403 ++ value = pandas_datetimestruct_to_datetime(PANDAS_FR_ns, &dts)
404 ++ if value != NPY_NAT:
405 ++ _check_dts_bounds(&dts)
406 ++
407 ++ # set tz if needed
408 ++ if tzinfo is not None:
409 ++ value = tz_convert_single(value, tzinfo, 'UTC')
410 ++
411 ++ result = create_timestamp_from_ts(value, dts, tzinfo, self.freq)
412 ++
413 ++ return result
414 +
415 + def isoformat(self, sep='T'):
416 + base = super(_Timestamp, self).isoformat(sep=sep)
417 +@@ -5041,7 +5104,9 @@ cpdef normalize_date(object dt):
418 + -------
419 + normalized : datetime.datetime or Timestamp
420 + """
421 +- if PyDateTime_Check(dt):
422 ++ if is_timestamp(dt):
423 ++ return dt.replace(hour=0, minute=0, second=0, microsecond=0, nanosecond=0)
424 ++ elif PyDateTime_Check(dt):
425 + return dt.replace(hour=0, minute=0, second=0, microsecond=0)
426 + elif PyDate_Check(dt):
427 + return datetime(dt.year, dt.month, dt.day)
428 +--
429 +2.11.0
430 +
431
432 diff --git a/dev-python/pandas/pandas-0.19.1.ebuild b/dev-python/pandas/pandas-0.19.1.ebuild
433 new file mode 100644
434 index 00000000..aea548f
435 --- /dev/null
436 +++ b/dev-python/pandas/pandas-0.19.1.ebuild
437 @@ -0,0 +1,166 @@
438 +# Copyright 1999-2016 Gentoo Foundation
439 +# Distributed under the terms of the GNU General Public License v2
440 +# $Id$
441 +
442 +EAPI=5
443 +
444 +PYTHON_COMPAT=( python2_7 python3_{4,5} )
445 +PYTHON_REQ_USE="threads(+)"
446 +
447 +VIRTUALX_REQUIRED="manual"
448 +
449 +inherit distutils-r1 eutils flag-o-matic virtualx
450 +
451 +DESCRIPTION="Powerful data structures for data analysis and statistics"
452 +HOMEPAGE="http://pandas.pydata.org/"
453 +SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
454 +
455 +SLOT="0"
456 +LICENSE="BSD"
457 +KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux"
458 +IUSE="doc -minimal full-support test X"
459 +
460 +MINIMAL_DEPEND="
461 + >dev-python/numpy-1.7[${PYTHON_USEDEP}]
462 + >=dev-python/python-dateutil-2.0[${PYTHON_USEDEP}]
463 + dev-python/pytz[${PYTHON_USEDEP}]
464 + !<dev-python/numexpr-2.1[${PYTHON_USEDEP}]
465 + !~dev-python/openpyxl-1.9.0[${PYTHON_USEDEP}]"
466 +RECOMMENDED_DEPEND="
467 + dev-python/bottleneck[${PYTHON_USEDEP}]
468 + >=dev-python/numexpr-2.1[${PYTHON_USEDEP}]"
469 +OPTIONAL_DEPEND="
470 + dev-python/beautifulsoup:4[${PYTHON_USEDEP}]
471 + dev-python/blosc[${PYTHON_USEDEP}]
472 + dev-python/boto[${PYTHON_USEDEP}]
473 + >=dev-python/google-api-python-client-1.2.0[$(python_gen_usedep python2_7 pypy)]
474 + || ( dev-python/html5lib[${PYTHON_USEDEP}] dev-python/lxml[${PYTHON_USEDEP}] )
475 + dev-python/httplib2[${PYTHON_USEDEP}]
476 + dev-python/jinja[${PYTHON_USEDEP}]
477 + dev-python/matplotlib[${PYTHON_USEDEP}]
478 + || ( >=dev-python/openpyxl-1.6.1[${PYTHON_USEDEP}] dev-python/xlsxwriter[${PYTHON_USEDEP}] )
479 + >=dev-python/pytables-3.2.1[${PYTHON_USEDEP}]
480 + dev-python/python-gflags[$(python_gen_usedep python2_7 pypy)]
481 + dev-python/rpy[${PYTHON_USEDEP}]
482 + dev-python/setuptools[${PYTHON_USEDEP}]
483 + dev-python/statsmodels[${PYTHON_USEDEP}]
484 + >=dev-python/sqlalchemy-0.8.1[${PYTHON_USEDEP}]
485 + dev-python/xlrd[${PYTHON_USEDEP}]
486 + dev-python/xlwt[${PYTHON_USEDEP}]
487 + sci-libs/scipy[${PYTHON_USEDEP}]
488 + X? (
489 + || (
490 + dev-python/PyQt4[${PYTHON_USEDEP}]
491 + dev-python/pyside[${PYTHON_USEDEP}]
492 + dev-python/pygtk[$(python_gen_usedep python2_7)]
493 + )
494 + || (
495 + x11-misc/xclip
496 + x11-misc/xsel
497 + )
498 + )
499 + "
500 +
501 +DEPEND="${MINIMAL_DEPEND}
502 + dev-python/setuptools[${PYTHON_USEDEP}]
503 + >=dev-python/cython-0.19.1[${PYTHON_USEDEP}]
504 + doc? (
505 + ${VIRTUALX_DEPEND}
506 + dev-python/beautifulsoup:4[${PYTHON_USEDEP}]
507 + dev-python/html5lib[${PYTHON_USEDEP}]
508 + dev-python/ipython[${PYTHON_USEDEP}]
509 + dev-python/lxml[${PYTHON_USEDEP}]
510 + dev-python/matplotlib[${PYTHON_USEDEP}]
511 + >=dev-python/openpyxl-1.6.1[${PYTHON_USEDEP}]
512 + >=dev-python/pytables-3.0.0[${PYTHON_USEDEP}]
513 + dev-python/pytz[${PYTHON_USEDEP}]
514 + dev-python/rpy[${PYTHON_USEDEP}]
515 + >=dev-python/sphinx-1.2.1[${PYTHON_USEDEP}]
516 + dev-python/xlrd[${PYTHON_USEDEP}]
517 + dev-python/xlwt[${PYTHON_USEDEP}]
518 + sci-libs/scipy[${PYTHON_USEDEP}]
519 + x11-misc/xclip
520 + )
521 + test? (
522 + ${VIRTUALX_DEPEND}
523 + ${RECOMMENDED_DEPEND}
524 + ${OPTIONAL_DEPEND}
525 + dev-python/beautifulsoup:4[${PYTHON_USEDEP}]
526 + dev-python/nose[${PYTHON_USEDEP}]
527 + dev-python/pymysql[${PYTHON_USEDEP}]
528 + dev-python/psycopg:2[${PYTHON_USEDEP}]
529 + x11-misc/xclip
530 + x11-misc/xsel
531 + )"
532 +# dev-python/statsmodels invokes a circular dep
533 +# hence rm from doc? ( ), again
534 +RDEPEND="
535 + ${MINIMAL_DEPEND}
536 + !minimal? ( ${RECOMMENDED_DEPEND} )
537 + full-support? ( ${OPTIONAL_DEPEND} )"
538 +
539 +PATCHES=(
540 + "${FILESDIR}"/${P}-gapi.patch
541 + "${FILESDIR}"/${P}-seqf.patch
542 +)
543 +
544 +python_prepare_all() {
545 + # Prevent un-needed download during build
546 + sed -e "/^ 'sphinx.ext.intersphinx',/d" -i doc/source/conf.py || die
547 +
548 + # https://github.com/pydata/pandas/issues/11299
549 + sed \
550 + -e 's:testOdArray:disable:g' \
551 + -i pandas/io/tests/json/test_ujson.py || die
552 +
553 + distutils-r1_python_prepare_all
554 +}
555 +
556 +python_compile_all() {
557 + # To build docs the need be located in $BUILD_DIR,
558 + # else PYTHONPATH points to unusable modules.
559 + if use doc; then
560 + cd "${BUILD_DIR}"/lib || die
561 + cp -ar "${S}"/doc . && cd doc || die
562 + LANG=C PYTHONPATH=. virtx ${EPYTHON} make.py html || die
563 + fi
564 +}
565 +
566 +python_test() {
567 + local test_pandas='not network and not disabled'
568 + [[ -n "${FAST_PANDAS}" ]] && test_pandas+=' and not slow'
569 + pushd "${BUILD_DIR}"/lib > /dev/null
570 + "${EPYTHON}" -c "import pandas; pandas.show_versions()" || die
571 + PYTHONPATH=. MPLCONFIGDIR=. \
572 + virtx nosetests --verbosity=3 -A "${test_pandas}" pandas
573 + popd > /dev/null
574 +}
575 +
576 +python_install_all() {
577 + if use doc; then
578 + dodoc -r "${BUILD_DIR}"/lib/doc/build/html
579 + einfo "An initial build of docs is absent of references to statsmodels"
580 + einfo "due to circular dependency. To have them included, emerge"
581 + einfo "statsmodels next and re-emerge pandas with USE doc"
582 + fi
583 +
584 + distutils-r1_python_install_all
585 +}
586 +
587 +pkg_postinst() {
588 + optfeature "accelerating certain types of NaN evaluations, using specialized cython routines to achieve large speedups." dev-python/bottleneck
589 + optfeature "accelerating certain numerical operations, using multiple cores as well as smart chunking and caching to achieve large speedups" >=dev-python/numexpr-2.1
590 + optfeature "needed for pandas.io.html.read_html" dev-python/beautifulsoup:4 dev-python/html5lib dev-python/lxml
591 + optfeature "for msgpack compression using ``blosc``" dev-python/blosc
592 + optfeature "necessary for Amazon S3 access" dev-python/boto
593 + optfeature "needed for pandas.io.gbq" dev-python/httplib2 dev-python/setuptools dev-python/python-gflags >=dev-python/google-api-python-client-1.2.0
594 + optfeature "Template engine for conditional HTML formatting" dev-python/jinja
595 + optfeature "Plotting support" dev-python/matplotlib
596 + optfeature "Needed for Excel I/O" >=dev-python/openpyxl-1.6.1 dev-python/xlsxwriter dev-python/xlrd dev-python/xlwt
597 + optfeature "necessary for HDF5-based storage" >=dev-python/pytables-3.2.1
598 + optfeature "R I/O support" dev-python/rpy
599 + optfeature "Needed for parts of :mod:`pandas.stats`" dev-python/statsmodels
600 + optfeature "SQL database support" >=dev-python/sqlalchemy-0.8.1
601 + optfeature "miscellaneous statistical functions" sci-libs/scipy
602 + optfeature "necessary to use ~pandas.io.clipboard.read_clipboard support" dev-python/PyQt4 dev-python/pyside dev-python/pygtk x11-misc/xclip x11-misc/xsel
603 +}
604
605 diff --git a/dev-python/pandas/pandas-9999.ebuild b/dev-python/pandas/pandas-9999.ebuild
606 index f62cf51..02a7a20 100644
607 --- a/dev-python/pandas/pandas-9999.ebuild
608 +++ b/dev-python/pandas/pandas-9999.ebuild
609 @@ -1,12 +1,14 @@
610 -# Copyright 1999-2015 Gentoo Foundation
611 +# Copyright 1999-2016 Gentoo Foundation
612 # Distributed under the terms of the GNU General Public License v2
613 # $Id$
614
615 EAPI=5
616
617 -PYTHON_COMPAT=( python2_7 python3_4 )
618 +PYTHON_COMPAT=( python2_7 python3_{4,5} )
619 PYTHON_REQ_USE="threads(+)"
620
621 +VIRTUALX_REQUIRED="manual"
622 +
623 inherit distutils-r1 eutils flag-o-matic git-r3 virtualx
624
625 DESCRIPTION="Powerful data structures for data analysis and statistics"
626 @@ -17,68 +19,86 @@ EGIT_REPO_URI="https://github.com/pydata/pandas.git"
627 SLOT="0"
628 LICENSE="BSD"
629 KEYWORDS=""
630 -IUSE="doc excel html test R"
631 +IUSE="doc -minimal full-support test X"
632
633 -EXTRA_DEPEND="
634 +MINIMAL_DEPEND="
635 + >dev-python/numpy-1.7[${PYTHON_USEDEP}]
636 + >=dev-python/python-dateutil-2.0[${PYTHON_USEDEP}]
637 + dev-python/pytz[${PYTHON_USEDEP}]
638 + !<dev-python/numexpr-2.1[${PYTHON_USEDEP}]
639 + !~dev-python/openpyxl-1.9.0[${PYTHON_USEDEP}]"
640 +RECOMMENDED_DEPEND="
641 + dev-python/bottleneck[${PYTHON_USEDEP}]
642 + >=dev-python/numexpr-2.1[${PYTHON_USEDEP}]"
643 +OPTIONAL_DEPEND="
644 + dev-python/beautifulsoup:4[${PYTHON_USEDEP}]
645 + dev-python/blosc[${PYTHON_USEDEP}]
646 + dev-python/boto[${PYTHON_USEDEP}]
647 >=dev-python/google-api-python-client-1.2.0[$(python_gen_usedep python2_7 pypy)]
648 - dev-python/openpyxl[${PYTHON_USEDEP}]
649 - dev-python/pymysql[${PYTHON_USEDEP}]
650 + || ( dev-python/html5lib[${PYTHON_USEDEP}] dev-python/lxml[${PYTHON_USEDEP}] )
651 + dev-python/httplib2[${PYTHON_USEDEP}]
652 + dev-python/jinja[${PYTHON_USEDEP}]
653 + dev-python/matplotlib[${PYTHON_USEDEP}]
654 + || ( >=dev-python/openpyxl-1.6.1[${PYTHON_USEDEP}] dev-python/xlsxwriter[${PYTHON_USEDEP}] )
655 + >=dev-python/pytables-3.2.1[${PYTHON_USEDEP}]
656 dev-python/python-gflags[$(python_gen_usedep python2_7 pypy)]
657 - dev-python/psycopg:2[${PYTHON_USEDEP}]
658 + dev-python/rpy[${PYTHON_USEDEP}]
659 + dev-python/setuptools[${PYTHON_USEDEP}]
660 dev-python/statsmodels[${PYTHON_USEDEP}]
661 - dev-python/sqlalchemy[${PYTHON_USEDEP}]
662 - dev-python/xlsxwriter[${PYTHON_USEDEP}]
663 + >=dev-python/sqlalchemy-0.8.1[${PYTHON_USEDEP}]
664 + dev-python/xlrd[${PYTHON_USEDEP}]
665 + dev-python/xlwt[${PYTHON_USEDEP}]
666 + sci-libs/scipy[${PYTHON_USEDEP}]
667 + X? (
668 + || (
669 + dev-python/PyQt4[${PYTHON_USEDEP}]
670 + dev-python/pyside[${PYTHON_USEDEP}]
671 + dev-python/pygtk[$(python_gen_usedep python2_7)]
672 + )
673 + || (
674 + x11-misc/xclip
675 + x11-misc/xsel
676 + )
677 + )
678 "
679 -CDEPEND="
680 - >dev-python/numpy-1.7[${PYTHON_USEDEP}]
681 - >=dev-python/python-dateutil-2.0[${PYTHON_USEDEP}]
682 - !~dev-python/openpyxl-1.9.0[${PYTHON_USEDEP}]"
683 -DEPEND="${CDEPEND}
684 +
685 +DEPEND="${MINIMAL_DEPEND}
686 + dev-python/setuptools[${PYTHON_USEDEP}]
687 + >=dev-python/cython-0.19.1[${PYTHON_USEDEP}]
688 doc? (
689 + ${VIRTUALX_DEPEND}
690 dev-python/beautifulsoup:4[${PYTHON_USEDEP}]
691 - dev-python/ipython[${PYTHON_USEDEP}]
692 dev-python/html5lib[${PYTHON_USEDEP}]
693 + dev-python/ipython[${PYTHON_USEDEP}]
694 dev-python/lxml[${PYTHON_USEDEP}]
695 dev-python/matplotlib[${PYTHON_USEDEP}]
696 >=dev-python/openpyxl-1.6.1[${PYTHON_USEDEP}]
697 - dev-python/openpyxl[${PYTHON_USEDEP}]
698 >=dev-python/pytables-3.0.0[${PYTHON_USEDEP}]
699 dev-python/pytz[${PYTHON_USEDEP}]
700 dev-python/rpy[${PYTHON_USEDEP}]
701 - sci-libs/scipy[${PYTHON_USEDEP}]
702 >=dev-python/sphinx-1.2.1[${PYTHON_USEDEP}]
703 - dev-python/xlrd[$(python_gen_usedep 'python2_7')]
704 - dev-python/xlwt[$(python_gen_usedep 'python2_7')]
705 + dev-python/xlrd[${PYTHON_USEDEP}]
706 + dev-python/xlwt[${PYTHON_USEDEP}]
707 + sci-libs/scipy[${PYTHON_USEDEP}]
708 x11-misc/xclip
709 - )
710 + )
711 test? (
712 - ${EXTRA_DEPEND}
713 + ${VIRTUALX_DEPEND}
714 + ${RECOMMENDED_DEPEND}
715 + ${OPTIONAL_DEPEND}
716 dev-python/beautifulsoup:4[${PYTHON_USEDEP}]
717 dev-python/nose[${PYTHON_USEDEP}]
718 + dev-python/pymysql[${PYTHON_USEDEP}]
719 + dev-python/psycopg:2[${PYTHON_USEDEP}]
720 x11-misc/xclip
721 x11-misc/xsel
722 - )"
723 + )"
724 # dev-python/statsmodels invokes a circular dep
725 # hence rm from doc? ( ), again
726 -RDEPEND="${CDEPEND}
727 - >=dev-python/numexpr-2.1[${PYTHON_USEDEP}]
728 - dev-python/bottleneck[${PYTHON_USEDEP}]
729 - dev-python/matplotlib[${PYTHON_USEDEP}]
730 - dev-python/pytables[${PYTHON_USEDEP}]
731 - dev-python/pytz[${PYTHON_USEDEP}]
732 - sci-libs/scipy[${PYTHON_USEDEP}]
733 - excel? (
734 - >=dev-python/openpyxl-1.6.1[${PYTHON_USEDEP}]
735 - dev-python/xlrd[$(python_gen_usedep 'python2_7')]
736 - dev-python/xlwt[$(python_gen_usedep 'python2_7')]
737 - )
738 - html? (
739 - dev-python/beautifulsoup:4[${PYTHON_USEDEP}]
740 - || (
741 - dev-python/lxml[${PYTHON_USEDEP}]
742 - dev-python/html5lib[${PYTHON_USEDEP}] )
743 - )
744 - R? ( dev-python/rpy[${PYTHON_USEDEP}] )"
745 +RDEPEND="
746 + ${MINIMAL_DEPEND}
747 + !minimal? ( ${RECOMMENDED_DEPEND} )
748 + full-support? ( ${OPTIONAL_DEPEND} )"
749
750 python_prepare_all() {
751 # Prevent un-needed download during build
752 @@ -93,7 +113,7 @@ python_compile_all() {
753 if use doc; then
754 cd "${BUILD_DIR}"/lib || die
755 cp -ar "${S}"/doc . && cd doc || die
756 - LANG=C PYTHONPATH=. "${EPYTHON}" make.py html || die
757 + LANG=C PYTHONPATH=. virtx ${EPYTHON} make.py html || die
758 fi
759 }
760
761 @@ -101,9 +121,9 @@ python_test() {
762 local test_pandas='not network and not disabled'
763 [[ -n "${FAST_PANDAS}" ]] && test_pandas+=' and not slow'
764 pushd "${BUILD_DIR}"/lib > /dev/null
765 - VIRTUALX_COMMAND="nosetests"
766 - PYTHONPATH=. MPLCONFIGDIR=. HOME=. \
767 - virtualmake --verbosity=3 -A "${test_pandas}" pandas
768 + "${EPYTHON}" -c "import pandas; pandas.show_versions()" || die
769 + PYTHONPATH=. MPLCONFIGDIR=. \
770 + virtx nosetests --verbosity=3 -A "${test_pandas}" pandas.io.tests.json.test_ujson.NumpyJSONTests
771 popd > /dev/null
772 }
773
774 @@ -119,9 +139,19 @@ python_install_all() {
775 }
776
777 pkg_postinst() {
778 - local x
779 - elog "Please install"
780 - for x in ${EXTRA_DEPEND}; do
781 - optfeature "additional functionality" "${x%%[*}"
782 - done
783 + optfeature "accelerating certain types of NaN evaluations, using specialized cython routines to achieve large speedups." dev-python/bottleneck
784 + optfeature "accelerating certain numerical operations, using multiple cores as well as smart chunking and caching to achieve large speedups" >=dev-python/numexpr-2.1
785 + optfeature "needed for pandas.io.html.read_html" dev-python/beautifulsoup:4 dev-python/html5lib dev-python/lxml
786 + optfeature "for msgpack compression using ``blosc``" dev-python/blosc
787 + optfeature "necessary for Amazon S3 access" dev-python/boto
788 + optfeature "needed for pandas.io.gbq" dev-python/httplib2 dev-python/setuptools dev-python/python-gflags >=dev-python/google-api-python-client-1.2.0
789 + optfeature "Template engine for conditional HTML formatting" dev-python/jinja
790 + optfeature "Plotting support" dev-python/matplotlib
791 + optfeature "Needed for Excel I/O" >=dev-python/openpyxl-1.6.1 dev-python/xlsxwriter dev-python/xlrd dev-python/xlwt
792 + optfeature "necessary for HDF5-based storage" >=dev-python/pytables-3.2.1
793 + optfeature "R I/O support" dev-python/rpy
794 + optfeature "Needed for parts of :mod:`pandas.stats`" dev-python/statsmodels
795 + optfeature "SQL database support" >=dev-python/sqlalchemy-0.8.1
796 + optfeature "miscellaneous statistical functions" sci-libs/scipy
797 + optfeature "necessary to use ~pandas.io.clipboard.read_clipboard support" dev-python/PyQt4 dev-python/pyside dev-python/pygtk x11-misc/xclip x11-misc/xsel
798 }