Skip to content

Commit

Permalink
Merge pull request #29 from arcivanov/issue_28
Browse files Browse the repository at this point in the history
Fix timezone constant reference in Python 3.8
  • Loading branch information
arcivanov authored Apr 20, 2024
2 parents a12d507 + 4cddf87 commit a2d684c
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 34 deletions.
1 change: 1 addition & 0 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

use_plugin("python.core")
use_plugin("python.unittest")
use_plugin("python.integrationtest")
use_plugin("python.flake8")
use_plugin("python.coverage")
use_plugin("python.distutils")
Expand Down
17 changes: 17 additions & 0 deletions src/integrationtest/python/smoke_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import unittest
import sys


class SmokeTest(unittest.TestCase):
def test_smoke(self):
import pypi_cleanup
old_args = list(sys.argv)
try:
sys.argv = ["pypi-cleanup", "--query-only", "-p", "pypi-cleanup"]
self.assertFalse(pypi_cleanup.main())
finally:
sys.argv = old_args


if __name__ == '__main__':
unittest.main()
82 changes: 48 additions & 34 deletions src/main/python/pypi_cleanup/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def handle_endtag(self, tag):


class PypiCleanup:
def __init__(self, url, username, package, do_it, patterns, verbose, days, **_):
def __init__(self, url, username, package, do_it, patterns, verbose, days, query_only, **_):
self.url = urlparse(url).geturl()
if self.url[-1] == "/":
self.url = self.url[:-1]
Expand All @@ -80,7 +80,8 @@ def __init__(self, url, username, package, do_it, patterns, verbose, days, **_):
self.package = package
self.patterns = patterns or DEFAULT_PATTERNS
self.verbose = verbose
self.date = datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=days)
self.query_only = query_only
self.date = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=days)

def run(self):
csrf = None
Expand Down Expand Up @@ -124,9 +125,12 @@ def run(self):
if not pkg_vers:
logging.info(f"No releases were found matching specified patterns "
f"and dates in package {self.package!r}")
return
else:
logging.info("Found the following releases to delete:")
for pkg_ver in pkg_vers:
logging.info(f" {pkg_ver}")

if set(pkg_vers) == set(releases_by_date.keys()):
if pkg_vers and set(pkg_vers) == set(releases_by_date.keys()):
print(dedent(f"""
WARNING:
\tYou have selected the following patterns: {self.patterns}
Expand All @@ -139,9 +143,12 @@ def run(self):
if not self.do_it:
return 3

logging.info("Found the following releases to delete:")
for pkg_ver in pkg_vers:
logging.info(f" {pkg_ver}")
if self.query_only:
logging.info("Query-only mode - exiting")
return

if not pkg_vers:
return

password = os.getenv("PYPI_CLEANUP_PASSWORD")

Expand Down Expand Up @@ -242,33 +249,40 @@ def run(self):
def main():
logging.basicConfig(level=logging.INFO)

parser = argparse.ArgumentParser(description="PyPi Package Cleanup Utility",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-u", "--username", help="authentication username")
parser.add_argument("-p", "--package", required=True, help="PyPI package name")
parser.add_argument("-t", "--host", default="https://pypi.org/", dest="url", help="PyPI <proto>://<host> prefix")
parser.add_argument("-r", "--version-regex", type=re.compile, action="append",
dest="patterns", help="regex to use to match package versions to be deleted")
parser.add_argument("--do-it", action="store_true", default=False, help="actually perform the destructive delete")
parser.add_argument("-y", "--yes", action="store_true", default=False, dest="confirm",
help="confirm extremely dangerous destructive delete")
parser.add_argument("-d", "--days", type=int, default=0,
help="only delete releases where all files are older than X days")
parser.add_argument("-v", "--verbose", action="store_const", const=1, default=0, help="be verbose")

args = parser.parse_args()
if args.patterns and not args.confirm and not args.do_it:
logging.warning(dedent(f"""
WARNING:
\tYou're using custom patterns: {args.patterns}.
\tIf you make a mistake in your patterns you can potentially wipe critical versions irrecoverably.
\tMake sure to test your patterns before running the destructive cleanup.
\tOnce you're satisfied the patterns are correct re-run with `-y`/`--yes` to confirm you know what you're doing.
\tGoodbye.
\t"""))
return 3

return PypiCleanup(**vars(args)).run()
try:
parser = argparse.ArgumentParser(description="PyPi Package Cleanup Utility",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-u", "--username", help="authentication username")
parser.add_argument("-p", "--package", required=True, help="PyPI package name")
parser.add_argument("-t", "--host", default="https://pypi.org/", dest="url",
help="PyPI <proto>://<host> prefix")
parser.add_argument("-r", "--version-regex", type=re.compile, action="append",
dest="patterns", help="regex to use to match package versions to be deleted")
parser.add_argument("--query-only", action="store_true", default=False,
help="only queries and processes the package, no login required")
parser.add_argument("--do-it", action="store_true", default=False,
help="actually perform the destructive delete")
parser.add_argument("-y", "--yes", action="store_true", default=False, dest="confirm",
help="confirm extremely dangerous destructive delete")
parser.add_argument("-d", "--days", type=int, default=0,
help="only delete releases where all files are older than X days")
parser.add_argument("-v", "--verbose", action="store_const", const=1, default=0, help="be verbose")

args = parser.parse_args()
if args.patterns and not args.confirm and not args.do_it:
logging.warning(dedent(f"""
WARNING:
\tYou're using custom patterns: {args.patterns}.
\tIf you make a mistake in your patterns you can potentially wipe critical versions irrecoverably.
\tMake sure to test your patterns before running the destructive cleanup.
\tOnce you're satisfied the patterns are correct re-run with `-y`/`--yes` to confirm you know what you're doing.
\tGoodbye.
\t"""))
return 3

return PypiCleanup(**vars(args)).run()
finally:
logging.shutdown()


if __name__ == "__main__":
Expand Down

0 comments on commit a2d684c

Please sign in to comment.