File: test_package.py

package info (click to toggle)
elementpath 5.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,452 kB
  • sloc: python: 36,482; xml: 40; makefile: 13
file content (138 lines) | stat: -rw-r--r-- 5,560 bytes parent folder | download
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()