@@ -175,6 +175,7 @@ class StubMetadata:
175175 distribution : Annotated [str , "The name of the distribution on PyPI" ]
176176 version_spec : Annotated [Specifier , "Upstream versions that the stubs are compatible with" ]
177177 dependencies : Annotated [list [Requirement ], "The parsed dependencies as listed in METADATA.toml" ]
178+ optional_dependencies : Annotated [list [Requirement ], "The parsed optional dependencies as listed in METADATA.toml" ]
178179 extra_description : str | None
179180 stub_distribution : Annotated [str , "The name under which the distribution is uploaded to PyPI" ]
180181 upstream_repository : Annotated [str , "The URL of the upstream repository" ] | None
@@ -189,11 +190,20 @@ class StubMetadata:
189190 def is_obsolete (self ) -> bool :
190191 return self .obsolete is not None
191192
193+ @property
194+ def all_dependencies (self ) -> list [Requirement ]:
195+ """The dependencies and optional dependencies of this stubs package.
196+
197+ Does not include the stubtest dependencies.
198+ """
199+ return self .dependencies + self .optional_dependencies
200+
192201
193202_KNOWN_METADATA_FIELDS : Final = frozenset (
194203 {
195204 "version" ,
196205 "dependencies" ,
206+ "optional-dependencies" ,
197207 "extra-description" ,
198208 "stub-distribution" ,
199209 "upstream-repository" ,
@@ -264,6 +274,10 @@ def read_metadata(distribution: str) -> StubMetadata:
264274 assert isinstance (dependencies_s , list )
265275 dependencies = [parse_dependencies (distribution , dep ) for dep in dependencies_s ]
266276
277+ optional_dependencies_s = data .get ("optional-dependencies" , [])
278+ assert isinstance (optional_dependencies_s , list )
279+ optional_dependencies = [parse_dependencies (distribution , dep ) for dep in optional_dependencies_s ]
280+
267281 extra_description = data .get ("extra-description" )
268282 assert isinstance (extra_description , (str , type (None )))
269283
@@ -342,6 +356,7 @@ def read_metadata(distribution: str) -> StubMetadata:
342356 distribution = distribution ,
343357 version_spec = version_spec ,
344358 dependencies = dependencies ,
359+ optional_dependencies = optional_dependencies ,
345360 extra_description = extra_description ,
346361 stub_distribution = stub_distribution ,
347362 upstream_repository = upstream_repository ,
@@ -411,7 +426,7 @@ def read_dependencies(distribution: str) -> PackageDependencies:
411426 pypi_name_to_typeshed_name_mapping = get_pypi_name_to_typeshed_name_mapping ()
412427 typeshed : list [Requirement ] = []
413428 external : list [Requirement ] = []
414- for dependency in read_metadata (distribution ).dependencies :
429+ for dependency in read_metadata (distribution ).all_dependencies :
415430 if dependency .name in pypi_name_to_typeshed_name_mapping :
416431 req = Requirement (str (dependency )) # copy the requirement
417432 req .name = pypi_name_to_typeshed_name_mapping [dependency .name ]
0 commit comments