New Upstream Snapshot - fontpens

Ready changes

Summary

Merged new upstream version: 0.2.4+git20221111.2.776df99 (was: 0.2.4+git20221111.1.776df99).

Resulting package

Built on 2022-12-18T12:30 (took 8m23s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots python3-fontpens

Lintian Result

Diff

diff --git a/.codecov.yml b/.codecov.yml
deleted file mode 100644
index dfac2c6..0000000
--- a/.codecov.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-comment:
-  layout: "diff, files"
-  behavior: default
-  require_changes: true
-coverage:
-    status:
-        project: off
-        patch: off
diff --git a/.coveragerc b/.coveragerc
deleted file mode 100644
index 50cf443..0000000
--- a/.coveragerc
+++ /dev/null
@@ -1,31 +0,0 @@
-[run]
-# measure 'branch' coverage in addition to 'statement' coverage
-# See: http://coverage.readthedocs.io/en/coverage-4.5.1/branch.html
-branch = True
-
-# list of directories or packages to measure
-source = fontPens
-
-[paths]
-source =
-    Lib/fontPens
-    .tox/*/lib/python*/site-packages/fontPens
-    .tox/pypy*/site-packages/fontPens
-
-[report]
-# Regexes for lines to exclude from consideration
-exclude_lines =
-    # keywords to use in inline comments to skip coverage
-    pragma: no cover
-
-    # don't complain if tests don't hit defensive assertion code
-    (raise|except)(\s)?NotImplementedError
-
-    # don't complain if non-runnable code isn't run
-    if __name__ == .__main__.:
-
-# ignore source code that can’t be found
-ignore_errors = True
-
-# when running a summary report, show missing lines
-show_missing = True
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 74b92f6..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-# Byte-compiled / optimized files
-__pycache__/
-*.py[co]
-*$py.class
-
-.cache
-.eggs
-.tox
-.coverage
-.coverage.*
-.pytest_cache
-htmlcov
-
-# OSX Finder
-.DS_Store
-
-# directories created during build/install process
-build/
-dist/
-Lib/fontPens.egg-info/
-
-# PyCharm's directory
-.idea/
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 25b0847..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,97 +0,0 @@
-sudo: false
-
-language: python
-python: 3.6
-
-# empty "env:" is needed for 'allow_failures'
-# https://docs.travis-ci.com/user/customizing-the-build/#Rows-that-are-Allowed-to-Fail
-env:
-
-matrix:
-  fast_finish: true
-  exclude:
-    - python: 3.6
-  include:
-    - python: 2.7
-      env: TOXENV=py27-cov
-    - python: 3.6
-      env:
-        - TOXENV=py36-cov
-        - BUILD_DIST=true
-    - python: 3.7
-      env: TOXENV=py37-cov
-      dist: xenial
-      sudo: true
-    - python: pypy
-      env: TOXENV=pypy-nocov
-    - language: generic
-      os: osx
-      env: TOXENV=py27-cov
-    - language: generic
-      os: osx
-      env:
-        - TOXENV=py3-cov
-        - HOMEBREW_NO_AUTO_UPDATE=1
-    - env:
-        - TOXENV=py27-nocov
-        - PYENV_VERSION='2.7.6'
-        - PYENV_VERSION_STRING='Python 2.7.6'
-        - PYENV_ROOT=$HOME/.travis-pyenv
-        - TRAVIS_PYENV_VERSION='0.4.0'
-  allow_failures:
-    # We use fast_finish + allow_failures because OSX builds take forever
-    # https://blog.travis-ci.com/2013-11-27-fast-finishing-builds
-    - language: generic
-      os: osx
-      env: TOXENV=py27-cov
-    - language: generic
-      os: osx
-      env:
-        - TOXENV=py3-cov
-        - HOMEBREW_NO_AUTO_UPDATE=1
-
-cache:
-  - pip
-  - directories:
-    - $HOME/.pyenv_cache
-
-before_install:
-  - source ./.travis/before_install.sh
-
-install:
-  - ./.travis/install.sh
-
-script:
-  - ./.travis/run.sh
-
-after_success:
-  - ./.travis/after_success.sh
-
-before_deploy:
-  - ./.travis/before_deploy.sh
-
-deploy:
-  # deploy to Github Releases on tags
-  - provider: releases
-    api_key:
-      secure: Kdf6HnU4mm0UK+yd+ywpN87IcUbhQ2ShjEMwenIBnrvBd2tD1hzHWrfKJVpSnVBy8QEtOcEqdRsSL4NGq/3qgp5cAxkf8hLtNChaVACeQsmQA8SLauipFPukCtkrpNdOlSDZLNHoGcIcVVPyTEkLVUpt68BxBpX8M859pA9KZ7KqFnAQFiCH06Qi5NZNHYzFBFeEcpFZyeo+3BAMEMWNfHRfkebC7BIim4de79tCui7F3C54vcGug/CuGKGU8Pbd7nfYXwEtibCDV9uOKF+kW5m7923fAvhJILrzDe3/C9KjaqtH/HQiiTNMlJ1TK1R9rodP3UUu2fN0oPpe/bMQvJUzllHMeHRB4luuaYMriRDtcCmZwCCOFeeHo3QxK8zfjv/v1lcVivPuhJiFXvx+1mU9ktSnQ5iD9QU0Si97ctJPypLaUeZq1WoluaKDv8Yw0Lmq7mZPo+rByikcGwTX7nx/LJYGlw9gtIdXSLVpsglPilM+2jVDOo7h+8oslD/AKs1S3ujDAFOeogL3SylSyswDHr4GLQMZBf/NrPBQHJge3uMYaldwKcT8xzu3LpkyCazYvt4f+Mh3RYfmE06rk86+R3luk5NNHjIJvFm0I4j+I7PtjpQYCnx6vtkH4rR0FBuE2/T0V8BBxp2UbIZF/wztBtV89oiO6yBGOauwkTM=
-    skip_cleanup: true
-    file_glob: true
-    file: "dist/*"
-    on:
-      tags: true
-      repo: robofab-developers/fontPens
-      all_branches: true
-      condition: "$BUILD_DIST == true"
-  # deploy to PyPI on tags
-  - provider: pypi
-    user: benkiel
-    password:
-      secure: "dQmUNMwDeq7162p3IE3M9d9BW3lfk/chaW8SY605YikW7J56bfT1CQFaOiYumdvMF/eWBrVxbQbdwdupL2sDm1dSgYKWu0ite1jePaoTkMhEKFr+XW7GogcX+LOiFa7FITscnWgV02XwijStbklQmZ2beBe/tjB5Ug/Swx6CVCsTN/j1n0+r3UjtHcsnVgN+XAhpC0+ewoyKkoKP/aalb2gGFwsRDh2SzJZ/sOICHmmjJUGDB6/vS8tGgnI1arDSpSH7KDNB1dVAfDvjK9yXFEDPkYO5vEU//vZWP9yKTqXPmDiv+SMg959UcdgCUnNPSv44/VDtqv9kNhG4t3Ye4bjV/WBnyZ3SiWF8XHI+r3nk6x6Swjhq8ZRPk861JhDPK67kCJHdmMjOfaKy+MoTWscDqLlzxxAABSv+HkgQ3LiHKqBbvJVBbuhbmFdo8qtmZXKl4z8LlUcTHskMAioEMbueKRW/+jEDN5xm0h7c4W2mfHyrnn3Td5hWpmXZKe7ZKqbU8koBruGJpnC6miE689nO6HLpQbW8AjYy6ZOkz4HbkZCAYh0NqYe7qwgFKx8+iYy5smWyiqAS7A4D1kyFzaXV5jEe87jddDc/wMofgcKSUBOGe9eM/w4FKVRCW8jAMkjMiZKVMzHE2f9nk9q4A8bU++Da/AgIw3JKOVnWAPg="
-    skip_cleanup: true
-    distributions: "sdist bdist_wheel"
-    on:
-      tags: true
-      repo: robofab-developers/fontPens
-      all_branches: true
-      condition: "$BUILD_DIST == true"
diff --git a/.travis/after_success.sh b/.travis/after_success.sh
deleted file mode 100755
index d113fe7..0000000
--- a/.travis/after_success.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-set -e
-set -x
-
-if [ "$TRAVIS_OS_NAME" == "osx" ]; then
-    source .venv/bin/activate
-fi
-
-# upload coverage data to Codecov.io
-[[ ${TOXENV} == *"-cov"* ]] && tox -e codecov
diff --git a/.travis/before_deploy.sh b/.travis/before_deploy.sh
deleted file mode 100755
index c113466..0000000
--- a/.travis/before_deploy.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-set -e
-set -x
-
-# build sdist and wheel distribution packages in ./dist folder.
-# Travis runs the `before_deploy` stage before each deployment, but
-# we only want to build them once, as we want to use the same
-# files for both Github and PyPI
-if $(ls ./dist/fontPens*.zip > /dev/null 2>&1) && \
-    $(ls ./dist/fontPens*.whl > /dev/null 2>&1); then
-  echo "Distribution packages already exists; skipping"
-else
-  tox -e bdist
-fi
diff --git a/.travis/before_install.sh b/.travis/before_install.sh
deleted file mode 100755
index 8cc4edb..0000000
--- a/.travis/before_install.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-if [[ -n "$PYENV_VERSION" ]]; then
-    wget https://github.com/praekeltfoundation/travis-pyenv/releases/download/${TRAVIS_PYENV_VERSION}/setup-pyenv.sh
-    source setup-pyenv.sh
-fi
diff --git a/.travis/install.sh b/.travis/install.sh
deleted file mode 100755
index bb51644..0000000
--- a/.travis/install.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-
-set -e
-set -x
-
-ci_requirements="pip setuptools tox"
-
-if [ "$TRAVIS_OS_NAME" == "osx" ]; then
-    if [[ ${TOXENV} == *"py27"* ]]; then
-        # install pip on the system python
-        curl -O https://bootstrap.pypa.io/get-pip.py
-        python get-pip.py --user
-        # install virtualenv and create virtual environment
-        python -m pip install --user virtualenv
-        python -m virtualenv .venv/
-    elif [[ ${TOXENV} == *"py3"* ]]; then
-        # install current python3 with homebrew
-        # NOTE: the formula is now named just "python"
-        brew install python
-        command -v python3
-        python3 --version
-        python3 -m pip install virtualenv
-        python3 -m virtualenv .venv/
-    else
-        echo "unsupported $TOXENV: "${TOXENV}
-        exit 1
-    fi
-    # activate virtual environment
-    source .venv/bin/activate
-fi
-
-python -m pip install $ci_requirements
diff --git a/.travis/run.sh b/.travis/run.sh
deleted file mode 100755
index 6804f7d..0000000
--- a/.travis/run.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-set -e
-set -x
-
-if [ "$TRAVIS_OS_NAME" == "osx" ]; then
-    source .venv/bin/activate
-fi
-
-tox
diff --git a/Lib/fontPens.egg-info/PKG-INFO b/Lib/fontPens.egg-info/PKG-INFO
new file mode 100644
index 0000000..188d6ce
--- /dev/null
+++ b/Lib/fontPens.egg-info/PKG-INFO
@@ -0,0 +1,42 @@
+Metadata-Version: 2.1
+Name: fontPens
+Version: 0.2.5.dev0
+Summary: A collection of classes implementing the pen protocol for manipulating glyphs.
+Home-page: https://github.com/robotools/fontPens
+Author: Just van Rossum, Tal Leming, Erik van Blokland, Ben Kiel, others
+Author-email: info@robofab.com
+Maintainer: Just van Rossum, Tal Leming, Erik van Blokland, Ben Kiel
+Maintainer-email: info@robofab.com
+License: OpenSource, BSD-style
+Platform: Any
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Console
+Classifier: Environment :: Other Environment
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Multimedia :: Graphics
+Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
+Requires-Python: >=3.6
+License-File: LICENSE.txt
+
+|Build Status| |Coverage| |PyPI| |Versions|
+
+fontPens
+--------
+
+A collection of classes implementing the pen protocol for manipulating glyphs.
+
+
+.. |Build Status| image:: https://travis-ci.org/robotools/fontPens.svg?branch=master
+   :target: https://travis-ci.org/robotools/fontPens
+.. |PyPI| image:: https://img.shields.io/pypi/v/fontPens.svg
+   :target: https://pypi.org/project/fontPens
+.. |Versions| image:: https://img.shields.io/badge/python-2.7%2C%203.7-blue.svg
+   :alt: Python Versions
+.. |Coverage| image:: https://codecov.io/gh/robotools/fontPens/branch/master/graph/badge.svg
+   :target: https://codecov.io/gh/robotools/fontPens
diff --git a/Lib/fontPens.egg-info/SOURCES.txt b/Lib/fontPens.egg-info/SOURCES.txt
new file mode 100644
index 0000000..5e2204b
--- /dev/null
+++ b/Lib/fontPens.egg-info/SOURCES.txt
@@ -0,0 +1,25 @@
+LICENSE.txt
+MANIFEST.in
+README.rst
+pyproject.toml
+setup.cfg
+setup.py
+Lib/fontPens/__init__.py
+Lib/fontPens/angledMarginPen.py
+Lib/fontPens/digestPointPen.py
+Lib/fontPens/flattenPen.py
+Lib/fontPens/guessSmoothPointPen.py
+Lib/fontPens/marginPen.py
+Lib/fontPens/penTools.py
+Lib/fontPens/printPen.py
+Lib/fontPens/printPointPen.py
+Lib/fontPens/recordingPointPen.py
+Lib/fontPens/spikePen.py
+Lib/fontPens/thresholdPen.py
+Lib/fontPens/thresholdPointPen.py
+Lib/fontPens/transformPointPen.py
+Lib/fontPens.egg-info/PKG-INFO
+Lib/fontPens.egg-info/SOURCES.txt
+Lib/fontPens.egg-info/dependency_links.txt
+Lib/fontPens.egg-info/requires.txt
+Lib/fontPens.egg-info/top_level.txt
\ No newline at end of file
diff --git a/Lib/fontPens.egg-info/dependency_links.txt b/Lib/fontPens.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Lib/fontPens.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/requirements.txt b/Lib/fontPens.egg-info/requires.txt
similarity index 100%
rename from requirements.txt
rename to Lib/fontPens.egg-info/requires.txt
diff --git a/Lib/fontPens.egg-info/top_level.txt b/Lib/fontPens.egg-info/top_level.txt
new file mode 100644
index 0000000..f33e771
--- /dev/null
+++ b/Lib/fontPens.egg-info/top_level.txt
@@ -0,0 +1 @@
+fontPens
diff --git a/Lib/fontPens/__init__.py b/Lib/fontPens/__init__.py
index 788da1f..3ed7634 100644
--- a/Lib/fontPens/__init__.py
+++ b/Lib/fontPens/__init__.py
@@ -1 +1 @@
-__version__ = "0.2.4"
+__version__ = "0.2.5.dev0"
diff --git a/Lib/fontPens/marginPen.py b/Lib/fontPens/marginPen.py
index d09571e..522da97 100644
--- a/Lib/fontPens/marginPen.py
+++ b/Lib/fontPens/marginPen.py
@@ -94,14 +94,6 @@ class MarginPen(BasePen):
     def _endPath(self):
         self.currentPt = None
 
-    def addComponent(self, baseGlyph, transformation):
-        if self.glyphSet is None:
-            return
-        if baseGlyph in self.glyphSet:
-            glyph = self.glyphSet[baseGlyph]
-        if glyph is not None:
-            glyph.draw(self)
-
     def getMargins(self):
         """
         Return the extremes of the slice for all contours combined, i.e. the whole glyph.
@@ -154,13 +146,11 @@ def _makeTestGlyph():
     # a curve
     pen.curveTo((120, 700), (120, 300), (100, 100))
     pen.closePath()
-    # pen.addComponent("a", (1, 0, 0, 1, 0, 0))
     return testGlyph
 
 
 def _testMarginPen():
     """
-    >>> from fontPens.printPen import PrintPen
     >>> glyph = _makeTestGlyph()
     >>> pen = MarginPen(dict(), 200, isHorizontal=True)
     >>> glyph.draw(pen)
@@ -169,6 +159,33 @@ def _testMarginPen():
     """
 
 
+def _makeTestFont():
+    # make a simple glyph that we can test the pens with.
+    from fontParts.fontshell import RFont
+    testFont = RFont()
+    baseGlyph = testFont.newGlyph("baseGlyph")
+    pen = baseGlyph.getPen()
+    pen.moveTo((100, 100))
+    pen.lineTo((600, 100))
+    pen.lineTo((600, 600))
+    pen.lineTo((100, 600))
+    pen.closePath()
+
+    testGlyph = testFont.newGlyph("testGlyph")
+    testGlyph.appendComponent("baseGlyph", scale=.5)
+    return testGlyph
+
+
+def _testMarginPenComponent():
+    """
+    >>> glyph = _makeTestFont()
+    >>> pen = MarginPen(glyph.layer, 200, isHorizontal=True)
+    >>> glyph.draw(pen)
+    >>> pen.getAll()
+    [50.0, 300.0]
+    """
+
+
 if __name__ == "__main__":
     import doctest
     doctest.testmod()
diff --git a/Lib/fontPens/spikePen.py b/Lib/fontPens/spikePen.py
new file mode 100644
index 0000000..e2c615f
--- /dev/null
+++ b/Lib/fontPens/spikePen.py
@@ -0,0 +1,170 @@
+from fontPens.flattenPen import FlattenPen
+from fontTools.pens.basePen import BasePen
+from math import atan2, sin, cos, pi
+
+
+class SpikePen(BasePen):
+
+    """
+    Add narly spikes or dents to the glyph.
+    patternFunc is an optional function which recalculates the offset.
+    """
+
+    def __init__(self, otherPen, segmentLength=20, spikeLength=40, patternFunc=None):
+        self.otherPen = otherPen
+        self.segmentLength = segmentLength
+        self.spikeLength = spikeLength
+        self.patternFunc = patternFunc
+
+    def _moveTo(self, pt):
+        self._points = [pt]
+
+    def _lineTo(self, pt):
+        self._points.append(pt)
+
+    def _processPoints(self):
+        pointCount = len(self._points)
+        for i in range(0, pointCount):
+            x, y = self._points[i]
+
+            if not i % 2:
+                previousPoint = self._points[i - 1]
+                nextPoint = self._points[(i + 1) % pointCount]
+                angle = atan2(previousPoint[0] - nextPoint[0], previousPoint[1] - nextPoint[1])
+                if self.patternFunc is not None:
+                    thisSpikeLength = self.patternFunc(self.spikeLength)
+                else:
+                    thisSpikeLength = self.spikeLength
+                x -= sin(angle + .5 * pi) * thisSpikeLength
+                y -= cos(angle + .5 * pi) * thisSpikeLength
+
+            if i == 0:
+                self.otherPen.moveTo((x, y))
+            else:
+                self.otherPen.lineTo((x, y))
+
+    def closePath(self):
+        # pop last point
+        self._points.pop()
+        self._processPoints()
+        self.otherPen.closePath()
+
+    def endPath(self):
+        self._processPoints()
+        self.otherPen.endPath()
+
+
+def spikeGlyph(aGlyph, segmentLength=20, spikeLength=40, patternFunc=None):
+    from fontTools.pens.recordingPen import RecordingPen
+    recorder = RecordingPen()
+    spikePen = SpikePen(recorder, spikeLength=spikeLength, patternFunc=patternFunc)
+    filterPen = FlattenPen(spikePen, approximateSegmentLength=segmentLength, segmentLines=True)
+    aGlyph.draw(filterPen)
+    aGlyph.clear()
+    recorder.replay(aGlyph.getPen())
+    return aGlyph
+
+
+# =========
+# = tests =
+# =========
+
+def _makeTestGlyphRect():
+    # make a simple glyph that we can test the pens with.
+    from fontParts.fontshell import RGlyph
+    testGlyph = RGlyph()
+    testGlyph.name = "testGlyph"
+    testGlyph.width = 500
+    pen = testGlyph.getPen()
+    pen.moveTo((100, 100))
+    pen.lineTo((100, 300))
+    pen.lineTo((300, 300))
+    pen.lineTo((300, 100))
+    pen.closePath()
+    return testGlyph
+
+
+def _makeTestGlyphLine():
+    from fontParts.fontshell import RGlyph
+    testGlyph = RGlyph()
+    testGlyph.name = "testGlyph"
+    testGlyph.width = 500
+    testPen = testGlyph.getPen()
+    testPen.moveTo((10, 0))
+    testPen.lineTo((30, 0))
+    testPen.lineTo((50, 0))
+    testPen.lineTo((70, 0))
+    testPen.lineTo((90, 0))
+    testPen.endPath()
+    return testGlyph
+
+
+def _testSpikePen():
+    """
+    >>> from fontPens.printPen import PrintPen
+    >>> glyph = _makeTestGlyphLine()
+    >>> pen = SpikePen(PrintPen())
+    >>> glyph.draw(pen)
+    pen.moveTo((9.999999999999995, 40.0))
+    pen.lineTo((30, 0))
+    pen.lineTo((50.0, -40.0))
+    pen.lineTo((70, 0))
+    pen.lineTo((90.0, 40.0))
+    pen.endPath()
+    """
+
+
+def _testSpikeGlyph():
+    """
+    >>> from fontPens.printPen import PrintPen
+    >>> glyph = _makeTestGlyphRect()
+    >>> spikeGlyph(glyph) #doctest: +ELLIPSIS
+    <RGlyph...
+    >>> glyph.draw(PrintPen())
+    pen.moveTo((128.2842712474619, 128.2842712474619))
+    pen.lineTo((100.0, 120.0))
+    pen.lineTo((140.0, 140.0))
+    pen.lineTo((100.0, 160.0))
+    pen.lineTo((140.0, 180.0))
+    pen.lineTo((100.0, 200.0))
+    pen.lineTo((140.0, 220.0))
+    pen.lineTo((100.0, 240.0))
+    pen.lineTo((140.0, 260.0))
+    pen.lineTo((100.0, 280.0))
+    pen.lineTo((128.2842712474619, 271.7157287525381))
+    pen.lineTo((120.0, 300.0))
+    pen.lineTo((140.0, 260.0))
+    pen.lineTo((160.0, 300.0))
+    pen.lineTo((180.0, 260.0))
+    pen.lineTo((200.0, 300.0))
+    pen.lineTo((220.0, 260.0))
+    pen.lineTo((240.0, 300.0))
+    pen.lineTo((260.0, 260.0))
+    pen.lineTo((280.0, 300.0))
+    pen.lineTo((271.7157287525381, 271.7157287525381))
+    pen.lineTo((300.0, 280.0))
+    pen.lineTo((260.0, 260.0))
+    pen.lineTo((300.0, 240.0))
+    pen.lineTo((260.0, 220.0))
+    pen.lineTo((300.0, 200.0))
+    pen.lineTo((260.0, 180.0))
+    pen.lineTo((300.0, 160.0))
+    pen.lineTo((260.0, 140.0))
+    pen.lineTo((300.0, 120.0))
+    pen.lineTo((271.7157287525381, 128.2842712474619))
+    pen.lineTo((280.0, 100.0))
+    pen.lineTo((260.0, 140.0))
+    pen.lineTo((240.0, 100.0))
+    pen.lineTo((220.0, 140.0))
+    pen.lineTo((200.0, 100.0))
+    pen.lineTo((180.0, 140.0))
+    pen.lineTo((160.0, 100.0))
+    pen.lineTo((140.0, 140.0))
+    pen.lineTo((120.0, 100.0))
+    pen.closePath()
+    """
+
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()
\ No newline at end of file
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..188d6ce
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,42 @@
+Metadata-Version: 2.1
+Name: fontPens
+Version: 0.2.5.dev0
+Summary: A collection of classes implementing the pen protocol for manipulating glyphs.
+Home-page: https://github.com/robotools/fontPens
+Author: Just van Rossum, Tal Leming, Erik van Blokland, Ben Kiel, others
+Author-email: info@robofab.com
+Maintainer: Just van Rossum, Tal Leming, Erik van Blokland, Ben Kiel
+Maintainer-email: info@robofab.com
+License: OpenSource, BSD-style
+Platform: Any
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Console
+Classifier: Environment :: Other Environment
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Multimedia :: Graphics
+Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
+Requires-Python: >=3.6
+License-File: LICENSE.txt
+
+|Build Status| |Coverage| |PyPI| |Versions|
+
+fontPens
+--------
+
+A collection of classes implementing the pen protocol for manipulating glyphs.
+
+
+.. |Build Status| image:: https://travis-ci.org/robotools/fontPens.svg?branch=master
+   :target: https://travis-ci.org/robotools/fontPens
+.. |PyPI| image:: https://img.shields.io/pypi/v/fontPens.svg
+   :target: https://pypi.org/project/fontPens
+.. |Versions| image:: https://img.shields.io/badge/python-2.7%2C%203.7-blue.svg
+   :alt: Python Versions
+.. |Coverage| image:: https://codecov.io/gh/robotools/fontPens/branch/master/graph/badge.svg
+   :target: https://codecov.io/gh/robotools/fontPens
diff --git a/README.rst b/README.rst
index 10536b9..975d7e3 100644
--- a/README.rst
+++ b/README.rst
@@ -6,11 +6,11 @@ fontPens
 A collection of classes implementing the pen protocol for manipulating glyphs.
 
 
-.. |Build Status| image:: https://travis-ci.org/robofab-developers/fontPens.svg?branch=master
-   :target: https://travis-ci.org/robofab-developers/fontPens
+.. |Build Status| image:: https://travis-ci.org/robotools/fontPens.svg?branch=master
+   :target: https://travis-ci.org/robotools/fontPens
 .. |PyPI| image:: https://img.shields.io/pypi/v/fontPens.svg
    :target: https://pypi.org/project/fontPens
 .. |Versions| image:: https://img.shields.io/badge/python-2.7%2C%203.7-blue.svg
    :alt: Python Versions
-.. |Coverage| image:: https://codecov.io/gh/robofab-developers/fontPens/branch/master/graph/badge.svg
-   :target: https://codecov.io/gh/robofab-developers/fontPens
+.. |Coverage| image:: https://codecov.io/gh/robotools/fontPens/branch/master/graph/badge.svg
+   :target: https://codecov.io/gh/robotools/fontPens
diff --git a/debian/changelog b/debian/changelog
index a63d199..4f4780d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+fontpens (0.2.4+git20221111.2.776df99-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 18 Dec 2022 12:25:27 -0000
+
 fontpens (0.2.4-1) unstable; urgency=medium
 
   * Team upload
diff --git a/dev-requirements.txt b/dev-requirements.txt
deleted file mode 100644
index 38cfb30..0000000
--- a/dev-requirements.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-pytest>=3.0
-tox>=2.5
-fontParts>=0.8.4
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..fed528d
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools"]
+build-backend = "setuptools.build_meta"
diff --git a/setup.cfg b/setup.cfg
index 5e36d90..dea2b1e 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.2.4
+current_version = 0.2.5.dev0
 commit = True
 tag = False
 tag_name = v{new_version}
@@ -45,3 +45,7 @@ addopts =
 	-r a
 	--doctest-modules
 
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff --git a/setup.py b/setup.py
old mode 100755
new mode 100644
index 3949abc..595635b
--- a/setup.py
+++ b/setup.py
@@ -143,16 +143,17 @@ with open('README.rst', 'r') as f:
 
 setup_params = dict(
     name="fontPens",
-    version="0.2.4",
+    version="0.2.5.dev0",
     description=("A collection of classes implementing the pen "
                  "protocol for manipulating glyphs."),
-    author="Just van Rossum, Tal Leming, Erik van Blokland, others",
+    author="Just van Rossum, Tal Leming, Erik van Blokland, Ben Kiel, others",
     author_email="info@robofab.com",
-    maintainer="Just van Rossum, Tal Leming, Erik van Blokland",
+    maintainer="Just van Rossum, Tal Leming, Erik van Blokland, Ben Kiel",
     maintainer_email="info@robofab.com",
-    url="https://github.com/robofab-developers/fontPens",
+    url="https://github.com/robotools/fontPens",
     license="OpenSource, BSD-style",
     platforms=["Any"],
+    python_requires=">=3.6",
     long_description=long_description,
     package_dir={'': 'Lib'},
     packages=find_packages('Lib'),
@@ -179,6 +180,7 @@ setup_params = dict(
         "Natural Language :: English",
         "Operating System :: OS Independent",
         "Programming Language :: Python",
+        "Programming Language :: Python :: 3",
         "Topic :: Multimedia :: Graphics",
         "Topic :: Multimedia :: Graphics :: Graphics Conversion",
     ],
diff --git a/tox.ini b/tox.ini
deleted file mode 100644
index 85ef405..0000000
--- a/tox.ini
+++ /dev/null
@@ -1,64 +0,0 @@
-# Tox (http://tox.testrun.org/) is a tool for running tests
-# in multiple virtualenvs. This configuration file will run the
-# test suite on all supported python versions. To use it, "pip install tox"
-# and then run "tox" from this directory.
-
-[tox]
-envlist = py{27,36,37}-cov, py{py}-nocov, htmlcov
-
-[testenv]
-deps =
-    cov: coverage>=4.3
-    pytest
-    fontparts>=0.8.1
-    FontTools[ufo,lxml,unicode]>=3.32.0
-install_command =
-    pip install -v {opts} {packages}
-commands =
-    cov: coverage run --parallel-mode -m pytest {posargs}
-    nocov: pytest {posargs}
-
-[testenv:htmlcov]
-basepython = {env:TOXPYTHON:python3.6}
-deps =
-    coverage>=4.3
-skip_install = true
-commands =
-    coverage combine
-    coverage html
-
-[testenv:codecov]
-passenv = *
-basepython = {env:TOXPYTHON:python}
-deps =
-    coverage>=4.3
-    codecov
-skip_install = true
-ignore_outcome = true
-commands =
-    coverage combine
-    codecov --env TOXENV
-
-[testenv:bdist]
-basepython = {env:TOXPYTHON:python3.6}
-deps =
-    pygments
-    docutils
-    setuptools
-    wheel
-skip_install = true
-install_command =
-    # make sure we use the latest setuptools and wheel
-    pip install --upgrade {opts} {packages}
-whitelist_externals =
-    rm
-commands =
-    # check metadata and rst long_description
-    python setup.py check --restructuredtext --strict
-    # clean up build/ and dist/ folders
-    rm -rf {toxinidir}/dist
-    python setup.py clean --all
-    # build sdist
-    python setup.py sdist --dist-dir {toxinidir}/dist
-    # build wheel from sdist
-    pip wheel -v --no-deps --no-index --wheel-dir {toxinidir}/dist --find-links {toxinidir}/dist fontPens

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.5.dev0.egg-info/PKG-INFO
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.5.dev0.egg-info/dependency_links.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.5.dev0.egg-info/requires.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.5.dev0.egg-info/top_level.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens/spikePen.py

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.4.egg-info/PKG-INFO
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.4.egg-info/dependency_links.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.4.egg-info/requires.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/fontPens-0.2.4.egg-info/top_level.txt

No differences were encountered in the control files

More details

Full run details