svg-ultralight 0.24.0__tar.gz → 0.26.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of svg-ultralight might be problematic. Click here for more details.
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/PKG-INFO +1 -1
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/pyproject.toml +2 -2
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/__init__.py +6 -1
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/type_bounding_box.py +0 -7
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/string_conversion.py +19 -12
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/PKG-INFO +1 -1
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/SOURCES.txt +0 -1
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_queries.py +0 -6
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_string_conversion.py +36 -4
- svg-ultralight-0.24.0/dev-requirements.txt +0 -102
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/.pre-commit-config.yaml +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/README.md +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/setup.cfg +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/animate.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/__init__.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/supports_bounds.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/type_bound_element.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/type_padded_text.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/constructors/__init__.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/constructors/new_element.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/inkscape.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/layout.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/main.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/metadata.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/nsmap.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/py.typed +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/query.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/root_elements.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/strings/__init__.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/strings/svg_strings.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/unit_conversion.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/dependency_links.txt +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/requires.txt +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/top_level.txt +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/__init__.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/conftest.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_inkscape.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_layout.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_metadata.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_new_element.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_root_elements.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_svg_ultralight.py +0 -0
- {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "svg-ultralight"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.26.0"
|
|
4
4
|
description = "a sensible way to create svg files with Python"
|
|
5
5
|
authors = [{ name = "Shay Hill", email = "shay_public@hotmail.com" }]
|
|
6
6
|
license = { text = "MIT" }
|
|
@@ -33,7 +33,7 @@ legacy_tox_ini = """
|
|
|
33
33
|
|
|
34
34
|
[tool.commitizen]
|
|
35
35
|
name = "cz_conventional_commits"
|
|
36
|
-
version = "0.
|
|
36
|
+
version = "0.26.0"
|
|
37
37
|
tag_format = "$version"
|
|
38
38
|
version_files = ["pyproject.toml:^version"]
|
|
39
39
|
annotated_tag = true
|
|
@@ -26,7 +26,11 @@ from svg_ultralight.metadata import new_metadata
|
|
|
26
26
|
from svg_ultralight.nsmap import NSMAP, new_qname
|
|
27
27
|
from svg_ultralight.query import pad_text
|
|
28
28
|
from svg_ultralight.root_elements import new_svg_root_around_bounds
|
|
29
|
-
from svg_ultralight.string_conversion import
|
|
29
|
+
from svg_ultralight.string_conversion import (
|
|
30
|
+
format_number,
|
|
31
|
+
format_numbers,
|
|
32
|
+
format_numbers_in_string,
|
|
33
|
+
)
|
|
30
34
|
|
|
31
35
|
__all__ = [
|
|
32
36
|
"BoundElement",
|
|
@@ -37,6 +41,7 @@ __all__ = [
|
|
|
37
41
|
"deepcopy_element",
|
|
38
42
|
"format_number",
|
|
39
43
|
"format_numbers",
|
|
44
|
+
"format_numbers_in_string",
|
|
40
45
|
"new_element",
|
|
41
46
|
"new_metadata",
|
|
42
47
|
"new_qname",
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
import warnings
|
|
10
9
|
from dataclasses import dataclass
|
|
11
10
|
|
|
12
11
|
from svg_ultralight.bounding_boxes.supports_bounds import SupportsBounds
|
|
@@ -286,12 +285,6 @@ class BoundingBox(SupportsBounds):
|
|
|
286
285
|
:return: a bounding box around self and other bounding boxes
|
|
287
286
|
:raises DeprecationWarning:
|
|
288
287
|
"""
|
|
289
|
-
warnings.warn(
|
|
290
|
-
"Method a.merge(b, c) is deprecated. "
|
|
291
|
-
+ "Use classmethod BoundingBox.merged(a, b, c) instead.",
|
|
292
|
-
category=DeprecationWarning,
|
|
293
|
-
stacklevel=1,
|
|
294
|
-
)
|
|
295
288
|
return BoundingBox.merged(self, *others)
|
|
296
289
|
|
|
297
290
|
@classmethod
|
|
@@ -11,6 +11,7 @@ Rounding some numbers to ensure quality svg rendering:
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
13
|
import re
|
|
14
|
+
from contextlib import suppress
|
|
14
15
|
from enum import Enum
|
|
15
16
|
from typing import TYPE_CHECKING, cast
|
|
16
17
|
|
|
@@ -71,15 +72,26 @@ def _is_float_or_float_str(data: float | str) -> bool:
|
|
|
71
72
|
return True
|
|
72
73
|
|
|
73
74
|
|
|
74
|
-
def
|
|
75
|
+
def format_numbers_in_string(data: float | str) -> str:
|
|
75
76
|
"""Find and format floats in a string.
|
|
76
77
|
|
|
77
|
-
:param data: string with floats
|
|
78
|
+
:param data: string with floats or a float value
|
|
78
79
|
:return: string with floats formatted to limited precision
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
Works as a more robust version of format_number. Will correctly handle input
|
|
82
|
+
floats in exponential notation. This should work for any parameter value in an
|
|
83
|
+
svg except 'text', 'id' and for any other value except hex color codes. The
|
|
84
|
+
function will fail with input strings like 'ice3.14bucket', because 'e3.14' will
|
|
85
|
+
be identified as a float. SVG param values will not have such strings, but the
|
|
86
|
+
'text' attribute could. This function will not handle that case. Do not attempt
|
|
87
|
+
to reformat 'text' attribute values.
|
|
81
88
|
"""
|
|
82
|
-
|
|
89
|
+
with suppress(ValueError):
|
|
90
|
+
# try as a regular number to strip spaces from simple float strings
|
|
91
|
+
return format_number(data)
|
|
92
|
+
if str(data).startswith("#"):
|
|
93
|
+
return str(data)
|
|
94
|
+
words = re.split(r"([^\d.eE-]+)", str(data))
|
|
83
95
|
words = [format_number(w) if _is_float_or_float_str(w) else w for w in words]
|
|
84
96
|
return "".join(words)
|
|
85
97
|
|
|
@@ -114,15 +126,10 @@ def _fix_key_and_format_val(key: str, val: str | float) -> tuple[str, str]:
|
|
|
114
126
|
else:
|
|
115
127
|
key_ = key.rstrip("_").replace("_", "-")
|
|
116
128
|
|
|
117
|
-
if key_
|
|
118
|
-
|
|
119
|
-
return key_, _format_datastring(val)
|
|
120
|
-
msg = f"Expected string for 'd' attribute, got {val} of type {type(val)}"
|
|
121
|
-
raise ValueError(msg)
|
|
129
|
+
if key_ in {"id", "text"}:
|
|
130
|
+
return key_, str(val)
|
|
122
131
|
|
|
123
|
-
|
|
124
|
-
return key_, format_number(val)
|
|
125
|
-
return key_, str(val)
|
|
132
|
+
return key_, format_numbers_in_string(val)
|
|
126
133
|
|
|
127
134
|
|
|
128
135
|
def format_attr_dict(**attributes: str | float) -> dict[str, str]:
|
|
@@ -28,12 +28,6 @@ if not INKSCAPE.with_suffix(".exe").exists():
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class TestMergeBoundingBoxes:
|
|
31
|
-
def test_merge_deprecation_warning(self):
|
|
32
|
-
bbox_a = BoundingBox(-2, -4, 10, 20)
|
|
33
|
-
bbox_b = BoundingBox(0, 0, 10, 10)
|
|
34
|
-
assert pytest.warns(DeprecationWarning, BoundingBox.merge, bbox_a, bbox_b)
|
|
35
|
-
with pytest.warns(DeprecationWarning):
|
|
36
|
-
assert bbox_a.merge(bbox_b) == BoundingBox.merged(bbox_a, bbox_b)
|
|
37
31
|
|
|
38
32
|
def test_new_merged_bbox(self):
|
|
39
33
|
bbox_a = BoundingBox(-2, -4, 10, 20)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
:created: 2023-09-23
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
# pyright: reportPrivateUsage=false
|
|
8
8
|
|
|
9
9
|
import svg_ultralight.string_conversion as mod
|
|
10
10
|
|
|
@@ -29,6 +29,36 @@ class TestFormatNumbers:
|
|
|
29
29
|
assert mod.format_numbers([1, 2, 3]) == ["1", "2", "3"]
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
class TestFormatNumbersInString:
|
|
33
|
+
def test_empty(self):
|
|
34
|
+
"""Return empty string."""
|
|
35
|
+
assert mod.format_numbers_in_string("") == ""
|
|
36
|
+
|
|
37
|
+
def test_no_numbers(self):
|
|
38
|
+
"""Return string with no changes."""
|
|
39
|
+
assert mod.format_numbers_in_string("hello") == "hello"
|
|
40
|
+
|
|
41
|
+
def test_numbers(self):
|
|
42
|
+
"""Return string with numbers formatted."""
|
|
43
|
+
assert mod.format_numbers_in_string("1.0000000001") == "1"
|
|
44
|
+
|
|
45
|
+
def test_skip_text(self):
|
|
46
|
+
"""Skip text."""
|
|
47
|
+
key = "text"
|
|
48
|
+
val = "1.000000000000000000"
|
|
49
|
+
assert mod._fix_key_and_format_val(key, val) == (key, val)
|
|
50
|
+
|
|
51
|
+
def test_skip_id(self):
|
|
52
|
+
"""Skip text."""
|
|
53
|
+
key = "id"
|
|
54
|
+
val = "1.000000000000000000"
|
|
55
|
+
assert mod._fix_key_and_format_val(key, val) == (key, val)
|
|
56
|
+
|
|
57
|
+
def test_skip_hex_colors(self):
|
|
58
|
+
"""Skip hex colors."""
|
|
59
|
+
assert mod.format_numbers_in_string("#000000") == "#000000"
|
|
60
|
+
|
|
61
|
+
|
|
32
62
|
class TestFormatAttrDict:
|
|
33
63
|
def test_float(self):
|
|
34
64
|
"""Return string of float."""
|
|
@@ -58,9 +88,11 @@ class TestFormatAttrDict:
|
|
|
58
88
|
"d": "M1,0 Q 0,0.333333 1,2z"
|
|
59
89
|
}
|
|
60
90
|
|
|
61
|
-
def
|
|
62
|
-
"""
|
|
63
|
-
assert
|
|
91
|
+
def test_format_string(self):
|
|
92
|
+
"""Format floats in a format SVG attribute string."""
|
|
93
|
+
assert mod.format_attr_dict(
|
|
94
|
+
transform="translate(1.0, -0) scale(1.0, 1.0)"
|
|
95
|
+
) == {"transform": "translate(1, 0) scale(1, 1)"}
|
|
64
96
|
|
|
65
97
|
def test_trailing_underscore(self):
|
|
66
98
|
"""Remove trailing underscore from key."""
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# This file is autogenerated by pip-compile with Python 3.12
|
|
3
|
-
# by the following command:
|
|
4
|
-
#
|
|
5
|
-
# pip-compile --extra=dev --output-file=dev-requirements.txt --strip-extras pyproject.toml
|
|
6
|
-
#
|
|
7
|
-
argcomplete==3.2.3
|
|
8
|
-
# via commitizen
|
|
9
|
-
cachetools==5.3.3
|
|
10
|
-
# via tox
|
|
11
|
-
cfgv==3.4.0
|
|
12
|
-
# via pre-commit
|
|
13
|
-
chardet==5.2.0
|
|
14
|
-
# via tox
|
|
15
|
-
charset-normalizer==3.3.2
|
|
16
|
-
# via commitizen
|
|
17
|
-
colorama==0.4.6
|
|
18
|
-
# via
|
|
19
|
-
# commitizen
|
|
20
|
-
# pytest
|
|
21
|
-
# tox
|
|
22
|
-
commitizen==3.20.0
|
|
23
|
-
# via svg-ultralight (pyproject.toml)
|
|
24
|
-
decli==0.6.1
|
|
25
|
-
# via commitizen
|
|
26
|
-
distlib==0.3.8
|
|
27
|
-
# via virtualenv
|
|
28
|
-
filelock==3.13.1
|
|
29
|
-
# via
|
|
30
|
-
# tox
|
|
31
|
-
# virtualenv
|
|
32
|
-
identify==2.5.35
|
|
33
|
-
# via pre-commit
|
|
34
|
-
importlib-metadata==7.0.2
|
|
35
|
-
# via commitizen
|
|
36
|
-
iniconfig==2.0.0
|
|
37
|
-
# via pytest
|
|
38
|
-
jinja2==3.1.3
|
|
39
|
-
# via commitizen
|
|
40
|
-
lxml==5.1.0
|
|
41
|
-
# via svg-ultralight (pyproject.toml)
|
|
42
|
-
markupsafe==2.1.5
|
|
43
|
-
# via jinja2
|
|
44
|
-
nodeenv==1.8.0
|
|
45
|
-
# via pre-commit
|
|
46
|
-
packaging==24.0
|
|
47
|
-
# via
|
|
48
|
-
# commitizen
|
|
49
|
-
# pyproject-api
|
|
50
|
-
# pytest
|
|
51
|
-
# tox
|
|
52
|
-
paragraphs==0.2.0
|
|
53
|
-
# via svg-ultralight (pyproject.toml)
|
|
54
|
-
pillow==10.2.0
|
|
55
|
-
# via svg-ultralight (pyproject.toml)
|
|
56
|
-
platformdirs==4.2.0
|
|
57
|
-
# via
|
|
58
|
-
# tox
|
|
59
|
-
# virtualenv
|
|
60
|
-
pluggy==1.4.0
|
|
61
|
-
# via
|
|
62
|
-
# pytest
|
|
63
|
-
# tox
|
|
64
|
-
pre-commit==3.6.2
|
|
65
|
-
# via svg-ultralight (pyproject.toml)
|
|
66
|
-
prompt-toolkit==3.0.36
|
|
67
|
-
# via questionary
|
|
68
|
-
pyproject-api==1.6.1
|
|
69
|
-
# via tox
|
|
70
|
-
pytest==8.1.1
|
|
71
|
-
# via svg-ultralight (pyproject.toml)
|
|
72
|
-
pyyaml==6.0.1
|
|
73
|
-
# via
|
|
74
|
-
# commitizen
|
|
75
|
-
# pre-commit
|
|
76
|
-
questionary==2.0.1
|
|
77
|
-
# via commitizen
|
|
78
|
-
termcolor==2.4.0
|
|
79
|
-
# via commitizen
|
|
80
|
-
tomlkit==0.12.4
|
|
81
|
-
# via commitizen
|
|
82
|
-
tox==4.14.1
|
|
83
|
-
# via svg-ultralight (pyproject.toml)
|
|
84
|
-
types-beautifulsoup4==4.12.0.20240229
|
|
85
|
-
# via types-lxml
|
|
86
|
-
types-html5lib==1.1.11.20240228
|
|
87
|
-
# via types-beautifulsoup4
|
|
88
|
-
types-lxml==2024.2.9
|
|
89
|
-
# via svg-ultralight (pyproject.toml)
|
|
90
|
-
typing-extensions==4.10.0
|
|
91
|
-
# via types-lxml
|
|
92
|
-
virtualenv==20.25.1
|
|
93
|
-
# via
|
|
94
|
-
# pre-commit
|
|
95
|
-
# tox
|
|
96
|
-
wcwidth==0.2.13
|
|
97
|
-
# via prompt-toolkit
|
|
98
|
-
zipp==3.18.1
|
|
99
|
-
# via importlib-metadata
|
|
100
|
-
|
|
101
|
-
# The following packages are considered to be unsafe in a requirements file:
|
|
102
|
-
# setuptools
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/__init__.py
RENAMED
|
File without changes
|
{svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/supports_bounds.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/constructors/new_element.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|