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.

Files changed (43) hide show
  1. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/PKG-INFO +1 -1
  2. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/pyproject.toml +2 -2
  3. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/__init__.py +6 -1
  4. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/type_bounding_box.py +0 -7
  5. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/string_conversion.py +19 -12
  6. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/PKG-INFO +1 -1
  7. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/SOURCES.txt +0 -1
  8. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_queries.py +0 -6
  9. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_string_conversion.py +36 -4
  10. svg-ultralight-0.24.0/dev-requirements.txt +0 -102
  11. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/.pre-commit-config.yaml +0 -0
  12. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/README.md +0 -0
  13. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/setup.cfg +0 -0
  14. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/animate.py +0 -0
  15. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/__init__.py +0 -0
  16. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/supports_bounds.py +0 -0
  17. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/type_bound_element.py +0 -0
  18. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/bounding_boxes/type_padded_text.py +0 -0
  19. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/constructors/__init__.py +0 -0
  20. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/constructors/new_element.py +0 -0
  21. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/inkscape.py +0 -0
  22. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/layout.py +0 -0
  23. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/main.py +0 -0
  24. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/metadata.py +0 -0
  25. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/nsmap.py +0 -0
  26. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/py.typed +0 -0
  27. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/query.py +0 -0
  28. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/root_elements.py +0 -0
  29. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/strings/__init__.py +0 -0
  30. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/strings/svg_strings.py +0 -0
  31. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight/unit_conversion.py +0 -0
  32. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/dependency_links.txt +0 -0
  33. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/requires.txt +0 -0
  34. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/src/svg_ultralight.egg-info/top_level.txt +0 -0
  35. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/__init__.py +0 -0
  36. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/conftest.py +0 -0
  37. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_inkscape.py +0 -0
  38. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_layout.py +0 -0
  39. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_metadata.py +0 -0
  40. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_new_element.py +0 -0
  41. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_root_elements.py +0 -0
  42. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tests/test_svg_ultralight.py +0 -0
  43. {svg-ultralight-0.24.0 → svg_ultralight-0.26.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: svg-ultralight
3
- Version: 0.24.0
3
+ Version: 0.26.0
4
4
  Summary: a sensible way to create svg files with Python
5
5
  Author-email: Shay Hill <shay_public@hotmail.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "svg-ultralight"
3
- version = "0.24.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.24.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 format_number, format_numbers
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 _format_datastring(data: str) -> str:
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
- Will correctly handle input floats in exponential notation.
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
- words = re.split(r"([^\d.eE-]+)", data)
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_ == "d":
118
- if isinstance(val, str):
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
- if _is_float_or_float_str(val) and key_ != "text":
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]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: svg-ultralight
3
- Version: 0.24.0
3
+ Version: 0.26.0
4
4
  Summary: a sensible way to create svg files with Python
5
5
  Author-email: Shay Hill <shay_public@hotmail.com>
6
6
  License: MIT
@@ -1,6 +1,5 @@
1
1
  .pre-commit-config.yaml
2
2
  README.md
3
- dev-requirements.txt
4
3
  pyproject.toml
5
4
  tox.ini
6
5
  src/svg_ultralight/__init__.py
@@ -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
- import pytest
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 test_invalid_datastring(self):
62
- """Raise ValueError if d value is not a string."""
63
- assert pytest.raises(ValueError, mod.format_attr_dict, d=1)
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