Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-python-barcode for openSUSE:Factory checked in at 2023-09-21 22:22:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-python-barcode (Old) and /work/SRC/openSUSE:Factory/.python-python-barcode.new.1770 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-python-barcode" Thu Sep 21 22:22:53 2023 rev:8 rq:1112732 version:0.15.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-python-barcode/python-python-barcode.changes 2022-07-15 13:52:58.987573213 +0200 +++ /work/SRC/openSUSE:Factory/.python-python-barcode.new.1770/python-python-barcode.changes 2023-09-21 22:23:03.832899167 +0200 @@ -1,0 +2,8 @@ +Wed Sep 20 15:26:50 UTC 2023 - OndÅej Súkup <mimi...@gmail.com> + +- update to 0.15.1 + * Improved type hints. + * Updated ISBN to support newer allocated ranges. + * Fixed compatibility with Pillow 10.0. + +------------------------------------------------------------------- Old: ---- python-barcode-0.14.0.tar.gz New: ---- python-barcode-0.15.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-python-barcode.spec ++++++ --- /var/tmp/diff_new_pack.6acDGX/_old 2023-09-21 22:23:05.020942277 +0200 +++ /var/tmp/diff_new_pack.6acDGX/_new 2023-09-21 22:23:05.020942277 +0200 @@ -1,7 +1,7 @@ # # spec file # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # Copyright (c) 2019 Dr. Axel Braun # # All modifications and additions to the file contributed by third parties @@ -17,11 +17,9 @@ # -%{?!python_module:%define python_module() python-%{**} python3-%{**}} -%define skip_python2 1 %define base_name python-barcode Name: python-%{base_name} -Version: 0.14.0 +Version: 0.15.1 Release: 0 Summary: Library to create Barcodes with Python License: MIT ++++++ python-barcode-0.14.0.tar.gz -> python-barcode-0.15.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/.github/workflows/publish.yml new/python-barcode-0.15.1/.github/workflows/publish.yml --- old/python-barcode-0.14.0/.github/workflows/publish.yml 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/.github/workflows/publish.yml 2023-07-06 00:56:49.000000000 +0200 @@ -6,39 +6,16 @@ - v* jobs: - github-release: - runs-on: ubuntu-18.04 - name: Publish GitHub Release - steps: - - uses: actions/checkout@master - - uses: actions/setup-python@v1 - with: - python-version: 3.7 - architecture: x64 - - name: Install build dependencies - run: pip install wheel - - name: Build packages - run: python setup.py sdist bdist_wheel - - name: Release - uses: softprops/action-gh-release@v1 - with: - files: dist/* - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} pypi: - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 name: Publish package on PyPI steps: - - uses: actions/checkout@master - - uses: actions/setup-python@v1 + - uses: actions/checkout@v3 + - uses: actions/setup-python@v3 with: python-version: 3.7 - architecture: x64 - - name: Install build dependencies - run: pip install wheel - - name: Build packages - run: python setup.py sdist bdist_wheel - - name: Publish a Python distribution to PyPI - uses: pypa/gh-action-pypi-publish@master + - run: pip install build setuptools wheel build setuptools_scm + - run: python -m build --sdist --wheel --no-isolation + - uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_TOKEN }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/.github/workflows/tests.yml new/python-barcode-0.15.1/.github/workflows/tests.yml --- old/python-barcode-0.14.0/.github/workflows/tests.yml 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/.github/workflows/tests.yml 2023-07-06 00:56:49.000000000 +0200 @@ -7,9 +7,17 @@ runs-on: ${{ matrix.os }} strategy: matrix: - os: [ ubuntu-20.04, macOS-10.15, windows-2019 ] - python: [ '3.6', '3.7', '3.8', '3.9', '3.10' ] + os: [ ubuntu-20.04 ] + python: [ '3.7', '3.8', '3.9', '3.10', '3.11' ] variant: [ "py", "py-images" ] + include: + - os: macOS-11 + python: "3.10" + variant: py-images + - os: windows-2019 + python: "3.10" + variant: py-images + - os: windows-2019 name: python${{ matrix.python }} on ${{ matrix.os }} ${{ matrix.variant }} steps: - uses: actions/checkout@v2 @@ -17,12 +25,8 @@ with: python-version: ${{ matrix.python }} - name: Install test dependency - run: pip install tox codecov + run: pip install tox - name: Run tests run: tox env: TOXENV: ${{ matrix.variant }} - - name: Report coverage - run: codecov - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/.pre-commit-config.yaml new/python-barcode-0.15.1/.pre-commit-config.yaml --- old/python-barcode-0.14.0/.pre-commit-config.yaml 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/.pre-commit-config.yaml 2023-07-06 00:56:49.000000000 +0200 @@ -1,32 +1,21 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.2.0 + rev: v4.4.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] - id: end-of-file-fixer - id: debug-statements - - repo: https://github.com/pycqa/isort - rev: 5.10.1 - hooks: - - id: isort - repo: https://github.com/psf/black - rev: "22.3.0" + rev: "23.3.0" hooks: - id: black - - repo: https://github.com/PyCQA/flake8 - rev: "4.0.1" - hooks: - - id: flake8 - additional_dependencies: - - flake8-comprehensions - - flake8-bugbear - - repo: https://github.com/asottile/pyupgrade - rev: v2.32.1 - hooks: - - id: pyupgrade - args: [--py36-plus] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v0.950' + rev: 'v1.4.1' hooks: - id: mypy + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: 'v0.0.275' + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/PKG-INFO new/python-barcode-0.15.1/PKG-INFO --- old/python-barcode-0.14.0/PKG-INFO 2022-05-17 12:06:06.000000000 +0200 +++ new/python-barcode-0.15.1/PKG-INFO 2023-07-06 00:56:54.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-barcode -Version: 0.14.0 +Version: 0.15.1 Summary: Create standard barcodes with Python. No external modules needed. (optional Pillow support included). Home-page: https://github.com/WhyNotHugo/python-barcode Author: Hugo Osvaldo Barrera et al @@ -13,10 +13,6 @@ :target: https://github.com/WhyNotHugo/python-barcode/actions :alt: CI status - .. image:: https://codecov.io/gh/WhyNotHugo/python-barcode/branch/main/graph/badge.svg - :target: https://codecov.io/gh/WhyNotHugo/python-barcode - :alt: Build coverage - .. image:: https://readthedocs.org/projects/python-barcode/badge/ :target: https://python-barcode.rtfd.org/ :alt: documentation @@ -38,7 +34,7 @@ There are no external dependencies when generating SVG files. Pillow is required for generating images (e.g.: PNGs). - Support Python 3.6 to 3.10. + Support Python 3.7 to 3.11. .. image:: example-ean13.png :target: https://github.com/WhyNotHugo/python-barcode @@ -62,11 +58,11 @@ Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Software Development :: Libraries :: Python Modules Provides-Extra: images diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/README.rst new/python-barcode-0.15.1/README.rst --- old/python-barcode-0.14.0/README.rst 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/README.rst 2023-07-06 00:56:49.000000000 +0200 @@ -5,10 +5,6 @@ :target: https://github.com/WhyNotHugo/python-barcode/actions :alt: CI status -.. image:: https://codecov.io/gh/WhyNotHugo/python-barcode/branch/main/graph/badge.svg - :target: https://codecov.io/gh/WhyNotHugo/python-barcode - :alt: Build coverage - .. image:: https://readthedocs.org/projects/python-barcode/badge/ :target: https://python-barcode.rtfd.org/ :alt: documentation @@ -30,7 +26,7 @@ There are no external dependencies when generating SVG files. Pillow is required for generating images (e.g.: PNGs). -Support Python 3.6 to 3.10. +Support Python 3.7 to 3.11. .. image:: example-ean13.png :target: https://github.com/WhyNotHugo/python-barcode diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/__init__.py new/python-barcode-0.15.1/barcode/__init__.py --- old/python-barcode-0.14.0/barcode/__init__.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/__init__.py 2023-07-06 00:56:49.000000000 +0200 @@ -6,6 +6,7 @@ import os from typing import BinaryIO from typing import Dict +from typing import Optional from typing import Union from barcode.codabar import CODABAR @@ -56,27 +57,32 @@ PROVIDED_BARCODES.sort() -def get(name, code=None, writer=None, options=None): +def get( + name: str, + code: Optional[str] = None, + writer=None, + options: Optional[dict] = None, +): """Helper method for getting a generator or even a generated code. - :param str name: The name of the type of barcode desired. - :param str code: The actual information to encode. If this parameter is + :param name: The name of the type of barcode desired. + :param code: The actual information to encode. If this parameter is provided, a generated barcode is returned. Otherwise, the barcode class is returned. :param Writer writer: An alternative writer to use when generating the barcode. - :param dict options: Additional options to be passed on to the barcode when + :param options: Additional options to be passed on to the barcode when generating. """ options = options or {} try: barcode = __BARCODE_MAP[name.lower()] - except KeyError: - raise BarcodeNotFoundError(f"The barcode {name!r} you requested is not known.") + except KeyError as e: + raise BarcodeNotFoundError(f"The barcode {name!r} is not known.") from e if code is not None: return barcode(code, writer, **options) - else: - return barcode + + return barcode def get_class(name): @@ -87,9 +93,9 @@ name: str, code: str, writer=None, - output: Union[str, os.PathLike, BinaryIO] = None, - writer_options: Dict = None, - text: str = None, + output: Union[str, os.PathLike, BinaryIO, None] = None, + writer_options: Union[Dict, None] = None, + text: Union[str, None] = None, ): """Shortcut to generate a barcode in one line. @@ -109,12 +115,12 @@ barcode = get(name, code, writer) if isinstance(output, str): - fullname = barcode.save(output, writer_options, text) - return fullname - elif output: + return barcode.save(output, writer_options, text) + if output: barcode.write(output, writer_options, text) - else: - raise TypeError("'output' cannot be None") + return None + + raise TypeError("'output' cannot be None") get_barcode = get diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/base.py new/python-barcode-0.15.1/barcode/base.py --- old/python-barcode-0.14.0/barcode/base.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/base.py 2023-07-06 00:56:49.000000000 +0200 @@ -1,18 +1,22 @@ """barcode.base """ +from typing import ClassVar +from typing import List +from typing import Optional + +from barcode.writer import BaseWriter from barcode.writer import SVGWriter class Barcode: - name = "" digits = 0 default_writer = SVGWriter - default_writer_options = { + default_writer_options: ClassVar[dict] = { "module_width": 0.2, "module_height": 15.0, "quiet_zone": 6.5, @@ -24,16 +28,18 @@ "text": "", } - def to_ascii(self): + writer: BaseWriter + + def to_ascii(self) -> str: code = self.build() for i, line in enumerate(code): code[i] = line.replace("1", "X").replace("0", " ") return "\n".join(code) - def __repr__(self): + def __repr__(self) -> str: return f"<{self.__class__.__name__}({self.get_fullcode()!r})>" - def build(self): + def build(self) -> List[str]: raise NotImplementedError def get_fullcode(self): @@ -44,28 +50,20 @@ """ raise NotImplementedError - def save(self, filename, options=None, text=None): + def save( + self, filename: str, options: Optional[dict] = None, text: Optional[str] = None + ) -> str: """Renders the barcode and saves it in `filename`. - :parameters: - filename : String - Filename to save the barcode in (without filename - extension). - options : Dict - The same as in `self.render`. - text : str - Text to render under the barcode. + :param filename: Filename to save the barcode in (without filename extension). + :param options: The same as in `self.render`. + :param text: Text to render under the barcode. :returns: The full filename with extension. - :rtype: String """ - if text: - output = self.render(options, text) - else: - output = self.render(options) + output = self.render(options, text) if text else self.render(options) - _filename = self.writer.save(filename, output) - return _filename + return self.writer.save(filename, output) def write(self, fp, options=None, text=None): """Renders the barcode and writes it to the file like object @@ -82,14 +80,11 @@ output = self.render(options, text) self.writer.write(output, fp) - def render(self, writer_options=None, text=None): + def render(self, writer_options: Optional[dict] = None, text: Optional[str] = None): """Renders the barcode using `self.writer`. - :parameters: - writer_options : Dict - Options for `self.writer`, see writer docs for details. - text : str - Text to render under the barcode. + :param writer_options: Options for `self.writer`, see writer docs for details. + :param text: Text to render under the barcode. :returns: Output of the writers render method. """ @@ -102,5 +97,4 @@ options["text"] = self.get_fullcode() self.writer.set_options(options) code = self.build() - raw = self.writer.render(code) - return raw + return self.writer.render(code) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/charsets/code128.py new/python-barcode-0.15.1/barcode/charsets/code128.py --- old/python-barcode-0.14.0/barcode/charsets/code128.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/charsets/code128.py 2023-07-06 00:56:49.000000000 +0200 @@ -3,45 +3,40 @@ # Charsets for code 128 _common = ( - ( - " ", - "!", - '"', - "#", - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ) - + tuple(string.digits) - + ( - ":", - ";", - "<", - "=", - ">", - "?", - "@", - ) - + tuple(string.ascii_uppercase) - + ( - "[", - "\\", - "]", - "^", - "_", - ) + " ", + "!", + '"', + "#", + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + *tuple(string.digits), + ":", + ";", + "<", + "=", + ">", + "?", + "@", + *tuple(string.ascii_uppercase), + "[", + "\\", + "]", + "^", + "_", ) -_charset_a = _common + ( +_charset_a = ( + *_common, "\x00", "\x01", "\x02", @@ -51,11 +46,11 @@ "\x06", "\x07", "\x08", - "\x09", - "\x0a", + "\t", + "\n", "\x0b", "\x0c", - "\x0d", + "\r", "\x0e", "\x0f", "\x10", @@ -74,33 +69,31 @@ "\x1d", "\x1e", "\x1f", - "\xf3", - "\xf2", + "ó", + "ò", "SHIFT", "TO_C", "TO_B", - "\xf4", - "\xf1", + "ô", + "ñ", ) _charset_b = ( - _common - + ("`",) - + tuple(string.ascii_lowercase) - + ( - "{", - "|", - "}", - "~", - "\x7f", - "\xf3", - "\xf2", - "SHIFT", - "TO_C", - "\xf4", - "TO_A", - "\xf1", - ) + *_common, + "`", + *tuple(string.ascii_lowercase), + "{", + "|", + "}", + "~", + "\x7f", + "ó", + "ò", + "SHIFT", + "TO_C", + "ô", + "TO_A", + "ñ", ) ALL = set(_common + _charset_a + _charset_b) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/codabar.py new/python-barcode-0.15.1/barcode/codabar.py --- old/python-barcode-0.14.0/barcode/codabar.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/codabar.py 2023-07-06 00:56:49.000000000 +0200 @@ -27,13 +27,13 @@ name = "Codabar (NW-7)" - def __init__(self, code, writer=None, narrow=2, wide=5): + def __init__(self, code, writer=None, narrow=2, wide=5) -> None: self.code = code self.writer = writer or self.default_writer() self.narrow = narrow self.wide = wide - def __str__(self): + def __str__(self) -> str: return self.code def get_fullcode(self): @@ -46,19 +46,21 @@ ) # Start with [A-D], followed by a narrow space except KeyError: - raise BarcodeError("Codabar should start with either A,B,C or D") + raise BarcodeError("Codabar should start with either A,B,C or D") from None try: data += "n".join( [codabar.CODES[c] for c in self.code[1:-1]] ) # separated by a narrow space except KeyError: - raise IllegalCharacterError("Codabar can only contain numerics or $:/.+-") + raise IllegalCharacterError( + "Codabar can only contain numerics or $:/.+-" + ) from None try: data += "n" + codabar.STARTSTOP[self.code[-1]] # End with [A-D] except KeyError: - raise BarcodeError("Codabar should end with either A,B,C or D") + raise BarcodeError("Codabar should end with either A,B,C or D") from None raw = "" for e in data: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/codex.py new/python-barcode-0.15.1/barcode/codex.py --- old/python-barcode-0.14.0/barcode/codex.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/codex.py 2023-07-06 00:56:49.000000000 +0200 @@ -2,6 +2,9 @@ :Provided barcodes: Code 39, Code 128, PZN """ + +from typing import Collection + from barcode.base import Barcode from barcode.charsets import code39 from barcode.charsets import code128 @@ -16,7 +19,7 @@ MIN_QUIET_ZONE = 2.54 -def check_code(code, name, allowed): +def check_code(code: str, name: str, allowed: Collection[str]) -> None: wrong = [] for char in code: if char not in allowed: @@ -34,7 +37,7 @@ name = "Code 39" - def __init__(self, code: str, writer=None, add_checksum: bool = True): + def __init__(self, code: str, writer=None, add_checksum: bool = True) -> None: r""" :param code: Code 39 string without \* and without checksum. :param writer: A ``barcode.writer`` instance used to render the barcode @@ -48,7 +51,7 @@ self.writer = writer or self.default_writer() check_code(self.code, self.name, code39.REF) - def __str__(self): + def __str__(self) -> str: return self.code def get_fullcode(self) -> str: @@ -60,6 +63,7 @@ for k, v in code39.MAP.items(): if check == v[0]: return k + return None def build(self): chars = [code39.EDGE] @@ -88,7 +92,7 @@ digits = 6 - def __init__(self, pzn, writer=None): + def __init__(self, pzn, writer=None) -> None: pzn = pzn[: self.digits] if not pzn.isdigit(): raise IllegalCharacterError("PZN can only contain numbers.") @@ -108,8 +112,8 @@ checksum = sum_ % 11 if checksum == 10: raise BarcodeError("Checksum can not be 10 for PZN.") - else: - return checksum + + return checksum class PZN8(PZN7): @@ -131,14 +135,14 @@ name = "Code 128" - def __init__(self, code, writer=None): + def __init__(self, code, writer=None) -> None: self.code = code self.writer = writer or self.default_writer() self._charset = "B" self._buffer = "" check_code(self.code, self.name, code128.ALL) - def __str__(self): + def __str__(self) -> str: return self.code @property @@ -183,31 +187,32 @@ elif self._charset == "B": if look_next(): codes = self._new_charset("C") - elif char not in code128.B: - if char in code128.A: - codes = self._new_charset("A") + elif char not in code128.B and char in code128.A: + codes = self._new_charset("A") elif self._charset == "A": if look_next(): codes = self._new_charset("C") - elif char not in code128.A: - if char in code128.B: - codes = self._new_charset("B") + elif char not in code128.A and char in code128.B: + codes = self._new_charset("B") return codes def _convert(self, char): if self._charset == "A": return code128.A[char] - elif self._charset == "B": + if self._charset == "B": return code128.B[char] - elif self._charset == "C": + if self._charset == "C": if char in code128.C: return code128.C[char] - elif char.isdigit(): + if char.isdigit(): self._buffer += char if len(self._buffer) == 2: value = int(self._buffer) self._buffer = "" return value + return None + return None + return None def _try_to_optimize(self, encoded): if encoded[1] in code128.TO: @@ -232,8 +237,7 @@ encoded.extend(self._new_charset("B")) encoded.append(self._convert(self._buffer[0])) self._buffer = "" - encoded = self._try_to_optimize(encoded) - return encoded + return self._try_to_optimize(encoded) def build(self): encoded = self._build() @@ -251,7 +255,7 @@ return super().render(options, text) -class Gs1_128(Code128): +class Gs1_128(Code128): # noqa: N801 """ following the norm, a gs1-128 barcode is a subset of code 128 barcode, it can be generated by prepending the code with the FNC1 character @@ -263,7 +267,7 @@ FNC1_CHAR = "\xf1" - def __init__(self, code, writer=None): + def __init__(self, code, writer=None) -> None: code = self.FNC1_CHAR + code super().__init__(code, writer) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/ean.py new/python-barcode-0.15.1/barcode/ean.py --- old/python-barcode-0.14.0/barcode/ean.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/ean.py 2023-07-06 00:56:49.000000000 +0200 @@ -41,7 +41,7 @@ digits = 12 - def __init__(self, ean, writer=None, no_checksum=False, guardbar=False): + def __init__(self, ean, writer=None, no_checksum=False, guardbar=False) -> None: ean = ean[: self.digits] if not ean.isdigit(): raise IllegalCharacterError("EAN code can only contain numbers.") @@ -72,7 +72,7 @@ self.MIDDLE = _ean.MIDDLE self.writer = writer or self.default_writer() - def __str__(self): + def __str__(self) -> str: return self.ean def get_fullcode(self): @@ -127,11 +127,10 @@ class EuropeanArticleNumber13WithGuard(EuropeanArticleNumber13): - name = "EAN-13 with guards" - def __init__(self, *args, guardbar=True, **kwargs): - return super().__init__(*args, guardbar=guardbar, **kwargs) + def __init__(self, ean, writer=None, no_checksum=False, guardbar=True) -> None: + super().__init__(ean, writer, no_checksum, guardbar) class JapanArticleNumber(EuropeanArticleNumber13): @@ -148,7 +147,7 @@ valid_country_codes = list(range(450, 460)) + list(range(490, 500)) - def __init__(self, jan, *args, **kwargs): + def __init__(self, jan, *args, **kwargs) -> None: if int(jan[:3]) not in self.valid_country_codes: raise WrongCountryCodeError( "Country code isn't between 450-460 or 490-500." @@ -192,11 +191,10 @@ class EuropeanArticleNumber8WithGuard(EuropeanArticleNumber8): - name = "EAN-8 with guards" - def __init__(self, *args, guardbar=True, **kwargs): - return super().__init__(*args, guardbar=guardbar, **kwargs) + def __init__(self, ean, writer=None, no_checksum=False, guardbar=True) -> None: + super().__init__(ean, writer, no_checksum, guardbar) class EuropeanArticleNumber14(EuropeanArticleNumber13): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/errors.py new/python-barcode-0.15.1/barcode/errors.py --- old/python-barcode-0.14.0/barcode/errors.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/errors.py 2023-07-06 00:56:49.000000000 +0200 @@ -3,10 +3,10 @@ class BarcodeError(Exception): - def __init__(self, msg): + def __init__(self, msg) -> None: self.msg = msg - def __str__(self): + def __str__(self) -> str: return self.msg diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/isxn.py new/python-barcode-0.15.1/barcode/isxn.py --- old/python-barcode-0.14.0/barcode/isxn.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/isxn.py 2023-07-06 00:56:49.000000000 +0200 @@ -40,14 +40,13 @@ name = "ISBN-13" - def __init__(self, isbn, writer=None): + def __init__(self, isbn, writer=None) -> None: isbn = isbn.replace("-", "") self.isbn13 = isbn if isbn[:3] not in ("978", "979"): raise WrongCountryCodeError("ISBN must start with 978 or 979.") - if isbn[:3] == "979": - if isbn[3:5] not in ("10", "11"): - raise BarcodeError("ISBN must start with 97910 or 97911.") + if isbn[:3] == "979" and isbn[3:4] not in ("1", "8"): + raise BarcodeError("ISBN must start with 97910 or 97911.") super().__init__(isbn, writer) @@ -66,21 +65,21 @@ digits = 9 - def __init__(self, isbn, writer=None): + def __init__(self, isbn, writer=None) -> None: isbn = isbn.replace("-", "") isbn = isbn[: self.digits] + super().__init__("978" + isbn, writer) self.isbn10 = isbn self.isbn10 = f"{isbn}{self._calculate_checksum()}" - super().__init__("978" + isbn, writer) def _calculate_checksum(self): tmp = sum(x * int(y) for x, y in enumerate(self.isbn10[:9], start=1)) % 11 if tmp == 10: return "X" - else: - return tmp - def __str__(self): + return tmp + + def __str__(self) -> str: return self.isbn10 @@ -99,7 +98,7 @@ digits = 7 - def __init__(self, issn, writer=None): + def __init__(self, issn, writer=None) -> None: issn = issn.replace("-", "") issn = issn[: self.digits] self.issn = issn @@ -114,13 +113,13 @@ ) if tmp == 10: return "X" - else: - return tmp + + return tmp def make_ean(self): return f"977{self.issn[:7]}00{self._calculate_checksum()}" - def __str__(self): + def __str__(self) -> str: return self.issn diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/itf.py new/python-barcode-0.15.1/barcode/itf.py --- old/python-barcode-0.14.0/barcode/itf.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/itf.py 2023-07-06 00:56:49.000000000 +0200 @@ -29,7 +29,7 @@ name = "ITF" - def __init__(self, code, writer=None, narrow=2, wide=5): + def __init__(self, code, writer=None, narrow=2, wide=5) -> None: if not code.isdigit(): raise IllegalCharacterError("ITF code can only contain numbers.") # Length must be even, prepend 0 if necessary @@ -40,7 +40,7 @@ self.narrow = narrow self.wide = wide - def __str__(self): + def __str__(self) -> str: return self.code def get_fullcode(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/upc.py new/python-barcode-0.15.1/barcode/upc.py --- old/python-barcode-0.14.0/barcode/upc.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/upc.py 2023-07-06 00:56:49.000000000 +0200 @@ -22,7 +22,7 @@ digits = 11 - def __init__(self, upc, writer=None, make_ean=False): + def __init__(self, upc, writer=None, make_ean=False) -> None: """Initializes new UPC-A barcode. :param str upc: The upc number as string. @@ -44,17 +44,17 @@ self.upc = f"{upc}{self.calculate_checksum()}" self.writer = writer or self.default_writer() - def __str__(self): + def __str__(self) -> str: if self.ean: return "0" + self.upc - else: - return self.upc + + return self.upc def get_fullcode(self): if self.ean: return "0" + self.upc - else: - return self.upc + + return self.upc def calculate_checksum(self): """Calculates the checksum for UPCA/UPC codes @@ -72,8 +72,8 @@ check = (evensum + oddsum * 3) % 10 if check == 0: return 0 - else: - return 10 - check + + return 10 - check def build(self): """Builds the barcode pattern from 'self.upc' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/version.py new/python-barcode-0.15.1/barcode/version.py --- old/python-barcode-0.14.0/barcode/version.py 2022-05-17 12:06:06.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/version.py 2023-07-06 00:56:54.000000000 +0200 @@ -1,5 +1,4 @@ -# coding: utf-8 # file generated by setuptools_scm # don't change, don't track in version control -version = '0.14.0' -version_tuple = (0, 14, 0) +__version__ = version = '0.15.1' +__version_tuple__ = version_tuple = (0, 15, 1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/barcode/writer.py new/python-barcode-0.15.1/barcode/writer.py --- old/python-barcode-0.14.0/barcode/writer.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/barcode/writer.py 2023-07-06 00:56:49.000000000 +0200 @@ -80,8 +80,12 @@ """ def __init__( - self, initialize=None, paint_module=None, paint_text=None, finish=None - ): + self, + initialize=None, + paint_module=None, + paint_text=None, + finish=None, + ) -> None: self._callbacks = { "initialize": initialize, "paint_module": paint_module, @@ -101,6 +105,8 @@ self.text_line_distance = 1 self.center_text = True self.guard_height_factor = 1.1 + self.margin_top = 1 + self.margin_bottom = 1 def calculate_size(self, modules_per_line, number_of_lines): """Calculates the size of the barcode in pixel. @@ -115,7 +121,9 @@ :rtype: Tuple """ width = 2 * self.quiet_zone + modules_per_line * self.module_width - height = 2.0 + self.module_height * number_of_lines + height = ( + self.margin_bottom + self.margin_top + self.module_height * number_of_lines + ) number_of_text_lines = len(self.text.splitlines()) if self.font_size and self.text: height += ( @@ -204,7 +212,7 @@ """ if self._callbacks["initialize"] is not None: self._callbacks["initialize"](code) - ypos = 1.0 + ypos = self.margin_top base_height = self.module_height for cc, line in enumerate(code): # Left quiet zone is x startposition @@ -257,11 +265,7 @@ if not text["start"]: # If we don't have any start value, print the entire ean ypos += self.text_distance - if self.center_text: - # better center position for text - xpos = bxs + ((bxe - bxs) / 2.0) - else: - xpos = bxs + xpos = bxs + (bxe - bxs) / 2.0 if self.center_text else bxs self._callbacks["paint_text"](xpos, ypos) else: # Else, divide the ean into blocks and print each block @@ -271,7 +275,7 @@ # Calculates the position of the text by getting the difference # between a guard end and the next start text["start"].pop(0) - for (s, e) in zip(text["start"], text["end"]): + for s, e in zip(text["start"], text["end"]): text["xpos"].append(e + (s - e) / 2) # The last text block is always put after the last guard end @@ -283,7 +287,7 @@ ypos += pt2mm(self.font_size) blocks = self.text - for (text_, xpos) in zip(blocks, text["xpos"]): + for text_, xpos in zip(blocks, text["xpos"]): self.text = text_ self._callbacks["paint_text"](xpos, ypos) @@ -291,7 +295,7 @@ class SVGWriter(BaseWriter): - def __init__(self): + def __init__(self) -> None: BaseWriter.__init__( self, self._init, self._create_module, self._create_text, self._finish ) @@ -344,10 +348,7 @@ def _create_text(self, xpos, ypos): # check option to override self.text with self.human (barcode as # human readable data, can be used to print own formats) - if self.human != "": - barcodetext = self.human - else: - barcodetext = self.text + barcodetext = self.human if self.human != "" else self.text for subtext in barcodetext.split("\n"): element = self._document.createElement("text") attributes = { @@ -367,10 +368,10 @@ def _finish(self): if self.compress: return self._document.toxml(encoding="UTF-8") - else: - return self._document.toprettyxml( - indent=4 * " ", newl=os.linesep, encoding="UTF-8" - ) + + return self._document.toprettyxml( + indent=4 * " ", newl=os.linesep, encoding="UTF-8" + ) def save(self, filename, output): if self.compress: @@ -396,12 +397,12 @@ ImageWriter = None else: - class ImageWriter(BaseWriter): # type: ignore + class ImageWriter(BaseWriter): # type: ignore[no-redef] format: str mode: str dpi: int - def __init__(self, format="PNG", mode="RGB"): + def __init__(self, format="PNG", mode="RGB") -> None: """Initialise a new write instance. :params format: The file format for the generated image. This parameter can @@ -428,7 +429,7 @@ size = [ (mm2px(xpos, self.dpi), mm2px(ypos, self.dpi)), ( - mm2px(xpos + width, self.dpi), + mm2px(xpos + width, self.dpi) - 1, mm2px(ypos + self.module_height, self.dpi), ), ] @@ -438,13 +439,13 @@ font_size = int(mm2px(pt2mm(self.font_size), self.dpi)) font = ImageFont.truetype(self.font_path, font_size) for subtext in self.text.split("\n"): - width, height = font.getsize(subtext) - # determine the maximum width of each line pos = ( - mm2px(xpos, self.dpi) - width // 2, - mm2px(ypos, self.dpi) - height, + mm2px(xpos, self.dpi), + mm2px(ypos, self.dpi), + ) + self._draw.text( + pos, subtext, font=font, fill=self.foreground, anchor="md" ) - self._draw.text(pos, subtext, font=font, fill=self.foreground) ypos += pt2mm(self.font_size) / 2 + self.text_line_distance def _finish(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/docs/changelog.rst new/python-barcode-0.15.1/docs/changelog.rst --- old/python-barcode-0.14.0/docs/changelog.rst 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/docs/changelog.rst 2023-07-06 00:56:49.000000000 +0200 @@ -1,9 +1,23 @@ Changelog --------- -v0.14.0 +v0.15.1 +~~~~~~~~~~ + +* Add missing dependency to release script. + +v0.15.0 ~~~~~~~~~~ +* **Breaking** Dropped support for Python 3.6. +* Added support for Python 3.11. +* Fixed compatibility with Pillow 10.0. +* Updated ISBN to support newer allocated ranges. +* Improved type hints. + +v0.14.0 +~~~~~~~ + * **Breaking**: The default dimensions have changed slightly. This is so that the results of generating a PNG and an SVG look more alike. * Previous versions included an empty text element for SVGs with no comment. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/docs/conf.py new/python-barcode-0.15.1/docs/conf.py --- old/python-barcode-0.14.0/docs/conf.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/docs/conf.py 2023-07-06 00:56:49.000000000 +0200 @@ -1,3 +1,4 @@ +# noqa: INP001 # Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full @@ -8,9 +9,6 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) import barcode # -- Project information ----------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/docs/getting-started.rst new/python-barcode-0.15.1/docs/getting-started.rst --- old/python-barcode-0.14.0/docs/getting-started.rst 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/docs/getting-started.rst 2023-07-06 00:56:49.000000000 +0200 @@ -43,7 +43,7 @@ # Write to a file-like object: rv = BytesIO() - EAN13(str("100000902922"), writer=SVGWriter()).write(rv) + EAN13("100000902922", writer=SVGWriter()).write(rv) # Or to an actual file: with open("somefile.svg", "wb") as f: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/docs/writers.rst new/python-barcode-0.15.1/docs/writers.rst --- old/python-barcode-0.14.0/docs/writers.rst 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/docs/writers.rst 2023-07-06 00:56:49.000000000 +0200 @@ -32,6 +32,7 @@ :font_size: Font size of the text under the barcode in pt as *integer*. + Font size zero suppresses text. Defaults to **10**. :text_distance: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/pyproject.toml new/python-barcode-0.15.1/pyproject.toml --- old/python-barcode-0.14.0/pyproject.toml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-barcode-0.15.1/pyproject.toml 2023-07-06 00:56:49.000000000 +0200 @@ -0,0 +1,45 @@ +[build-system] +requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"] + +[tool.setuptools_scm] +write_to = "barcode/version.py" +version_scheme = "post-release" + +[tool.black] +target-version = ['py37'] + +[tool.ruff] +select = [ + "F", + "E", + "W", + "I", + "N", + "UP", + "YTT", + "BLE", + "B", + "C4", + "ISC", + "ICN", + "G", + "INP", + "PIE", + "PYI", + "PT", + "Q", + "RSE", + "RET", + "SIM", + "TID", + "TCH", + "INT", + "ERA", + "PGH", + "PLE", + "RUF", +] +target-version = "py37" + +[tool.ruff.isort] +force-single-line = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/python_barcode.egg-info/PKG-INFO new/python-barcode-0.15.1/python_barcode.egg-info/PKG-INFO --- old/python-barcode-0.14.0/python_barcode.egg-info/PKG-INFO 2022-05-17 12:06:06.000000000 +0200 +++ new/python-barcode-0.15.1/python_barcode.egg-info/PKG-INFO 2023-07-06 00:56:54.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-barcode -Version: 0.14.0 +Version: 0.15.1 Summary: Create standard barcodes with Python. No external modules needed. (optional Pillow support included). Home-page: https://github.com/WhyNotHugo/python-barcode Author: Hugo Osvaldo Barrera et al @@ -13,10 +13,6 @@ :target: https://github.com/WhyNotHugo/python-barcode/actions :alt: CI status - .. image:: https://codecov.io/gh/WhyNotHugo/python-barcode/branch/main/graph/badge.svg - :target: https://codecov.io/gh/WhyNotHugo/python-barcode - :alt: Build coverage - .. image:: https://readthedocs.org/projects/python-barcode/badge/ :target: https://python-barcode.rtfd.org/ :alt: documentation @@ -38,7 +34,7 @@ There are no external dependencies when generating SVG files. Pillow is required for generating images (e.g.: PNGs). - Support Python 3.6 to 3.10. + Support Python 3.7 to 3.11. .. image:: example-ean13.png :target: https://github.com/WhyNotHugo/python-barcode @@ -62,11 +58,11 @@ Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Software Development :: Libraries :: Python Modules Provides-Extra: images diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/python_barcode.egg-info/SOURCES.txt new/python-barcode-0.15.1/python_barcode.egg-info/SOURCES.txt --- old/python-barcode-0.14.0/python_barcode.egg-info/SOURCES.txt 2022-05-17 12:06:06.000000000 +0200 +++ new/python-barcode-0.15.1/python_barcode.egg-info/SOURCES.txt 2023-07-06 00:56:54.000000000 +0200 @@ -3,6 +3,7 @@ LICENCE README.rst example-ean13.png +pyproject.toml setup.cfg setup.py tox.ini @@ -46,6 +47,7 @@ python_barcode.egg-info/entry_points.txt python_barcode.egg-info/requires.txt python_barcode.egg-info/top_level.txt +tests/__init__.py tests/test_builds.py tests/test_checksums.py tests/test_init.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/setup.cfg new/python-barcode-0.15.1/setup.cfg --- old/python-barcode-0.14.0/setup.cfg 2022-05-17 12:06:06.000000000 +0200 +++ new/python-barcode-0.15.1/setup.cfg 2023-07-06 00:56:54.000000000 +0200 @@ -1,13 +1,3 @@ -[flake8] -exclude = docs/conf.py -extend-ignore = - E203, # Black-incompatible colon spacing. - W503, # Line jump before binary operator. -max-line-length = 88 - -[isort] -force_single_line = true - [tool:pytest] addopts = -vv diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/setup.py new/python-barcode-0.15.1/setup.py --- old/python-barcode-0.14.0/setup.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/setup.py 2023-07-06 00:56:49.000000000 +0200 @@ -23,19 +23,15 @@ "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", "Topic :: Multimedia :: Graphics", "Topic :: Software Development :: Libraries :: Python Modules", ], entry_points={"console_scripts": ["python-barcode = barcode.pybarcode:main"]}, - use_scm_version={ - "version_scheme": "post-release", - "write_to": "barcode/version.py", - }, setup_requires=["setuptools_scm"], extras_require={"images": ["pillow"]}, include_package_data=True, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/tests/test_checksums.py new/python-barcode-0.15.1/tests/test_checksums.py --- old/python-barcode-0.14.0/tests/test_checksums.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/tests/test_checksums.py 2023-07-06 00:56:49.000000000 +0200 @@ -3,44 +3,44 @@ def test_code39_checksum(): code39 = get_barcode("code39", "Code39") - assert "CODE39W" == code39.get_fullcode() + assert code39.get_fullcode() == "CODE39W" def test_pzn_checksum(): pzn = get_barcode("pzn", "103940") - assert "PZN-1039406" == pzn.get_fullcode() + assert pzn.get_fullcode() == "PZN-1039406" def test_ean13_checksum(): ean = get_barcode("ean13", "400614457735") - assert "4006144577350" == ean.get_fullcode() + assert ean.get_fullcode() == "4006144577350" def test_ean8_checksum(): ean = get_barcode("ean8", "6032299") - assert "60322999" == ean.get_fullcode() + assert ean.get_fullcode() == "60322999" def test_jan_checksum(): jan = get_barcode("jan", "491400614457") - assert "4914006144575" == jan.get_fullcode() + assert jan.get_fullcode() == "4914006144575" def test_ean14_checksum(): ean = get_barcode("ean14", "1234567891258") - assert "12345678912589" == ean.get_fullcode() + assert ean.get_fullcode() == "12345678912589" def test_isbn10_checksum(): isbn = get_barcode("isbn10", "376926085") - assert "3769260856" == isbn.isbn10 + assert isbn.isbn10 == "3769260856" def test_isbn13_checksum(): isbn = get_barcode("isbn13", "978376926085") - assert "9783769260854" == isbn.get_fullcode() + assert isbn.get_fullcode() == "9783769260854" def test_gs1_128_checksum(): gs1_128 = get_barcode("gs1_128", "00376401856400470087") - assert "00376401856400470087" == gs1_128.get_fullcode() + assert gs1_128.get_fullcode() == "00376401856400470087" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/tests/test_init.py new/python-barcode-0.15.1/tests/test_init.py --- old/python-barcode-0.14.0/tests/test_init.py 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/tests/test_init.py 2023-07-06 00:56:49.000000000 +0200 @@ -39,4 +39,4 @@ bio = BytesIO() barcode.generate("ean13", "123455559121112", output=bio) # XXX: File is not 100% deterministic; needs to be addressed at some point. - # assert len(bio.getvalue()) == 6127 + # assert len(bio.getvalue()) == 6127 # noqa: ERA001 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-barcode-0.14.0/tox.ini new/python-barcode-0.15.1/tox.ini --- old/python-barcode-0.14.0/tox.ini 2022-05-17 12:05:57.000000000 +0200 +++ new/python-barcode-0.15.1/tox.ini 2023-07-06 00:56:49.000000000 +0200 @@ -1,5 +1,5 @@ [tox] -envlist = {py36,py37,py38,py39,py310}{,-images} +envlist = {py37,py38,py39,py310,py311}{,-images} skip_missing_interpreters = True [testenv] @@ -9,8 +9,3 @@ images: Pillow commands = pytest --cov barcode usedevelop = True - -[flake8] -exclude=.tox,build,.eggs -application-import-names=barcode,tests -import-order-style=smarkets