1
1
from abc import ABC , abstractmethod
2
+ from distutils import log
2
3
from distutils .cmd import Command
3
4
from distutils .errors import DistutilsPlatformError
4
- from typing import List
5
+ from typing import List , Optional
5
6
6
7
from setuptools .dist import Distribution
7
8
@@ -21,14 +22,34 @@ def initialize_options(self) -> None:
21
22
self .extensions : List [RustExtension ] = []
22
23
23
24
def finalize_options (self ) -> None :
24
- self .extensions = [
25
- ext
26
- for ext in self .distribution .rust_extensions # type: ignore[attr-defined]
27
- if isinstance (ext , RustExtension )
28
- ]
25
+ extensions : Optional [List [RustExtension ]] = getattr (
26
+ self .distribution , "rust_extensions" , None
27
+ )
28
+ if extensions is None :
29
+ # extensions is None if the setup.py file did not contain
30
+ # rust_extensions keyword; just no-op if this is the case.
31
+ return
32
+
33
+ if not isinstance (extensions , list ):
34
+ ty = type (extensions )
35
+ raise ValueError (
36
+ "expected list of RustExtension objects for rust_extensions "
37
+ f"argument to setup(), got `{ ty } `"
38
+ )
39
+ for (i , extension ) in enumerate (extensions ):
40
+
41
+ if not isinstance (extension , RustExtension ):
42
+ ty = type (extension )
43
+ raise ValueError (
44
+ "expected RustExtension object for rust_extensions "
45
+ f"argument to setup(), got `{ ty } ` at position { i } "
46
+ )
47
+ # Extensions have been verified to be at the correct type
48
+ self .extensions = extensions
29
49
30
50
def run (self ) -> None :
31
51
if not self .extensions :
52
+ log .info ("%s: no rust_extensions defined" , self .get_command_name ())
32
53
return
33
54
34
55
all_optional = all (ext .optional for ext in self .extensions )
0 commit comments