Skip to content

Commit 1d73039

Browse files
committed
Added functions to get API version
1 parent d60fb87 commit 1d73039

File tree

3 files changed

+114
-1
lines changed

3 files changed

+114
-1
lines changed

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1+
flask>=2.3.0,>=3.0.0

tests/test_api.py

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from flask import Flask
2+
3+
from tunsberg.api import get_api_version, get_api_version_from_flask_url
4+
5+
6+
app = Flask(__name__)
7+
8+
9+
def test_get_api_version_from_flask_url_default():
10+
""" Test that the default pattern matches """
11+
with app.test_request_context('/api/v1/resource'):
12+
assert get_api_version_from_flask_url() == 'v1'
13+
14+
15+
def test_get_api_version_from_flask_url_custom_pattern():
16+
""" Test that the custom pattern matches """
17+
with app.test_request_context('/api/v2_1/resource'):
18+
assert get_api_version_from_flask_url(pattern=r'v\d+_\d+') == 'v2_1'
19+
20+
21+
def test_get_api_version_from_flask_url_no_version():
22+
""" Test that the default return value is empty string """
23+
with app.test_request_context('/api/resource'):
24+
assert get_api_version_from_flask_url() == ''
25+
26+
27+
def test_get_api_version_from_flask_url_default_return():
28+
""" Test that the default return value is 'v0' """
29+
with app.test_request_context('/api/resource'):
30+
assert get_api_version_from_flask_url(default='v0') == 'v0'
31+
32+
33+
def test_get_api_version_from_flask_url_no_default_return():
34+
""" Test that the default return value is empty string """
35+
with app.test_request_context('/api/resource'):
36+
assert get_api_version_from_flask_url(default='') == ''
37+
38+
39+
def test_get_api_version_standard():
40+
""" Test that the standard pattern matches """
41+
assert get_api_version('app.api.v1') == 'v1'
42+
assert get_api_version('module.v2.submodule') == 'v2'
43+
assert get_api_version('service.v3_1.beta') == 'v3_1'
44+
45+
46+
def test_get_api_version_no_version():
47+
""" Test that the default return value is empty string """
48+
assert get_api_version('app.api') == ''
49+
assert get_api_version('module.submodule') == ''
50+
51+
52+
def test_get_api_version_custom_pattern():
53+
""" Test that the custom pattern matches """
54+
assert get_api_version('app.api.v2021_04', pattern=r'v\d{4}_\d{2}') == 'v2021_04'
55+
assert get_api_version('service.v2021.beta', pattern=r'v\d{4}') == 'v2021'
56+
57+
58+
def test_get_api_version_custom_default():
59+
""" Test that the custom default value is returned """
60+
assert get_api_version('app.api', default='no_version') == 'no_version'
61+
assert get_api_version('module.submodule', default='undefined') == 'undefined'

tunsberg/api.py

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import re
2+
3+
from flask import request
4+
5+
6+
def get_api_version(folder_name: str, pattern: str = r'v\d+(_\d+)?', default: str = '') -> str:
7+
r"""
8+
Get API version from folder name.
9+
10+
:param folder_name: Folder name
11+
:type folder_name: str
12+
:param pattern: Regular expression pattern to match version. Default is 'v\\d+(_\\d+)?',
13+
which matches 'v<number>' or 'v<number>_<number>'.
14+
:type pattern: str
15+
:param default: Default return value if no version is found. Defaults to ''.
16+
:type default: str
17+
:return: API version as string, or the default value if no version is found
18+
:rtype: str
19+
"""
20+
if folder_name == 'app.api':
21+
return default
22+
23+
version_parts = folder_name.split('.')
24+
version_regex = re.compile(pattern)
25+
26+
for part in version_parts:
27+
if version_regex.match(part):
28+
return part
29+
30+
return default
31+
32+
33+
def get_api_version_from_flask_url(pattern: str = r'v\d+(_\d+)?', default: str = '') -> str:
34+
r"""
35+
Get the API version from a Flask URL.
36+
37+
:param pattern: Regular expression pattern to match version. Default is 'v\\d+(_\\d+)?',
38+
which matches 'v<number>' or 'v<number>_<number>'.
39+
:type pattern: str
40+
:param default: Default return value if no version is found. Defaults to ''.
41+
:type default: str
42+
:return: API version as string, or the default value if no version is found
43+
:rtype: str
44+
"""
45+
url_list = request.url.split('/')
46+
version_regex = re.compile(pattern)
47+
48+
for item in url_list:
49+
if version_regex.match(item):
50+
return item
51+
52+
return default

0 commit comments

Comments
 (0)