ARIA-405 Remove support for Python 2.6 * setup.py now requires Python 2.7 * Upgrade all 3rd party libraries to recent versions * API changes to networkx * Stricter yaml.load call for ruamel.yaml * Remove iter_modules implementation for Python 2.6 * Remove NullHander implementation for Python 2.6 * Remove "py26" tox test environments
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/b1f03efc Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/b1f03efc Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/b1f03efc Branch: refs/heads/ARIA-393-Enable-configuration-of-extension-loading-mechanism-strictness Commit: b1f03efcedd814f5fe38f051bfa0106cc715586f Parents: ae89ddb Author: Tal Liron <tal.li...@gmail.com> Authored: Mon Oct 30 16:56:57 2017 -0500 Committer: Tal Liron <tal.li...@gmail.com> Committed: Mon Oct 30 17:08:59 2017 -0500 ---------------------------------------------------------------------- .travis.yml | 23 ++------- Makefile | 8 ++-- README.rst | 7 +-- appveyor.yml | 2 +- aria/__init__.py | 9 +--- aria/cli/csar.py | 4 +- aria/cli/inputs.py | 4 +- aria/logger.py | 10 +--- aria/orchestrator/workflows/api/task_graph.py | 11 +++-- aria/utils/imports.py | 18 ------- .../simple_v1_0/modeling/__init__.py | 2 +- requirements.in | 42 ++++++++--------- requirements.txt | 28 +++++------ setup.py | 15 +++--- .../test_task_graph_into_execution_graph.py | 2 +- tests/requirements.txt | 11 ++--- tox.ini | 49 +++++--------------- 17 files changed, 80 insertions(+), 165 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/.travis.yml ---------------------------------------------------------------------- diff --git a/.travis.yml b/.travis.yml index 958be80..b264ab3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,19 +19,7 @@ sudo: true language: python -addons: - apt: - sources: - - sourceline: 'ppa:fkrull/deadsnakes' - packages: - # Ubuntu 14.04 (trusty) does not come with Python 2.6, so we will install it from Felix - # Krull's PPA - - python2.6 - - python2.6-dev - python: - # We handle Python 2.6 testing from within tox (see tox.ini); note that this means that we run - # tox itself always from Python 2.7 - '2.7' env: @@ -39,14 +27,11 @@ env: # for PyTest's xdist plugin. The reason this is necessary is that conventional Travis environments # may report a large amount of available CPUs, but they they are greatly restricted. Through trial # and error we found that more than 1 process may result in failures. - - PYTEST_PROCESSES=1 TOX_ENV=pylint_code + - PYTEST_PROCESSES=1 TOX_ENV=pylint_core - PYTEST_PROCESSES=1 TOX_ENV=pylint_tests - - PYTEST_PROCESSES=1 TOX_ENV=py27 - - PYTEST_PROCESSES=1 TOX_ENV=py26 - - PYTEST_PROCESSES=1 TOX_ENV=py27e2e - - PYTEST_PROCESSES=1 TOX_ENV=py26e2e - - PYTEST_PROCESSES=1 TOX_ENV=py27ssh - - PYTEST_PROCESSES=1 TOX_ENV=py26ssh + - PYTEST_PROCESSES=1 TOX_ENV=core + - PYTEST_PROCESSES=1 TOX_ENV=e2e + - PYTEST_PROCESSES=1 TOX_ENV=ssh - PYTEST_PROCESSES=1 TOX_ENV=docs before_install: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/Makefile ---------------------------------------------------------------------- diff --git a/Makefile b/Makefile index 9fef3ab..e68538e 100644 --- a/Makefile +++ b/Makefile @@ -51,11 +51,11 @@ docs: test: pip install --upgrade "tox>=2.7.0" - tox -e pylint_code \ + tox -e pylint_core \ -e pylint_tests \ - -e py$(PYTHON_VERSION) \ - -e py$(PYTHON_VERSION)e2e \ - -e py$(PYTHON_VERSION)ssh \ + -e core \ + -e e2e \ + -e ssh \ -e docs ./requirements.txt: ./requirements.in http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/README.rst ---------------------------------------------------------------------- diff --git a/README.rst b/README.rst index 1985f10..c905277 100644 --- a/README.rst +++ b/README.rst @@ -28,7 +28,7 @@ Installation ARIA is `available on PyPI <https://pypi.python.org/pypi/apache-ariatosca>`__. -ARIA requires Python 2.6/2.7. Python 3 is currently not supported. +ARIA requires Python 2.7. Python 3 is currently not supported. To install ARIA directly from PyPI (using a ``wheel``), use:: @@ -78,14 +78,12 @@ and run:: # TODO - To install ``pip``, either use your operating system's package management system, or run:: wget http://bootstrap.pypa.io/get-pip.py python get-pip.py - Getting Started --------------- @@ -168,9 +166,8 @@ ARIA is licensed under the .. |Closed Pull Requests| image:: https://img.shields.io/github/issues-pr-closed-raw/apache/incubator-ariatosca.svg :target: https://github.com/apache/incubator-ariatosca/pulls?q=is%3Apr+is%3Aclosed + Code of Conduct --------------- The ARIA TOSCA Project follows `The Apache Code of Conduct <https://www.apache.org/foundation/policies/conduct.html>`__. - - http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/appveyor.yml ---------------------------------------------------------------------- diff --git a/appveyor.yml b/appveyor.yml index 1158706..f7d70e6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,7 @@ # limitations under the License. environment: - TOX_ENV: pywin + TOX_ENV: windows matrix: - PYTHON: "C:\\Python27" http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/aria/__init__.py ---------------------------------------------------------------------- diff --git a/aria/__init__.py b/aria/__init__.py index 76a62ce..9fe8b3d 100644 --- a/aria/__init__.py +++ b/aria/__init__.py @@ -19,7 +19,9 @@ The ARIA root package provides entry points for extension and storage initializa import sys +from pkgutil import iter_modules import pkg_resources + aria_package_name = 'apache-ariatosca' __version__ = pkg_resources.get_distribution(aria_package_name).version @@ -34,13 +36,6 @@ from . import ( # pylint: disable=wrong-import-position cli ) -if sys.version_info < (2, 7): - # pkgutil in python2.6 has a bug where it fails to import from protected modules, which causes - # the entire process to fail. In order to overcome this issue we use our custom iter_modules - from .utils.imports import iter_modules -else: - from pkgutil import iter_modules - __all__ = ( '__version__', 'workflow', http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/aria/cli/csar.py ---------------------------------------------------------------------- diff --git a/aria/cli/csar.py b/aria/cli/csar.py index 40b1699..32a8eb1 100644 --- a/aria/cli/csar.py +++ b/aria/cli/csar.py @@ -127,7 +127,7 @@ class _CSARReader(object): @property def entry_definitions_yaml(self): with open(os.path.join(self.destination, self.entry_definitions)) as f: - return yaml.load(f) + return yaml.load(f, Loader=yaml.SafeLoader) def _extract(self): self.logger.debug('Extracting CSAR contents') @@ -144,7 +144,7 @@ class _CSARReader(object): self.logger.debug('CSAR metadata file: {0}'.format(csar_metafile)) self.logger.debug('Attempting to parse CSAR metadata YAML') with open(csar_metafile) as f: - self.metadata.update(yaml.load(f)) + self.metadata.update(yaml.load(f, Loader=yaml.SafeLoader)) self.logger.debug('CSAR metadata:{0}{1}'.format(os.linesep, pprint.pformat(self.metadata))) def _validate(self): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/aria/cli/inputs.py ---------------------------------------------------------------------- diff --git a/aria/cli/inputs.py b/aria/cli/inputs.py index bea3e1a..495dd5f 100644 --- a/aria/cli/inputs.py +++ b/aria/cli/inputs.py @@ -88,10 +88,10 @@ def _parse_yaml_path(resource): # if resource is a path - parse as a yaml file if os.path.isfile(resource): with open(resource) as f: - content = yaml.load(f.read()) + content = yaml.load(f.read(), Loader=yaml.SafeLoader) else: # parse resource content as yaml - content = yaml.load(resource) + content = yaml.load(resource, Loader=yaml.SafeLoader) except yaml.error.YAMLError as e: raise AriaCliError("'{0}' is not a valid YAML. {1}".format( resource, str(e))) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/aria/logger.py ---------------------------------------------------------------------- diff --git a/aria/logger.py b/aria/logger.py index f4f6ec9..d83b6ae 100644 --- a/aria/logger.py +++ b/aria/logger.py @@ -19,15 +19,7 @@ formatting. """ import logging -from logging import handlers as logging_handlers -# NullHandler doesn't exist in < 27. this workaround is from -# http://docs.python.org/release/2.6/library/logging.html#configuring-logging-for-a-library -try: - from logging import NullHandler # pylint: disable=unused-import -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass +from logging import (handlers as logging_handlers, NullHandler) from datetime import datetime http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/aria/orchestrator/workflows/api/task_graph.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/api/task_graph.py b/aria/orchestrator/workflows/api/task_graph.py index 900a0d1..eb3967b 100644 --- a/aria/orchestrator/workflows/api/task_graph.py +++ b/aria/orchestrator/workflows/api/task_graph.py @@ -69,7 +69,7 @@ class TaskGraph(object): """ Iterator over tasks in the graph. """ - for _, data in self._graph.nodes_iter(data=True): + for _, data in self._graph.nodes(data=True): yield data['task'] def topological_order(self, reverse=False): @@ -79,7 +79,10 @@ class TaskGraph(object): :param reverse: whether to reverse the sort :return: list which represents the topological sort """ - for task_id in topological_sort(self._graph, reverse=reverse): + task_ids = topological_sort(self._graph) + if reverse: + task_ids = reversed(tuple(task_ids)) + for task_id in task_ids: yield self.get_task(task_id) def get_dependencies(self, dependent_task): @@ -92,7 +95,7 @@ class TaskGraph(object): """ if not self.has_tasks(dependent_task): raise TaskNotInGraphError('Task id: {0}'.format(dependent_task.id)) - for _, dependency_id in self._graph.out_edges_iter(dependent_task.id): + for _, dependency_id in self._graph.out_edges(dependent_task.id): yield self.get_task(dependency_id) def get_dependents(self, dependency_task): @@ -105,7 +108,7 @@ class TaskGraph(object): """ if not self.has_tasks(dependency_task): raise TaskNotInGraphError('Task id: {0}'.format(dependency_task.id)) - for dependent_id, _ in self._graph.in_edges_iter(dependency_task.id): + for dependent_id, _ in self._graph.in_edges(dependency_task.id): yield self.get_task(dependent_id) # task methods http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/aria/utils/imports.py ---------------------------------------------------------------------- diff --git a/aria/utils/imports.py b/aria/utils/imports.py index 14ad09e..bb3e07f 100644 --- a/aria/utils/imports.py +++ b/aria/utils/imports.py @@ -17,7 +17,6 @@ Utilities for dynamically loading Python code. """ -import pkgutil import importlib @@ -77,20 +76,3 @@ def load_attribute(attribute_path): except AttributeError: # TODO: handle raise - - -def iter_modules(): - # apparently pkgutil had some issues in python 2.6. Accessing any root level directories - # failed. and it got the entire process of importing fail. Since we only need any - # aria_extension related loading, in the meantime we could try to import only those - # (and assume they are not located at the root level. - # [In python 2.7 it does actually ignore any OSError]. - yielded = {} - for importer in pkgutil.iter_importers(): - try: - for module_name, ispkg in pkgutil.iter_importer_modules(importer): - if module_name not in yielded: - yielded[module_name] = True - yield importer, module_name, ispkg - except OSError: - pass http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py index d960e05..0588a8f 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py @@ -397,7 +397,7 @@ def create_operation_template_model(context, service_template, operation): # Parse as YAML try: - value = yaml.load(value) + value = yaml.load(value, Loader=yaml.SafeLoader) except yaml.parser.MarkedYAMLError as e: context.validation.report( 'YAML parser {0} in operation configuration: {1}' http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/requirements.in ---------------------------------------------------------------------- diff --git a/requirements.in b/requirements.in index 1d83ec8..c5bfc78 100644 --- a/requirements.in +++ b/requirements.in @@ -13,27 +13,23 @@ # In order to create the requirements.txt file, execute # pip-compile --output-file requirements.txt requirements.in (pip-tools package is needed). -requests>=2.3.0, <2.14.0 -networkx>=1.9, <1.10 # version 1.10 dropped support of python 2.6 -retrying>=1.3.0, <1.4.0 -blinker>1.3, <1.5 -jsonpickle>0.9.0, <=0.9.4 -ruamel.yaml>=0.11.12, <0.12.0 # version 0.12.0 dropped support of python 2.6 -Jinja2>=2.8, <2.9 -shortuuid>=0.5, <0.6 +backports.shutil_get_terminal_size>=1, <2 +blinker>=1.4, <1.5 +bottle>=0.12, <0.13 CacheControl[filecache]>=0.11.0, <0.13 -SQLAlchemy>=1.1.0, <1.2 # version 1.2 dropped support of python 2.6 -wagon==0.6.0 -bottle>=0.12.0, <0.13 -setuptools>=35.0.0, <36.0.0 -click>=6.0, < 7.0 -colorama>=0.3.7, <=0.3.9 -PrettyTable>=0.7,<0.8 -click_didyoumean==0.0.3 -backports.shutil_get_terminal_size==1.0.0 -logutils==0.3.4.1 -psutil>=5.2.2, < 6.0.0 -importlib ; python_version < '2.7' -ordereddict ; python_version < '2.7' -total-ordering ; python_version < '2.7' # only one version on pypi -wheel<=0.29.0 ; python_version < '2.7' +click>=6, < 7 +click_didyoumean>=0.0.3, <0.1 +colorama>=0.3, <=0.4 +Jinja2>=2.9, <3.0 +jsonpickle>=0.9, <=1.0 +logutils>=0.3, <0.4 +networkx>=2.0, <2.1 +PrettyTable>=0.7, <0.8 +psutil>=5.4, <5.5 +requests>=2.3, <2.14 +retrying>=1.3, <1.4 +ruamel.yaml>=0.15, <0.16 +setuptools>=36, <37 +shortuuid>=0.5, <0.6 +SQLAlchemy>=1.1, <1.2 +wagon>=0.6, <0.7 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/requirements.txt ---------------------------------------------------------------------- diff --git a/requirements.txt b/requirements.txt index bcc5296..2af8fe3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,40 +2,34 @@ # This file is autogenerated by pip-compile # To update, run: # -# pip-compile --output-file requirements.txt requirements.in +# pip-compile --output-file ./requirements.txt ./requirements.in # -appdirs==1.4.3 # via setuptools -backports.shutil_get_terminal_size==1.0.0 +backports.shutil-get-terminal-size==1.0.0 blinker==1.4 bottle==0.12.13 cachecontrol[filecache]==0.12.1 +click-didyoumean==0.0.3 click==6.7 -click_didyoumean==0.0.3 colorama==0.3.9 -decorator==4.0.11 # via networkx -importlib==1.0.4 ; python_version < "2.7" -jinja2==2.8.1 +decorator==4.1.2 # via networkx +jinja2==2.9.6 jsonpickle==0.9.4 lockfile==0.12.2 # via cachecontrol logutils==0.3.4.1 markupsafe==1.0 # via jinja2 msgpack-python==0.4.8 # via cachecontrol -networkx==1.9.1 -ordereddict==1.1 ; python_version < "2.7" -packaging==16.8 # via setuptools +networkx==2.0 prettytable==0.7.2 -psutil==5.2.2 -pyparsing==2.2.0 # via packaging +psutil==5.4.0 requests==2.13.0 retrying==1.3.3 ruamel.ordereddict==0.4.9 # via ruamel.yaml -ruamel.yaml==0.11.15 +ruamel.yaml==0.15.34 shortuuid==0.5.0 -six==1.10.0 # via packaging, retrying, setuptools +six==1.10.0 # via retrying sqlalchemy==1.1.6 -total-ordering==0.1.0 ; python_version < "2.7" wagon==0.6.0 -wheel==0.29.0 ; python_version < "2.7" +wheel==0.29.0 # via wagon # The following packages are considered to be unsafe in a requirements file: -setuptools==35.0.2 +# setuptools http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/setup.py ---------------------------------------------------------------------- diff --git a/setup.py b/setup.py index 8e95c19..8483c5b 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ from setuptools.command.develop import develop _PACKAGE_NAME = 'apache-ariatosca' -_PYTHON_SUPPORTED_VERSIONS = [(2, 6), (2, 7)] +_PYTHON_SUPPORTED_VERSIONS = [(2, 7)] _EXTENSION_DIR = 'extensions' _EXTENSION_NAMES = [ 'aria_extension_tosca' @@ -31,7 +31,7 @@ _EXTENSION_NAMES = [ if (sys.version_info[0], sys.version_info[1]) not in _PYTHON_SUPPORTED_VERSIONS: raise NotImplementedError( - '{0} Package support Python version 2.6 & 2.7 Only'.format( + '{0} Package supports Python version 2.7 only'.format( _PACKAGE_NAME)) root_dir = os.path.dirname(__file__) @@ -46,11 +46,11 @@ with open(os.path.join(root_dir, 'README.rst')) as readme: install_requires = [] ssh_requires = [ - 'Fabric>=1.13.0, <1.14', + 'Fabric>=1.14, <1.15' ] win_ssh_requires = [ # Fabric depends on the pypiwin32 on Windows, but doesn't install it - 'pypiwin32==219' + 'pypiwin32>=220' ] extras_require = { @@ -60,11 +60,11 @@ extras_require = { with open(os.path.join(root_dir, 'requirements.in')) as requirements: for requirement in requirements.readlines(): - requirement = requirement.split('#')[0].strip() # get rid of comments or trailing comments + requirement = requirement.split('#')[0].strip() # Get rid of comments or trailing comments if not requirement: - continue # skip empty and comment lines + continue # Skip empty and comment lines - # dependencies which use environment markers have to go in as conditional dependencies + # Dependencies which use environment markers have to go in as conditional dependencies # under "extra_require" rather than "install_requires", or otherwise the environment # markers get ignored when installing from wheel. See more here: # https://wheel.readthedocs.io/en/latest/index.html#defining-conditional-dependencies @@ -140,7 +140,6 @@ setup( 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: System :: Networking', http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py b/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py index e24c901..9f072f6 100644 --- a/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py +++ b/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py @@ -83,7 +83,7 @@ def test_task_graph_into_execution_graph(tmpdir): compiler = graph_compiler.GraphCompiler(workflow_context, base.StubTaskExecutor) compiler.compile(test_task_graph) - execution_tasks = topological_sort(_graph(workflow_context.execution.tasks)) + execution_tasks = tuple(topological_sort(_graph(workflow_context.execution.tasks))) assert len(execution_tasks) == 9 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/tests/requirements.txt ---------------------------------------------------------------------- diff --git a/tests/requirements.txt b/tests/requirements.txt index 56a7bf5..f2c3a45 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -10,13 +10,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -testtools==2.3.0 fasteners==0.14.1 -sh==1.12.14 -psutil==5.2.2 mock==2.0.0 pylint==1.6.5 -pytest==3.2.0 +pytest==3.2.3 pytest-cov==2.5.1 -pytest-mock==1.6.2 -pytest-xdist==1.18.2 +pytest-mock==1.6.3 +pytest-xdist==1.20.1 +sh==1.12.14 +testtools==2.3.0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1f03efc/tox.ini ---------------------------------------------------------------------- diff --git a/tox.ini b/tox.ini index 765435a..b48119d 100644 --- a/tox.ini +++ b/tox.ini @@ -11,9 +11,8 @@ # limitations under the License. [tox] -envlist=py27,py26,py27e2e,py26e2e,pywin,py27ssh,pylint_code,pylint_tests,docs +envlist=core,e2e,windows,ssh,pylint_core,pylint_tests,docs processes={env:PYTEST_PROCESSES:auto} -py26={env:PY26:python2.6} [testenv] whitelist_externals= @@ -29,18 +28,15 @@ deps= --requirement tests/requirements.txt basepython= - py26: {[tox]py26} - py27: python2.7 - py26e2e: {[tox]py26} - py27e2e: python2.7 - py26ssh: {[tox]py26} - py27ssh: python2.7 - pywin: {env:PYTHON:}\python.exe - pylint_code: python2.7 + core: python2.7 + e2e: python2.7 + ssh: python2.7 + windows: {env:PYTHON:}\python.exe + pylint_core: python2.7 pylint_tests: python2.7 docs: python2.7 -[testenv:py27] +[testenv:core] commands= pytest tests \ --numprocesses={[tox]processes} \ @@ -49,30 +45,14 @@ commands= --cov-report term-missing \ --cov aria -[testenv:py26] -commands= - pytest tests \ - --numprocesses={[tox]processes} \ - --ignore=tests/end2end \ - --ignore=tests/orchestrator/execution_plugin/test_ssh.py \ - --cov-report term-missing \ - --cov aria - -[testenv:py27e2e] +[testenv:e2e] commands= pytest tests/end2end \ --numprocesses={[tox]processes} \ --cov-report term-missing \ --cov aria -[testenv:py26e2e] -commands= - pytest tests/end2end \ - --numprocesses={[tox]processes} \ - --cov-report term-missing \ - --cov aria - -[testenv:pywin] +[testenv:windows] commands= pytest tests \ --numprocesses={[tox]processes} \ @@ -81,21 +61,14 @@ commands= --cov-report term-missing \ --cov aria -[testenv:py27ssh] +[testenv:ssh] install_command= pip install {opts} {packages} .[ssh] commands= pytest tests/orchestrator/execution_plugin/test_ssh.py \ --numprocesses={[tox]processes} -[testenv:py26ssh] -install_command= - pip install {opts} {packages} .[ssh] -commands= - pytest tests/orchestrator/execution_plugin/test_ssh.py \ - --numprocesses={[tox]processes} - -[testenv:pylint_code] +[testenv:pylint_core] commands= pylint aria extensions/aria_extension_tosca/ \ --rcfile=aria/.pylintrc \