diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e98b79d..97df729 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,7 +19,6 @@ jobs: # MANDATORY CHECKS USING CURRENT DEVELOPMENT INTERPRETER - dependencies: > libatomic - pylint python3-dbus python3-dbus-python-client-gen python3-matplotlib @@ -28,10 +27,10 @@ jobs: python3-requests python3-semantic_version python3-specfile + ruff task: PATH=${PATH}:/github/home/.local/bin make -f Makefile lint - dependencies: > - black - python3-isort + ruff shfmt task: make -f Makefile fmt-travis - dependencies: > diff --git a/.isort.cfg b/.isort.cfg deleted file mode 100644 index 39b99b8..0000000 --- a/.isort.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[settings] -profile = black - -sections = FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY - -import_heading_future=isort: FUTURE -import_heading_stdlib=isort: STDLIB -import_heading_thirdparty=isort: THIRDPARTY -import_heading_firstparty=isort: FIRSTPARTY - -# All items above should be the same for every -# Stratis project. The items below vary with -# each project. -known_first_party=dbus_python_client_gen diff --git a/Makefile b/Makefile index 41a99ce..193b6ff 100644 --- a/Makefile +++ b/Makefile @@ -1,35 +1,18 @@ .PHONY: lint lint: - pylint ./blackbox/parse_json.py - pylint ./dependency_management/* --disable=R0801 - pylint ./misc_scripts/*.py --disable=R0801 - pylint ./release_management/*.py --disable=R0801 + ruff check pyright .PHONY: fmt fmt: - isort ./blackbox/parse_json.py - isort ./dependency_management/* - isort ./misc_scripts/ - isort ./release_management/* - black ./blackbox/parse_json.py - black ./dependency_management/ - black ./dependency_management/compare_fedora_versions - black ./misc_scripts/*.py - black ./release_management/ + ruff check --fix --select I + ruff format shfmt -l -w . .PHONY: fmt-travis fmt-travis: - isort --diff --check-only ./blackbox/parse_json.py - isort --diff --check-only ./dependency_management/* - isort --diff --check-only ./misc_scripts/ - isort --diff --check-only ./release_management/* - black ./blackbox/parse_json.py --check - black ./dependency_management/ --check - black ./dependency_management/compare_fedora_versions --check - black ./misc_scripts/*.py --check - black ./release_management/ --check + ruff check --select I + ruff format --check shfmt -d . .PHONY: yamllint diff --git a/dependency_management/_utils.py b/dependency_management/_utils.py index d3b2a04..073533f 100755 --- a/dependency_management/_utils.py +++ b/dependency_management/_utils.py @@ -18,7 +18,6 @@ to the versions of dependencies available on Fedora Rawhide. """ - # isort: STDLIB import json import re @@ -57,7 +56,7 @@ def build_koji_repo_dict(crates, release): release_number = int(release[1:]) - if release_number < 34: + if release_number < 34: # noqa: PLR2004 raise RuntimeError( f"release number must be at least 34, was {release_number}" ) @@ -72,7 +71,7 @@ def build_koji_repo_dict(crates, release): ) requests_var = requests.get(url, timeout=30) - if requests_var.status_code != 200: + if requests_var.status_code != requests.codes.ok: raise RuntimeError(f"Page at URL {url} not found") packages = requests_var.text @@ -106,13 +105,7 @@ def build_cargo_metadata(manifest_path, *, skip_path=False): :returns: a dict mapping crate name to version specification :rtype: str * SimpleSpec """ - command = [ - "cargo", - "metadata", - "--format-version=1", - "--no-deps", - "--all-features", - ] + command = ["cargo", "metadata", "--format-version=1", "--no-deps", "--all-features"] if manifest_path is not None: command.append(f"--manifest-path={manifest_path}") diff --git a/misc_scripts/filesystem_size_estimate.py b/misc_scripts/filesystem_size_estimate.py index a5ca08d..c868ed5 100755 --- a/misc_scripts/filesystem_size_estimate.py +++ b/misc_scripts/filesystem_size_estimate.py @@ -93,7 +93,6 @@ _TIMEOUT = 120000 -# pylint: disable=invalid-name Manager = make_class("Manager", ET.fromstring(SPECS[_MANAGER_IFACE]), _TIMEOUT) Pool = make_class("Pool", ET.fromstring(SPECS[_POOL_IFACE]), _TIMEOUT) Filesystem = make_class("Filesystem", ET.fromstring(SPECS[_FILESYSTEM_IFACE]), _TIMEOUT) @@ -137,15 +136,8 @@ def _do_one(size, bus, pool_proxy): if not real: pool_used_pre = None - ( - (_, (filesystems)), - return_code, - return_msg, - ) = Pool.Methods.CreateFilesystems( - pool_proxy, - { - "specs": [("fs_name", (True, size))], - }, + ((_, (filesystems)), return_code, return_msg) = Pool.Methods.CreateFilesystems( + pool_proxy, {"specs": [("fs_name", (True, size))]} ) if return_code != 0: @@ -184,11 +176,7 @@ def _print_values(devices): proxy = bus.get_object(_SERVICE, _TOP_OBJECT, introspect=False) - ( - (_, (pool_object_path, _)), - return_code, - return_msg, - ) = Manager.Methods.CreatePool( + ((_, (pool_object_path, _)), return_code, return_msg) = Manager.Methods.CreatePool( proxy, { "name": "pool_name", @@ -209,9 +197,9 @@ def _print_values(devices): (size, fs_used, pool_used_pre, pool_used_post) = _do_one(size, bus, pool_proxy) print( - f'{size} {"ERROR" if fs_used is None else fs_used} ' - f'{"ERROR" if pool_used_pre is None else pool_used_pre} ' - f'{"ERROR" if pool_used_post is None else pool_used_post}' + f"{size} {'ERROR' if fs_used is None else fs_used} " + f"{'ERROR' if pool_used_pre is None else pool_used_pre} " + f"{'ERROR' if pool_used_post is None else pool_used_post}" ) (_, return_code, return_msg) = Manager.Methods.DestroyPool( diff --git a/misc_scripts/filesystem_size_input.py b/misc_scripts/filesystem_size_input.py index 37cfc34..a61d019 100755 --- a/misc_scripts/filesystem_size_input.py +++ b/misc_scripts/filesystem_size_input.py @@ -18,19 +18,11 @@ def gen_parser(): ) parser.add_argument( - "--start", - action="store", - type=int, - default=512 * 1024**2, - help="Start value", + "--start", action="store", type=int, default=512 * 1024**2, help="Start value" ) parser.add_argument( - "--stop", - action="store", - type=int, - default=8 * 1024**4, - help="End value", + "--stop", action="store", type=int, default=8 * 1024**4, help="End value" ) return parser diff --git a/misc_scripts/thin_metadata_size_viz.py b/misc_scripts/thin_metadata_size_viz.py index bf1fa6c..c48f28d 100755 --- a/misc_scripts/thin_metadata_size_viz.py +++ b/misc_scripts/thin_metadata_size_viz.py @@ -51,7 +51,7 @@ def gen_parser(): return parser -def build_arrays(block_size, values): # pylint: disable=too-many-locals +def build_arrays(block_size, values): """ Build three matrices of values where the z_values are the result of running thin_metadata_size on the x and y values. @@ -116,7 +116,7 @@ def plot_figure(x_inputs, y_inputs, z_inputs): return fig -def main(): # pylint: disable=too-many-locals +def main(): """ Main method """ diff --git a/misc_scripts/update_introspection_data.py b/misc_scripts/update_introspection_data.py index a21ce93..37f9f12 100755 --- a/misc_scripts/update_introspection_data.py +++ b/misc_scripts/update_introspection_data.py @@ -93,7 +93,6 @@ def __str__(self): _POOL_IFACE = "org.storage.stratis3.pool.r0" _TIMEOUT = 120000 -# pylint: disable=invalid-name Introspectable = make_class( "Introspectable", ET.fromstring(SPECS[_INTROSPECTABLE_IFACE]), _TIMEOUT ) @@ -119,9 +118,7 @@ def _xml_object_to_str(xml_object: ET.Element) -> str: return ET.tostring(xml_object).decode("utf-8").rstrip(" \n") -def setup_minimal_object_set( - bus: dbus.SystemBus, -) -> dict[ProxyType, ProxyObject]: +def setup_minimal_object_set(bus: dbus.SystemBus) -> dict[ProxyType, ProxyObject]: """ Set up the minimal set of objects to be introspected on. @@ -131,19 +128,17 @@ def setup_minimal_object_set( """ proxy = bus.get_object(_SERVICE, "/org/storage/stratis3", introspect=False) - ( - (_, (pool_object_path, dev_object_paths)), - return_code, - return_msg, - ) = Manager.Methods.CreatePool( - proxy, - { - "name": "pool_name", - "redundancy": (True, 0), - "devices": ["/fake/fake"], - "key_desc": (False, ""), - "clevis_info": (False, ("", "")), - }, + ((_, (pool_object_path, dev_object_paths)), return_code, return_msg) = ( + Manager.Methods.CreatePool( + proxy, + { + "name": "pool_name", + "redundancy": (True, 0), + "devices": ["/fake/fake"], + "key_desc": (False, ""), + "clevis_info": (False, ("", "")), + }, + ) ) if return_code != 0: @@ -153,15 +148,8 @@ def setup_minimal_object_set( blockdev_proxy = bus.get_object(_SERVICE, dev_object_paths[0], introspect=False) - ( - (_, (filesystems)), - return_code, - return_msg, - ) = Pool.Methods.CreateFilesystems( - pool_proxy, - { - "specs": [("fs_name", (False, ""))], - }, + ((_, (filesystems)), return_code, return_msg) = Pool.Methods.CreateFilesystems( + pool_proxy, {"specs": [("fs_name", (False, ""))]} ) if return_code != 0: @@ -227,18 +215,11 @@ def _add_data(proxy_key: ProxyType, interfaces: Sequence[str]): _add_data(ProxyType.MANAGER, [OBJECT_MANAGER_INTERFACE]) - _add_data( - ProxyType.MANAGER, - get_current_interfaces(TOP_OBJECT_INTERFACE_PREFIXES), - ) - _add_data( - ProxyType.POOL, - get_current_interfaces(POOL_OBJECT_INTERFACE_PREFIXES), - ) + _add_data(ProxyType.MANAGER, get_current_interfaces(TOP_OBJECT_INTERFACE_PREFIXES)) + _add_data(ProxyType.POOL, get_current_interfaces(POOL_OBJECT_INTERFACE_PREFIXES)) _add_data( - ProxyType.BLOCKDEV, - get_current_interfaces(BLOCKDEV_OBJECT_INTERFACE_PREFIXES), + ProxyType.BLOCKDEV, get_current_interfaces(BLOCKDEV_OBJECT_INTERFACE_PREFIXES) ) _add_data( ProxyType.FILESYSTEM, diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..7876c1c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,13 @@ +[tool.ruff] +target-version = "py312" +line-length = 88 + +[tool.ruff.lint] +select = ["PL"] + +[tool.ruff.lint.isort] +known-first-party = ["dbus_python_client_gen"] +split-on-trailing-comma = false + +[tool.ruff.format] +skip-magic-trailing-comma = true diff --git a/release_management/_utils.py b/release_management/_utils.py index a8d5c6c..ff46420 100755 --- a/release_management/_utils.py +++ b/release_management/_utils.py @@ -101,7 +101,7 @@ def edit_specfile( if release is not None: spec.release = release if sources is not None: - with spec.sources() as entries: # pylint: disable=not-context-manager + with spec.sources() as entries: for index, value in enumerate(sources): entries[index].location = value if arbitrary is not None: @@ -154,7 +154,7 @@ def get_package_info(manifest_abs_path, package_name) -> tuple[Version, Any]: package = metadata["package"] assert package["name"] == package_name, ( - f'package name in Cargo.toml ({package["name"]}) != specified' + f"package name in Cargo.toml ({package['name']}) != specified" f"package name ({package_name})" ) github_repo = urlparse(package["repository"].rstrip("/")) @@ -188,8 +188,7 @@ def set_tag(tag, message): """ if not verify_tag(tag): subprocess.run( - ["git", "tag", "--annotate", tag, f'--message="{message}"'], - check=True, + ["git", "tag", "--annotate", tag, f"--message={message}"], check=True ) @@ -230,10 +229,7 @@ def create_release( repo = git.get_repo(repository.path.strip("/")) release = repo.create_git_release( - tag, - f"Version {release_version}", - f"See {changelog_url}", - draft=True, + tag, f"Version {release_version}", f"See {changelog_url}", draft=True ) for asset in [] if additional_assets is None else additional_assets: @@ -339,7 +335,7 @@ def get_changelog_url(repository_url, branch): """ changelog_url = f"{repository_url}/blob/{branch}/CHANGES.txt" requests_var = requests.get(changelog_url, timeout=30) - if requests_var.status_code != 200: + if requests_var.status_code != requests.codes.ok: raise RuntimeError(f"Page at URL {changelog_url} not found") return changelog_url diff --git a/release_management/create_artifacts.py b/release_management/create_artifacts.py index b8a0248..4165df7 100755 --- a/release_management/create_artifacts.py +++ b/release_management/create_artifacts.py @@ -133,11 +133,7 @@ def _stratisd_artifacts(namespace): ) print(os.path.relpath(source_tarfile_path)) - vendor_tarfile_name = vendor( - manifest_abs_path, - release_version, - filterer=filtered, - ) + vendor_tarfile_name = vendor(manifest_abs_path, release_version, filterer=filtered) vendor_tarfile_path = os.path.join(output_path, vendor_tarfile_name) @@ -171,11 +167,7 @@ def _stratis_cli_artifacts(namespace): source_version, pre=namespace.pre_release, post=namespace.post_release ) - source_tarfile = make_source_tarball( - "stratis-cli", - release_version, - output_path, - ) + source_tarfile = make_source_tarball("stratis-cli", release_version, output_path) def remove_stratisd_requires(spec): """ @@ -207,6 +199,6 @@ def remove_stratisd_requires(spec): if __name__ == "__main__": try: main() - except Exception as err: # pylint: disable=broad-except + except Exception as err: print(err) sys.exit(1) diff --git a/release_management/create_release.py b/release_management/create_release.py index 3693665..e8514d3 100755 --- a/release_management/create_release.py +++ b/release_management/create_release.py @@ -64,9 +64,7 @@ def print_message(*args, **kwargs): return print_message return patch( - to_patch_str, - return_value=None, - side_effect=side_effect(to_patch_str), + to_patch_str, return_value=None, side_effect=side_effect(to_patch_str) ) def func(name, closure, *, skip=False): @@ -94,10 +92,7 @@ def _push_tag(repository_url, tag): :param str repository_url: the repo to push to :param str tag: the tag to push """ - subprocess.run( - ["git", "push", repository_url, "tag", tag], - check=True, - ) + subprocess.run(["git", "push", repository_url, "tag", tag], check=True) class RustCrates: @@ -189,13 +184,7 @@ def tag_rust_library(namespace, name): try: subprocess.run( - [ - "cargo", - "package", - "--manifest-path", - MANIFEST_PATH, - ], - check=True, + ["cargo", "package", "--manifest-path", MANIFEST_PATH], check=True ) finally: subprocess.run(["cargo", "clean"], check=True) @@ -204,9 +193,7 @@ def tag_rust_library(namespace, name): if not namespace.no_vendor: filtered = namespace.vendor_method == "filtered" vendor_tarfile_name = vendor( - manifest_abs_path, - ReleaseVersion(release_version), - filterer=filtered, + manifest_abs_path, ReleaseVersion(release_version), filterer=filtered ) subprocess.run( ["sha256sum", os.path.abspath(vendor_tarfile_name)], check=True @@ -244,12 +231,11 @@ def tag_rust_library(namespace, name): skip=namespace.no_github_release, ) - # pylint: disable=unnecessary-lambda # The lambda is necessary in order to prevent the interpreter from # resolving _publish before the mock method is put into place. dry_run_caller( "__main__.RustCrates._publish", - lambda: RustCrates._publish(), + lambda: RustCrates._publish(), # noqa: PLW0108 skip=namespace.no_publish, ) @@ -339,10 +325,7 @@ def tag_python_library(namespace, name): def _create_rust_subcommands(subparsers): RustCrates.set_up_subcommand( - "stratisd", - subparsers, - add_github_release_option=True, - add_vendor_option=True, + "stratisd", subparsers, add_github_release_option=True, add_vendor_option=True ) RustCrates.set_up_subcommand( @@ -356,22 +339,13 @@ def _create_rust_subcommands(subparsers): "devicemapper-sys", subparsers, subcmd_aliases=["devicemapper-rs-sys"] ) - RustCrates.set_up_subcommand( - "libcryptsetup-rs", - subparsers, - ) + RustCrates.set_up_subcommand("libcryptsetup-rs", subparsers) - RustCrates.set_up_subcommand( - "libcryptsetup-rs-sys", - subparsers, - ) + RustCrates.set_up_subcommand("libcryptsetup-rs-sys", subparsers) RustCrates.set_up_subcommand("libblkid-rs", subparsers) - RustCrates.set_up_subcommand( - "libblkid-rs-sys", - subparsers, - ) + RustCrates.set_up_subcommand("libblkid-rs-sys", subparsers) RustCrates.set_up_subcommand("stratisd_proc_macros", subparsers)