qanary 0.10.0__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.
Files changed (73) hide show
  1. qanary-0.10.0/.gitattributes +34 -0
  2. qanary-0.10.0/.gitignore +89 -0
  3. qanary-0.10.0/.gitlab-ci.yml +209 -0
  4. qanary-0.10.0/.pre-commit-config.yaml +29 -0
  5. qanary-0.10.0/CHANGELOG.md +145 -0
  6. qanary-0.10.0/LICENSE +661 -0
  7. qanary-0.10.0/PKG-INFO +160 -0
  8. qanary-0.10.0/README.md +116 -0
  9. qanary-0.10.0/docs/source/_static/assets/qanary-icon.png +0 -0
  10. qanary-0.10.0/docs/source/_static/assets/qanary-logo.png +0 -0
  11. qanary-0.10.0/docs/source/_static/custom.css +54 -0
  12. qanary-0.10.0/docs/source/api/buffered/buffered_index.rst +76 -0
  13. qanary-0.10.0/docs/source/api/dataset.rst +8 -0
  14. qanary-0.10.0/docs/source/api/index.rst +18 -0
  15. qanary-0.10.0/docs/source/api/measure.rst +8 -0
  16. qanary-0.10.0/docs/source/api/parameters.rst +11 -0
  17. qanary-0.10.0/docs/source/api/sweep.rst +9 -0
  18. qanary-0.10.0/docs/source/changelog.md +6 -0
  19. qanary-0.10.0/docs/source/conf.py +142 -0
  20. qanary-0.10.0/docs/source/development.md +186 -0
  21. qanary-0.10.0/docs/source/index.md +51 -0
  22. qanary-0.10.0/docs/source/installation.md +54 -0
  23. qanary-0.10.0/docs/source/tutorials/buffered_basel_dac.md +41 -0
  24. qanary-0.10.0/docs/source/tutorials/buffered_basel_mfli.md +46 -0
  25. qanary-0.10.0/docs/source/tutorials/buffered_basel_uhfli.md +48 -0
  26. qanary-0.10.0/docs/source/tutorials/buffered_qdac_dmm.md +51 -0
  27. qanary-0.10.0/docs/source/tutorials/buffered_qdac_mfli.md +49 -0
  28. qanary-0.10.0/docs/source/tutorials/buffered_time_traces.md +57 -0
  29. qanary-0.10.0/docs/source/tutorials/buffered_transistor_mfli.md +37 -0
  30. qanary-0.10.0/docs/source/tutorials/buffered_transistor_uhfli.md +38 -0
  31. qanary-0.10.0/docs/source/tutorials/buffered_uhfli_sweeper.md +41 -0
  32. qanary-0.10.0/docs/source/tutorials/multi_channel_parameters.md +33 -0
  33. qanary-0.10.0/docs/source/tutorials/tutorials_index.md +43 -0
  34. qanary-0.10.0/docs/source/tutorials/virtual_gates.md +41 -0
  35. qanary-0.10.0/examples/basel_dac_sweep.py +197 -0
  36. qanary-0.10.0/examples/buffered_basel_transistor_test_mfli.py +208 -0
  37. qanary-0.10.0/examples/buffered_basel_transistor_test_uhfli.py +193 -0
  38. qanary-0.10.0/examples/buffered_basel_with_mfli.py +179 -0
  39. qanary-0.10.0/examples/buffered_basel_with_uhfli.py +180 -0
  40. qanary-0.10.0/examples/buffered_qdac_with_keysight_dmm.py +68 -0
  41. qanary-0.10.0/examples/buffered_uhfli_sweeps.py +122 -0
  42. qanary-0.10.0/examples/multi_channel_parameter_example.py +50 -0
  43. qanary-0.10.0/examples/qdac_dmm_mfli_example.py +74 -0
  44. qanary-0.10.0/examples/time_trace_lockin.py +223 -0
  45. qanary-0.10.0/examples/virtual_gate_parameter_example.py +139 -0
  46. qanary-0.10.0/gl-sast-report.json +3143 -0
  47. qanary-0.10.0/gl-secret-detection-report.json +50 -0
  48. qanary-0.10.0/pyproject.toml +156 -0
  49. qanary-0.10.0/release.env +2 -0
  50. qanary-0.10.0/src/qanary/__init__.py +76 -0
  51. qanary-0.10.0/src/qanary/buffered/__init__.py +0 -0
  52. qanary-0.10.0/src/qanary/buffered/sweep.py +503 -0
  53. qanary-0.10.0/src/qanary/dataset.py +176 -0
  54. qanary-0.10.0/src/qanary/logger.py +82 -0
  55. qanary-0.10.0/src/qanary/measure.py +1253 -0
  56. qanary-0.10.0/src/qanary/parameters.py +316 -0
  57. qanary-0.10.0/src/qanary/sweep.py +900 -0
  58. qanary-0.10.0/tests/conftest.py +268 -0
  59. qanary-0.10.0/tests/test_buffered_progress.py +374 -0
  60. qanary-0.10.0/tests/test_buffered_tree.py +763 -0
  61. qanary-0.10.0/tests/test_checkpoint_performance.py +250 -0
  62. qanary-0.10.0/tests/test_dataset.py +245 -0
  63. qanary-0.10.0/tests/test_disk_checkpoint.py +167 -0
  64. qanary-0.10.0/tests/test_examples.py +79 -0
  65. qanary-0.10.0/tests/test_live_registry.py +104 -0
  66. qanary-0.10.0/tests/test_live_store_location.py +293 -0
  67. qanary-0.10.0/tests/test_logger.py +127 -0
  68. qanary-0.10.0/tests/test_measure.py +1458 -0
  69. qanary-0.10.0/tests/test_parameter_arithmetic.py +112 -0
  70. qanary-0.10.0/tests/test_parameters.py +331 -0
  71. qanary-0.10.0/tests/test_stepper.py +723 -0
  72. qanary-0.10.0/tests/test_sweep.py +403 -0
  73. qanary-0.10.0/uv.lock +3164 -0
@@ -0,0 +1,34 @@
1
+ # Line-ending normalisation.
2
+ #
3
+ # Text files are stored LF in the repository and checked out LF everywhere,
4
+ # including Windows. Without this the working tree depends on each clone's
5
+ # core.autocrlf setting, so the same file differs between machines and a
6
+ # formatter that enforces LF fights the checkout on every commit.
7
+ #
8
+ # Applying this renormalises files whose stored form is currently CRLF. Run
9
+ # `git add --renormalize .` once, in its own commit.
10
+ * text=auto eol=lf
11
+
12
+ # cmd.exe requires CRLF in batch files.
13
+ *.bat text eol=crlf
14
+ *.cmd text eol=crlf
15
+
16
+ # Shell scripts must stay LF or they fail on Linux and macOS with ^M errors.
17
+ *.sh text eol=lf
18
+
19
+ # Binary assets: never convert, never diff as text.
20
+ *.png binary
21
+ *.jpg binary
22
+ *.jpeg binary
23
+ *.gif binary
24
+ *.ico binary
25
+ *.webp binary
26
+ *.pdf binary
27
+ *.zip binary
28
+ *.woff binary
29
+ *.woff2 binary
30
+ *.ttf binary
31
+ *.otf binary
32
+
33
+ # Collapse the lockfile in GitLab merge request diffs; it is generated output.
34
+ uv.lock -diff linguist-generated=true gitlab-generated=true
@@ -0,0 +1,89 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+
4
+ # Distribution / packaging
5
+ .Python
6
+ build/
7
+ develop-eggs/
8
+ dist/
9
+ *.egg-info/
10
+ .installed.cfg
11
+ *.egg
12
+ MANIFEST
13
+
14
+ # Installer logs
15
+ pip-log.txt
16
+ pip-delete-this-directory.txt
17
+
18
+ # Unit test / coverage reports
19
+ .tox/
20
+ .nox/
21
+ .coverage
22
+ .coverage.*
23
+ .cache
24
+ nosetests.xml
25
+ coverage.xml
26
+ *.cover
27
+ *.py,cover
28
+ .pytest_cache/
29
+
30
+ # Sphinx documentation
31
+ docs/_build/
32
+
33
+ # PyBuilder
34
+ .pybuilder/
35
+ target/
36
+
37
+ # Jupyter Notebook
38
+ .ipynb_checkpoints
39
+
40
+ # IPython
41
+ profile_default/
42
+ ipython_config.py
43
+
44
+ # Environments
45
+ bf/
46
+ .env
47
+ .venv
48
+ .nenv
49
+ env/
50
+ venv/
51
+ ENV/
52
+ env.bak/
53
+ venv.bak/
54
+ *_env/
55
+
56
+ # Spyder project settings
57
+ .spyderproject
58
+ .spyproject
59
+
60
+ # mkdocs documentation
61
+ /site
62
+
63
+ # mypy
64
+ .mypy_cache/
65
+ .dmypy.json
66
+ dmypy.json
67
+
68
+ config.yaml
69
+ # PyCharm
70
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
71
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
72
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
73
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
74
+ #.idea/
75
+
76
+ .DS_Store
77
+ test_db/
78
+ D:
79
+
80
+ # Variants of example.py
81
+ example.*.py
82
+
83
+ # Docs build and test artefacts
84
+ docs/build/
85
+ docs/build/gettext/
86
+ docs/public/
87
+ public/
88
+ .uv-cache/
89
+ report.xml
@@ -0,0 +1,209 @@
1
+ image: "python:3.13"
2
+
3
+ # Branch model: feature branches -> preview -> main. Everything is linted and
4
+ # tested on every branch, preview additionally proves the package builds, and
5
+ # only main creates a release.
6
+
7
+ stages:
8
+ - format
9
+ - test
10
+ - docs
11
+ - release
12
+
13
+ include:
14
+ - template: Security/SAST.gitlab-ci.yml
15
+ - template: Security/Secret-Detection.gitlab-ci.yml
16
+
17
+ variables:
18
+ SECRET_DETECTION_ENABLED: "true"
19
+ UV_CACHE_DIR: "$CI_PROJECT_DIR/.uv-cache"
20
+ # Portable git for the Windows test job. Pinned rather than "latest" so a
21
+ # moved URL fails the download loudly instead of drifting.
22
+ MINGIT_URL: "https://github.com/git-for-windows/git/releases/download/v2.55.0.windows.5/MinGit-2.55.0.5-64-bit.zip"
23
+
24
+ sast:
25
+ stage: test
26
+
27
+ secret_detection:
28
+ stage: test
29
+
30
+ lint:
31
+ stage: format
32
+ before_script:
33
+ - curl -LsSf https://astral.sh/uv/install.sh | sh
34
+ - source $HOME/.local/bin/env
35
+ # Keep this exact version aligned with pyproject.toml and pre-commit.
36
+ - uv tool install ruff@0.16.6
37
+ script:
38
+ - ruff check .
39
+ - ruff format --check .
40
+
41
+ pytest:
42
+ stage: test
43
+ # Python 3.13 is the supported runtime for this release.
44
+ parallel:
45
+ matrix:
46
+ - PYTHON_VERSION: ["3.13"]
47
+ image: "python:${PYTHON_VERSION}"
48
+ before_script:
49
+ - curl -LsSf https://astral.sh/uv/install.sh | sh
50
+ - source $HOME/.local/bin/env
51
+ script:
52
+ - uv sync --python "$PYTHON_VERSION" --extra test
53
+ - uv run --python "$PYTHON_VERSION" pytest --cov --cov-report=term --cov-report=xml --junitxml=report.xml
54
+ coverage: '/^TOTAL.*\s+(\d+%)$/'
55
+ artifacts:
56
+ when: always
57
+ reports:
58
+ junit: report.xml
59
+ coverage_report:
60
+ coverage_format: cobertura
61
+ path: coverage.xml
62
+ cache:
63
+ key: uv-$CI_JOB_NAME-$PYTHON_VERSION
64
+ paths:
65
+ - .uv-cache
66
+
67
+ # Windows gets a full run because Zarr stores and file locking behave
68
+ # differently there. Coverage is reported by the Linux jobs only.
69
+ pytest-windows:
70
+ stage: test
71
+ tags:
72
+ - windows
73
+ variables:
74
+ PYTHON_VERSION: "3.13"
75
+ before_script:
76
+ # The python:3.13 Windows image ships no git -- the runner clones with
77
+ # its helper image instead. The test suite needs a real one:
78
+ # tests/test_measure.py imports GitPython at module scope and builds
79
+ # throwaway repositories to exercise the hash-push path. MinGit is the
80
+ # portable Git for Windows build: a zip, no installer, no admin rights.
81
+ - $ProgressPreference = "SilentlyContinue"
82
+ - Invoke-WebRequest -Uri "$env:MINGIT_URL" -OutFile "$env:TEMP\mingit.zip"
83
+ - Expand-Archive -Path "$env:TEMP\mingit.zip" -DestinationPath "C:\mingit" -Force
84
+ - $env:Path = "C:\mingit\cmd;$env:Path"
85
+ - git --version
86
+ - powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
87
+ - $env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
88
+ script:
89
+ - uv sync --python $env:PYTHON_VERSION --extra test
90
+ - uv run --python $env:PYTHON_VERSION pytest --junitxml=report.xml
91
+ artifacts:
92
+ when: always
93
+ reports:
94
+ junit: report.xml
95
+ cache:
96
+ key: uv-$CI_JOB_NAME-$PYTHON_VERSION
97
+ paths:
98
+ - .uv-cache
99
+
100
+ deploy-pages:
101
+ stage: docs
102
+ before_script:
103
+ - curl -LsSf https://astral.sh/uv/install.sh | sh
104
+ - source $HOME/.local/bin/env
105
+ script:
106
+ - uv sync --group docs
107
+ - uv run sphinx-build -M html docs/source docs/public
108
+ pages:
109
+ publish: docs/public/html
110
+ cache:
111
+ key: uv-$CI_JOB_NAME
112
+ paths:
113
+ - .uv-cache
114
+ rules:
115
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
116
+
117
+ semantic_release:
118
+ stage: release
119
+ rules:
120
+ - if: $CI_COMMIT_BRANCH == "main"
121
+ variables:
122
+ # semantic-release needs all commits and tags to calculate the next version.
123
+ GIT_DEPTH: 0
124
+ GIT_STRATEGY: clone
125
+ before_script:
126
+ - curl -LsSf https://astral.sh/uv/install.sh | sh
127
+ - source $HOME/.local/bin/env
128
+ - git config --global user.name "Janitor"
129
+ - git config --global user.email "squad@fz-juelich.de"
130
+ - git remote set-url origin https://squad_janitor:$CI_FORMAT@$CI_SERVER_HOST/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME
131
+ # GitLab checks out a detached HEAD, while semantic-release needs a branch.
132
+ - git fetch origin $CI_COMMIT_BRANCH
133
+ - git checkout $CI_COMMIT_BRANCH
134
+ - git reset --hard origin/$CI_COMMIT_BRANCH
135
+ - uv tool install python-semantic-release
136
+ script:
137
+ - |
138
+ RELEASE_TAG="$(semantic-release version --print-tag)"
139
+ LAST_TAG="$(semantic-release version --print-last-released-tag)"
140
+ if [ "$RELEASE_TAG" = "$LAST_TAG" ]; then
141
+ echo "No release-worthy commits; no version will be published."
142
+ echo "RELEASE_CREATED=false" > release.env
143
+ exit 0
144
+ fi
145
+ echo "RELEASE_CREATED=true" > release.env
146
+ echo "RELEASE_TAG=$RELEASE_TAG" >> release.env
147
+ semantic-release version --push --changelog --no-vcs-release
148
+ artifacts:
149
+ paths:
150
+ - dist/
151
+ - CHANGELOG.md
152
+ - release.env
153
+ expire_in: never
154
+ reports:
155
+ dotenv: release.env
156
+
157
+ gitlab_release:
158
+ stage: release
159
+ image: registry.gitlab.com/gitlab-org/cli:latest
160
+ needs:
161
+ - job: semantic_release
162
+ artifacts: true
163
+ rules:
164
+ - if: $CI_COMMIT_BRANCH == "main"
165
+ variables:
166
+ GLAB_ENABLE_CI_AUTOLOGIN: "true"
167
+ script:
168
+ - |
169
+ if [ "$RELEASE_CREATED" != "true" ]; then
170
+ echo "semantic-release did not cut a version; no GitLab Release needed."
171
+ exit 0
172
+ fi
173
+ unset GITLAB_TOKEN GITLAB_ACCESS_TOKEN OAUTH_TOKEN
174
+ glab release create "$RELEASE_TAG" \
175
+ --name "Release $RELEASE_TAG" \
176
+ --notes-file CHANGELOG.md \
177
+ --ref "$RELEASE_TAG"
178
+
179
+ pypi:
180
+ stage: release
181
+ needs:
182
+ - job: semantic_release
183
+ artifacts: true
184
+ rules:
185
+ - if: $CI_COMMIT_BRANCH == "main" && $PYPI_SPANDAN
186
+ before_script:
187
+ - curl -LsSf https://astral.sh/uv/install.sh | sh
188
+ - source $HOME/.local/bin/env
189
+ script:
190
+ - |
191
+ if ! ls dist/*.whl >/dev/null 2>&1; then
192
+ echo "semantic-release produced no distribution -- nothing to publish."
193
+ exit 0
194
+ fi
195
+ - uv publish --token "$PYPI_SPANDAN"
196
+
197
+ build_package:
198
+ stage: release
199
+ rules:
200
+ - if: $CI_COMMIT_BRANCH == "preview"
201
+ before_script:
202
+ - curl -LsSf https://astral.sh/uv/install.sh | sh
203
+ - source $HOME/.local/bin/env
204
+ script:
205
+ - uv build
206
+ artifacts:
207
+ paths:
208
+ - dist/*.tar.gz
209
+ - dist/*.whl
@@ -0,0 +1,29 @@
1
+ # Run `uv sync --extra dev` then `uv run pre-commit install` once per clone.
2
+ #
3
+ # Rules live in pyproject.toml ([tool.ruff]), so these hooks apply exactly the
4
+ # same configuration as the CI `lint` job.
5
+ repos:
6
+ - repo: https://github.com/astral-sh/ruff-pre-commit
7
+ # Keep this exact version aligned with pyproject.toml and .gitlab-ci.yml.
8
+ rev: v0.16.6
9
+ hooks:
10
+ # NOTE: Import sorting is part of `ruff check` via the "I" rules; the `ruff format`
11
+ # does not do it.
12
+ - id: ruff-check
13
+ args: [--fix]
14
+ - id: ruff-format
15
+
16
+ - repo: https://github.com/pre-commit/pre-commit-hooks
17
+ rev: v6.0.0
18
+ hooks:
19
+ - id: check-added-large-files
20
+ # A check to ensure large files, e.g., test measurement data, does not end up in the repository.
21
+ args: [--maxkb=512]
22
+ - id: check-merge-conflict
23
+ - id: check-toml
24
+ - id: check-yaml
25
+ - id: end-of-file-fixer
26
+ - id: trailing-whitespace
27
+ # Two trailing spaces are a hard line break in Markdown; stripping them
28
+ # silently reflows the README and the docs pages.
29
+ args: [--markdown-linebreak-ext=md]
@@ -0,0 +1,145 @@
1
+ ## Qanary Changelog
2
+
3
+ <!-- version list -->
4
+
5
+ ## v0.10.0 (2026-09-06)
6
+
7
+
8
+ ## v0.9.0 (2026-09-06)
9
+
10
+ ### Bug Fixes
11
+
12
+ - Adapt to qcodes 0.59
13
+ ([`264ea9a`](https://gitlab.com/squad-lab/qcutils/-/commit/264ea9a07f8f800fb12c72b4297802bbcb2c5642))
14
+
15
+ - Continue sweeps through transient Zarr errors
16
+ ([`6cef1f6`](https://gitlab.com/squad-lab/qcutils/-/commit/6cef1f63767dde077d3a2674ce51405e5b23855b))
17
+
18
+ - Fixed buffered sweep progress tracking and integration tests
19
+ ([`ba85146`](https://gitlab.com/squad-lab/qcutils/-/commit/ba851460b117179da6e0b825a9d48a80274f9ffb))
20
+
21
+ - Import GitPython lazily so a git binary is not required
22
+ ([`6491b34`](https://gitlab.com/squad-lab/qcutils/-/commit/6491b345e98fb4f4c6be6339e519cedf291e40cc))
23
+
24
+ ### Build System
25
+
26
+ - Require Python 3.13 and depend on qimchi-connect
27
+ ([`817b91d`](https://gitlab.com/squad-lab/qcutils/-/commit/817b91d7eb07b1b63615aa4d591f114f64114528))
28
+
29
+ ### Chores
30
+
31
+ - Store all text files with LF line endings
32
+ ([`d90b6b8`](https://gitlab.com/squad-lab/qcutils/-/commit/d90b6b8ef7fc9de6db49c05f61fa5a332617779f))
33
+
34
+ - **deps**: Depend on qcdrivers and require qcodes 0.59
35
+ ([`867abe5`](https://gitlab.com/squad-lab/qcutils/-/commit/867abe5fe5b56eefdb3be5cba2155d6b2d05b35f))
36
+
37
+ ### Code Style
38
+
39
+ - Format examples with ruff
40
+ ([`88191c7`](https://gitlab.com/squad-lab/qcutils/-/commit/88191c7c9365ac3066c3f2b5b5e82a10613e0cef))
41
+
42
+ - Open multi-line docstrings on their own line
43
+ ([`61b336d`](https://gitlab.com/squad-lab/qcutils/-/commit/61b336d7000d0df500b4814d4f8a504ea0f0e83b))
44
+
45
+ ### Continuous Integration
46
+
47
+ - Add release, lint, coverage, and Pages pipelines
48
+ ([`990b4ce`](https://gitlab.com/squad-lab/qcutils/-/commit/990b4cedbf0d476af571e0902a1b77ecf374e36b))
49
+
50
+ - Install portable git for the Windows test job
51
+ ([`388b717`](https://gitlab.com/squad-lab/qcutils/-/commit/388b7174284b58d94fd1af5204889771e0095459))
52
+
53
+ - Publish to PyPI and drop the git-source workaround
54
+ ([`619701f`](https://gitlab.com/squad-lab/qcutils/-/commit/619701f3bddc9c7b4e70c9f66cd1203e25a4276e))
55
+
56
+ ### Documentation
57
+
58
+ - Add Sphinx documentation and refresh the README
59
+ ([`9c12c7d`](https://gitlab.com/squad-lab/qcutils/-/commit/9c12c7da4146dddbf5ae823c1ff7d4469dd86beb))
60
+
61
+ - Document PyPI installation and point buffered nodes at qcdrivers
62
+ ([`2852542`](https://gitlab.com/squad-lab/qcutils/-/commit/28525420272f47eb7ece67e6f69d70a58b3d59a6))
63
+
64
+ ### Features
65
+
66
+ - Publish live measurements through qimchi-connect
67
+ ([`2d8aaf5`](https://gitlab.com/squad-lab/qcutils/-/commit/2d8aaf5d00f7a57c58e4cc804ffc010eee006fd4))
68
+
69
+ ### Performance Improvements
70
+
71
+ - Persist only changed Zarr keys at disk checkpoints
72
+ ([`81e4d03`](https://gitlab.com/squad-lab/qcutils/-/commit/81e4d03f485e8be781eae7cb161403bb5b838293))
73
+
74
+ - Source buffered instrument nodes from qcdrivers
75
+ ([`0655f4b`](https://gitlab.com/squad-lab/qcutils/-/commit/0655f4b890e33910d801f82bae7ce3a6c85ae972))
76
+
77
+ ### Refactoring
78
+
79
+ - Make internal measurement helpers private
80
+ ([`e1750fb`](https://gitlab.com/squad-lab/qcutils/-/commit/e1750fb6119c7b2c3e5fa82dd5c7066311e55906))
81
+
82
+ - Remove deprecated instrument classes and related code
83
+ ([`2e8e483`](https://gitlab.com/squad-lab/qcutils/-/commit/2e8e483763e7af060155be06620ab382749901b6))
84
+
85
+ ### Testing
86
+
87
+ - Cover measurements, persistence, sweeps, and parameters
88
+ ([`df75038`](https://gitlab.com/squad-lab/qcutils/-/commit/df750388c91215ca32a78a0f16082f66970fd8d9))
89
+
90
+ ### Breaking Changes
91
+
92
+ - Python 3.12 is no longer supported. QCUtils requires 3.13.
93
+
94
+ - Qcutils.buffered.instruments is removed. Import the node classes from
95
+ qcdrivers.buffered.<manufacturer> instead; QCUtils keeps the buffered sweep orchestration.
96
+
97
+ - The modules qcutils.live_server and qcutils.shared.live_db are removed. Live publishing goes
98
+ through the qimchi-connect package, which QCUtils now depends on. Measurement scripts are
99
+ unaffected.
100
+
101
+ - These helpers are renamed with a leading underscore: qcutils.sweep.stepper,
102
+ qcutils.logger.setup_logging, qcutils.measure.{register,get,unregister}_memory_store,
103
+ qcutils.measure.get_live_dataset_info, qcutils.measure.list_live_measurements, and
104
+ qcutils.buffered.sweep.{parse_bufsweep_tree,arm_instruments,fetch_results,
105
+ abort_instruments,fetch_dependents_tree}. The measurement-script API is unchanged.
106
+
107
+
108
+ ### v0.8.0 - 2026-04-02
109
+
110
+ - [Feature] Introduced dataset utilities (`datasets.py`) for common measurement operations
111
+ - [Feature] Reworked dataset storage pipeline:
112
+ - Use Zarr for live/in-progress measurements to avoid file locking issues
113
+ - Finalize and export to NetCDF (`.nc`) at measurement completion
114
+ - Added support for partial `.nc` snapshots during sweeps (experimental; may fail on Windows)
115
+ - [Feature] Added `update_measurement_path` and improved disk finalization logic for better artifact handling and DB consistency
116
+ - [Feature] Increased WebSocket server max message size to 100 MB for large dataset handling
117
+ - [Fix] Fixed measurement tabulation issues
118
+ - [Fix] Fixed circular sweep behavior
119
+ - [Fix] Fixed segmented sweep handling
120
+ - [Fix] Fixed MultiChannelParameter handling and related instrument behavior
121
+ - [Fix] Fixed measurement bugs (general measurement stability improvements)
122
+ - [Fix] Fixed instrument snapshot errors when parameters are `np.ndarray`
123
+ - [Fix] Added JSON sanitization for NumPy types in WebSocket responses
124
+ - [Misc] Moved `live_db` module to shared location for reuse across projects
125
+ - [Misc] Updated dependency versions (including `websockets > 16.0`, zhinst compatibility updates, and numcodecs downgrade)
126
+ - [Misc] Internal refactors and consolidation of dataset-related changes
127
+ - [Misc] Added and reorganized QCoDeS parameter class support
128
+ - [Misc] General cleanup, refactoring, and merge of multiple feature/fix branches (datasets, sweeps, measurement handling)
129
+
130
+ #### Merge Requests included in this release
131
+ - !32 - Log space sweep
132
+ - !31 - Station remove parameter
133
+ - !30 - Measure tabulate fix
134
+ - !29 - Circular sweep fix
135
+ - !28 - MultiChannelParameter fix
136
+ - !27 - Basel safe sweep (multichannelparameter adjustments)
137
+ - !26 - Bux fix measurement
138
+ - !25 - Segmented sweep fix
139
+ - !24 - QCoDeS parameter classes
140
+ - !23 - QCoDeS parameter classes
141
+
142
+ #### Contributors
143
+ - Spandan Anupam
144
+ - Simon Schreibing
145
+ - Jyotirmaya Shivottam