Child pages
  • Python Migration

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents



Minimum Python Version

Pegasus Code except Worker Package

Lowest common version across supported platforms is

Worker Package

Lowest common version across supported platforms is  / 

Mats Rynge Can we expect Python 2.7 to be available on CentOS 6?

Mats Rynge List Python components included in worker package.

  1. Use python-six compatibility library.
  2. Refactor code such that Python 3 code is made Python 2 compatible instead of the opposite.
  3. See: https://python-future.org/compatible_idioms.html
  4. See: https://docs.python.org/3/howto/pyporting.html

Pegasus Code except Worker Package

Continue src/externals

(thumbs down)

Platform specific packages, python-flask

Will need to test with the lowest common available version across supported platforms.

Will require more platform specific integration tests.

Run pre/post install scripts to install using pip, i.e. pip install Flask.

Mats Rynge Do .rpm, .deb packages support this?

Packages may conflict with system installed packages. yum install python-flask (v0.9) vs pip install Flask (v1.0.2)


Latter two will require more platform specific integration tests to detect incompatible, missing dependencies.

Worker Package

Continue src/externals

Only for packages not expected to be available on supported platforms.

"Vendorize"

Copy dependency code into Pegasus.vendor directory.

Code Block
languagepy
themeRDark
# Instead of this
import six

# Use this
import Pegasus.vendor.six


Testing

Environment

Will run unit tests on the minimal supported Python version and above.

Using pytest instead of unittest

Uses assert instead of self.assert*.

Code Block
languagepy
themeRDark
import pytest

# Simple method, no need for classes
def test_method():
  # Simple assert, no need for assertEqual, etc.
  assert a % 2 == 0, "value was odd, should be even"

  with pytest.raises(ZeroDivisionError):
        1 / 0

# One method, multiple tests
# https://docs.pytest.org/en/latest/parametrize.html
@pytest.mark.parametrize(
    "a, b",
    [
		(1, 2, 3),
		(2, 3, 5),
		(5, -100, -95),
	],
)
def test_eval(a, b, expected):
    assert a + b == expected

# Dependency Injection
@pytest.fixture(scope="function OR class OR module OR package OR session")
def client():
	import requests
 	s = requests.Session()
	s.get(".../login")
	yield return s # Yield can be replaced with return if no cleanup is required.
	s.get(".../logout")
    s.close()

def test_external(client):
  assert client.get("/endpoint-1")


See: https://docs.pytest.org/en/latest/contents.html