Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-frozenlist for openSUSE:Factory checked in at 2025-09-26 22:24:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-frozenlist (Old) and /work/SRC/openSUSE:Factory/.python-frozenlist.new.11973 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-frozenlist" Fri Sep 26 22:24:13 2025 rev:12 rq:1307100 version:1.7.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-frozenlist/python-frozenlist.changes 2025-06-10 08:57:01.834941670 +0200 +++ /work/SRC/openSUSE:Factory/.python-frozenlist.new.11973/python-frozenlist.changes 2025-09-26 22:24:52.214889913 +0200 @@ -1,0 +2,18 @@ +Thu Sep 25 11:08:56 UTC 2025 - John Paul Adrian Glaubitz <[email protected]> + +- Update to 1.7.0 + * Added deepcopy support to FrozenList + * Fixed an issue where ``frozenlist`` binary wheels would be + built with debugging symbols and line tracing enabled, which + significantly impacted performance. Line tracing is now disabled + by default and can only be enabled explicitly + - This change ensures that production builds are optimized for + performance. Developers who need line tracing for debugging + purposes can still enable it by: + 1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable + 2. Using the ``--config-setting=with-cython-tracing=true`` option with pip + * Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration + to ensure the pinned Cython version from ``requirements/cython.txt`` is + used during wheel builds. + +------------------------------------------------------------------- Old: ---- frozenlist-1.6.2.tar.gz New: ---- frozenlist-1.7.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-frozenlist.spec ++++++ --- /var/tmp/diff_new_pack.vOoTan/_old 2025-09-26 22:24:52.918919549 +0200 +++ /var/tmp/diff_new_pack.vOoTan/_new 2025-09-26 22:24:52.918919549 +0200 @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-frozenlist -Version: 1.6.2 +Version: 1.7.0 Release: 0 Summary: Python list-like structure which implements MutableSequence License: Apache-2.0 ++++++ frozenlist-1.6.2.tar.gz -> frozenlist-1.7.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/CHANGES.rst new/frozenlist-1.7.0/CHANGES.rst --- old/frozenlist-1.6.2/CHANGES.rst 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/CHANGES.rst 2025-06-10 00:33:44.000000000 +0200 @@ -14,6 +14,43 @@ .. towncrier release notes start +v1.7.0 +====== + +*(2025-06-09)* + + +Features +-------- + +- Added deepcopy support to FrozenList -- by :user:`bdraco`. + + *Related issues and pull requests on GitHub:* + :issue:`659`. + + +Packaging updates and notes for downstreams +------------------------------------------- + +- Fixed an issue where ``frozenlist`` binary wheels would be built with debugging symbols and line tracing enabled, which significantly impacted performance. Line tracing is now disabled by default and can only be enabled explicitly -- by :user:`bdraco`. + + This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by: + + 1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable + 2. Using the ``--config-setting=with-cython-tracing=true`` option with pip + + *Related issues and pull requests on GitHub:* + :issue:`660`. + +- Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration to ensure the pinned Cython version from ``requirements/cython.txt`` is used during wheel builds. + + *Related issues and pull requests on GitHub:* + :issue:`661`. + + +---- + + v1.6.2 ====== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/PKG-INFO new/frozenlist-1.7.0/PKG-INFO --- old/frozenlist-1.6.2/PKG-INFO 2025-06-03 22:04:47.825840500 +0200 +++ new/frozenlist-1.7.0/PKG-INFO 2025-06-10 00:33:52.651409000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: frozenlist -Version: 1.6.2 +Version: 1.7.0 Summary: A list-like structure which implements collections.abc.MutableSequence Home-page: https://github.com/aio-libs/frozenlist Maintainer: aiohttp team <[email protected]> @@ -161,6 +161,43 @@ .. towncrier release notes start +v1.7.0 +====== + +*(2025-06-09)* + + +Features +-------- + +- Added deepcopy support to FrozenList -- by `@bdraco <https://github.com/sponsors/bdraco>`__. + + *Related issues and pull requests on GitHub:* + `#659 <https://github.com/aio-libs/frozenlist/issues/659>`__. + + +Packaging updates and notes for downstreams +------------------------------------------- + +- Fixed an issue where ``frozenlist`` binary wheels would be built with debugging symbols and line tracing enabled, which significantly impacted performance. Line tracing is now disabled by default and can only be enabled explicitly -- by `@bdraco <https://github.com/sponsors/bdraco>`__. + + This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by: + + 1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable + 2. Using the ``--config-setting=with-cython-tracing=true`` option with pip + + *Related issues and pull requests on GitHub:* + `#660 <https://github.com/aio-libs/frozenlist/issues/660>`__. + +- Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration to ensure the pinned Cython version from ``requirements/cython.txt`` is used during wheel builds. + + *Related issues and pull requests on GitHub:* + `#661 <https://github.com/aio-libs/frozenlist/issues/661>`__. + + +---- + + v1.6.2 ====== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/docs/spelling_wordlist.txt new/frozenlist-1.7.0/docs/spelling_wordlist.txt --- old/frozenlist-1.6.2/docs/spelling_wordlist.txt 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/docs/spelling_wordlist.txt 2025-06-10 00:33:44.000000000 +0200 @@ -79,6 +79,7 @@ Cythonize de deduplicate +deepcopy # de-facto: deprecations DER diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/frozenlist/__init__.py new/frozenlist-1.7.0/frozenlist/__init__.py --- old/frozenlist-1.6.2/frozenlist/__init__.py 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/frozenlist/__init__.py 2025-06-10 00:33:44.000000000 +0200 @@ -3,7 +3,7 @@ from collections.abc import MutableSequence from functools import total_ordering -__version__ = "1.6.2" +__version__ = "1.7.0" __all__ = ("FrozenList", "PyFrozenList") # type: Tuple[str, ...] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/frozenlist/_frozenlist.pyx new/frozenlist-1.7.0/frozenlist/_frozenlist.pyx --- old/frozenlist-1.6.2/frozenlist/_frozenlist.pyx 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/frozenlist/_frozenlist.pyx 2025-06-10 00:33:44.000000000 +0200 @@ -4,6 +4,7 @@ from cpython.bool cimport PyBool_FromLong from libcpp.atomic cimport atomic +import copy import types from collections.abc import MutableSequence @@ -122,5 +123,26 @@ else: raise RuntimeError("Cannot hash unfrozen list.") + def __deepcopy__(self, memo): + cdef FrozenList new_list + obj_id = id(self) + + # Return existing copy if already processed (circular reference) + if obj_id in memo: + return memo[obj_id] + + # Create new instance and register immediately + new_list = self.__class__([]) + memo[obj_id] = new_list + + # Deep copy items + new_list._items[:] = [copy.deepcopy(item, memo) for item in self._items] + + # Preserve frozen state + if self._frozen.load(): + new_list.freeze() + + return new_list + MutableSequence.register(FrozenList) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/frozenlist.egg-info/PKG-INFO new/frozenlist-1.7.0/frozenlist.egg-info/PKG-INFO --- old/frozenlist-1.6.2/frozenlist.egg-info/PKG-INFO 2025-06-03 22:04:47.000000000 +0200 +++ new/frozenlist-1.7.0/frozenlist.egg-info/PKG-INFO 2025-06-10 00:33:52.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: frozenlist -Version: 1.6.2 +Version: 1.7.0 Summary: A list-like structure which implements collections.abc.MutableSequence Home-page: https://github.com/aio-libs/frozenlist Maintainer: aiohttp team <[email protected]> @@ -161,6 +161,43 @@ .. towncrier release notes start +v1.7.0 +====== + +*(2025-06-09)* + + +Features +-------- + +- Added deepcopy support to FrozenList -- by `@bdraco <https://github.com/sponsors/bdraco>`__. + + *Related issues and pull requests on GitHub:* + `#659 <https://github.com/aio-libs/frozenlist/issues/659>`__. + + +Packaging updates and notes for downstreams +------------------------------------------- + +- Fixed an issue where ``frozenlist`` binary wheels would be built with debugging symbols and line tracing enabled, which significantly impacted performance. Line tracing is now disabled by default and can only be enabled explicitly -- by `@bdraco <https://github.com/sponsors/bdraco>`__. + + This change ensures that production builds are optimized for performance. Developers who need line tracing for debugging purposes can still enable it by: + + 1. Setting the ``FROZENLIST_CYTHON_TRACING`` environment variable + 2. Using the ``--config-setting=with-cython-tracing=true`` option with pip + + *Related issues and pull requests on GitHub:* + `#660 <https://github.com/aio-libs/frozenlist/issues/660>`__. + +- Enabled ``PIP_CONSTRAINT`` environment variable in the build configuration to ensure the pinned Cython version from ``requirements/cython.txt`` is used during wheel builds. + + *Related issues and pull requests on GitHub:* + `#661 <https://github.com/aio-libs/frozenlist/issues/661>`__. + + +---- + + v1.6.2 ====== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/packaging/pep517_backend/_backend.py new/frozenlist-1.7.0/packaging/pep517_backend/_backend.py --- old/frozenlist-1.6.2/packaging/pep517_backend/_backend.py 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/packaging/pep517_backend/_backend.py 2025-06-10 00:33:44.000000000 +0200 @@ -291,7 +291,7 @@ with build_dir_ctx: config = _get_local_cython_config() - cythonize_args = _make_cythonize_cli_args_from_config(config) + cythonize_args = _make_cythonize_cli_args_from_config(config, cython_line_tracing_requested) with _patched_cython_env(config['env'], cython_line_tracing_requested): _cythonize_cli_cmd(cythonize_args) with patched_distutils_cmd_install(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/packaging/pep517_backend/_cython_configuration.py new/frozenlist-1.7.0/packaging/pep517_backend/_cython_configuration.py --- old/frozenlist-1.6.2/packaging/pep517_backend/_cython_configuration.py 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/packaging/pep517_backend/_cython_configuration.py 2025-06-10 00:33:44.000000000 +0200 @@ -17,10 +17,20 @@ class Config(TypedDict): env: dict[str, str] flags: dict[str, bool] - kwargs: dict[str, str] + kwargs: dict[str, str | dict[str, str]] src: list[str] +def _configure_cython_line_tracing(config_kwargs: dict[str, str | dict[str, str]], cython_line_tracing_requested: bool) -> None: + """Configure Cython line tracing directives if requested.""" + # If line tracing is requested, add it to the directives + if cython_line_tracing_requested: + directives = config_kwargs.setdefault('directive', {}) + assert isinstance(directives, dict) # Type narrowing for mypy + directives['linetrace'] = 'True' + directives['profile'] = 'True' + + def get_local_cython_config() -> Config: """Grab optional build dependencies from pyproject.toml config. @@ -78,11 +88,15 @@ return config_mapping['tool']['local']['cythonize'] # type: ignore[no-any-return] -def make_cythonize_cli_args_from_config(config: Config) -> list[str]: +def make_cythonize_cli_args_from_config(config: Config, cython_line_tracing_requested: bool = False) -> list[str]: py_ver_arg = f'-{_python_version_tuple.major!s}' cli_flags = get_enabled_cli_flags_from_config(config['flags']) - cli_kwargs = get_cli_kwargs_from_config(config['kwargs']) + + config_kwargs = config['kwargs'] + _configure_cython_line_tracing(config_kwargs, cython_line_tracing_requested) + + cli_kwargs = get_cli_kwargs_from_config(config_kwargs) return cli_flags + [py_ver_arg] + cli_kwargs + ['--'] + config['src'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/packaging/pep517_backend/_transformers.py new/frozenlist-1.7.0/packaging/pep517_backend/_transformers.py --- old/frozenlist-1.6.2/packaging/pep517_backend/_transformers.py 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/packaging/pep517_backend/_transformers.py 2025-06-10 00:33:44.000000000 +0200 @@ -16,7 +16,9 @@ yield from ("=".join(map(str, (flag_opt,) + pair)) for pair in sub_pairs) -def get_cli_kwargs_from_config(kwargs_map: Mapping[str, str]) -> List[str]: +def get_cli_kwargs_from_config( + kwargs_map: Mapping[str, Union[str, Dict[str, str]]], +) -> List[str]: """Make a list of options with values from config.""" return list(chain.from_iterable(map(_emit_opt_pairs, kwargs_map.items()))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/pyproject.toml new/frozenlist-1.7.0/pyproject.toml --- old/frozenlist-1.6.2/pyproject.toml 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/pyproject.toml 2025-06-10 00:33:44.000000000 +0200 @@ -48,7 +48,6 @@ # https://cython.rtfd.io/en/latest/src/userguide/source_files_and_compilation.html#compiler-directives embedsignature = "True" emit_code_comments = "True" -linetrace = "True" # Implies `profile=True` [tool.local.cythonize.kwargs.compile-time-env] # This section can contain compile time env vars @@ -84,7 +83,7 @@ COLOR = "yes" FORCE_COLOR = "1" MYPY_FORCE_COLOR = "1" -# PIP_CONSTRAINT = "requirements/cython.txt" +PIP_CONSTRAINT = "requirements/cython.txt" PRE_COMMIT_COLOR = "always" PY_COLORS = "1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/frozenlist-1.6.2/tests/test_frozenlist.py new/frozenlist-1.7.0/tests/test_frozenlist.py --- old/frozenlist-1.6.2/tests/test_frozenlist.py 2025-06-03 22:04:42.000000000 +0200 +++ new/frozenlist-1.7.0/tests/test_frozenlist.py 2025-06-10 00:33:44.000000000 +0200 @@ -2,6 +2,7 @@ # mypy: disable-error-code="misc" from collections.abc import MutableSequence +from copy import deepcopy import pytest @@ -248,6 +249,129 @@ _list = self.FrozenList([1, 2]) assert _list.count(1) == 1 + def test_deepcopy_unfrozen(self) -> None: + orig = self.FrozenList([1, 2, 3]) + copied = deepcopy(orig) + assert copied == orig + assert copied is not orig + assert list(copied) == list(orig) + assert not copied.frozen + # Verify the copy is mutable + copied.append(4) + assert len(copied) == 4 + assert len(orig) == 3 + + def test_deepcopy_frozen(self) -> None: + orig = self.FrozenList([1, 2, 3]) + orig.freeze() + copied = deepcopy(orig) + assert copied == orig + assert copied is not orig + assert list(copied) == list(orig) + assert copied.frozen + # Verify the copy is also frozen + with pytest.raises(RuntimeError): + copied.append(4) + + def test_deepcopy_nested(self) -> None: + inner = self.FrozenList([1, 2]) + orig = self.FrozenList([inner, 3]) + copied = deepcopy(orig) + assert copied == orig + assert copied[0] is not orig[0] + assert isinstance(copied[0], self.FrozenList) + # Modify the inner list in the copy + copied[0].append(3) + assert len(copied[0]) == 3 + assert len(orig[0]) == 2 + + def test_deepcopy_circular(self) -> None: + orig = self.FrozenList([1, 2]) + orig.append(orig) # Create circular reference + + copied = deepcopy(orig) + + # Check structure is preserved + assert len(copied) == 3 + assert copied[0] == 1 + assert copied[1] == 2 + assert copied[2] is copied # Circular reference preserved + + # Verify they are different objects + assert copied is not orig + assert copied[2] is not orig + + # Modify the copy + copied.append(3) + assert len(copied) == 4 + assert len(orig) == 3 + + def test_deepcopy_circular_frozen(self) -> None: + orig = self.FrozenList([1, 2]) + orig.append(orig) # Create circular reference + orig.freeze() + + copied = deepcopy(orig) + + # Check structure is preserved + assert len(copied) == 3 + assert copied[0] == 1 + assert copied[1] == 2 + assert copied[2] is copied # Circular reference preserved + assert copied.frozen + + # Verify frozen state + with pytest.raises(RuntimeError): + copied.append(3) + + def test_deepcopy_nested_circular(self) -> None: + # Create a complex nested structure with circular references + inner1 = self.FrozenList([1, 2]) + inner2 = self.FrozenList([3, 4]) + orig = self.FrozenList([inner1, inner2]) + + # Add circular references + inner1.append(inner2) # inner1 -> inner2 + inner2.append(orig) # inner2 -> orig (outer list) + orig.append(orig) # orig -> orig (self reference) + + copied = deepcopy(orig) + + # Verify structure + assert len(copied) == 3 + assert isinstance(copied[0], self.FrozenList) + assert isinstance(copied[1], self.FrozenList) + assert copied[2] is copied # Self reference preserved + + # Verify nested circular references + assert len(copied[0]) == 3 + assert copied[0][2] is copied[1] # inner1 -> inner2 preserved + assert len(copied[1]) == 3 + assert copied[1][2] is copied # inner2 -> orig preserved + + # All objects should be new instances + assert copied is not orig + assert copied[0] is not orig[0] + assert copied[1] is not orig[1] + + def test_deepcopy_multiple_references(self) -> None: + # Test that multiple references to the same object are preserved + shared = self.FrozenList([1, 2]) + orig = self.FrozenList([shared, shared, 3]) + + copied = deepcopy(orig) + + # Both references should point to the same copied object + assert copied[0] is copied[1] + assert copied[0] is not shared + assert isinstance(copied[0], self.FrozenList) + + # Modify through one reference + copied[0].append(3) + assert len(copied[0]) == 3 + assert len(copied[1]) == 3 # Should see the change + assert len(shared) == 2 # Original unchanged + class TestFrozenList(FrozenListMixin): FrozenList = FrozenList # type: ignore[assignment] # FIXME
