Skip to content

Commit c5297aa

Browse files
committed
Add type annotations
Signed-off-by: Chad Dombrova <[email protected]>
1 parent 2933636 commit c5297aa

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+2108
-1141
lines changed

.github/workflows/mypy.yaml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
name: mypy
2+
on:
3+
pull_request:
4+
paths:
5+
- 'src/rez/**.py'
6+
- 'src/rezplugins/**.py'
7+
- 'pyproject.toml'
8+
- '!src/rez/utils/_version.py'
9+
- '!src/rez/data/**'
10+
- '!src/rez/vendor/**'
11+
- '!src/rez/backport/**'
12+
push:
13+
paths:
14+
- 'src/rez/**.py'
15+
- 'src/rezplugins/**.py'
16+
- 'pyproject.toml'
17+
- '!src/rez/utils/_version.py'
18+
- '!src/rez/data/**'
19+
- '!src/rez/vendor/**'
20+
- '!src/rez/backport/**'
21+
22+
permissions:
23+
contents: read
24+
25+
jobs:
26+
mypy:
27+
name: Run mypy static type analysis
28+
runs-on: ubuntu-latest
29+
30+
steps:
31+
- name: Checkout
32+
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
33+
34+
- name: Set up Python
35+
uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
36+
with:
37+
python-version: "3.10"
38+
39+
- name: Install Dependencies
40+
run: |
41+
pip install mypy==1.14.1 mypy_baseline==0.7.1 types-setuptools
42+
43+
- name: Run mypy
44+
run: >-
45+
echo "To update the baseline run:"
46+
echo "mypy | mypy-baseline sync --ignore-categories=note"
47+
echo "then commit mypy-baseline.txt"
48+
echo
49+
mypy | mypy-baseline filter --ignore-categories=note --allow-unsynced

mypy-baseline.txt

Lines changed: 303 additions & 0 deletions
Large diffs are not rendered by default.

pyproject.toml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
11
[build-system]
22
requires = ["setuptools"]
33
build-backend = "setuptools.build_meta"
4+
5+
[tool.mypy]
6+
python_version = "3.11"
7+
files = ["src/rez/", "src/rezplugins/"]
8+
exclude = [
9+
'.*/rez/data/.*',
10+
'.*/rez/vendor/.*',
11+
'.*/rez/tests/.*',
12+
'.*/rez/utils/lint_helper.py',
13+
]
14+
disable_error_code = ["var-annotated", "import-not-found"]
15+
check_untyped_defs = true
16+
# allow this for now:
17+
allow_redefinition = true
18+
follow_imports = "silent"
19+
20+
[[tool.mypy.overrides]]
21+
module = 'rez.utils.lint_helper'
22+
follow_imports = "skip"
23+

src/rez/__init__.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,7 @@ def callback(sig, frame):
5454
txt = ''.join(traceback.format_stack(frame))
5555
print()
5656
print(txt)
57-
else:
58-
callback = None
5957

60-
if callback:
6158
signal.signal(signal.SIGUSR1, callback) # Register handler
6259

6360

src/rez/build_process.py

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
# Copyright Contributors to the Rez Project
33

44

5+
from __future__ import annotations
6+
57
from rez.packages import iter_packages
68
from rez.exceptions import BuildProcessError, BuildContextResolveError, \
79
ReleaseHookCancellingError, RezError, ReleaseError, BuildError, \
@@ -18,6 +20,13 @@
1820
import getpass
1921
import os.path
2022
import sys
23+
from typing import TYPE_CHECKING
24+
25+
if TYPE_CHECKING:
26+
from rez.build_system import BuildSystem
27+
from rez.packages import Package, Variant
28+
from rez.release_vcs import ReleaseVCS
29+
from rez.developer_package import DeveloperPackage
2130

2231

2332
debug_print = config.debug_printer("package_release")
@@ -29,9 +38,16 @@ def get_build_process_types():
2938
return plugin_manager.get_plugins('build_process')
3039

3140

32-
def create_build_process(process_type, working_dir, build_system, package=None,
33-
vcs=None, ensure_latest=True, skip_repo_errors=False,
34-
ignore_existing_tag=False, verbose=False, quiet=False):
41+
def create_build_process(process_type: str,
42+
working_dir: str,
43+
build_system: BuildSystem,
44+
package=None,
45+
vcs: ReleaseVCS | None = None,
46+
ensure_latest: bool = True,
47+
skip_repo_errors: bool = False,
48+
ignore_existing_tag: bool = False,
49+
verbose: bool = False,
50+
quiet: bool = False) -> BuildProcess:
3551
"""Create a :class:`BuildProcess` instance.
3652
3753
.. warning::
@@ -44,7 +60,7 @@ def create_build_process(process_type, working_dir, build_system, package=None,
4460
if process_type not in process_types:
4561
raise BuildProcessError("Unknown build process: %r" % process_type)
4662

47-
cls = plugin_manager.get_plugin_class('build_process', process_type)
63+
cls = plugin_manager.get_plugin_class('build_process', process_type, BuildProcess)
4864

4965
return cls(working_dir, # ignored (deprecated)
5066
build_system,
@@ -77,7 +93,8 @@ class BuildProcess(object):
7793
def name(cls):
7894
raise NotImplementedError
7995

80-
def __init__(self, working_dir, build_system, package=None, vcs=None,
96+
def __init__(self, working_dir: str, build_system: BuildSystem, package=None,
97+
vcs: ReleaseVCS | None = None,
8198
ensure_latest=True, skip_repo_errors=False,
8299
ignore_existing_tag=False, verbose=False, quiet=False):
83100
"""Create a BuildProcess.
@@ -119,14 +136,15 @@ def __init__(self, working_dir, build_system, package=None, vcs=None,
119136
self.package.config.build_directory)
120137

121138
@property
122-
def package(self):
139+
def package(self) -> DeveloperPackage:
123140
return self.build_system.package
124141

125142
@property
126-
def working_dir(self):
143+
def working_dir(self) -> str:
127144
return self.build_system.working_dir
128145

129-
def build(self, install_path=None, clean=False, install=False, variants=None):
146+
def build(self, install_path: str | None = None, clean: bool = False,
147+
install: bool = False, variants: list[int] | None = None) -> int:
130148
"""Perform the build process.
131149
132150
Iterates over the package's variants, resolves the environment for
@@ -149,7 +167,8 @@ def build(self, install_path=None, clean=False, install=False, variants=None):
149167
"""
150168
raise NotImplementedError
151169

152-
def release(self, release_message=None, variants=None):
170+
def release(self, release_message: str | None = None,
171+
variants: list[int] | None = None) -> int:
153172
"""Perform the release process.
154173
155174
Iterates over the package's variants, building and installing each into
@@ -167,7 +186,7 @@ def release(self, release_message=None, variants=None):
167186
"""
168187
raise NotImplementedError
169188

170-
def get_changelog(self):
189+
def get_changelog(self) -> str | None:
171190
"""Get the changelog since last package release.
172191
173192
Returns:
@@ -187,7 +206,8 @@ def repo_operation(self):
187206
except exc_type as e:
188207
print_warning("THE FOLLOWING ERROR WAS SKIPPED:\n%s" % str(e))
189208

190-
def visit_variants(self, func, variants=None, **kwargs):
209+
def visit_variants(self, func, variants: list[int] | None = None,
210+
**kwargs) -> tuple[int, list[str | None]]:
191211
"""Iterate over variants and call a function on each."""
192212
if variants:
193213
present_variants = range(self.package.num_variants)
@@ -215,7 +235,7 @@ def visit_variants(self, func, variants=None, **kwargs):
215235

216236
return num_visited, results
217237

218-
def get_package_install_path(self, path):
238+
def get_package_install_path(self, path: str) -> str:
219239
"""Return the installation path for a package (where its payload goes).
220240
221241
Args:
@@ -230,7 +250,8 @@ def get_package_install_path(self, path):
230250
package_version=self.package.version
231251
)
232252

233-
def create_build_context(self, variant, build_type, build_path):
253+
def create_build_context(self, variant: Variant, build_type: BuildType,
254+
build_path: str) -> tuple[ResolvedContext, str]:
234255
"""Create a context to build the variant within."""
235256
request = variant.get_requires(build_requires=True,
236257
private_build_requires=True)
@@ -274,7 +295,7 @@ def create_build_context(self, variant, build_type, build_path):
274295
raise BuildContextResolveError(context)
275296
return context, rxt_filepath
276297

277-
def pre_release(self):
298+
def pre_release(self) -> None:
278299
release_settings = self.package.config.plugins.release_vcs
279300

280301
# test that the release path exists
@@ -322,7 +343,7 @@ def pre_release(self):
322343
else:
323344
break
324345

325-
def post_release(self, release_message=None):
346+
def post_release(self, release_message=None) -> None:
326347
tag_name = self.get_current_tag_name()
327348

328349
if self.vcs is None:
@@ -332,7 +353,7 @@ def post_release(self, release_message=None):
332353
with self.repo_operation():
333354
self.vcs.create_release_tag(tag_name=tag_name, message=release_message)
334355

335-
def get_current_tag_name(self):
356+
def get_current_tag_name(self) -> str:
336357
release_settings = self.package.config.plugins.release_vcs
337358
try:
338359
tag_name = self.package.format(release_settings.tag_name)
@@ -342,7 +363,7 @@ def get_current_tag_name(self):
342363
tag_name = "unversioned"
343364
return tag_name
344365

345-
def run_hooks(self, hook_event, **kwargs):
366+
def run_hooks(self, hook_event, **kwargs) -> None:
346367
hook_names = self.package.config.release_hooks or []
347368
hooks = create_release_hooks(hook_names, self.working_dir)
348369

@@ -357,12 +378,12 @@ def run_hooks(self, hook_event, **kwargs):
357378
"%s cancelled by %s hook '%s': %s:\n%s"
358379
% (hook_event.noun, hook_event.label, hook.name(),
359380
e.__class__.__name__, str(e)))
360-
except RezError:
381+
except RezError as e:
361382
debug_print("Error in %s hook '%s': %s:\n%s"
362383
% (hook_event.label, hook.name(),
363384
e.__class__.__name__, str(e)))
364385

365-
def get_previous_release(self):
386+
def get_previous_release(self) -> Package | None:
366387
release_path = self.package.config.release_packages_path
367388
it = iter_packages(self.package.name, paths=[release_path])
368389
packages = sorted(it, key=lambda x: x.version, reverse=True)
@@ -372,18 +393,19 @@ def get_previous_release(self):
372393
return package
373394
return None
374395

375-
def get_changelog(self):
396+
def get_changelog(self) -> str | None:
376397
previous_package = self.get_previous_release()
377398
if previous_package:
378399
previous_revision = previous_package.revision
379400
else:
380401
previous_revision = None
381402

382403
changelog = None
383-
with self.repo_operation():
384-
changelog = self.vcs.get_changelog(
385-
previous_revision,
386-
max_revisions=config.max_package_changelog_revisions)
404+
if self.vcs:
405+
with self.repo_operation():
406+
changelog = self.vcs.get_changelog(
407+
previous_revision,
408+
max_revisions=config.max_package_changelog_revisions)
387409

388410
return changelog
389411

0 commit comments

Comments
 (0)