mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Used to decorate functions or methods that have save compat code for a
given major version.
```
@has_save_compat_for(5)
def foo() -> None:
...
```
This function will raise an error at startup if it is decorated as
having save compat for a version other than the current major version of
the game. A new major version is the definition of a save compat break,
so keeping around the old compat code serves no purpose other than
hiding initialization bugs. The compat code and the decorator should be
removed in the branch raising the error.
49 lines
1.6 KiB
Python
49 lines
1.6 KiB
Python
"""Tools for aiding in save compat removal after compatibility breaks."""
|
|
from collections import Callable
|
|
from typing import TypeVar
|
|
|
|
from game.version import MAJOR_VERSION
|
|
|
|
ReturnT = TypeVar("ReturnT")
|
|
|
|
|
|
class DeprecatedSaveCompatError(RuntimeError):
|
|
def __init__(self, function_name: str) -> None:
|
|
super().__init__(
|
|
f"{function_name} has save compat code for a different major version."
|
|
)
|
|
|
|
|
|
def has_save_compat_for(
|
|
major: int,
|
|
) -> Callable[[Callable[..., ReturnT]], Callable[..., ReturnT]]:
|
|
"""Declares a function or method as having save compat code for a given version.
|
|
|
|
If the function has save compatibility for the current major version, there is no
|
|
change in behavior.
|
|
|
|
If the function has save compatibility for a *different* (future or past) major
|
|
version, DeprecatedSaveCompatError will be raised during startup. Since a break in
|
|
save compatibility is the definition of a major version break, there's no need to
|
|
keep around old save compat code; it only serves to mask initialization bugs.
|
|
|
|
Args:
|
|
major: The major version for which the decorated function has save
|
|
compatibility.
|
|
|
|
Returns:
|
|
The decorated function or method.
|
|
|
|
Raises:
|
|
DeprecatedSaveCompatError: The decorated function has save compat code for
|
|
another version of liberation, and that code (and the decorator declaring it)
|
|
should be removed from this branch.
|
|
"""
|
|
|
|
def decorator(func: Callable[..., ReturnT]) -> Callable[..., ReturnT]:
|
|
if major != MAJOR_VERSION:
|
|
raise DeprecatedSaveCompatError(func.__name__)
|
|
return func
|
|
|
|
return decorator
|