1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
#!/usr/bin/env python
#
# Copyright (c), 2018-2025, SISSA (International School for Advanced Studies).
# All rights reserved.
# This file is distributed under the terms of the MIT License.
# See the file 'LICENSE' in the root directory of the present
# distribution, or http://opensource.org/licenses/MIT.
#
# @author Davide Brunato <brunato@sissa.it>
#
import unittest
import glob
import fileinput
import os
import re
import pathlib
import platform
from itertools import chain
@unittest.skip("breaks Debian autopkgtest")
class PackageTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.test_dir = os.path.dirname(os.path.abspath(__file__))
cls.package_dir = os.path.dirname(cls.test_dir)
cls.source_dir = os.path.join(cls.package_dir, 'elementpath/')
cls.missing_debug = re.compile(
r"(\bimport\s+pdb\b|\bpdb\s*\.\s*set_trace\(\s*\)|\bprint\s*\(|\bbreakpoint\s*\()"
)
cls.get_version = re.compile(
r"(?:\bversion|__version__)(?:\s*=\s*)(\'[^\']*\'|\"[^\"]*\")"
)
cls.get_python_requires = re.compile(
r"(?:\brequires-python\s*=\s*)(\'[^\']*\'|\"[^\"]*\")"
)
cls.get_classifier_version = re.compile(
r"(?:'Programming\s+Language\s+::\s+Python\s+::\s+)(3\.\d+)(?:\s*')"
)
cls.get_copyright_info = re.compile(
r"(Copyright\s\(c\),\s(?:\d{4}-)?(\d{4}), SISSA)"
)
@unittest.skipIf(platform.system() == 'Windows', 'Skip on Windows platform')
def test_missing_debug_statements(self):
message = "\nFound a debug missing statement at line %d of file %r: %r"
filename = None
source_files = glob.glob(os.path.join(self.source_dir, '*.py')) + \
glob.glob(os.path.join(self.source_dir, '*/*.py'))
for line in fileinput.input(source_files):
if fileinput.isfirstline():
filename = os.path.basename(fileinput.filename())
if filename == 'generate_categories.py':
fileinput.nextfile()
continue
lineno = fileinput.filelineno()
match = self.missing_debug.search(line)
self.assertIsNone(
match, message % (lineno, filename, match.group(0) if match else None)
)
@unittest.skipIf(platform.system() == 'Windows', 'Skip on Windows platform')
def test_wrong_copyright_info(self):
message = "\nFound a wrong copyright info at line %d of file %r: %r"
source_files = chain(pathlib.Path(self.package_dir).glob('LICENSE'),
pathlib.Path(self.source_dir).glob('**/*.py'),
pathlib.Path(self.package_dir).glob('tests/*.py'))
package_dir = pathlib.Path(self.package_dir)
year = '2025'
wrong_copyright_count = 0
for line in fileinput.input(source_files):
match = self.get_copyright_info.search(line)
if match and match.groups()[1] != year:
filepath = pathlib.Path(fileinput.filename()).relative_to(package_dir)
lineno = fileinput.filelineno()
print(message % (lineno, str(filepath), match.groups()[0]), end='')
wrong_copyright_count += 1
continue
else:
self.assertEqual(wrong_copyright_count, 0, msg="Found wrong copyright info")
def test_version_matching(self):
message = "\nFound a different version at line %d of file %r: %r (maybe %r)."
files = [
os.path.join(self.source_dir, '__init__.py'),
os.path.join(self.package_dir, 'pyproject.toml'),
]
version = filename = None
for line in fileinput.input(files):
if fileinput.isfirstline():
filename = fileinput.filename()
lineno = fileinput.filelineno()
match = self.get_version.search(line)
if match is not None:
if version is None:
version = match.group(1).strip('\'\"')
else:
self.assertTrue(
version == match.group(1).strip('\'\"'),
message % (lineno, filename, match.group(1).strip('\'\"'), version)
)
def test_python_requirement(self):
files = [
os.path.join(self.package_dir, 'pyproject.toml'),
os.path.join(self.package_dir, 'pyproject.toml'),
]
min_version = None
for line in fileinput.input(files):
if min_version is None:
match = self.get_python_requires.search(line)
if match is not None:
min_version = match.group(1).strip('\'\"')
self.assertTrue(
min_version.startswith('>=3.') and min_version[4:].isdigit(),
msg="Wrong python_requires directive in pyproject.toml: %s" % min_version
)
min_version = min_version[2:]
else:
match = self.get_classifier_version.search(line)
if match is not None:
python_version = match.group(1)
self.assertEqual(python_version[:2], min_version[:2])
self.assertGreaterEqual(int(python_version[2:]), int(min_version[2:]))
self.assertIsNotNone(min_version, msg="Missing python_requires in pyproject.toml")
if __name__ == '__main__':
unittest.main()
|