diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml
index 6fe533a7..cf45df93 100644
--- a/.github/workflows/pr-checks.yml
+++ b/.github/workflows/pr-checks.yml
@@ -47,7 +47,6 @@ jobs:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- lfs: true
- name: Setup Git
run: |
@@ -186,7 +185,6 @@ jobs:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- lfs: true
- name: Setup Node.js
uses: actions/setup-node@v6
diff --git a/.github/workflows/release-ducrs.yml b/.github/workflows/release-ducrs.yml
index 15e1efc3..f8c9eaf8 100644
--- a/.github/workflows/release-ducrs.yml
+++ b/.github/workflows/release-ducrs.yml
@@ -21,7 +21,6 @@ jobs:
fetch-depth: 0
ref: ${{ github.ref_name }}
persist-credentials: true
- lfs: true
- name: Set Git User
run: |
git config user.name "GitHub Action"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d9626a8c..3e553491 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -8,38 +8,6 @@ Thanks for your interest in contributing! We welcome all forms of contributions,
- [Bun](https://bun.sh/) `>=1.1.24` (package manager)
- [Node.js](https://nodejs.org/) `>=20`
-- [Git LFS](https://git-lfs.com/) — **required** to clone this repository
-
-### Git LFS
-
-This repository tracks CAD, 3D, and engineering binary files (`.duc`, `.dxf`, `.dwg`, `.stl`, `.obj`, `.fbx`, etc.) through [Git LFS](https://git-lfs.com/). You must install and initialize it before cloning, otherwise those files will be checked out as pointer stubs instead of the actual content.
-
-Install:
-
-```sh
-# macOS
-brew install git-lfs
-
-# Debian/Ubuntu
-sudo apt install git-lfs
-
-# Windows
-winget install GitHub.GitLFS
-```
-
-Initialize once per machine:
-
-```sh
-git lfs install
-```
-
-If you already cloned the repo before installing LFS, run:
-
-```sh
-git lfs pull
-```
-
-The full list of tracked extensions lives in [`.gitattributes`](./.gitattributes).
### Setup
diff --git a/README.md b/README.md
index 235bbb41..0eab522f 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ This documentation aims to provide a comprehensive guide to the format's structu
## Contributing
-We welcome contributions. See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions (including the required Git LFS install) and commit message guidelines.
+We welcome contributions. See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions and commit message guidelines.
## License
@@ -53,7 +53,7 @@ The project is licensed under the MIT License. See the [LICENSE](./LICENSE) file
## Community and Support
-Join our growing community to discuss, collaborate, and share insights about the duc format. Connect with us on [Scopture Community](https://site.scopture.com/community) or follow our [Social Media](https://site.scopture.com/socials) for the latest updates. For support, feel free to open an issue or contact us at [Support](https://ducflair.com/support).
+Join our growing community to discuss, collaborate, and share insights about the duc format. Connect with us on [Scopture Community](https://site.scopture.com/community). For support, feel free to open an issue or contact us at [Support](https://ducflair.com/support) or check our [Forum](https://help.ducflair.com/c/duc)
---
diff --git a/assets/testing/image-files/dot.png b/assets/testing/image-files/dot.png
deleted file mode 100644
index 2f48df4d..00000000
Binary files a/assets/testing/image-files/dot.png and /dev/null differ
diff --git a/assets/testing/image-files/infinite-zoom-math.png b/assets/testing/image-files/infinite-zoom-math.png
deleted file mode 100644
index 67aa2578..00000000
Binary files a/assets/testing/image-files/infinite-zoom-math.png and /dev/null differ
diff --git a/assets/testing/image-files/rect.png b/assets/testing/image-files/rect.png
deleted file mode 100644
index df451956..00000000
Binary files a/assets/testing/image-files/rect.png and /dev/null differ
diff --git a/assets/testing/image-files/test.jpg b/assets/testing/image-files/test.jpg
deleted file mode 100644
index 1983530f..00000000
Binary files a/assets/testing/image-files/test.jpg and /dev/null differ
diff --git a/assets/testing/image-files/thumbnail.png b/assets/testing/image-files/thumbnail.png
deleted file mode 100644
index 42f32caf..00000000
Binary files a/assets/testing/image-files/thumbnail.png and /dev/null differ
diff --git a/assets/testing/pdf-files/2412.07377v3.pdf b/assets/testing/pdf-files/2412.07377v3.pdf
deleted file mode 100644
index 13ce5749..00000000
Binary files a/assets/testing/pdf-files/2412.07377v3.pdf and /dev/null differ
diff --git a/assets/testing/pdf-files/image_test.pdf b/assets/testing/pdf-files/image_test.pdf
deleted file mode 100644
index 2d5ed500..00000000
Binary files a/assets/testing/pdf-files/image_test.pdf and /dev/null differ
diff --git a/assets/testing/pdf-files/lines.pdf b/assets/testing/pdf-files/lines.pdf
deleted file mode 100644
index 2e94e3f1..00000000
Binary files a/assets/testing/pdf-files/lines.pdf and /dev/null differ
diff --git a/assets/testing/pdf-files/ocg_integration_test.pdf b/assets/testing/pdf-files/ocg_integration_test.pdf
deleted file mode 100644
index 5e2df54a..00000000
Binary files a/assets/testing/pdf-files/ocg_integration_test.pdf and /dev/null differ
diff --git a/assets/testing/pdf-files/sample-tables.pdf b/assets/testing/pdf-files/sample-tables.pdf
deleted file mode 100644
index e80692ae..00000000
Binary files a/assets/testing/pdf-files/sample-tables.pdf and /dev/null differ
diff --git a/assets/testing/pdf-files/test.pdf b/assets/testing/pdf-files/test.pdf
deleted file mode 100644
index af5e7324..00000000
Binary files a/assets/testing/pdf-files/test.pdf and /dev/null differ
diff --git a/assets/testing/pdf-files/weingardt-2011-homer-gage-balcom-and-the-empire-state-building.pdf b/assets/testing/pdf-files/weingardt-2011-homer-gage-balcom-and-the-empire-state-building.pdf
deleted file mode 100644
index 27066477..00000000
Binary files a/assets/testing/pdf-files/weingardt-2011-homer-gage-balcom-and-the-empire-state-building.pdf and /dev/null differ
diff --git a/assets/testing/svg-files/hawaii.svg b/assets/testing/svg-files/hawaii.svg
deleted file mode 100644
index c8674484..00000000
--- a/assets/testing/svg-files/hawaii.svg
+++ /dev/null
@@ -1,1151 +0,0 @@
-
-
diff --git a/assets/testing/svg-files/paper-1.svg b/assets/testing/svg-files/paper-1.svg
deleted file mode 100644
index 8918f302..00000000
--- a/assets/testing/svg-files/paper-1.svg
+++ /dev/null
@@ -1,5122 +0,0 @@
-
-
diff --git a/assets/testing/svg-files/readme.txt b/assets/testing/svg-files/readme.txt
deleted file mode 100644
index fe452ac4..00000000
--- a/assets/testing/svg-files/readme.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-embrace.svg is derived from work by Jonatã Bolzan
-
- http://openclipart.org/people/jonata/jonata_Embrace_the_World.svg
-
-under the Creative Commons Attribution license 2.5
-
- http://creativecommons.org/licenses/by/2.5/legalcode
-
-
-hawaii.svg is derived from work by Sémhur
-
- http://commons.wikimedia.org/wiki/File:Hawaii_Island_topographic_map-fr.svg
-
-under the Creative Commons Attribution ShareAlike license 3.0
-
- https://creativecommons.org/licenses/by-sa/3.0/legalcode
diff --git a/assets/testing/svg-files/reschart.svg b/assets/testing/svg-files/reschart.svg
deleted file mode 100644
index 2c9fa9ce..00000000
--- a/assets/testing/svg-files/reschart.svg
+++ /dev/null
@@ -1,761 +0,0 @@
-
-
diff --git a/assets/testing/svg-files/tiger.svg b/assets/testing/svg-files/tiger.svg
deleted file mode 100644
index 1e3e9c53..00000000
--- a/assets/testing/svg-files/tiger.svg
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
diff --git a/packages/ducpy/src/_dev/dev_utils.py b/packages/ducpy/src/_dev/dev_utils.py
index 91ee1cfe..6e521cda 100644
--- a/packages/ducpy/src/_dev/dev_utils.py
+++ b/packages/ducpy/src/_dev/dev_utils.py
@@ -5,9 +5,19 @@
wheel. It is consumed by the local test suite, examples, and CI scripts.
"""
+import os
+import ssl
+import urllib.request
+import urllib.error
from pathlib import Path
+# Primary CDN for test fixtures (jsDelivr)
+FIXTURE_CDN = "https://cdn.jsdelivr.net/gh/ducflair/fixtures@main/src"
+# Fallback raw GitHub URL when jsDelivr rejects a file (e.g. size > 20 MB)
+_FIXTURE_GITHUB_RAW = "https://raw.githubusercontent.com/ducflair/fixtures/main/src"
+
+
def get_testing_assets_dir() -> str:
"""Dynamically resolve the assets/testing directory within the repository.
@@ -32,3 +42,90 @@ def get_testing_assets_dir() -> str:
return str(candidate.resolve())
raise FileNotFoundError("Could not locate repository 'assets/testing' directory.")
+
+
+def _download_with_headers(url: str, timeout: int) -> bytes:
+ """Fetch *url* and return raw bytes, disabling SSL verification."""
+ opener = urllib.request.build_opener()
+ opener.addheaders = [
+ (
+ "User-Agent",
+ (
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
+ "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0 Safari/537.36"
+ ),
+ ),
+ ("Accept", "*/*"),
+ ]
+ urllib.request.install_opener(opener)
+
+ ctx = ssl.create_default_context()
+ ctx.check_hostname = False
+ ctx.verify_mode = ssl.CERT_NONE
+
+ with urllib.request.urlopen(url, context=ctx, timeout=timeout) as response:
+ return response.read()
+
+
+def download_fixture_from_cdn(path: str, timeout: int = 30) -> bytes:
+ """Download fixture bytes from the fixture CDN with automatic fallback.
+
+ First tries jsDelivr (``FIXTURE_CDN``). If jsDelivr returns a plain-text
+ error such as *"File size exceeded the configured limit of 20 MB"*, the
+ helper falls back to GitHub raw content (``_FIXTURE_GITHUB_RAW``).
+
+ Args:
+ path: The relative path to the fixture under the ``src/`` directory in
+ the ``ducflair/fixtures`` repository,
+ e.g. ``"ifc-files/NVW_DCR-LOD100_Arch.ifc"``.
+ timeout: Request timeout in seconds.
+
+ Returns:
+ Raw bytes of the downloaded file.
+
+ Raises:
+ urllib.error.HTTPError: if both the CDN and GitHub raw return non-2xx.
+ urllib.error.URLError: if the connection fails entirely.
+ """
+ primary_url = f"{FIXTURE_CDN}/{path}"
+
+ try:
+ data = _download_with_headers(primary_url, timeout)
+ except urllib.error.HTTPError:
+ # non-2xx from jsDelivr – try GitHub raw immediately
+ fallback_url = f"{_FIXTURE_GITHUB_RAW}/{path}"
+ data = _download_with_headers(fallback_url, timeout)
+ return data
+
+ # jsDelivr can return HTTP 200 with a text error body for oversized files
+ _JSDELIVR_ERR_PREFIXES = (
+ b"File size exceeded",
+ b"Package size exceeded",
+ )
+ if data.startswith(_JSDELIVR_ERR_PREFIXES):
+ fallback_url = f"{_FIXTURE_GITHUB_RAW}/{path}"
+ data = _download_with_headers(fallback_url, timeout)
+
+ return data
+
+
+def get_asset_bytes(path: str, prefer_local: bool = True) -> bytes:
+ """Return raw bytes of a test asset, preferring a local copy if present.
+
+ Args:
+ path: Relative path inside ``src/`` (e.g. ``"pdf-files/test.pdf"``).
+ prefer_local: If ``True`` (default), first look under the repository's
+ ``assets/testing`` directory before falling back to the
+ CDN.
+
+ Returns:
+ Raw bytes of the asset.
+ """
+ if prefer_local:
+ assets_dir = get_testing_assets_dir()
+ local_path = os.path.join(assets_dir, path)
+ if os.path.exists(local_path):
+ with open(local_path, "rb") as f:
+ return f.read()
+
+ return download_fixture_from_cdn(path)
diff --git a/packages/ducpy/src/examples/model_element_demo.py b/packages/ducpy/src/examples/model_element_demo.py
index e516bcce..b9c97bca 100644
--- a/packages/ducpy/src/examples/model_element_demo.py
+++ b/packages/ducpy/src/examples/model_element_demo.py
@@ -4,8 +4,9 @@
"""
import os
+
import ducpy as duc
-from _dev.dev_utils import get_testing_assets_dir
+from _dev.dev_utils import download_fixture_from_cdn, get_testing_assets_dir
def build123d_model_code():
@@ -61,11 +62,6 @@ def main():
assets_dir = get_testing_assets_dir()
print(f"Testing Assets Directory resolved to: {assets_dir}")
- # Define paths to real test files
- ifc_file_path = os.path.join(assets_dir, "ifc-files", "NVW_DCR-LOD100_Arch.ifc")
- dxf_file_path = os.path.join(assets_dir, "dxf-files", "columns_R2007.dxf")
- step_file_path = os.path.join(assets_dir, "step-files", "123Block_Color.stp")
-
print("\n1. Creating Python model element with build123d...")
build123d_code = duc.extract_embedded_code(build123d_model_code)
build123d_model = (
@@ -80,8 +76,7 @@ def main():
print(f" Created build123d model (defaults to model_type: '{build123d_model.element.model_type}')")
print("\n2. Creating Python model element with ifcopenshell and a REAL IFC file...")
- with open(ifc_file_path, "rb") as f:
- ifc_bytes = f.read()
+ ifc_bytes = download_fixture_from_cdn("ifc-files/NVW_DCR-LOD100_Arch.ifc")
ifc_external_file = (
duc.StateBuilder()
@@ -104,11 +99,10 @@ def main():
.with_file_ids(["real_ifc_file"])
.build()
)
- print(f" Created ifcopenshell model with real IFC file '{os.path.basename(ifc_file_path)}' ({len(ifc_bytes)} bytes)")
+ print(f" Created ifcopenshell model with real IFC file ({len(ifc_bytes)} bytes)")
print("\n3. Creating Python model element with ezdxf and a REAL DXF file...")
- with open(dxf_file_path, "rb") as f:
- dxf_bytes = f.read()
+ dxf_bytes = download_fixture_from_cdn("dxf-files/columns_R2007.dxf")
dxf_external_file = (
duc.StateBuilder()
@@ -131,11 +125,10 @@ def main():
.with_file_ids(["real_dxf_file"])
.build()
)
- print(f" Created ezdxf model with real DXF file '{os.path.basename(dxf_file_path)}' ({len(dxf_bytes)} bytes)")
+ print(f" Created ezdxf model with real DXF file ({len(dxf_bytes)} bytes)")
print("\n4. Demonstrating Non-Python model imports (via external STEP files)...")
- with open(step_file_path, "rb") as f:
- step_bytes = f.read()
+ step_bytes = download_fixture_from_cdn("step-files/cis/MainSteel_structural.stp")
step_external_file = (
duc.StateBuilder()
@@ -158,7 +151,7 @@ def main():
.with_code(step_importer_code)
.build()
)
- print(f" Created STEP model with real STEP file '{os.path.basename(step_file_path)}' ({len(step_bytes)} bytes)")
+ print(f" Created STEP model with real STEP file ({len(step_bytes)} bytes)")
print("\n5. Testing model type validation (ValueErrors)...")
try:
diff --git a/packages/ducpy/src/tests/conftest.py b/packages/ducpy/src/tests/conftest.py
index 9e101490..3e510dd1 100644
--- a/packages/ducpy/src/tests/conftest.py
+++ b/packages/ducpy/src/tests/conftest.py
@@ -4,26 +4,11 @@
import os
import pytest
-from _dev.dev_utils import get_testing_assets_dir
-
-
-def get_asset_subdirectory(filename):
- """Determine the appropriate subdirectory based on file extension."""
- _, ext = os.path.splitext(filename.lower())
- ext = ext[1:] # Remove the dot
-
- if ext == "pdf":
- return "pdf-files"
- elif ext == "svg":
- return "svg-files"
- elif ext in ["png", "jpg", "jpeg", "gif"]:
- return "image-files"
- elif ext == "step":
- return "step-files"
- elif ext == "duc":
- return "duc-files"
- else:
- return "image-files" # default
+from _dev.dev_utils import (
+ get_testing_assets_dir,
+ get_asset_bytes,
+ download_fixture_from_cdn,
+)
@pytest.fixture
@@ -34,13 +19,11 @@ def test_assets_dir():
@pytest.fixture
def load_test_asset():
- """Return a function to load test assets by filename."""
- assets_dir = get_testing_assets_dir()
+ """Return a function to load test assets by filename (local or CDN fallback)."""
- def _load_asset(filename):
- sub_dir = get_asset_subdirectory(filename)
- with open(os.path.join(assets_dir, sub_dir, filename), "rb") as f:
- return f.read()
+ def _load_asset(path: str):
+ """Load an asset by its relative path (e.g. ``'pdf-files/test.pdf'``)."""
+ return get_asset_bytes(path, prefer_local=True)
return _load_asset
diff --git a/packages/ducpy/src/tests/src/test_a_duc_with_everything.py b/packages/ducpy/src/tests/src/test_a_duc_with_everything.py
index 33e543a7..befdee07 100644
--- a/packages/ducpy/src/tests/src/test_a_duc_with_everything.py
+++ b/packages/ducpy/src/tests/src/test_a_duc_with_everything.py
@@ -3,36 +3,23 @@
import os
import time
+from _dev.dev_utils import download_fixture_from_cdn
+
import ducpy as duc
from ducpy.builders.sql_builder import DucSQL
-def _load_asset_bytes(base_dir: str, filename: str) -> bytes:
- _, ext = os.path.splitext(filename.lower())
- ext = ext[1:]
- if ext == "pdf":
- sub_dir = "pdf-files"
- elif ext in {"png", "jpg", "jpeg", "gif"}:
- sub_dir = "image-files"
- elif ext == "step":
- sub_dir = "step-files"
- else:
- sub_dir = "image-files"
- with open(os.path.join(base_dir, sub_dir, filename), "rb") as f:
- return f.read()
-
-
-def test_a_duc_with_everything(test_output_dir, test_assets_dir):
+def test_a_duc_with_everything(test_output_dir):
output_file = os.path.join(test_output_dir, "test_a_duc_with_everything.duc")
now = int(time.time() * 1000)
if os.path.exists(output_file):
os.remove(output_file)
- thumbnail = _load_asset_bytes(test_assets_dir, "thumbnail.png")
- pdf_bytes = _load_asset_bytes(test_assets_dir, "test.pdf")
- step_bytes = _load_asset_bytes(test_assets_dir, "test.step")
- jpg_bytes = _load_asset_bytes(test_assets_dir, "test.jpg")
+ thumbnail = download_fixture_from_cdn("png-files/thumbnail.png")
+ pdf_bytes = download_fixture_from_cdn("pdf-files/test.pdf")
+ step_bytes = download_fixture_from_cdn("step-files/cis/MainSteel_structural.stp")
+ jpg_bytes = download_fixture_from_cdn("jpeg-files/test.jpg")
# Builder stream: elements
rect_from_builder = (
diff --git a/packages/ducpy/src/tests/src/test_create_image_element_with_external_file.py b/packages/ducpy/src/tests/src/test_create_image_element_with_external_file.py
index b1c6b474..cf2cf7bf 100644
--- a/packages/ducpy/src/tests/src/test_create_image_element_with_external_file.py
+++ b/packages/ducpy/src/tests/src/test_create_image_element_with_external_file.py
@@ -3,6 +3,8 @@
"""
import os
+from _dev.dev_utils import download_fixture_from_cdn
+
import ducpy as duc
@@ -18,17 +20,12 @@ def create_binary_files_dict(mime_type: str, image_id: str, image_bytes: bytes,
}
-def test_binary_files_serialization(test_assets_dir, test_output_dir):
+def test_binary_files_serialization(test_output_dir):
"""Test serializing a DUC file with binary image data and external file entry using the builder API."""
import ducpy as duc
- image_path = os.path.join(test_assets_dir, "image-files", "infinite-zoom-math.png")
- assert os.path.exists(image_path), f"Test asset not found: {image_path}"
-
- with open(image_path, 'rb') as f:
- image_bytes = f.read()
+ image_bytes = download_fixture_from_cdn("png-files/infinite-zoom-math.png")
- current_time_ms = int(os.path.getmtime(image_path) * 1000)
mime_type = "image/png"
image_id = "test_image"
@@ -59,23 +56,19 @@ def test_binary_files_serialization(test_assets_dir, test_output_dir):
)
print(f"Created DUC file with external file entry at {duc_path}")
- print(f"Image ('{image_path}') size: {len(image_bytes)} bytes")
+ print(f"Image (from {image_url}) size: {len(image_bytes)} bytes")
assert os.path.exists(duc_path), f"DUC file was not created: {duc_path}"
assert os.path.getsize(duc_path) > 0, "DUC file should not be empty"
-def test_image_with_external_file_via_sql(test_assets_dir, test_output_dir):
+def test_image_with_external_file_via_sql(test_output_dir):
"""Insert an image element with an external binary file using raw SQL."""
import time as _time
from ducpy.builders.sql_builder import DucSQL
- image_path = os.path.join(test_assets_dir, "image-files", "infinite-zoom-math.png")
- assert os.path.exists(image_path), f"Test asset not found: {image_path}"
-
- with open(image_path, "rb") as f:
- image_bytes = f.read()
+ image_bytes = download_fixture_from_cdn("png-files/infinite-zoom-math.png")
now = int(_time.time() * 1000)
output_file = os.path.join(test_output_dir, "test_image_external_sql.duc")
diff --git a/packages/ducpy/src/tests/src/test_embedded_code_validation.py b/packages/ducpy/src/tests/src/test_embedded_code_validation.py
index 79d28107..606a153f 100644
--- a/packages/ducpy/src/tests/src/test_embedded_code_validation.py
+++ b/packages/ducpy/src/tests/src/test_embedded_code_validation.py
@@ -2,9 +2,13 @@
import os
import pytest
+
+from _dev.dev_utils import download_fixture_from_cdn
+
import ducpy as duc
import ducpy.serialize as duc_serialize
+
# --- Helper Functions representing embedded code blocks ---
def valid_build123d_model():
@@ -171,11 +175,9 @@ def test_build123d_validation_failure():
assert "standard_" in str(excinfo.value).lower()
-def test_ifcopenshell_validation_success(test_output_dir, test_assets_dir):
+def test_ifcopenshell_validation_success(test_output_dir):
"""Verify that a Model element with valid ifcopenshell Python syntax and a real file serializes successfully."""
- ifc_file_path = os.path.join(test_assets_dir, "ifc-files", "NVW_DCR-LOD100_Arch.ifc")
- with open(ifc_file_path, "rb") as f:
- ifc_bytes = f.read()
+ ifc_bytes = download_fixture_from_cdn("ifc-files/NVW_DCR-LOD100_Arch.ifc")
external_file = (
duc.StateBuilder()
@@ -242,11 +244,9 @@ def test_ifcopenshell_validation_failure():
assert "not found in schema" in str(excinfo.value).lower()
-def test_ezdxf_validation_success(test_output_dir, test_assets_dir):
+def test_ezdxf_validation_success(test_output_dir):
"""Verify that a Model element with valid ezdxf Python syntax and a real file serializes successfully."""
- dxf_file_path = os.path.join(test_assets_dir, "dxf-files", "columns_R2007.dxf")
- with open(dxf_file_path, "rb") as f:
- dxf_bytes = f.read()
+ dxf_bytes = download_fixture_from_cdn("dxf-files/columns_R2007.dxf")
external_file = (
duc.StateBuilder()
diff --git a/packages/ducpy/src/tests/src/test_pdf_image_elements.py b/packages/ducpy/src/tests/src/test_pdf_image_elements.py
index 8a7811cb..2f90c6dc 100644
--- a/packages/ducpy/src/tests/src/test_pdf_image_elements.py
+++ b/packages/ducpy/src/tests/src/test_pdf_image_elements.py
@@ -3,17 +3,18 @@
import os
import time
+from _dev.dev_utils import get_asset_bytes
from ducpy.builders.sql_builder import DucSQL
-def test_csp_pdf_image_elements(test_output_dir, load_test_asset):
+def test_csp_pdf_image_elements(test_output_dir):
output_file = os.path.join(test_output_dir, "test_pdf_image_elements_sql.duc")
if os.path.exists(output_file):
os.remove(output_file)
now = int(time.time() * 1000)
- pdf_bytes = load_test_asset("test.pdf")
- image_bytes = load_test_asset("test.jpg")
+ pdf_bytes = get_asset_bytes("pdf-files/test.pdf")
+ image_bytes = get_asset_bytes("jpeg-files/test.jpg")
with DucSQL.new(output_file) as db:
db.sql("INSERT INTO external_files (id, active_revision_id, updated) VALUES (?,?,?)", "file_pdf", "file_pdf_rev1", now)