From a44a16f9a7c5bc46b15a7f54e058a38cb2707c60 Mon Sep 17 00:00:00 2001 From: Dan Callaghan Date: Mar 02 2018 06:04:20 +0000 Subject: switch to Python 3 on Fedora The EPEL7 build will continue to be built against Python 2. --- diff --git a/Jenkinsfile b/Jenkinsfile index e5d23ec..d26f54c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,14 +8,14 @@ try { // massive try{} catch{} around the entire build for failure notifications node('fedora') { checkout scm sh 'sudo dnf -y builddep waiverdb.spec' - sh 'sudo dnf -y install python2-flake8 python2-pylint python2-sphinx python-sphinxcontrib-httpdomain' + sh 'sudo dnf -y install python3-flake8 python3-pylint python3-sphinx python3-sphinxcontrib-httpdomain' /* Needed for mock EPEL7 builds: https://bugzilla.redhat.com/show_bug.cgi?id=1528272 */ sh 'sudo dnf -y install dnf-utils' stage('Invoke Flake8') { sh 'flake8' } stage('Invoke Pylint') { - sh 'pylint-2 --reports=n waiverdb' + sh 'pylint-3 --reports=n waiverdb' } stage('Build Docs') { sh 'make -C docs html' @@ -126,7 +126,7 @@ node('docker') { } } node('fedora') { - sh 'sudo dnf -y install /usr/bin/py.test' + sh 'sudo dnf -y install /usr/bin/py.test-3' checkout scm stage('Perform functional tests') { unarchive mapping: ['appversion': 'appversion'] @@ -167,7 +167,7 @@ node('fedora') { echo "Wrote CA certificate chain to ${env.WORKSPACE}/ca-chain.crt" withEnv(["WAIVERDB_TEST_URL=https://${route_hostname}/", "REQUESTS_CA_BUNDLE=${env.WORKSPACE}/ca-chain.crt"]) { - sh 'py.test functional-tests/' + sh 'py.test-3 functional-tests/' } } finally { /* Tear down everything we just created */ diff --git a/README.md b/README.md index 9776405..f4a3fe9 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ Create a local configuration file: Populate the database: - $ PYTHONPATH=. DEV=true python waiverdb/manage.py db upgrade + $ PYTHONPATH=. DEV=true python3 waiverdb/manage.py db upgrade Run the server: - $ PYTHONPATH=. DEV=true python waiverdb/manage.py run -h localhost -p 5004 --debugger + $ PYTHONPATH=. DEV=true python3 waiverdb/manage.py run -h localhost -p 5004 --debugger The server is now running at and API calls can be sent to . All data is stored in the `waiverdb` Postgres @@ -50,7 +50,7 @@ values in `waiverdb/config.py`. You can run this test suite with the following command:: - $ py.test tests/ + $ py.test-3 tests/ The test suite will drop and re-create a Postgres database named `waiverdb_test`. By default, it expects to have superuser access to Postgres on diff --git a/rpmbuild.sh b/rpmbuild.sh index 7f54258..60b894e 100755 --- a/rpmbuild.sh +++ b/rpmbuild.sh @@ -58,7 +58,7 @@ if [ -n "$rpmrel" ] ; then -e "/^__version__ = /c\\__version__ = '$version'" \ "$workdir/waiverdb/__init__.py" fi -( cd "$workdir" && python setup.py sdist ) +( cd "$workdir" && python3 setup.py sdist ) mv "$workdir"/dist/*.tar.gz "$workdir" rpmbuild \ diff --git a/waiverdb.spec b/waiverdb.spec index d9b7c6d..eb9e2d3 100644 --- a/waiverdb.spec +++ b/waiverdb.spec @@ -9,31 +9,28 @@ License: GPLv2+ URL: https://pagure.io/waiverdb Source0: https://files.pythonhosted.org/packages/source/w/%{name}/%{name}-%{upstream_version}.tar.gz -BuildRequires: python2-devel %if 0%{?fedora} || 0%{?rhel} > 7 -BuildRequires: python2-setuptools -BuildRequires: python2-sphinx -BuildRequires: python-sphinxcontrib-httpdomain -BuildRequires: python-sphinxcontrib-issuetracker -BuildRequires: python2-flask -%if 0%{?fedora} > 25 -BuildRequires: python2-sqlalchemy -%else -BuildRequires: python-sqlalchemy -%endif -BuildRequires: python2-flask-restful -BuildRequires: python2-flask-sqlalchemy -BuildRequires: python2-psycopg2 -BuildRequires: python2-kerberos -BuildRequires: python2-systemd -BuildRequires: python2-pytest -BuildRequires: python2-mock -BuildRequires: python2-flask-oidc -BuildRequires: python2-configparser -BuildRequires: python2-click -BuildRequires: python2-flask-migrate -BuildRequires: stomppy -%else # EPEL7 uses python- naming +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-sphinx +BuildRequires: python3-sphinxcontrib-httpdomain +BuildRequires: python3-sphinxcontrib-issuetracker +BuildRequires: python3-flask +BuildRequires: python3-sqlalchemy +BuildRequires: python3-flask-restful +BuildRequires: python3-flask-sqlalchemy +BuildRequires: python3-psycopg2 +BuildRequires: python3-kerberos +BuildRequires: python3-systemd +BuildRequires: python3-pytest +BuildRequires: python3-mock +BuildRequires: python3-flask-oidc +BuildRequires: python3-click +BuildRequires: python3-flask-migrate +BuildRequires: python3-stomppy +BuildRequires: python3-fedmsg +%else # EPEL7 uses Python 2 and python- package naming convention +BuildRequires: python2-devel BuildRequires: python-setuptools BuildRequires: python-flask BuildRequires: python-sqlalchemy @@ -49,29 +46,25 @@ BuildRequires: python-click BuildRequires: python-configparser BuildRequires: python-flask-migrate BuildRequires: stomppy -%endif BuildRequires: fedmsg +%endif %{?systemd_requires} BuildRequires: systemd BuildArch: noarch %if 0%{?fedora} || 0%{?rhel} > 7 -Requires: python2-flask -%if 0%{?fedora} > 25 -Requires: python2-sqlalchemy -%else -Requires: python-sqlalchemy -%endif -Requires: python2-flask-restful -Requires: python2-flask-sqlalchemy -Requires: python2-psycopg2 -Requires: python2-kerberos -Requires: python2-systemd -Requires: python2-mock -Requires: python2-flask-oidc -Requires: python2-click -Requires: python2-configparser -Requires: python2-flask-migrate -Requires: stomppy +Requires: python3-flask +Requires: python3-sqlalchemy +Requires: python3-flask-restful +Requires: python3-flask-sqlalchemy +Requires: python3-psycopg2 +Requires: python3-kerberos +Requires: python3-systemd +Requires: python3-mock +Requires: python3-flask-oidc +Requires: python3-click +Requires: python3-flask-migrate +Requires: python3-stomppy +Requires: python3-fedmsg %else Requires: python-flask Requires: python-sqlalchemy @@ -86,8 +79,8 @@ Requires: python-click Requires: python-configparser Requires: python-flask-migrate Requires: stomppy -%endif Requires: fedmsg +%endif Requires: waiverdb-common = %{version}-%{release} @@ -105,9 +98,8 @@ for other WaiverDB subpackages. %package cli Summary: A CLI tool for interacting with waiverdb %if 0%{?fedora} || 0%{?rhel} > 7 -BuildRequires: python2-click -Requires: python2-click -Requires: python2-configparser +BuildRequires: python3-click +Requires: python3-click %else BuildRequires: python-click Requires: python-click @@ -128,13 +120,19 @@ Primarily, submitting new waiverdbs. sed -i 's/\.stg\.fedoraproject\.org/.fedoraproject.org/g' conf/client.conf.example %build +%if 0%{?fedora} || 0%{?rhel} > 7 +%py3_build +make -C docs SPHINXBUILD=sphinx-build-3 SPHINXOPTS= html text +%else %py2_build -%if 0%{?fedora} -make -C docs SPHINXOPTS= html text %endif %install +%if 0%{?fedora} || 0%{?rhel} > 7 +%py3_install +%else %py2_install +%endif install -d %{buildroot}%{_unitdir} install -m0644 \ systemd/%{name}.service \ @@ -148,12 +146,17 @@ install -m0644 \ # Tests don't make sense here now that we require postgres to run them. #%%check -#export PYTHONPATH=%%{buildroot}/%%{python2_sitelib} -#py.test tests/ +#export PYTHONPATH=%%{buildroot}/%%{python3_sitelib} +#py.test-3 tests/ %files +%if 0%{?fedora} || 0%{?rhel} > 7 +%{python3_sitelib}/%{name} +%{python3_sitelib}/%{name}*.egg-info +%else %{python2_sitelib}/%{name} %{python2_sitelib}/%{name}*.egg-info +%endif %{_unitdir}/%{name}.service %{_unitdir}/%{name}.socket %attr(755,root,root) %{_bindir}/waiverdb @@ -161,15 +164,22 @@ install -m0644 \ %files common %license COPYING %doc README.md conf -%if 0%{?fedora} +%if 0%{?fedora} || 0%{?rhel} > 7 %doc docs/_build/html docs/_build/text -%endif +%{python3_sitelib}/%{name}/__init__.py* +%{python3_sitelib}/%{name}*.egg-info +%else %{python2_sitelib}/%{name}/__init__.py* %{python2_sitelib}/%{name}*.egg-info +%endif %files cli %license COPYING +%if 0%{?fedora} || 0%{?rhel} > 7 +%{python3_sitelib}/%{name}/cli.py* +%else %{python2_sitelib}/%{name}/cli.py* +%endif %attr(755,root,root) %{_bindir}/waiverdb-cli %config(noreplace) %{_sysconfdir}/waiverdb/client.conf diff --git a/waiverdb/api_v1.py b/waiverdb/api_v1.py index f7f44c1..565da49 100644 --- a/waiverdb/api_v1.py +++ b/waiverdb/api_v1.py @@ -121,7 +121,7 @@ class WaiversResource(Resource): raise BadRequest("'results' parameter should be a list \ of dictionaries with subject and testcase") if d.get('testcase', None): - if not isinstance(d.get('testcase', None), basestring): + if not isinstance(d.get('testcase', None), str): raise BadRequest("'results' parameter should be a list \ of dictionaries with subject and testcase") query = Waiver.by_results(query, results) @@ -374,7 +374,7 @@ class GetWaiversBySubjectsAndTestcases(Resource): raise BadRequest("'results' parameter should be a list \ of dictionaries with subject and testcase") if d.get('testcase', None): - if not isinstance(d.get('testcase', None), basestring): + if not isinstance(d.get('testcase', None), str): raise BadRequest("'results' parameter should be a list \ of dictionaries with subject and testcase") query = Waiver.by_results(query, data['results']) diff --git a/waiverdb/app.py b/waiverdb/app.py index b8abf78..7d44a6b 100644 --- a/waiverdb/app.py +++ b/waiverdb/app.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0+ import os -import urlparse +import urllib.parse from flask import Flask from flask_migrate import Migrate @@ -41,13 +41,13 @@ def populate_db_config(app): # the SQLALCHEMY_DATABASE_URI setting which is obeyed by Flask-SQLAlchemy. dburi = app.config['DATABASE_URI'] if os.environ.get('DATABASE_PASSWORD'): - parsed = urlparse.urlparse(dburi) + parsed = urllib.parse.urlparse(dburi) netloc = '{}:{}@{}'.format(parsed.username, os.environ['DATABASE_PASSWORD'], parsed.hostname) if parsed.port: netloc += ':{}'.format(parsed.port) - dburi = urlparse.urlunsplit( + dburi = urllib.parse.urlunsplit( (parsed.scheme, netloc, parsed.path, parsed.query, parsed.fragment)) if app.config['SHOW_DB_URI']: app.logger.debug('using DBURI: %s', dburi) @@ -65,7 +65,7 @@ def create_app(config_obj=None): raise Warning("You need to change the app.secret_key value for production") # register error handlers - for code in default_exceptions.iterkeys(): + for code in default_exceptions.keys(): app.register_error_handler(code, json_error) app.register_error_handler(ConnectionError, json_error) app.register_error_handler(Timeout, json_error) diff --git a/waiverdb/events.py b/waiverdb/events.py index 5596ebb..4b8372c 100644 --- a/waiverdb/events.py +++ b/waiverdb/events.py @@ -8,7 +8,6 @@ using the :func:`sqlalchemy.event.listen` function. .. _SQLALchemy events: https://docs.sqlalchemy.org/en/latest/orm/events.html """ -from __future__ import unicode_literals import logging diff --git a/waiverdb/migrations/env.py b/waiverdb/migrations/env.py index c51beb2..5e3e457 100644 --- a/waiverdb/migrations/env.py +++ b/waiverdb/migrations/env.py @@ -1,4 +1,4 @@ -from __future__ import with_statement + from alembic import context from sqlalchemy import engine_from_config, pool from logging.config import fileConfig diff --git a/waiverdb/utils.py b/waiverdb/utils.py index 6e529e2..30e0c02 100644 --- a/waiverdb/utils.py +++ b/waiverdb/utils.py @@ -72,7 +72,7 @@ def json_error(error): else: # Could be ConnectionError or Timeout current_app.logger.exception('Returning 500 to user.') - response = jsonify(message=str(error.message)) + response = jsonify(message=str(error)) response.status_code = 500 return insert_headers(response)