aboutsummaryrefslogtreecommitdiff
path: root/check_upstream.py
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2018-12-04 11:08:16 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2018-12-04 11:08:16 -0500
commitf6eb0f96fec2a124333381c6a80ccd4f27290a7d (patch)
tree1dc20385009169baac43a31212d9dfd5ed2b6dde /check_upstream.py
parent3767b4566c124f0b7ac15352b0614d8ef94f23d1 (diff)
downloadwheeblast-f6eb0f96fec2a124333381c6a80ccd4f27290a7d.tar.gz
Semi-initial commitHEADmaster
Diffstat (limited to 'check_upstream.py')
-rwxr-xr-xcheck_upstream.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/check_upstream.py b/check_upstream.py
new file mode 100755
index 0000000..116c17f
--- /dev/null
+++ b/check_upstream.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+import argparse
+import os
+import re
+import requests
+import sys
+
+
+SERVER_ROOT = 'https://bytesalad.stsci.edu/artifactory/api/pypi'
+DEFAULT_REPO = 'datb-pypi'
+EXTS = ['.tar.gz', '.whl']
+NAME_RE = re.compile(r'([0-9A-Za-z_\.]+)-(.*)\.(whl|tar\.gz)')
+# Match: ^Package_Name_^ ^Ver^ ^Ext______^
+
+def check_name(name):
+ if NAME_RE.match(name):
+ return True
+ return False
+
+
+def make_status(status, s):
+ return f'[{status:^7s}]: {s}'
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--repo', default=DEFAULT_REPO,
+ help='Named pypi repository')
+ parser.add_argument('--verbose', action='store_true')
+ parser.add_argument('package')
+ args = parser.parse_args()
+
+ repo = args.repo
+ package = os.path.basename(args.package)
+ package_local = os.path.abspath(args.package)
+ pkg_temp = package
+
+ if not os.path.exists(package_local):
+ print(f'Local file does exist: {package_local}', file=sys.stderr)
+ exit(2)
+
+ if not check_name(package):
+ print(f'Non-conformant Python package: "{package}"', file=sys.stderr)
+ exit(3)
+
+ # Drop file extensions
+ for ext in EXTS:
+ pkg_temp = pkg_temp.replace(ext, '')
+
+ # Extract name and version data
+ name, version = pkg_temp.split('-', 1)
+
+ # "Sanitize" data so URLs function correctly
+ name = name.replace('_', '-') # '-' and '_' exist; only '-' is discoverable
+ version = version.split('-', 1)[0] # Drop components of wheel package names
+
+ # Construct upstream URL
+ url = '/'.join([SERVER_ROOT, repo,
+ 'packages', name,
+ version, package])
+
+ # Check upstream headers
+ with requests.head(url) as header:
+ if not header.ok and 'X-Checksum-Md5' not in header.headers:
+ if args.verbose:
+ print(make_status('MISSING', url), file=sys.stderr)
+ print(os.path.abspath(args.package))
+ exit(1)
+
+ if args.verbose:
+ print(make_status('OK', url), file=sys.stderr)
+ exit(0)