Skip to content

Commit 5e4c07c

Browse files
committed
fix: Fix validation for web frameworks
Both Django and Flask have two supported major versions. Fix validation to reflect this.
1 parent a60a289 commit 5e4c07c

File tree

4 files changed

+76
-23
lines changed

4 files changed

+76
-23
lines changed

appmap/command/appmap_agent_validate.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,37 @@ def check_python_version():
2323
except AppMapPyVerException as e:
2424
raise ValidationFailure(str(e))
2525

26-
def _check_version(dist, v):
26+
def _check_version(dist, versions):
2727
dist_version = None
28-
try:
29-
dist_version = version(dist)
28+
for v in versions:
29+
try:
30+
dist_version = version(dist)
31+
32+
required = parse(v)
33+
actual = parse(dist_version)
34+
if required.major != actual.major:
35+
dist_version = None
36+
continue
3037

31-
required = parse(v)
32-
actual = parse(dist_version)
38+
if actual < required:
39+
raise ValidationFailure(f'{dist} must have version >= {required}, found {actual}')
3340

34-
if actual < required:
35-
raise ValidationFailure(f'{dist} must have version >= {required}, found {actual}')
36-
except PackageNotFoundError:
37-
pass
41+
return dist_version
42+
except PackageNotFoundError:
43+
dist_version = None
3844

3945
return dist_version
4046

4147
# Note that, per https://www.python.org/dev/peps/pep-0426/#name,
4248
# comparison of distribution names are case-insensitive.
4349
def check_django_version():
44-
return _check_version('django', '3.2')
50+
return _check_version('django', ['2.2', '3.2'])
4551

4652
def check_flask_version():
47-
return _check_version('flask', '1.1')
53+
return _check_version('flask', ['1.1', '2.0'])
4854

4955
def check_pytest_version():
50-
return _check_version('pytest', '6.2')
56+
return _check_version('pytest', ['6.2'])
5157

5258
def _run():
5359
errors = [ValidationFailure('internal error')] # shouldn't ever see this

appmap/test/test_command.py

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import re
66

77

8-
from importlib_metadata import version
8+
from importlib_metadata import PackageNotFoundError, version
99
import pytest
1010

1111
import appmap._implementation
@@ -115,15 +115,60 @@ def test_python_version(self, capsys, mocker):
115115

116116
self.check_errors(capsys, 1, 1, r'Minimum Python version supported is \d\.\d, found')
117117

118-
def test_django_version(self, capsys, mocker):
118+
@pytest.mark.parametrize('django_version', ['3.2.1', '2.2.1'])
119+
def test_django_version_current(self, capsys, mocker, django_version):
120+
def side_effect(dist):
121+
if dist == 'django':
122+
return django_version
123+
elif dist == 'flask':
124+
raise PackageNotFoundError()
125+
return version(dist)
126+
127+
m = mocker.patch('appmap.command.appmap_agent_validate.version',
128+
side_effect=side_effect)
129+
130+
self.check_errors(capsys, 0, 0, None)
131+
132+
133+
@pytest.mark.parametrize('django_version', ['3.1.0', '2.1.0'])
134+
def test_django_version_old(self, capsys, mocker, django_version):
135+
def side_effect(dist):
136+
if dist == 'django':
137+
return django_version
138+
elif dist == 'flask':
139+
raise PackageNotFoundError()
140+
return version(dist)
141+
119142
m = mocker.patch('appmap.command.appmap_agent_validate.version',
120-
side_effect=lambda d: '3.1' if d == 'django' else version(d))
143+
side_effect=side_effect)
121144

122-
self.check_errors(capsys, 1, 1, 'django must have version >= 3.2, found 3.1')
145+
self.check_errors(capsys, 1, 1, 'django must have version >=')
146+
147+
148+
@pytest.mark.parametrize('flask_version', ['1.1.4', '2.0.1'])
149+
def test_flask_version_current(self, capsys, mocker, flask_version):
150+
def side_effect(dist):
151+
if dist == 'django':
152+
raise PackageNotFoundError()
153+
elif dist == 'flask':
154+
return flask_version
155+
return version(dist)
156+
157+
m = mocker.patch('appmap.command.appmap_agent_validate.version',
158+
side_effect=side_effect)
159+
160+
self.check_errors(capsys, 0, 0, None)
123161

162+
@pytest.mark.parametrize('flask_version', ['1.0', '2.0.0.alpha1'])
163+
def test_flask_version_old(self, capsys, mocker, flask_version):
164+
def side_effect(dist):
165+
if dist == 'django':
166+
raise PackageNotFoundError()
167+
elif dist == 'flask':
168+
return flask_version
169+
return version(dist)
124170

125-
def test_flask_version(self, capsys, mocker):
126171
m = mocker.patch('appmap.command.appmap_agent_validate.version',
127-
side_effect=lambda d: '1.0' if d == 'flask' else version(d))
172+
side_effect=side_effect)
128173

129-
self.check_errors(capsys, 1, 1, 'flask must have version >= 1.1, found 1.0')
174+
self.check_errors(capsys, 1, 1, 'flask must have version >=')

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ PyYAML = "^5.3.0"
3737
inflection = "^0.3.0"
3838
importlib-metadata = ">=0.8"
3939
Django = { version = "^3.1.6", python = "^3.6", optional = true }
40+
flask = { version = "^1.1.2", python = "^3.6", optional = true }
4041

4142
[tool.poetry.dev-dependencies]
4243
httpretty = "^1.0.5"
@@ -48,7 +49,6 @@ pyfakefs = "^4.3.2"
4849
pprintpp = "^0.4.0"
4950
coverage = "^5.3"
5051
pytest-mock = "^3.5.1"
51-
flask = "^1.1.2"
5252
SQLAlchemy = { version = "^1.4.11", python = "^3.6"}
5353
tox = "^3.22.0"
5454
tox-pyenv = "^1.1.0"
@@ -58,7 +58,7 @@ requests = "^2.25.1"
5858
pytest-django = "^4.4.0"
5959

6060
[tool.poetry.extras]
61-
test = ["Django"]
61+
test = ["Django", "flask"]
6262

6363
[build-system]
6464
requires = ["poetry-core>=1.0.0"]

tox.ini

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
[tox]
22
skipsdist = true
3-
envlist = py3{6,7,8,9}-django{32,22}
3+
envlist = py3{6,7,8,9}-django{32,22},py3{6,7,8,9}-flask{10,20}
44

55
[testenv]
66
deps=
77
poetry
88
django32: Django>=3.2,<4.0
99
django22: Django>=2.2,<3.0
10+
flask20: flask>=2.0
11+
flask10: flask>=1.1,<2.0
1012
commands =
1113
poetry install -v
1214
django32: poetry run {posargs:pytest -v}
13-
django22: poetry run pytest appmap/test/test_django.py
15+
django22: poetry run pytest appmap/test/test_django.py appmap/test/test_command.py

0 commit comments

Comments
 (0)