Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
129 lines
4.5 KiB
Python
129 lines
4.5 KiB
Python
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
# For details: https://github.com/pylint-dev/pylint/blob/main/LICENSE
|
|
# Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from pylint.testutils._primer import PackageToLint
|
|
from pylint.testutils._primer.primer_command import PrimerCommand
|
|
from pylint.testutils._primer.primer_compare_command import CompareCommand
|
|
from pylint.testutils._primer.primer_prepare_command import PrepareCommand
|
|
from pylint.testutils._primer.primer_run_command import RunCommand
|
|
|
|
|
|
class Primer:
|
|
"""Main class to handle priming of packages."""
|
|
|
|
def __init__(self, primer_directory: Path, json_path: Path) -> None:
|
|
# Preparing arguments
|
|
self.primer_directory = primer_directory
|
|
self._argument_parser = argparse.ArgumentParser(prog="Pylint Primer")
|
|
self._subparsers = self._argument_parser.add_subparsers(
|
|
dest="command", required=True
|
|
)
|
|
|
|
# All arguments for the prepare parser
|
|
prepare_parser = self._subparsers.add_parser("prepare")
|
|
prepare_parser.add_argument(
|
|
"--clone", help="Clone all packages.", action="store_true", default=False
|
|
)
|
|
prepare_parser.add_argument(
|
|
"--check",
|
|
help="Check consistencies and commits of all packages.",
|
|
action="store_true",
|
|
default=False,
|
|
)
|
|
prepare_parser.add_argument(
|
|
"--make-commit-string",
|
|
help="Get latest commit string.",
|
|
action="store_true",
|
|
default=False,
|
|
)
|
|
prepare_parser.add_argument(
|
|
"--read-commit-string",
|
|
help="Print latest commit string.",
|
|
action="store_true",
|
|
default=False,
|
|
)
|
|
|
|
# All arguments for the run parser
|
|
run_parser = self._subparsers.add_parser("run")
|
|
run_parser.add_argument(
|
|
"--type", choices=["main", "pr"], required=True, help="Type of primer run."
|
|
)
|
|
run_parser.add_argument(
|
|
"--batches",
|
|
required=False,
|
|
type=int,
|
|
help="Number of batches",
|
|
)
|
|
run_parser.add_argument(
|
|
"--batchIdx",
|
|
required=False,
|
|
type=int,
|
|
help="Portion of primer packages to run.",
|
|
)
|
|
|
|
# All arguments for the compare parser
|
|
compare_parser = self._subparsers.add_parser("compare")
|
|
compare_parser.add_argument(
|
|
"--base-file",
|
|
required=True,
|
|
help="Location of output file of the base run.",
|
|
)
|
|
compare_parser.add_argument(
|
|
"--new-file",
|
|
required=True,
|
|
help="Location of output file of the new run.",
|
|
)
|
|
compare_parser.add_argument(
|
|
"--commit",
|
|
required=True,
|
|
help="Commit hash of the PR commit being checked.",
|
|
)
|
|
compare_parser.add_argument(
|
|
"--batches",
|
|
required=False,
|
|
type=int,
|
|
help="Number of batches (filepaths with the placeholder BATCHIDX will be numbered)",
|
|
)
|
|
|
|
# Storing arguments
|
|
self.config = self._argument_parser.parse_args()
|
|
|
|
self.packages = self._get_packages_to_lint_from_json(json_path)
|
|
"""All packages to prime."""
|
|
|
|
if self.config.command == "prepare":
|
|
command_class: type[PrimerCommand] = PrepareCommand
|
|
elif self.config.command == "run":
|
|
command_class = RunCommand
|
|
elif self.config.command == "compare":
|
|
command_class = CompareCommand
|
|
self.command = command_class(self.primer_directory, self.packages, self.config)
|
|
|
|
def run(self) -> None:
|
|
self.command.run()
|
|
|
|
@staticmethod
|
|
def _minimum_python_supported(package_data: dict[str, str]) -> bool:
|
|
min_python_str = package_data.get("minimum_python", None)
|
|
if not min_python_str:
|
|
return True
|
|
min_python_tuple = tuple(int(n) for n in min_python_str.split("."))
|
|
return min_python_tuple <= sys.version_info[:2]
|
|
|
|
@staticmethod
|
|
def _get_packages_to_lint_from_json(json_path: Path) -> dict[str, PackageToLint]:
|
|
with open(json_path, encoding="utf8") as f:
|
|
return {
|
|
name: PackageToLint(**package_data)
|
|
for name, package_data in json.load(f).items()
|
|
if Primer._minimum_python_supported(package_data)
|
|
}
|