about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/fetch_from_legacy.py
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/fetch_from_legacy.py')
-rw-r--r--nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/fetch_from_legacy.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/fetch_from_legacy.py b/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/fetch_from_legacy.py
new file mode 100644
index 000000000000..5931d4c92708
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/fetch_from_legacy.py
@@ -0,0 +1,72 @@
+# Some repositories (such as Devpi) expose the Pypi legacy API
+# (https://warehouse.pypa.io/api-reference/legacy.html).
+#
+# Note it is not possible to use pip
+# https://discuss.python.org/t/pip-download-just-the-source-packages-no-building-no-metadata-etc/4651/12
+
+import sys
+from urllib.parse import urlparse
+from html.parser import HTMLParser
+import urllib.request
+import shutil
+import ssl
+import os
+
+
+# Parse the legacy index page to extract the href and package names
+class Pep503(HTMLParser):
+    def __init__(self):
+        super().__init__()
+        self.sources = {}
+        self.url = None
+        self.name = None
+
+    def handle_data(self, data):
+        if self.url is not None:
+            self.name = data
+
+    def handle_starttag(self, tag, attrs):
+        if tag == "a":
+            for name, value in attrs:
+                if name == "href":
+                    self.url = value
+
+    def handle_endtag(self, tag):
+        if self.url is not None:
+            self.sources[self.name] = self.url
+        self.url = None
+
+
+url = sys.argv[1]
+package_name = sys.argv[2]
+index_url = url + "/" + package_name
+package_filename = sys.argv[3]
+
+print("Reading index %s" % index_url)
+
+response = urllib.request.urlopen(
+    index_url,
+    context=ssl.CERT_NONE)
+index = response.read()
+
+parser = Pep503()
+parser.feed(str(index))
+if package_filename not in parser.sources:
+    print("The file %s has not be found in the index %s" % (
+        package_filename, index_url))
+    exit(1)
+
+package_file = open(package_filename, "wb")
+# Sometimes the href is a relative path
+if urlparse(parser.sources[package_filename]).netloc == '':
+    package_url = index_url + "/" + parser.sources[package_filename]
+else:
+    package_url = parser.sources[package_filename]
+print("Downloading %s" % package_url)
+
+response = urllib.request.urlopen(
+    package_url,
+    context=ssl.CERT_NONE)
+
+with response as r:
+    shutil.copyfileobj(r, package_file)