Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
38eebeb
test.adapter.aasx: Ensure ObjectStore dumping (#426)
ZANDx1 Dec 8, 2025
562b967
adapter.aasx: Add support for loading/saving thumbnails in AASX packa…
thammel Dec 10, 2025
e51e2f8
adapter.aasx: Add `rename_file` to `DictSupplementaryFileContainer` (…
thammel Dec 10, 2025
b600264
sdk: Disallow invalid types in MultiLanguage objects (#431)
ZANDx1 Jan 9, 2026
a081c0c
Update year of copyright notices in module docstrings (#450)
s-heppner Jan 20, 2026
aeb1b78
Fix display bug in set_copyright_year.sh (#454)
maxfalbe Feb 2, 2026
799a2e6
Removal of lang_string_set_to_xml (dead code) (#457)
ZANDx1 Feb 4, 2026
2e1932b
Add additional unittests for AASXReader (#448)
ZANDx1 Feb 4, 2026
6554e66
Backport CI Hotfix from `main` to `develop` (#461)
s-heppner Feb 9, 2026
10ff4e4
sdk: Refactor AbstractObjectProvider (#430)
moritzsommer Feb 17, 2026
1b1a884
sdk: Fix empty-cache handling in LocalFileIdentifiableStore (#463)
moritzsommer Feb 25, 2026
fcd29e3
sdk: Add tutorial for Submodel navigation (#411)
moritzsommer Feb 25, 2026
66374ea
etc/scripts/set_copyright_year.sh: Fix exit bug and check LICENSE (#464)
moritzsommer Feb 25, 2026
ef46fd8
Refactor server package structure (#467)
s-heppner Mar 1, 2026
2f25cc0
test: Remove unused OpenAPI files (#477)
hpoeche Apr 15, 2026
d99c15a
Update `develop` with 2.0.1 hotfix from `main` (#482)
s-heppner Apr 21, 2026
702d74e
sdk: Fix walk_submodel() skipping Entity and Operation children (#465)
zrgt Apr 21, 2026
ae41792
sdk: fix langtag constraints in LangStringSet (#478)
hpoeche Apr 21, 2026
a53e228
Replace acplt.org with example.org in example data (#474)
ArokyaMatthew Apr 23, 2026
b9ef3a4
Expand server with Registry and Discovery API (#407)
Ornella33 Apr 23, 2026
2cb2f67
API: Implement primitive data types (#442)
Frosty2500 May 1, 2026
5824891
docs: add Docker Hub pull instructions to server README (#489)
zrgt May 4, 2026
2dffb74
Update AASX (Part 5) to v3.1 (#486)
s-heppner May 5, 2026
148bd85
server/app/interfaces: update AAS- and SubmodelRepository API to V3.1…
Frosty2500 May 5, 2026
24d0669
Update IEC 61360 Data Specification to v3.1.1 (#487)
s-heppner May 6, 2026
39a86c3
Fix --quite typo: rename to --quiet in compliance_tool CLI (#506)
zrgt May 6, 2026
3ae2eae
fix: remove dead DataSpecificationIEC61360.value_id JSON deserializat…
zrgt May 6, 2026
98e1770
Update/metamodel v3.1.2 (#484)
s-heppner May 7, 2026
6b55752
Add deprecated discovery route (#524)
Ornella33 May 7, 2026
9dbb62f
Consolidate duplicated implementation of service specification (#527)
Ornella33 May 7, 2026
23557dd
test sdk: Increase test coverage (#483)
hpoeche May 8, 2026
f2ef2c1
server: raise BadRequest 400 on malformed assetIds instead of propaga…
zrgt May 8, 2026
21ab63a
server: Correct pagination `cursor` calculation and `limit` default (…
hpoeche May 8, 2026
dd5ff5c
Align API base paths (#534)
Ornella33 May 11, 2026
53f892e
Fix registry log output (#536)
Ornella33 May 12, 2026
bf0b17e
Always include paging_metadata in paginated list responses (#538)
zrgt May 12, 2026
8a9b39a
Fix Discovery persistence and lookup handling (#543)
Ornella33 May 13, 2026
10778d0
fix: pass paging_metadata kwarg correctly in get_aas_submodel_refs an…
zrgt May 13, 2026
855693e
fix: align ServiceSpecificationProfileEnum with IDTA-01002 v3.1.2 spe…
zrgt May 13, 2026
cd39f2e
fix: NamespaceSet.pop() removes item from all backends (#514)
zrgt May 13, 2026
34a6d6f
Fix load_directory silently dropping all descriptors (#545)
zrgt May 14, 2026
ba01ebf
Fix LocalFileIdentifiableStore: count and iterate only .json store fi…
zrgt May 14, 2026
be31bd0
fix: XML DataSpecificationIEC61360.value independent of value_format …
zrgt May 14, 2026
ca78e9a
fix: DictSupplementaryFileContainer increment refcount in _assign_uni…
zrgt May 14, 2026
5535d53
Fix GET /shells?assetIds: multiple globalAssetId values silently retu…
zrgt May 18, 2026
2b3716a
compliance_tool: remove unused schema check (#549)
hpoeche May 18, 2026
efea046
Revert `ServerAASFromJsonDecoder` direct import (#550)
Ornella33 May 19, 2026
bce50bc
Fix mutation persistence in persistent backends (#553)
s-heppner Jun 1, 2026
5220dda
CI: Build docker images for all services and archs (#556)
hpoeche Jun 4, 2026
65802ea
test_provider: add tests for AbstractObjectStore.sync() (#557)
JAB1305 Jun 4, 2026
ea3ad3c
SDK: Add tutorial_navigate_aas.py to Unit Tests (#568)
paul-gerber-svg Jun 6, 2026
c9eea68
model.datatypes: Improve BCE date error message (#578)
JAB1305 Jun 19, 2026
eb46b0c
Remove obsolete `1.0.0` file (#580)
hpoeche Jun 29, 2026
6c67c08
adapter.json: Tighten `dataSpecification` ref type (#581)
JAB1305 Jun 29, 2026
8c538c0
adapter: Allow optional contentType in Blob and File (#572)
paul-gerber-svg Jun 29, 2026
93c5f67
adapter: allow optional `valueId` in `ValueReferencePair` for JSON an…
paul-gerber-svg Jun 29, 2026
7e0809d
backend.local_file: Add unit tests for check_directory method (#571)
paul-gerber-svg Jun 29, 2026
5402399
compliance_tool: Replace fixture files with mocking (#575)
hpoeche Jun 29, 2026
77e709a
server.test: Add API base path consistency test (#583)
JAB1305 Jul 6, 2026
c308552
Extend ObjectStore tests to both implementations (#569)
JAB1305 Jul 6, 2026
c71c7ea
Fix OrderedNamespaceSet.__setitem__: int remove-before-add and slice …
zrgt Jul 6, 2026
480306b
Update pyproject.toml name of compliance-tool (#585)
s-heppner Jul 6, 2026
3e0dc77
model.datatypes: Fix `UnsignedInt` XSD type name (#589)
JAB1305 Jul 13, 2026
06a9b62
model.base: Fix MultiLanguageNameType value length to 128 (#577)
thammel Jul 13, 2026
2ec6901
Allow optional `first`/`second` in relationship elements (#587)
JAB1305 Jul 14, 2026
60a30be
model.datatypes: Handle XSD end-of-day midnight 24:00:00 (#582)
paul-gerber-svg Jul 14, 2026
90edde2
compliance_tool: Restore entry point and SDK dep (#593)
s-heppner Jul 14, 2026
59adfe6
adapter.json: Remove duplicate `@classmethod` (#595)
s-heppner Jul 15, 2026
574f59e
model.datatypes: Fix gYear/gYearMonth validation (#586)
paul-gerber-svg Jul 15, 2026
41b0801
Update outdated package READMEs (#590)
s-heppner Jul 16, 2026
92aa732
Merge branch 'main' into develop
s-heppner Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jobs:
# that you want to use to test the serialization adapter against.
# Currently, we need to update this manually, however I'm afraid this is not possible to automatically infer,
# since it's heavily dependant of the version of the AAS specification we support.
AAS_SPECS_RELEASE_TAG: "IDTA-01001-3-0-1_schemasV3.0.8"
AAS_SPECS_RELEASE_TAG: "IDTA-01001-3-1-2"
services:
couchdb:
image: couchdb:3
Expand Down Expand Up @@ -203,7 +203,6 @@ jobs:
chmod +x ./etc/scripts/set_copyright_year.sh
./etc/scripts/set_copyright_year.sh --check


compliance-tool-test:
# This job runs the unittests on the python versions specified down at the matrix
runs-on: ubuntu-latest
Expand All @@ -216,12 +215,17 @@ jobs:

steps:
- uses: actions/checkout@v4
with:
# TODO(#592): revisit when the sdk<->compliance_tool version pinning is fixed.
# Need tags so setuptools_scm builds the local sdk as >=1.0.0, else the loose
# `basyx-python-sdk>=1.0.0` pin lets pip replace it with the PyPI release.
fetch-depth: 0
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install Python dependencies
# install the local sdk in editable mode so it does not get overwritten
# install the local sdk first so its version satisfies the >=1.0.0 pin and pip keeps it instead of PyPI
run: |
python -m pip install --upgrade pip
python -m pip install ../sdk
Expand All @@ -243,12 +247,17 @@ jobs:
working-directory: ./compliance_tool
steps:
- uses: actions/checkout@v4
with:
# TODO(#592): revisit when the sdk<->compliance_tool version pinning is fixed.
# Need tags so setuptools_scm builds the local sdk as >=1.0.0, else the loose
# `basyx-python-sdk>=1.0.0` pin lets pip replace it with the PyPI release.
fetch-depth: 0
- name: Set up Python ${{ env.X_PYTHON_MIN_VERSION }}
uses: actions/setup-python@v5
with:
python-version: ${{ env.X_PYTHON_MIN_VERSION }}
- name: Install Python dependencies
# install the local sdk in editable mode so it does not get overwritten
# install the local sdk first so its version satisfies the >=1.0.0 pin and pip keeps it instead of PyPI
run: |
python -m pip install --upgrade pip
python -m pip install ../sdk
Expand Down Expand Up @@ -292,7 +301,7 @@ jobs:

defaults:
run:
working-directory: ./server/app
working-directory: ./server
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ env.X_PYTHON_MIN_VERSION }}
Expand All @@ -302,26 +311,26 @@ jobs:
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
python -m pip install ../../sdk
python -m pip install ../sdk
python -m pip install .[dev]
- name: Check typing with MyPy
run: |
python -m mypy .
python -m mypy app test
- name: Check code style with PyCodestyle
run: |
python -m pycodestyle --count --max-line-length 120 .
python -m pycodestyle --count --max-line-length 120 app test

server-package:
server-repository-docker:
# This job checks if we can build our server package
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./server
working-directory: ./server/docker/repository
steps:
- uses: actions/checkout@v4
- name: Build the Docker image
run: |
docker build -t basyx-python-server -f Dockerfile ..
docker build -t basyx-python-server -f Dockerfile ../../..
- name: Run container
run: |
docker run -d --name basyx-python-server basyx-python-server
Expand Down
116 changes: 110 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
release:
types: [published]

env:
TARGET_PLATFORM: "linux/amd64,linux/arm/v7,linux/arm64"

jobs:
sdk-publish:
# This job publishes the package to PyPI
Expand Down Expand Up @@ -59,7 +62,54 @@ jobs:
with:
password: ${{ secrets.PYPI_ORG_TOKEN }}

server-publish:
server-repository-publish:
# This job publishes the server docker image to DockerHub
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./server
steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Extract Docker image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: eclipsebasyx/basyx-python-repository
# This fetches the latest git tag and adds an additional "latest" to it, so e.g. `2.1.0,latest`
tags: |
type=semver,pattern={{version}}
type=raw,value=latest
labels: |
org.opencontainers.image.title=BaSyx Python Repository Service
org.opencontainers.image.description=Eclipse BaSyx Python SDK - Repository HTTP Server
org.opencontainers.image.source=https://github.com/eclipse-basyx/basyx-python-sdk/tree/main/server
org.opencontainers.image.licenses=MIT

- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}

- name: Setup QEMU
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Build and Push Repository Docker Image
uses: docker/build-push-action@v6
with:
context: .
file: ./server/docker/repository/Dockerfile
platforms: ${{ env.TARGET_PLATFORM }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

server-discovery-publish:
# This job publishes the server docker image to DockerHub
runs-on: ubuntu-latest
defaults:
Expand All @@ -73,14 +123,14 @@ jobs:
id: meta
uses: docker/metadata-action@v5
with:
images: eclipsebasyx/basyx-python-server
images: eclipsebasyx/basyx-python-discovery
# This fetches the latest git tag and adds an additional "latest" to it, so e.g. `2.1.0,latest`
tags: |
type=semver,pattern={{version}}
type=raw,value=latest
labels: |
org.opencontainers.image.title=BaSyx Python Server
org.opencontainers.image.description=Eclipse BaSyx Python SDK - HTTP Server
org.opencontainers.image.title=BaSyx Python Discovery Service
org.opencontainers.image.description=Eclipse BaSyx Python SDK - Discovery HTTP Server
org.opencontainers.image.source=https://github.com/eclipse-basyx/basyx-python-sdk/tree/main/server
org.opencontainers.image.licenses=MIT

Expand All @@ -90,11 +140,65 @@ jobs:
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}

- name: Build and Push Docker Image
- name: Setup QEMU
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Build and Push Repository Docker Image
uses: docker/build-push-action@v6
with:
context: .
file: ./server/docker/discovery/Dockerfile
platforms: ${{ env.TARGET_PLATFORM }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

server-registry-publish:
# This job publishes the server docker image to DockerHub
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./server
steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Extract Docker image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: eclipsebasyx/basyx-python-registry
# This fetches the latest git tag and adds an additional "latest" to it, so e.g. `2.1.0,latest`
tags: |
type=semver,pattern={{version}}
type=raw,value=latest
labels: |
org.opencontainers.image.title=BaSyx Python Registry Service
org.opencontainers.image.description=Eclipse BaSyx Python SDK - Registry HTTP Server
org.opencontainers.image.source=https://github.com/eclipse-basyx/basyx-python-sdk/tree/main/server
org.opencontainers.image.licenses=MIT

- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}

- name: Setup QEMU
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Build and Push Repository Docker Image
uses: docker/build-push-action@v6
with:
context: .
file: ./server/Dockerfile # Todo: Update paths
file: ./server/docker/registry/Dockerfile
platforms: ${{ env.TARGET_PLATFORM }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
7 changes: 5 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,8 @@ compliance_tool/aas_compliance_tool/version.py
server/app/version.py

# Ignore the content of the server storage
server/input/
server/storage/
server/example_configurations/repository_standalone/input/
server/example_configurations/repository_standalone/storage/
server/example_configurations/registry_standalone/input/
server/example_configurations/registry_standalone/storage/
server/example_configurations/discovery_standalone/storage/
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2019-2022 the Eclipse BaSyx Authors
Copyright (c) 2019-2026 the Eclipse BaSyx Authors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ for Industry 4.0 Systems.

These are the implemented AAS specifications of the [current SDK release](https://github.com/eclipse-basyx/basyx-python-sdk/releases/latest), which can be also found on [PyPI](https://pypi.org/project/basyx-python-sdk/):

| Specification | Version |
|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Part 1: Metamodel | [v3.0.1 (01001-3-0-1)](https://industrialdigitaltwin.org/wp-content/uploads/2024/06/IDTA-01001-3-0-1_SpecificationAssetAdministrationShell_Part1_Metamodel.pdf) |
| Schemata (JSONSchema, XSD) | [v3.0.8 (IDTA-01001-3-0-1_schemasV3.0.8)](https://github.com/admin-shell-io/aas-specs/releases/tag/IDTA-01001-3-0-1_schemasV3.0.8) |
| Part 2: API | [v3.0 (01002-3-0)](https://industrialdigitaltwin.org/en/wp-content/uploads/sites/2/2023/06/IDTA-01002-3-0_SpecificationAssetAdministrationShell_Part2_API_.pdf) |
| Part 3a: Data Specification IEC 61360 | [v3.0 (01003-a-3-0)](https://industrialdigitaltwin.org/wp-content/uploads/2023/04/IDTA-01003-a-3-0_SpecificationAssetAdministrationShell_Part3a_DataSpecification_IEC61360.pdf) |
| Part 5: Package File Format (AASX) | [v3.0 (01005-3-0)](https://industrialdigitaltwin.org/wp-content/uploads/2023/04/IDTA-01005-3-0_SpecificationAssetAdministrationShell_Part5_AASXPackageFileFormat.pdf) |
| Specification | Version |
|---------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
| Part 1: Metamodel | [v3.1.2 (01001-3-1-2)](https://industrialdigitaltwin.io/aas-specifications/IDTA-01001/v3.1.2/index.html) |
| Schemata (JSONSchema, XSD) | [v3.1.2 (IDTA-01001-3-1-2)](https://github.com/admin-shell-io/aas-specs-metamodel/releases/tag/v3.1.2) |
| Part 2: API | [v3.1.1 (01002)](https://industrialdigitaltwin.org/en/wp-content/uploads/sites/2/2025/08/IDTA-01002-3-1-1_AAS-Specification_Part2_API.pdf) |
| Part 3a: Data Specification IEC 61360 | [v3.1.1 (01003-a)](https://industrialdigitaltwin.org/wp-content/uploads/2025/08/IDTA-01003-a-3-1-1_AAS-Specification_Part3a_DataSpecification.pdf) |
| Part 5: Package File Format (AASX) | [v3.1 (01005)](https://industrialdigitaltwin.org/wp-content/uploads/2025/06/IDTA_01005-25-01_AAS-Specification_Part5_AASXPackageFileFormat.pdf) |


If you need support to an older version of the specifications, please refer to our [prior releases](https://github.com/eclipse-basyx/basyx-python-sdk/releases).
Each of them has a similar table at the top of the release notes.
Expand All @@ -22,7 +23,7 @@ Each of them has a similar table at the top of the release notes.
This repository is structured into separate packages.
The `sdk` directory provides the AAS metamodel as Python objects and fundamental functionalities to handle AAS.
The `server` implements a specification-compliant Docker HTTP server for AASs.
The `compliance_tool` is to be determined.
The `compliance_tool` is a command-line tool for checking whether JSON and XML files comply with the AAS specification.

* [SDK](./sdk/README.md):
* Modelling of AASs as Python objects
Expand All @@ -35,6 +36,9 @@ The `compliance_tool` is to be determined.
* [Server](./server/README.md): Docker Image of a specification compliant HTTP Server implementing the interfaces:
* Asset Administration Shell Repository
* Submodel Repository
* Asset Administration Shell Registry Service
* Submodel Registry Service
* Discovery
* [Compliance Tool](./compliance_tool/README.md): A command-line tool for checking compliance of JSON and XML files
to the specification of the AAS

Expand Down
32 changes: 32 additions & 0 deletions compliance_tool/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,38 @@ Shell elements
* check if the data in a given xml, json or aasx file is the same as the example data
* check if two given xml, json or aasx files contain the same Asset Administration Shell elements in any order

## Installation

### Default installation
Install the latest release from PyPI:

```bash
pip install basyx-compliance-tool
```

### Developer installation
When working from a checkout of this repository, install the sibling SDK from the source tree *first*, then the
compliance tool:

```bash
pip install ./sdk
pip install ./compliance_tool
```

Installing the local SDK first is what lets the tool check against your in-development metamodel: `pip` keeps the
already-installed local SDK instead of pulling a release from PyPI.

> [!IMPORTANT]
> The compliance checks are only as current as the installed `basyx-python-sdk` — the tool reports compliance against
> whatever metamodel version that SDK implements, not against the version named in this README. Because the dependency
> is currently declared loosely (`basyx-python-sdk>=1.0.0`), `pip` will **not** replace an SDK that is already installed
> and satisfies that constraint, even if it is older than the one you intend to test against. This happens silently, with
> no error. To be sure you are checking against the intended metamodel, install or upgrade the SDK explicitly, e.g. the
> local source tree with `pip install ./sdk` or a specific release with `pip install --upgrade "basyx-python-sdk==2.1.0"`.
>
> This manual version matching is a temporary workaround; see #592.

## Usage
Invoking should work with either `python -m aas_compliance_tool.cli` or (when installed correctly and PATH is set
correctly) with `aas-compliance-check` on the command line.

Expand Down
Loading
Loading