matelab-python-sdk 0.2.0a7__tar.gz → 0.2.0a8__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.
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/PKG-INFO +2 -2
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/contracts/matelab-integration-v1.lock.json +3 -3
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/contracts/matelab-integration-v1.openapi.yaml +26 -34
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/docs/api.md +18 -11
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/docs/operation-coverage.yaml +1 -1
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/pyproject.toml +9 -8
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/_generated/models.py +6 -3
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/uploads.py +2 -1
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_uploads_and_literature.py +13 -5
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/uv.lock +63 -50
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/.env.example +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/.github/workflows/release.yml +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/.gitignore +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/AGENTS.md +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/CONTEXT.md +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/LICENSE +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/NOTICE +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/README.md +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/docs/agent-architecture.md +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/docs/agent-workflows.md +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/docs/development.md +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/scripts/check_installed_package.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/scripts/check_release.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/scripts/generate_models.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/__init__.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/_generated/__init__.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/_hashes.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/_transport.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/_wire_validation.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/client.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/__init__.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/_attachment_content.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/cloud_drive.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/groups.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/literature.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/notebooks.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/records.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/templates.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/users.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/errors.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/py.typed +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/session.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/streaming.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/conftest.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/provider/test_provider_smoke.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_async_attachment_upload.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_client.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_cloud_drive.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_comments_and_downloads.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_consumer_smoke.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_errors.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_extended_records.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_generation.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_groups.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_notebook_lifecycle.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_notebooks.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_operation_coverage.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_record_lifecycle.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_record_mutations.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_records.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_release.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_streaming.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_template_lifecycle.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_templates.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_transport.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_users.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/typing/consumer.py +0 -0
- {matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/typing/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: matelab-python-sdk
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.0a8
|
|
4
4
|
Summary: Reusable async Python client for the Matelab Integration Contract
|
|
5
5
|
Author: CMPDC, Institute of Physics, Chinese Academy of Sciences
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -20,7 +20,7 @@ Classifier: Topic :: Scientific/Engineering
|
|
|
20
20
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
21
21
|
Classifier: Typing :: Typed
|
|
22
22
|
Requires-Python: >=3.11
|
|
23
|
-
Requires-Dist: httpx2>=2.
|
|
23
|
+
Requires-Dist: httpx2>=2.16.0
|
|
24
24
|
Requires-Dist: jsonschema>=4.26.0
|
|
25
25
|
Requires-Dist: pydantic>=2.14.1
|
|
26
26
|
Requires-Dist: typing-extensions>=4.16.0
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/contracts/matelab-integration-v1.lock.json
RENAMED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"contract_line": "integration-v1",
|
|
4
4
|
"release": {
|
|
5
|
-
"tag": "v2026.10.
|
|
6
|
-
"commit": "
|
|
5
|
+
"tag": "v2026.10.4",
|
|
6
|
+
"commit": "c422f4f7425ade81eb5a65d9448ca4ea8bcacc79"
|
|
7
7
|
},
|
|
8
8
|
"openapi": {
|
|
9
9
|
"source_path": "openapi/matelab-integration-v1.openapi.yaml",
|
|
10
10
|
"snapshot": "matelab-integration-v1.openapi.yaml",
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "1bc28a61647b7b8f38b86c8ea0085415616857f967c997031794a88deb2e377c"
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
openapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: Matelab Integration Contract
|
|
4
|
-
version: "2026.10.
|
|
4
|
+
version: "2026.10.4"
|
|
5
5
|
description: |
|
|
6
6
|
Current PHP wire contract for generating SDKs against the selected
|
|
7
7
|
`matelab-server` Provider version.
|
|
@@ -13,7 +13,7 @@ info:
|
|
|
13
13
|
x-contract-line: integration-v1
|
|
14
14
|
x-provider-evidence:
|
|
15
15
|
repository: /home/tnzhu/projects/matelab-server
|
|
16
|
-
commit:
|
|
16
|
+
commit: 161c4560ae1cb6267d46841d6fe8adc8270ee1bc
|
|
17
17
|
verificationRuntime:
|
|
18
18
|
baseUrl: http://127.0.0.1:18080/api
|
|
19
19
|
container: matelab-test-server-1
|
|
@@ -56,9 +56,9 @@ info:
|
|
|
56
56
|
- sql/matelab.sql
|
|
57
57
|
- sql/recommend.sql
|
|
58
58
|
x-provider-audit:
|
|
59
|
-
currentCommit:
|
|
60
|
-
previousReleaseEvidenceCommit:
|
|
61
|
-
lastProviderVerifiedCommit:
|
|
59
|
+
currentCommit: 161c4560ae1cb6267d46841d6fe8adc8270ee1bc
|
|
60
|
+
previousReleaseEvidenceCommit: b70f590571b860f043365c9f2d6f95818d595862
|
|
61
|
+
lastProviderVerifiedCommit: 161c4560ae1cb6267d46841d6fe8adc8270ee1bc
|
|
62
62
|
contractStatus: current-provider-aligned
|
|
63
63
|
# Summary of changes adopted by current Supported Routes since the last
|
|
64
64
|
# released contract, including contract corrections. The Provider diff is
|
|
@@ -66,29 +66,8 @@ info:
|
|
|
66
66
|
# updates against that fixed release baseline; use [] if no relevant changes.
|
|
67
67
|
# Entries are not per-change verification results or a cumulative history.
|
|
68
68
|
incorporatedChanges:
|
|
69
|
-
- {operationId: stageTemporaryFile, change:
|
|
70
|
-
- {operationId:
|
|
71
|
-
- {operationId: uploadRecordAttachment, change: single-fragment-hash-failure-rollback}
|
|
72
|
-
- {operationId: searchUsers, change: utf8-byte-minimum-without-a-keyword-length-cap-or-whitespace-filter}
|
|
73
|
-
- {operationId: listNotebookRecords, change: owner-id-or-email-selector-and-caller-defaults}
|
|
74
|
-
- {operationId: createBlankRecord, change: owner-id-or-email-selector-and-php-zero-title-rejection}
|
|
75
|
-
- {operationId: importRecordDataset, change: owner-and-template-owner-selectors-json-list-data-and-php-zero-string-rejection}
|
|
76
|
-
- {operationId: updateRecordData, change: owner-selector-numeric-extraction-selectors-and-module-specific-field-validation}
|
|
77
|
-
- {operationId: deleteRecordsByUid, change: owner-id-or-email-selector-and-caller-defaults}
|
|
78
|
-
- {operationId: saveNotebookMetadata, change: numeric-string-and-number-extraction-selectors}
|
|
79
|
-
- {operationId: searchRecordData, change: numeric-string-and-number-extraction-selectors}
|
|
80
|
-
- {operationId: addNotebookShare, change: provider-deduplicated-recipient-lists}
|
|
81
|
-
- {operationId: shareMultipleTemplatesWithUsers, change: list-limits-apply-after-provider-deduplication}
|
|
82
|
-
- {operationId: listLiteratureItems, change: duplicate-source-rating-and-keyword-filters-are-accepted}
|
|
83
|
-
- {operationId: shareLiteratureItems, change: provider-deduplicated-ids-and-optional-empty-recipient-list}
|
|
84
|
-
- {operationId: moveCloudDriveFiles, change: provider-deduplicated-file-ids}
|
|
85
|
-
- {operationId: deleteCloudDriveFiles, change: provider-deduplicated-file-ids}
|
|
86
|
-
- {operationId: listDeletedRecordPage, change: unpaged-zero-page-size-omits-count-and-page}
|
|
87
|
-
- {operationId: extractLiteratureMetadata, change: nonempty-doi-takes-precedence-over-staged-file-id}
|
|
88
|
-
- {operationId: saveTemplateContent, change: php-name-validation-and-json-body-checks-apply-only-on-write}
|
|
89
|
-
- {operationId: listTemplates, change: stored-keywords-accept-nonnull-json-values}
|
|
90
|
-
- {operationId: readTemplateContent, change: stored-module-names-and-language-are-returned-without-template-write-validation}
|
|
91
|
-
- {operationId: readRecord, change: record-update-names-and-stored-module-language-use-raw-response-types}
|
|
69
|
+
- {operationId: stageTemporaryFile, change: filename-extension-selects-continuation-bytes-and-abort-cleans-incomplete-extension-variants}
|
|
70
|
+
- {operationId: uploadRecordAttachment, change: temporary-bytes-retain-sanitized-source-extension}
|
|
92
71
|
x-consumer-evidence:
|
|
93
72
|
- repository: /home/tnzhu/projects/matelab-mcp
|
|
94
73
|
commit: 94a129b2df0ef0fbcf179c10550fb7c9a5dd2e6f
|
|
@@ -109,7 +88,7 @@ info:
|
|
|
109
88
|
identity must come from token issuance. ELN-group and notebook-list
|
|
110
89
|
calls still provide Consumer evidence for their canonical GET forms.
|
|
111
90
|
- repository: /home/tnzhu/projects/matelab-front
|
|
112
|
-
commit:
|
|
91
|
+
commit: 89332767c2f20de210baed1e1e42df56e7071ad6
|
|
113
92
|
files:
|
|
114
93
|
- src/App.vue
|
|
115
94
|
- src/fn/index.js
|
|
@@ -1993,7 +1972,10 @@ paths:
|
|
|
1993
1972
|
contracted abort, status, expiration, or idempotent retry. A hash
|
|
1994
1973
|
mismatch in this one-fragment flow rolls back the temporary row and
|
|
1995
1974
|
new bytes. Errors after import/update writing starts still do not prove
|
|
1996
|
-
whether the stage was consumed.
|
|
1975
|
+
whether the stage was consumed. Temporary bytes retain the multipart
|
|
1976
|
+
filename's extension after removing non-ASCII-alphanumeric characters;
|
|
1977
|
+
the response still reports the original source filename.
|
|
1978
|
+
Raw identifiers identify the staging row;
|
|
1997
1979
|
their filesystem components are sanitized and can alias (PVD-051).
|
|
1998
1980
|
x-known-provider-issues: [PVD-014, PVD-051]
|
|
1999
1981
|
security: [{bearerAuth: []}]
|
|
@@ -3703,11 +3685,18 @@ paths:
|
|
|
3703
3685
|
successful response's `offset`. Omitting it defaults to zero and
|
|
3704
3686
|
restarts incomplete bytes rather than appending. The final fragment
|
|
3705
3687
|
returns the combined SHA-256, size, source filename, temporary row id,
|
|
3706
|
-
and legacy preview query.
|
|
3688
|
+
and legacy preview query. The multipart filename's final extension,
|
|
3689
|
+
stripped of characters outside `[A-Za-z0-9]` with case preserved,
|
|
3690
|
+
also selects the temporary bytes. Repeat that extension on every
|
|
3691
|
+
fragment; changing it cannot continue the previous bytes and returns
|
|
3692
|
+
code 2 when the requested offset has no matching file. A different
|
|
3693
|
+
filename stem with the same sanitized extension can continue them.
|
|
3707
3694
|
|
|
3708
3695
|
`abort=1` is the compensating cleanup operation. It requires the same
|
|
3709
|
-
`uid` and `tempid
|
|
3710
|
-
|
|
3696
|
+
`uid` and `tempid` and omits `file`. If no completed row exists for
|
|
3697
|
+
those identifiers, it removes incomplete bytes for all extension
|
|
3698
|
+
variants, including the extensionless file. If a completed row exists,
|
|
3699
|
+
it preserves the row and bytes without cleaning any variants. Both
|
|
3711
3700
|
states return the standard HTTP 200 code-2 error envelope ("upload
|
|
3712
3701
|
cancelled"); that response does not prove completed staging was deleted.
|
|
3713
3702
|
Complete uploads must be consumed by their intended finalizer; this
|
|
@@ -7450,7 +7439,10 @@ components:
|
|
|
7450
7439
|
file:
|
|
7451
7440
|
type: string
|
|
7452
7441
|
format: binary
|
|
7453
|
-
description:
|
|
7442
|
+
description: |
|
|
7443
|
+
Required for upload branches and omitted for abort. The multipart
|
|
7444
|
+
filename's sanitized final extension selects the temporary bytes;
|
|
7445
|
+
keep that extension unchanged throughout continuation.
|
|
7454
7446
|
allOf:
|
|
7455
7447
|
- if:
|
|
7456
7448
|
required: [abort]
|
|
@@ -5,15 +5,15 @@ See the [README](../README.md) for installation and quick start and [CONTEXT.md]
|
|
|
5
5
|
|
|
6
6
|
## Contract
|
|
7
7
|
|
|
8
|
-
The SDK is pinned to the immutable `matelab-spec v2026.10.
|
|
8
|
+
The SDK is pinned to the immutable `matelab-spec v2026.10.4` Contract Release. The sole pin,
|
|
9
9
|
[contracts/matelab-integration-v1.lock.json](../contracts/matelab-integration-v1.lock.json), records peeled commit
|
|
10
|
-
`
|
|
11
|
-
and SHA-256 `
|
|
12
|
-
`
|
|
10
|
+
`c422f4f7425ade81eb5a65d9448ca4ea8bcacc79`, source `openapi/matelab-integration-v1.openapi.yaml`, the local snapshot path,
|
|
11
|
+
and SHA-256 `1bc28a61647b7b8f38b86c8ea0085415616857f967c997031794a88deb2e377c`. The annotated tag object is
|
|
12
|
+
`72c52e2267598f9bde820f629bc62d5982f7081c`.
|
|
13
13
|
|
|
14
|
-
The Contract uses Provider source evidence from `
|
|
14
|
+
The Contract uses Provider source evidence from `161c4560ae1cb6267d46841d6fe8adc8270ee1bc`; v2026.10.4 validation ran
|
|
15
15
|
against an isolated test instance and does not establish production behavior. The Front Consumer evidence
|
|
16
|
-
`
|
|
16
|
+
`89332767c2f20de210baed1e1e42df56e7071ad6` informs cross-Consumer capability review but does not define the SDK interface.
|
|
17
17
|
|
|
18
18
|
This snapshot covers the Workerman runtime with the `localhost` data-server branch for ELN records and attachments;
|
|
19
19
|
remote data-server forwarding is outside its verified callable scope (PVD-049).
|
|
@@ -198,7 +198,8 @@ objects are outside the interface and are also rejected at runtime before a Prov
|
|
|
198
198
|
checksum, or multipart content type. The SDK calculates the SHA-256 itself; streams are fully consumed into a
|
|
199
199
|
`SpooledTemporaryFile`, rewound, and only then sent to the Provider. Temporary-file write, seek, read, and close
|
|
200
200
|
operations run outside the event-loop thread, including after the spool rolls to disk. The Contract fixes attachment
|
|
201
|
-
parts to `application/octet-stream`.
|
|
201
|
+
parts to `application/octet-stream`. Temporary record-attachment bytes retain the source filename's final extension,
|
|
202
|
+
stripped to ASCII letters and digits with case preserved; the response retains the original source filename.
|
|
202
203
|
|
|
203
204
|
An exception raised by an async source is propagated unchanged after the SDK closes its temporary file. The SDK reads
|
|
204
205
|
streams through end-of-file and imposes no upload-size policy; callers remain responsible for limits such as an HTTP
|
|
@@ -692,19 +693,25 @@ assert isinstance(staged, StagedFile)
|
|
|
692
693
|
The SDK derives `fragment_size` and computes the complete SHA-256 for a single `bytes` fragment. File-like content
|
|
693
694
|
must declare its fragment size. For multiple fragments, pass the returned `StagedUploadSession` into the next call and
|
|
694
695
|
supply `complete_sha256` on the final call. `next_offset` is the Provider-acknowledged byte offset, checked against the
|
|
695
|
-
declared fragment size and sent with the next fragment.
|
|
696
|
-
|
|
696
|
+
declared fragment size and sent with the next fragment. Repeat the filename's final extension across fragments:
|
|
697
|
+
the Provider removes characters outside `[A-Za-z0-9]` and preserves case, so `paper.P-d_f` and `renamed.Pdf` select
|
|
698
|
+
the same bytes. Changing that sanitized extension cannot resume the upload and returns code 2 when no matching
|
|
699
|
+
file exists at the requested offset. The SDK sends each filename unchanged, checks the returned filename and total
|
|
700
|
+
size, and compares hashes when a local expected hash is available. A final result contains the Provider hash, temporary row
|
|
697
701
|
identity and direct `binding`; it no longer embeds resumable session state. The temporary Provider URL and upload-session
|
|
698
702
|
identity needed by internal binding and cleanup remain hidden. Callers do not need to
|
|
699
703
|
splice either into content. The result does not claim that a later literature/cloud operation checks the uploader or
|
|
700
704
|
consumes the file exactly once. `uploads.abort()` accepts either an active `StagedUploadSession` or a completed
|
|
701
|
-
`StagedFile` and returns `None` for the Provider's code-2 cancellation signal.
|
|
702
|
-
|
|
705
|
+
`StagedFile` and returns `None` for the Provider's code-2 cancellation signal. Without a completed staging row, it
|
|
706
|
+
removes all incomplete extension variants, including extensionless bytes. A completed row prevents any cleanup for
|
|
707
|
+
that identity; completed staging must be consumed by its intended finalizer (PVD-052).
|
|
703
708
|
Binding UIDs allow up to 100 characters; upload-session IDs allow up to 45 (PVD-024). Use fresh identities: different
|
|
704
709
|
raw identifiers can alias after Provider filename sanitization (PVD-051). Workerman upload errors supply no usable
|
|
705
710
|
resume offset (PVD-050). After a failed non-final fragment, cancel incomplete bytes and restart with fresh identities.
|
|
706
711
|
An ambiguous final response can leave completed staging that `abort()` cannot delete.
|
|
707
712
|
Staging mutations are never automatically retried.
|
|
713
|
+
After upgrading from the previous Provider's extensionless storage, restart old incomplete uploads from offset zero
|
|
714
|
+
or cancel them and use fresh session identities.
|
|
708
715
|
|
|
709
716
|
Literature identities distinguish the personal library from shared libraries:
|
|
710
717
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["hatchling>=1.
|
|
2
|
+
requires = ["hatchling>=1.33.0"]
|
|
3
3
|
build-backend = "hatchling.build"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "matelab-python-sdk"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.0a8"
|
|
8
8
|
description = "Reusable async Python client for the Matelab Integration Contract"
|
|
9
9
|
requires-python = ">=3.11"
|
|
10
10
|
keywords = ["matelab", "electronic-lab-notebook", "eln", "asyncio", "sdk"]
|
|
@@ -12,7 +12,7 @@ authors = [
|
|
|
12
12
|
{ name = "CMPDC, Institute of Physics, Chinese Academy of Sciences" },
|
|
13
13
|
]
|
|
14
14
|
dependencies = [
|
|
15
|
-
"httpx2>=2.
|
|
15
|
+
"httpx2>=2.16.0",
|
|
16
16
|
"jsonschema>=4.26.0",
|
|
17
17
|
"pydantic>=2.14.1",
|
|
18
18
|
"typing-extensions>=4.16.0",
|
|
@@ -39,12 +39,12 @@ classifiers = [
|
|
|
39
39
|
dev = [
|
|
40
40
|
"basedpyright>=1.40.2",
|
|
41
41
|
"nodejs-wheel-binaries==22.20.0",
|
|
42
|
-
"datamodel-code-generator>=0.
|
|
43
|
-
"hatchling>=1.
|
|
44
|
-
"pytest>=9.
|
|
45
|
-
"pytest-asyncio>=1.4.
|
|
42
|
+
"datamodel-code-generator>=0.87.0",
|
|
43
|
+
"hatchling>=1.33.0",
|
|
44
|
+
"pytest>=9.2.0",
|
|
45
|
+
"pytest-asyncio>=1.4.1",
|
|
46
46
|
"pyyaml>=6.0.3",
|
|
47
|
-
"ruff>=0.17.
|
|
47
|
+
"ruff>=0.17.3",
|
|
48
48
|
]
|
|
49
49
|
|
|
50
50
|
[tool.ruff]
|
|
@@ -65,6 +65,7 @@ reportIncompatibleUnannotatedOverride = "error"
|
|
|
65
65
|
markers = [
|
|
66
66
|
"provider: opt-in smoke tests against an explicitly acknowledged real Provider target",
|
|
67
67
|
]
|
|
68
|
+
asyncio_default_fixture_loop_scope = "function"
|
|
68
69
|
|
|
69
70
|
[tool.hatch.build.targets.wheel]
|
|
70
71
|
packages = ["src/matelab"]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
#
|
|
3
3
|
# @generated by datamodel-codegen:
|
|
4
4
|
# filename: openapi.yaml
|
|
5
|
-
# version: 0.
|
|
5
|
+
# version: 0.87.0
|
|
6
6
|
|
|
7
7
|
from enum import StrEnum
|
|
8
8
|
from typing import Annotated, Any, Literal
|
|
@@ -11,7 +11,7 @@ from pydantic import ConfigDict, Field, RootModel, SecretStr, StrictBool, Strict
|
|
|
11
11
|
|
|
12
12
|
from matelab._wire_validation import WireModel
|
|
13
13
|
|
|
14
|
-
OPENAPI_INFO_VERSION = "2026.10.
|
|
14
|
+
OPENAPI_INFO_VERSION = "2026.10.4"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class ResponseEnvelope(WireModel):
|
|
@@ -2759,7 +2759,10 @@ class StageTemporaryFileRequest(WireModel):
|
|
|
2759
2759
|
"""
|
|
2760
2760
|
file: bytes | None = None
|
|
2761
2761
|
"""
|
|
2762
|
-
Required for upload branches and omitted for abort.
|
|
2762
|
+
Required for upload branches and omitted for abort. The multipart
|
|
2763
|
+
filename's sanitized final extension selects the temporary bytes;
|
|
2764
|
+
keep that extension unchanged throughout continuation.
|
|
2765
|
+
|
|
2763
2766
|
"""
|
|
2764
2767
|
|
|
2765
2768
|
|
|
@@ -79,6 +79,7 @@ class Uploads:
|
|
|
79
79
|
complete_sha256: str | None = None,
|
|
80
80
|
content_type: str = "application/octet-stream",
|
|
81
81
|
) -> StagedUploadSession | StagedFile:
|
|
82
|
+
"""Stage bytes; preserve the sanitized, case-sensitive filename extension when resuming."""
|
|
82
83
|
if session is None:
|
|
83
84
|
session = StagedUploadSession(
|
|
84
85
|
binding=UploadBindingRef.new(), upload_session_id=f"tmp-{secrets.token_urlsafe(24)}"
|
|
@@ -162,7 +163,7 @@ class Uploads:
|
|
|
162
163
|
)
|
|
163
164
|
|
|
164
165
|
async def abort(self, upload: StagedUploadSession | StagedFile) -> None:
|
|
165
|
-
"""Cancel incomplete
|
|
166
|
+
"""Cancel incomplete extension variants; completed staging identities remain untouched (PVD-052)."""
|
|
166
167
|
if isinstance(upload, StagedFile):
|
|
167
168
|
# The completed file keeps this Provider identity private except for same-module cleanup.
|
|
168
169
|
upload_session_id = upload._upload_session_id # pyright: ignore[reportPrivateUsage]
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_uploads_and_literature.py
RENAMED
|
@@ -208,8 +208,14 @@ async def test_stage_single_bytes_creates_session_and_computes_hash(
|
|
|
208
208
|
|
|
209
209
|
|
|
210
210
|
@pytest.mark.asyncio
|
|
211
|
+
@pytest.mark.parametrize(
|
|
212
|
+
("first_filename", "final_filename"), [("paper.pdf", "paper.pdf"), ("paper.P-d_f", "renamed.Pdf")]
|
|
213
|
+
)
|
|
211
214
|
async def test_stage_fragments_sends_acknowledged_offset_and_maps_completion_and_abort(
|
|
212
|
-
provider_session: Session,
|
|
215
|
+
provider_session: Session,
|
|
216
|
+
provider_envelope: Callable[..., dict[str, object]],
|
|
217
|
+
first_filename: str,
|
|
218
|
+
final_filename: str,
|
|
213
219
|
) -> None:
|
|
214
220
|
upload_session = StagedUploadSession(
|
|
215
221
|
binding=UploadBindingRef(uid="lit-binding-123"), upload_session_id="lit-session-123"
|
|
@@ -225,11 +231,13 @@ async def test_stage_fragments_sends_acknowledged_offset_and_maps_completion_and
|
|
|
225
231
|
assert _multipart_value(request, "uid") == "lit-binding-123"
|
|
226
232
|
assert _multipart_value(request, "tempid") == "lit-session-123"
|
|
227
233
|
if request_count == 1:
|
|
234
|
+
assert f'filename="{first_filename}"'.encode() in request.content
|
|
228
235
|
assert _multipart_value(request, "offset") == "0"
|
|
229
236
|
assert _multipart_value(request, "last") == "0"
|
|
230
237
|
assert _multipart_value(request, "file") == _CHUNK_1.decode()
|
|
231
238
|
return Response(200, json=provider_envelope(hash=_HASH_1, tempid="lit-session-123", offset=len(_CHUNK_1)))
|
|
232
239
|
if request_count == 2:
|
|
240
|
+
assert f'filename="{final_filename}"'.encode() in request.content
|
|
233
241
|
assert _multipart_value(request, "offset") == str(len(_CHUNK_1))
|
|
234
242
|
assert _multipart_value(request, "last") == "1"
|
|
235
243
|
assert _multipart_value(request, "hash") == _HASH_FULL
|
|
@@ -239,9 +247,9 @@ async def test_stage_fragments_sends_acknowledged_offset_and_maps_completion_and
|
|
|
239
247
|
json=provider_envelope(
|
|
240
248
|
id=412,
|
|
241
249
|
path="url_eln/temp",
|
|
242
|
-
query=f"h={_HASH_FULL}&id=412&s={len(_FULL_CONTENT)}&f=
|
|
250
|
+
query=f"h={_HASH_FULL}&id=412&s={len(_FULL_CONTENT)}&f={final_filename}",
|
|
243
251
|
name="lit-session-123",
|
|
244
|
-
filename=
|
|
252
|
+
filename=final_filename,
|
|
245
253
|
size=len(_FULL_CONTENT),
|
|
246
254
|
hash=_HASH_FULL,
|
|
247
255
|
future_field=True,
|
|
@@ -254,12 +262,12 @@ async def test_stage_fragments_sends_acknowledged_offset_and_maps_completion_and
|
|
|
254
262
|
async with AsyncClient(base_url="https://matelab.example/api", transport=MockTransport(handler)) as http_client:
|
|
255
263
|
client = AsyncMatelab("https://ignored.example", session=provider_session, http_client=http_client)
|
|
256
264
|
progress = await client.uploads.stage(
|
|
257
|
-
_CHUNK_1, filename=
|
|
265
|
+
_CHUNK_1, filename=first_filename, fragment_size=len(_CHUNK_1), session=upload_session, final=False
|
|
258
266
|
)
|
|
259
267
|
assert isinstance(progress, StagedUploadSession)
|
|
260
268
|
completed = await client.uploads.stage(
|
|
261
269
|
_CHUNK_2,
|
|
262
|
-
filename=
|
|
270
|
+
filename=final_filename,
|
|
263
271
|
fragment_size=len(_CHUNK_2),
|
|
264
272
|
session=progress,
|
|
265
273
|
final=True,
|
|
@@ -120,7 +120,7 @@ wheels = [
|
|
|
120
120
|
|
|
121
121
|
[[package]]
|
|
122
122
|
name = "datamodel-code-generator"
|
|
123
|
-
version = "0.
|
|
123
|
+
version = "0.87.0"
|
|
124
124
|
source = { registry = "https://pypi.org/simple" }
|
|
125
125
|
dependencies = [
|
|
126
126
|
{ name = "argcomplete" },
|
|
@@ -133,9 +133,9 @@ dependencies = [
|
|
|
133
133
|
{ name = "pyyaml" },
|
|
134
134
|
{ name = "typing-extensions" },
|
|
135
135
|
]
|
|
136
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
136
|
+
sdist = { url = "https://files.pythonhosted.org/packages/eb/19/3c2b71dbeea9e50f3d845cdee6aa46ea4629ae5f13ed534d41ef680bc633/datamodel_code_generator-0.87.0.tar.gz", hash = "sha256:fd1404cd3033d63e6c322bce5bd0682699f9597ff4a14fa062620121651f850c", size = 7713321, upload-time = "2026-10-28T14:43:54.467Z" }
|
|
137
137
|
wheels = [
|
|
138
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
138
|
+
{ url = "https://files.pythonhosted.org/packages/87/97/13e9f23c875318189a1a7551925194ee9dc22499c2dbf93d56a646d26ca6/datamodel_code_generator-0.87.0-py3-none-any.whl", hash = "sha256:657f162c1a72881b14dc699e80a9c877975d825dfcb1e8823c75b65e869e1305", size = 1992519, upload-time = "2026-10-28T14:43:52.459Z" },
|
|
139
139
|
]
|
|
140
140
|
|
|
141
141
|
[[package]]
|
|
@@ -158,7 +158,7 @@ wheels = [
|
|
|
158
158
|
|
|
159
159
|
[[package]]
|
|
160
160
|
name = "hatchling"
|
|
161
|
-
version = "1.
|
|
161
|
+
version = "1.33.0"
|
|
162
162
|
source = { registry = "https://pypi.org/simple" }
|
|
163
163
|
dependencies = [
|
|
164
164
|
{ name = "packaging" },
|
|
@@ -167,27 +167,27 @@ dependencies = [
|
|
|
167
167
|
{ name = "tomlkit" },
|
|
168
168
|
{ name = "trove-classifiers" },
|
|
169
169
|
]
|
|
170
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
170
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7a/f1/e47b937226ae3b093bbd0132eb0b7ee5bfad12c2b5324afd10ae49946b05/hatchling-1.33.0.tar.gz", hash = "sha256:4c422bd4d554fcff5de5b73e9596f85e41e9f97f7e553d8f7595ecb31a627bef", size = 58079, upload-time = "2026-10-28T02:27:30.694Z" }
|
|
171
171
|
wheels = [
|
|
172
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
172
|
+
{ url = "https://files.pythonhosted.org/packages/32/64/4afe5dd77b2939a93e8c9513f8082dbd049ecba9c1484a379a0f6ae29d6b/hatchling-1.33.0-py3-none-any.whl", hash = "sha256:415290b84f464d2884303fca8974d38e7b85579069fab02a15db0828fbb1446d", size = 78750, upload-time = "2026-10-28T02:27:29.033Z" },
|
|
173
173
|
]
|
|
174
174
|
|
|
175
175
|
[[package]]
|
|
176
176
|
name = "httpcore2"
|
|
177
|
-
version = "2.
|
|
177
|
+
version = "2.16.0"
|
|
178
178
|
source = { registry = "https://pypi.org/simple" }
|
|
179
179
|
dependencies = [
|
|
180
180
|
{ name = "h11" },
|
|
181
181
|
{ name = "truststore" },
|
|
182
182
|
]
|
|
183
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
183
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c0/61/afa9d6b7452f9eca73f73d45324eb0bb52f098fd5e6049bf6b8263be9b4e/httpcore2-2.16.0.tar.gz", hash = "sha256:c72cd0413563b17e1cd8354677dff887466f8ec2551679759e93126534428643", size = 69886, upload-time = "2026-10-21T07:09:45.31Z" }
|
|
184
184
|
wheels = [
|
|
185
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
185
|
+
{ url = "https://files.pythonhosted.org/packages/af/c2/ce417c397afa5181f0e3c6ff01a4d01639414e1adef08730d97571297151/httpcore2-2.16.0-py3-none-any.whl", hash = "sha256:5c4358319f2602d984ad93182c9fee5160f22e9da7babdda870a5e7c4e2dc34f", size = 85070, upload-time = "2026-10-21T07:09:42.802Z" },
|
|
186
186
|
]
|
|
187
187
|
|
|
188
188
|
[[package]]
|
|
189
189
|
name = "httpx2"
|
|
190
|
-
version = "2.
|
|
190
|
+
version = "2.16.0"
|
|
191
191
|
source = { registry = "https://pypi.org/simple" }
|
|
192
192
|
dependencies = [
|
|
193
193
|
{ name = "anyio", marker = "sys_platform != 'emscripten'" },
|
|
@@ -197,9 +197,9 @@ dependencies = [
|
|
|
197
197
|
{ name = "truststore", marker = "sys_platform != 'emscripten'" },
|
|
198
198
|
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
|
199
199
|
]
|
|
200
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
200
|
+
sdist = { url = "https://files.pythonhosted.org/packages/43/73/5ca2cedf5e4e50423d1c258877865a6b62793633b561c58499f8aeb33b7e/httpx2-2.16.0.tar.gz", hash = "sha256:0d54c98128e8f2ff7fbbde0fca8c359e5f032edeaaaac443cdb7f31f685bcd7f", size = 103116, upload-time = "2026-10-21T07:09:46.348Z" }
|
|
201
201
|
wheels = [
|
|
202
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
202
|
+
{ url = "https://files.pythonhosted.org/packages/7b/3d/2e4bc4fd1ef9770871669adb348d612a6e4786b303a23f9935b81c48dd60/httpx2-2.16.0-py3-none-any.whl", hash = "sha256:fd2c5d7909e8d86fe92d53020c310ca0e4e431b838c207c5754b9bbf0308d49a", size = 97880, upload-time = "2026-10-21T07:09:44.01Z" },
|
|
203
203
|
]
|
|
204
204
|
|
|
205
205
|
[[package]]
|
|
@@ -222,15 +222,16 @@ wheels = [
|
|
|
222
222
|
|
|
223
223
|
[[package]]
|
|
224
224
|
name = "inflect"
|
|
225
|
-
version = "7.
|
|
225
|
+
version = "7.6.0"
|
|
226
226
|
source = { registry = "https://pypi.org/simple" }
|
|
227
227
|
dependencies = [
|
|
228
|
+
{ name = "jaraco-functools" },
|
|
228
229
|
{ name = "more-itertools" },
|
|
229
230
|
{ name = "typeguard" },
|
|
230
231
|
]
|
|
231
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
232
|
+
sdist = { url = "https://files.pythonhosted.org/packages/9b/4e/2836918b501ac34bf42c14dabc039ed83ce8a81bb5711e3ee4f526deedce/inflect-7.6.0.tar.gz", hash = "sha256:b46875b50534a7cd5fcfb5a7c971bb93fe68948c43ca53e9833bd1e1a69221bd", size = 83035, upload-time = "2026-10-21T18:03:37.146Z" }
|
|
232
233
|
wheels = [
|
|
233
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
234
|
+
{ url = "https://files.pythonhosted.org/packages/d6/b1/819d4158942c33d7eaa241c5d2e49ece9825dc4a8d0c72e8edd2813c0dd1/inflect-7.6.0-py3-none-any.whl", hash = "sha256:9fefad5c0c174d8a38f8c33d3033817e38fca8475f7f226c62efc39d46c83e8a", size = 37777, upload-time = "2026-10-21T18:03:35.928Z" },
|
|
234
235
|
]
|
|
235
236
|
|
|
236
237
|
[[package]]
|
|
@@ -251,6 +252,18 @@ wheels = [
|
|
|
251
252
|
{ url = "https://files.pythonhosted.org/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733, upload-time = "2026-02-28T10:08:19.466Z" },
|
|
252
253
|
]
|
|
253
254
|
|
|
255
|
+
[[package]]
|
|
256
|
+
name = "jaraco-functools"
|
|
257
|
+
version = "4.6.0"
|
|
258
|
+
source = { registry = "https://pypi.org/simple" }
|
|
259
|
+
dependencies = [
|
|
260
|
+
{ name = "more-itertools" },
|
|
261
|
+
]
|
|
262
|
+
sdist = { url = "https://files.pythonhosted.org/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz", hash = "sha256:880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280", size = 20837, upload-time = "2026-07-14T01:28:02.544Z" }
|
|
263
|
+
wheels = [
|
|
264
|
+
{ url = "https://files.pythonhosted.org/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl", hash = "sha256:99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30", size = 11677, upload-time = "2026-07-14T01:28:01.59Z" },
|
|
265
|
+
]
|
|
266
|
+
|
|
254
267
|
[[package]]
|
|
255
268
|
name = "jinja2"
|
|
256
269
|
version = "3.1.6"
|
|
@@ -420,7 +433,7 @@ wheels = [
|
|
|
420
433
|
|
|
421
434
|
[[package]]
|
|
422
435
|
name = "matelab-python-sdk"
|
|
423
|
-
version = "0.2.
|
|
436
|
+
version = "0.2.0a8"
|
|
424
437
|
source = { editable = "." }
|
|
425
438
|
dependencies = [
|
|
426
439
|
{ name = "httpx2" },
|
|
@@ -443,7 +456,7 @@ dev = [
|
|
|
443
456
|
|
|
444
457
|
[package.metadata]
|
|
445
458
|
requires-dist = [
|
|
446
|
-
{ name = "httpx2", specifier = ">=2.
|
|
459
|
+
{ name = "httpx2", specifier = ">=2.16.0" },
|
|
447
460
|
{ name = "jsonschema", specifier = ">=4.26.0" },
|
|
448
461
|
{ name = "pydantic", specifier = ">=2.14.1" },
|
|
449
462
|
{ name = "typing-extensions", specifier = ">=4.16.0" },
|
|
@@ -452,13 +465,13 @@ requires-dist = [
|
|
|
452
465
|
[package.metadata.requires-dev]
|
|
453
466
|
dev = [
|
|
454
467
|
{ name = "basedpyright", specifier = ">=1.40.2" },
|
|
455
|
-
{ name = "datamodel-code-generator", specifier = ">=0.
|
|
456
|
-
{ name = "hatchling", specifier = ">=1.
|
|
468
|
+
{ name = "datamodel-code-generator", specifier = ">=0.87.0" },
|
|
469
|
+
{ name = "hatchling", specifier = ">=1.33.0" },
|
|
457
470
|
{ name = "nodejs-wheel-binaries", specifier = "==22.20.0" },
|
|
458
|
-
{ name = "pytest", specifier = ">=9.
|
|
459
|
-
{ name = "pytest-asyncio", specifier = ">=1.4.
|
|
471
|
+
{ name = "pytest", specifier = ">=9.2.0" },
|
|
472
|
+
{ name = "pytest-asyncio", specifier = ">=1.4.1" },
|
|
460
473
|
{ name = "pyyaml", specifier = ">=6.0.3" },
|
|
461
|
-
{ name = "ruff", specifier = ">=0.17.
|
|
474
|
+
{ name = "ruff", specifier = ">=0.17.3" },
|
|
462
475
|
]
|
|
463
476
|
|
|
464
477
|
[[package]]
|
|
@@ -515,11 +528,11 @@ wheels = [
|
|
|
515
528
|
|
|
516
529
|
[[package]]
|
|
517
530
|
name = "platformdirs"
|
|
518
|
-
version = "4.
|
|
531
|
+
version = "4.14.0"
|
|
519
532
|
source = { registry = "https://pypi.org/simple" }
|
|
520
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
533
|
+
sdist = { url = "https://files.pythonhosted.org/packages/40/28/1c058a9143d2304b3078f8dadcbb9dc27f7d3581b5d05157c84869c4cc0d/platformdirs-4.14.0.tar.gz", hash = "sha256:83f009c1e8c5fc36869b5171755b291887bd2cade7965233cdfabd23d754720b", size = 70387, upload-time = "2026-10-28T18:27:30.973Z" }
|
|
521
534
|
wheels = [
|
|
522
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
535
|
+
{ url = "https://files.pythonhosted.org/packages/69/2b/887969ef4bb53e0cb271dc7c3f4a73d50c5d58bb88aeaae311e3340cd57e/platformdirs-4.14.0-py3-none-any.whl", hash = "sha256:1dadfc59a8a5d7565b3d9270ae8fa71c065595352c4277b41c11ee6c222c4b91", size = 35259, upload-time = "2026-10-28T18:27:29.659Z" },
|
|
523
536
|
]
|
|
524
537
|
|
|
525
538
|
[[package]]
|
|
@@ -690,7 +703,7 @@ wheels = [
|
|
|
690
703
|
|
|
691
704
|
[[package]]
|
|
692
705
|
name = "pytest"
|
|
693
|
-
version = "9.
|
|
706
|
+
version = "9.2.0"
|
|
694
707
|
source = { registry = "https://pypi.org/simple" }
|
|
695
708
|
dependencies = [
|
|
696
709
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
@@ -699,22 +712,22 @@ dependencies = [
|
|
|
699
712
|
{ name = "pluggy" },
|
|
700
713
|
{ name = "pygments" },
|
|
701
714
|
]
|
|
702
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
715
|
+
sdist = { url = "https://files.pythonhosted.org/packages/79/42/bb4641652e58dedeac2ec51abc1f8cae4fee4ec63899a0999016229a0f2a/pytest-9.2.0.tar.gz", hash = "sha256:97c4f3b1f3c7414aa36465e09b8220f1d03627993bd51b1282e193753c80557b", size = 1797555, upload-time = "2026-10-27T21:30:20.728Z" }
|
|
703
716
|
wheels = [
|
|
704
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
717
|
+
{ url = "https://files.pythonhosted.org/packages/51/39/1f5d8c8877a0fa327db959c19341d4be61660de1ab6b7391f9eb805bcd67/pytest-9.2.0-py3-none-any.whl", hash = "sha256:07acdcf88ec174f907dc01af70bf52d49b014bbab03faeeade31c96b18c2e588", size = 411776, upload-time = "2026-10-27T21:30:19.131Z" },
|
|
705
718
|
]
|
|
706
719
|
|
|
707
720
|
[[package]]
|
|
708
721
|
name = "pytest-asyncio"
|
|
709
|
-
version = "1.4.
|
|
722
|
+
version = "1.4.1"
|
|
710
723
|
source = { registry = "https://pypi.org/simple" }
|
|
711
724
|
dependencies = [
|
|
712
725
|
{ name = "pytest" },
|
|
713
726
|
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
|
714
727
|
]
|
|
715
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
728
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f8/9a/887535e477847f5159377ab35303923644840b13c0ca03c0a467f84d4680/pytest_asyncio-1.4.1.tar.gz", hash = "sha256:e8266eb094e5ee9ffdb2068c9836f33e209ea77a970eb846933d416b5602669b", size = 145237, upload-time = "2026-10-25T21:05:37.135Z" }
|
|
716
729
|
wheels = [
|
|
717
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
730
|
+
{ url = "https://files.pythonhosted.org/packages/46/d7/cd9e2708afdbf059658adaf08bdb0792ca52489871051d6ce7d498b51277/pytest_asyncio-1.4.1-py3-none-any.whl", hash = "sha256:507afa78ec77c6661164ef1a2368bc7820383fd1a14b2a7f813de8b5a92949cc", size = 17061, upload-time = "2026-10-25T21:05:35.473Z" },
|
|
718
731
|
]
|
|
719
732
|
|
|
720
733
|
[[package]]
|
|
@@ -957,27 +970,27 @@ wheels = [
|
|
|
957
970
|
|
|
958
971
|
[[package]]
|
|
959
972
|
name = "ruff"
|
|
960
|
-
version = "0.17.
|
|
973
|
+
version = "0.17.3"
|
|
961
974
|
source = { registry = "https://pypi.org/simple" }
|
|
962
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
975
|
+
sdist = { url = "https://files.pythonhosted.org/packages/59/73/81f140c4edd9cc323de5478e6bbd3bbcfae9a82692df1a258de8cec6a6d2/ruff-0.17.3.tar.gz", hash = "sha256:a57049c8addb3662073859bb55a7ad35aa54f8a7c9ed268911d1333c5aadaaa9", size = 5339444, upload-time = "2026-10-27T00:34:05.914Z" }
|
|
963
976
|
wheels = [
|
|
964
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
965
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
966
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
967
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
968
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
969
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
970
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
971
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
972
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
973
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
974
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
975
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
976
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
977
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
978
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
979
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
980
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
977
|
+
{ url = "https://files.pythonhosted.org/packages/9e/8c/083365310c4e79c842f25bf5a842facbd9b0c0ec336f96dffa5074fe723d/ruff-0.17.3-py3-none-linux_armv6l.whl", hash = "sha256:ab86b84cd9d05e56d329742c0cabdcbe2d1d56c98f4a04aab9b5b66196febfb4", size = 10216522, upload-time = "2026-10-27T00:33:29.822Z" },
|
|
978
|
+
{ url = "https://files.pythonhosted.org/packages/72/26/4b2edf31cfebe9605d8f6ed8f1d6f376d3a53d4c9a123e62661c64c440f0/ruff-0.17.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e407b4a6852853a9a2cdce96963e94ad9775578bb44e7561a0f2829f3cc04b11", size = 10217786, upload-time = "2026-10-27T00:33:33.949Z" },
|
|
979
|
+
{ url = "https://files.pythonhosted.org/packages/a2/7e/537aba4b7f54397a374d2f6a6fc93e9c8015e18553f31a4a7b7dbced48b5/ruff-0.17.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b75cc113b3aca388933d8296b667b1ac401a80317ea3074c9b0a66541199da29", size = 9440362, upload-time = "2026-10-27T00:33:35.784Z" },
|
|
980
|
+
{ url = "https://files.pythonhosted.org/packages/3d/66/283e39734f66c8a5ebaa93c22eb7b7515779a0b1d5a5c0ad20e05c0edb41/ruff-0.17.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab5fa7ed5ce18554ea69d850ad162cbaa0c85fc47c08d83a569f806681c9a6ad", size = 10094281, upload-time = "2026-10-27T00:33:38.216Z" },
|
|
981
|
+
{ url = "https://files.pythonhosted.org/packages/21/4c/1ffc768497bd025a32c72152771e40c0b99bddc5cc6e4f50c7949a395346/ruff-0.17.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c673c170e27834d1262e3a9c1e97bdc9b9c3b180c63d89173ce69747232474c1", size = 10022543, upload-time = "2026-10-27T00:33:40.181Z" },
|
|
982
|
+
{ url = "https://files.pythonhosted.org/packages/73/c3/f90db547301080fcb82c92abf914c8bd57b89911d9b65a6c4cc6b52d0635/ruff-0.17.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a754c0341bc9ca151b7b335988b3263921c08859f84ca219b70cee825571b6f", size = 10683921, upload-time = "2026-10-27T00:33:42.182Z" },
|
|
983
|
+
{ url = "https://files.pythonhosted.org/packages/e5/98/92d4a8a26c6c96cf1a5b34dd59036d8a71e52d650aab065c58867e964e63/ruff-0.17.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4590b9d86c0b1543ebb09094254e191cd43fe8edaf330baa035aab03da251532", size = 11373408, upload-time = "2026-10-27T00:33:44.19Z" },
|
|
984
|
+
{ url = "https://files.pythonhosted.org/packages/43/02/1f24d2e3064c9753926deeb901afa57777b37ee46799b09ddd7aee6e5145/ruff-0.17.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbde18beccd98c29a227c63c99022e3443b99258e08326df6425dfe0443705ef", size = 10977469, upload-time = "2026-10-27T00:33:46.179Z" },
|
|
985
|
+
{ url = "https://files.pythonhosted.org/packages/f0/20/fecedea2209f574ab92033b344e01a7f0c2dc76c6d6d19a14c9f8141173f/ruff-0.17.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fa4b0f931cdbcb8a52044f370a3eb429fb42eb88807b0e800fcaa98dd42b24e", size = 10577491, upload-time = "2026-10-27T00:33:48.233Z" },
|
|
986
|
+
{ url = "https://files.pythonhosted.org/packages/33/36/b93fdf0bc6f84f0cd487aadfb0354deb40013669ea35ac3d26855de1e959/ruff-0.17.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:39405f341deec934b4289634324ad695f72df2970f9121582872eaf5b722f0f5", size = 10608748, upload-time = "2026-10-27T00:33:50.284Z" },
|
|
987
|
+
{ url = "https://files.pythonhosted.org/packages/5d/b7/7d3f5f14145daead1efb0b9a8289ed1daa100f419d60774375951723ce00/ruff-0.17.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68074094f55ca3d29ab19491f640282f7a84061c4c7977aa5094b968ca457e9a", size = 10075057, upload-time = "2026-10-27T00:33:52.074Z" },
|
|
988
|
+
{ url = "https://files.pythonhosted.org/packages/b0/ed/93ff7a5909ee56e2bd4b982deae9e0efb2724417874a90c9e41ad66c6dd7/ruff-0.17.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:27bb571ac78fef178fe5118d2827df95c2aae74a48fff2b15f6acd03af5ff5bb", size = 10022431, upload-time = "2026-10-27T00:33:54.061Z" },
|
|
989
|
+
{ url = "https://files.pythonhosted.org/packages/9b/07/a83b9eeec8c1c3c0e4eda15f06c3a91001bfd2687ea2f07b750719bf9712/ruff-0.17.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:029c37cbd3de48ca37aa12117bead2d065f15da17d66bf84e0d4274013705db2", size = 10394903, upload-time = "2026-10-27T00:33:56.158Z" },
|
|
990
|
+
{ url = "https://files.pythonhosted.org/packages/af/b2/05c39857c2526fcbebe46ad93a8dc97424656dfef14d3ef933abe1ffd331/ruff-0.17.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:692fdb46d0fd9c71e380947dc5fc72f2c3f881073bc1f739e4579376231affbe", size = 10799780, upload-time = "2026-10-27T00:33:58.204Z" },
|
|
991
|
+
{ url = "https://files.pythonhosted.org/packages/ec/d9/47171a16739eb7a353936b31c20cf54340531e68c9af7d72fd7a784e235d/ruff-0.17.3-py3-none-win32.whl", hash = "sha256:46539cb031b01fd29ae0a02142483c46640b233ee12bb1c1b690bffa1555d5ca", size = 9908481, upload-time = "2026-10-27T00:34:00.087Z" },
|
|
992
|
+
{ url = "https://files.pythonhosted.org/packages/d0/a0/f08c1631bfd81faa6a90eaf70c37c786c11bed2046302b56bb506c25e1a0/ruff-0.17.3-py3-none-win_amd64.whl", hash = "sha256:56b8ffb3f3b3cbccb8b76b71b38261b7ed982ef5d20f5b447b1b61a7f4949b24", size = 10341333, upload-time = "2026-10-27T00:34:02.099Z" },
|
|
993
|
+
{ url = "https://files.pythonhosted.org/packages/99/d5/4ad4ed31413c301430918e70d3d38ae6f097af0766cb9ab8c9d502b2a4d6/ruff-0.17.3-py3-none-win_arm64.whl", hash = "sha256:81fce74bcd6be0e9da7c67c7553fd0f1f12964a2052cd728ef917b937a5ca1d9", size = 9854332, upload-time = "2026-10-27T00:34:03.847Z" },
|
|
981
994
|
]
|
|
982
995
|
|
|
983
996
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/scripts/check_installed_package.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/_generated/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/_attachment_content.py
RENAMED
|
File without changes
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/src/matelab/domains/cloud_drive.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/provider/test_provider_smoke.py
RENAMED
|
File without changes
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_async_attachment_upload.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matelab_python_sdk-0.2.0a7 → matelab_python_sdk-0.2.0a8}/tests/test_comments_and_downloads.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|