Skip to content

Commit b7531bd

Browse files
committed
TST: add tests for old version of numexpr
1 parent bf477dc commit b7531bd

File tree

4 files changed

+47
-8
lines changed

4 files changed

+47
-8
lines changed

pandas/computation/eval.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
"""Top level ``eval`` module.
44
"""
55

6-
import numbers
7-
import numpy as np
86

97
from pandas.core import common as com
10-
from pandas.compat import string_types
118
from pandas.computation.expr import Expr, _parsers, _ensure_scope
129
from pandas.computation.engines import _engines
10+
from distutils.version import LooseVersion
1311

1412

1513
def _check_engine(engine):
@@ -38,7 +36,13 @@ def _check_engine(engine):
3836
import numexpr
3937
except ImportError:
4038
raise ImportError("'numexpr' not found. Cannot use "
41-
"engine='numexpr' if 'numexpr' is not installed")
39+
"engine='numexpr' for query/eval "
40+
"if 'numexpr' is not installed")
41+
else:
42+
ne_version = numexpr.__version__
43+
if ne_version < LooseVersion('2.0'):
44+
raise ImportError("'numexpr' version is %s, "
45+
"must be >= 2.0" % ne_version)
4246

4347

4448
def _check_parser(parser):

pandas/computation/expressions.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88

99
import numpy as np
1010
from pandas.core.common import _values_from_object
11+
from distutils.version import LooseVersion
1112

1213
try:
1314
import numexpr as ne
14-
_NUMEXPR_INSTALLED = True
15+
_NUMEXPR_INSTALLED = ne.__version__ >= LooseVersion('2.0')
1516
except ImportError: # pragma: no cover
1617
_NUMEXPR_INSTALLED = False
1718

pandas/computation/tests/test_eval.py

+30-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import functools
44
from itertools import product
5+
from distutils.version import LooseVersion
56

67
import nose
78
from nose.tools import assert_raises, assert_true, assert_false, assert_equal
@@ -20,10 +21,11 @@
2021
from pandas.computation.expressions import _USE_NUMEXPR
2122
from pandas.computation.engines import _engines
2223
from pandas.computation.expr import PythonExprVisitor, PandasExprVisitor
23-
from pandas.computation.ops import (_binary_ops_dict, _unary_ops_dict,
24+
from pandas.computation.ops import (_binary_ops_dict,
2425
_special_case_arith_ops_syms,
2526
_arith_ops_syms, _bool_ops_syms)
2627
from pandas.computation.common import NameResolutionError
28+
2729
import pandas.computation.expr as expr
2830
import pandas.util.testing as tm
2931
from pandas.util.testing import (assert_frame_equal, randbool,
@@ -1553,6 +1555,33 @@ def test_name_error_exprs():
15531555
yield check_name_error_exprs, engine, parser
15541556

15551557

1558+
def check_invalid_numexpr_version(engine, parser):
1559+
def testit():
1560+
a, b = 1, 2
1561+
res = pd.eval('a + b', engine=engine, parser=parser)
1562+
tm.assert_equal(res, 3)
1563+
1564+
if engine == 'numexpr':
1565+
try:
1566+
import numexpr as ne
1567+
except ImportError:
1568+
raise nose.SkipTest("no numexpr")
1569+
else:
1570+
if ne.__version__ < LooseVersion('2.0'):
1571+
with tm.assertRaisesRegexp(ImportError, "'numexpr' version is "
1572+
".+, must be >= 2.0"):
1573+
testit()
1574+
else:
1575+
testit()
1576+
else:
1577+
testit()
1578+
1579+
1580+
def test_invalid_numexpr_version():
1581+
for engine, parser in ENGINES_PARSERS:
1582+
yield check_invalid_numexpr_version, engine, parser
1583+
1584+
15561585
if __name__ == '__main__':
15571586
nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
15581587
exit=False)

pandas/tests/test_frame.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import functools
1212
import itertools
1313
from itertools import product
14+
from distutils.version import LooseVersion
1415

1516
from pandas.compat import(
1617
map, zip, range, long, lrange, lmap, lzip,
@@ -12019,8 +12020,12 @@ def skip_if_no_ne(engine='numexpr'):
1201912020
try:
1202012021
import numexpr as ne
1202112022
except ImportError:
12022-
raise nose.SkipTest("cannot query engine numexpr when numexpr not "
12023-
"installed")
12023+
raise nose.SkipTest("cannot query with engine numexpr when "
12024+
"numexpr not installed")
12025+
else:
12026+
if ne.__version__ < LooseVersion('2.0'):
12027+
raise nose.SkipTest("numexpr version too low: "
12028+
"%s" % ne.__version__)
1202412029

1202512030

1202612031
def skip_if_no_pandas_parser(parser):

0 commit comments

Comments
 (0)