Python SDK for the eTiKeT platform
Project description
eTiKeT SDK
Python SDK for the eTiKeT platform. The Sync Agent runs as a background service on your computer, automatically synchronizing your experimental data to qHarbor. This SDK allows you to easily interact with the Sync Agent and manage your sync sources.
Installation
pip install etiket-sdk
Sync Agent
The SyncAgent class provides methods to check the status of the background sync service, start and stop it, and view recent errors. For more information about debugging, see the Debugging section.
Checking Status
from etiket_sdk.sync import SyncAgent
# Get the current status
status = SyncAgent.status()
print(status)
Output:
Sync Agent Status:
Agent Service: running
API Service: running
Agent Status: running
Iterations: 142
Last Update: 2025-12-16 10:30:00
The status shows:
- Agent Service: Whether the sync agent service is installed and running
- API Service: Whether the sync API service is running (the service that allows the SDK to interact with the Sync Agent)
- Agent Status: Current state (
running,stopped,no_connection,unavailable). When the sync agent is not running, the API service is not available. - Iterations: Number of sync cycles completed
- Last Update: When the status was last updated
Starting and Stopping
# Stop the sync agent
SyncAgent.stop()
# Start the sync agent
SyncAgent.start()
Viewing Errors
If sync isn't working, check for agent-level errors. Note: always check the timestamps to see if errors are recent.
# Get recent errors
errors = SyncAgent.errors()
for error in errors:
print(error)
# Or fetch only the unread inbox
unread = SyncAgent.errors(viewed=False)
Errors carry a viewed flag so you can acknowledge what you've already triaged:
# Mark a single error as viewed (or unviewed)
unread[0].mark_viewed()
# Bulk-acknowledge — returns the count of rows actually flipped
flipped = SyncAgent.mark_all_errors_viewed()
These are system-level errors that block sync from running entirely (e.g., not logged in, no network connection).
Sync Sources
A Sync Source defines where data comes from and how it should be synchronized. Each source uses a backend that knows how to read data from a specific format (e.g., QCoDeS, Quantify, or a folder of files).
Listing Sources
from etiket_sdk.sync import SyncSources
# List all configured sync sources
sources = SyncSources.list()
print(sources)
Output:
['QH datasets' (backend='etiket_sync_agent_native'), 'my_sync_source' (backend='etiket_sync_agent_folderbase')]
This lists all configured sync sources. Use SyncSources.get(name) to get full details for a specific source.
Getting Source Details
# Get a specific source by name
source = SyncSources.get("my_sync_source")
print(source)
Output:
SyncSource: my_sync_source
id: 2
backend: etiket_sync_agent_folderbase
status: scanning
items: 28/28 synced, 0 failed
last_update: 2025-12-15 14:54:00
The output shows sync progress at a glance.
Viewing Source Errors
When the sync source is unable to run because of an error, the status will be error. You can fetch and view errors for a source:
source = SyncSources.get("my_source")
source.print_errors()
# Filter by viewed flag — pass viewed=False to print only unread errors
source.print_errors(viewed=False)
Errors carry a viewed flag so you can acknowledge what you've already triaged:
unread = source.errors(viewed=False)
unread[0].mark_viewed() # mark one
unread[0].mark_viewed(viewed=False) # un-view if you change your mind
# Bulk-acknowledge — returns the count of rows actually flipped
flipped = source.mark_all_errors_viewed()
Listing Available Backends
Before creating a source, see what backends are available:
# List backend identifiers
print(SyncSources.backends())
# ['etiket_sync_agent_folderbase', 'etiket_sync_agent_quantify', 'etiket_sync_agent_qcodes', ...]
# Get details for a specific backend
backend = SyncSources.backend("etiket_sync_agent_folderbase")
print(backend)
Generating a Create Example
Each backend can generate a copy-paste ready example:
SyncSources.backend("etiket_sync_agent_folderbase").example()
Output:
# Copy-paste this example to create a sync source:
SyncSources.create(
name="my_folderbase_source",
backend_identifier="etiket_sync_agent_folderbase",
config_data={
"root_directory": "<path to folder>",
"is_server_folder": False,
},
)
Creating a Sync Source
from etiket_sdk.sync import SyncSources
source = SyncSources.create(
name="my_folderbase_source",
backend_identifier="etiket_sync_agent_folderbase",
config_data={
"root_directory": "~/Downloads/MyData",
"is_server_folder": False,
},
default_scope="6c319227-f6f8-4bc6-b7f9-ed278a8fb040",
)
Scope Options:
The default_scope and autoassign_scope_mapping options depend on the backend:
-
Required default scope (e.g., FolderBase): The
default_scopemust be provided. All items sync to this scope. -
Optional/No default scope (e.g., core_tools, QCoDeS): Items may have scope identifiers that need to be mapped to scopes. Use
autoassign_scope_mapping=Trueto automatically match identifiers to scope names:
source = SyncSources.create(
name="my_coretools_source",
backend_identifier="etiket_sync_agent_coretools",
config_data={"db_path": "/path/to/db"},
autoassign_scope_mapping=True, # auto-map identifiers to scopes
)
See Scope Mappings for more details on managing scope mappings.
Updating a Sync Source
source = SyncSources.get("my_source")
# Rename a source
source.update(rename_to="new_name")
# Update configuration
source.update(config_data={"is_server_folder": True})
Note: Some configuration changes may require a sync agent restart to take effect.
Deleting a Sync Source
source = SyncSources.get("my_source")
source.delete()
Source Ownership
Some backends (e.g. those that need a per-user API token to upload) attach an owner to each sync source — that's the user whose stored credentials get used for uploads. You can check, claim, or release ownership from the SDK:
source = SyncSources.get("my_source")
print(source.owner) # the current owner's user_sub, or None
# Claim ownership for the currently logged-in user.
source.take_ownership()
# Release current ownership.
source.release_ownership()
release_ownership() is idempotent — calling it on an already-unowned source is a no-op. Backends that don't have an owner concept (e.g. etiket_sync_agent_native) will reject take_ownership() with SyncSourceBackendHasNoOwner:
from etiket_sdk.sync import SyncSourceBackendHasNoOwner
try:
source.take_ownership()
except SyncSourceBackendHasNoOwner:
print("This backend doesn't support per-user ownership")
Starting and Stopping Sync Sources
You can pause and resume individual sync sources without affecting others:
source = SyncSources.get("my_source")
# Stop a running sync source
source.stop()
# Start a stopped sync source
source.start()
Status transitions:
- Start: Changes status from
stoppedorerrortosyncing. RaisesSyncSourceAlreadyRunningif the source is alreadysyncingorscanning. - Stop: Changes status from
syncing,scanning, orerrortostopped. RaisesSyncSourceAlreadyStoppedif the source is alreadystopped.
from etiket_sdk.sync import (
SyncSourceAlreadyRunning,
SyncSourceAlreadyStopped,
)
source = SyncSources.get("my_source")
try:
source.start()
except SyncSourceAlreadyRunning:
print("Source is already running!")
try:
source.stop()
except SyncSourceAlreadyStopped:
print("Source is already stopped!")
Resetting Sync Items
If many items have failed and you want to retry them all at once (instead of resetting each individually), you can reset all failed sync items for a source:
source = SyncSources.get("my_source")
# Reset only failed items (retry them)
count = source.reset_sync_items()
print(f"Reset {count} failed items")
# Reset ALL items (including successful ones, forcing re-sync)
count = source.reset_sync_items(include_successful=True)
print(f"Reset {count} items")
This is useful when:
- Multiple items failed due to a temporary issue (e.g. permissions, ...)
- You need to re-sync everything after changing the default scope
- You want to force a full re-sync of all data
Reporting Errors
If something isn't working, you can send an error report to qHarbor support:
source = SyncSources.get("my_source")
source.report_error("Sync keeps failing with permission denied")
Scope Mappings
For sync sources that don't have a required default scope (like core_tools), sync items may have scope identifiers (project names, etc.) that need to be mapped to specific scopes in qHarbor. This allows items from different folders to be synced to different scopes.
Note: If your sync source has a required default scope, all items are synced to that scope and mappings are not needed.
Enabling Auto-Assign:
When creating or updating a sync source, you can enable automatic scope mapping. When enabled, the sync agent will automatically create mappings for identifiers that match exactly one scope name (case-insensitive):
# Enable auto-assign when creating a source
source = SyncSources.create(
name="my_source",
backend_identifier="etiket_sync_agent_folderbase",
config_data={"root_directory": "/data", "is_server_folder": False},
autoassign_scope_mapping=True, # Enable automatic scope mapping
)
# Or enable it on an existing source
source = SyncSources.get("my_source")
source.update(autoassign_scope_mapping=True)
Viewing Current Mappings:
source = SyncSources.get("my_source")
# View existing mappings
for mapping in source.scope_mappings:
print(f"{mapping.scope_identifier} -> {mapping.scope_uuid}")
# Check how many items need mapping
print(f"Items needing mapping: {source.items_unmapped_scope_count}")
Finding Unmapped Identifiers:
source = SyncSources.get("my_source")
unmapped = source.unmapped_identifiers()
print(f"Need mapping: {unmapped}")
# ['scope_A', 'scope_B', ...]
Manual Auto-Assign:
If autoassign_scope_mapping is not enabled on the source, you can manually trigger auto-assignment. This creates mappings for identifiers that match exactly one scope name (case-insensitive):
source = SyncSources.get("my_source")
count = source.autoassign_mappings()
print(f"Created {count} mappings automatically")
Note: When
autoassign_scope_mapping=Trueis set on the sync source, this happens automatically during each sync cycle, so manual calls are not needed.
Manual Mapping Management:
For identifiers that don't match a scope name or match multiple scopes, you can create mappings manually:
import uuid
source = SyncSources.get("my_source")
# Create a new mapping
source.create_mapping(
scope_identifier="scope_A",
scope_uuid=uuid.UUID("12345678-1234-1234-1234-123456789abc"),
)
# Update an existing mapping
source.update_mapping(
scope_identifier="scope_A",
scope_uuid=uuid.UUID("87654321-4321-4321-4321-cba987654321"),
)
# Delete a mapping
source.delete_mapping(scope_identifier="scope_A")
Handling Mapping Errors:
from etiket_sdk.sync import (
ScopeMappingNotFound,
ScopeMappingAlreadyExists,
ScopeMappingInvalidScope,
)
source = SyncSources.get("my_source")
try:
source.create_mapping("scope_A", some_uuid)
except ScopeMappingAlreadyExists:
print("Mapping already exists - use update_mapping instead")
except ScopeMappingInvalidScope:
print("The target scope UUID doesn't exist")
Sync Items
A Sync Item represents a single dataset that needs to be synchronized. Sync items are automatically created when the sync agent scans your sources.
Listing Items
from etiket_sdk.sync import SyncSources
source = SyncSources.get("my_source")
# List all items for a source
items = source.items()
for item in items:
print(item)
# Filter by sync status
failed_items = source.items(is_synchronized=False)
# Search by data identifier
items = source.items(query="measurement_2024")
Getting Item Details
source = SyncSources.get("my_source")
# Get a specific item by ID
item = source.item(123)
print(item)
# View the sync record with detailed logs
print(item.sync_record)
Prioritizing an Item
If you need an item to sync immediately:
source = SyncSources.get("my_source")
item = source.item(123)
item.prioritize()
Resetting a Failed Item
If an item failed and you want to retry:
source = SyncSources.get("my_source")
item = source.item(123)
item.reset()
This clears the attempt counter and marks it for retry.
Reporting Errors
source = SyncSources.get("my_source")
item = source.item(123)
item.report_error("This file keeps failing to upload")
Backends
In the Sync Sources section, we used backends to create sync sources. The Backends class lets you manage installed backend packages — install new ones, update existing ones, or uninstall them.
Backends are implementations that know how to synchronize data from specific data acquisition software. We provide pre-built backends for popular packages:
| Backend | Package | Description |
|---|---|---|
etiket_sync_agent_qcodes |
QCoDeS | Sync QCoDeS datasets |
etiket_sync_agent_quantify |
Quantify | Sync Quantify datasets |
etiket_sync_agent_labber |
Labber | Sync Labber log files |
etiket_sync_agent_coretools |
Core Tools | Sync Core Tools datasets |
etiket_sync_agent_folderbase |
FolderBase | Sync files from a folder |
Installing Backends
from etiket_sdk.sync import Backends
# List installed backends
print(Backends.list())
# Get a specific backend and print its details
backend = Backends.get("etiket_sync_agent_qcodes")
print(backend)
# Install from PyPI
Backends.install_from_pypi("etiket-sync-agent-qcodes")
# Install a specific version
Backends.install_from_pypi("qcodes", version="0.45.0")
# Install from local development path
Backends.install_from_local("/path/to/my-backend")
# Install in editable mode (for development)
Backends.install_from_local("/path/to/my-backend", editable=True)
# Update a backend
Backends.update_from_pypi("etiket-sync-agent-qcodes")
# Uninstall a backend
Backends.uninstall("etiket_sync_agent_qcodes")
You can also create your own backends. See the Backend Development Guide for more information.
Converters
Converters automatically transform files from one format to another during sync. For example, you can convert CSV files to HDF5 so they can be plotted automatically in qHarbor.
Converters are supported when using the FolderBase backend.
Installing Converters
from etiket_sdk.sync import Converters
# List installed converters
print(Converters.list())
# Get a specific converter and print its details
converter = Converters.get("my_converter")
print(converter)
# Install from PyPI
Converters.install_from_pypi("my-converter-package")
# Install from local development path
Converters.install_from_local("/path/to/my-converter")
# Update a converter
Converters.update_from_pypi("my-converter-package")
# Uninstall a converter
Converters.uninstall("my_converter")
For information on creating your own converters, see the Converter Development Guide.
Debugging
When sync isn't working, errors are caught at three levels. Debug from top to bottom:
1. Sync Agent Errors
These are system-level errors that block sync entirely (e.g., not logged in, no network).
from etiket_sdk.sync import SyncAgent
# Check if the agent is running
status = SyncAgent.status()
print(status)
# If not running or status shows issues, check errors
errors = SyncAgent.errors()
for error in errors:
print(error)
2. Sync Source Errors
These are source-level errors that prevent items from being discovered or processed.
from etiket_sdk.sync import SyncSources
# Check the source status
source = SyncSources.get("my_source")
print(source) # Shows status and item counts
# View recent errors
source.print_errors()
Look for:
- Configuration errors
- Backend connection issues
- Permission problems
3. Sync Item Errors
These are item-level errors that occur while syncing individual items.
from etiket_sdk.sync import SyncSources
source = SyncSources.get("my_source")
# List failed items
failed = source.items(is_synchronized=False)
for item in failed:
print(item)
# Get detailed error info for a specific item
item = source.item(123)
print(item.sync_record) # Shows detailed logs and errors
Debugging Workflow
- Start at the top: Check
SyncAgent.status()— is it running? Any login or network issues? - Check agent errors:
SyncAgent.errors()— any agent-level errors? - Check source status:
SyncSources.get("name")— is the source in an error state? - Check source errors:
source.print_errors()— any configuration issues? - Check failed items:
source.items(is_synchronized=False)— which items failed? - Get item details:
source.item(id).sync_record— what went wrong?
Reporting Issues
If you can't resolve an issue, send an error report to qHarbor support. This sends an automatic email to qHarbor support with error details attached:
# Report agent issues
SyncAgent.report_error("Sync agent keeps crashing on startup")
# Report source issues
source = SyncSources.get("my_source")
source.report_error("Sync keeps failing with permission denied")
# Report item issues
item = source.item(123)
item.report_error("This file always fails to upload")
Admin / Logs
Both local services (sync API and sync agent) write to a rotating log file in the shared data directory. The SDK exposes them via the Logs class so you don't need to know where they live on disk.
from etiket_sdk.admin import Logs, LogService
# Last 500 records of the API service log
for line in Logs.tail(LogService.api, n=500):
print(line)
# Full sync-agent log (current file plus the rotation backup, up to ~20 MB)
all_lines = Logs.tail(LogService.sync_agent, n=-1)
n counts logical records, not physical lines: multi-line entries (e.g. stack traces) come back as a single string with embedded \n, so a tail request will never slice through the middle of a traceback.
Raises LogFileNotFound if the requested service hasn't run yet (its log file doesn't exist on disk).
Configuration
By default, the SDK connects to the local sync service at localhost:10410. You can change this if needed (though this is generally not necessary):
from etiket_sdk._client import EtiketClient
# Configure once at application startup
EtiketClient.configure(base_url="http://my-server:10410")
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file etiket_sdk-0.3.0b1-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 418.5 kB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89bf95c7b0dc0dc6669e8f6b72790baeb1d9186410042da0b5ef4cfaf80314cc
|
|
| MD5 |
c46d8354328d4b4780916728d1c4a46d
|
|
| BLAKE2b-256 |
223627966bb423c1614872bdab5950a47f5a51b64cc7f091ca0762a82f46ff6b
|
File details
Details for the file etiket_sdk-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.4 MB
- Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
afad01a42f2b430475f1f5b54b3476accdbdbf93a9828b0459189618218924c4
|
|
| MD5 |
e5f527bb812244da1466e26e4f48f021
|
|
| BLAKE2b-256 |
c02cf6006aacaf2493434e46db6ac35d244ef72624da80e15a2274ce977dfc72
|
File details
Details for the file etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl
- Upload date:
- Size: 448.7 kB
- Tags: CPython 3.14, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5cbab5a57c21513afab6a0a0b212db4e906251b0c472638ebe3cd5302347eaeb
|
|
| MD5 |
fdfe1b82d3d831b5a17ef3d5af4ed689
|
|
| BLAKE2b-256 |
fd115ba73c206470bfa465b02a6036393457af8d543a228d00466ac2a4596bd8
|
File details
Details for the file etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 417.9 kB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be872a9a425111af11a0ccf581c15b1bbd0d816d185019de5194e091ee19c441
|
|
| MD5 |
482ca619150a47e4d0d2b1bf895e09c5
|
|
| BLAKE2b-256 |
a0613decebfa14d468047c8e78b5e976c121281335d5b4c0b9a5287bfc3cde44
|
File details
Details for the file etiket_sdk-0.3.0b1-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 408.8 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
984bab68e6bd9450d9c0cf6140d642ca6874eb917daa4312270a93934aefb491
|
|
| MD5 |
7783b8df7699fcfca8ff9d0c981cb55e
|
|
| BLAKE2b-256 |
3afe7ffb4a753d13dbdcea17914cf3060e2c53385a012b4382d50063057c87fa
|
File details
Details for the file etiket_sdk-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.4 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6b43b9d13bf3eb6d724ca8e42e471ba3b15df082f75d4e839e331747140426e
|
|
| MD5 |
bd7930154c7a052c2587e2f050cb5e29
|
|
| BLAKE2b-256 |
5a9c0cd49d45d9a3e3fac8bdae83402a60659c99194fad504d95b0c69975a8e9
|
File details
Details for the file etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl
- Upload date:
- Size: 449.6 kB
- Tags: CPython 3.13, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e824fc1a31448e506488210879c17b660224edbeca386dddfbba0629b053f185
|
|
| MD5 |
31f9ac287e0340a769871764934455c4
|
|
| BLAKE2b-256 |
915f0d529d552858de788a9bbbde2c0c3a51c2307433ee56cf02c58ab655567c
|
File details
Details for the file etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 416.1 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3664fae582ee9df1225552b673c70f5fc9c110c3a7b5c640e94211962d5946d2
|
|
| MD5 |
40dcfea9bd3ca6ecd1c753776d0c35f3
|
|
| BLAKE2b-256 |
a69079ce1fc0cf164acec3989bf10449818a7accd32b235ec9dc97bf4adfc021
|
File details
Details for the file etiket_sdk-0.3.0b1-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 421.5 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7345f024204ac32a1b5b1608151905554f2f2c09d34700e0afa8646c6696eb3
|
|
| MD5 |
73886ce0e25fe61fb99a04068fcb8d71
|
|
| BLAKE2b-256 |
e7cd82e39138b31d764687cf4fb2f10a01e91d0130ee5cefa6f0765ed7c0733f
|
File details
Details for the file etiket_sdk-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.6 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
679f86745baae9ca6139f63748265e1b1e2ff051fb02159b0954f7742ac5e93e
|
|
| MD5 |
95081ab03698f6bb3020f44664511a9e
|
|
| BLAKE2b-256 |
9b448d87e3e6500cd86035d938b2c909472760cc8374c64310f018319d3ac711
|
File details
Details for the file etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl
- Upload date:
- Size: 454.6 kB
- Tags: CPython 3.12, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bb25f570d20cbc9ea79db1c13c65a80e6ff26e31692d308b08505d8f9aba347
|
|
| MD5 |
e4b7422929abfade117d1dc234c69631
|
|
| BLAKE2b-256 |
15547f6f6e233291294ab7611abf7d2e99f8eecae0e11ad8590b6b0e73690af8
|
File details
Details for the file etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 423.6 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbbff64dd994ff3e03c546d1cb2e2bc92ada64028015a4598870e7b1d9c7837c
|
|
| MD5 |
3738d583d4dab840574e860b1963477b
|
|
| BLAKE2b-256 |
52b3c82c114f496606e6c8474e0bb4d5c5bd569309efbf76c3c04a16a6b48d53
|
File details
Details for the file etiket_sdk-0.3.0b1-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 422.8 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe5b5720244c55e8926e414e0810f4fb4fbabad28ee9a150093a07723c0d4fee
|
|
| MD5 |
b4eefb582d71cd7705953731cf6ec6d0
|
|
| BLAKE2b-256 |
a1263c3fbce1a4bda51a7936cb43e48254d67212003d4d072259646dee4ff5ee
|
File details
Details for the file etiket_sdk-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.4 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79ac9a0cf67c7f7ae6ea8aae03a2bdc73816663e2587ba4546ff5d364e5751ef
|
|
| MD5 |
f00166c730a062020cd31cc23234a92f
|
|
| BLAKE2b-256 |
f4e58395fbeb1ca1b3fdb5d57df1befb295bec0c3b9bb406d04f79d1e55a2fce
|
File details
Details for the file etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl
- Upload date:
- Size: 451.7 kB
- Tags: CPython 3.11, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
383047d278bb4e5dd4d56149d7e9cb8f75562068cca68f92dd26a6c7f2ab7a96
|
|
| MD5 |
835d786c4a0f7767a2a18b2a3350acd3
|
|
| BLAKE2b-256 |
e9063fee905fcf83fe217cad0e5c57b8f5f997708ec88f1d8f635ed6afa938ac
|
File details
Details for the file etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 428.7 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c2b4bd4fa9836526599c5bc57d5a5b18e64acb9f51abbbf64ec33335efdd50a
|
|
| MD5 |
c5a9977256cc89b45bd0bb2dc2d8862c
|
|
| BLAKE2b-256 |
5c98c24376678957d3db2b1282177920945bfab02a03bc1b97155371111f7949
|
File details
Details for the file etiket_sdk-0.3.0b1-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 423.5 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8595115f6ac824e9261a31f1e0724d1f1fe693d6eb6a6b00453d95a2d8f29c7c
|
|
| MD5 |
64854c25fe9b65133eb58a34377e129e
|
|
| BLAKE2b-256 |
af35ad8e06fe93fa87d9db535376e8c13564885c41c05de0a9e5b045366e333f
|
File details
Details for the file etiket_sdk-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.2 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ad7bde4b07981e0ced7cdb5d77008431c86abef52a8b418c3202152657c7fb28
|
|
| MD5 |
53f238f19038f7740cd719fc9cb3607b
|
|
| BLAKE2b-256 |
ec7fb321a400b864437f595c8e9dcf49f3ce15fd4bfeffa898ee0fe341bcc52d
|
File details
Details for the file etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl
- Upload date:
- Size: 453.2 kB
- Tags: CPython 3.10, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d44bfd17eee62a9ac6cfa25814759c111e3cd0f8033aa7f6513f21b024ba5a80
|
|
| MD5 |
a42026da5b6310fcb662108fbac2be5f
|
|
| BLAKE2b-256 |
6b0cf7093b9e50f23380223c8a6588a34292b3031ccd48de41b1443756836bb7
|
File details
Details for the file etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 431.0 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96a8ae1b2265852e5a2764039354bfc7ff0b4b369f3656d670b46ee1e09a55d8
|
|
| MD5 |
8dd781218f6c860c78ad51546efe3abe
|
|
| BLAKE2b-256 |
c76d62d9b0cabfa116d64fe3406c74c3a770c696f46433e873aab84969cf8c23
|