summaryrefslogtreecommitdiff
path: root/dev-python/setuptools-rust/files/setuptools-rust-1.9.0-delay-non-stdlib-imports.patch
blob: ea36c235beea651327ad6c431470918c9bfad254 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
From 06d236045b6a69c94c68f255dc683219ec833c83 Mon Sep 17 00:00:00 2001
From: Eli Schwartz <eschwartz93@gmail.com>
Date: Fri, 7 Jun 2024 00:15:26 -0400
Subject: [PATCH 1/2] Delay imports of non-stdlib dependencies until time of
 use

This is a bit of a hack, but we do this to ensure that when setuptools
loads entrypoint based hooks it cannot (will not?) crash.

The issue is that setuptools plugins are autoloaded, whether any given
project uses them at all or not. So if setuptools-rust is installed,
setuptools always tries to use it, and crashes if setuptools-rust is
broken.

Of course, setuptools-rust can't be broken, because it's a wonderful
project.

BUT.

As it happens, third-party vendors providing setuptools-rust can get
into a situation where multiple packages need to be installed, including
setuptools-rust, and also build yet other packages from source. In the
middle of this, setuptools-rust itself could be installed but in
"half-configured" state, i.e. its dependencies were queued for
afterwards due to complicated dependency graph magic.

In such a scenario, it should be nominally all right to have an inert
package installed, since if nothing actually uses setuptools-rust it
doesn't need to *work* yet. And in fact, it is all right, as long as
setuptools can import the autoloaded plugin hooks (and do nothing with
them).

Bug: https://bugs.gentoo.org/933553
Signed-off-by: Eli Schwartz <eschwartz93@gmail.com>
---
 setuptools_rust/extension.py  | 7 ++++++-
 setuptools_rust/rustc_info.py | 8 ++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/setuptools_rust/extension.py b/setuptools_rust/extension.py
index 2d6e5aa..9ba1cf5 100644
--- a/setuptools_rust/extension.py
+++ b/setuptools_rust/extension.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
 import json
 import os
 import re
@@ -14,11 +16,13 @@ from typing import (
     NewType,
     Optional,
     Sequence,
+    TYPE_CHECKING,
     Union,
     cast,
 )
 
-from semantic_version import SimpleSpec
+if TYPE_CHECKING:
+    from semantic_version import SimpleSpec
 
 from ._utils import format_called_process_error
 
@@ -185,6 +189,7 @@ class RustExtension:
         if self.rust_version is None:
             return None
         try:
+            from semantic_version import SimpleSpec
             return SimpleSpec(self.rust_version)
         except ValueError:
             raise SetupError(
diff --git a/setuptools_rust/rustc_info.py b/setuptools_rust/rustc_info.py
index 070be0c..d1d4748 100644
--- a/setuptools_rust/rustc_info.py
+++ b/setuptools_rust/rustc_info.py
@@ -1,15 +1,19 @@
+from __future__ import annotations
+
 import subprocess
 from setuptools.errors import PlatformError
 from functools import lru_cache
-from typing import Dict, List, NewType, Optional
+from typing import Dict, List, NewType, Optional, TYPE_CHECKING
 
-from semantic_version import Version
+if TYPE_CHECKING:
+    from semantic_version import Version
 
 
 def get_rust_version() -> Optional[Version]:  # type: ignore[no-any-unimported]
     try:
         # first line of rustc -Vv is something like
         # rustc 1.61.0 (fe5b13d68 2022-05-18)
+        from semantic_version import Version
         return Version(_rust_version().split(" ")[1])
     except (subprocess.CalledProcessError, OSError):
         return None
-- 
2.44.2


From a98e8a8d31d30c5d304e9ee7b48ba739946dea6f Mon Sep 17 00:00:00 2001
From: Eli Schwartz <eschwartz93@gmail.com>
Date: Fri, 7 Jun 2024 00:34:59 -0400
Subject: [PATCH 2/2] Try extra hard to pick up an existing tomli library from
 setuptools

Since setuptools-rust already depends on setuptools, it is reasonable to
assume that even if tomli isn't installed, setuptools is. And setuptools
includes a vendored copy of tomli.

If the copy in setuptools has been devendored, it will be available via
"tomli". If it isn't devendored, it will be available via
"setuptools.extern.tomli" unless setuptools changes their vendoring
approach which has lasted many years so far. Either way, we are sure to
have a fallback tomli without explicitly depending on one, which means
one less dependency to install in the common case.

Signed-off-by: Eli Schwartz <eschwartz93@gmail.com>
---
 pyproject.toml                    | 1 -
 setuptools_rust/setuptools_ext.py | 5 ++++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/pyproject.toml b/pyproject.toml
index cae0536..148d85b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -26,7 +26,6 @@ classifiers = [
 dependencies = [
     "setuptools>=62.4",
     "semantic_version>=2.8.2,<3",
-    'tomli>=1.2.1; python_version<"3.11"'
 ]
 
 [project.entry-points."distutils.commands"]
diff --git a/setuptools_rust/setuptools_ext.py b/setuptools_rust/setuptools_ext.py
index d4a0204..0ea6f58 100644
--- a/setuptools_rust/setuptools_ext.py
+++ b/setuptools_rust/setuptools_ext.py
@@ -26,7 +26,10 @@ except ImportError:
 if sys.version_info[:2] >= (3, 11):
     from tomllib import load as toml_load
 else:
-    from tomli import load as toml_load
+    try:
+        from tomli import load as toml_load
+    except ImportError:
+        from setuptools.extern.tomli import load as toml_load
 
 
 logger = logging.getLogger(__name__)
-- 
2.44.2