Skip to content

Commit

Permalink
feat: update vendored pyproject-metadata to 0.7.0
Browse files Browse the repository at this point in the history
  • Loading branch information
frostming committed Jan 18, 2023
1 parent 1be84a6 commit 20c5ef4
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 87 deletions.
67 changes: 34 additions & 33 deletions scripts/patches/pyproject-metadata-import.patch
Original file line number Diff line number Diff line change
@@ -1,40 +1,41 @@
diff --git a/src/pdm/backend/_vendor/pyproject_metadata/__init__.py b/src/pdm/backend/_vendor/pyproject_metadata/__init__.py
index e427699..ba33dca 100644
index 37f6708..8897c69 100644
--- a/src/pdm/backend/_vendor/pyproject_metadata/__init__.py
+++ b/src/pdm/backend/_vendor/pyproject_metadata/__init__.py
@@ -12,9 +12,10 @@ import typing

from typing import Any, DefaultDict, Dict, List, Mapping, Optional, OrderedDict, Tuple, Union
@@ -13,10 +13,10 @@ import typing
from collections.abc import Mapping
from typing import Any

-import packaging.markers
-import packaging.requirements
-import packaging.specifiers
-import packaging.version
+import pdm.backend._vendor.packaging.markers as pkg_markers
+import pdm.backend._vendor.packaging.requirements as pkg_requirements
+import pdm.backend._vendor.packaging.specifiers as pkg_specifiers
+import pdm.backend._vendor.packaging.version as pkg_version


__version__ = '0.6.1'
@@ -178,13 +179,13 @@ class Readme(typing.NamedTuple):
__version__ = '0.7.0'
@@ -176,13 +176,13 @@ class Readme(typing.NamedTuple):
@dataclasses.dataclass
class StandardMetadata():
name: str
- version: Optional[packaging.version.Version] = None
+ version: Optional[pkg_version.Version] = None
description: Optional[str] = None
license: Optional[License] = None
readme: Optional[Readme] = None
- requires_python: Optional[packaging.specifiers.SpecifierSet] = None
- dependencies: List[packaging.requirements.Requirement] = dataclasses.field(default_factory=list)
- optional_dependencies: Dict[str, List[packaging.requirements.Requirement]] = dataclasses.field(default_factory=dict)
+ requires_python: Optional[pkg_specifiers.SpecifierSet] = None
+ dependencies: List[pkg_requirements.Requirement] = dataclasses.field(default_factory=list)
+ optional_dependencies: Dict[str, List[pkg_requirements.Requirement]] = dataclasses.field(default_factory=dict)
entrypoints: Dict[str, Dict[str, str]] = dataclasses.field(default_factory=dict)
authors: List[Tuple[str, str]] = dataclasses.field(default_factory=list)
maintainers: List[Tuple[str, str]] = dataclasses.field(default_factory=list)
@@ -230,11 +231,11 @@ class StandardMetadata():
- version: packaging.version.Version | None = None
+ version: pkg_version.Version | None = None
description: str | None = None
license: License | None = None
readme: Readme | None = None
- requires_python: packaging.specifiers.SpecifierSet | None = None
- dependencies: list[packaging.requirements.Requirement] = dataclasses.field(default_factory=list)
- optional_dependencies: dict[str, list[packaging.requirements.Requirement]] = dataclasses.field(default_factory=dict)
+ requires_python: pkg_specifiers.SpecifierSet | None = None
+ dependencies: list[pkg_requirements.Requirement] = dataclasses.field(default_factory=list)
+ optional_dependencies: dict[str, list[pkg_requirements.Requirement]] = dataclasses.field(default_factory=dict)
entrypoints: dict[str, dict[str, str]] = dataclasses.field(default_factory=dict)
authors: list[tuple[str, str]] = dataclasses.field(default_factory=list)
maintainers: list[tuple[str, str]] = dataclasses.field(default_factory=list)
@@ -228,11 +228,11 @@ class StandardMetadata():

return cls(
name,
Expand All @@ -48,7 +49,7 @@ index e427699..ba33dca 100644
cls._get_dependencies(fetcher),
cls._get_optional_dependencies(fetcher),
cls._get_entrypoints(fetcher),
@@ -327,14 +328,14 @@ class StandardMetadata():
@@ -325,14 +325,14 @@ class StandardMetadata():
def _build_extra_req(
self,
extra: str,
Expand All @@ -67,19 +68,19 @@ index e427699..ba33dca 100644
return requirement

@staticmethod
@@ -437,17 +438,17 @@ class StandardMetadata():
@@ -435,17 +435,17 @@ class StandardMetadata():
return Readme(text, file, content_type)

@staticmethod
- def _get_dependencies(fetcher: DataFetcher) -> List[packaging.requirements.Requirement]:
+ def _get_dependencies(fetcher: DataFetcher) -> List[pkg_requirements.Requirement]:
- def _get_dependencies(fetcher: DataFetcher) -> list[packaging.requirements.Requirement]:
+ def _get_dependencies(fetcher: DataFetcher) -> list[pkg_requirements.Requirement]:
try:
requirement_strings = fetcher.get_list('project.dependencies')
except KeyError:
return []

- requirements: List[packaging.requirements.Requirement] = []
+ requirements: List[pkg_requirements.Requirement] = []
- requirements: list[packaging.requirements.Requirement] = []
+ requirements: list[pkg_requirements.Requirement] = []
for req in requirement_strings:
try:
- requirements.append(packaging.requirements.Requirement(req))
Expand All @@ -89,23 +90,23 @@ index e427699..ba33dca 100644
raise ConfigurationError(
'Field `project.dependencies` contains an invalid PEP 508 '
f'requirement string `{req}` (`{str(e)}`)'
@@ -455,13 +456,13 @@ class StandardMetadata():
@@ -453,13 +453,13 @@ class StandardMetadata():
return requirements

@staticmethod
- def _get_optional_dependencies(fetcher: DataFetcher) -> Dict[str, List[packaging.requirements.Requirement]]:
+ def _get_optional_dependencies(fetcher: DataFetcher) -> Dict[str, List[pkg_requirements.Requirement]]:
- def _get_optional_dependencies(fetcher: DataFetcher) -> dict[str, list[packaging.requirements.Requirement]]:
+ def _get_optional_dependencies(fetcher: DataFetcher) -> dict[str, list[pkg_requirements.Requirement]]:
try:
val = fetcher.get('project.optional-dependencies')
except KeyError:
return {}

- requirements_dict: DefaultDict[str, List[packaging.requirements.Requirement]] = collections.defaultdict(list)
+ requirements_dict: DefaultDict[str, List[pkg_requirements.Requirement]] = collections.defaultdict(list)
- requirements_dict: collections.defaultdict[str, list[packaging.requirements.Requirement]] = collections.defaultdict(list)
+ requirements_dict: collections.defaultdict[str, list[pkg_requirements.Requirement]] = collections.defaultdict(list)
if not isinstance(val, dict):
raise ConfigurationError(
'Field `project.optional-dependencies` has an invalid type, expecting a '
@@ -481,8 +482,8 @@ class StandardMetadata():
@@ -479,8 +479,8 @@ class StandardMetadata():
f'expecting a PEP 508 requirement string (got `{req}`)'
)
try:
Expand Down
99 changes: 48 additions & 51 deletions src/pdm/backend/_vendor/pyproject_metadata/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,37 @@
import re
import typing

from typing import Any, DefaultDict, Dict, List, Mapping, Optional, OrderedDict, Tuple, Union
from collections.abc import Mapping
from typing import Any

import pdm.backend._vendor.packaging.markers as pkg_markers
import pdm.backend._vendor.packaging.requirements as pkg_requirements
import pdm.backend._vendor.packaging.specifiers as pkg_specifiers
import pdm.backend._vendor.packaging.version as pkg_version


__version__ = '0.6.1'
__version__ = '0.7.0'


class ConfigurationError(Exception):
'''Error in the backend metadata.'''
def __init__(self, msg: str, *, key: Optional[str] = None):
def __init__(self, msg: str, *, key: str | None = None):
super().__init__(msg)
self._key = key

@property
def key(self) -> Optional[str]: # pragma: no cover
def key(self) -> str | None: # pragma: no cover
return self._key


class RFC822Message():
'''Simple RFC 822 message implementation.
Note: Does not support multiline fields, as Python packaging flavored
RFC 822 metadata does.
'''
'''Python-flavored RFC 822 message implementation.'''

def __init__(self) -> None:
self.headers: OrderedDict[str, List[str]] = collections.OrderedDict()
self.body: Optional[str] = None
self.headers: collections.OrderedDict[str, list[str]] = collections.OrderedDict()
self.body: str | None = None

def __setitem__(self, name: str, value: Optional[str]) -> None:
def __setitem__(self, name: str, value: str | None) -> None:
if not value:
return
if name not in self.headers:
Expand Down Expand Up @@ -87,7 +84,7 @@ def get(self, key: str) -> Any:
val = val[part]
return val

def get_str(self, key: str) -> Optional[str]:
def get_str(self, key: str) -> str | None:
try:
val = self.get(key)
if not isinstance(val, str):
Expand All @@ -100,7 +97,7 @@ def get_str(self, key: str) -> Optional[str]:
except KeyError:
return None

def get_list(self, key: str) -> List[str]:
def get_list(self, key: str) -> list[str]:
try:
val = self.get(key)
if not isinstance(val, list):
Expand All @@ -120,7 +117,7 @@ def get_list(self, key: str) -> List[str]:
except KeyError:
return []

def get_dict(self, key: str) -> Dict[str, str]:
def get_dict(self, key: str) -> dict[str, str]:
try:
val = self.get(key)
if not isinstance(val, dict):
Expand All @@ -140,7 +137,7 @@ def get_dict(self, key: str) -> Dict[str, str]:
except KeyError:
return {}

def get_people(self, key: str) -> List[Tuple[str, str]]:
def get_people(self, key: str) -> list[tuple[str, str]]:
try:
val = self.get(key)
if not (
Expand All @@ -167,34 +164,34 @@ def get_people(self, key: str) -> List[Tuple[str, str]]:

class License(typing.NamedTuple):
text: str
file: Optional[pathlib.Path]
file: pathlib.Path | None


class Readme(typing.NamedTuple):
text: str
file: Optional[pathlib.Path]
file: pathlib.Path | None
content_type: str


@dataclasses.dataclass
class StandardMetadata():
name: str
version: Optional[pkg_version.Version] = None
description: Optional[str] = None
license: Optional[License] = None
readme: Optional[Readme] = None
requires_python: Optional[pkg_specifiers.SpecifierSet] = None
dependencies: List[pkg_requirements.Requirement] = dataclasses.field(default_factory=list)
optional_dependencies: Dict[str, List[pkg_requirements.Requirement]] = dataclasses.field(default_factory=dict)
entrypoints: Dict[str, Dict[str, str]] = dataclasses.field(default_factory=dict)
authors: List[Tuple[str, str]] = dataclasses.field(default_factory=list)
maintainers: List[Tuple[str, str]] = dataclasses.field(default_factory=list)
urls: Dict[str, str] = dataclasses.field(default_factory=dict)
classifiers: List[str] = dataclasses.field(default_factory=list)
keywords: List[str] = dataclasses.field(default_factory=list)
scripts: Dict[str, str] = dataclasses.field(default_factory=dict)
gui_scripts: Dict[str, str] = dataclasses.field(default_factory=dict)
dynamic: List[str] = dataclasses.field(default_factory=list)
version: pkg_version.Version | None = None
description: str | None = None
license: License | None = None
readme: Readme | None = None
requires_python: pkg_specifiers.SpecifierSet | None = None
dependencies: list[pkg_requirements.Requirement] = dataclasses.field(default_factory=list)
optional_dependencies: dict[str, list[pkg_requirements.Requirement]] = dataclasses.field(default_factory=dict)
entrypoints: dict[str, dict[str, str]] = dataclasses.field(default_factory=dict)
authors: list[tuple[str, str]] = dataclasses.field(default_factory=list)
maintainers: list[tuple[str, str]] = dataclasses.field(default_factory=list)
urls: dict[str, str] = dataclasses.field(default_factory=dict)
classifiers: list[str] = dataclasses.field(default_factory=list)
keywords: list[str] = dataclasses.field(default_factory=list)
scripts: dict[str, str] = dataclasses.field(default_factory=dict)
gui_scripts: dict[str, str] = dataclasses.field(default_factory=dict)
dynamic: list[str] = dataclasses.field(default_factory=list)

def __post_init__(self) -> None:
self.name = re.sub(r'[-_.]+', '-', self.name).lower()
Expand All @@ -204,7 +201,7 @@ def __post_init__(self) -> None:
def from_pyproject(
cls,
data: Mapping[str, Any],
project_dir: Union[str, os.PathLike[str]] = os.path.curdir,
project_dir: str | os.PathLike[str] = os.path.curdir,
) -> StandardMetadata:
fetcher = DataFetcher(data)
project_dir = pathlib.Path(project_dir)
Expand Down Expand Up @@ -311,14 +308,14 @@ def write_to_rfc822(self, message: RFC822Message) -> None: # noqa: C901
raise ConfigurationError(f'Field cannot be dynamic: {field}')
message['Dynamic'] = field

def _name_list(self, people: List[Tuple[str, str]]) -> str:
def _name_list(self, people: list[tuple[str, str]]) -> str:
return ', '.join(
name
for name, email_ in people
if not email_
)

def _email_list(self, people: List[Tuple[str, str]]) -> str:
def _email_list(self, people: list[tuple[str, str]]) -> str:
return ', '.join([
'{}{}'.format(name, f' <{_email}>' if _email else '')
for name, _email in people
Expand All @@ -339,7 +336,7 @@ def _build_extra_req(
return requirement

@staticmethod
def _get_license(fetcher: DataFetcher, project_dir: pathlib.Path) -> Optional[License]:
def _get_license(fetcher: DataFetcher, project_dir: pathlib.Path) -> License | None:
if 'project.license' not in fetcher:
return None

Expand All @@ -351,7 +348,7 @@ def _get_license(fetcher: DataFetcher, project_dir: pathlib.Path) -> Optional[Li
key=f'project.license.{field}',
)

file: Optional[pathlib.Path] = None
file: pathlib.Path | None = None
filename = fetcher.get_str('project.license.file')
text = fetcher.get_str('project.license.text')

Expand All @@ -368,20 +365,20 @@ def _get_license(fetcher: DataFetcher, project_dir: pathlib.Path) -> Optional[Li
f'License file not found (`{filename}`)',
key='project.license.file',
)
text = file.read_text()
text = file.read_text(encoding='utf-8')

assert text is not None
return License(text, file)

@staticmethod
def _get_readme(fetcher: DataFetcher, project_dir: pathlib.Path) -> Optional[Readme]: # noqa: C901
def _get_readme(fetcher: DataFetcher, project_dir: pathlib.Path) -> Readme | None: # noqa: C901
if 'project.readme' not in fetcher:
return None

filename: Optional[str]
file: Optional[pathlib.Path] = None
text: Optional[str]
content_type: Optional[str]
filename: str | None
file: pathlib.Path | None = None
text: str | None
content_type: str | None

readme = fetcher.get('project.readme')
if isinstance(readme, str):
Expand Down Expand Up @@ -432,19 +429,19 @@ def _get_readme(fetcher: DataFetcher, project_dir: pathlib.Path) -> Optional[Rea
f'Readme file not found (`{filename}`)',
key='project.license.file',
)
text = file.read_text()
text = file.read_text(encoding='utf-8')

assert text is not None
return Readme(text, file, content_type)

@staticmethod
def _get_dependencies(fetcher: DataFetcher) -> List[pkg_requirements.Requirement]:
def _get_dependencies(fetcher: DataFetcher) -> list[pkg_requirements.Requirement]:
try:
requirement_strings = fetcher.get_list('project.dependencies')
except KeyError:
return []

requirements: List[pkg_requirements.Requirement] = []
requirements: list[pkg_requirements.Requirement] = []
for req in requirement_strings:
try:
requirements.append(pkg_requirements.Requirement(req))
Expand All @@ -456,13 +453,13 @@ def _get_dependencies(fetcher: DataFetcher) -> List[pkg_requirements.Requirement
return requirements

@staticmethod
def _get_optional_dependencies(fetcher: DataFetcher) -> Dict[str, List[pkg_requirements.Requirement]]:
def _get_optional_dependencies(fetcher: DataFetcher) -> dict[str, list[pkg_requirements.Requirement]]:
try:
val = fetcher.get('project.optional-dependencies')
except KeyError:
return {}

requirements_dict: DefaultDict[str, List[pkg_requirements.Requirement]] = collections.defaultdict(list)
requirements_dict: collections.defaultdict[str, list[pkg_requirements.Requirement]] = collections.defaultdict(list)
if not isinstance(val, dict):
raise ConfigurationError(
'Field `project.optional-dependencies` has an invalid type, expecting a '
Expand Down Expand Up @@ -491,7 +488,7 @@ def _get_optional_dependencies(fetcher: DataFetcher) -> Dict[str, List[pkg_requi
return dict(requirements_dict)

@staticmethod
def _get_entrypoints(fetcher: DataFetcher) -> Dict[str, Dict[str, str]]:
def _get_entrypoints(fetcher: DataFetcher) -> dict[str, dict[str, str]]:
try:
val = fetcher.get('project.entry-points')
except KeyError:
Expand Down
2 changes: 1 addition & 1 deletion src/pdm/backend/_vendor/vendor.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ packaging==22.0
tomli==2.0.1
tomli_w==1.0.0
validate-pyproject==0.10.1
pyproject-metadata==0.6.1
pyproject-metadata==0.7.0

0 comments on commit 20c5ef4

Please sign in to comment.