Cleanup, flake8

This commit is contained in:
Michal Sojka 2024-09-15 10:41:08 +02:00
parent 83e07c9ea1
commit caae29d852
3 changed files with 50 additions and 39 deletions

4
.flake8 Normal file
View file

@ -0,0 +1,4 @@
[flake8]
max-line-length = 80
extend-select = B950
extend-ignore = E203,E501,E701

View file

@ -80,6 +80,8 @@
pkgs.bashInteractive pkgs.bashInteractive
pkgs.superflore pkgs.superflore
pkgs.python3Packages.rosdep pkgs.python3Packages.rosdep
pkgs.python3Packages.flake8
pkgs.python3Packages.flake8-bugbear
]; ];
ROSDEP_SOURCE_PATH = "${rosdistro}/rosdep/sources.list.d"; ROSDEP_SOURCE_PATH = "${rosdistro}/rosdep/sources.list.d";
ROSDISTRO_INDEX_URL = "file://${rosdistro}/index-v4.yaml"; ROSDISTRO_INDEX_URL = "file://${rosdistro}/index-v4.yaml";

View file

@ -3,51 +3,46 @@
# Copyright 2019-2024 Ben Wolsieffer <benwolsieffer@gmail.com> # Copyright 2019-2024 Ben Wolsieffer <benwolsieffer@gmail.com>
# Copyright 2024 Michal Sojka <michal.sojka@cvut.cz> # Copyright 2024 Michal Sojka <michal.sojka@cvut.cz>
import os from .nix_expression import NixExpression, NixLicense
import argparse
import itertools
import subprocess
from textwrap import dedent, indent
from catkin_pkg.package import parse_package_string, Package from catkin_pkg.package import parse_package_string, Package
from rosinstall_generator.distro import get_distro
from superflore.PackageMetadata import PackageMetadata
from superflore.exceptions import UnresolvedDependency from superflore.exceptions import UnresolvedDependency
from superflore.generators.nix.nix_package import NixPackage from superflore.generators.nix.nix_package import NixPackage
from .nix_expression import NixExpression, NixLicense from superflore.utils import err, ok, warn
from superflore.utils import (download_file, get_distro_condition_context, from superflore.utils import resolve_dep
get_distros, get_pkg_version, info, resolve_dep, from textwrap import dedent
retry_on_exception, warn) from typing import Iterable, Set
from typing import Dict, Iterable, Set, reveal_type import argparse
from superflore.utils import err import itertools
from superflore.utils import ok
from superflore.utils import warn
import urllib.parse
import re
import json import json
import os
import re
import subprocess
def resolve_dependencies(deps: Iterable[str]) -> Set[str]: def resolve_dependencies(deps: Iterable[str]) -> Set[str]:
return set(itertools.chain.from_iterable( return set(itertools.chain.from_iterable(map(resolve_dependency, deps)))
map(resolve_dependency, deps)))
def resolve_dependency(d: str) -> Iterable[str]: def resolve_dependency(d: str) -> Iterable[str]:
try: try:
# Try resolving as system dependency via rosdep # Try resolving as system dependency via rosdep
return resolve_dep(d, 'nix')[0] return resolve_dep(d, "nix")[0]
except UnresolvedDependency: except UnresolvedDependency:
# Assume ROS or 3rd-party package # Assume ROS or 3rd-party package
return (NixPackage.normalize_name(d),) return (NixPackage.normalize_name(d),)
# Adapted from rosdistro.dependency_walker.DependencyWalker._get_dependencies() # Adapted from rosdistro.dependency_walker.DependencyWalker._get_dependencies()
def get_dependencies_as_set(pkg, dep_type): def get_dependencies_as_set(pkg, dep_type):
deps = { deps = {
'build': pkg.build_depends, "build": pkg.build_depends,
'buildtool': pkg.buildtool_depends, "buildtool": pkg.buildtool_depends,
'build_export': pkg.build_export_depends, "build_export": pkg.build_export_depends,
'buildtool_export': pkg.buildtool_export_depends, "buildtool_export": pkg.buildtool_export_depends,
'exec': pkg.exec_depends, "exec": pkg.exec_depends,
'run': pkg.run_depends, "run": pkg.run_depends,
'test': pkg.test_depends, "test": pkg.test_depends,
'doc': pkg.doc_depends, "doc": pkg.doc_depends,
} }
return set([d.name for d in deps[dep_type] if d.evaluated_condition is not False]) return set([d.name for d in deps[dep_type] if d.evaluated_condition is not False])
@ -62,14 +57,20 @@ def get_output_file_name(source: str, pkg: Package, args):
dir = args.output_dir if args.output_dir is not None else os.path.dirname(source) dir = args.output_dir if args.output_dir is not None else os.path.dirname(source)
return os.path.join(dir, fn) return os.path.join(dir, fn)
def generate_overlay(expressions: dict[str, str], args): def generate_overlay(expressions: dict[str, str], args):
with open(f'{args.output_dir or "."}/overlay.nix', "w") as f: with open(f'{args.output_dir or "."}/overlay.nix', "w") as f:
print("self: super:\n{", file=f) print("self: super:\n{", file=f)
for pkg in sorted(expressions): for pkg in sorted(expressions):
expr = expressions[pkg] if args.output_dir is None else f"./{os.path.basename(expressions[pkg])}" expr = (
expressions[pkg]
if args.output_dir is None
else f"./{os.path.basename(expressions[pkg])}"
)
print(f" {pkg} = super.callPackage {expr} {{}};", file=f) print(f" {pkg} = super.callPackage {expr} {{}};", file=f)
print("}", file=f) print("}", file=f)
def generate_default(args): def generate_default(args):
with open(f'{args.output_dir or "."}/default.nix', "w") as f: with open(f'{args.output_dir or "."}/default.nix', "w") as f:
f.write('''{ f.write('''{
@ -92,14 +93,18 @@ import nix-ros-overlay {
} }
''') ''')
def generate_flake(args): def generate_flake(args):
with open(f'{args.output_dir or "."}/flake.nix', "w") as f: with open(f'{args.output_dir or "."}/flake.nix', "w") as f:
f.write(''' f.write('''
TODO TODO
''') ''')
def ros2nix(args): def ros2nix(args):
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument("source", nargs="+", help="Path to package.xml") parser.add_argument("source", nargs="+", help="Path to package.xml")
group = parser.add_mutually_exclusive_group() group = parser.add_mutually_exclusive_group()
@ -239,21 +244,19 @@ def ros2nix(args):
build_inputs=build_inputs, build_inputs=build_inputs,
propagated_build_inputs=propagated_build_inputs, propagated_build_inputs=propagated_build_inputs,
check_inputs=check_inputs, check_inputs=check_inputs,
native_build_inputs=native_build_inputs, **kwargs) native_build_inputs=native_build_inputs,
**kwargs,
)
except Exception as e: except Exception as e:
err('Failed to generate derivation for package {}!'.format(pkg)) err('Failed to prepare Nix expression for package {}!'.format(pkg))
raise e raise e
try: try:
derivation_text = derivation.get_text(args.copyright_holder, args.license) derivation_text = derivation.get_text(args.copyright_holder, args.license)
except UnresolvedDependency: except UnresolvedDependency as e:
err("'Failed to resolve required dependencies for package {}!" err(f"Failed to resolve required dependencies for package {pkg}!")
.format(pkg)) raise e
unresolved = unresolved_dependencies
for dep in unresolved:
err(" unresolved: \"{}\"".format(dep))
return None, unresolved, None
except Exception as e: except Exception as e:
err('Failed to generate derivation for package {}!'.format(pkg)) err('Failed to generate derivation for package {}!'.format(pkg))
raise e raise e
@ -280,9 +283,11 @@ def ros2nix(args):
else: else:
generate_default(args) generate_default(args)
def main(): def main():
import sys import sys
ros2nix(sys.argv[1:]) ros2nix(sys.argv[1:])
if __name__ == '__main__': if __name__ == '__main__':
main() main()