From d51380b84d2e43f63aab73241306f189f1ca2885 Mon Sep 17 00:00:00 2001 From: John Vandenberg Date: Sat, 12 Sep 2020 19:21:34 +0700 Subject: [PATCH] Update remote of local only If --local and --remote used, do not refresh PyPI remote data for any stale records which were not found in local data. --- .../management/commands/refresh_packages.py | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/package_monitor/management/commands/refresh_packages.py b/package_monitor/management/commands/refresh_packages.py index eff7236..69be50f 100644 --- a/package_monitor/management/commands/refresh_packages.py +++ b/package_monitor/management/commands/refresh_packages.py @@ -18,31 +18,41 @@ logger = getLogger(__name__) -def create_package_version(requirement: Requirement) -> None: +def create_package_version(requirement: Requirement) -> PackageVersion: """Create a new PackageVersion from a requirement. Handles errors.""" try: - PackageVersion(requirement=requirement).save() + pv = PackageVersion(requirement=requirement).save() logger.info("Package '%s' added.", requirement.name) # noqa except IntegrityError: logger.info("Package '%s' already exists.", requirement.name) # noqa + pv = PackageVersion.objects.get(package_name=requirement.name) + return pv -def local() -> None: +def local() -> List[PackageVersion]: """Load local requirements file.""" logger.info("Loading requirements from local file.") + packages = [] with open(REQUIREMENTS_FILE, "r") as f: requirements = parse(f) for r in requirements: logger.debug("Creating new package: %r", r) - create_package_version(r) + pv = create_package_version(r) + packages.append(pv) + return packages -def remote() -> Dict[str, List]: + +def remote(packages: List[PackageVersion] = None) -> Dict[str, List]: """Update package info from PyPI.""" logger.info("Fetching latest data from PyPI.") results = defaultdict(list) - packages = PackageVersion.objects.exclude(is_editable=True) - for pv in packages: + if not packages: + packages = PackageVersion.objects.exclude(is_editable=True) + for pv in packages: # type: ignore + if pv.is_editable: + logger.debug("Skipping editable package from PyPI: %r", pv) + continue pv.update_from_pypi() results[pv.diff_status].append(pv) logger.debug("Updated package from PyPI: %r", pv) @@ -102,11 +112,12 @@ def handle(self, *args: Any, **options: Any) -> None: if options["clean"]: clean() + packages = [] if options["local"]: - local() + packages = local() if options["remote"]: - results = remote() + results = remote(packages) if options["notify"]: send_mail( options["subject"],