lib-shopware6-api-base 3.1.0__tar.gz → 3.1.2__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.
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/CHANGELOG.md +18 -0
- lib_shopware6_api_base-3.1.2/Makefile +260 -0
- lib_shopware6_api_base-3.1.0/README.md → lib_shopware6_api_base-3.1.2/PKG-INFO +112 -10
- lib_shopware6_api_base-3.1.0/PKG-INFO → lib_shopware6_api_base-3.1.2/README.md +59 -63
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/pyproject.toml +34 -26
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/__init__conf__.py +1 -1
- lib_shopware6_api_base-3.1.0/mk +0 -4
- lib_shopware6_api_base-3.1.0/mk.py +0 -21
- lib_shopware6_api_base-3.1.0/scripts/__init__.py +0 -9
- lib_shopware6_api_base-3.1.0/scripts/__main__.py +0 -8
- lib_shopware6_api_base-3.1.0/scripts/_git.py +0 -122
- lib_shopware6_api_base-3.1.0/scripts/_metadata.py +0 -630
- lib_shopware6_api_base-3.1.0/scripts/_pip.py +0 -112
- lib_shopware6_api_base-3.1.0/scripts/_subprocess.py +0 -89
- lib_shopware6_api_base-3.1.0/scripts/_test_audit.py +0 -212
- lib_shopware6_api_base-3.1.0/scripts/_test_coverage.py +0 -265
- lib_shopware6_api_base-3.1.0/scripts/_test_steps.py +0 -387
- lib_shopware6_api_base-3.1.0/scripts/_utils.py +0 -83
- lib_shopware6_api_base-3.1.0/scripts/build.py +0 -52
- lib_shopware6_api_base-3.1.0/scripts/bump.py +0 -33
- lib_shopware6_api_base-3.1.0/scripts/bump_major.py +0 -21
- lib_shopware6_api_base-3.1.0/scripts/bump_minor.py +0 -21
- lib_shopware6_api_base-3.1.0/scripts/bump_patch.py +0 -21
- lib_shopware6_api_base-3.1.0/scripts/bump_version.py +0 -124
- lib_shopware6_api_base-3.1.0/scripts/clean.py +0 -75
- lib_shopware6_api_base-3.1.0/scripts/cli.py +0 -245
- lib_shopware6_api_base-3.1.0/scripts/dependencies.py +0 -611
- lib_shopware6_api_base-3.1.0/scripts/dev.py +0 -20
- lib_shopware6_api_base-3.1.0/scripts/help.py +0 -38
- lib_shopware6_api_base-3.1.0/scripts/install.py +0 -20
- lib_shopware6_api_base-3.1.0/scripts/menu.py +0 -637
- lib_shopware6_api_base-3.1.0/scripts/push.py +0 -351
- lib_shopware6_api_base-3.1.0/scripts/refractor.md +0 -114
- lib_shopware6_api_base-3.1.0/scripts/refractor.py +0 -1221
- lib_shopware6_api_base-3.1.0/scripts/release.py +0 -98
- lib_shopware6_api_base-3.1.0/scripts/run_cli.py +0 -71
- lib_shopware6_api_base-3.1.0/scripts/target_metadata.py +0 -205
- lib_shopware6_api_base-3.1.0/scripts/test.py +0 -455
- lib_shopware6_api_base-3.1.0/scripts/toml_config.py +0 -433
- lib_shopware6_api_base-3.1.0/scripts/version_current.py +0 -21
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/lib_bash_functions.sh +0 -275
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/run_clean.sh +0 -10
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/run_pytest.sh +0 -35
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/run_testloop.sh +0 -61
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/run_testloop_pytest_and_mypy_only_no_setup.sh +0 -61
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/run_testloop_windows.cmd +0 -33
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/shellcheck.sh +0 -49
- lib_shopware6_api_base-3.1.0/tests/local_testscripts/testing_tools.py +0 -136
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.devcontainer/devcontainer.json +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.devcontainer/settings.json +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.github/actions/extract-metadata/action.yml +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.github/dependabot.yml +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.github/workflows/cicd_docker.yml +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.github/workflows/codeql-analysis.yml +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.github/workflows/default_release_public.yml +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/.gitignore +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/CODE_OF_CONDUCT.md +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/CONTRIBUTING.md +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/INSTALL.md +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/ISSUE_TEMPLATE.md +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/LICENSE +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/PULL_REQUEST_TEMPLATE.md +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/example.env +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/notebooks/Quickstart.ipynb +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/.gitignore +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/__init__.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/__main__.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/_compat.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/_http_common.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/conf_shopware6_api_base_classes.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/exit_codes.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_admin_client.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_api_base.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_api_base_cli.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_api_base_criteria.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_api_base_criteria_aggregation.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_api_base_criteria_filter.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_api_base_criteria_sorting.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_api_base_helpers.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/lib_shopware6_storefront_client.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/src/lib_shopware6_api_base/py.typed +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/conf_test_docker.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/conftest.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/docker.env +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_api_base.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_cli.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_conf_classes.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_config.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_criteria.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_criteria_aggregation.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_criteria_filter.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_criteria_sorting.py +0 -0
- {lib_shopware6_api_base-3.1.0 → lib_shopware6_api_base-3.1.2}/tests/test_helpers.py +0 -0
|
@@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.1.2] - 2026-06-08
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **Tooling**: project automation converted to the standard BMK `Makefile`; `make test`, `make testintegration`, `make push`, `make release`, and `make bump-*` now run via the `bmk` uv-tool. The vendored `scripts/` package (plus `mk` / `mk.py`) and the dead `tests/local_testscripts/` helpers were removed.
|
|
13
|
+
- **Docs**: README gained a "Development" section documenting how to run the unit suite (`make test`) and the dockware-backed integration suite (`make testintegration`), including prerequisites.
|
|
14
|
+
- Refreshed dependency minimums to current releases (`pydantic`, `pydantic-settings`, `httpx2`, `lib_cli_exit_tools`, and dev/build tooling) via the bmk dependency update.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- pip-audit: ignore shared dev-venv audit noise (`aiohttp`, `paramiko`, `pyjwt`) — not dependencies of this project and absent from CI's clean env; present only because sibling editable projects share the local venv.
|
|
19
|
+
|
|
20
|
+
## [3.1.1] - 2026-06-08
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- pip-audit: ignore `PYSEC-2026-196` (pip 26.1.1, env-only GHA runner image, fix in pip 26.1.2, awaiting runner bump) — unblocks the scheduled CI vulnerability scan.
|
|
25
|
+
|
|
8
26
|
## [3.1.0] - 2026-06-01
|
|
9
27
|
|
|
10
28
|
### Changed
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# BMK MAKEFILE 2.9.4
|
|
2
|
+
# do not alter this file - it might be overwritten on new versions of BMK
|
|
3
|
+
# if You want to alter it, remove the first line # BMK MAKEFILE 1.0 - then it is a custom makefile and will not be overwritten
|
|
4
|
+
# bmk Makefile — thin wrapper using `uv tool install` for persistent bmk
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# make test # run test suite
|
|
8
|
+
# make test --verbose # forward extra flags
|
|
9
|
+
# make bump-patch # bump patch version
|
|
10
|
+
# make push fix login bug # push with commit message
|
|
11
|
+
# make custom deploy # run custom command
|
|
12
|
+
# make custom deploy --dry-run
|
|
13
|
+
#
|
|
14
|
+
# On every invocation, bmk is (re-)installed as a persistent uv tool
|
|
15
|
+
# together with the current project's dependencies (read from ./pyproject.toml).
|
|
16
|
+
# This ensures pyright, pytest, pip-audit etc. can resolve the full
|
|
17
|
+
# dependency tree without PYTHONPATH hacks or a local .venv.
|
|
18
|
+
#
|
|
19
|
+
# Arguments after the target name are forwarded automatically.
|
|
20
|
+
# You can also use ARGS="..." explicitly if preferred.
|
|
21
|
+
|
|
22
|
+
SHELL := /bin/bash
|
|
23
|
+
.DEFAULT_GOAL := help
|
|
24
|
+
|
|
25
|
+
# Use absolute path to the uv tool binary so active virtualenvs cannot shadow it.
|
|
26
|
+
BMK := $(HOME)/.local/bin/bmk
|
|
27
|
+
ARGS ?=
|
|
28
|
+
|
|
29
|
+
# ──────────────────────────────────────────────────────────────
|
|
30
|
+
# Ensure bmk + project deps are installed as a persistent uv tool
|
|
31
|
+
# ──────────────────────────────────────────────────────────────
|
|
32
|
+
# --reinstall re-resolves deps on every call (fast when cached).
|
|
33
|
+
# Fallback handles first-time install where --reinstall would fail.
|
|
34
|
+
.PHONY: _ensure_bmk
|
|
35
|
+
_ensure_bmk:
|
|
36
|
+
@uv tool install --reinstall bmk --with . 2>/dev/null || uv tool install bmk --with .
|
|
37
|
+
|
|
38
|
+
# ──────────────────────────────────────────────────────────────
|
|
39
|
+
# Argument forwarding via MAKECMDGOALS
|
|
40
|
+
# ──────────────────────────────────────────────────────────────
|
|
41
|
+
# Allows natural argument passing: make push fix login bug
|
|
42
|
+
# instead of: make push ARGS="fix login bug"
|
|
43
|
+
|
|
44
|
+
# All targets that accept trailing arguments
|
|
45
|
+
_BMK_TARGETS := test t test-human th testintegration testi ti testintegration-human tih \
|
|
46
|
+
codecov coverage cov \
|
|
47
|
+
build bld clean cln cl run \
|
|
48
|
+
bump-major bump-minor bump-patch bump \
|
|
49
|
+
commit c push psh p release rel r \
|
|
50
|
+
dependencies deps d dependencies-update \
|
|
51
|
+
config config-deploy config-generate-examples \
|
|
52
|
+
send-email send-notification custom \
|
|
53
|
+
info logdemo
|
|
54
|
+
|
|
55
|
+
ifneq (,$(filter $(_BMK_TARGETS),$(firstword $(MAKECMDGOALS))))
|
|
56
|
+
# Capture everything after the first word as extra arguments
|
|
57
|
+
_EXTRA := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
|
|
58
|
+
# Append to ARGS (so explicit ARGS="..." still works alongside)
|
|
59
|
+
override ARGS += $(_EXTRA)
|
|
60
|
+
endif
|
|
61
|
+
|
|
62
|
+
# ──────────────────────────────────────────────────────────────
|
|
63
|
+
# Test & Quality
|
|
64
|
+
# ──────────────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
.PHONY: test t
|
|
67
|
+
test: _ensure_bmk ## Run test suite [alias: t]
|
|
68
|
+
$(BMK) test $(ARGS)
|
|
69
|
+
t: _ensure_bmk
|
|
70
|
+
$(BMK) test $(ARGS)
|
|
71
|
+
|
|
72
|
+
.PHONY: test-human th
|
|
73
|
+
test-human: _ensure_bmk ## Run test suite with human-readable output [alias: th]
|
|
74
|
+
$(BMK) test --human $(ARGS)
|
|
75
|
+
th: _ensure_bmk
|
|
76
|
+
$(BMK) test --human $(ARGS)
|
|
77
|
+
|
|
78
|
+
.PHONY: testintegration testi ti
|
|
79
|
+
testintegration: _ensure_bmk ## Run integration tests only [aliases: testi, ti]
|
|
80
|
+
$(BMK) testintegration $(ARGS)
|
|
81
|
+
testi ti: _ensure_bmk
|
|
82
|
+
$(BMK) testintegration $(ARGS)
|
|
83
|
+
|
|
84
|
+
.PHONY: testintegration-human tih
|
|
85
|
+
testintegration-human: _ensure_bmk ## Run integration tests with human-readable output [alias: tih]
|
|
86
|
+
$(BMK) testintegration --human $(ARGS)
|
|
87
|
+
tih: _ensure_bmk
|
|
88
|
+
$(BMK) testintegration --human $(ARGS)
|
|
89
|
+
|
|
90
|
+
.PHONY: codecov coverage cov
|
|
91
|
+
codecov: _ensure_bmk ## Upload coverage report to Codecov [aliases: coverage, cov]
|
|
92
|
+
$(BMK) codecov $(ARGS)
|
|
93
|
+
coverage cov: _ensure_bmk
|
|
94
|
+
$(BMK) codecov $(ARGS)
|
|
95
|
+
|
|
96
|
+
# ──────────────────────────────────────────────────────────────
|
|
97
|
+
# Build & Clean
|
|
98
|
+
# ──────────────────────────────────────────────────────────────
|
|
99
|
+
|
|
100
|
+
.PHONY: build bld
|
|
101
|
+
build: _ensure_bmk ## Build wheel and sdist artifacts [alias: bld]
|
|
102
|
+
$(BMK) build $(ARGS)
|
|
103
|
+
bld: _ensure_bmk
|
|
104
|
+
$(BMK) build $(ARGS)
|
|
105
|
+
|
|
106
|
+
.PHONY: clean cln cl
|
|
107
|
+
clean: _ensure_bmk ## Remove build artifacts and caches [aliases: cln, cl]
|
|
108
|
+
$(BMK) clean $(ARGS)
|
|
109
|
+
cln cl: _ensure_bmk
|
|
110
|
+
$(BMK) clean $(ARGS)
|
|
111
|
+
|
|
112
|
+
# ──────────────────────────────────────────────────────────────
|
|
113
|
+
# Run
|
|
114
|
+
# ──────────────────────────────────────────────────────────────
|
|
115
|
+
|
|
116
|
+
.PHONY: run
|
|
117
|
+
run: _ensure_bmk ## Run the project CLI
|
|
118
|
+
$(BMK) run $(ARGS)
|
|
119
|
+
|
|
120
|
+
# ──────────────────────────────────────────────────────────────
|
|
121
|
+
# Version Bumping
|
|
122
|
+
# ──────────────────────────────────────────────────────────────
|
|
123
|
+
|
|
124
|
+
.PHONY: bump-major
|
|
125
|
+
bump-major: _ensure_bmk ## Bump major version (X+1).0.0
|
|
126
|
+
$(BMK) bump major $(ARGS)
|
|
127
|
+
|
|
128
|
+
.PHONY: bump-minor
|
|
129
|
+
bump-minor: _ensure_bmk ## Bump minor version X.(Y+1).0
|
|
130
|
+
$(BMK) bump minor $(ARGS)
|
|
131
|
+
|
|
132
|
+
.PHONY: bump-patch
|
|
133
|
+
bump-patch: _ensure_bmk ## Bump patch version X.Y.(Z+1)
|
|
134
|
+
$(BMK) bump patch $(ARGS)
|
|
135
|
+
|
|
136
|
+
.PHONY: bump
|
|
137
|
+
bump: bump-patch ## Bump patch version (default for bump)
|
|
138
|
+
|
|
139
|
+
# ──────────────────────────────────────────────────────────────
|
|
140
|
+
# Git Operations
|
|
141
|
+
# ──────────────────────────────────────────────────────────────
|
|
142
|
+
|
|
143
|
+
.PHONY: commit c
|
|
144
|
+
commit: _ensure_bmk ## Create a git commit with timestamped message [alias: c]
|
|
145
|
+
$(BMK) commit $(ARGS)
|
|
146
|
+
c: _ensure_bmk
|
|
147
|
+
$(BMK) commit $(ARGS)
|
|
148
|
+
|
|
149
|
+
.PHONY: push psh p
|
|
150
|
+
push: _ensure_bmk ## Run tests, commit, and push to remote [aliases: psh, p]
|
|
151
|
+
$(BMK) push $(ARGS)
|
|
152
|
+
psh p: _ensure_bmk
|
|
153
|
+
$(BMK) push $(ARGS)
|
|
154
|
+
|
|
155
|
+
.PHONY: release rel r
|
|
156
|
+
release: _ensure_bmk ## Create a versioned release (tag + GitHub release) [aliases: rel, r]
|
|
157
|
+
$(BMK) release $(ARGS)
|
|
158
|
+
rel r: _ensure_bmk
|
|
159
|
+
$(BMK) release $(ARGS)
|
|
160
|
+
|
|
161
|
+
# ──────────────────────────────────────────────────────────────
|
|
162
|
+
# Dependencies
|
|
163
|
+
# ──────────────────────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
.PHONY: dependencies deps d
|
|
166
|
+
dependencies: _ensure_bmk ## Check and list project dependencies [aliases: deps, d]
|
|
167
|
+
$(BMK) dependencies $(ARGS)
|
|
168
|
+
deps d: _ensure_bmk
|
|
169
|
+
$(BMK) dependencies $(ARGS)
|
|
170
|
+
|
|
171
|
+
.PHONY: dependencies-update
|
|
172
|
+
dependencies-update: _ensure_bmk ## Update dependencies to latest versions
|
|
173
|
+
$(BMK) dependencies update $(ARGS)
|
|
174
|
+
|
|
175
|
+
# ──────────────────────────────────────────────────────────────
|
|
176
|
+
# Configuration
|
|
177
|
+
# ──────────────────────────────────────────────────────────────
|
|
178
|
+
|
|
179
|
+
.PHONY: config
|
|
180
|
+
config: _ensure_bmk ## Show current merged configuration
|
|
181
|
+
$(BMK) config $(ARGS)
|
|
182
|
+
|
|
183
|
+
.PHONY: config-deploy
|
|
184
|
+
config-deploy: _ensure_bmk ## Deploy configuration to system/user directories
|
|
185
|
+
$(BMK) config-deploy $(ARGS)
|
|
186
|
+
|
|
187
|
+
.PHONY: config-generate-examples
|
|
188
|
+
config-generate-examples: _ensure_bmk ## Generate example configuration files
|
|
189
|
+
$(BMK) config-generate-examples $(ARGS)
|
|
190
|
+
|
|
191
|
+
# ──────────────────────────────────────────────────────────────
|
|
192
|
+
# Email
|
|
193
|
+
# ──────────────────────────────────────────────────────────────
|
|
194
|
+
|
|
195
|
+
.PHONY: send-email
|
|
196
|
+
send-email: _ensure_bmk ## Send an email via configured SMTP
|
|
197
|
+
$(BMK) send-email $(ARGS)
|
|
198
|
+
|
|
199
|
+
.PHONY: send-notification
|
|
200
|
+
send-notification: _ensure_bmk ## Send a plain-text notification email
|
|
201
|
+
$(BMK) send-notification $(ARGS)
|
|
202
|
+
|
|
203
|
+
# ──────────────────────────────────────────────────────────────
|
|
204
|
+
# Custom Commands
|
|
205
|
+
# ──────────────────────────────────────────────────────────────
|
|
206
|
+
|
|
207
|
+
.PHONY: custom
|
|
208
|
+
custom: _ensure_bmk ## Run a custom command (make custom <name> [args...])
|
|
209
|
+
$(BMK) custom $(ARGS)
|
|
210
|
+
|
|
211
|
+
# ──────────────────────────────────────────────────────────────
|
|
212
|
+
# Info & Demos
|
|
213
|
+
# ──────────────────────────────────────────────────────────────
|
|
214
|
+
|
|
215
|
+
.PHONY: info
|
|
216
|
+
info: _ensure_bmk ## Print resolved package metadata
|
|
217
|
+
$(BMK) info $(ARGS)
|
|
218
|
+
|
|
219
|
+
.PHONY: logdemo
|
|
220
|
+
logdemo: _ensure_bmk ## Run logging demonstration
|
|
221
|
+
$(BMK) logdemo $(ARGS)
|
|
222
|
+
|
|
223
|
+
.PHONY: version-current
|
|
224
|
+
version-current: _ensure_bmk ## Print current version
|
|
225
|
+
$(BMK) --version
|
|
226
|
+
|
|
227
|
+
# ──────────────────────────────────────────────────────────────
|
|
228
|
+
# Development
|
|
229
|
+
# ──────────────────────────────────────────────────────────────
|
|
230
|
+
|
|
231
|
+
.PHONY: dev
|
|
232
|
+
dev: ## Install package with dev extras (editable)
|
|
233
|
+
uv pip install -e ".[dev]"
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
.PHONY: install
|
|
237
|
+
install: ## Editable install (no dev extras)
|
|
238
|
+
uv pip install -e .
|
|
239
|
+
|
|
240
|
+
# ──────────────────────────────────────────────────────────────
|
|
241
|
+
# Help
|
|
242
|
+
# ──────────────────────────────────────────────────────────────
|
|
243
|
+
|
|
244
|
+
.PHONY: help
|
|
245
|
+
help: ## Show this help
|
|
246
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
|
247
|
+
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-26s\033[0m %s\n", $$1, $$2}' | \
|
|
248
|
+
sort
|
|
249
|
+
|
|
250
|
+
# ──────────────────────────────────────────────────────────────
|
|
251
|
+
# No-op overrides for trailing argument words (MUST be last)
|
|
252
|
+
# ──────────────────────────────────────────────────────────────
|
|
253
|
+
# Placed after all real target definitions so the no-op recipes
|
|
254
|
+
# override them. This prevents "make push codecov fix" from
|
|
255
|
+
# executing the real codecov target — "codecov" is an argument
|
|
256
|
+
# to push, not a separate command.
|
|
257
|
+
ifneq (,$(_EXTRA))
|
|
258
|
+
$(_EXTRA):
|
|
259
|
+
@:
|
|
260
|
+
endif
|
|
@@ -1,3 +1,56 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: lib_shopware6_api_base
|
|
3
|
+
Version: 3.1.2
|
|
4
|
+
Summary: python3 base API client for shopware6
|
|
5
|
+
Project-URL: Homepage, https://github.com/bitranox/lib_shopware6_api_base
|
|
6
|
+
Project-URL: Documentation, https://github.com/bitranox/lib_shopware6_api_base/blob/master/README.md
|
|
7
|
+
Project-URL: Repository, https://github.com/bitranox/lib_shopware6_api_base.git
|
|
8
|
+
Project-URL: Changelog, https://github.com/bitranox/lib_shopware6_api_base/blob/master/CHANGELOG.md
|
|
9
|
+
Author-email: bitranox <bitranox@gmail.com>
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: api,shopware
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Requires-Dist: httpx2>=2.3.0
|
|
26
|
+
Requires-Dist: lib-cli-exit-tools>=2.3.1
|
|
27
|
+
Requires-Dist: orjson
|
|
28
|
+
Requires-Dist: pydantic-settings>=2.14.1
|
|
29
|
+
Requires-Dist: pydantic>=2.13.4
|
|
30
|
+
Requires-Dist: rich-click
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: bandit>=1.9.4; extra == 'dev'
|
|
33
|
+
Requires-Dist: build>=1.5.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: codecov-cli>=11.2.8; extra == 'dev'
|
|
35
|
+
Requires-Dist: httpx2>=2.3.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: hypothesis>=6.155.2; extra == 'dev'
|
|
37
|
+
Requires-Dist: import-linter>=2.11; extra == 'dev'
|
|
38
|
+
Requires-Dist: jaraco-context>=6.1.2; extra == 'dev'
|
|
39
|
+
Requires-Dist: pip-audit>=2.10.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: pynacl>=1.6.2; extra == 'dev'
|
|
41
|
+
Requires-Dist: pyright[nodejs]>=1.1.410; extra == 'dev'
|
|
42
|
+
Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
|
|
43
|
+
Requires-Dist: pytest>=9.0.3; extra == 'dev'
|
|
44
|
+
Requires-Dist: python-multipart>=0.0.32; extra == 'dev'
|
|
45
|
+
Requires-Dist: rtoml>=0.13.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: ruff>=0.15.16; extra == 'dev'
|
|
47
|
+
Requires-Dist: textual>=8.2.7; extra == 'dev'
|
|
48
|
+
Requires-Dist: twine>=6.2.0; extra == 'dev'
|
|
49
|
+
Requires-Dist: urllib3>=2.7.0; extra == 'dev'
|
|
50
|
+
Requires-Dist: virtualenv>=21.4.2; extra == 'dev'
|
|
51
|
+
Requires-Dist: wheel>=0.47.0; extra == 'dev'
|
|
52
|
+
Description-Content-Type: text/markdown
|
|
53
|
+
|
|
1
54
|
# lib_shopware6_api_base
|
|
2
55
|
|
|
3
56
|
<!-- Badges -->
|
|
@@ -58,6 +111,9 @@ This is the base abstraction layer. For higher-level functions, see [lib_shopwar
|
|
|
58
111
|
- [Associations](#associations)
|
|
59
112
|
- [CLI Usage](#cli-usage)
|
|
60
113
|
- [Installation](#installation)
|
|
114
|
+
- [Development](#development)
|
|
115
|
+
- [Running tests](#running-tests)
|
|
116
|
+
- [Integration tests](#integration-tests)
|
|
61
117
|
- [Requirements](#requirements)
|
|
62
118
|
- [Changelog](CHANGELOG.md)
|
|
63
119
|
- [License](#license)
|
|
@@ -102,17 +158,17 @@ SHOPWARE_STORE_API_SW_ACCESS_KEY="SWSCXXXXXXXXXXXXXXXXXX"
|
|
|
102
158
|
|
|
103
159
|
All environment variables use the `SHOPWARE_` prefix to avoid collision with system variables.
|
|
104
160
|
|
|
105
|
-
| Variable | Description
|
|
106
|
-
|
|
107
|
-
| `SHOPWARE_ADMIN_API_URL` | Admin API endpoint
|
|
108
|
-
| `SHOPWARE_STOREFRONT_API_URL` | Storefront API endpoint
|
|
109
|
-
| `SHOPWARE_INSECURE_TRANSPORT` | Allow HTTP (dev only)
|
|
110
|
-
| `SHOPWARE_USERNAME` | Admin user email
|
|
111
|
-
| `SHOPWARE_PASSWORD` | Admin user password
|
|
161
|
+
| Variable | Description | Example |
|
|
162
|
+
|----------|---------------------------------------------------------------|---------|
|
|
163
|
+
| `SHOPWARE_ADMIN_API_URL` | Admin API endpoint | `https://shop.example.com/api` |
|
|
164
|
+
| `SHOPWARE_STOREFRONT_API_URL` | Storefront API endpoint | `https://shop.example.com/store-api` |
|
|
165
|
+
| `SHOPWARE_INSECURE_TRANSPORT` | Allow HTTP (dev only) | `0` (production) or `1` (dev) |
|
|
166
|
+
| `SHOPWARE_USERNAME` | Admin user email | `admin@example.com` |
|
|
167
|
+
| `SHOPWARE_PASSWORD` | Admin user password | `secret` |
|
|
112
168
|
| `SHOPWARE_CLIENT_ID` | Integration Access ID | `SWIA...` |
|
|
113
|
-
| `SHOPWARE_CLIENT_SECRET` | Integration Secret
|
|
114
|
-
| `SHOPWARE_GRANT_TYPE` | Auth method
|
|
115
|
-
| `SHOPWARE_STORE_API_SW_ACCESS_KEY` | Storefront access key
|
|
169
|
+
| `SHOPWARE_CLIENT_SECRET` | Integration Secret | `...` |
|
|
170
|
+
| `SHOPWARE_GRANT_TYPE` | Auth method | `USER_CREDENTIALS` or `RESOURCE_OWNER` |
|
|
171
|
+
| `SHOPWARE_STORE_API_SW_ACCESS_KEY` | Storefront access key | `SWSC...` |
|
|
116
172
|
|
|
117
173
|
### Loading Configuration
|
|
118
174
|
|
|
@@ -434,6 +490,52 @@ pip install lib_shopware6_api_base
|
|
|
434
490
|
|
|
435
491
|
---
|
|
436
492
|
|
|
493
|
+
## Development
|
|
494
|
+
|
|
495
|
+
Project automation runs through a `Makefile` that delegates to [`bmk`](https://pypi.org/project/bmk/)
|
|
496
|
+
(installed automatically as a persistent `uv` tool on first use). Run `make help` to list all targets.
|
|
497
|
+
|
|
498
|
+
### Running tests
|
|
499
|
+
|
|
500
|
+
```bash
|
|
501
|
+
make test # lint (ruff), type-check (pyright), import-linter,
|
|
502
|
+
# bandit, pip-audit, and the unit test suite with coverage
|
|
503
|
+
make testintegration # integration tests only (see prerequisites below)
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
`make test` runs the full quality gate but **excludes** the integration tests
|
|
507
|
+
(`pytest -m "not integration"`). `make testintegration` runs **only** the
|
|
508
|
+
integration suite (`pytest -m integration`).
|
|
509
|
+
|
|
510
|
+
### Integration tests
|
|
511
|
+
|
|
512
|
+
The integration tests exercise the Admin and Storefront clients against a real
|
|
513
|
+
Shopware instance using the [dockware](https://developer.shopware.com/docs/guides/installation/dockware)
|
|
514
|
+
container. The test harness starts and stops the container automatically — no
|
|
515
|
+
manual setup or credentials are required (`tests/docker.env` ships the dockware
|
|
516
|
+
defaults).
|
|
517
|
+
|
|
518
|
+
Prerequisites:
|
|
519
|
+
|
|
520
|
+
- **Docker** installed and running, with a **Linux** container engine
|
|
521
|
+
(`docker info --format '{{.OSType}}'` → `linux`). If Docker is unavailable or
|
|
522
|
+
not Linux, the integration tests are **skipped** (not failed).
|
|
523
|
+
- **Port 80** free — the container is published on `-p 80:80`.
|
|
524
|
+
- First run pulls `dockware/dev:latest` (a few GB), so it takes a while.
|
|
525
|
+
|
|
526
|
+
Tip: for fast repeated runs, start the container once and leave it up — the
|
|
527
|
+
harness reuses a running container (and only tears down one it started itself):
|
|
528
|
+
|
|
529
|
+
```bash
|
|
530
|
+
docker run -d --rm -p 80:80 --name dockware dockware/dev:latest
|
|
531
|
+
make testintegration # reuses the running container, finishes in seconds
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
CI runs the unit and integration suites as separate jobs across Linux, macOS,
|
|
535
|
+
and Windows for Python 3.10–3.14.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
437
539
|
## Requirements
|
|
438
540
|
|
|
439
541
|
Automatically installed dependencies:
|
|
@@ -1,56 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: lib_shopware6_api_base
|
|
3
|
-
Version: 3.1.0
|
|
4
|
-
Summary: python3 base API client for shopware6
|
|
5
|
-
Project-URL: Homepage, https://github.com/bitranox/lib_shopware6_api_base
|
|
6
|
-
Project-URL: Documentation, https://github.com/bitranox/lib_shopware6_api_base/blob/master/README.md
|
|
7
|
-
Project-URL: Repository, https://github.com/bitranox/lib_shopware6_api_base.git
|
|
8
|
-
Project-URL: Changelog, https://github.com/bitranox/lib_shopware6_api_base/blob/master/CHANGELOG.md
|
|
9
|
-
Author-email: bitranox <bitranox@gmail.com>
|
|
10
|
-
License: MIT
|
|
11
|
-
License-File: LICENSE
|
|
12
|
-
Keywords: api,shopware
|
|
13
|
-
Classifier: Environment :: Console
|
|
14
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
-
Classifier: Operating System :: OS Independent
|
|
16
|
-
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
23
|
-
Classifier: Typing :: Typed
|
|
24
|
-
Requires-Python: >=3.10
|
|
25
|
-
Requires-Dist: httpx2>=2.2.0
|
|
26
|
-
Requires-Dist: lib-cli-exit-tools>=2.2.4
|
|
27
|
-
Requires-Dist: orjson
|
|
28
|
-
Requires-Dist: pydantic-settings>=2.12.0
|
|
29
|
-
Requires-Dist: pydantic>=2.12.5
|
|
30
|
-
Requires-Dist: rich-click
|
|
31
|
-
Provides-Extra: dev
|
|
32
|
-
Requires-Dist: bandit>=1.9.3; extra == 'dev'
|
|
33
|
-
Requires-Dist: build>=1.4.0; extra == 'dev'
|
|
34
|
-
Requires-Dist: codecov-cli>=11.2.6; extra == 'dev'
|
|
35
|
-
Requires-Dist: httpx2>=2.2.0; extra == 'dev'
|
|
36
|
-
Requires-Dist: hypothesis>=6.151.4; extra == 'dev'
|
|
37
|
-
Requires-Dist: import-linter>=2.9; extra == 'dev'
|
|
38
|
-
Requires-Dist: jaraco-context>=6.1.0; extra == 'dev'
|
|
39
|
-
Requires-Dist: pip-audit>=2.10.0; extra == 'dev'
|
|
40
|
-
Requires-Dist: pynacl>=1.6.2; extra == 'dev'
|
|
41
|
-
Requires-Dist: pyright[nodejs]>=1.1.408; extra == 'dev'
|
|
42
|
-
Requires-Dist: pytest-cov>=7.0.0; extra == 'dev'
|
|
43
|
-
Requires-Dist: pytest>=9.0.2; extra == 'dev'
|
|
44
|
-
Requires-Dist: python-multipart>=0.0.27; extra == 'dev'
|
|
45
|
-
Requires-Dist: rtoml>=0.13.0; extra == 'dev'
|
|
46
|
-
Requires-Dist: ruff>=0.14.14; extra == 'dev'
|
|
47
|
-
Requires-Dist: textual>=7.5.0; extra == 'dev'
|
|
48
|
-
Requires-Dist: twine>=6.2.0; extra == 'dev'
|
|
49
|
-
Requires-Dist: urllib3>=2.6.3; extra == 'dev'
|
|
50
|
-
Requires-Dist: virtualenv>=20.36.1; extra == 'dev'
|
|
51
|
-
Requires-Dist: wheel>=0.46.3; extra == 'dev'
|
|
52
|
-
Description-Content-Type: text/markdown
|
|
53
|
-
|
|
54
1
|
# lib_shopware6_api_base
|
|
55
2
|
|
|
56
3
|
<!-- Badges -->
|
|
@@ -111,6 +58,9 @@ This is the base abstraction layer. For higher-level functions, see [lib_shopwar
|
|
|
111
58
|
- [Associations](#associations)
|
|
112
59
|
- [CLI Usage](#cli-usage)
|
|
113
60
|
- [Installation](#installation)
|
|
61
|
+
- [Development](#development)
|
|
62
|
+
- [Running tests](#running-tests)
|
|
63
|
+
- [Integration tests](#integration-tests)
|
|
114
64
|
- [Requirements](#requirements)
|
|
115
65
|
- [Changelog](CHANGELOG.md)
|
|
116
66
|
- [License](#license)
|
|
@@ -155,17 +105,17 @@ SHOPWARE_STORE_API_SW_ACCESS_KEY="SWSCXXXXXXXXXXXXXXXXXX"
|
|
|
155
105
|
|
|
156
106
|
All environment variables use the `SHOPWARE_` prefix to avoid collision with system variables.
|
|
157
107
|
|
|
158
|
-
| Variable | Description
|
|
159
|
-
|
|
160
|
-
| `SHOPWARE_ADMIN_API_URL` | Admin API endpoint
|
|
161
|
-
| `SHOPWARE_STOREFRONT_API_URL` | Storefront API endpoint
|
|
162
|
-
| `SHOPWARE_INSECURE_TRANSPORT` | Allow HTTP (dev only)
|
|
163
|
-
| `SHOPWARE_USERNAME` | Admin user email
|
|
164
|
-
| `SHOPWARE_PASSWORD` | Admin user password
|
|
108
|
+
| Variable | Description | Example |
|
|
109
|
+
|----------|---------------------------------------------------------------|---------|
|
|
110
|
+
| `SHOPWARE_ADMIN_API_URL` | Admin API endpoint | `https://shop.example.com/api` |
|
|
111
|
+
| `SHOPWARE_STOREFRONT_API_URL` | Storefront API endpoint | `https://shop.example.com/store-api` |
|
|
112
|
+
| `SHOPWARE_INSECURE_TRANSPORT` | Allow HTTP (dev only) | `0` (production) or `1` (dev) |
|
|
113
|
+
| `SHOPWARE_USERNAME` | Admin user email | `admin@example.com` |
|
|
114
|
+
| `SHOPWARE_PASSWORD` | Admin user password | `secret` |
|
|
165
115
|
| `SHOPWARE_CLIENT_ID` | Integration Access ID | `SWIA...` |
|
|
166
|
-
| `SHOPWARE_CLIENT_SECRET` | Integration Secret
|
|
167
|
-
| `SHOPWARE_GRANT_TYPE` | Auth method
|
|
168
|
-
| `SHOPWARE_STORE_API_SW_ACCESS_KEY` | Storefront access key
|
|
116
|
+
| `SHOPWARE_CLIENT_SECRET` | Integration Secret | `...` |
|
|
117
|
+
| `SHOPWARE_GRANT_TYPE` | Auth method | `USER_CREDENTIALS` or `RESOURCE_OWNER` |
|
|
118
|
+
| `SHOPWARE_STORE_API_SW_ACCESS_KEY` | Storefront access key | `SWSC...` |
|
|
169
119
|
|
|
170
120
|
### Loading Configuration
|
|
171
121
|
|
|
@@ -487,6 +437,52 @@ pip install lib_shopware6_api_base
|
|
|
487
437
|
|
|
488
438
|
---
|
|
489
439
|
|
|
440
|
+
## Development
|
|
441
|
+
|
|
442
|
+
Project automation runs through a `Makefile` that delegates to [`bmk`](https://pypi.org/project/bmk/)
|
|
443
|
+
(installed automatically as a persistent `uv` tool on first use). Run `make help` to list all targets.
|
|
444
|
+
|
|
445
|
+
### Running tests
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
make test # lint (ruff), type-check (pyright), import-linter,
|
|
449
|
+
# bandit, pip-audit, and the unit test suite with coverage
|
|
450
|
+
make testintegration # integration tests only (see prerequisites below)
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
`make test` runs the full quality gate but **excludes** the integration tests
|
|
454
|
+
(`pytest -m "not integration"`). `make testintegration` runs **only** the
|
|
455
|
+
integration suite (`pytest -m integration`).
|
|
456
|
+
|
|
457
|
+
### Integration tests
|
|
458
|
+
|
|
459
|
+
The integration tests exercise the Admin and Storefront clients against a real
|
|
460
|
+
Shopware instance using the [dockware](https://developer.shopware.com/docs/guides/installation/dockware)
|
|
461
|
+
container. The test harness starts and stops the container automatically — no
|
|
462
|
+
manual setup or credentials are required (`tests/docker.env` ships the dockware
|
|
463
|
+
defaults).
|
|
464
|
+
|
|
465
|
+
Prerequisites:
|
|
466
|
+
|
|
467
|
+
- **Docker** installed and running, with a **Linux** container engine
|
|
468
|
+
(`docker info --format '{{.OSType}}'` → `linux`). If Docker is unavailable or
|
|
469
|
+
not Linux, the integration tests are **skipped** (not failed).
|
|
470
|
+
- **Port 80** free — the container is published on `-p 80:80`.
|
|
471
|
+
- First run pulls `dockware/dev:latest` (a few GB), so it takes a while.
|
|
472
|
+
|
|
473
|
+
Tip: for fast repeated runs, start the container once and leave it up — the
|
|
474
|
+
harness reuses a running container (and only tears down one it started itself):
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
docker run -d --rm -p 80:80 --name dockware dockware/dev:latest
|
|
478
|
+
make testintegration # reuses the running container, finishes in seconds
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
CI runs the unit and integration suites as separate jobs across Linux, macOS,
|
|
482
|
+
and Windows for Python 3.10–3.14.
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
490
486
|
## Requirements
|
|
491
487
|
|
|
492
488
|
Automatically installed dependencies:
|