From be5e689cac62bb9936ec9f32837843c37a2a560a Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Mon, 19 Mar 2018 18:32:45 +0000 Subject: [PATCH 1/2] remove dependency on pip internals closes #1438 --- dev-requirements.txt | 1 + modoboa/core/commands/deploy.py | 17 +++++++---------- setup.py | 18 +++++++++--------- test-requirements.txt | 1 + 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index 06d73f33c..e2dd90121 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,2 +1,3 @@ django-bower django-debug-toolbar +packaging diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index 791447d39..3dcfc0ccb 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -22,13 +22,7 @@ from django.utils.six.moves import input from modoboa.core.commands import Command from modoboa.lib.api_client import ModoAPIClient - -try: - import pip -except ImportError: - sys.stderr.write("Error: pip is required to install extensions.\n") - sys.exit(2) - +from modoboa.lib.sysutils import exec_cmd DBCONN_TPL = """ '{{ conn_name }}': { @@ -226,9 +220,12 @@ class DeployCommand(Command): extensions = [(extension, extension.replace("-", "_")) for extension in extensions] if not parsed_args.dont_install_extensions: - pip_args = ( - ["install"] + [extension[0] for extension in extensions]) - pip.main(pip_args) + cmd = ( + sys.executable + + " -m pip install " + + " ".join([extension[0] for extension in extensions]) + ) + exec_cmd(cmd, capture_output=False) extra_settings = self.find_extra_settings(extensions) extensions = [extension[1] for extension in extensions] diff --git a/setup.py b/setup.py index 43abc5c05..3a7a3737d 100644 --- a/setup.py +++ b/setup.py @@ -13,21 +13,21 @@ from __future__ import unicode_literals import io from os import path -from pip.req import parse_requirements +from packaging.requirements import Requirement from setuptools import find_packages, setup def get_requirements(requirements_file): - """Use pip to parse requirements file.""" + """Parse requirements file.""" requirements = [] if path.isfile(requirements_file): - for req in parse_requirements(requirements_file, session="hack"): - # check markers, such as - # - # rope_py3k ; python_version >= '3.0' - # - if req.match_markers(): - requirements.append(str(req.req)) + with io.open(requirements_file, encoding="utf-8") as fp: + for line in fp: + if line.startswith("#") or line.strip() == "": + continue + req = Requirement(line) + if req.marker is None or req.marker.evaluate(): + requirements.append('%s%s' % (req.name, req.specifier)) return requirements diff --git a/test-requirements.txt b/test-requirements.txt index 45bb850f1..03529194c 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -5,3 +5,4 @@ testfixtures==4.7.0 tox psycopg2-binary>=2.7.4 mysqlclient>=1.3.3 +packaging From e6966c0ecb681d0952d3cc7fe23c1d6fbe56693c Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Mon, 19 Mar 2018 18:42:25 +0000 Subject: [PATCH 2/2] clean up requirements.txt argparse - remove, now part of Pythons stdlib in Python 2.7 and 3.4+ backports.csv - only required for Python 2 ipaddress - only required for Python < 3.3 --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 502067794..632848c14 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,13 +11,12 @@ coreapi==2.3.3 coreapi-cli==1.0.6 djangorestframework==3.7.3 -argparse # bcrypt requires libffi-dev bcrypt==3.1.4 dnspython==1.15.0 feedparser==5.2.1 gevent==1.2.2 -ipaddress +ipaddress; python_version < '3.3' jsonfield==2.0.2 passlib==1.7.1 progressbar33==2.4