Hello community,
here is the log from the commit of package python-asteval for
openSUSE:Leap:15.2 checked in at 2020-06-02 22:26:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-asteval (Old)
and /work/SRC/openSUSE:Leap:15.2/.python-asteval.new.3606 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-asteval"
Tue Jun 2 22:26:23 2020 rev:5 rq:810749 version:0.9.17
Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-asteval/python-asteval.changes
2020-03-09 18:02:35.336734813 +0100
+++
/work/SRC/openSUSE:Leap:15.2/.python-asteval.new.3606/python-asteval.changes
2020-06-02 22:26:24.339050655 +0200
@@ -2,7 +1,0 @@
-Fri Jan 17 12:49:59 UTC 2020 - Marketa Calabkova <[email protected]>
-
-- update to 0.9.18
- * drop python2
- * few fixes
-
--------------------------------------------------------------------
Old:
----
asteval-0.9.18.tar.gz
New:
----
asteval-0.9.17.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-asteval.spec ++++++
--- /var/tmp/diff_new_pack.ixE5Qm/_old 2020-06-02 22:26:24.627051556 +0200
+++ /var/tmp/diff_new_pack.ixE5Qm/_new 2020-06-02 22:26:24.627051556 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-asteval
#
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -16,15 +16,14 @@
#
-%define skip_python2 1
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-asteval
-Version: 0.9.18
+Version: 0.9.17
Release: 0
Summary: Safe, minimalistic evaluator of python expression using ast
module
License: MIT
Group: Development/Languages/Python
-URL: https://github.com/newville/asteval
+URL: http://github.com/newville/asteval
Source:
https://files.pythonhosted.org/packages/source/a/asteval/asteval-%{version}.tar.gz
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
@@ -62,7 +61,7 @@
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
-%pytest
+%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib}
py.test-%{$python_bin_suffix} -v
%files %{python_files}
%doc README.rst
++++++ asteval-0.9.18.tar.gz -> asteval-0.9.17.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/.gitattributes
new/asteval-0.9.17/.gitattributes
--- old/asteval-0.9.18/.gitattributes 1970-01-01 01:00:00.000000000 +0100
+++ new/asteval-0.9.17/.gitattributes 2019-11-14 21:19:47.000000000 +0100
@@ -0,0 +1 @@
+asteval/_version.py export-subst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/.gitignore
new/asteval-0.9.17/.gitignore
--- old/asteval-0.9.18/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ new/asteval-0.9.17/.gitignore 2019-11-14 21:19:47.000000000 +0100
@@ -0,0 +1,12 @@
+*.pyc
+*~
+*#
+.coverage
+NonGit/
+doc/_build
+doc/*.pdf
+build
+dist
+*.egg-info
+
+MANIFEST
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/.travis.yml
new/asteval-0.9.17/.travis.yml
--- old/asteval-0.9.18/.travis.yml 1970-01-01 01:00:00.000000000 +0100
+++ new/asteval-0.9.17/.travis.yml 2019-11-14 21:29:09.000000000 +0100
@@ -0,0 +1,39 @@
+# Config file for automatic testing at travis-ci.org
+
+language: python
+sudo: false
+
+python:
+ - 2.7
+ - 3.5
+ - 3.6
+ - 3.7
+ - 3.8
+
+env:
+ - version=without_numpy
+ - version=with_numpy
+
+before_install:
+ - wget
https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O
miniconda.sh
+ - bash miniconda.sh -b -p $HOME/miniconda
+ - export PATH="$HOME/miniconda/bin:$PATH"
+ - hash -r
+ - conda config --set always_yes yes --set changeps1 no
+ - conda update -q conda
+ - conda info -a
+
+install:
+ - conda create -q -n test_env python=$TRAVIS_PYTHON_VERSION pytest coverage
+ - source activate test_env
+ - if [[ $version == with_numpy ]]; then conda install numpy ; fi
+ - python setup.py install
+ - pip install codecov
+
+script:
+ - cd tests
+ - pytest
+ - if [[ $version == with_numpy ]]; then coverage run --source=asteval
test_asteval.py && coverage report -m ; fi
+
+after_success:
+ - if [[ $version == with_numpy ]]; then codecov ; fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/INSTALL new/asteval-0.9.17/INSTALL
--- old/asteval-0.9.18/INSTALL 2019-12-17 18:36:32.000000000 +0100
+++ new/asteval-0.9.17/INSTALL 2019-11-14 21:19:47.000000000 +0100
@@ -7,10 +7,10 @@
or
pip install asteval
-Asteval require Python 3.5 or higher.
+Asteval require Python 2.7 or Python 3.4 or higher.
If installed, many functions and constants from numpy
will be used by default.
Matt Newville <[email protected]>
-Last Update: 14-Nov-2019
+Last Update: 28-Oct-2017
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/PKG-INFO new/asteval-0.9.17/PKG-INFO
--- old/asteval-0.9.18/PKG-INFO 2019-12-17 18:36:53.000000000 +0100
+++ new/asteval-0.9.17/PKG-INFO 2019-11-14 22:13:24.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: asteval
-Version: 0.9.18
+Version: 0.9.17
Summary: Safe, minimalistic evaluator of python expression using ast module
Home-page: http://github.com/newville/asteval
Author: Matthew Newville
@@ -22,4 +22,4 @@
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
-Requires-Python: >=3.5
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/asteval/__init__.py
new/asteval-0.9.17/asteval/__init__.py
--- old/asteval-0.9.18/asteval/__init__.py 2019-12-17 18:36:32.000000000
+0100
+++ new/asteval-0.9.17/asteval/__init__.py 2019-11-14 21:19:47.000000000
+0100
@@ -18,8 +18,8 @@
"""
from .asteval import Interpreter
-from .astutils import (NameFinder, valid_symbol_name, make_symbol_table,
- get_ast_names)
+from .astutils import (NameFinder, valid_symbol_name,
+ make_symbol_table, get_ast_names, check_pyversion)
from ._version import get_versions
__all__ = ['Interpreter', 'NameFinder', 'valid_symbol_name',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/asteval/_version.py
new/asteval-0.9.17/asteval/_version.py
--- old/asteval-0.9.18/asteval/_version.py 2019-12-17 18:36:53.000000000
+0100
+++ new/asteval-0.9.17/asteval/_version.py 2019-11-14 22:13:24.000000000
+0100
@@ -8,11 +8,11 @@
version_json = '''
{
- "date": "2019-12-17T11:34:21-0600",
+ "date": "2019-11-14T14:59:30-0600",
"dirty": false,
"error": null,
- "full-revisionid": "2f796e3560c0e51df52ce8ca8062f2c379452107",
- "version": "0.9.18"
+ "full-revisionid": "e298284ed4778307c6e8145647eddf9bb17f752e",
+ "version": "0.9.17"
}
''' # END VERSION_JSON
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/asteval/asteval.py
new/asteval-0.9.17/asteval/asteval.py
--- old/asteval-0.9.18/asteval/asteval.py 2019-12-17 18:36:32.000000000
+0100
+++ new/asteval-0.9.17/asteval/asteval.py 2019-11-14 21:27:44.000000000
+0100
@@ -36,6 +36,9 @@
functions that are considered unsafe are missing ('eval', 'exec', and
'getattr' for example)
"""
+
+from __future__ import division, print_function
+
import ast
import time
import inspect
@@ -43,10 +46,7 @@
from .astutils import (UNSAFE_ATTRS, HAS_NUMPY, make_symbol_table, numpy,
op2func, ExceptionHolder, ReturnedNone,
- valid_symbol_name)
-
-if version_info[0] < 3 or version_info[1] < 5:
- raise SystemError("Python 3.5 or higher required")
+ valid_symbol_name, check_pyversion)
builtins = __builtins__
if not isinstance(builtins, dict):
@@ -57,9 +57,12 @@
'dict', 'ellipsis', 'excepthandler', 'expr', 'extslice',
'for', 'functiondef', 'if', 'ifexp', 'index', 'interrupt',
'list', 'listcomp', 'module', 'name', 'nameconstant', 'num',
- 'pass', 'raise', 'repr', 'return', 'slice', 'str',
+ 'pass', 'print', 'raise', 'repr', 'return', 'slice', 'str',
'subscript', 'try', 'tuple', 'unaryop', 'while', 'constant']
+
+PY3 = check_pyversion()
+
class Interpreter(object):
"""create an asteval Interpreter: a restricted, simplified interpreter
of mathematical expressions using Python syntax.
@@ -129,6 +132,11 @@
usersyms = {}
symtable = make_symbol_table(use_numpy=use_numpy, **usersyms)
+ if no_print:
+ symtable['print'] = self._nullprinter
+ else:
+ symtable['print'] = self._printer
+
self.symtable = symtable
self._interrupt = None
self.error = []
@@ -139,9 +147,6 @@
self.start_time = time.time()
self.use_numpy = HAS_NUMPY and use_numpy
- symtable['print'] = self._printer
- self.no_print = no_print or minimal
-
nodes = ALL_NODES[:]
if minimal or no_if:
@@ -162,6 +167,8 @@
nodes.remove('delete')
if minimal or no_raise:
nodes.remove('raise')
+ if minimal or no_print:
+ nodes.remove('print')
if minimal or no_listcomp:
nodes.remove('listcomp')
if minimal or no_augassign:
@@ -609,10 +616,26 @@
out = out and r
return out
+
+ def on_print(self, node): # ('dest', 'values', 'nl')
+ """Note: implements Python2 style print statement, not print()
+ function.
+ May need improvement....
+ """
+ dest = self.run(node.dest) or self.writer
+ end = ''
+ if node.nl:
+ end = '\n'
+ out = [self.run(tnode) for tnode in node.values]
+ if out and len(self.error) == 0:
+ self._printer(*out, file=dest, end=end)
+
+ def _nullprinter(self, *out, **kws):
+ """swallow print calls"""
+ pass
+
def _printer(self, *out, **kws):
"""Generic print function."""
- if self.no_print:
- return
flush = kws.pop('flush', True)
fileh = kws.pop('file', self.writer)
sep = kws.pop('sep', ' ')
@@ -716,8 +739,12 @@
def on_raise(self, node): # ('type', 'inst', 'tback')
"""Raise statement: note difference for python 2 and 3."""
- excnode = node.exc
- msgnode = node.cause
+ if PY3:
+ excnode = node.exc
+ msgnode = node.cause
+ else:
+ excnode = node.type
+ msgnode = node.inst
out = self.run(excnode)
msg = ' '.join(out.args)
msg2 = self.run(msgnode)
@@ -739,7 +766,7 @@
args = args + self.run(starargs)
keywords = {}
- if func == print:
+ if PY3 and func == print:
keywords['file'] = self.writer
for key in node.keywords:
@@ -755,10 +782,9 @@
try:
return func(*args, **keywords)
except Exception as ex:
- func_name = getattr(func, '__name__', str(func))
self.raise_exception(
node, msg="Error running function call '%s' with args %s and "
- "kwargs %s: %s" % (func_name, args, keywords, ex))
+ "kwargs %s: %s" % (func.__name__, args, keywords, ex))
def on_arg(self, node): # ('test', 'msg')
"""Arg for function definitions."""
@@ -781,7 +807,10 @@
keyval = self.run(node.args.args[idef+offset])
kwargs.append((keyval, defval))
- args = [tnode.arg for tnode in node.args.args[:offset]]
+ if PY3:
+ args = [tnode.arg for tnode in node.args.args[:offset]]
+ else:
+ args = [tnode.id for tnode in node.args.args[:offset]]
doc = None
nb0 = node.body[0]
if isinstance(nb0, ast.Expr) and isinstance(nb0.value, ast.Str):
@@ -789,9 +818,9 @@
varkws = node.args.kwarg
vararg = node.args.vararg
- if isinstance(vararg, ast.arg):
+ if PY3 and isinstance(vararg, ast.arg):
vararg = vararg.arg
- if isinstance(varkws, ast.arg):
+ if PY3 and isinstance(varkws, ast.arg):
varkws = varkws.arg
self.symtable[node.name] = Procedure(node.name, self, doc=doc,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/asteval/astutils.py
new/asteval-0.9.17/asteval/astutils.py
--- old/asteval-0.9.18/asteval/astutils.py 2019-12-17 18:36:32.000000000
+0100
+++ new/asteval-0.9.17/asteval/astutils.py 2019-11-14 21:19:47.000000000
+0100
@@ -4,15 +4,30 @@
Matthew Newville <[email protected]>,
The University of Chicago
"""
+from __future__ import division, print_function
import io
import re
import ast
import math
import numbers
-from sys import exc_info
-from tokenize import (tokenize as generate_tokens,
- ENCODING as tk_ENCODING,
- NAME as tk_NAME)
+from sys import exc_info, version_info
+from tokenize import NAME as tk_NAME
+
+def check_pyversion():
+ version_major, version_minor = version_info[0], version_info[1]
+ if version_major == 3 and version_minor < 5:
+ raise SystemError("Python 3.0 to 3.4 are not supported")
+ if version_major == 2 and version_minor < 7:
+ raise SystemError("Python 2.6 or earlier are not supported")
+ return version_major == 3
+
+
+if version_info > (3, 4):
+ from tokenize import tokenize as generate_tokens, ENCODING as tk_ENCODING
+else:
+ from tokenize import generate_tokens
+ tk_ENCODING = None
+
HAS_NUMPY = False
numpy = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/asteval.egg-info/PKG-INFO
new/asteval-0.9.17/asteval.egg-info/PKG-INFO
--- old/asteval-0.9.18/asteval.egg-info/PKG-INFO 2019-12-17
18:36:52.000000000 +0100
+++ new/asteval-0.9.17/asteval.egg-info/PKG-INFO 2019-11-14
22:13:24.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: asteval
-Version: 0.9.18
+Version: 0.9.17
Summary: Safe, minimalistic evaluator of python expression using ast module
Home-page: http://github.com/newville/asteval
Author: Matthew Newville
@@ -22,4 +22,4 @@
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
-Requires-Python: >=3.5
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/asteval.egg-info/SOURCES.txt
new/asteval-0.9.17/asteval.egg-info/SOURCES.txt
--- old/asteval-0.9.18/asteval.egg-info/SOURCES.txt 2019-12-17
18:36:52.000000000 +0100
+++ new/asteval-0.9.17/asteval.egg-info/SOURCES.txt 2019-11-14
22:13:24.000000000 +0100
@@ -1,7 +1,11 @@
+.gitattributes
+.gitignore
+.travis.yml
INSTALL
LICENSE
MANIFEST.in
README.rst
+requirements.txt
setup.cfg
setup.py
versioneer.py
@@ -22,4 +26,6 @@
doc/motivation.rst
doc/_static/empty
doc/_templates/indexsidebar.html
+tests/A.py
+tests/m.py
tests/test_asteval.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/doc/basics.rst
new/asteval-0.9.17/doc/basics.rst
--- old/asteval-0.9.18/doc/basics.rst 2019-12-17 18:36:32.000000000 +0100
+++ new/asteval-0.9.17/doc/basics.rst 2019-11-14 21:19:47.000000000 +0100
@@ -20,10 +20,10 @@
that is very much like python::
>>> aeval('x = sqrt(3)')
- >>> aeval('print(x)')
+ >>> aeval('print x')
1.73205080757
>>> aeval('''for i in range(10):
- print(i, sqrt(i), log(1+1))
+ print i, sqrt(i), log(1+1)
''')
0 0.0 0.0
1 1.0 0.69314718056
@@ -50,7 +50,7 @@
>>> aeval.symtable['x']
1.73205080757
>>> aeval.symtable['y'] = 100
- >>> aeval('print(y/8)')
+ >>> aeval('print y/8')
12.5
Note here the use of true division even though the operands are integers.
@@ -133,10 +133,13 @@
printing
===============
-For printing, asteval emulates Python's native :func:`print` function. You
-can change where output is sent with the ``writer`` argument when creating
-the interpreter, or supreess printing all together with the ``no_print``
-option. By default, outputs are sent to :py:data:`sys.stdout`.
+For printing, asteval emulates Python's native :func:`print` function (for
+Python 3) and :data:`print` statement (for Python 2). That is, the
+behavior mimics the version of Python used.
+
+You can change where output is sent with the ``writer`` argument when
+creating the interpreter. By default, outputs are sent to
+:py:data:`sys.stdout`.
writing functions
@@ -159,9 +162,9 @@
===============
Asteval monitors and caches exceptions in the evaluated code. Brief error
-messages are printed (with Python's print function, and so using standard
-output by default), and the full set of exceptions is kept in the
-:attr:`error` attribute of the :class:`Interpreter` instance. This
+messages are printed (with Python's print statement or function, and so
+using standard output by default), and the full set of exceptions is kept
+in the :attr:`error` attribute of the :class:`Interpreter` instance. This
:attr:`error` attribute is a list of instances of the asteval
:class:`ExceptionHolder` class, which is accessed through the
:meth:`get_error` method. The :attr:`error` attribute is reset to an empty
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/doc/installation.rst
new/asteval-0.9.17/doc/installation.rst
--- old/asteval-0.9.18/doc/installation.rst 2019-12-17 18:36:32.000000000
+0100
+++ new/asteval-0.9.17/doc/installation.rst 2019-11-14 21:34:24.000000000
+0100
@@ -12,9 +12,8 @@
Asteval is a pure python module with no required dependencies outside of the
standard library. Asteval will make use of the `numpy`_ module if available.
-Version 0.9.18 supports and is tested with Python 3.5 through 3.8.
-
-Version 0.9.17 was the last version to support Python 2.7.
+Version 0.9.17 supports and is tested with Python 2.7, Python 3.5 through 3.8.
+This is the final version to support Python 2.7.
Download and Installation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/requirements.txt
new/asteval-0.9.17/requirements.txt
--- old/asteval-0.9.18/requirements.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/asteval-0.9.17/requirements.txt 2019-11-14 21:19:47.000000000 +0100
@@ -0,0 +1,5 @@
+##
+## pip requirements file. To install dependencies, use
+##
+## pip install -r requirements.txt
+## numpy>=1.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/setup.py new/asteval-0.9.17/setup.py
--- old/asteval-0.9.18/setup.py 2019-12-17 18:36:32.000000000 +0100
+++ new/asteval-0.9.17/setup.py 2019-11-14 21:19:47.000000000 +0100
@@ -22,7 +22,7 @@
author_email='[email protected]',
url='http://github.com/newville/asteval',
license = 'OSI Approved :: MIT License',
- python_requires='>=3.5',
+ python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
description="Safe, minimalistic evaluator of python expression using ast
module",
long_description=long_description,
packages=['asteval'],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/tests/A.py
new/asteval-0.9.17/tests/A.py
--- old/asteval-0.9.18/tests/A.py 1970-01-01 01:00:00.000000000 +0100
+++ new/asteval-0.9.17/tests/A.py 2018-09-21 02:52:44.000000000 +0200
@@ -0,0 +1,18 @@
+import sys
+from asteval import Interpreter
+aeval = Interpreter()
+
+script = """
+def tmp(x):
+ return tmp(x+1)
+##
+"""
+
+aeval(script)
+
+for rec_limit in (50, 100, 200, 500, 1000, 2000, 5000, 10000):
+ sys.setrecursionlimit(rec_limit)
+ aeval('tmp(33)')
+ msg = aeval.error_msg
+ if msg is not None:
+ print("rec limit=%d, length of error messge=%d" % (rec_limit,
len(msg)))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/tests/m.py
new/asteval-0.9.17/tests/m.py
--- old/asteval-0.9.18/tests/m.py 1970-01-01 01:00:00.000000000 +0100
+++ new/asteval-0.9.17/tests/m.py 2018-09-21 02:33:45.000000000 +0200
@@ -0,0 +1,8 @@
+from asteval import Interpreter
+
+aeval = Interpreter()
+
+text = """
+def foo():
+ return foo()
+"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/asteval-0.9.18/tests/test_asteval.py
new/asteval-0.9.17/tests/test_asteval.py
--- old/asteval-0.9.18/tests/test_asteval.py 2019-12-17 18:36:32.000000000
+0100
+++ new/asteval-0.9.17/tests/test_asteval.py 2019-11-14 21:19:47.000000000
+0100
@@ -3,20 +3,24 @@
Base TestCase for asteval
"""
import ast
-import math
import os
import textwrap
import time
import unittest
import pytest
-from io import StringIO
-from functools import partial
from sys import version_info
from tempfile import NamedTemporaryFile
-from asteval import NameFinder, Interpreter, make_symbol_table
+from asteval import NameFinder, Interpreter, make_symbol_table, check_pyversion
+
+PY3 = check_pyversion()
+
+if PY3:
+ from io import StringIO
+else:
+ from cStringIO import StringIO
HAS_NUMPY = False
@@ -436,9 +440,11 @@
"""names test"""
self.interp('nx = 1')
self.interp('nx1 = 1')
- # use \u escape b/c python 2 complains about file encoding
- self.interp('\u03bb = 1')
- self.interp('\u03bb1 = 1')
+
+ if PY3:
+ # use \u escape b/c python 2 complains about file encoding
+ self.interp('\u03bb = 1')
+ self.interp('\u03bb1 = 1')
def test_syntaxerrors_1(self):
"""assignment syntax errors test"""
@@ -620,7 +626,7 @@
for w in ('True', 'False'):
self.interp.error = []
self.interp("%s= 2" % w)
- self.check_error('SyntaxError')
+ self.check_error('SyntaxError' if PY3 else 'NameError')
for w in ('eval', '__import__'):
self.interp.error = []
@@ -860,13 +866,13 @@
self.interp('open("foo1", "wb")')
self.check_error('RuntimeError')
self.interp('open("foo2", "rb")')
- self.check_error('FileNotFoundError')
+ self.check_error('FileNotFoundError' if PY3 else 'IOError')
self.interp('open("foo3", "rb", 2<<18)')
self.check_error('RuntimeError')
def test_recursionlimit(self):
self.interp("""def foo(): return foo()\nfoo()""")
- self.check_error('RecursionError')
+ self.check_error('RecursionError' if PY3 else 'RuntimeError')
def test_kaboom(self):
""" test Ned Batchelder's 'Eval really is dangerous' - Kaboom test
(and related tests)"""
@@ -877,8 +883,10 @@
self.interp(
"""[print(c) for c in
().__class__.__bases__[0].__subclasses__()]""") # Try a portion of the
kaboom...
-
- self.check_error('AttributeError', '__class__') # Safe, unsafe
dunders are not supported
+ if PY3:
+ self.check_error('AttributeError', '__class__') # Safe, unsafe
dunders are not supported
+ else:
+ self.check_error('SyntaxError')
self.interp("9**9**9**9**9**9**9**9")
self.check_error('RuntimeError') # Safe, safe_pow() catches this
self.interp(
@@ -1024,23 +1032,6 @@
self.assertTrue(aeval("a_dict['a'] == 1"))
self.assertTrue(aeval("a_dict['c'] == 3"))
- def test_partial_exception(self):
- sym_table = make_symbol_table(sqrt=partial(math.sqrt))
-
- aeval = Interpreter(symtable=sym_table)
-
- assert aeval("sqrt(4)") == 2
-
- # Calling sqrt(-1) should raise a ValueError. When the interpreter
- # encounters an exception, it attempts to form an error string that
- # uses the function's __name__ attribute. Partials don't have a
- # __name__ attribute, so we want to make sure that an AttributeError is
- # not raised.
-
- result = aeval("sqrt(-1)")
- assert aeval.error.pop().exc == ValueError
-
-
class TestCase2(unittest.TestCase):
def test_stringio(self):
""" test using stringio for output/errors """