<pre style='margin:0'>
Renee Otten (reneeotten) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/a6539c896f348fb92ec55a79f4fc505318d03000">https://github.com/macports/macports-ports/commit/a6539c896f348fb92ec55a79f4fc505318d03000</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new a6539c896f3 py-stagger: new port, version 1.0.1
</span>a6539c896f3 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit a6539c896f348fb92ec55a79f4fc505318d03000
</span>Author: Mark Mentovai <mark@mentovai.com>
AuthorDate: Thu Oct 31 11:48:30 2024 -0400

<span style='display:block; white-space:pre;color:#404040;'>    py-stagger: new port, version 1.0.1
</span>---
 python/py-stagger/Portfile                         |  38 ++++
 .../py-stagger/files/patch-py310_collections.diff  | 214 ++++++++++++++++++++
 python/py-stagger/files/patch-py312_rstring.diff   |  26 +++
 python/py-stagger/files/patch-py313_imghdr.diff    | 225 +++++++++++++++++++++
 python/py-stagger/files/patch-pytest_collect.diff  |  11 +
 5 files changed, 514 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-stagger/Portfile b/python/py-stagger/Portfile
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..2605793901e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-stagger/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,38 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortSystem          1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup           github 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup           python 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+name                py-stagger
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup        staggerpkg stagger 1.0.1 release-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.tarball_from archive
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+maintainers         nomaintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+platforms           {darwin any}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+supported_archs     noarch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+license             BSD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+description         ID3v1/ID3v2 tag manipulation package in pure Python 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+long_description    The ID3v2 tag format is notorious for its useless \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    specification documents and its quirky, mutually \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    incompatible part-implementations. Stagger is to provide a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    robust tagging package that is able to handle all the \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    various badly formatted tags out there and allow you to \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    convert them to a consensus format.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  937a32fc9cc8898e9c60d8101af563089949d173 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  c7226bc779602850f497577e2f554136c888485b63789c77d3816dc6d223dda0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    5111466
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+python.versions     312 313
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append   patch-py310_collections.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    patch-py312_rstring.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    patch-py313_imghdr.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    patch-pytest_collect.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${name} ne ${subport}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test.run        yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-stagger/files/patch-py310_collections.diff b/python/py-stagger/files/patch-py310_collections.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..d21b749322d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-stagger/files/patch-py310_collections.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,214 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From https://github.com/staggerpkg/stagger/pull/57.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 8b0219ecccadf434905b341ce5e56f8fb582f0e2 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Michael Cook <michael@waxrat.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 9 Jan 2022 11:48:34 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 1/6] Fix import for Python 3.10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+As of Python 3.10 in collections:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- MutableMapping is now abc.MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Container is now abc.Container
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Issue #56
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/frames.py | 7 ++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/tags.py   | 7 ++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 2 files changed, 12 insertions(+), 2 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/frames.py stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f2b914e..6088768 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -41,6 +41,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.errors import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.specs import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections import Container
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections.abc import Container
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Frame(metaclass=abc.ABCMeta):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _framespec = tuple()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _version = tuple()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -114,7 +119,7 @@ def _in_version(self, *versions):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "Returns true if this frame is in any of the specified versions of ID3."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for version in versions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (self._version == version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                or (isinstance(self._version, collections.Container) 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                or (isinstance(self._version, Container)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     and version in self._version)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 return True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/tags.py stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3949d99..a9e0f29 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -219,7 +219,12 @@ def __repr__(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return "<FrameOrder: {0}>".format(", ".join(pair[0] for pair in order))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-class Tag(collections.MutableMapping, metaclass=abc.ABCMeta):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections.abc import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class Tag(MutableMapping, metaclass=abc.ABCMeta):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     known_frames = { }        # Maps known frameids to Frame class objects
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     frame_order = None        # Initialized by stagger.id3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 9e80d6b104b613b214f1947843e0b52bbfaf2c1b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Michael Cook <michael@waxrat.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 24 May 2022 11:43:41 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 2/6] tags.py: Move import to top
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/tags.py | 10 +++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 5 insertions(+), 5 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/tags.py stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a9e0f29..636b072 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -48,6 +48,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import stagger.frames as Frames
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import stagger.fileutil as fileutil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections.abc import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _FRAME23_FORMAT_COMPRESSED = 0x0080
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _FRAME23_FORMAT_ENCRYPTED = 0x0040
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _FRAME23_FORMAT_GROUP = 0x0020
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -219,11 +224,6 @@ def __repr__(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return "<FrameOrder: {0}>".format(", ".join(pair[0] for pair in order))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    from collections import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    from collections.abc import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Tag(MutableMapping, metaclass=abc.ABCMeta):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     known_frames = { }        # Maps known frameids to Frame class objects
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 4b5f5835398f71a7007f6fba701c89037d41a04a Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Michael Cook <michael@waxrat.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 24 May 2022 11:43:54 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 3/6] frames.py: Handle import of Iterable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/frames.py | 4 +++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 3 insertions(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/frames.py stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6088768..87e3329 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -43,8 +43,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from collections import Container
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections import Iterable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from collections.abc import Container
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections.abc import Iterable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Frame(metaclass=abc.ABCMeta):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _framespec = tuple()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -249,7 +251,7 @@ def extract_strs(values):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if isinstance(values, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 yield values
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            elif isinstance(values, collections.Iterable):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            elif isinstance(values, Iterable):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 for val in values:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     for v in extract_strs(val):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         yield v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 55f1d91c9c7623bb169194b5f04cacd9db753232 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Michael Cook <michael@waxrat.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 6 Jun 2022 06:38:02 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 4/6] Fix remaining collections import issues
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/specs.py | 13 ++++++++++---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/tags.py  |  4 +++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 2 files changed, 13 insertions(+), 4 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/specs.py stagger/specs.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1567a5f..a39b9c9 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/specs.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/specs.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,6 +39,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.conversion import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.errors import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections import ByteString
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections import Sequence
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections.abc import ByteString
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections.abc import Sequence
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # The idea for the Spec system comes from Mutagen.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def optionalspec(spec):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -228,7 +235,7 @@ def write(self, frame, value):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def validate(self, frame, value):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if value is None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return bytes()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if not isinstance(value, collections.ByteString):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if not isinstance(value, ByteString):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             raise TypeError("Not a byte sequence")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def to_str(self, value):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -423,7 +430,7 @@ def validate(self, frame, values):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         res = []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for v in values:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if not isinstance(v, collections.Sequence) or isinstance(v, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if not isinstance(v, Sequence) or isinstance(v, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 raise TypeError("Records must be sequences")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if len(v) != len(self.specs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 raise ValueError("Invalid record length")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -453,7 +460,7 @@ def write(self, frame, values):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def validate(self, frame, values):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if values is None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if not isinstance(values, collections.Sequence) or isinstance(values, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if not isinstance(values, Sequence) or isinstance(values, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             raise TypeError("ASPISpec needs a sequence of integers")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if len(values) != frame.N:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             raise ValueError("ASPISpec needs {0} integers".format(frame.N))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/tags.py stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 636b072..3f0cd25 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,8 +50,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from collections import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections import Iterable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from collections.abc import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from collections.abc import Iterable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _FRAME23_FORMAT_COMPRESSED = 0x0080
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ _FRAME23_FORMAT_ENCRYPTED = 0x0040
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -321,7 +323,7 @@ def __setitem__(self, key, value):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._frames[key] = [value]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if self.known_frames[key]._allow_duplicates:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if not isinstance(value, collections.Iterable) or isinstance(value, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if not isinstance(value, Iterable) or isinstance(value, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 raise ValueError("{0} requires a list of frame values".format(key))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._frames[key] = [val if isinstance(val, self.known_frames[key])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                  else self.known_frames[key](val) 
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-stagger/files/patch-py312_rstring.diff b/python/py-stagger/files/patch-py312_rstring.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..6fde1796502
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-stagger/files/patch-py312_rstring.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,26 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From https://github.com/staggerpkg/stagger/pull/57.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 228ec8cfa9baa3bad244f844d59995b91f6d0520 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Michael Cook <michael@waxrat.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 2 Oct 2023 18:25:47 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 5/6] Fix raw-string issue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/tags.py | 4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 2 insertions(+), 2 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/tags.py stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3f0cd25..2ab4de4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -491,8 +491,8 @@ def _get_date(self, yearframe, dateframe, timeframe):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             time = self.__friendly_text_collect(timeframe)[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             m = re.match(r"\s*(?P<hour>[0-2][0-9])\s*:?\s*"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         "(?P<minute>[0-5][0-9])\s*:?\s*"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         "(?P<second>[0-5][0-9])?\s*$", time)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         r"(?P<minute>[0-5][0-9])\s*:?\s*"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         r"(?P<second>[0-5][0-9])?\s*$", time)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if m is not None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 hour = int(m.group("hour"))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 minute = int(m.group("minute"))
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-stagger/files/patch-py313_imghdr.diff b/python/py-stagger/files/patch-py313_imghdr.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..55f1ed7eaa5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-stagger/files/patch-py313_imghdr.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,225 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From https://github.com/staggerpkg/stagger/pull/57.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and a further local patch.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 74f8d62f2bb2d5fe0ccab96e1270372aef1f9a68 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Michael Cook <michael@waxrat.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sat, 11 May 2024 05:37:43 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 6/6] imhdr was deprecated in PEP-0594
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+See https://peps.python.org/pep-0594/#imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/frames.py | 4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/id3.py    | 9 ++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/tags.py   | 4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/util.py   | 5 +++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 4 files changed, 13 insertions(+), 9 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/frames.py stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 87e3329..ecf4984 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/frames.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -34,12 +34,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import abc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import collections
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-import imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from abc import abstractmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from warnings import warn
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.errors import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.specs import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from stagger.util import imghdr_what
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from collections import Container
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -320,7 +320,7 @@ def __init__(self, value=None, frameid=None, flags=None, frameno=None, **kwargs)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self.data = file.read()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self.type = 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self.desc = ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                format = imghdr.what(None, self.data[:32])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                format = imghdr_what(None, self.data[:32])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 if not format:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     format = value.rpartition(".")[2]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self._set_format(format)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/id3.py stagger/id3.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3fec68a..6105912 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/id3.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/id3.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -33,12 +33,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ """List of frames defined in the various ID3 versions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ """
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-import imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import stagger.tags as tags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.frames import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.specs import *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from stagger.tags import frameclass
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from stagger.util import imghdr_what
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # ID3v2.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -422,7 +421,7 @@ def _to_version(self, version):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def _str_fields(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         img = "{0} bytes of {1} data".format(len(self.data), 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                             imghdr.what(None, self.data[:32]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             imghdr_what(None, self.data[:32]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return ("type={0}, desc={1}, mime={2}: {3}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 .format(repr(self._spec("type").to_str(self.type)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         repr(self.desc),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -819,7 +818,7 @@ def _to_version(self, version):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         elif self.format.upper() == "JPG":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             mime = "image/jpeg"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            mime = imghdr.what(io.StringIO(self.data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            mime = imghdr_what(io.StringIO(self.data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if mime is None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 raise ValueError("Unknown image format")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             mime = "image/" + mime.lower()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -827,7 +826,7 @@ def _to_version(self, version):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def _str_fields(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         img = "{0} bytes of {1} data".format(len(self.data), 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                             imghdr.what(None, self.data[:32]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             imghdr_what(None, self.data[:32]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return ("type={0}, desc={1}, format={2}: {3}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 .format(repr(self._spec("type").to_str(self.type)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         repr(self.desc),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/tags.py stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2ab4de4..a002452 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/tags.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -35,7 +35,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import re
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import collections
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-import imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from abc import abstractmethod, abstractproperty
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -47,6 +46,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import stagger.frames as Frames
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import stagger.fileutil as fileutil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from stagger.util import imghdr_what
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from collections import MutableMapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -523,7 +523,7 @@ def getter(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                  .format(f._spec("type").to_str(f.type),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          f.desc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          len(f.data),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         imghdr.what(None, f.data[:32]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                         imghdr_what(None, f.data[:32]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                  for f in self[frameid])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         def setter(self, value):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if len(value) > 0:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/util.py stagger/util.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6b29cb0..52727bf 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/util.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/util.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -137,3 +137,8 @@ def print_warnings(filename, options):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     print(filename + ":warning: " + str(w.message),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           file=sys.stderr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             sys.stderr.flush()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def imghdr_what(file, h):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    # imhdr.what was deprecated in PEP-0594
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    # See https://peps.python.org/pep-0594/#imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 4b5a867c38bf6be12ed2bd99ed21ccecbb7f326b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Mark Mentovai <mark@mentovai.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Thu, 31 Oct 2024 12:04:03 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Reimplement imghdr.what to the extent used by stagger, fixes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stagger/util.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 73 insertions(+), 3 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stagger/util.py stagger/util.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 52727bf..7bc638e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stagger/util.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stagger/util.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -139,6 +139,76 @@ def print_warnings(filename, options):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             sys.stderr.flush()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def imghdr_what(file, h):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    # imhdr.what was deprecated in PEP-0594
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    # See https://peps.python.org/pep-0594/#imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        import imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        # imghdr.what was deprecated in PEP-0594
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        # See https://peps.python.org/pep-0594/#imghdr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        # This code is adapted from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        # https://github.com/python/cpython/blob/v3.12.0/Lib/imghdr.py.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tests = []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        def test_jpeg(h, f):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            """Test for JPEG data with JFIF or Exif markers; and raw JPEG."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if h[6:10] in (b'JFIF', b'Exif'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                return 'jpeg'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            elif h[:4] == b'\xff\xd8\xff\xdb':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                return 'jpeg'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tests.append(test_jpeg)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        def test_png(h, f):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            """Verify if the image is a PNG."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if h.startswith(b'\211PNG\r\n\032\n'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                return 'png'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tests.append(test_png)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        def test_gif(h, f):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            """Verify if the image is a GIF ('87 or '89 variants)."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if h[:6] in (b'GIF87a', b'GIF89a'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                return 'gif'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tests.append(test_gif)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        def test_tiff(h, f):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            """Verify if the image is a TIFF (can be in Motorola or Intel byte order)."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if h[:2] in (b'MM', b'II'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                return 'tiff'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tests.append(test_tiff)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        def test_bmp(h, f):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            """Verify if the image is a BMP file."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if h.startswith(b'BM'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                return 'bmp'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tests.append(test_bmp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        def test_webp(h, f):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            """Verify if the image is a WebP."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if h.startswith(b'RIFF') and h[8:12] == b'WEBP':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                return 'webp'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tests.append(test_webp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        f = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if h is None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                if isinstance(file, (str, PathLike)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    f = open(file, 'rb')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    h = f.read(32)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    location = file.tell()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    h = file.read(32)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    file.seek(location)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            for tf in tests:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                res = tf(h, f)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                if res:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    return res
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        finally:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if f: f.close()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return imghdr.what(file, h)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-stagger/files/patch-pytest_collect.diff b/python/py-stagger/files/patch-pytest_collect.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..75f6d923ea3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-stagger/files/patch-pytest_collect.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pytest.ini | 2 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 2 insertions(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git pytest.ini pytest.ini
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000000..ca5e906bab55
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ pytest.ini
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,2 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[pytest]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++python_files = test/*.py
</span></pre><pre style='margin:0'>

</pre>