svg.path


Namesvg.path JSON
Version 6.2 PyPI version JSON
download
home_pagehttps://github.com/regebro/svg.path
SummarySVG path objects and parser
upload_time2022-06-17 12:22:26
maintainer
docs_urlNone
authorLennart Regebro
requires_python
licenseMIT
keywords svg path maths
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            svg.path
========

svg.path is a collection of objects that implement the different path
commands in SVG, and a parser for SVG path definitions.


Usage
-----

There are four path segment objects, ``Line``, ``Arc``, ``CubicBezier`` and
``QuadraticBezier``.`There is also a ``Path`` object that acts as a
collection of the path segment objects.

All coordinate values for these classes are given as ``complex`` values,
where the ``.real`` part represents the X coordinate, and the ``.imag`` part
representes the Y coordinate::

    >>> from svg.path import Path, Move, Line, Arc, CubicBezier, QuadraticBezier, Close

All of these objects have a ``.point()`` function which will return the
coordinates of a point on the path, where the point is given as a floating
point value where ``0.0`` is the start of the path and ``1.0`` is the end.

You can calculate the length of a Path or it's segments with the
``.length()`` function. For CubicBezier and Arc segments this is done by
geometric approximation and for this reason **may be very slow**. You can
make it faster by passing in an ``error`` option to the method. If you
don't pass in error, it defaults to ``1e-12``::

    >>> CubicBezier(300+100j, 100+100j, 200+200j, 200+300j).length(error=1e-5)
    297.2208145656899

CubicBezier and Arc also has a ``min_depth`` option that specifies the
minimum recursion depth. This is set to 5 by default, resulting in using a
minimum of 32 segments for the calculation. Setting it to 0 is a bad idea for
CubicBeziers, as they may become approximated to a straight line.

``Line.length()`` and ``QuadraticBezier.length()`` also takes these
parameters, but they are ignored.

CubicBezier and QuadraticBezier also has ``is_smooth_from(previous)``
methods, that check if the segment is a "smooth" segment compared to the
given segment.

There is also a ``parse_path()`` function that will take an SVG path definition
and return a ``Path`` object::

    >>> from svg.path import parse_path
    >>> parse_path('M 100 100 L 300 100')
    Path(Move(to=(100+100j)), Line(start=(100+100j), end=(300+100j)))


Classes
.......

These are the SVG path segment classes. See the `SVG specifications
<http://www.w3.org/TR/SVG/paths.html>`_ for more information on what each
parameter means.

* ``Line(start, end)``

* ``Arc(start, radius, rotation, arc, sweep, end)``

* ``QuadraticBezier(start, control, end)``

* ``CubicBezier(start, control1, control2, end)``

In addition to that, there is the ``Path`` class, which is instantiated
with a sequence of path segments:

* ``Path(*segments)``

The ``Path`` class is a mutable sequence, so it behaves like a list.
You can add to it and replace path segments etc::

    >>> path = Path(Move(200+100j), Line(200+100j,100+200j), Line(100+200j,300+100j))
    >>> path.append(QuadraticBezier(300+100j, 200+200j, 200+300j))
    >>> path[0] = Move(200+100j)
    >>> del path[1]

The path object also has a ``d()`` method that will return the
SVG representation of the Path segments::

    >>> path.d()
    'M 200,100 L 300,100 Q 200,200 200,300'

Note that there currently is no internal consistency checks when you
manipulate lines this way. This path now has an internal representation that
it's different from it's d() path. Notice how the `Line()` segment starts in
a different location from where the `Move()` segments say. This **may**
change in future releases, and the Path manipulation methods **may** be
changed to ensure consistency.

    >>> path
    Path(Move(to=(200+100j)), Line(start=(100+200j), end=(300+100j)),
    QuadraticBezier(start=(300+100j), control=(200+200j), end=(200+300j),
    smooth=False))


Examples
........

This SVG path example draws a triangle::


    >>> path1 = parse_path('M 100 100 L 300 100 L 200 300 z')

You can format SVG paths in many different ways, all valid paths should be
accepted::

    >>> path2 = parse_path('M100,100L300,100L200,300z')

And these paths should be equal::

    >>> path1 == path2
    True

You can also build a path from objects::

    >>> path3 = Path(Line(100+100j,300+100j), Line(300+100j, 200+300j), Line(200+300j, 100+100j))

And it should again be equal to the first path::

    >>> path1 == path2
    True

Paths are mutable sequences, you can slice and append::

    >>> path1.append(QuadraticBezier(300+100j, 200+200j, 200+300j))
    >>> len(path1[2:]) == 3
    True

Note that there is no protection against you creating paths that are invalid.
You can for example have a Close command that doesn't end at the path start::

    >>> wrong = Path(Line(100+100j,200+100j), Close(200+300j, 0))


Future features
---------------

* Reversing paths. They should then reasonably be drawn "backwards" meaning each
  path segment also needs to be reversed.

* Mathematical transformations might make sense.

* Verifying that paths are correct, or protection against creating incorrect paths.


License
-------

This module is under a MIT License.

Contributors
============

Lennart Regebro <regebro@gmail.com>, Original Author

Justin Gruenberg implemented the Quadradic Bezier calculations and
provided suggestions and feedback about the d() function.

Michiel Schallig suggested calculating length by recursive straight-line
approximations, which enables you to choose between accuracy or speed.
Steve Schwarz added an error argument to make that choice an argument.

ClayJarCom speeded up `point()` calculations for paths.

Thanks also to bug fixers Martin R, abcjjy, Daniel Stender, MTician,
blokhin, Karthikeyan, jaraco and martinleopold.

Thanks to tatarize for help with investigating issues, and coming with
much feedback and ideas.

Samuel Carlsson [vidstige] provided the `tangent()` functions.

Lucas Simon discovered and fixed that not all path segments preserved
the relative setting when parsing.

Changelog
=========


6.2 (2022-06-17)
----------------

- Allow numbers with decimal point but no decimals, because other parsers do.

- Re-enabled the README.rst doctest, which got lost when switching to pytest


6.1 (2022-06-09)
----------------

- Not all path segments preserved the relative setting. [Lucas-C]


6.0 (2022-04-14)
----------------

- No functional changes from 6.0b1, only changes to tests.


6.0b1 (2022-04-02)
------------------

- Added new abstract base classes: PathSegment, and NonLinear. Also, Linear
  is now derived from PathSegment, and may become abstract in the future.

- Added smooth support:

  - CubicBezier and QuadraticBezier now has a "smooth" flag, that will be set
    when parsing if the SVG path had a smooth segment.

  - A path element will now only be designated as a smooth segment if it has
    the smooth flag set. That means a path that *is* smooth but not parsed
    from smooth (S and T) segments will not be represented as smooth.
    The path segment must also be smooth, so if you parse a path with a
    smooth segment, and modify it so it isn't smooth, it will not be
    represented as smooth, regardless of the flag.

  - CubicBezier and QuadraticBezier now has a "set_smooth_from" flag, that
    will adjust the start point and first control point so that the curve is
    smooth. It also sets the smooth flag.

- Added support to preserve vertical/horizontal commands.

- Refactored the generation of SVG path texts, each segment now generates its
  own segment text, with a `_d(self, previous)` method.


5.1 (2022-03-23)
----------------

- Added SVG standard tests. [tatarize]

- Allow random characters to end parsing.

- #61: Fixed the length() calculations of nearly linear QuadradicBeziers.
  [tatarize, regebro]


5.0.1 (2022-03-21)
------------------

- Two new test files were omitted from the distributions.


5.0.0 (2022-03-21)
------------------

- Drop Python 2 support, also 3.4 to 3.6. New minimum Python version is 3.7.

- New parser that solves the issue with Arc flags and whitespace.
  See Issues #53 and #69.

- Fixed #60: Handle paths that are length 0 [Thanks to martinleopold and tatarize]

- New method on path objects: `.tangent(point)`, which returns a vector that is the
  derivatative / tangent of the curve at that point. [vidstige]

- New graphical test. That test requires Pillow, so I stopped testing on PyPy, it
  got too complicated to support. But it still works on PyPy.


4.1 (2021-02-16)
----------------

- Use collections.abc for ABC import to add Python 3.9 compatibility.


4.0.2 (2019-11-04)
------------------

- A solution for the setup.cfg [Alex Grönholm]


4.0.1 (2019-11-03)
------------------
            else:
                raise

- The pure setup.cfg config didn't work. All the tests pass fine,
  but when installing the package somewhere else, nothing gets installed.
  So I'm reverting that change for now.


4.0 (2019-11-02)
----------------

- Moved all the information from setup.py into setup.cfg.

- Added a Close() command which is different from a Line() command in
  no way at all, to simplify the handling of closepath commands and subpaths.

- Path()'s no longer have a `closed` attribute.

- Now fully supports the SVG 1.1 "F.6.2 Out-of-range parameters" list.

- Uses circular maths to calculate the length of circular arcs,
  more accurate and much faster.


3.1 (2019-10-25)
----------------

- The Move null command was not imported into ``__init__.py`` [blokhin]
- #41: Switched from ``pkg_resource``-style namespace
  package for ``svg`` to a `pkgutil style
  <https://packaging.python.org/guides/packaging-namespace-packages/#pkgutil-style-namespace-packages>`_
  namespace package.
- A faster ``point()`` implementation for paths. [ClayJarCom]
- Dropped support for Python 2.6 and Python 3.3.
- Added support for Python 3.7 and 3.8.


3.0 (2018-08-14)
----------------

- Dropped support for Python 3.1 and 3.2. It still works, but it may stop.
  Added support for Python 3.6. Dropped support for Jython, it's not
  supported by Travis, and hasn't seen  a release in over a year.

- #33: Move commands are now preserved when parsed.

- Subpaths are no longer merged even if they are joined.

- #30: Arcs where the endpoint is the same as the start point caused a crash.
  The SVG specs say that it instead should be the equavalent of skipping
  that section, which now is the case.


2.2 (2016-10-15)
----------------

- Don't add a line when closing a path if it's not needed.


2.1.1 (2016-02-28)
------------------

- #18: QuadraticBeziers could get a DivideByZero error under certain
  circumstances. [MTician]

- Accept an error parameter to Path.point() to be able to
  control error vs performance setting. [saschwarz]

- #25: Arc's could create a MathDomain error under certain circumstances.

- #17: Set last_command always.


2.0.1 (2015-10-17)
------------------

- #20: The doctext for the closed() setter was incorrect.

- #19: Fixed so tests didn't use relative paths. [danstender]


2.0 (2015-05-15)
----------------

- Nothing changed yet.


2.0b1 (2014-11-06)
------------------

- Added a Path.d() function to generate the Path's d attribute.

- Added is_smooth_from() on QubicBezier and QuadradicBezier.

- Path()'s now have a .closed property.

- Fixed the representation so it's parseable.

- The calculations for CubicBezier and Arc segments are now recursive,
  and will end when a specific accuracy has been achieved.
  This is somewhat faster for Arcs and somewhat slower for CubicBezier.
  However, you can now specify an accuracy, so if you want faster but
  looser calculations, you can have that.

- 't' segments (smooth, relative QuadraticBeziers) whose previous segment was
  not a QuadraticBezier would get an incorrect control point.


1.2 (2014-11-01)
----------------

- New Quadradic Bezier implementation. [Justin Gruenberg]

- Solved issue #6: Z close path behavior. [abcjjy]


1.1 (2013-10-19)
----------------

- Floats with negative exponents work again.

- New tokenizer that is around 20 times faster.


1.0 (2013-05-28)
----------------

- Solved issue #2: Paths with negative values and no spaces didn't work.
  [regebro]


1.0b1 (2013-02-03)
------------------

- Original release.



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/regebro/svg.path",
    "name": "svg.path",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "svg,path,maths",
    "author": "Lennart Regebro",
    "author_email": "regebro@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/01/56/32f5483faf385e8c3b382159af10ee08414c7f1be1b6da96a1821e7cc431/svg.path-6.2.tar.gz",
    "platform": null,
    "description": "svg.path\n========\n\nsvg.path is a collection of objects that implement the different path\ncommands in SVG, and a parser for SVG path definitions.\n\n\nUsage\n-----\n\nThere are four path segment objects, ``Line``, ``Arc``, ``CubicBezier`` and\n``QuadraticBezier``.`There is also a ``Path`` object that acts as a\ncollection of the path segment objects.\n\nAll coordinate values for these classes are given as ``complex`` values,\nwhere the ``.real`` part represents the X coordinate, and the ``.imag`` part\nrepresentes the Y coordinate::\n\n    >>> from svg.path import Path, Move, Line, Arc, CubicBezier, QuadraticBezier, Close\n\nAll of these objects have a ``.point()`` function which will return the\ncoordinates of a point on the path, where the point is given as a floating\npoint value where ``0.0`` is the start of the path and ``1.0`` is the end.\n\nYou can calculate the length of a Path or it's segments with the\n``.length()`` function. For CubicBezier and Arc segments this is done by\ngeometric approximation and for this reason **may be very slow**. You can\nmake it faster by passing in an ``error`` option to the method. If you\ndon't pass in error, it defaults to ``1e-12``::\n\n    >>> CubicBezier(300+100j, 100+100j, 200+200j, 200+300j).length(error=1e-5)\n    297.2208145656899\n\nCubicBezier and Arc also has a ``min_depth`` option that specifies the\nminimum recursion depth. This is set to 5 by default, resulting in using a\nminimum of 32 segments for the calculation. Setting it to 0 is a bad idea for\nCubicBeziers, as they may become approximated to a straight line.\n\n``Line.length()`` and ``QuadraticBezier.length()`` also takes these\nparameters, but they are ignored.\n\nCubicBezier and QuadraticBezier also has ``is_smooth_from(previous)``\nmethods, that check if the segment is a \"smooth\" segment compared to the\ngiven segment.\n\nThere is also a ``parse_path()`` function that will take an SVG path definition\nand return a ``Path`` object::\n\n    >>> from svg.path import parse_path\n    >>> parse_path('M 100 100 L 300 100')\n    Path(Move(to=(100+100j)), Line(start=(100+100j), end=(300+100j)))\n\n\nClasses\n.......\n\nThese are the SVG path segment classes. See the `SVG specifications\n<http://www.w3.org/TR/SVG/paths.html>`_ for more information on what each\nparameter means.\n\n* ``Line(start, end)``\n\n* ``Arc(start, radius, rotation, arc, sweep, end)``\n\n* ``QuadraticBezier(start, control, end)``\n\n* ``CubicBezier(start, control1, control2, end)``\n\nIn addition to that, there is the ``Path`` class, which is instantiated\nwith a sequence of path segments:\n\n* ``Path(*segments)``\n\nThe ``Path`` class is a mutable sequence, so it behaves like a list.\nYou can add to it and replace path segments etc::\n\n    >>> path = Path(Move(200+100j), Line(200+100j,100+200j), Line(100+200j,300+100j))\n    >>> path.append(QuadraticBezier(300+100j, 200+200j, 200+300j))\n    >>> path[0] = Move(200+100j)\n    >>> del path[1]\n\nThe path object also has a ``d()`` method that will return the\nSVG representation of the Path segments::\n\n    >>> path.d()\n    'M 200,100 L 300,100 Q 200,200 200,300'\n\nNote that there currently is no internal consistency checks when you\nmanipulate lines this way. This path now has an internal representation that\nit's different from it's d() path. Notice how the `Line()` segment starts in\na different location from where the `Move()` segments say. This **may**\nchange in future releases, and the Path manipulation methods **may** be\nchanged to ensure consistency.\n\n    >>> path\n    Path(Move(to=(200+100j)), Line(start=(100+200j), end=(300+100j)),\n    QuadraticBezier(start=(300+100j), control=(200+200j), end=(200+300j),\n    smooth=False))\n\n\nExamples\n........\n\nThis SVG path example draws a triangle::\n\n\n    >>> path1 = parse_path('M 100 100 L 300 100 L 200 300 z')\n\nYou can format SVG paths in many different ways, all valid paths should be\naccepted::\n\n    >>> path2 = parse_path('M100,100L300,100L200,300z')\n\nAnd these paths should be equal::\n\n    >>> path1 == path2\n    True\n\nYou can also build a path from objects::\n\n    >>> path3 = Path(Line(100+100j,300+100j), Line(300+100j, 200+300j), Line(200+300j, 100+100j))\n\nAnd it should again be equal to the first path::\n\n    >>> path1 == path2\n    True\n\nPaths are mutable sequences, you can slice and append::\n\n    >>> path1.append(QuadraticBezier(300+100j, 200+200j, 200+300j))\n    >>> len(path1[2:]) == 3\n    True\n\nNote that there is no protection against you creating paths that are invalid.\nYou can for example have a Close command that doesn't end at the path start::\n\n    >>> wrong = Path(Line(100+100j,200+100j), Close(200+300j, 0))\n\n\nFuture features\n---------------\n\n* Reversing paths. They should then reasonably be drawn \"backwards\" meaning each\n  path segment also needs to be reversed.\n\n* Mathematical transformations might make sense.\n\n* Verifying that paths are correct, or protection against creating incorrect paths.\n\n\nLicense\n-------\n\nThis module is under a MIT License.\n\nContributors\n============\n\nLennart Regebro <regebro@gmail.com>, Original Author\n\nJustin Gruenberg implemented the Quadradic Bezier calculations and\nprovided suggestions and feedback about the d() function.\n\nMichiel Schallig suggested calculating length by recursive straight-line\napproximations, which enables you to choose between accuracy or speed.\nSteve Schwarz added an error argument to make that choice an argument.\n\nClayJarCom speeded up `point()` calculations for paths.\n\nThanks also to bug fixers Martin R, abcjjy, Daniel Stender, MTician,\nblokhin, Karthikeyan, jaraco and martinleopold.\n\nThanks to tatarize for help with investigating issues, and coming with\nmuch feedback and ideas.\n\nSamuel Carlsson [vidstige] provided the `tangent()` functions.\n\nLucas Simon discovered and fixed that not all path segments preserved\nthe relative setting when parsing.\n\nChangelog\n=========\n\n\n6.2 (2022-06-17)\n----------------\n\n- Allow numbers with decimal point but no decimals, because other parsers do.\n\n- Re-enabled the README.rst doctest, which got lost when switching to pytest\n\n\n6.1 (2022-06-09)\n----------------\n\n- Not all path segments preserved the relative setting. [Lucas-C]\n\n\n6.0 (2022-04-14)\n----------------\n\n- No functional changes from 6.0b1, only changes to tests.\n\n\n6.0b1 (2022-04-02)\n------------------\n\n- Added new abstract base classes: PathSegment, and NonLinear. Also, Linear\n  is now derived from PathSegment, and may become abstract in the future.\n\n- Added smooth support:\n\n  - CubicBezier and QuadraticBezier now has a \"smooth\" flag, that will be set\n    when parsing if the SVG path had a smooth segment.\n\n  - A path element will now only be designated as a smooth segment if it has\n    the smooth flag set. That means a path that *is* smooth but not parsed\n    from smooth (S and T) segments will not be represented as smooth.\n    The path segment must also be smooth, so if you parse a path with a\n    smooth segment, and modify it so it isn't smooth, it will not be\n    represented as smooth, regardless of the flag.\n\n  - CubicBezier and QuadraticBezier now has a \"set_smooth_from\" flag, that\n    will adjust the start point and first control point so that the curve is\n    smooth. It also sets the smooth flag.\n\n- Added support to preserve vertical/horizontal commands.\n\n- Refactored the generation of SVG path texts, each segment now generates its\n  own segment text, with a `_d(self, previous)` method.\n\n\n5.1 (2022-03-23)\n----------------\n\n- Added SVG standard tests. [tatarize]\n\n- Allow random characters to end parsing.\n\n- #61: Fixed the length() calculations of nearly linear QuadradicBeziers.\n  [tatarize, regebro]\n\n\n5.0.1 (2022-03-21)\n------------------\n\n- Two new test files were omitted from the distributions.\n\n\n5.0.0 (2022-03-21)\n------------------\n\n- Drop Python 2 support, also 3.4 to 3.6. New minimum Python version is 3.7.\n\n- New parser that solves the issue with Arc flags and whitespace.\n  See Issues #53 and #69.\n\n- Fixed #60: Handle paths that are length 0 [Thanks to martinleopold and tatarize]\n\n- New method on path objects: `.tangent(point)`, which returns a vector that is the\n  derivatative / tangent of the curve at that point. [vidstige]\n\n- New graphical test. That test requires Pillow, so I stopped testing on PyPy, it\n  got too complicated to support. But it still works on PyPy.\n\n\n4.1 (2021-02-16)\n----------------\n\n- Use collections.abc for ABC import to add Python 3.9 compatibility.\n\n\n4.0.2 (2019-11-04)\n------------------\n\n- A solution for the setup.cfg [Alex Gr\u00f6nholm]\n\n\n4.0.1 (2019-11-03)\n------------------\n            else:\n                raise\n\n- The pure setup.cfg config didn't work. All the tests pass fine,\n  but when installing the package somewhere else, nothing gets installed.\n  So I'm reverting that change for now.\n\n\n4.0 (2019-11-02)\n----------------\n\n- Moved all the information from setup.py into setup.cfg.\n\n- Added a Close() command which is different from a Line() command in\n  no way at all, to simplify the handling of closepath commands and subpaths.\n\n- Path()'s no longer have a `closed` attribute.\n\n- Now fully supports the SVG 1.1 \"F.6.2 Out-of-range parameters\" list.\n\n- Uses circular maths to calculate the length of circular arcs,\n  more accurate and much faster.\n\n\n3.1 (2019-10-25)\n----------------\n\n- The Move null command was not imported into ``__init__.py`` [blokhin]\n- #41: Switched from ``pkg_resource``-style namespace\n  package for ``svg`` to a `pkgutil style\n  <https://packaging.python.org/guides/packaging-namespace-packages/#pkgutil-style-namespace-packages>`_\n  namespace package.\n- A faster ``point()`` implementation for paths. [ClayJarCom]\n- Dropped support for Python 2.6 and Python 3.3.\n- Added support for Python 3.7 and 3.8.\n\n\n3.0 (2018-08-14)\n----------------\n\n- Dropped support for Python 3.1 and 3.2. It still works, but it may stop.\n  Added support for Python 3.6. Dropped support for Jython, it's not\n  supported by Travis, and hasn't seen  a release in over a year.\n\n- #33: Move commands are now preserved when parsed.\n\n- Subpaths are no longer merged even if they are joined.\n\n- #30: Arcs where the endpoint is the same as the start point caused a crash.\n  The SVG specs say that it instead should be the equavalent of skipping\n  that section, which now is the case.\n\n\n2.2 (2016-10-15)\n----------------\n\n- Don't add a line when closing a path if it's not needed.\n\n\n2.1.1 (2016-02-28)\n------------------\n\n- #18: QuadraticBeziers could get a DivideByZero error under certain\n  circumstances. [MTician]\n\n- Accept an error parameter to Path.point() to be able to\n  control error vs performance setting. [saschwarz]\n\n- #25: Arc's could create a MathDomain error under certain circumstances.\n\n- #17: Set last_command always.\n\n\n2.0.1 (2015-10-17)\n------------------\n\n- #20: The doctext for the closed() setter was incorrect.\n\n- #19: Fixed so tests didn't use relative paths. [danstender]\n\n\n2.0 (2015-05-15)\n----------------\n\n- Nothing changed yet.\n\n\n2.0b1 (2014-11-06)\n------------------\n\n- Added a Path.d() function to generate the Path's d attribute.\n\n- Added is_smooth_from() on QubicBezier and QuadradicBezier.\n\n- Path()'s now have a .closed property.\n\n- Fixed the representation so it's parseable.\n\n- The calculations for CubicBezier and Arc segments are now recursive,\n  and will end when a specific accuracy has been achieved.\n  This is somewhat faster for Arcs and somewhat slower for CubicBezier.\n  However, you can now specify an accuracy, so if you want faster but\n  looser calculations, you can have that.\n\n- 't' segments (smooth, relative QuadraticBeziers) whose previous segment was\n  not a QuadraticBezier would get an incorrect control point.\n\n\n1.2 (2014-11-01)\n----------------\n\n- New Quadradic Bezier implementation. [Justin Gruenberg]\n\n- Solved issue #6: Z close path behavior. [abcjjy]\n\n\n1.1 (2013-10-19)\n----------------\n\n- Floats with negative exponents work again.\n\n- New tokenizer that is around 20 times faster.\n\n\n1.0 (2013-05-28)\n----------------\n\n- Solved issue #2: Paths with negative values and no spaces didn't work.\n  [regebro]\n\n\n1.0b1 (2013-02-03)\n------------------\n\n- Original release.\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "SVG path objects and parser",
    "version": "6.2",
    "split_keywords": [
        "svg",
        "path",
        "maths"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "5b73c5a11f5020e97d4004b075b756b0",
                "sha256": "c3b12e6d372771b466078837252eb13b655ea2658437c426cc67fc6262433dc8"
            },
            "downloads": -1,
            "filename": "svg.path-6.2-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5b73c5a11f5020e97d4004b075b756b0",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": null,
            "size": 40891,
            "upload_time": "2022-06-17T12:22:23",
            "upload_time_iso_8601": "2022-06-17T12:22:23.887723Z",
            "url": "https://files.pythonhosted.org/packages/ba/8f/08a177d11ae1becbc76a9da461d238ebbf5646f691bb824c01fae384b890/svg.path-6.2-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "af97a9dc030f92a6f58367a06c84a87d",
                "sha256": "1a2159f9db898df93c4637cfd3ccaf7da1fd073f59fa9a5950c73e46d4aa1aca"
            },
            "downloads": -1,
            "filename": "svg.path-6.2.tar.gz",
            "has_sig": false,
            "md5_digest": "af97a9dc030f92a6f58367a06c84a87d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 46951,
            "upload_time": "2022-06-17T12:22:26",
            "upload_time_iso_8601": "2022-06-17T12:22:26.247534Z",
            "url": "https://files.pythonhosted.org/packages/01/56/32f5483faf385e8c3b382159af10ee08414c7f1be1b6da96a1821e7cc431/svg.path-6.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-06-17 12:22:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "regebro",
    "github_project": "svg.path",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "svg.path"
}
        
Elapsed time: 0.02074s