Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-ufoLib2 for openSUSE:Factory 
checked in at 2026-03-10 17:56:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-ufoLib2 (Old)
 and      /work/SRC/openSUSE:Factory/.python-ufoLib2.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-ufoLib2"

Tue Mar 10 17:56:51 2026 rev:13 rq:1337909 version:0.18.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-ufoLib2/python-ufoLib2.changes    
2025-04-20 20:08:23.474176772 +0200
+++ /work/SRC/openSUSE:Factory/.python-ufoLib2.new.8177/python-ufoLib2.changes  
2026-03-10 18:01:16.071234428 +0100
@@ -1,0 +2,12 @@
+Tue Mar 10 08:25:36 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 0.18.1:
+  * Ignore temporary directory cleanup errors
+- update to 0.18.0:
+  * Housekeeping
+  * Fix typo in width class label
+  * Drop support for EOL Python 3.8, update requirements
+  * don't import fs module, replace tempfs with
+    tempfile.TemporaryDir
+
+-------------------------------------------------------------------

Old:
----
  ufolib2-0.17.1.tar.gz

New:
----
  ufolib2-0.18.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-ufoLib2.spec ++++++
--- /var/tmp/diff_new_pack.Y6wjY6/_old  2026-03-10 18:01:16.859266828 +0100
+++ /var/tmp/diff_new_pack.Y6wjY6/_new  2026-03-10 18:01:16.859266828 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-ufoLib2
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-ufoLib2
-Version:        0.17.1
+Version:        0.18.1
 Release:        0
 Summary:        UFO font processing library
 License:        Apache-2.0

++++++ ufolib2-0.17.1.tar.gz -> ufolib2-0.18.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/.github/workflows/ci.yml 
new/ufolib2-0.18.1/.github/workflows/ci.yml
--- old/ufolib2-0.17.1/.github/workflows/ci.yml 2025-01-21 13:30:04.000000000 
+0100
+++ new/ufolib2-0.18.1/.github/workflows/ci.yml 2025-07-10 13:40:29.000000000 
+0200
@@ -14,7 +14,7 @@
     steps:
       - uses: actions/checkout@v4
       - name: Set up Python
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: "3.x"
       - name: Lint
@@ -28,7 +28,7 @@
     steps:
       - uses: actions/checkout@v4
       - name: Set up Python
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: "3.x"
       - name: Lint
@@ -40,13 +40,13 @@
     runs-on: ${{ matrix.platform }}
     strategy:
       matrix:
-        python-version: ["3.8", "3.13"]
+        python-version: ["3.9", "3.13"]
         platform: [ubuntu-latest, windows-latest]
 
     steps:
       - uses: actions/checkout@v4
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: ${{ matrix.python-version }}
       - name: Install packages
@@ -86,7 +86,7 @@
     steps:
       - uses: actions/checkout@v4
       - name: Set up Python
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: "3.x"
       - name: Install dependencies
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/PKG-INFO new/ufolib2-0.18.1/PKG-INFO
--- old/ufolib2-0.17.1/PKG-INFO 2025-01-21 13:30:19.916452600 +0100
+++ new/ufolib2-0.18.1/PKG-INFO 2025-07-10 13:40:38.755456700 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 2.2
+Metadata-Version: 2.4
 Name: ufoLib2
-Version: 0.17.1
+Version: 0.18.1
 Summary: ufoLib2 is a UFO font processing library.
 Author-email: Adrien Tétar <[email protected]>
 License: Apache 2.0
@@ -12,21 +12,22 @@
 Classifier: Intended Audience :: End Users/Desktop
 Classifier: Topic :: Text Processing :: Fonts
 Classifier: License :: OSI Approved :: Apache Software License
-Requires-Python: >=3.8
+Requires-Python: >=3.9
 Description-Content-Type: text/markdown
 License-File: LICENSE
 Requires-Dist: attrs>=22.1.0
-Requires-Dist: fonttools[ufo]>=4.0.0
+Requires-Dist: fonttools[ufo]>=4.58.0
 Provides-Extra: lxml
 Requires-Dist: lxml; extra == "lxml"
 Provides-Extra: converters
-Requires-Dist: cattrs>=24.1; extra == "converters"
+Requires-Dist: cattrs>=25.1.1; extra == "converters"
 Provides-Extra: json
-Requires-Dist: cattrs>=24.1; extra == "json"
+Requires-Dist: cattrs>=25.1.1; extra == "json"
 Requires-Dist: orjson; platform_python_implementation != "PyPy" and extra == 
"json"
 Provides-Extra: msgpack
-Requires-Dist: cattrs>=24.1; extra == "msgpack"
+Requires-Dist: cattrs>=25.1.1; extra == "msgpack"
 Requires-Dist: msgpack; extra == "msgpack"
+Dynamic: license-file
 
 # ufoLib2
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/pyproject.toml 
new/ufolib2-0.18.1/pyproject.toml
--- old/ufolib2-0.17.1/pyproject.toml   2025-01-21 13:30:04.000000000 +0100
+++ new/ufolib2-0.18.1/pyproject.toml   2025-07-10 13:40:29.000000000 +0200
@@ -17,8 +17,8 @@
     "License :: OSI Approved :: Apache Software License",
 ]
 urls = { Homepage = "https://github.com/fonttools/ufoLib2"; }
-requires-python = ">=3.8"
-dependencies = ["attrs >= 22.1.0", "fonttools[ufo] >= 4.0.0"]
+requires-python = ">=3.9"
+dependencies = ["attrs >= 22.1.0", "fonttools[ufo] >= 4.58.0"]
 dynamic = ["version"]
 
 [project.readme]
@@ -27,9 +27,9 @@
 
 [project.optional-dependencies]
 lxml = ["lxml"]
-converters = ["cattrs >= 24.1"]
-json = ["cattrs >= 24.1", "orjson ; platform_python_implementation != 'PyPy'"]
-msgpack = ["cattrs >= 24.1", "msgpack"]
+converters = ["cattrs >= 25.1.1"]
+json = ["cattrs >= 25.1.1", "orjson ; platform_python_implementation != 
'PyPy'"]
+msgpack = ["cattrs >= 25.1.1", "msgpack"]
 
 [tool.setuptools]
 package-dir = { "" = "src" }
@@ -48,7 +48,7 @@
 write_to = "src/ufoLib2/_version.py"
 
 [tool.black]
-target-version = ["py38"]
+target-version = ["py39"]
 
 [tool.isort]
 multi_line_output = 3
@@ -67,7 +67,7 @@
 ]
 
 [tool.mypy]
-python_version = "3.8"
+python_version = "3.9"
 disallow_incomplete_defs = true
 no_implicit_optional = true
 strict_optional = true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/requirements-dev.txt 
new/ufolib2-0.18.1/requirements-dev.txt
--- old/ufolib2-0.17.1/requirements-dev.txt     2025-01-21 13:30:04.000000000 
+0100
+++ new/ufolib2-0.18.1/requirements-dev.txt     2025-07-10 13:40:29.000000000 
+0200
@@ -1,52 +1,63 @@
 # This file was autogenerated by uv via the following command:
-#    uv pip compile --python 3.8 requirements-dev.in
-black==24.8.0
+#    uv pip compile --universal --python 3.9 requirements-dev.in
+black==25.1.0
     # via -r requirements-dev.in
-click==8.1.7
+click==8.1.8 ; python_full_version < '3.10'
     # via black
-coverage==7.6.1
+click==8.2.1 ; python_full_version >= '3.10'
+    # via black
+colorama==0.4.6 ; sys_platform == 'win32'
+    # via
+    #   click
+    #   pytest
+coverage==7.9.2
     # via -r requirements-dev.in
-exceptiongroup==1.2.2
+exceptiongroup==1.3.0 ; python_full_version < '3.11'
     # via
     #   -c requirements.txt
     #   pytest
-flake8==7.1.1
+flake8==7.3.0
     # via -r requirements-dev.in
-iniconfig==2.0.0
+iniconfig==2.1.0
     # via pytest
-isort==5.13.2
+isort==6.0.1
     # via -r requirements-dev.in
 mccabe==0.7.0
     # via flake8
-mypy==1.13.0
+mypy==1.16.1
     # via -r requirements-dev.in
-mypy-extensions==1.0.0
+mypy-extensions==1.1.0
     # via
     #   black
     #   mypy
-packaging==24.1
+packaging==25.0
     # via
     #   black
     #   pytest
 pathspec==0.12.1
+    # via
+    #   black
+    #   mypy
+platformdirs==4.3.8
     # via black
-platformdirs==4.3.6
-    # via black
-pluggy==1.5.0
+pluggy==1.6.0
     # via pytest
-pycodestyle==2.12.1
+pycodestyle==2.14.0
     # via flake8
-pyflakes==3.2.0
+pyflakes==3.4.0
     # via flake8
-pytest==8.3.3
+pygments==2.19.2
+    # via pytest
+pytest==8.4.1
     # via -r requirements-dev.in
-tomli==2.0.2
+tomli==2.2.1 ; python_full_version < '3.11'
     # via
     #   black
     #   mypy
     #   pytest
-typing-extensions==4.12.2
+typing-extensions==4.14.1
     # via
     #   -c requirements.txt
     #   black
+    #   exceptiongroup
     #   mypy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/requirements.txt 
new/ufolib2-0.18.1/requirements.txt
--- old/ufolib2-0.17.1/requirements.txt 2025-01-21 13:30:04.000000000 +0100
+++ new/ufolib2-0.18.1/requirements.txt 2025-07-10 13:40:29.000000000 +0200
@@ -1,28 +1,30 @@
 # This file was autogenerated by uv via the following command:
-#    uv pip compile --all-extras --python 3.8 pyproject.toml
+#    uv pip compile --all-extras --universal --python 3.9 pyproject.toml
 appdirs==1.4.4
     # via fs
-attrs==24.2.0
+attrs==25.3.0
     # via
     #   ufolib2 (pyproject.toml)
     #   cattrs
-cattrs==24.1.2
+cattrs==25.1.1
     # via ufolib2 (pyproject.toml)
-exceptiongroup==1.2.2
+exceptiongroup==1.3.0 ; python_full_version < '3.11'
     # via cattrs
-fonttools==4.54.1
+fonttools==4.58.5
     # via ufolib2 (pyproject.toml)
 fs==2.4.16
     # via fonttools
-lxml==5.3.0
+lxml==6.0.0
     # via ufolib2 (pyproject.toml)
-msgpack==1.1.0
+msgpack==1.1.1
     # via ufolib2 (pyproject.toml)
-orjson==3.10.10
+orjson==3.10.18 ; platform_python_implementation != 'PyPy'
     # via ufolib2 (pyproject.toml)
-setuptools==75.3.0
+setuptools==80.9.0
     # via fs
-six==1.16.0
+six==1.17.0
     # via fs
-typing-extensions==4.12.2
-    # via cattrs
+typing-extensions==4.14.1
+    # via
+    #   cattrs
+    #   exceptiongroup
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/src/ufoLib2/_version.py 
new/ufolib2-0.18.1/src/ufoLib2/_version.py
--- old/ufolib2-0.17.1/src/ufoLib2/_version.py  2025-01-21 13:30:19.000000000 
+0100
+++ new/ufolib2-0.18.1/src/ufoLib2/_version.py  2025-07-10 13:40:38.000000000 
+0200
@@ -1,8 +1,13 @@
-# file generated by setuptools_scm
+# file generated by setuptools-scm
 # don't change, don't track in version control
+
+__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
+
 TYPE_CHECKING = False
 if TYPE_CHECKING:
-    from typing import Tuple, Union
+    from typing import Tuple
+    from typing import Union
+
     VERSION_TUPLE = Tuple[Union[int, str], ...]
 else:
     VERSION_TUPLE = object
@@ -12,5 +17,5 @@
 __version_tuple__: VERSION_TUPLE
 version_tuple: VERSION_TUPLE
 
-__version__ = version = '0.17.1'
-__version_tuple__ = version_tuple = (0, 17, 1)
+__version__ = version = '0.18.1'
+__version_tuple__ = version_tuple = (0, 18, 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/src/ufoLib2/objects/font.py 
new/ufolib2-0.18.1/src/ufoLib2/objects/font.py
--- old/ufolib2-0.17.1/src/ufoLib2/objects/font.py      2025-01-21 
13:30:04.000000000 +0100
+++ new/ufolib2-0.18.1/src/ufoLib2/objects/font.py      2025-07-10 
13:40:29.000000000 +0200
@@ -2,6 +2,8 @@
 
 import os
 import shutil
+import sys
+import tempfile
 from typing import (
     Any,
     Dict,
@@ -16,8 +18,6 @@
     cast,
 )
 
-import fs.base
-import fs.tempfs
 from attrs import define, field
 from fontTools.ufoLib import UFOFileStructure, UFOReader, UFOWriter
 
@@ -48,7 +48,7 @@
     _setstate_attrs,
 )
 from ufoLib2.serde import serde
-from ufoLib2.typing import HasIdentifier, PathLike, T
+from ufoLib2.typing import PATH_TYPES, HasIdentifier, PathLike, T
 
 
 def _convert_LayerSet(value: LayerSet | Iterable[Layer]) -> LayerSet:
@@ -532,7 +532,7 @@
 
     def save(
         self,
-        path: PathLike | fs.base.FS | None = None,
+        path: PathLike | None = None,
         formatVersion: int = 3,
         structure: UFOFileStructure | None = None,
         overwrite: bool = False,
@@ -541,9 +541,8 @@
         """Saves the font to ``path``.
 
         Args:
-            path: The target path. If it is None, the path from the last save 
(except
-                when that was a ``fs.base.FS``) or when the font was first 
opened will
-                be used.
+            path: The target path. If it is None, the path from the last save 
or when
+                the font was first opened will be used.
             formatVersion: The version to save the UFO as. Only version 3 is 
supported
                 currently.
             structure (fontTools.ufoLib.UFOFileStructure): How to store the 
UFO.
@@ -567,8 +566,8 @@
             structure = self._fileStructure
 
         # Normalize path unless we're given a fs.base.FS, which we pass to 
UFOWriter.
-        if path is not None and not isinstance(path, fs.base.FS):
-            path = os.path.normpath(os.fspath(path))
+        if path is not None and isinstance(path, PATH_TYPES):
+            path = os.fsdecode(os.path.normpath(os.fspath(path)))
 
         overwritePath = tmp = None
 
@@ -577,8 +576,11 @@
             if isinstance(path, str) and os.path.exists(path):
                 if overwrite:
                     overwritePath = path
-                    tmp = fs.tempfs.TempFS()
-                    path = tmp.getsyspath(os.path.basename(path))
+                    if sys.version_info < (3, 10):
+                        tmp = tempfile.TemporaryDirectory()
+                    else:
+                        tmp = 
tempfile.TemporaryDirectory(ignore_cleanup_errors=True)
+                    path = os.path.join(tmp.name, os.path.basename(path))
                 else:
                     import errno
 
@@ -608,12 +610,15 @@
         finally:
             # clean up the temporary directory
             if tmp is not None:
-                tmp.close()
+                try:
+                    tmp.cleanup()
+                except PermissionError:
+                    pass
 
         # Only remember path if it isn't a fs.base.FS because not all FS 
objects are
         # OsFS with a corresponding filesystem path. E.g. think about MemoryFS.
         # If you want, you can call getsyspath("") method of OsFS object and 
set that to
         # self._path. But you then have to catch the fs.errors.NoSysPath and 
skip if
         # the FS object does not implement a filesystem path.
-        if not isinstance(path, fs.base.FS):
+        if isinstance(path, str):
             self._path = path
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/src/ufoLib2/objects/info/__init__.py 
new/ufolib2-0.18.1/src/ufoLib2/objects/info/__init__.py
--- old/ufolib2-0.17.1/src/ufoLib2/objects/info/__init__.py     2025-01-21 
13:30:04.000000000 +0100
+++ new/ufolib2-0.18.1/src/ufoLib2/objects/info/__init__.py     2025-07-10 
13:40:29.000000000 +0200
@@ -93,7 +93,7 @@
 
 class WidthClass(IntEnum):
     ULTRA_CONDENSED = 1
-    EXTRA_CONDESED = 2
+    EXTRA_CONDENSED = 2
     CONDENSED = 3
     SEMI_CONDENSED = 4
     NORMAL = 5  # alias for WidthClass.MEDIUM
@@ -138,7 +138,7 @@
 
 
 def _convert_WoffMetadataExtensions(
-    values: Sequence[WoffMetadataExtension | Mapping[str, Any]] | None
+    values: Sequence[WoffMetadataExtension | Mapping[str, Any]] | None,
 ) -> list[WoffMetadataExtension] | None:
     return _convert_optional_list_of_dicts(WoffMetadataExtension, values)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/src/ufoLib2/serde/util.py 
new/ufolib2-0.18.1/src/ufoLib2/serde/util.py
--- old/ufolib2-0.17.1/src/ufoLib2/serde/util.py        2025-01-21 
13:30:04.000000000 +0100
+++ new/ufolib2-0.18.1/src/ufoLib2/serde/util.py        2025-07-10 
13:40:29.000000000 +0200
@@ -10,7 +10,7 @@
         fp = cast(BinaryIO, fp)
         return fp.read()
     else:
-        fp = cast(PathLike, fp)
+        fp = cast(PathLike, fp)  # type: ignore
         with open(fp, "rb") as f:
             return f.read()
 
@@ -20,6 +20,6 @@
         fp = cast(BinaryIO, fp)
         fp.write(data)
     else:
-        fp = cast(PathLike, fp)
+        fp = cast(PathLike, fp)  # type: ignore
         with open(fp, "wb") as f:
             f.write(data)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/src/ufoLib2/typing.py 
new/ufolib2-0.18.1/src/ufoLib2/typing.py
--- old/ufolib2-0.17.1/src/ufoLib2/typing.py    2025-01-21 13:30:04.000000000 
+0100
+++ new/ufolib2-0.18.1/src/ufoLib2/typing.py    2025-07-10 13:40:29.000000000 
+0200
@@ -12,6 +12,9 @@
 PathLike = Union[str, bytes, "os.PathLike[str]", "os.PathLike[bytes]"]
 """Represents a path in various possible forms."""
 
+# can be used with isinstance at runtime to check if something is a path
+PATH_TYPES = (str, bytes, os.PathLike)
+
 
 class Drawable(Protocol):
     """Stand-in for an object that can draw itself with a given pen.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/src/ufoLib2.egg-info/PKG-INFO 
new/ufolib2-0.18.1/src/ufoLib2.egg-info/PKG-INFO
--- old/ufolib2-0.17.1/src/ufoLib2.egg-info/PKG-INFO    2025-01-21 
13:30:19.000000000 +0100
+++ new/ufolib2-0.18.1/src/ufoLib2.egg-info/PKG-INFO    2025-07-10 
13:40:38.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 2.2
+Metadata-Version: 2.4
 Name: ufoLib2
-Version: 0.17.1
+Version: 0.18.1
 Summary: ufoLib2 is a UFO font processing library.
 Author-email: Adrien Tétar <[email protected]>
 License: Apache 2.0
@@ -12,21 +12,22 @@
 Classifier: Intended Audience :: End Users/Desktop
 Classifier: Topic :: Text Processing :: Fonts
 Classifier: License :: OSI Approved :: Apache Software License
-Requires-Python: >=3.8
+Requires-Python: >=3.9
 Description-Content-Type: text/markdown
 License-File: LICENSE
 Requires-Dist: attrs>=22.1.0
-Requires-Dist: fonttools[ufo]>=4.0.0
+Requires-Dist: fonttools[ufo]>=4.58.0
 Provides-Extra: lxml
 Requires-Dist: lxml; extra == "lxml"
 Provides-Extra: converters
-Requires-Dist: cattrs>=24.1; extra == "converters"
+Requires-Dist: cattrs>=25.1.1; extra == "converters"
 Provides-Extra: json
-Requires-Dist: cattrs>=24.1; extra == "json"
+Requires-Dist: cattrs>=25.1.1; extra == "json"
 Requires-Dist: orjson; platform_python_implementation != "PyPy" and extra == 
"json"
 Provides-Extra: msgpack
-Requires-Dist: cattrs>=24.1; extra == "msgpack"
+Requires-Dist: cattrs>=25.1.1; extra == "msgpack"
 Requires-Dist: msgpack; extra == "msgpack"
+Dynamic: license-file
 
 # ufoLib2
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/src/ufoLib2.egg-info/requires.txt 
new/ufolib2-0.18.1/src/ufoLib2.egg-info/requires.txt
--- old/ufolib2-0.17.1/src/ufoLib2.egg-info/requires.txt        2025-01-21 
13:30:19.000000000 +0100
+++ new/ufolib2-0.18.1/src/ufoLib2.egg-info/requires.txt        2025-07-10 
13:40:38.000000000 +0200
@@ -1,11 +1,11 @@
 attrs>=22.1.0
-fonttools[ufo]>=4.0.0
+fonttools[ufo]>=4.58.0
 
 [converters]
-cattrs>=24.1
+cattrs>=25.1.1
 
 [json]
-cattrs>=24.1
+cattrs>=25.1.1
 
 [json:platform_python_implementation != "PyPy"]
 orjson
@@ -14,5 +14,5 @@
 lxml
 
 [msgpack]
-cattrs>=24.1
+cattrs>=25.1.1
 msgpack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/tests/test_ufoLib2.py 
new/ufolib2-0.18.1/tests/test_ufoLib2.py
--- old/ufolib2-0.17.1/tests/test_ufoLib2.py    2025-01-21 13:30:04.000000000 
+0100
+++ new/ufolib2-0.18.1/tests/test_ufoLib2.py    2025-07-10 13:40:29.000000000 
+0200
@@ -1,5 +1,6 @@
 from __future__ import annotations
 
+import zipfile
 from copy import deepcopy
 from pathlib import Path
 from typing import Any, Type
@@ -241,7 +242,7 @@
     ]
 
     # setter should clear existing guidelines
-    font.guidelines = [{"x": 100}, ufoLib2.objects.Guideline(y=20)]  # type: 
ignore
+    font.guidelines = [{"x": 100}, ufoLib2.objects.Guideline(y=20)]
 
     assert len(font.guidelines) == 2
     assert font.guidelines == [
@@ -284,3 +285,27 @@
     assert not isinstance(obj, attr_type)
     setattr(o, attr_name, obj)
     assert isinstance(getattr(o, attr_name), attr_type)
+
+
[email protected](
+    "structure", [ufoLib.UFOFileStructure.PACKAGE, ufoLib.UFOFileStructure.ZIP]
+)
+def test_save_again_to_existing_path(
+    tmp_path: Path, structure: ufoLib.UFOFileStructure
+) -> None:
+    font = Font()
+    ufo_name = "foo.ufoz" if structure == ufoLib.UFOFileStructure.ZIP else 
"foo.ufo"
+    font.save(tmp_path / ufo_name, structure=structure)
+
+    # without the overwrite flag, this should fail
+    with pytest.raises(OSError, match="already exists"):
+        font.save(tmp_path / ufo_name, structure=structure)
+
+    # with the overwrite flag, it should succeed
+    font.save(tmp_path / ufo_name, overwrite=True, structure=structure)
+
+    if structure == ufoLib.UFOFileStructure.PACKAGE:
+        assert (tmp_path / ufo_name).is_dir()
+    else:
+        assert (tmp_path / ufo_name).is_file()
+        assert zipfile.is_zipfile(tmp_path / ufo_name)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ufolib2-0.17.1/tox.ini new/ufolib2-0.18.1/tox.ini
--- old/ufolib2-0.17.1/tox.ini  2025-01-21 13:30:04.000000000 +0100
+++ new/ufolib2-0.18.1/tox.ini  2025-07-10 13:40:29.000000000 +0200
@@ -1,5 +1,5 @@
 [tox]
-envlist =  lint, py3{8,9,10,11,12,13}-cov, htmlcov
+envlist =  lint, py3{9,10,11,12,13}-cov, htmlcov
 isolated_build = true
 
 [testenv]

Reply via email to