Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pyproject-metadata for
openSUSE:Factory checked in at 2023-08-23 14:56:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pyproject-metadata (Old)
and /work/SRC/openSUSE:Factory/.python-pyproject-metadata.new.1766 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyproject-metadata"
Wed Aug 23 14:56:47 2023 rev:4 rq:1105265 version:0.7.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-pyproject-metadata/python-pyproject-metadata.changes
2023-04-22 21:58:32.840530189 +0200
+++
/work/SRC/openSUSE:Factory/.python-pyproject-metadata.new.1766/python-pyproject-metadata.changes
2023-08-23 14:56:56.813918569 +0200
@@ -1,0 +2,7 @@
+Thu Aug 17 12:49:35 UTC 2023 - Markéta Machová <[email protected]>
+
+- update to 0.7.1
+ * Use UTF-8 when opening files
+ * Use tomllib on Python >= 3.11
+
+-------------------------------------------------------------------
Old:
----
python-pyproject-metadata-0.6.1.tar.gz
New:
----
python-pyproject-metadata-0.7.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pyproject-metadata.spec ++++++
--- /var/tmp/diff_new_pack.RyrEqI/_old 2023-08-23 14:56:57.549919884 +0200
+++ /var/tmp/diff_new_pack.RyrEqI/_new 2023-08-23 14:56:57.553919892 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-pyproject-metadata
-Version: 0.6.1
+Version: 0.7.1
Release: 0
Summary: PEP 621 metadata parsing
License: MIT
@@ -35,7 +35,9 @@
BuildArch: noarch
# SECTION test
BuildRequires: %{python_module pytest}
+%if 0%{python_version_nodots} < 311
BuildRequires: %{python_module tomli >= 1.0.0}
+%endif
# /SECTION
%python_subpackages
@@ -60,9 +62,7 @@
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
-# https://github.com/FFY00/python-pyproject-metadata/issues/41
-donttest="(test_load and PEP and 508 and definitely)"
-%pytest -k "not ($donttest)"
+%pytest
%files %{python_files}
%license LICENSE
++++++ python-pyproject-metadata-0.6.1.tar.gz ->
python-pyproject-metadata-0.7.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-pyproject-metadata-0.6.1/.github/workflows/tests.yml
new/python-pyproject-metadata-0.7.1/.github/workflows/tests.yml
--- old/python-pyproject-metadata-0.6.1/.github/workflows/tests.yml
2022-07-07 01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/.github/workflows/tests.yml
2023-01-30 20:31:16.000000000 +0100
@@ -10,16 +10,19 @@
jobs:
pytest:
- runs-on: ubuntu-latest
+ runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
+ os:
+ - 'windows-latest'
+ - 'ubuntu-latest'
python:
- '3.7'
- '3.8'
- '3.9'
- '3.10'
- - '3.11-dev'
+ - '3.11'
steps:
- name: Checkout
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-pyproject-metadata-0.6.1/.pre-commit-config.yaml
new/python-pyproject-metadata-0.7.1/.pre-commit-config.yaml
--- old/python-pyproject-metadata-0.6.1/.pre-commit-config.yaml 2022-07-07
01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/.pre-commit-config.yaml 2023-01-30
20:31:16.000000000 +0100
@@ -4,7 +4,7 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.3.0
+ rev: v4.4.0
hooks:
- id: check-ast
- id: check-builtin-literals
@@ -17,11 +17,11 @@
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/PyCQA/isort
- rev: 5.10.1
+ rev: 5.11.4
hooks:
- id: isort
- repo: https://github.com/PyCQA/flake8
- rev: 4.0.1
+ rev: 6.0.0
hooks:
- id: flake8
language_version: python3.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-pyproject-metadata-0.6.1/CHANGELOG.rst
new/python-pyproject-metadata-0.7.1/CHANGELOG.rst
--- old/python-pyproject-metadata-0.6.1/CHANGELOG.rst 2022-07-07
01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/CHANGELOG.rst 2023-01-30
20:31:16.000000000 +0100
@@ -3,6 +3,19 @@
+++++++++
+0.7.1 (30-01-2023)
+==================
+
+- Relax ``pypa/packaging`` dependency
+
+
+0.7.0 (18-01-2023)
+==================
+
+- Use UTF-8 when opening files
+- Use ``tomllib`` on Python >= 3.11
+
+
0.6.1 (07-07-2022)
==================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-pyproject-metadata-0.6.1/README.md
new/python-pyproject-metadata-0.7.1/README.md
--- old/python-pyproject-metadata-0.6.1/README.md 2022-07-07
01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/README.md 2023-01-30
20:31:16.000000000 +0100
@@ -23,7 +23,7 @@
you can use it as a library in your scripts and programs:
```python
-from ptproject_metadata import StandardMetadata
+from pyproject_metadata import StandardMetadata
parsed_pyproject = { ... } # you can use parsers like `tomli` to obtain this
dict
metadata = StandardMetadata.from_pyproject(parsed_pyproject)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-pyproject-metadata-0.6.1/pyproject_metadata/__init__.py
new/python-pyproject-metadata-0.7.1/pyproject_metadata/__init__.py
--- old/python-pyproject-metadata-0.6.1/pyproject_metadata/__init__.py
2022-07-07 01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/pyproject_metadata/__init__.py
2023-01-30 20:31:16.000000000 +0100
@@ -10,39 +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 packaging.markers
import packaging.requirements
+import packaging.specifiers
import packaging.version
-__version__ = '0.6.1'
+__version__ = '0.7.1'
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:
@@ -86,7 +84,7 @@
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):
@@ -99,7 +97,7 @@
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):
@@ -119,7 +117,7 @@
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):
@@ -139,7 +137,7 @@
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 (
@@ -166,34 +164,34 @@
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[packaging.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)
- 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: packaging.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)
+ 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()
@@ -203,7 +201,7 @@
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)
@@ -310,14 +308,14 @@
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
@@ -338,7 +336,7 @@
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
@@ -350,7 +348,7 @@
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')
@@ -367,20 +365,20 @@
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):
@@ -431,19 +429,19 @@
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[packaging.requirements.Requirement]:
+ def _get_dependencies(fetcher: DataFetcher) ->
list[packaging.requirements.Requirement]:
try:
requirement_strings = fetcher.get_list('project.dependencies')
except KeyError:
return []
- requirements: List[packaging.requirements.Requirement] = []
+ requirements: list[packaging.requirements.Requirement] = []
for req in requirement_strings:
try:
requirements.append(packaging.requirements.Requirement(req))
@@ -455,13 +453,13 @@
return requirements
@staticmethod
- def _get_optional_dependencies(fetcher: DataFetcher) -> Dict[str,
List[packaging.requirements.Requirement]]:
+ def _get_optional_dependencies(fetcher: DataFetcher) -> dict[str,
list[packaging.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: collections.defaultdict[str,
list[packaging.requirements.Requirement]] = collections.defaultdict(list)
if not isinstance(val, dict):
raise ConfigurationError(
'Field `project.optional-dependencies` has an invalid type,
expecting a '
@@ -490,7 +488,7 @@
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:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-pyproject-metadata-0.6.1/setup.cfg
new/python-pyproject-metadata-0.7.1/setup.cfg
--- old/python-pyproject-metadata-0.6.1/setup.cfg 2022-07-07
01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/setup.cfg 2023-01-30
20:31:16.000000000 +0100
@@ -1,6 +1,6 @@
[metadata]
name = pyproject-metadata
-version = 0.6.1
+version = 0.7.1
description = PEP 621 metadata parsing
long_description = file: README.md
long_description_content_type = text/markdown
@@ -34,14 +34,15 @@
test =
pytest>=6.2.4
pytest-cov>=2
- tomli>=1.0.0
+ tomli>=1.0.0;python_version<"3.11"
docs =
furo>=2020.11.19b18
sphinx~=3.0
sphinx-autodoc-typehints>=1.10.0
+ Jinja2<3.1 # https://github.com/readthedocs/readthedocs.org/issues/9038
[flake8]
-max-line-length = 127
+max-line-length = 129
max-complexity = 10
extend-ignore = E203
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-pyproject-metadata-0.6.1/tests/packages/full-metadata/README.md
new/python-pyproject-metadata-0.7.1/tests/packages/full-metadata/README.md
--- old/python-pyproject-metadata-0.6.1/tests/packages/full-metadata/README.md
2022-07-07 01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/tests/packages/full-metadata/README.md
2023-01-30 20:31:16.000000000 +0100
@@ -1 +1 @@
-some readme
+some readme ð
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-pyproject-metadata-0.6.1/tests/packages/full-metadata2/LICENSE
new/python-pyproject-metadata-0.7.1/tests/packages/full-metadata2/LICENSE
--- old/python-pyproject-metadata-0.6.1/tests/packages/full-metadata2/LICENSE
2022-07-07 01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/tests/packages/full-metadata2/LICENSE
2023-01-30 20:31:16.000000000 +0100
@@ -1 +1 @@
-Some license!
+Some license! ð
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-pyproject-metadata-0.6.1/tests/packages/full-metadata2/README.rst
new/python-pyproject-metadata-0.7.1/tests/packages/full-metadata2/README.rst
---
old/python-pyproject-metadata-0.6.1/tests/packages/full-metadata2/README.rst
2022-07-07 01:47:51.000000000 +0200
+++
new/python-pyproject-metadata-0.7.1/tests/packages/full-metadata2/README.rst
2023-01-30 20:31:16.000000000 +0100
@@ -1 +1 @@
-some readme
+some readme ð
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-pyproject-metadata-0.6.1/tests/test_standard_metadata.py
new/python-pyproject-metadata-0.7.1/tests/test_standard_metadata.py
--- old/python-pyproject-metadata-0.6.1/tests/test_standard_metadata.py
2022-07-07 01:47:51.000000000 +0200
+++ new/python-pyproject-metadata-0.7.1/tests/test_standard_metadata.py
2023-01-30 20:31:16.000000000 +0100
@@ -7,7 +7,12 @@
import packaging.specifiers
import packaging.version
import pytest
-import tomli
+
+
+try:
+ import tomllib
+except ImportError:
+ import tomli as tomllib
import pyproject_metadata
@@ -231,7 +236,6 @@
(
'Field `project.dependencies` contains an invalid PEP 508
requirement '
'string `definitely not a valid PEP 508 requirement!` '
- '(`Parse error at "\'not a va\'": Expected string_end`)'
),
),
# optional-dependencies
@@ -284,7 +288,6 @@
(
'Field `project.optional-dependencies.test` contains an
invalid '
'PEP 508 requirement string `definitely not a valid PEP 508
requirement!` '
- '(`Parse error at "\'not a va\'": Expected string_end`)'
),
),
# requires-python
@@ -478,12 +481,12 @@
)
def test_load(package, data, error):
with pytest.raises(pyproject_metadata.ConfigurationError,
match=re.escape(error)):
- pyproject_metadata.StandardMetadata.from_pyproject(tomli.loads(data))
+ pyproject_metadata.StandardMetadata.from_pyproject(tomllib.loads(data))
def test_value(package):
with open('pyproject.toml', 'rb') as f:
- metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomli.load(f))
+ metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomllib.load(f))
assert metadata.dynamic == []
assert metadata.name == 'full-metadata'
@@ -492,7 +495,7 @@
assert metadata.license.file is None
assert metadata.license.text == 'some license text'
assert metadata.readme.file == pathlib.Path('README.md')
- assert metadata.readme.text == pathlib.Path('README.md').read_text()
+ assert metadata.readme.text ==
pathlib.Path('README.md').read_text(encoding='utf-8')
assert metadata.readme.content_type == 'text/markdown'
assert metadata.description == 'A package with all the metadata :)'
assert metadata.authors == [
@@ -541,10 +544,10 @@
def test_read_license(package2):
with open('pyproject.toml', 'rb') as f:
- metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomli.load(f))
+ metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomllib.load(f))
assert metadata.license.file == pathlib.Path('LICENSE')
- assert metadata.license.text == 'Some license!\n'
+ assert metadata.license.text == 'Some license! ð\n'
@pytest.mark.parametrize(
@@ -556,7 +559,7 @@
)
def test_readme_content_type(package, content_type):
with cd_package(package), open('pyproject.toml', 'rb') as f:
- metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomli.load(f))
+ metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomllib.load(f))
assert metadata.readme.content_type == content_type
@@ -566,12 +569,12 @@
pyproject_metadata.ConfigurationError,
match=re.escape('Could not infer content type for readme file
`README.just-made-this-up-now`'),
), open('pyproject.toml', 'rb') as f:
- pyproject_metadata.StandardMetadata.from_pyproject(tomli.load(f))
+ pyproject_metadata.StandardMetadata.from_pyproject(tomllib.load(f))
def test_as_rfc822(package):
with open('pyproject.toml', 'rb') as f:
- metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomli.load(f))
+ metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomllib.load(f))
core_metadata = metadata.as_rfc822()
assert core_metadata.headers == {
'Metadata-Version': ['2.1'],
@@ -609,12 +612,12 @@
],
'Description-Content-Type': ['text/markdown'],
}
- assert core_metadata.body == 'some readme\n'
+ assert core_metadata.body == 'some readme ð\n'
def test_as_rfc822_dynamic(package_dynamic_description):
with open('pyproject.toml', 'rb') as f:
- metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomli.load(f))
+ metadata =
pyproject_metadata.StandardMetadata.from_pyproject(tomllib.load(f))
core_metadata = metadata.as_rfc822()
assert dict(core_metadata.headers) == {
'Metadata-Version': ['2.2'],