Mini Shell
# 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
# pylint: disable-next=possibly-used-before-assignment
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)
}
Zerion Mini Shell 1.0