Review: python-pybreaker 1.4.1-1
Package Information
| Description | threadsafe pure-Python implementation of the Circuit Breaker pattern PyBreaker is a Python implementation of the Circuit Breaker pattern, described in Michael T. Nygard's book "Release It!". In Nygard's words, "circuit breakers exists to allow one subsystem to fail without destroying the entire system. This is done by wrapping dangerous operations (typically integration points) with a component that can circumvent calls when the system is not healthy". |
|---|---|
| Maintainer | Debian Python Team <team+python@tracker.debian.org> |
| Changed By | Alexandre Detiste <tchet@debian.org> |
| Sponsor | tchet@debian.org |
| Distribution | unstable |
| Architecture | all |
| VCS | git: https://salsa.debian.org/python-team/packages/python-pybreaker.git (browse) |
| Closes | #1151268 |
| Tracker | https://tracker.debian.org/pkg/python-pybreaker |
| Uploaded | 6 days ago |
New Package Report
.changes
| Date | Sat, 31 Oct 2026 14:16:10 +0100 |
|---|---|
| Source | python-pybreaker |
| Version | 1.4.1-1 |
| Changed-By | Alexandre Detiste <tchet@debian.org> |
| Architecture | source all |
| Distribution | unstable |
Changelog
python-pybreaker (1.4.1-1) unstable; urgency=medium . * Initial upload (Closes: #1151268)
.dsc
| Section | python |
|---|---|
| Priority | optional |
| Component | main |
| Package-List | python3-pybreaker deb python optional arch=all |
debian/copyright
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: pybreaker
Source: https://github.com/danielfm/pybreaker
Files: *
Copyright: Daniel Martins <diddi@diddi.se>
License: BSD-3-Clause
Files: pw
Copyright: 2021 Ivo Houbrechts
License: Expat
Files: debian/*
Copyright: 2026 Alexandre Detiste <tchet@debian.org>
License: BSD-3-Clause
License: BSD-3-Clause
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
.
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
.
3. Neither the name of PyBreaker nor the names of its contributors may
be used to endorse or promote products derived from this software
software without specific prior written permission.
.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
License: Expat
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
DFSG Assistant LLM REVIEW 0 blocker, 1 important, 1 minor
This is an LLM based review using a Debian Inference based workflow. It was not written by a member of the DFSG team and has not been checked by one. It is not a decision on the package: it may be wrong, and it may have missed things.
Reviewed 6 days ago.
Report
DFSG NEW review for python-pybreaker version 1.4.1-1
Summary
- Licensing is DFSG-compliant and
debian/copyrightis accurate: No - Packaging is of good quality: Yes
- Issues: 0 blocker, 1 important, 1 minor
- debian/watch: version 5
- debian/copyright: machine-readable
- Scan before the review: nothing found
Licensing
The licences themselves are free: the upstream code is BSD-3-Clause (LICENSE reproduced verbatim in debian/copyright, including the 'software software' typo) and the one bundled third-party tool script pw is MIT/Expat with its notice in the file. No non-free terms, no vendored library, no built or generated binaries that lack source. debian/copyright is nevertheless inaccurate in two places: Files: * names a holder name and address that contradict the upstream LICENSE and pyproject.toml, and the Files: pw stanza does not cover pw.bat and pw.lock, so those two pyprojectx files are described as Daniel Martins's BSD-3-Clause code.
Packaging
Standard, well-formed Debian Python Team packaging. debhelper compat 14 with dh $@ --buildsystem=pybuild, the PEP 517 plugin, pybuild-plugin-pyproject and python3-flit for the flit_core backend; test-only dependencies (pytest, tornado, fakeredis) are correctly marked <!nocheck>; Testsuite: autopkgtest-pkg-pybuild is dh-python's implicit test and needs no debian/tests/control. Standards-Version 4.7.4 matches the current Policy 4.7.4.1 in its first two components, single arch:all binary, Vcs-* and Homepage present, no patches, changelog sane. The empty Depends field is correct at compat 14, where dh_gencontrol adds the relationship substvars itself.
Issues
important
licensing
1. Files: pw does not cover pw.bat and pw.lock, which are pyprojectx files under Ivo Houbrechts' MIT licence, so Files: * misattributes them
◂
- Files:
debian/copyright:9,debian/copyright:5-7,pw.bat,pw.lock,pw:1-10 - Basis: checked, in the package or with a reference tool
- Evidence:
Files: pw/Copyright: 2021 Ivo Houbrechts/License: Expat. copyright-format 6.9: "Patterns match pathnames that start at the root of the source tree. Thus, ‘Makefile.in’ matches only the file at the root of the tree" and a pattern has to contain a wildcard to reach further, sopwmatches only that one path.pw.batis the 2-line Windows shim@echo off/python "%~dp0pw" %*;pw.lockis the lock filepw --lockgenerates ([main]/requirements = [...]/hash = ...).pwis the pyprojectx wrapper, and pyproject.toml groups the three aspw*([tool.flit.sdist] exclude = [..., "pw*"]). - Problem: The two files fall through to
Files: *, which declares them BSD-3-Clause withCopyright: Daniel Martins, whereas they belong to the pyprojectx wrapper whose own header (pw:7,pw:9) saysCopyright (c) 2021 Ivo HoubrechtsandLicensed under the MIT license. debian/copyright therefore names the wrong holder and the wrong licence for two files in the source package, contrary to copyright-format 6.9's last-stanza-wins matching and to the requirement that the file describe the licensing of every file (Policy 12.5). - Fix: Widen the stanza to
Files: pw*(or listpw pw.bat pw.lock), keepingCopyright: 2021 Ivo HoubrechtsandLicense: Expat.
minor
licensing
2. Files: * Copyright gives Daniel Martins <diddi@diddi.se>, an address that appears nowhere in the source and contradicts LICENSE and pyproject.toml
◂
- Files:
debian/copyright:6,LICENSE:1,pyproject.toml:6 - Basis: checked, in the package or with a reference tool
- Evidence: debian/copyright:
Copyright: Daniel Martins <diddi@diddi.se>; LICENSE:Copyright (c) 2010-2021, Daniel Fernandes Martins; pyproject.toml:{ name = "Daniel Fernandes Martins", email = "daniel.tritone@gmail.com" }. - Problem: The holder is named with a truncated name and an address that no file in the source contains, so the copyright statement does not identify the actual holder as upstream states him; the years (2010-2021) are also dropped. The copyright is correct in substance but the record is wrong for anyone who needs to contact the holder.
- Fix: Use
Copyright: 2010-2021, Daniel Fernandes Martins <daniel.tritone@gmail.com>in theFiles: *stanza.
Verified ◂
- Prescan item
Ivo Houbrechts # # pw:7: accounted for —pw's header names that holder and the file is covered by theFiles: pwstanza withLicense: Expat, whose stand-alone text is the MIT text quoted in the header. The gap is only its two siblings (issue above). - Inventory covered the whole tree (16 files plus .github/, .pre-commit-config.yaml, .gitignore; .pc/ skipped as instructed): src/pybreaker/init.py, py.typed, tests/{init,pybreaker_test,typechecks}.py, README.rst, CHANGELOG, pyproject.toml, .github/{FUNDING.yml,workflows/*}, .pre-commit-config.yaml, .gitignore.
- No file in the tree carries a copyright or licence notice other than LICENSE,
pwand pyproject.toml'sLicense :: OSI Approved :: BSD Licenseclassifier; grep for Copyright/(C)/©/SPDX/Licensed under/permission grants/GNU/Apache/MPL/public domain found nothing else. README.rst has no licence section; CHANGELOG's 'Thanks @...' lines are credits, not holders. - No built files, minified code, archives, PDFs, images, fonts or bytecode in the tree;
pwis a plain Python script written by hand, not used by debian/rules and not installed in the binary. - No embedded third-party library: tornado and redis are optional runtime imports from system packages (
try: from tornado import gen/try: from redis import Redisin src/pybreaker/init.py), not vendored copies. - Tested licensing combination: BSD-3-Clause and MIT/Expat are both free and mutually compatible; nothing is non-commercial, no-modification or field-of-use restricted. Both full licence texts are in debian/copyright (BSD-3-Clause, Expat).
- Packaging files read in full: debian/control, rules, changelog, copyright, salsa-ci.yml, source/format, watch (not reviewed). No debian/patches, no install/links/docs files, no maintainer scripts.
- Build dependencies cover what the tests import: tests/pybreaker_test.py uses
from unittest import mock(stdlib), pytest,tornado.testing, fakeredis andredis.exceptions;apt-cache show python3-fakeredisconfirmsDepends: python3-redis, so no python3-mock and no separate python3-redis Build-Depends are missing. Testsuite: autopkgtest-pkg-pybuildis dh-python's implicit test: /usr/share/dh-python/pybuild-autopkgtest exists and runs thepybuildbuildsystem's autopkgtest command, so no debian/tests/control is needed.- pybuild-plugin-pyproject builds with
python -m build --skip-dependency-check --no-isolation --wheel(/usr/share/dh-python/dhpython/build/plugin_pyproject.py), so the flit_core backend must be installed;python3-flit(4.1.0-4) is Build-Depended on, andapt-cache showfinds no separate python3-flit-core or flit-core binary package in unstable or NEW. - Standards-Version 4.7.4 against the reviewing system's Policy 4.7.4.1: first two components equal, no issue. Distribution
unstable, version1.4.1-1, changelog closes #1151268, date valid for 31 Oct 2026. - Single
Architecture: allbinary python3-pybreaker carrying src/pybreaker and py.typed; no Depends field, which is correct at debhelper compat 14 (dhadds relationship substvars itself). - uscan found the packaged version as the newest upstream release (upstream
1.4.1, packaged1.4.1).
Not confirmed ◂
- That python3-flit 4.1.0 in the archive really ships the
flit_corebackend thatpython -m build --no-isolationimports; the package lists contain no python3-flit-core binary, so this is assumed, and a clean build would show it.
Proposed changes ◂
None.
Uploader's response to the LLM review
I fixed the tiny glitches on Salsa. I do not think that warrants a new upload for now.
— Alexandre Detiste (detiste-guest), 6 days ago
I'm the maintainer for "flit"... so I know the tradoffs of this one package very well. Ask me anything if needed.
Not confirmed
That python3-flit 4.1.0 in the archive really ships the flit_core backend that python -m build --no-isolation imports; the package lists contain no python3-flit->core binary, so this is assumed, and a clean build would show it.
— Alexandre Detiste (detiste-guest), 6 days ago
Review Information
accepted — allocated to eamanu 4 days ago, started 4 days ago, completed 4 days ago.
Final Comment
Public Notes
Author check: python-pybreaker 1.4.1-1
Scanned 16 files. 3 author(s) declared in debian/copyright.
All source-file authors appear in debian/copyright.
License check: python-pybreaker 1.4.1-1
Archive component: main
COMPATIBLE:
- BSD-3-Clause
- Expat (alias for MIT (Expat))
licensecheck
Command: licensecheck -r --deb-machine .
Exit code: 0
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: FIXME
Upstream-Contact: FIXME
Source: FIXME
Disclaimer: Autogenerated by licensecheck
Files: ./.github/FUNDING.yml
./.github/workflows/codeql-analysis.yml
./.github/workflows/release.yml
./.pre-commit-config.yaml
./CHANGELOG
./README.rst
./debian/changelog
./debian/control
./debian/rules
./debian/salsa-ci.yml
./debian/source/format
./debian/watch
./pw.bat
./pw.lock
./pyproject.toml
./src/pybreaker/__init__.py
./tests/pybreaker_test.py
./tests/typechecks.py
Copyright: NONE
License: UNKNOWN
FIXME
Files: ./debian/copyright
Copyright: 2021, Ivo Houbrechts
2026, Alexandre Detiste <tchet@debian.org>
Daniel Martins <diddi@diddi.se>
License: BSD-3-clause and/or Expat
FIXME
Files: ./pw
Copyright: 2021, Ivo Houbrechts
License: Expat
FIXME
Files: ./LICENSE
Copyright: 2010-2021, Daniel Fernandes Martins
License: UNKNOWN
FIXME
debian/copyright check
Command: cme check dpkg-copyright
Exit code: 0
INFO: Model Dpkg::Copyright class: accept attribute should be a list of hash with 'pattern' key. I.e. something like [ { pattern => 'xyz.*', info}, ...] instead of [ 'xyz.*' => {info}, ... ]
INFO: Model Dpkg::Copyright::LicenseSpec class: accept attribute should be a list of hash with 'pattern' key. I.e. something like [ { pattern => 'xyz.*', info}, ...] instead of [ 'xyz.*' => {info}, ... ]
INFO: Model Dpkg::Copyright::Content class: accept attribute should be a list of hash with 'pattern' key. I.e. something like [ { pattern => 'xyz.*', info}, ...] instead of [ 'xyz.*' => {info}, ... ]
licenserecon
Command: licenserecon
Exit code: 0
en: Versions: licenserecon '19.0' licensecheck '3.3.9-1'
Parsing Source Tree ....
Reading d/copyright ....
Running licensecheck ....
No significant differences found
Look for SPDX
Command: grep -r -B1 'SPDX-'
Exit code: 1
(no output)
Lintian
Command: lintian -i -I -v --pedantic
Exit code: 0
N:
P: python-pybreaker source: trailing-whitespace [debian/control:32]
N:
N: This file contains lines with trailing whitespace characters.
N:
N: Whilst often harmless and unsightly, such extra whitespaces can also cause
N: tools to interpret the whitespace characters literally. The tool diff(1)
N: does not like them, either. They are best avoided.
N:
N: Some of these problems can be hard to track down.
N:
N: Whitespace at the end of lines may be removed with the following:
N:
N: $ sed -i -e 's@[[:space:]]*$@@g' debian/control debian/changelog
N:
N: If you use Emacs, you can also use "M-x wh-cl" (whitespace-cleanup).
N:
N: However, if you wish to only remove trailing spaces and leave trailing
N: tabs (eg. for Makefiles), you can use the following code snippet:
N:
N: $ sed -i -e 's@[ ]*$@@g' debian/rules
N:
N: To remove empty lines from the end of a file, you can use:
N:
N: $ sed -i -e :a -e '/^\n*$/{$d;N;};/\n$/ba' debian/rules
N:
N: Visibility: pedantic
N: Show-Always: no
N: Check: debian/trailing-whitespace
N: Renamed from: file-contains-trailing-whitespace
N:
N:
P: python-pybreaker source: trailing-whitespace [debian/control:33]
N:
P: python-pybreaker source: upstream-metadata-file-is-missing
N:
N: This source package is not Debian-native but it does not have a
N: debian/upstream/metadata file.
N:
N: The Upstream MEtadata GAthered with YAml (UMEGAYA) project is an effort to
N: collect meta-information about upstream projects from any source package.
N: This file is in YAML format and it is used in to feed the data in the
N: UltimateDebianDatabase. For example, it can contains the way the authors
N: want their software be cited in publications and some bibliographic
N: references about the software.
N:
N: Please add a debian/upstream/metadata file.
N:
N: Please refer to https://dep-team.pages.debian.net/deps/dep12/ and
N: https://wiki.debian.org/UpstreamMetadata for details.
N:
N: Visibility: pedantic
N: Show-Always: no
N: Check: debian/upstream/metadata
N:
duck
Command: duck
Exit code: 0
(no output)
look for copyright
Command: egrep -R -i copyright
Exit code: 0
LICENSE:Copyright (c) 2010-2021, Daniel Fernandes Martins
LICENSE: 1. Redistributions of source code must retain the above copyright notice,
LICENSE: 2. Redistributions in binary form must reproduce the above copyright
LICENSE:THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
LICENSE:DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
debian/copyright:Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
debian/copyright:Copyright: Daniel Martins <diddi@diddi.se>
debian/copyright:Copyright: 2021 Ivo Houbrechts
debian/copyright:Copyright: 2026 Alexandre Detiste <tchet@debian.org>
debian/copyright: 1. Redistributions of source code must retain the above copyright notice,
debian/copyright: 2. Redistributions in binary form must reproduce the above copyright
debian/copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
debian/copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
debian/copyright: The above copyright notice and this permission notice shall be included in all
debian/copyright: COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
pw:# Copyright (c) 2021 Ivo Houbrechts #
look for license
Command: egrep -R -i license
Exit code: 0
pyproject.toml:license = { file = "LICENSE" }
pyproject.toml: "License :: OSI Approved :: BSD License",
debian/copyright:License: BSD-3-Clause
debian/copyright:License: Expat
debian/copyright:License: BSD-3-Clause
debian/copyright:License: BSD-3-Clause
debian/copyright:License: Expat
debian/copyright: use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
pw:# Licensed under the MIT license #