summary refs log tree commit diff
path: root/pkgs/development/tools/poetry2nix/poetry2nix/hooks/python-requires-patch-hook.py
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/poetry2nix/poetry2nix/hooks/python-requires-patch-hook.py')
-rw-r--r--pkgs/development/tools/poetry2nix/poetry2nix/hooks/python-requires-patch-hook.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/pkgs/development/tools/poetry2nix/poetry2nix/hooks/python-requires-patch-hook.py b/pkgs/development/tools/poetry2nix/poetry2nix/hooks/python-requires-patch-hook.py
new file mode 100644
index 00000000000..bf3a8d1bd3a
--- /dev/null
+++ b/pkgs/development/tools/poetry2nix/poetry2nix/hooks/python-requires-patch-hook.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+import ast
+import sys
+import io
+
+
+# Python2 compat
+if sys.version_info[0] < 3:
+    FileNotFoundError = IOError
+
+
+# Python <= 3.8 compat
+def astunparse(tree):
+    # Use bundled unparse by default
+    if hasattr(ast, "unparse"):
+        return ast.unparse(tree)
+
+    # Use example tool from Python sources for older interpreter versions
+    from poetry2nix_astunparse import Unparser
+
+    buf = io.StringIO()
+    up = Unparser(tree, buf)
+
+    return buf.getvalue()
+
+
+class Rewriter(ast.NodeVisitor):
+    def __init__(self, *args, **kwargs):
+        super(Rewriter, self).__init__(*args, **kwargs)
+        self.modified = False
+
+    def visit_Call(self, node):
+        function_name = ""
+
+        if isinstance(node.func, ast.Name):
+            function_name = node.func.id
+        elif isinstance(node.func, ast.Attribute):
+            function_name = node.func.attr
+        else:
+            return
+
+        if function_name != "setup":
+            return
+
+        for kw in node.keywords:
+            if kw.arg != "python_requires":
+                continue
+
+            value = kw.value
+            if not isinstance(value, ast.Constant):
+                return
+
+            # Rewrite version constraints without wildcard characters.
+            #
+            # Only rewrite the file if the modified value actually differs, as we lose whitespace and comments when rewriting
+            # with the AST module.
+            python_requires = ", ".join(
+                [v.strip().rstrip(".*") for v in value.value.split(",")]
+            )
+            if value.value != python_requires:
+                value.value = python_requires
+                self.modified = True
+
+
+if __name__ == "__main__":
+    sys.path.extend(sys.argv[1:])
+
+    try:
+        with open("setup.py") as f:
+            tree = ast.parse(f.read())
+    except FileNotFoundError:
+        exit(0)
+
+    r = Rewriter()
+    r.visit(tree)
+
+    if r.modified:
+        with open("setup.py", "w") as f:
+            f.write(astunparse(tree))