ducpy 3.3.1__tar.gz → 3.3.3__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.
- {ducpy-3.3.1 → ducpy-3.3.3}/Cargo.lock +1 -1
- {ducpy-3.3.1 → ducpy-3.3.3}/PKG-INFO +1 -2
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducpy/crate/Cargo.toml +1 -1
- {ducpy-3.3.1 → ducpy-3.3.3}/pyproject.toml +0 -1
- ducpy-3.3.3/src/ducpy/__init__.py +32 -0
- ducpy-3.3.3/src/ducpy/_version.py +3 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/element_builders.py +0 -7
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/parse.py +16 -3
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/serialize.py +42 -3
- ducpy-3.3.1/src/ducpy/__init__.py +0 -19
- {ducpy-3.3.1 → ducpy-3.3.3}/Cargo.toml +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/LICENSE +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/README.md +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducpy/crate/src/lib.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/.gitignore +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/Cargo.toml +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/LICENSE +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/README.md +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/build.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/package.json +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/release.config.cjs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/api/document.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/api/meta.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/api/mod.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/api/version_control.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/db/bootstrap.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/db/mod.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/db/native.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/db/wasm.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/lib.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/parse.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/serde_utils.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/serialize.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/src/types.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/sst-env.d.ts +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/tests/.gitignore +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/tests/common/mod.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/tests/parser_assets.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/packages/ducrs/tests/synthetic_roundtrip.rs +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/schema/duc.sql +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/schema/migrations/3000000_to_3000001.sql +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/schema/migrations/3000001_to_3000002.sql +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/schema/migrations/3000002_to_3000003.sql +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/schema/migrations/3000003_to_3000004.sql +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/schema/search.sql +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/schema/version_control.sql +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/__init__.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/block_instance_builder.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/block_utils.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/mutate_builder.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/sql_builder.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/state_builders.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/builders/style_builders.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/classes/DataStateClass.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/classes/ElementsClass.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/classes/__init__.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/enums.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/search/__init__.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/search/search_elements.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/utils/__init__.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/utils/constants.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/utils/convert.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/utils/io.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/utils/mutate_utils.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy/utils/rand_utils.py +0 -0
- {ducpy-3.3.1 → ducpy-3.3.3}/src/ducpy_native/__init__.py +0 -0
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ducpy
|
|
3
|
-
Version: 3.3.
|
|
3
|
+
Version: 3.3.3
|
|
4
4
|
Classifier: License :: OSI Approved :: MIT License
|
|
5
5
|
Requires-Dist: nanoid>=2.0.0
|
|
6
|
-
Requires-Dist: numpy>=1.20.0
|
|
7
6
|
License-File: LICENSE
|
|
8
7
|
Summary: The library for the Duc 2D CAD file format
|
|
9
8
|
Author: Jorge Soares
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Python library for the DUC 2D CAD file format.
|
|
2
|
+
|
|
3
|
+
Usage::
|
|
4
|
+
``import ducpy as duc``
|
|
5
|
+
|
|
6
|
+
Builders API (High-level):
|
|
7
|
+
The easy way to build, manage ``.duc`` files.
|
|
8
|
+
Construct elements, apply styles, manage layers, build blocks,
|
|
9
|
+
and handle document state with the ``duc.builders`` module.
|
|
10
|
+
|
|
11
|
+
SQL Builder (Low-level):
|
|
12
|
+
A ``.duc`` file is a zlib-compressed SQLite database. Use
|
|
13
|
+
``duc.builders.sql_builder`` for direct schema access, bulk
|
|
14
|
+
queries, and low-level manipulation.
|
|
15
|
+
|
|
16
|
+
Search:
|
|
17
|
+
Query/search elements and files programmatically via the
|
|
18
|
+
``duc.search`` API.
|
|
19
|
+
|
|
20
|
+
File I/O:
|
|
21
|
+
Read and write ``.duc`` files using the ``duc.parse``
|
|
22
|
+
and ``duc.serialize`` modules.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from .builders import *
|
|
26
|
+
from .classes import *
|
|
27
|
+
from .enums import *
|
|
28
|
+
from .parse import (DucData, get_external_file, list_external_files, parse_duc,
|
|
29
|
+
parse_duc_lazy)
|
|
30
|
+
from .search import *
|
|
31
|
+
from .serialize import DUC_SCHEMA_VERSION, serialize_duc
|
|
32
|
+
from .utils import *
|
|
@@ -7,7 +7,6 @@ from dataclasses import dataclass, field
|
|
|
7
7
|
from math import pi
|
|
8
8
|
from typing import Any, Dict, List, Optional, Union
|
|
9
9
|
|
|
10
|
-
import numpy as np
|
|
11
10
|
from ducpy.enums import (IMAGE_STATUS, STROKE_CAP, STROKE_JOIN,
|
|
12
11
|
STROKE_PLACEMENT, STROKE_PREFERENCE, TEXT_ALIGN,
|
|
13
12
|
VERTICAL_ALIGN)
|
|
@@ -192,9 +191,6 @@ def _create_element_wrapper(element_class, base_params, element_params, explicit
|
|
|
192
191
|
)
|
|
193
192
|
specific_element = element_class(stack_element_base=stack_element_base)
|
|
194
193
|
elif element_class == DucImageElement:
|
|
195
|
-
scale = element_params.get('scale', [1.0, 1.0])
|
|
196
|
-
if isinstance(scale, list):
|
|
197
|
-
element_params['scale'] = np.array(scale, dtype=np.float32)
|
|
198
194
|
element_params['base'] = base_element
|
|
199
195
|
specific_element = element_class(**element_params)
|
|
200
196
|
elif element_class == DucFreeDrawElement:
|
|
@@ -204,9 +200,6 @@ def _create_element_wrapper(element_class, base_params, element_params, explicit
|
|
|
204
200
|
for p in points
|
|
205
201
|
]
|
|
206
202
|
element_params['points'] = duc_points
|
|
207
|
-
pressures = element_params.get('pressures', [])
|
|
208
|
-
if isinstance(pressures, list):
|
|
209
|
-
element_params['pressures'] = np.array(pressures, dtype=np.float32)
|
|
210
203
|
element_params['base'] = base_element
|
|
211
204
|
specific_element = element_class(**element_params)
|
|
212
205
|
elif element_class == DucTableElement:
|
|
@@ -57,16 +57,29 @@ def _read_bytes(source: Union[bytes, bytearray, BinaryIO, str]) -> bytes:
|
|
|
57
57
|
def parse_duc(source: Union[bytes, bytearray, BinaryIO, str]) -> DucData:
|
|
58
58
|
"""Parse a ``.duc`` file into a :class:`DucData` dict.
|
|
59
59
|
|
|
60
|
+
This function reads a raw `.duc` binary blob or file path and parses it using
|
|
61
|
+
the Rust native extension. It returns a specialized dictionary (`DucData`)
|
|
62
|
+
that allows attribute-style access to the parsed properties (e.g. `data.elements[0].id`),
|
|
63
|
+
using `snake_case` keys instead of the internal `camelCase` format.
|
|
64
|
+
|
|
60
65
|
Parameters
|
|
61
66
|
----------
|
|
62
67
|
source : bytes | file | str
|
|
63
|
-
Raw bytes, an open binary file, or a path to a ``.duc`` file.
|
|
68
|
+
Raw bytes, an open binary file, or a string path to a ``.duc`` file.
|
|
64
69
|
|
|
65
70
|
Returns
|
|
66
71
|
-------
|
|
67
72
|
DucData
|
|
68
|
-
|
|
69
|
-
snake_case keys.
|
|
73
|
+
An attribute-accessible dictionary matching the internal `ExportedDataState`
|
|
74
|
+
schema with snake_case keys. Common keys include `elements`, `global_state`,
|
|
75
|
+
`local_state`, and `version_graph`.
|
|
76
|
+
|
|
77
|
+
Examples
|
|
78
|
+
--------
|
|
79
|
+
>>> data = duc.parse_duc("path/to/file.duc")
|
|
80
|
+
>>> data = duc.parse_duc(binary_data)
|
|
81
|
+
>>> print(f"Found {len(data.elements)} elements")
|
|
82
|
+
>>> print(f"First element type: {data.elements[0].type}")
|
|
70
83
|
"""
|
|
71
84
|
buf = _read_bytes(source)
|
|
72
85
|
raw = ducpy_native.parse_duc(buf)
|
|
@@ -216,9 +216,48 @@ def serialize_duc(
|
|
|
216
216
|
layers: Optional[list] = None,
|
|
217
217
|
external_files: Optional[list] = None,
|
|
218
218
|
) -> bytes:
|
|
219
|
-
"""Serialize elements to ``.duc`` format.
|
|
220
|
-
|
|
221
|
-
|
|
219
|
+
"""Serialize elements and document state to raw ``.duc`` binary format.
|
|
220
|
+
|
|
221
|
+
This function accepts lists of elements created via the `ducpy.builders` API
|
|
222
|
+
(e.g., `ElementBuilder`) and serializes them into the compressed format
|
|
223
|
+
expected by `.duc` files. Element instances and state dataclasses are
|
|
224
|
+
automatically converted to the camelCase dicts expected by the Rust native module.
|
|
225
|
+
|
|
226
|
+
Parameters
|
|
227
|
+
----------
|
|
228
|
+
name : str
|
|
229
|
+
The document name or identifier (used to populate the `source` field).
|
|
230
|
+
thumbnail : Optional[bytes], default=None
|
|
231
|
+
Raw PNG bytes representing a thumbnail of the document.
|
|
232
|
+
dictionary : Optional[list], default=None
|
|
233
|
+
List of Key-Value string pairs for dictionary entries.
|
|
234
|
+
elements : Optional[list], default=None
|
|
235
|
+
A list of elements (e.g., created via `ElementBuilder`) to include.
|
|
236
|
+
duc_local_state : Any, default=None
|
|
237
|
+
A `DucLocalState` object representing viewport state (pan, zoom, etc).
|
|
238
|
+
duc_global_state : Any, default=None
|
|
239
|
+
A `DucGlobalState` object representing document-wide settings.
|
|
240
|
+
version_graph : Any, default=None
|
|
241
|
+
Version history metadata of the document.
|
|
242
|
+
blocks : Optional[list], default=None
|
|
243
|
+
List of block definitions.
|
|
244
|
+
block_instances : Optional[list], default=None
|
|
245
|
+
List of block instances.
|
|
246
|
+
block_collections : Optional[list], default=None
|
|
247
|
+
List of block collections (libraries).
|
|
248
|
+
groups : Optional[list], default=None
|
|
249
|
+
List of element groups.
|
|
250
|
+
regions : Optional[list], default=None
|
|
251
|
+
List of boolean regions.
|
|
252
|
+
layers : Optional[list], default=None
|
|
253
|
+
List of document layers.
|
|
254
|
+
external_files : Optional[list], default=None
|
|
255
|
+
List of external files (e.g., embedded images or PDFs).
|
|
256
|
+
|
|
257
|
+
Returns
|
|
258
|
+
-------
|
|
259
|
+
bytes
|
|
260
|
+
The raw `.duc` binary data, ready to be written to a file.
|
|
222
261
|
"""
|
|
223
262
|
thumb = bytes(thumbnail) if thumbnail is not None else None
|
|
224
263
|
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"""Main module for duc_py package.
|
|
2
|
-
|
|
3
|
-
Import usage examples:
|
|
4
|
-
import ducpy as duc
|
|
5
|
-
|
|
6
|
-
duc.classes.SomeClass
|
|
7
|
-
duc.parse_duc(source)
|
|
8
|
-
duc.serialize_duc(name=..., elements=...)
|
|
9
|
-
duc.utils.some_utility
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from .builders import *
|
|
13
|
-
from .classes import *
|
|
14
|
-
from .enums import *
|
|
15
|
-
from .parse import (DucData, get_external_file, list_external_files, parse_duc,
|
|
16
|
-
parse_duc_lazy)
|
|
17
|
-
from .search import *
|
|
18
|
-
from .serialize import DUC_SCHEMA_VERSION, serialize_duc
|
|
19
|
-
from .utils import *
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|