labapi 1.0.3__tar.gz → 1.1.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.
- {labapi-1.0.3 → labapi-1.1.0}/.github/ISSUE_TEMPLATE/bug_report.yml +2 -0
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/docs.yml +2 -2
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/format.yml +0 -1
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/integration_tests.yml +1 -1
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/lint.yml +0 -1
- labapi-1.1.0/.github/workflows/pages.yml +91 -0
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/publish.yml +2 -2
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/python_check.yml +1 -1
- {labapi-1.0.3 → labapi-1.1.0}/.gitignore +2 -2
- labapi-1.1.0/.python-version +1 -0
- labapi-1.1.0/CHANGELOG.md +99 -0
- {labapi-1.0.3/src/labapi.egg-info → labapi-1.1.0}/PKG-INFO +18 -14
- {labapi-1.0.3 → labapi-1.1.0}/README.md +12 -11
- labapi-1.1.0/conftest.py +467 -0
- labapi-1.1.0/docs/source/_templates/version-switcher.html +25 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/conf.py +25 -1
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/examples/csv_table.rst +19 -9
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/examples/folder_download.rst +37 -3
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/examples/index.rst +6 -5
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/examples/json_sync.rst +31 -2
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/contributing.rst +4 -2
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/entries.rst +29 -6
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/paths.rst +41 -2
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/creating_pages.rst +1 -4
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/installation.rst +1 -1
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/uploading_files.rst +17 -6
- labapi-1.1.0/examples/csv_table/README.md +63 -0
- labapi-1.1.0/examples/csv_table/csv_table.py +357 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/csv_table/pyproject.toml +1 -3
- labapi-1.1.0/examples/folder_download/README.md +93 -0
- labapi-1.1.0/examples/folder_download/folder_download.py +349 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/folder_download/pyproject.toml +1 -0
- labapi-1.1.0/examples/json_sync/README.md +82 -0
- labapi-1.1.0/examples/json_sync/json_sync.py +266 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/json_sync/pyproject.toml +0 -3
- {labapi-1.0.3 → labapi-1.1.0}/examples/model_logging/README.md +4 -1
- {labapi-1.0.3 → labapi-1.1.0}/examples/notebook_logging/README.md +4 -2
- {labapi-1.0.3 → labapi-1.1.0}/examples/notebook_logging/notebook_logger.py +13 -14
- {labapi-1.0.3 → labapi-1.1.0}/pyproject.toml +129 -135
- {labapi-1.0.3 → labapi-1.1.0}/pyrightconfig.json +1 -1
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/__init__.py +2 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/client.py +4 -14
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/__init__.py +2 -1
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/attachment.py +226 -191
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/collection.py +21 -8
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/entries/__init__.py +2 -1
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/entries/attachment.py +3 -1
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/entries/base.py +50 -15
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/entries/text.py +3 -1
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/entries/unknown.py +27 -3
- labapi-1.1.0/src/labapi/entry/entries/widget.py +22 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/tree/collection.py +3 -1
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/tree/directory.py +1 -1
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/tree/mixins.py +13 -6
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/tree/notebook.py +19 -3
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/tree/page.py +36 -40
- labapi-1.1.0/src/labapi/tree/search.py +118 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/util/__init__.py +4 -14
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/util/browser.py +131 -125
- labapi-1.1.0/src/labapi/util/env.py +43 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/util/extract.py +4 -2
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/util/path.py +187 -121
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/util/types.py +6 -6
- {labapi-1.0.3 → labapi-1.1.0/src/labapi.egg-info}/PKG-INFO +18 -14
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi.egg-info/SOURCES.txt +6 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi.egg-info/requires.txt +1 -0
- labapi-1.1.0/tests/__init__.py +1 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/conftest.py +4 -4
- labapi-1.1.0/tests/entry/__init__.py +1 -0
- labapi-1.1.0/tests/entry/entries/__init__.py +1 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/entry/entries/test_attachment.py +10 -12
- labapi-1.1.0/tests/entry/entries/test_base.py +117 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/entry/entries/test_text.py +15 -18
- {labapi-1.0.3 → labapi-1.1.0}/tests/entry/entries/test_widget.py +5 -2
- {labapi-1.0.3 → labapi-1.1.0}/tests/entry/test_attachment.py +52 -14
- {labapi-1.0.3 → labapi-1.1.0}/tests/entry/test_collection.py +31 -89
- labapi-1.1.0/tests/examples/__init__.py +1 -0
- labapi-1.1.0/tests/examples/test_csv_table.py +246 -0
- labapi-1.1.0/tests/examples/test_folder_download.py +357 -0
- labapi-1.1.0/tests/examples/test_json_sync.py +331 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/test_browser.py +191 -175
- {labapi-1.0.3 → labapi-1.1.0}/tests/test_client.py +53 -35
- {labapi-1.0.3 → labapi-1.1.0}/tests/test_integration.py +18 -18
- {labapi-1.0.3 → labapi-1.1.0}/tests/test_user.py +15 -18
- labapi-1.1.0/tests/tree/__init__.py +1 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/tree/test_collection.py +15 -18
- {labapi-1.0.3 → labapi-1.1.0}/tests/tree/test_directory.py +12 -34
- {labapi-1.0.3 → labapi-1.1.0}/tests/tree/test_mixins.py +115 -137
- labapi-1.1.0/tests/tree/test_notebook.py +270 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/tree/test_page.py +117 -106
- labapi-1.1.0/tests/util/__init__.py +1 -0
- labapi-1.1.0/tests/util/test_path.py +346 -0
- {labapi-1.0.3 → labapi-1.1.0}/uv.lock +671 -129
- labapi-1.0.3/conftest.py +0 -391
- labapi-1.0.3/examples/csv_table/README.md +0 -58
- labapi-1.0.3/examples/csv_table/csv_table.py +0 -299
- labapi-1.0.3/examples/folder_download/README.md +0 -60
- labapi-1.0.3/examples/folder_download/folder_download.py +0 -224
- labapi-1.0.3/examples/json_sync/README.md +0 -55
- labapi-1.0.3/examples/json_sync/json_sync.py +0 -212
- labapi-1.0.3/src/labapi/entry/entries/widget.py +0 -29
- labapi-1.0.3/tests/__init__.py +0 -1
- labapi-1.0.3/tests/entry/__init__.py +0 -1
- labapi-1.0.3/tests/entry/entries/__init__.py +0 -1
- labapi-1.0.3/tests/entry/entries/test_base.py +0 -66
- labapi-1.0.3/tests/examples/__init__.py +0 -1
- labapi-1.0.3/tests/examples/test_csv_table.py +0 -153
- labapi-1.0.3/tests/examples/test_folder_download.py +0 -89
- labapi-1.0.3/tests/examples/test_json_sync.py +0 -149
- labapi-1.0.3/tests/tree/__init__.py +0 -1
- labapi-1.0.3/tests/tree/test_notebook.py +0 -47
- labapi-1.0.3/tests/util/__init__.py +0 -1
- labapi-1.0.3/tests/util/test_path.py +0 -143
- {labapi-1.0.3 → labapi-1.1.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/typecheck.yml +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/.github/workflows/unit_tests.yml +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/.mockenv +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/.pre-commit-config.yaml +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/.zenodo.json +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/CLAUDE.md +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/CONTRIBUTING.md +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/LICENSE +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/Makefile +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/make.bat +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/_static/.gitkeep +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/_templates/custom-class-template.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/_templates/custom-module-template.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/faq.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/api_calls.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/architecture.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/auth.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/clearing_cache.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/exceptions.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/index.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/index_access.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/integration_design.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/json_entries.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/guide/limitations.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/index.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/copying.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/deleting.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/first_calls.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/index.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/navigating.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/tutorial.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/quick_start/writing_rich_text.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/docs/source/reference/index.rst +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/csv_table/sample_data.csv +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/folder_download/populate_notebook.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/json_sync/sample_data/config.json +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/json_sync/sample_data/results.json +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/model_logging/model_logger.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/model_logging/pyproject.toml +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/model_logging/run_test.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/model_logging/test_data/dummy_figure.png +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/model_logging/test_data/metrics.json +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/model_logging/test_data/results.csv +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/notebook_logging/.gitignore +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/notebook_logging/example.ipynb +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/examples/notebook_logging/pyproject.toml +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/setup.cfg +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/entry/comment.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/exceptions.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/py.typed +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/tree/__init__.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi/user.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi.egg-info/dependency_links.txt +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/src/labapi.egg-info/top_level.txt +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/test_entry.json +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/util/test_behavior.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/util/test_extract.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/util/test_index.py +0 -0
- {labapi-1.0.3 → labapi-1.1.0}/tests/util/test_notebookinit.py +0 -0
|
@@ -20,10 +20,10 @@ jobs:
|
|
|
20
20
|
version: "latest"
|
|
21
21
|
|
|
22
22
|
- name: Set up Python
|
|
23
|
-
run: uv python install
|
|
23
|
+
run: uv python install
|
|
24
24
|
|
|
25
25
|
- name: Install dependencies
|
|
26
26
|
run: uv sync --all-groups
|
|
27
27
|
|
|
28
28
|
- name: Build Sphinx docs
|
|
29
|
-
run: uv run sphinx-build -b html docs/source docs/_build
|
|
29
|
+
run: uv run sphinx-build -b html docs/source docs/_build/html
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
name: Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pages: write
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: pages
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
build:
|
|
20
|
+
name: Build docs site
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
env:
|
|
23
|
+
# Older release tags import typing.Self and typing.override.
|
|
24
|
+
UV_PYTHON: "3.12"
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- name: Checkout code
|
|
28
|
+
uses: actions/checkout@v5
|
|
29
|
+
with:
|
|
30
|
+
fetch-depth: 0
|
|
31
|
+
|
|
32
|
+
- name: Configure GitHub Pages
|
|
33
|
+
uses: actions/configure-pages@v5
|
|
34
|
+
|
|
35
|
+
- name: Install uv
|
|
36
|
+
uses: astral-sh/setup-uv@v7
|
|
37
|
+
with:
|
|
38
|
+
enable-cache: true
|
|
39
|
+
version: "latest"
|
|
40
|
+
|
|
41
|
+
- name: Set up Python
|
|
42
|
+
run: uv python install
|
|
43
|
+
|
|
44
|
+
- name: Install dependencies
|
|
45
|
+
run: uv sync --all-groups
|
|
46
|
+
|
|
47
|
+
- name: Build versioned Sphinx docs
|
|
48
|
+
run: uv run sphinx-multiversion docs/source docs/_build/html
|
|
49
|
+
|
|
50
|
+
- name: Add Pages root files
|
|
51
|
+
run: |
|
|
52
|
+
set -eu
|
|
53
|
+
latest="$(find docs/_build/html -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n 1)"
|
|
54
|
+
if [ -z "$latest" ]; then
|
|
55
|
+
echo "No versioned docs directories found." >&2
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
touch docs/_build/html/.nojekyll
|
|
60
|
+
cat > docs/_build/html/index.html <<EOF
|
|
61
|
+
<!doctype html>
|
|
62
|
+
<html lang="en">
|
|
63
|
+
<head>
|
|
64
|
+
<meta charset="utf-8">
|
|
65
|
+
<meta http-equiv="refresh" content="0; url=./${latest}/index.html">
|
|
66
|
+
<link rel="canonical" href="./${latest}/index.html">
|
|
67
|
+
<title>Redirecting...</title>
|
|
68
|
+
</head>
|
|
69
|
+
<body>
|
|
70
|
+
<p>Redirecting to <a href="./${latest}/index.html">${latest}</a>.</p>
|
|
71
|
+
</body>
|
|
72
|
+
</html>
|
|
73
|
+
EOF
|
|
74
|
+
|
|
75
|
+
- name: Upload Pages artifact
|
|
76
|
+
uses: actions/upload-pages-artifact@v4
|
|
77
|
+
with:
|
|
78
|
+
path: docs/_build/html
|
|
79
|
+
|
|
80
|
+
deploy:
|
|
81
|
+
name: Deploy docs site
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
needs: build
|
|
84
|
+
environment:
|
|
85
|
+
name: github-pages
|
|
86
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
87
|
+
|
|
88
|
+
steps:
|
|
89
|
+
- name: Deploy to GitHub Pages
|
|
90
|
+
id: deployment
|
|
91
|
+
uses: actions/deploy-pages@v4
|
|
@@ -31,10 +31,10 @@ jobs:
|
|
|
31
31
|
version: "latest"
|
|
32
32
|
|
|
33
33
|
- name: Set up Python
|
|
34
|
-
run: uv python install 3.
|
|
34
|
+
run: uv python install 3.10
|
|
35
35
|
|
|
36
36
|
- name: Build distributions
|
|
37
|
-
run: uv build --python 3.
|
|
37
|
+
run: uv build --python 3.10 --clear --no-build-logs
|
|
38
38
|
|
|
39
39
|
- name: Publish to PyPI
|
|
40
40
|
run: uv publish --trusted-publishing always
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.10
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `labapi` are documented here in release order.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
This changelog is written for package users and maintainers, so entries call
|
|
8
|
+
out user-visible behavior, supported runtime changes, and release-engineering
|
|
9
|
+
details that affect development workflows.
|
|
10
|
+
|
|
11
|
+
## 1.1.0 - 2026-06-02
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- `Attachment.from_file()` now accepts filesystem `str` or `Path` objects in
|
|
16
|
+
addition to file-like objects.
|
|
17
|
+
- `Notebook.search()` for paginated LabArchives entry search results using
|
|
18
|
+
normal entry objects.
|
|
19
|
+
- Support for escaped separators (`\/`) in notebook paths, enabling access to
|
|
20
|
+
and creation of notebook nodes with literal slashes in their names.
|
|
21
|
+
- Official support for Python 3.10 and 3.11.
|
|
22
|
+
- `typing-extensions` as a runtime dependency so code can use backported typing
|
|
23
|
+
helpers such as `Self`, `override`, and `Buffer` while supporting Python 3.10.
|
|
24
|
+
- Lazy environment-variable loading through `labapi.util.env.getenv()`. When
|
|
25
|
+
`python-dotenv` is installed, `.env` is loaded on first credential lookup
|
|
26
|
+
instead of during `labapi.client` import.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- Refactored the `json_sync` example into a reusable utility with
|
|
31
|
+
comprehensive tests.
|
|
32
|
+
- Rewrote the `csv_table` example for improved clarity and usability.
|
|
33
|
+
- Refactored the `folder_download` example into clearer reusable download
|
|
34
|
+
logic.
|
|
35
|
+
- Reworked entry factory fallback handling. Unknown upstream LabArchives part
|
|
36
|
+
types now load as `UnknownEntry`, while recognized but unimplemented part
|
|
37
|
+
types load as `UnimplementedEntry`; both still reject unsupported updates.
|
|
38
|
+
- Updated attachment cloning to use an explicit random-access capability check
|
|
39
|
+
instead of requiring every file-like object to expose a reliable
|
|
40
|
+
`seekable()` method.
|
|
41
|
+
- Kept spooled attachment buffers open after `Attachment.from_file()` returns,
|
|
42
|
+
while still preserving the caller's original file cursor position.
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- Fixed runtime typing in `Attachment.from_file()` to support both file-like
|
|
47
|
+
and path-like inputs correctly.
|
|
48
|
+
- Improved `Attachment.from_file()` support for random-access binary streams
|
|
49
|
+
that do not expose `seekable()`.
|
|
50
|
+
- Fixed relative path resolution bugs when using the `/` operator with absolute
|
|
51
|
+
and relative `NotebookPath` objects.
|
|
52
|
+
|
|
53
|
+
## 1.0.3 - 2026-04-15
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
|
|
57
|
+
- Refined the client auth flow and browser detection behavior.
|
|
58
|
+
- Simplified tree path handling.
|
|
59
|
+
- Switched the `1.0` type-check workflow from `mypy` to `ty`.
|
|
60
|
+
- Refreshed package metadata, README content, and Zenodo configuration.
|
|
61
|
+
- Updated `pillow` and `pytest`.
|
|
62
|
+
|
|
63
|
+
### Fixed
|
|
64
|
+
|
|
65
|
+
- Restored datetime-based URL signing support.
|
|
66
|
+
- Improved browser detection robustness when detectable values arrive with
|
|
67
|
+
incorrect types.
|
|
68
|
+
- Fixed test compatibility issues in the `1.0` maintenance branch.
|
|
69
|
+
- Reduced tree creation complexity in the `v1.0.3` stabilization pass.
|
|
70
|
+
|
|
71
|
+
## 1.0.2 - 2026-04-10
|
|
72
|
+
|
|
73
|
+
### Changed
|
|
74
|
+
|
|
75
|
+
- Cleaned up the PyPI README and related package metadata.
|
|
76
|
+
|
|
77
|
+
## 1.0.1 - 2026-04-10
|
|
78
|
+
|
|
79
|
+
### Added
|
|
80
|
+
|
|
81
|
+
- Initial TestPyPI publishing workflow.
|
|
82
|
+
- GitHub issue templates.
|
|
83
|
+
- Reusable GitHub Actions checks and broader local tooling support.
|
|
84
|
+
|
|
85
|
+
### Changed
|
|
86
|
+
|
|
87
|
+
- Improved versioning and generated documentation metadata.
|
|
88
|
+
- Refreshed contributor and Sphinx configuration docs.
|
|
89
|
+
- Updated `cryptography`, `pygments`, and `requests`.
|
|
90
|
+
|
|
91
|
+
## 1.0.0 - 2026-04-01
|
|
92
|
+
|
|
93
|
+
### Added
|
|
94
|
+
|
|
95
|
+
- Initial stable release of `labapi`.
|
|
96
|
+
- Support for LabArchives authentication, notebook tree traversal, and
|
|
97
|
+
page and entry operations from Python.
|
|
98
|
+
- Project documentation and example workflows for common notebook automation
|
|
99
|
+
tasks.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: labapi
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: A Python client for the LabArchives API.
|
|
5
5
|
Author-email: Christoph Li <christoph.li@nih.gov>, Joshua Lawrimore <josh.lawrimore@nih.gov>
|
|
6
6
|
License: CC0-1.0
|
|
7
|
-
Project-URL: Documentation, https://
|
|
7
|
+
Project-URL: Documentation, https://nimh-dsst.github.io/labapi/
|
|
8
8
|
Project-URL: Issues, https://github.com/nimh-dsst/labapi/issues
|
|
9
9
|
Project-URL: Source, https://github.com/nimh-dsst/labapi
|
|
10
10
|
Classifier: Development Status :: 5 - Production/Stable
|
|
@@ -15,6 +15,8 @@ Classifier: Natural Language :: English
|
|
|
15
15
|
Classifier: Operating System :: OS Independent
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
17
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
22
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
@@ -23,12 +25,13 @@ Classifier: Topic :: Scientific/Engineering
|
|
|
23
25
|
Classifier: Topic :: Software Development :: Libraries
|
|
24
26
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
27
|
Classifier: Typing :: Typed
|
|
26
|
-
Requires-Python: >=3.
|
|
28
|
+
Requires-Python: >=3.10
|
|
27
29
|
Description-Content-Type: text/markdown
|
|
28
30
|
License-File: LICENSE
|
|
29
31
|
Requires-Dist: cryptography>=46.0.3
|
|
30
32
|
Requires-Dist: lxml>=6.0.2
|
|
31
33
|
Requires-Dist: requests>=2.32.5
|
|
34
|
+
Requires-Dist: typing-extensions>=4.12.2
|
|
32
35
|
Provides-Extra: builtin-auth
|
|
33
36
|
Requires-Dist: selenium>=4.39.0; extra == "builtin-auth"
|
|
34
37
|
Requires-Dist: installed-browsers>=0.1.5; extra == "builtin-auth"
|
|
@@ -40,25 +43,26 @@ Dynamic: license-file
|
|
|
40
43
|
|
|
41
44
|
A Python client for the LabArchives API.
|
|
42
45
|
|
|
43
|
-
[](https://www.python.org/downloads/)
|
|
44
47
|
[](https://github.com/nimh-dsst/labapi/actions/workflows/unit_tests.yml)
|
|
48
|
+
[](https://doi.org/10.5281/zenodo.19599400)
|
|
45
49
|
[](https://creativecommons.org/publicdomain/zero/1.0/)
|
|
46
50
|
|
|
47
51
|
`labapi` helps you authenticate with LabArchives, navigate notebook trees, and create or update notebook content from Python.
|
|
48
52
|
|
|
49
|
-
[Source](https://github.com/nimh-dsst/labapi) | [Docs](https://
|
|
53
|
+
[Source](https://github.com/nimh-dsst/labapi) | [Docs](https://nimh-dsst.github.io/labapi/) | [Issues](https://github.com/nimh-dsst/labapi/issues)
|
|
50
54
|
|
|
51
55
|
## Start Here
|
|
52
56
|
|
|
53
|
-
- New to `labapi`? Follow the [First Success Tutorial](https://
|
|
54
|
-
- Already using `labapi`? Jump to the [Quick Start](https://
|
|
57
|
+
- New to `labapi`? Follow the [First Success Tutorial](https://nimh-dsst.github.io/labapi/quick_start/tutorial.html) for the fastest path from install to a visible change in LabArchives.
|
|
58
|
+
- Already using `labapi`? Jump to the [Quick Start](https://nimh-dsst.github.io/labapi/quick_start/index.html), [User Guide](https://nimh-dsst.github.io/labapi/guide/index.html), [Examples](https://nimh-dsst.github.io/labapi/examples/index.html), or [FAQ](https://nimh-dsst.github.io/labapi/faq.html).
|
|
55
59
|
- Working on the package itself? Start with [CONTRIBUTING.md](https://github.com/nimh-dsst/labapi/blob/main/CONTRIBUTING.md).
|
|
56
60
|
|
|
57
61
|
## Install
|
|
58
62
|
|
|
59
63
|
Requirements:
|
|
60
64
|
|
|
61
|
-
- Python 3.
|
|
65
|
+
- Python 3.10+
|
|
62
66
|
- `uv` (recommended) or `pip`
|
|
63
67
|
|
|
64
68
|
Recommended install for local use:
|
|
@@ -176,12 +180,12 @@ page = notebook.traverse("Experiments/2026/Results")
|
|
|
176
180
|
|
|
177
181
|
## Documentation Map
|
|
178
182
|
|
|
179
|
-
- [First Success Tutorial](https://
|
|
180
|
-
- [Quick Start](https://
|
|
181
|
-
- [Authentication Guide](https://
|
|
182
|
-
- [User Guide](https://
|
|
183
|
-
- [Examples](https://
|
|
184
|
-
- [FAQ](https://
|
|
183
|
+
- [First Success Tutorial](https://nimh-dsst.github.io/labapi/quick_start/tutorial.html): shortest path from install to a successful write.
|
|
184
|
+
- [Quick Start](https://nimh-dsst.github.io/labapi/quick_start/index.html): setup, navigation, page creation, uploads, and basic write operations.
|
|
185
|
+
- [Authentication Guide](https://nimh-dsst.github.io/labapi/guide/auth.html): local browser auth, manual flows, and callback-based integration patterns.
|
|
186
|
+
- [User Guide](https://nimh-dsst.github.io/labapi/guide/index.html): paths, entries, API behavior, exceptions, limits, and architecture notes.
|
|
187
|
+
- [Examples](https://nimh-dsst.github.io/labapi/examples/index.html): end-to-end scripts for real workflows.
|
|
188
|
+
- [FAQ](https://nimh-dsst.github.io/labapi/faq.html): troubleshooting and environment questions.
|
|
185
189
|
|
|
186
190
|
## Development
|
|
187
191
|
|
|
@@ -2,25 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
A Python client for the LabArchives API.
|
|
4
4
|
|
|
5
|
-
[](https://www.python.org/downloads/)
|
|
6
6
|
[](https://github.com/nimh-dsst/labapi/actions/workflows/unit_tests.yml)
|
|
7
|
+
[](https://doi.org/10.5281/zenodo.19599400)
|
|
7
8
|
[](https://creativecommons.org/publicdomain/zero/1.0/)
|
|
8
9
|
|
|
9
10
|
`labapi` helps you authenticate with LabArchives, navigate notebook trees, and create or update notebook content from Python.
|
|
10
11
|
|
|
11
|
-
[Source](https://github.com/nimh-dsst/labapi) | [Docs](https://
|
|
12
|
+
[Source](https://github.com/nimh-dsst/labapi) | [Docs](https://nimh-dsst.github.io/labapi/) | [Issues](https://github.com/nimh-dsst/labapi/issues)
|
|
12
13
|
|
|
13
14
|
## Start Here
|
|
14
15
|
|
|
15
|
-
- New to `labapi`? Follow the [First Success Tutorial](https://
|
|
16
|
-
- Already using `labapi`? Jump to the [Quick Start](https://
|
|
16
|
+
- New to `labapi`? Follow the [First Success Tutorial](https://nimh-dsst.github.io/labapi/quick_start/tutorial.html) for the fastest path from install to a visible change in LabArchives.
|
|
17
|
+
- Already using `labapi`? Jump to the [Quick Start](https://nimh-dsst.github.io/labapi/quick_start/index.html), [User Guide](https://nimh-dsst.github.io/labapi/guide/index.html), [Examples](https://nimh-dsst.github.io/labapi/examples/index.html), or [FAQ](https://nimh-dsst.github.io/labapi/faq.html).
|
|
17
18
|
- Working on the package itself? Start with [CONTRIBUTING.md](https://github.com/nimh-dsst/labapi/blob/main/CONTRIBUTING.md).
|
|
18
19
|
|
|
19
20
|
## Install
|
|
20
21
|
|
|
21
22
|
Requirements:
|
|
22
23
|
|
|
23
|
-
- Python 3.
|
|
24
|
+
- Python 3.10+
|
|
24
25
|
- `uv` (recommended) or `pip`
|
|
25
26
|
|
|
26
27
|
Recommended install for local use:
|
|
@@ -138,12 +139,12 @@ page = notebook.traverse("Experiments/2026/Results")
|
|
|
138
139
|
|
|
139
140
|
## Documentation Map
|
|
140
141
|
|
|
141
|
-
- [First Success Tutorial](https://
|
|
142
|
-
- [Quick Start](https://
|
|
143
|
-
- [Authentication Guide](https://
|
|
144
|
-
- [User Guide](https://
|
|
145
|
-
- [Examples](https://
|
|
146
|
-
- [FAQ](https://
|
|
142
|
+
- [First Success Tutorial](https://nimh-dsst.github.io/labapi/quick_start/tutorial.html): shortest path from install to a successful write.
|
|
143
|
+
- [Quick Start](https://nimh-dsst.github.io/labapi/quick_start/index.html): setup, navigation, page creation, uploads, and basic write operations.
|
|
144
|
+
- [Authentication Guide](https://nimh-dsst.github.io/labapi/guide/auth.html): local browser auth, manual flows, and callback-based integration patterns.
|
|
145
|
+
- [User Guide](https://nimh-dsst.github.io/labapi/guide/index.html): paths, entries, API behavior, exceptions, limits, and architecture notes.
|
|
146
|
+
- [Examples](https://nimh-dsst.github.io/labapi/examples/index.html): end-to-end scripts for real workflows.
|
|
147
|
+
- [FAQ](https://nimh-dsst.github.io/labapi/faq.html): troubleshooting and environment questions.
|
|
147
148
|
|
|
148
149
|
## Development
|
|
149
150
|
|