Skip to main content

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_scope must 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=True to 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 stopped or error to syncing. Raises SyncSourceAlreadyRunning if the source is already syncing or scanning.
  • Stop: Changes status from syncing, scanning, or error to stopped. Raises SyncSourceAlreadyStopped if the source is already stopped.
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=True is 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

  1. Start at the top: Check SyncAgent.status() — is it running? Any login or network issues?
  2. Check agent errors: SyncAgent.errors() — any agent-level errors?
  3. Check source status: SyncSources.get("name") — is the source in an error state?
  4. Check source errors: source.print_errors() — any configuration issues?
  5. Check failed items: source.items(is_synchronized=False) — which items failed?
  6. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

etiket_sdk-0.3.0b1-cp314-cp314-win_amd64.whl (418.5 kB view details)

Uploaded CPython 3.14Windows x86-64

etiket_sdk-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl (448.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl (417.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

etiket_sdk-0.3.0b1-cp313-cp313-win_amd64.whl (408.8 kB view details)

Uploaded CPython 3.13Windows x86-64

etiket_sdk-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl (449.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl (416.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

etiket_sdk-0.3.0b1-cp312-cp312-win_amd64.whl (421.5 kB view details)

Uploaded CPython 3.12Windows x86-64

etiket_sdk-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl (454.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl (423.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

etiket_sdk-0.3.0b1-cp311-cp311-win_amd64.whl (422.8 kB view details)

Uploaded CPython 3.11Windows x86-64

etiket_sdk-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl (451.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl (428.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

etiket_sdk-0.3.0b1-cp310-cp310-win_amd64.whl (423.5 kB view details)

Uploaded CPython 3.10Windows x86-64

etiket_sdk-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl (453.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl (431.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file etiket_sdk-0.3.0b1-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 89bf95c7b0dc0dc6669e8f6b72790baeb1d9186410042da0b5ef4cfaf80314cc
MD5 c46d8354328d4b4780916728d1c4a46d
BLAKE2b-256 223627966bb423c1614872bdab5950a47f5a51b64cc7f091ca0762a82f46ff6b

See more details on using hashes here.

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

File hashes

Hashes for etiket_sdk-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 afad01a42f2b430475f1f5b54b3476accdbdbf93a9828b0459189618218924c4
MD5 e5f527bb812244da1466e26e4f48f021
BLAKE2b-256 c02cf6006aacaf2493434e46db6ac35d244ef72624da80e15a2274ce977dfc72

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 5cbab5a57c21513afab6a0a0b212db4e906251b0c472638ebe3cd5302347eaeb
MD5 fdfe1b82d3d831b5a17ef3d5af4ed689
BLAKE2b-256 fd115ba73c206470bfa465b02a6036393457af8d543a228d00466ac2a4596bd8

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 be872a9a425111af11a0ccf581c15b1bbd0d816d185019de5194e091ee19c441
MD5 482ca619150a47e4d0d2b1bf895e09c5
BLAKE2b-256 a0613decebfa14d468047c8e78b5e976c121281335d5b4c0b9a5287bfc3cde44

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 984bab68e6bd9450d9c0cf6140d642ca6874eb917daa4312270a93934aefb491
MD5 7783b8df7699fcfca8ff9d0c981cb55e
BLAKE2b-256 3afe7ffb4a753d13dbdcea17914cf3060e2c53385a012b4382d50063057c87fa

See more details on using hashes here.

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

File hashes

Hashes for etiket_sdk-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f6b43b9d13bf3eb6d724ca8e42e471ba3b15df082f75d4e839e331747140426e
MD5 bd7930154c7a052c2587e2f050cb5e29
BLAKE2b-256 5a9c0cd49d45d9a3e3fac8bdae83402a60659c99194fad504d95b0c69975a8e9

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 e824fc1a31448e506488210879c17b660224edbeca386dddfbba0629b053f185
MD5 31f9ac287e0340a769871764934455c4
BLAKE2b-256 915f0d529d552858de788a9bbbde2c0c3a51c2307433ee56cf02c58ab655567c

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3664fae582ee9df1225552b673c70f5fc9c110c3a7b5c640e94211962d5946d2
MD5 40dcfea9bd3ca6ecd1c753776d0c35f3
BLAKE2b-256 a69079ce1fc0cf164acec3989bf10449818a7accd32b235ec9dc97bf4adfc021

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c7345f024204ac32a1b5b1608151905554f2f2c09d34700e0afa8646c6696eb3
MD5 73886ce0e25fe61fb99a04068fcb8d71
BLAKE2b-256 e7cd82e39138b31d764687cf4fb2f10a01e91d0130ee5cefa6f0765ed7c0733f

See more details on using hashes here.

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

File hashes

Hashes for etiket_sdk-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 679f86745baae9ca6139f63748265e1b1e2ff051fb02159b0954f7742ac5e93e
MD5 95081ab03698f6bb3020f44664511a9e
BLAKE2b-256 9b448d87e3e6500cd86035d938b2c909472760cc8374c64310f018319d3ac711

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 9bb25f570d20cbc9ea79db1c13c65a80e6ff26e31692d308b08505d8f9aba347
MD5 e4b7422929abfade117d1dc234c69631
BLAKE2b-256 15547f6f6e233291294ab7611abf7d2e99f8eecae0e11ad8590b6b0e73690af8

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fbbff64dd994ff3e03c546d1cb2e2bc92ada64028015a4598870e7b1d9c7837c
MD5 3738d583d4dab840574e860b1963477b
BLAKE2b-256 52b3c82c114f496606e6c8474e0bb4d5c5bd569309efbf76c3c04a16a6b48d53

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fe5b5720244c55e8926e414e0810f4fb4fbabad28ee9a150093a07723c0d4fee
MD5 b4eefb582d71cd7705953731cf6ec6d0
BLAKE2b-256 a1263c3fbce1a4bda51a7936cb43e48254d67212003d4d072259646dee4ff5ee

See more details on using hashes here.

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

File hashes

Hashes for etiket_sdk-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 79ac9a0cf67c7f7ae6ea8aae03a2bdc73816663e2587ba4546ff5d364e5751ef
MD5 f00166c730a062020cd31cc23234a92f
BLAKE2b-256 f4e58395fbeb1ca1b3fdb5d57df1befb295bec0c3b9bb406d04f79d1e55a2fce

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 383047d278bb4e5dd4d56149d7e9cb8f75562068cca68f92dd26a6c7f2ab7a96
MD5 835d786c4a0f7767a2a18b2a3350acd3
BLAKE2b-256 e9063fee905fcf83fe217cad0e5c57b8f5f997708ec88f1d8f635ed6afa938ac

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c2b4bd4fa9836526599c5bc57d5a5b18e64acb9f51abbbf64ec33335efdd50a
MD5 c5a9977256cc89b45bd0bb2dc2d8862c
BLAKE2b-256 5c98c24376678957d3db2b1282177920945bfab02a03bc1b97155371111f7949

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8595115f6ac824e9261a31f1e0724d1f1fe693d6eb6a6b00453d95a2d8f29c7c
MD5 64854c25fe9b65133eb58a34377e129e
BLAKE2b-256 af35ad8e06fe93fa87d9db535376e8c13564885c41c05de0a9e5b045366e333f

See more details on using hashes here.

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

File hashes

Hashes for etiket_sdk-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ad7bde4b07981e0ced7cdb5d77008431c86abef52a8b418c3202152657c7fb28
MD5 53f238f19038f7740cd719fc9cb3607b
BLAKE2b-256 ec7fb321a400b864437f595c8e9dcf49f3ce15fd4bfeffa898ee0fe341bcc52d

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d44bfd17eee62a9ac6cfa25814759c111e3cd0f8033aa7f6513f21b024ba5a80
MD5 a42026da5b6310fcb662108fbac2be5f
BLAKE2b-256 6b0cf7093b9e50f23380223c8a6588a34292b3031ccd48de41b1443756836bb7

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 96a8ae1b2265852e5a2764039354bfc7ff0b4b369f3656d670b46ee1e09a55d8
MD5 8dd781218f6c860c78ad51546efe3abe
BLAKE2b-256 c76d62d9b0cabfa116d64fe3406c74c3a770c696f46433e873aab84969cf8c23

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page