Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-roman for openSUSE:Factory 
checked in at 2025-05-09 18:50:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-roman (Old)
 and      /work/SRC/openSUSE:Factory/.python-roman.new.30101 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-roman"

Fri May  9 18:50:35 2025 rev:14 rq:1276020 version:5.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-roman/python-roman.changes        
2023-05-04 17:09:04.455837915 +0200
+++ /work/SRC/openSUSE:Factory/.python-roman.new.30101/python-roman.changes     
2025-05-09 18:53:08.929548006 +0200
@@ -1,0 +2,13 @@
+Fri May  9 05:17:15 UTC 2025 - Steve Kowalik <[email protected]>
+
+- Update to 5.0:
+  * Drop support for Python 3.7, 3.8.
+  * Add support for lower case roman numerals.
+  * Remove overlooked mentions of the Python 2.1.1 license
+  * Add support for Python 3.12 and 3.13.
+  * Change license to the Zope Public License (ZPL) version 2.1
+  * Add support for Python 3.10, 3.11.
+  * Drop support for Python 2.7, 3.5, 3.6.
+- Switch to pyproject macros.
+
+-------------------------------------------------------------------

Old:
----
  roman-3.3.tar.gz

New:
----
  roman-5.0.tar.gz

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

Other differences:
------------------
++++++ python-roman.spec ++++++
--- /var/tmp/diff_new_pack.yQhYIC/_old  2025-05-09 18:53:09.413568140 +0200
+++ /var/tmp/diff_new_pack.yQhYIC/_new  2025-05-09 18:53:09.413568140 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-roman
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,19 +17,22 @@
 
 
 %define packagename roman
-%{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %{?sle15_python_module_pythons}
 Name:           python-roman
-Version:        3.3
+Version:        5.0
 Release:        0
 Summary:        Integer to Roman numerals converter
-License:        Python-2.0
-Group:          Development/Languages/Python
+License:        ZPL-2.1
 URL:            https://github.com/zopefoundation/roman
 Source:         
https://files.pythonhosted.org/packages/source/r/roman/%{packagename}-%{version}.tar.gz
+BuildRequires:  %{python_module base >= 3.9}
+BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module wheel}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
+Requires(post): update-alternatives
+Requires(postun): update-alternatives
 BuildArch:      noarch
 %python_subpackages
 
@@ -41,10 +44,10 @@
 %setup -q -n %{packagename}-%{version}
 
 %build
-%python_build
+%pyproject_wheel
 
 %install
-%python_install
+%pyproject_install
 %python_clone -a %{buildroot}%{_bindir}/%{packagename}
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 %prepare_alternative %{packagename}
@@ -59,9 +62,10 @@
 %pyunittest discover -v src
 
 %files %{python_files}
-%doc CHANGES.txt
-%pycache_only %{python_sitelib}/__pycache__/%{packagename}*
-%{python_sitelib}/*egg-info/
+%doc README.rst CHANGES.rst
+%license LICENSE.txt
+%pycache_only %{python_sitelib}/__pycache__/%{packagename}*pyc
+%{python_sitelib}/%{packagename}-%{version}.dist-info
 %{python_sitelib}/%{packagename}.py
 %python_alternative %{_bindir}/roman
 

++++++ roman-3.3.tar.gz -> roman-5.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/.pre-commit-config.yaml 
new/roman-5.0/.pre-commit-config.yaml
--- old/roman-3.3/.pre-commit-config.yaml       1970-01-01 01:00:00.000000000 
+0100
+++ new/roman-5.0/.pre-commit-config.yaml       2025-01-15 07:43:12.000000000 
+0100
@@ -0,0 +1,28 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/pure-python
+minimum_pre_commit_version: '3.6'
+repos:
+  - repo: https://github.com/pycqa/isort
+    rev: "5.13.2"
+    hooks:
+    - id: isort
+  - repo: https://github.com/hhatto/autopep8
+    rev: "v2.3.1"
+    hooks:
+    - id: autopep8
+      args: [--in-place, --aggressive, --aggressive]
+  - repo: https://github.com/asottile/pyupgrade
+    rev: v3.19.0
+    hooks:
+    - id: pyupgrade
+      args: [--py39-plus]
+  - repo: https://github.com/isidentical/teyit
+    rev: 0.4.3
+    hooks:
+    - id: teyit
+  - repo: https://github.com/PyCQA/flake8
+    rev: "7.1.1"
+    hooks:
+    - id: flake8
+      additional_dependencies:
+        - flake8-debugger == 4.1.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/CHANGES.rst new/roman-5.0/CHANGES.rst
--- old/roman-3.3/CHANGES.rst   1970-01-01 01:00:00.000000000 +0100
+++ new/roman-5.0/CHANGES.rst   2025-01-15 07:43:12.000000000 +0100
@@ -0,0 +1,83 @@
+Change log
+==========
+
+5.0 (2025-01-15)
+----------------
+
+- Drop support for Python 3.7, 3.8.
+
+- Add support for lower case roman numerals.
+  (`#22 <https://github.com/zopefoundation/roman/pull/22>`_)
+
+
+4.2 (2024-04-25)
+----------------
+
+- Remove overlooked mentions of the Python 2.1.1 license
+  (`#17 <https://github.com/zopefoundation/roman/issues/17>`_)
+
+- Add support for Python 3.12 and 3.13.
+
+
+4.1 (2023-05-26)
+----------------
+
+- Change license to the Zope Public License (ZPL) version 2.1
+  (`#15 <https://github.com/zopefoundation/roman/issues/15>`_)
+
+
+4.0 (2023-02-28)
+----------------
+
+- Add support for Python 3.10, 3.11.
+
+- Drop support for Python 2.7, 3.5, 3.6.
+
+
+3.3 (2020-07-12)
+----------------
+
+- added support for Python 3.9
+
+- added CLI command ``roman`` with ``-r/--reverse`` to convert back from Roman
+
+- added simple usage instructions
+
+
+3.2 (2019-04-14)
+----------------
+
+- expanded test coverage
+
+- Added support for 0 -> N
+  (see https://en.wikipedia.org/wiki/Roman_numerals#Zero)
+
+- Added support for Python 3.8
+
+
+3.1 (2018-10-24)
+----------------
+
+- Added support for Python 3.7.
+
+
+3.0 (2018-05-28)
+----------------
+
+- Added support for Python 3.5, 3.6 and PyPy3.
+
+- Dropped support for Python 2.6 and 3.3.
+
+
+2.0.0 (2013-02-25)
+------------------
+
+- Added Python 3.3 and PyPy support.
+
+- Added tests.
+
+
+1.4.0 (2009-07-23)
+------------------
+
+- Initial PyPI release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/CHANGES.txt new/roman-5.0/CHANGES.txt
--- old/roman-3.3/CHANGES.txt   2020-07-12 17:23:31.000000000 +0200
+++ new/roman-5.0/CHANGES.txt   1970-01-01 01:00:00.000000000 +0100
@@ -1,50 +0,0 @@
-Change log
-==========
-
-3.3 (2020-07-12)
-----------------
-
-- added support for Python 3.9
-
-- added CLI command ``roman`` with ``-r/--reverse`` to convert back from Roman
-
-- added simple usage instructions
-
-
-3.2 (2019-04-14)
-----------------
-
-- expanded test coverage
-
-- Added support for 0 -> N
-  (see https://en.wikipedia.org/wiki/Roman_numerals#Zero)
-
-- Added support for Python 3.8
-
-
-3.1 (2018-10-24)
-----------------
-
-- Added support for Python 3.7.
-
-
-3.0 (2018-05-28)
-----------------
-
-- Added support for Python 3.5, 3.6 and PyPy3.
-
-- Dropped support for Python 2.6 and 3.3.
-
-
-2.0.0 (2013-02-25)
-------------------
-
-- Added Python 3.3 and PyPy support.
-
-- Added tests.
-
-
-1.4.0 (2009-07-23)
-------------------
-
-- Initial PyPI release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/CONTRIBUTING.md 
new/roman-5.0/CONTRIBUTING.md
--- old/roman-3.3/CONTRIBUTING.md       1970-01-01 01:00:00.000000000 +0100
+++ new/roman-5.0/CONTRIBUTING.md       2025-01-15 07:43:12.000000000 +0100
@@ -0,0 +1,23 @@
+<!--
+Generated from:
+https://github.com/zopefoundation/meta/tree/master/config/pure-python
+--> 
+# Contributing to zopefoundation projects
+
+The projects under the zopefoundation GitHub organization are open source and
+welcome contributions in different forms:
+
+* bug reports
+* code improvements and bug fixes
+* documentation improvements
+* pull request reviews
+
+For any changes in the repository besides trivial typo fixes you are required
+to sign the contributor agreement. See
+https://www.zope.dev/developer/becoming-a-committer.html for details.
+
+Please visit our [Developer
+Guidelines](https://www.zope.dev/developer/guidelines.html) if you'd like to
+contribute code changes and our [guidelines for reporting
+bugs](https://www.zope.dev/developer/reporting-bugs.html) if you want to file a
+bug report.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/COPYRIGHT.txt new/roman-5.0/COPYRIGHT.txt
--- old/roman-3.3/COPYRIGHT.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/roman-5.0/COPYRIGHT.txt 2025-01-15 07:43:12.000000000 +0100
@@ -0,0 +1 @@
+Mark Pilgrim and Contributors
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/LICENSE.txt new/roman-5.0/LICENSE.txt
--- old/roman-3.3/LICENSE.txt   1970-01-01 01:00:00.000000000 +0100
+++ new/roman-5.0/LICENSE.txt   2025-01-15 07:43:12.000000000 +0100
@@ -0,0 +1,44 @@
+Zope Public License (ZPL) Version 2.1
+
+A copyright notice accompanies this license document that identifies the
+copyright holders.
+
+This license has been certified as open source. It has also been designated as
+GPL compatible by the Free Software Foundation (FSF).
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions in source code must retain the accompanying copyright
+notice, this list of conditions, and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the accompanying copyright
+notice, this list of conditions, and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+3. Names of the copyright holders must not be used to endorse or promote
+products derived from this software without prior written permission from the
+copyright holders.
+
+4. The right to distribute this software or to use it for any purpose does not
+give you the right to use Servicemarks (sm) or Trademarks (tm) of the
+copyright
+holders. Use of them is covered by separate agreement with the copyright
+holders.
+
+5. If any files are modified, you must cause the modified files to carry
+prominent notices stating that you changed the files and the date of any
+change.
+
+Disclaimer
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+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 HOLDERS 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.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/MANIFEST.in new/roman-5.0/MANIFEST.in
--- old/roman-3.3/MANIFEST.in   2019-04-14 18:13:46.000000000 +0200
+++ new/roman-5.0/MANIFEST.in   2025-01-15 07:43:12.000000000 +0100
@@ -1,9 +1,10 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/pure-python
+include *.md
 include *.rst
 include *.txt
-include *.py
 include buildout.cfg
 include tox.ini
+include .pre-commit-config.yaml
 
-recursive-include src *
-
-global-exclude *.pyc
+recursive-include src *.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/PKG-INFO new/roman-5.0/PKG-INFO
--- old/roman-3.3/PKG-INFO      2020-07-12 17:28:16.000000000 +0200
+++ new/roman-5.0/PKG-INFO      2025-01-15 07:43:13.169437400 +0100
@@ -1,131 +1,163 @@
 Metadata-Version: 2.1
 Name: roman
-Version: 3.3
+Version: 5.0
 Summary: Integer to Roman numerals converter
 Home-page: https://github.com/zopefoundation/roman
 Author: Mark Pilgrim
-Author-email: [email protected]
-License: Python 2.1.1
-Description: .. image:: 
https://travis-ci.org/zopefoundation/roman.svg?branch=master
-            :target: https://travis-ci.org/zopefoundation/roman
-        
-        .. image:: 
https://coveralls.io/repos/github/zopefoundation/roman/badge.svg?branch=master
-            :target: 
https://coveralls.io/github/zopefoundation/roman?branch=master
-        
-        .. image:: https://img.shields.io/pypi/v/roman.svg
-            :target: https://pypi.org/project/roman/
-            :alt: Current version on PyPI
-        
-        .. image:: https://img.shields.io/pypi/pyversions/roman.svg
-            :target: https://pypi.org/project/roman/
-            :alt: Supported Python versions
-        
-        roman
-        =====
-        
-        Small helper library to convert arabic to roman numerals.
-        
-        There are two ways to use this library.
-        
-        1. Importing it into your application
-        
-        .. code-block:: python
-        
-            import roman
-        
-            # to roman
-            number = int(input('> ')) # 10
-            print(roman.toRoman(number))
-        
-            # from roman
-            number = input('> ') # X
-            print(roman.fromRoman(number))
-        
-        
-        2. ``roman`` CLI command
-        
-        .. code-block:: bash
-        
-            ~$ roman 972
-            CMLXXII
-            # use the -r/--reverse to conver Roman numerals
-            ~$ roman -r CMLXXII
-            972
-            # case insensitive
-            ~$ roman -r cMlxxii
-            972
-        
-        
-        
-        Change log
-        ==========
-        
-        3.3 (2020-07-12)
-        ----------------
-        
-        - added support for Python 3.9
-        
-        - added CLI command ``roman`` with ``-r/--reverse`` to convert back 
from Roman
-        
-        - added simple usage instructions
-        
-        
-        3.2 (2019-04-14)
-        ----------------
-        
-        - expanded test coverage
-        
-        - Added support for 0 -> N
-          (see https://en.wikipedia.org/wiki/Roman_numerals#Zero)
-        
-        - Added support for Python 3.8
-        
-        
-        3.1 (2018-10-24)
-        ----------------
-        
-        - Added support for Python 3.7.
-        
-        
-        3.0 (2018-05-28)
-        ----------------
-        
-        - Added support for Python 3.5, 3.6 and PyPy3.
-        
-        - Dropped support for Python 2.6 and 3.3.
-        
-        
-        2.0.0 (2013-02-25)
-        ------------------
-        
-        - Added Python 3.3 and PyPy support.
-        
-        - Added tests.
-        
-        
-        1.4.0 (2009-07-23)
-        ------------------
-        
-        - Initial PyPI release.
-        
+Maintainer: Zope Foundation and Contributors
+Maintainer-email: [email protected]
+License: ZPL 2.1
 Keywords: roman
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-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: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: License :: OSI Approved :: Zope Public License
 Classifier: Programming Language :: Python
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
-Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*
+Requires-Python: >=3.9
 Description-Content-Type: text/x-rst
+License-File: LICENSE.txt
+
+.. image:: 
https://github.com/zopefoundation/roman/actions/workflows/tests.yml/badge.svg
+    :target: 
https://github.com/zopefoundation/roman/actions/workflows/tests.yml
+
+.. image:: 
https://coveralls.io/repos/github/zopefoundation/roman/badge.svg?branch=master
+    :target: https://coveralls.io/github/zopefoundation/roman?branch=master
+
+.. image:: https://img.shields.io/pypi/v/roman.svg
+    :target: https://pypi.org/project/roman/
+    :alt: Current version on PyPI
+
+.. image:: https://img.shields.io/pypi/pyversions/roman.svg
+    :target: https://pypi.org/project/roman/
+    :alt: Supported Python versions
+
+roman
+=====
+
+Small helper library to convert arabic to roman numerals.
+
+There are two ways to use this library.
+
+1. Importing it into your application
+
+.. code-block:: python
+
+    import roman
+
+    # to roman
+    number = int(input('> ')) # 10
+    print(roman.toRoman(number))
+
+    # from roman
+    number = input('> ') # X
+    print(roman.fromRoman(number))
+
+
+2. ``roman`` CLI command
+
+.. code-block:: bash
+
+    ~$ roman 972
+    CMLXXII
+    # use the -r/--reverse to convert Roman numerals
+    ~$ roman -r CMLXXII
+    972
+    # case insensitive
+    ~$ roman -r cMlxxii
+    972
+
+
+
+Change log
+==========
+
+5.0 (2025-01-15)
+----------------
+
+- Drop support for Python 3.7, 3.8.
+
+- Add support for lower case roman numerals.
+  (`#22 <https://github.com/zopefoundation/roman/pull/22>`_)
+
+
+4.2 (2024-04-25)
+----------------
+
+- Remove overlooked mentions of the Python 2.1.1 license
+  (`#17 <https://github.com/zopefoundation/roman/issues/17>`_)
+
+- Add support for Python 3.12 and 3.13.
+
+
+4.1 (2023-05-26)
+----------------
+
+- Change license to the Zope Public License (ZPL) version 2.1
+  (`#15 <https://github.com/zopefoundation/roman/issues/15>`_)
+
+
+4.0 (2023-02-28)
+----------------
+
+- Add support for Python 3.10, 3.11.
+
+- Drop support for Python 2.7, 3.5, 3.6.
+
+
+3.3 (2020-07-12)
+----------------
+
+- added support for Python 3.9
+
+- added CLI command ``roman`` with ``-r/--reverse`` to convert back from Roman
+
+- added simple usage instructions
+
+
+3.2 (2019-04-14)
+----------------
+
+- expanded test coverage
+
+- Added support for 0 -> N
+  (see https://en.wikipedia.org/wiki/Roman_numerals#Zero)
+
+- Added support for Python 3.8
+
+
+3.1 (2018-10-24)
+----------------
+
+- Added support for Python 3.7.
+
+
+3.0 (2018-05-28)
+----------------
+
+- Added support for Python 3.5, 3.6 and PyPy3.
+
+- Dropped support for Python 2.6 and 3.3.
+
+
+2.0.0 (2013-02-25)
+------------------
+
+- Added Python 3.3 and PyPy support.
+
+- Added tests.
+
+
+1.4.0 (2009-07-23)
+------------------
+
+- Initial PyPI release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/README.rst new/roman-5.0/README.rst
--- old/roman-3.3/README.rst    2020-07-12 17:26:07.000000000 +0200
+++ new/roman-5.0/README.rst    2025-01-15 07:43:12.000000000 +0100
@@ -1,5 +1,5 @@
-.. image:: https://travis-ci.org/zopefoundation/roman.svg?branch=master
-    :target: https://travis-ci.org/zopefoundation/roman
+.. image:: 
https://github.com/zopefoundation/roman/actions/workflows/tests.yml/badge.svg
+    :target: 
https://github.com/zopefoundation/roman/actions/workflows/tests.yml
 
 .. image:: 
https://coveralls.io/repos/github/zopefoundation/roman/badge.svg?branch=master
     :target: https://coveralls.io/github/zopefoundation/roman?branch=master
@@ -40,7 +40,7 @@
 
     ~$ roman 972
     CMLXXII
-    # use the -r/--reverse to conver Roman numerals
+    # use the -r/--reverse to convert Roman numerals
     ~$ roman -r CMLXXII
     972
     # case insensitive
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/bootstrap.py new/roman-5.0/bootstrap.py
--- old/roman-3.3/bootstrap.py  2019-04-14 18:14:21.000000000 +0200
+++ new/roman-5.0/bootstrap.py  1970-01-01 01:00:00.000000000 +0100
@@ -1,189 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Bootstrap a buildout-based project
-
-Simply run this script in a directory containing a buildout.cfg.
-The script accepts buildout command-line options, so you can
-use the -c option to specify an alternate configuration file.
-"""
-
-import os
-import shutil
-import sys
-import tempfile
-
-from optparse import OptionParser
-
-tmpeggs = tempfile.mkdtemp()
-
-usage = '''\
-[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
-
-Bootstraps a buildout-based project.
-
-Simply run this script in a directory containing a buildout.cfg, using the
-Python that you want bin/buildout to use.
-
-Note that by using --find-links to point to local resources, you can keep
-this script from going over the network.
-'''
-
-parser = OptionParser(usage=usage)
-parser.add_option("-v", "--version", help="use a specific zc.buildout version")
-
-parser.add_option("-t", "--accept-buildout-test-releases",
-                  dest='accept_buildout_test_releases',
-                  action="store_true", default=False,
-                  help=("Normally, if you do not specify a --version, the "
-                        "bootstrap script and buildout gets the newest "
-                        "*final* versions of zc.buildout and its recipes and "
-                        "extensions for you.  If you use this flag, "
-                        "bootstrap and buildout will get the newest releases "
-                        "even if they are alphas or betas."))
-parser.add_option("-c", "--config-file",
-                  help=("Specify the path to the buildout configuration "
-                        "file to be used."))
-parser.add_option("-f", "--find-links",
-                  help=("Specify a URL to search for buildout releases"))
-parser.add_option("--allow-site-packages",
-                  action="store_true", default=False,
-                  help=("Let bootstrap.py use existing site packages"))
-parser.add_option("--setuptools-version",
-                  help="use a specific setuptools version")
-
-
-options, args = parser.parse_args()
-
-######################################################################
-# load/install setuptools
-
-try:
-    if options.allow_site_packages:
-        import setuptools
-        import pkg_resources
-    from urllib.request import urlopen
-except ImportError:
-    from urllib2 import urlopen
-
-ez = {}
-exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
-
-if not options.allow_site_packages:
-    # ez_setup imports site, which adds site packages
-    # this will remove them from the path to ensure that incompatible versions
-    # of setuptools are not in the path
-    import site
-    # inside a virtualenv, there is no 'getsitepackages'.
-    # We can't remove these reliably
-    if hasattr(site, 'getsitepackages'):
-        for sitepackage_path in site.getsitepackages():
-            sys.path[:] = [x for x in sys.path if sitepackage_path not in x]
-
-setup_args = dict(to_dir=tmpeggs, download_delay=0)
-
-if options.setuptools_version is not None:
-    setup_args['version'] = options.setuptools_version
-
-ez['use_setuptools'](**setup_args)
-import setuptools
-import pkg_resources
-
-# This does not (always?) update the default working set.  We will
-# do it.
-for path in sys.path:
-    if path not in pkg_resources.working_set.entries:
-        pkg_resources.working_set.add_entry(path)
-
-######################################################################
-# Install buildout
-
-ws = pkg_resources.working_set
-
-cmd = [sys.executable, '-c',
-       'from setuptools.command.easy_install import main; main()',
-       '-mZqNxd', tmpeggs]
-
-find_links = os.environ.get(
-    'bootstrap-testing-find-links',
-    options.find_links or
-    ('http://downloads.buildout.org/'
-     if options.accept_buildout_test_releases else None)
-    )
-if find_links:
-    cmd.extend(['-f', find_links])
-
-setuptools_path = ws.find(
-    pkg_resources.Requirement.parse('setuptools')).location
-
-requirement = 'zc.buildout'
-version = options.version
-if version is None and not options.accept_buildout_test_releases:
-    # Figure out the most recent final version of zc.buildout.
-    import setuptools.package_index
-    _final_parts = '*final-', '*final'
-
-    def _final_version(parsed_version):
-        try:
-            return not parsed_version.is_prerelease
-        except AttributeError:
-            # Older setuptools
-            for part in parsed_version:
-                if (part[:1] == '*') and (part not in _final_parts):
-                    return False
-            return True
-
-    index = setuptools.package_index.PackageIndex(
-        search_path=[setuptools_path])
-    if find_links:
-        index.add_find_links((find_links,))
-    req = pkg_resources.Requirement.parse(requirement)
-    if index.obtain(req) is not None:
-        best = []
-        bestv = None
-        for dist in index[req.project_name]:
-            distv = dist.parsed_version
-            if _final_version(distv):
-                if bestv is None or distv > bestv:
-                    best = [dist]
-                    bestv = distv
-                elif distv == bestv:
-                    best.append(dist)
-        if best:
-            best.sort()
-            version = best[-1].version
-if version:
-    requirement = '=='.join((requirement, version))
-cmd.append(requirement)
-
-import subprocess
-if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0:
-    raise Exception(
-        "Failed to execute command:\n%s" % repr(cmd)[1:-1])
-
-######################################################################
-# Import and run buildout
-
-ws.add_entry(tmpeggs)
-ws.require(requirement)
-import zc.buildout.buildout
-
-if not [a for a in args if '=' not in a]:
-    args.append('bootstrap')
-
-# if -c was provided, we push it back into args for buildout' main function
-if options.config_file is not None:
-    args[0:0] = ['-c', options.config_file]
-
-zc.buildout.buildout.main(args)
-shutil.rmtree(tmpeggs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/buildout.cfg new/roman-5.0/buildout.cfg
--- old/roman-3.3/buildout.cfg  2020-07-12 16:59:25.000000000 +0200
+++ new/roman-5.0/buildout.cfg  1970-01-01 01:00:00.000000000 +0100
@@ -1,8 +0,0 @@
-[buildout]
-develop = .
-parts =
-    test
-
-[test]
-recipe = zc.recipe.testrunner
-eggs = roman
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/pyproject.toml new/roman-5.0/pyproject.toml
--- old/roman-3.3/pyproject.toml        1970-01-01 01:00:00.000000000 +0100
+++ new/roman-5.0/pyproject.toml        2025-01-15 07:43:12.000000000 +0100
@@ -0,0 +1,21 @@
+# 
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/pure-python
+
+[build-system]
+requires = ["setuptools <= 75.6.0"]
+build-backend = "setuptools.build_meta"
+
+[tool.coverage.run]
+branch = true
+source = ["roman"]
+
+[tool.coverage.report]
+fail_under = 100
+precision = 2
+ignore_errors = true
+show_missing = true
+exclude_lines = ["pragma: no cover", "pragma: nocover", "except ImportError:", 
"raise NotImplementedError", "if __name__ == '__main__':", "self.fail", "raise 
AssertionError", "raise unittest.Skip"]
+
+[tool.coverage.html]
+directory = "parts/htmlcov"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/setup.cfg new/roman-5.0/setup.cfg
--- old/roman-3.3/setup.cfg     2020-07-12 17:28:16.000000000 +0200
+++ new/roman-5.0/setup.cfg     2025-01-15 07:43:13.169712500 +0100
@@ -1,32 +1,22 @@
-[bdist_wheel]
-universal = 1
+[flake8]
+doctests = 1
+
+[check-manifest]
+ignore = 
+       .editorconfig
+       .meta.toml
 
 [isort]
 force_single_line = True
 combine_as_imports = True
+sections = FUTURE,STDLIB,THIRDPARTY,ZOPE,FIRSTPARTY,LOCALFOLDER
+known_third_party = docutils, pkg_resources, pytz
+known_zope = 
+known_first_party = 
+default_section = ZOPE
 line_length = 79
 lines_after_imports = 2
 
-[flake8]
-no-accept-encodings = True
-exclude = 
-       bootstrap.py
-
-[coverage:run]
-branch = True
-source = src
-omit = 
-
-[coverage:report]
-fail_under = 95.0
-ignore_errors = True
-precision = 2
-show_missing = False
-sort = Name
-
-[coverage:html]
-directory = parts/coverage
-
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/setup.py new/roman-5.0/setup.py
--- old/roman-3.3/setup.py      2020-07-12 17:28:06.000000000 +0200
+++ new/roman-5.0/setup.py      2025-01-15 07:43:12.000000000 +0100
@@ -1,42 +1,56 @@
+##############################################################################
+#
+# Copyright (c) 2001 Mark Pilgrim and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
 from setuptools import setup
 
 
-desc = ('%s\n\n%s' % (open('README.rst').read(), open('CHANGES.txt').read()))
+desc = ('{}\n\n{}'.format(open('README.rst').read(),
+                          open('CHANGES.rst').read()))
 
 setup(
     name='roman',
-    version='3.3',
+    version='5.0',
     author="Mark Pilgrim",
-    author_email="[email protected]",
+    maintainer="Zope Foundation and Contributors",
+    maintainer_email="[email protected]",
     description="Integer to Roman numerals converter",
     long_description=desc,
     long_description_content_type='text/x-rst',
-    license="Python 2.1.1",
+    license="ZPL 2.1",
     keywords="roman",
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Intended Audience :: Developers',
         'Programming Language :: Python',
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.5',
-        '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',
+        'Programming Language :: Python :: 3.12',
+        'Programming Language :: Python :: 3.13',
         'Programming Language :: Python :: Implementation :: CPython',
         'Programming Language :: Python :: Implementation :: PyPy',
-        'License :: OSI Approved :: Python Software Foundation License',
+        'License :: OSI Approved :: Zope Public License',
         'Programming Language :: Python',
         'Natural Language :: English',
-        'Operating System :: OS Independent'],
+        'Operating System :: OS Independent',
+    ],
     url='https://github.com/zopefoundation/roman',
     package_dir={"": "src"},
-    python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*',
+    python_requires='>=3.9',
     py_modules=["roman"],
     include_package_data=True,
-    test_suite='tests',
     zip_safe=True,
     entry_points={
         'console_scripts': [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/src/roman.egg-info/PKG-INFO 
new/roman-5.0/src/roman.egg-info/PKG-INFO
--- old/roman-3.3/src/roman.egg-info/PKG-INFO   2020-07-12 17:28:16.000000000 
+0200
+++ new/roman-5.0/src/roman.egg-info/PKG-INFO   2025-01-15 07:43:13.000000000 
+0100
@@ -1,131 +1,163 @@
 Metadata-Version: 2.1
 Name: roman
-Version: 3.3
+Version: 5.0
 Summary: Integer to Roman numerals converter
 Home-page: https://github.com/zopefoundation/roman
 Author: Mark Pilgrim
-Author-email: [email protected]
-License: Python 2.1.1
-Description: .. image:: 
https://travis-ci.org/zopefoundation/roman.svg?branch=master
-            :target: https://travis-ci.org/zopefoundation/roman
-        
-        .. image:: 
https://coveralls.io/repos/github/zopefoundation/roman/badge.svg?branch=master
-            :target: 
https://coveralls.io/github/zopefoundation/roman?branch=master
-        
-        .. image:: https://img.shields.io/pypi/v/roman.svg
-            :target: https://pypi.org/project/roman/
-            :alt: Current version on PyPI
-        
-        .. image:: https://img.shields.io/pypi/pyversions/roman.svg
-            :target: https://pypi.org/project/roman/
-            :alt: Supported Python versions
-        
-        roman
-        =====
-        
-        Small helper library to convert arabic to roman numerals.
-        
-        There are two ways to use this library.
-        
-        1. Importing it into your application
-        
-        .. code-block:: python
-        
-            import roman
-        
-            # to roman
-            number = int(input('> ')) # 10
-            print(roman.toRoman(number))
-        
-            # from roman
-            number = input('> ') # X
-            print(roman.fromRoman(number))
-        
-        
-        2. ``roman`` CLI command
-        
-        .. code-block:: bash
-        
-            ~$ roman 972
-            CMLXXII
-            # use the -r/--reverse to conver Roman numerals
-            ~$ roman -r CMLXXII
-            972
-            # case insensitive
-            ~$ roman -r cMlxxii
-            972
-        
-        
-        
-        Change log
-        ==========
-        
-        3.3 (2020-07-12)
-        ----------------
-        
-        - added support for Python 3.9
-        
-        - added CLI command ``roman`` with ``-r/--reverse`` to convert back 
from Roman
-        
-        - added simple usage instructions
-        
-        
-        3.2 (2019-04-14)
-        ----------------
-        
-        - expanded test coverage
-        
-        - Added support for 0 -> N
-          (see https://en.wikipedia.org/wiki/Roman_numerals#Zero)
-        
-        - Added support for Python 3.8
-        
-        
-        3.1 (2018-10-24)
-        ----------------
-        
-        - Added support for Python 3.7.
-        
-        
-        3.0 (2018-05-28)
-        ----------------
-        
-        - Added support for Python 3.5, 3.6 and PyPy3.
-        
-        - Dropped support for Python 2.6 and 3.3.
-        
-        
-        2.0.0 (2013-02-25)
-        ------------------
-        
-        - Added Python 3.3 and PyPy support.
-        
-        - Added tests.
-        
-        
-        1.4.0 (2009-07-23)
-        ------------------
-        
-        - Initial PyPI release.
-        
+Maintainer: Zope Foundation and Contributors
+Maintainer-email: [email protected]
+License: ZPL 2.1
 Keywords: roman
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-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: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: License :: OSI Approved :: Zope Public License
 Classifier: Programming Language :: Python
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
-Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*
+Requires-Python: >=3.9
 Description-Content-Type: text/x-rst
+License-File: LICENSE.txt
+
+.. image:: 
https://github.com/zopefoundation/roman/actions/workflows/tests.yml/badge.svg
+    :target: 
https://github.com/zopefoundation/roman/actions/workflows/tests.yml
+
+.. image:: 
https://coveralls.io/repos/github/zopefoundation/roman/badge.svg?branch=master
+    :target: https://coveralls.io/github/zopefoundation/roman?branch=master
+
+.. image:: https://img.shields.io/pypi/v/roman.svg
+    :target: https://pypi.org/project/roman/
+    :alt: Current version on PyPI
+
+.. image:: https://img.shields.io/pypi/pyversions/roman.svg
+    :target: https://pypi.org/project/roman/
+    :alt: Supported Python versions
+
+roman
+=====
+
+Small helper library to convert arabic to roman numerals.
+
+There are two ways to use this library.
+
+1. Importing it into your application
+
+.. code-block:: python
+
+    import roman
+
+    # to roman
+    number = int(input('> ')) # 10
+    print(roman.toRoman(number))
+
+    # from roman
+    number = input('> ') # X
+    print(roman.fromRoman(number))
+
+
+2. ``roman`` CLI command
+
+.. code-block:: bash
+
+    ~$ roman 972
+    CMLXXII
+    # use the -r/--reverse to convert Roman numerals
+    ~$ roman -r CMLXXII
+    972
+    # case insensitive
+    ~$ roman -r cMlxxii
+    972
+
+
+
+Change log
+==========
+
+5.0 (2025-01-15)
+----------------
+
+- Drop support for Python 3.7, 3.8.
+
+- Add support for lower case roman numerals.
+  (`#22 <https://github.com/zopefoundation/roman/pull/22>`_)
+
+
+4.2 (2024-04-25)
+----------------
+
+- Remove overlooked mentions of the Python 2.1.1 license
+  (`#17 <https://github.com/zopefoundation/roman/issues/17>`_)
+
+- Add support for Python 3.12 and 3.13.
+
+
+4.1 (2023-05-26)
+----------------
+
+- Change license to the Zope Public License (ZPL) version 2.1
+  (`#15 <https://github.com/zopefoundation/roman/issues/15>`_)
+
+
+4.0 (2023-02-28)
+----------------
+
+- Add support for Python 3.10, 3.11.
+
+- Drop support for Python 2.7, 3.5, 3.6.
+
+
+3.3 (2020-07-12)
+----------------
+
+- added support for Python 3.9
+
+- added CLI command ``roman`` with ``-r/--reverse`` to convert back from Roman
+
+- added simple usage instructions
+
+
+3.2 (2019-04-14)
+----------------
+
+- expanded test coverage
+
+- Added support for 0 -> N
+  (see https://en.wikipedia.org/wiki/Roman_numerals#Zero)
+
+- Added support for Python 3.8
+
+
+3.1 (2018-10-24)
+----------------
+
+- Added support for Python 3.7.
+
+
+3.0 (2018-05-28)
+----------------
+
+- Added support for Python 3.5, 3.6 and PyPy3.
+
+- Dropped support for Python 2.6 and 3.3.
+
+
+2.0.0 (2013-02-25)
+------------------
+
+- Added Python 3.3 and PyPy support.
+
+- Added tests.
+
+
+1.4.0 (2009-07-23)
+------------------
+
+- Initial PyPI release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/src/roman.egg-info/SOURCES.txt 
new/roman-5.0/src/roman.egg-info/SOURCES.txt
--- old/roman-3.3/src/roman.egg-info/SOURCES.txt        2020-07-12 
17:28:16.000000000 +0200
+++ new/roman-5.0/src/roman.egg-info/SOURCES.txt        2025-01-15 
07:43:13.000000000 +0100
@@ -1,8 +1,11 @@
-CHANGES.txt
+.pre-commit-config.yaml
+CHANGES.rst
+CONTRIBUTING.md
+COPYRIGHT.txt
+LICENSE.txt
 MANIFEST.in
 README.rst
-bootstrap.py
-buildout.cfg
+pyproject.toml
 setup.cfg
 setup.py
 tox.ini
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/src/roman.egg-info/entry_points.txt 
new/roman-5.0/src/roman.egg-info/entry_points.txt
--- old/roman-3.3/src/roman.egg-info/entry_points.txt   2020-07-12 
17:28:16.000000000 +0200
+++ new/roman-5.0/src/roman.egg-info/entry_points.txt   2025-01-15 
07:43:13.000000000 +0100
@@ -1,3 +1,2 @@
 [console_scripts]
 roman = roman:main
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/src/roman.py new/roman-5.0/src/roman.py
--- old/roman-3.3/src/roman.py  2020-07-12 17:15:16.000000000 +0200
+++ new/roman-5.0/src/roman.py  2025-01-15 07:43:12.000000000 +0100
@@ -1,24 +1,27 @@
-from __future__ import print_function
-
-
+##############################################################################
+#
+# Copyright (c) 2001 Mark Pilgrim and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
 """Convert to and from Roman numerals"""
 
 __author__ = "Mark Pilgrim ([email protected])"
-__version__ = "1.4"
-__date__ = "8 August 2001"
 __copyright__ = """Copyright (c) 2001 Mark Pilgrim
 
 This program is part of "Dive Into Python", a free Python tutorial for
 experienced programmers.  Visit http://diveintopython.org/ for the
 latest version.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the Python 2.1.1 license, available at
-http://www.python.org/2.1.1/license.html
 """
 
 import argparse
-import os
 import re
 import sys
 
@@ -59,7 +62,7 @@
 def toRoman(n):
     """convert integer to Roman numeral"""
     if not isinstance(n, int):
-        raise NotIntegerError("decimals can not be converted")
+        raise NotIntegerError("decimals cannot be converted")
     if not (-1 < n < 5000):
         raise OutOfRangeError("number out of range (must be 0..4999)")
 
@@ -91,8 +94,11 @@
 
 def fromRoman(s):
     """convert Roman numeral to integer"""
+
     if not s:
-        raise InvalidRomanNumeralError('Input can not be blank')
+        raise InvalidRomanNumeralError('Input cannot be blank')
+
+    s = s.upper()  # Handle lowercase inputs
 
     # special case
     if s == 'N':
@@ -130,16 +136,15 @@
 def main():
     args = parse_args()
     if args.reverse:
-        u = args.number.upper()
-        r = fromRoman(u)
+        r = fromRoman(args.number)
         print(r)
     else:
         i = int(args.number)
         n = toRoman(i)
         print(n)
 
-    return os.EX_OK
+    return 0
 
 
-if __name__ == "__main__":
-    sys.exit(main())
+if __name__ == "__main__":  # pragma: no cover
+    sys.exit(main())  # pragma: no cover
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/src/tests.py new/roman-5.0/src/tests.py
--- old/roman-3.3/src/tests.py  2020-07-12 17:15:37.000000000 +0200
+++ new/roman-5.0/src/tests.py  2025-01-15 07:43:12.000000000 +0100
@@ -1,12 +1,20 @@
+##############################################################################
+#
+# Copyright (c) 2001 Mark Pilgrim and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
 import os
 import sys
 import unittest
-
-
-if sys.version_info[0] > 2:
-    from io import StringIO
-else:
-    from StringIO import StringIO
+from io import StringIO
 
 import roman
 
@@ -17,18 +25,13 @@
             (900, 'CM'), (990, 'CMXC'), (998, 'CMXCVIII'), (999, 'CMXCIX'),
             (2013, 'MMXIII'))
 
-if sys.version_info[0] > 2:
-    _str = str
-else:
-    _str = unicode  # NOQA: F821
-
 
 class TestRoman(unittest.TestCase):
 
     def test_toRoman(self):
         for num_arabic, num_roman in TEST_MAP:
             self.assertEqual(roman.toRoman(num_arabic), num_roman,
-                             '%s should be %s' % (num_arabic, num_roman))
+                             f'{num_arabic} should be {num_roman}')
 
     def test_toRoman_errors(self):
         self.assertRaises(roman.OutOfRangeError, roman.toRoman, 100000)
@@ -37,7 +40,7 @@
     def test_fromRoman(self):
         for num_arabic, num_roman in TEST_MAP:
             self.assertEqual(roman.fromRoman(num_roman), num_arabic,
-                             '%s should be %s' % (num_roman, num_arabic))
+                             f'{num_roman} should be {num_arabic}')
 
     def test_fromRoman_errors(self):
         self.assertRaises(
@@ -53,7 +56,7 @@
 
     def test_main_toRoman(self):
         for num_arabic, num_roman in TEST_MAP:
-            sys.argv = ['roman', _str(num_arabic)]
+            sys.argv = ['roman', str(num_arabic)]
             sys.stdout = StringIO()
             ex_st = roman.main()
             output = sys.stdout.getvalue().strip()
@@ -66,7 +69,7 @@
             sys.stdout = StringIO()
             ex_st = roman.main()
             output = sys.stdout.getvalue().strip()
-            self.assertEqual(output, _str(num_arabic))
+            self.assertEqual(output, str(num_arabic))
             self.assertEqual(ex_st, os.EX_OK)
 
     def test_main_fromRoman_caseInsensitive(self):
@@ -75,9 +78,9 @@
             sys.stdout = StringIO()
             ex_st = roman.main()
             output = sys.stdout.getvalue().strip()
-            self.assertEqual(output, _str(num_arabic))
+            self.assertEqual(output, str(num_arabic))
             self.assertEqual(ex_st, os.EX_OK)
 
 
 def test_suite():
-    return unittest.makeSuite(TestRoman)
+    return unittest.defaultTestLoader.loadTestsFromTestCase(TestRoman)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/roman-3.3/tox.ini new/roman-5.0/tox.ini
--- old/roman-3.3/tox.ini       2020-07-12 17:09:18.000000000 +0200
+++ new/roman-5.0/tox.ini       2025-01-15 07:43:12.000000000 +0100
@@ -1,75 +1,75 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/pure-python
 [tox]
+minversion = 3.18
 envlist =
-    py27,
-    py35,
-    py36,
-    py37,
-    py38,
-    py39,
-    pypy,
-    pypy3,
-    lint,
+    release-check
+    lint
+    py39
+    py310
+    py311
+    py312
+    py313
+    py314
+    pypy3
     coverage
 
 [testenv]
+usedevelop = true
+package = wheel
+wheel_build_env = .pkg
+pip_pre = py314: true
+deps =
+    setuptools <= 75.6.0
+    zope.testrunner
 commands =
-    {envbindir}/buildout -c {toxinidir}/buildout.cfg 
buildout:directory={envdir} buildout:develop={toxinidir} install test
-    coverage run {envbindir}/test {posargs:-cv}
+    zope-testrunner --test-path=src {posargs:-vc}
+extras =
+    test
+
+[testenv:setuptools-latest]
+basepython = python3
 deps =
-    zc.buildout
-    coverage
-setenv =
-    COVERAGE_FILE=.coverage.{envname}
-skip_install = true
+    git+https://github.com/pypa/setuptools.git\#egg=setuptools
+    zope.testrunner
 
-[testenv:coverage]
-basepython = python3.6
+[testenv:release-check]
+description = ensure that the distribution is ready to release
+basepython = python3
 skip_install = true
-deps = coverage
-depends =
-    py27,
-    py35,
-    py36,
-    py37,
-    py38,
-    py39,
-    pypy,
-    pypy3,
-setenv =
-    COVERAGE_FILE=.coverage
+deps =
+    setuptools <= 75.6.0
+    twine
+    build
+    check-manifest
+    check-python-versions >= 0.20.0
+    wheel
+commands_pre =
 commands =
-    coverage erase
-    coverage combine
-    coverage html
-    coverage xml
-    coverage report
+    check-manifest
+    check-python-versions --only setup.py,tox.ini,.github/workflows/tests.yml
+    python -m build --sdist --no-isolation
+    twine check dist/*
 
 [testenv:lint]
-basepython = python3.6
+description = This env runs all linters configured in .pre-commit-config.yaml
+basepython = python3
 skip_install = true
-
 deps =
-    isort
-    flake8
-    # helper to generate HTML reports:
-    flake8-html
-    # Useful flake8 plugins that are Python and Plone specific:
-    flake8-coding
-    flake8-debugger
-    flake8-deprecated
-    flake8-todo
-    mccabe
-    # Potential flake8 plugins that should be used:  # TBD
-    #flake8-blind-except
-    #flake8-commas
-    #flake8-docstrings
-    #flake8-mypy
-    #flake8-pep3101
-    #flake8-plone-hasattr
-    #flake8-string-format
-    #flake8_strict
-    #flake8-quotes
+    pre-commit
+commands_pre =
+commands =
+    pre-commit run --all-files --show-diff-on-failure
 
+[testenv:coverage]
+basepython = python3
+allowlist_externals =
+    mkdir
+deps =
+    coverage[toml]
+    zope.testrunner
 commands =
-    - isort --check-only --diff {toxinidir}/src setup.py
-    flake8 src setup.py
+    mkdir -p {toxinidir}/parts/htmlcov
+    coverage run -m zope.testrunner --test-path=src {posargs:-vc}
+    coverage html
+    coverage report

Reply via email to