# Release Notes
Version 2.2.0 of the BaSyx-Python SDK is a **maintenance release that modernizes the project tooling, CI and packaging**. The implemented AAS specification versions are unchanged from 2.1.0.
**The minimum supported Python version is now 3.11.** Python 3.10 is no longer supported; it reaches end of life in October 2026. All three packages (`basyx-python-sdk`, `basyx-python-server`, `basyx-compliance-tool`) now declare `requires-python = ">=3.11"`.
The codebase is now linted and formatted with **`ruff`**, replacing `pycodestyle`. This reformatted a large part of the SDK without changing its functionality. If you use `git blame`, configure git to skip the formatting commit via the new `.git-blame-ignore-revs` file: `git config blame.ignoreRevsFile .git-blame-ignore-revs`.
**Please note a small change in the import behavior of `basyx.aas.adapter.json` and `basyx.aas.adapter.xml`.** Both packages now define `__all__`. It lists the public API: the encoder and decoder classes, and the `read_*` and `write_*` functions.
Before this release, a star-import such as `from basyx.aas.adapter.xml import *` also added the submodule names `xml_serialization` and `xml_deserialization` to your namespace. The JSON package added `json_serialization` and `json_deserialization` in the same way. This does not happen now.
Does your code use a submodule name after a star-import, for example `xml_deserialization.AASFromXmlDecoder`? Then import the submodule directly instead:
```python
from basyx.aas.adapter.xml import xml_deserialization, xml_serialization
```
Direct imports and attribute access via the package (e.g. `from basyx.aas.adapter import xml` followed by `xml.xml_deserialization`) are unaffected.
The server package now declares `basyx-python-sdk` as a dependency. **If you build the server Docker images yourself, the build command changed.** The build context is now the `server` directory instead of the repository root. The `sdk` and `LICENSE` sources are passed in as additional build contexts:
```bash
cd server
docker build -t basyx-python-repository -f docker/repository/Dockerfile --build-context sdk=../sdk --build-context license=.. .
```
The example Docker compose files that build the images locally are renamed to `compose.dev.yml`. Use `docker compose -f compose.dev.yml up` to start them. The pre-built images on Docker Hub are unaffected.
Furthermore, the `LICENSE` file is now included in the sdist and wheel of all packages published to PyPI as well as in the server Docker images, and the package metadata follows PEP 639.
This release implements the following versions of the AAS specification:
Part 1: Metamodel v3.1.2 (01001-3-1-2)
Schemata (JSONSchema, XSD) v3.1.2 (IDTA-01001-3-1-2) |
Part 2: API v3.1.1 (01002)
Part 3a: Data Specification IEC 61360 v3.1.1 (01003-a)
Part 5: Package File Format (AASX) v3.1 (01005)
# Changelog
**Notable:**
- Raise the minimum supported Python version to **3.11** (See: #610)
- Introduce **`ruff`** as linter and formatter, replacing `pycodestyle` (See: #601)
- Define `__all__` in `adapter.json` and `adapter.xml`; star-imports no longer expose the `*_serialization`/`*_deserialization` submodule names (See: #601)
- Restructure the CI workflows and Docker builds (See: #599)
- Collect all version pins in a single `versions.toml` as the single point of truth (See: #610)
- Declare the SDK as a dependency of the server and build the server Docker images from `./server` (See: #611)
**Improvements:**
- Include `LICENSE` in the sdist, wheel and server Docker images and switch to PEP 639 license metadata (See: #609)
- Test all three server profiles in CI and check liveness via the `/description` endpoint (See: #599)
- Rename the locally-building Docker compose example files to `compose.dev.yml` (See: #611)
- Modernize and restructure `README.md` with badges, a Getting Started section, examples and an FAQ (See: #615)
- Reintroduce the original logo in `README.md` (See: #612)
**Bugfixes:**
- Allow years with more than four digits in `xs:dateTime`, `xs:date`, `xs:gYear` and `xs:gYearMonth` (See: #617)
**Testing & Internal:**
- Pin `mypy` and `ruff` to fixed versions in all packages and verify consistency with `versions.toml` in CI (See: #610)
- Pin GitHub Actions to commit hashes, cache pip downloads and cancel concurrent CI runs (See: #599)
- Run static analysis on `etc/scripts` (See: #599)
- Fetch the AAS schema files from the `aas-specs-metamodel` repository (See: #599)
- Add `.git-blame-ignore-revs` for the `ruff` formatting commit (See: #603)
- Add missing copyright headers and enforce them with the `ruff` rule `CPY001` (See: #614)
- Delete the outdated `NOTICE` file and the duplicate `LICENSE` in `compliance_tool` (See: #606, #609)