Skip to main content

Save and load Bioconductor objects in Python

Project description

Project generated with PyScaffold PyPI-Server Monthly Downloads Unit tests

Save and load Bioconductor objects in Python

The dolomite-base package is the Python counterpart to the alabaster.base R package for language-agnostic reading and writing of Bioconductor objects (see the BiocPy project). This is a more robust and portable alternative to the typical approach of pickling Python objects to save them to disk.

  • By separating the on-disk representation from the in-memory object structure, we can more easily adapt to changes in class definitions. This improves robustness to Python environment updates.
  • By using standard file formats like HDF5 and CSV, we ensure that the objects can be easily read from other languages like R and Javascript. This improves interoperability between application ecosystems.
  • By breaking up complex Bioconductor objects into their components, we enable modular reads and writes to the backing store. We can easily read or update part of an object without having to consider the other parts.

The dolomite-base package defines the base generics to read and write the file structures along with the associated metadata. Implementations of these methods for various Bioconductor classes can be found in the other dolomite packages like dolomite-ranges and dolomite-se.

Quick start

First, we'll install the dolomite-base package. This package is available from PyPI so we can use the standard installation process:

pip install dolomite-base

The simplest example involves saving a BiocFrame inside a staging directory. Let's mock one up:

import biocframe
df = biocframe.BiocFrame({
    "X": list(range(0, 10)),
    "Y": [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ]
})
print(df)
## BiocFrame with 10 rows and 2 columns
##           X      Y
##     <range> <list>
## [0]       0      a
## [1]       1      b
## [2]       2      c
## [3]       3      d
## [4]       4      e
## [5]       5      f
## [6]       6      g
## [7]       7      h
## [8]       8      i
## [9]       9      j

We save our BiocFrame to a user-specified directory with the save_object() function. This function saves its input object to file according to the relevant specification.

import tempfile
import os
tmp = tempfile.mkdtemp()

import dolomite_base
path = os.path.join(tmp, "my_df")
dolomite_base.save_object(df, path)

os.listdir(path)
## ['basic_columns.h5', 'OBJECT']

We load the contents of the directory back into a Python session by using the read_object() function. Note that the exact Python types for the BiocFrame columns may not be preserved by the round trip, though the contents of the columns will be unchanged.

out = dolomite_base.read_object(path)
print(out)
BiocFrame with 10 rows and 2 columns
##                    X            Y
##     <ndarray[int32]> <StringList>
## [0]                0            a
## [1]                1            b
## [2]                2            c
## [3]                3            d
## [4]                4            e
## [5]                5            f
## [6]                6            g
## [7]                7            h
## [8]                8            i
## [9]                9            j

Check out the API reference for more details.

Supported classes

The saving/reading process can be applied to a range of BiocPy data structures, provided the appropriate dolomite package is installed. Each package implements a saving and reading function for its associated classes, which are automatically used from dolomite-base's save_object() and read_object() functions, respectively. (That is, there is no need to explicitly import a package when calling save_object() or read_object() for its classes.)

Package Object types PyPI
dolomite-base BiocFrame, list, dict, NamedList
dolomite-matrix numpy.ndarray, scipy.sparse.spmatrix, DelayedArray
dolomite-ranges GenomicRanges, GenomicRangesList
dolomite-se SummarizedExperiment, RangedSummarizedExperiment
dolomite-sce SingleCellExperiment
dolomite-mae MultiAssayExperiment

All of the listed packages are available from PyPI and can be installed with the usual pip install procedure. Alternatively, to install all packages in one go, users can install the dolomite umbrella package.

Operating on directories

Users can move freely rename or relocate directories and the read_object() function will still work. For example, we can easily copy the entire directory to a new file system and everything will still be correctly referenced within the directory. The simplest way to share objects is to just zip or tar the staging directory for ad hoc distribution, though more serious applications will use storage systems like AWS S3 for easier distribution.

# Mocking up an object:
import biocframe
df = biocframe.BiocFrame({
    "X": list(range(0, 10)),
    "Y": [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ]
})

# Saving to one location:
import tempfile
import os
import dolomite_base
tmp = tempfile.mkdtemp()
path = os.path.join(tmp, "my_df")
dolomite_base.save_object(df, path)

# Reading from another location:
alt_path = os.path.join(tmp, "foobar")
os.rename(path, alt_path)
alt_out = dolomite_base.read_object(alt_path)

That said, it is unwise to manipulate the files inside the directory created by save_object(). Reading functions will usually depend on specific file names or subdirectory structures within the directory, and fiddling with them may cause unexpected results. Advanced users can exploit this by loading components from subdirectories if the full object is not required:

# Creating a nested DF:
nested = biocframe.BiocFrame({ "A": df })
nest_path = os.path.join(tmp, "nesting")
dolomite_base.save_object(nested, nest_path)

# Now reading in the nested DF:
redf = dolomite_base.read_object(os.path.join(nest_path, "other_columns", "0"))

Validating files

Each Bioconductor class's on-disk representation is determined by the associated takane specification. For example, save_object() will save a BiocFrame according to the data_frame specification. More complex objects may be represented by multiple files, possibly including subdirectories with "child" objects.

Each call to save_object() will automatically enforce the relevant specification by validating the directory contents with dolomite-base's validate_object() function. Successful validation provides some guarantees on the file structure within the directory, allowing developers to reliably implement readers in other frameworks. Conversely, the alabaster suite applies the same validators on directories generated within an R session, which ensures that dolomite-base is able to read those objects into a Python environment.

Users can also call validate_object() themselves, if they have modified the directory after calling save_object() and they want to check that the contents are still valid:

# Mocking up an object:
import biocframe
df = biocframe.BiocFrame({
    "X": list(range(0, 10)),
    "Y": [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" ]
})

# Saving to one location:
import tempfile
import os
import dolomite_base
tmp = tempfile.mkdtemp()
path = os.path.join(tmp, "my_df")
dolomite_base.save_object(df, path)

# So far so good...
dolomite_base.validate_object(path)

# Deleting the file to make it invalid:
os.remove(os.path.join(path, "basic_columns.h5"))
dolomite_base.validate_object(path)
## Traceback (most recent call last):
## etc...

Extending to new classes

The dolomite framework is easily extended to new classes by:

  1. Writing a method for save_object(). This should accept an instance of the object and a path to a directory, and save the contents of the object inside the directory. It should also produce an OBJECT file that specifies the type of the object, e.g., data_frame, hdf5_sparse_matrix.
  2. Writing a function for read_object() and registering it in the read_object_registry. This should accept a path to a directory and read its contents to reconstruct the object. The registered type should be the same as that used in the OBJECT file.
  3. Writing a function for validate_object() and registering it in the validate_object_registry. This should accept a path to a directory and read its contents to determine if it is a valid on-disk representation. The registered type should be the same as that used in the OBJECT file.
    • (optional) Devleopers can alternatively formalize the on-disk representation by adding a specification to the takane repository. This aims to provide C++-based validators for each representation, allowing us to enforce consistency across multiple languages (e.g., R). Any takane validator is automatically used by validate_object() so no registration is required.

To illustrate, let's extend dolomite to a new custom class:

class Coffee:
    def __init__(self, beans: str, milk: bool):
        self.beans = beans
        self.milk = milk

First we implement the saving method. Note that we add a @validate_saves decorator to instruct save_object() to automatically run validate_object() on the directory by the Coffee method. This confirms that the output is valid according to our (yet to be added) validator method.

import dolomite_base
import os
import json

@dolomite_base.save_object.register
@dolomite_base.validate_saves
def save_object_for_Coffee(x: Coffee, path: str, **kwargs):
    os.mkdir(path)
    with open(os.path.join(path, "bean_type"), "w") as handle:
        handle.write(x.beans)
    with open(os.path.join(path, "has_milk"), "w") as handle:
        handle.write("true" if x.milk else "false")
    with open(os.path.join(path, "OBJECT"), "w") as handle:
        json.dump({ "type": "coffee", "coffee": { "version": "0.1" } }, handle)

Then we implement and register the reading method:

from typing import Dict

def read_Coffee(path: str, metadata: Dict, **kwargs) -> Coffee:
    metadata["coffee"]["version"] # possibly do something different based on version
    with open(os.path.join(path, "bean_type"), "r") as handle:
        beans = handle.read()
    with open(os.path.join(path, "has_milk"), "r") as handle:
        milk = (handle.read() == "true")
    return Coffee(beans, milk)

dolomite_base.read_object_registry["coffee"] = read_Coffee

And finally, the validation method:

def validate_Coffee(path: str, metadata: Dict):
    metadata["coffee"]["version"] # possibly do something different based on version
    with open(os.path.join(path, "bean_type"), "r") as handle:
        beans = handle.read()
        if not beans in [ "arabica", "robusta", "excelsa", "liberica" ]:
            raise ValueError("wrong bean type '" + beans + "'")
    with open(os.path.join(path, "has_milk"), "r") as handle:
        milk = handle.read()
        if not milk in [ "true", "false" ]:
            raise ValueError("invalid milk '" + milk + "'")

dolomite_base.validate_object_registry["coffee"] = validate_Coffee

Let's run them and see how it works:

cup = Coffee("arabica", milk=False)

import tempfile
tmp = tempfile.mkdtemp()
path = os.path.join(tmp, "stuff")
dolomite_base.save_object(cup, path)

cup2 = dolomite_base.read_object(path)
print(cup2.beans)
## arabica

For more complex objects that are composed of multiple smaller "child" objects, developers should consider saving each of their children in subdirectories of path. This can be achieved by calling alt_save_object() and alt_read_object() in the saving and loading functions, respectively. (We use the alt_* versions of these functions to respect application overrides, see below.)

Creating applications

Developers can also create applications that customize the machinery of the dolomite framework for specific needs. In most cases, this involves storing more metadata to describe the object in more detail. For example, we might want to remember the identity of the author for each object. This is achieved by creating an application-specific saving generic with the same signature as save_object():

from functools import singledispatch
from typing import Any, Dict, Optional
import dolomite_base
import json
import os
import getpass
import biocframe

def dump_extra_metadata(path: str, extra: Dict):
    user_id = getpass.getuser()
    # File names with leading underscores are reserved for application-specific
    # use, so they won't clash with anything produced by save_object().
    metapath = os.path.join(path, "_metadata.json")
    with open(metapath, "w") as handle:
        json.dump({ **extra, "author": user_id }, handle)

@singledispatch
def app_save_object(x: Any, path: str, **kwargs):
    dolomite_base.save_object(x, path, **kwargs) # does the real work
    dump_extra_metadata(path, {}) # adding some application-specific metadata

@app_save_object.register
def app_save_object_for_BiocFrame(x: biocframe.BiocFrame, path: str, **kwargs):
    dolomite_base.save_object(x, path, **kwargs) # does the real work
    # We can also override specific methods to add object+application-specific metadata:
    dump_extra_metadata(path, { "columns": x.get_column_names().as_list() })

In general, applications should avoid modifying the files created by the dolomite_base.save_object() call, to avoid violating any takane format specifications (unless the application maintainer really knows what they're doing). Applications are free to write to any path starting with an underscore as this will not be used by any specification.

Once a generic is defined, applications should call alt_save_object_function() to instruct alt_save_object() to use it instead of dolomite_base.save_object(). This ensures that the customizations are applied to all child objects, such as the nested BiocFrame below.

# Create a friendly user-visible function to perform the generic override; this
# is reversed on function exit to avoid interfering with other applications.
def save_for_application(x, path: str, **kwargs):
    old = dolomite_base.alt_save_object_function(app_save_object)
    try:
        dolomite_base.alt_save_object(x, path, **kwargs)
    finally:
        dolomite_base.alt_save_object_function(old)

# Saving our nested BiocFrames with our overrides active.
import biocframe
df = biocframe.BiocFrame({
    "A": [1, 2, 3, 4],
    "B": biocframe.BiocFrame({
        "C": ["a", "b", "c", "d"]
    })
})

import tempfile
tmp = tempfile.mkdtemp()
path = os.path.join(tmp, "foobar")
save_for_application(df, path)

# Both the parent and child BiocFrames have new metadata.
with open(os.path.join(path, "_metadata.json"), "r") as handle:
    print(handle.read())
## {"columns": ["A", "B"], "author": "aaron"}

with open(os.path.join(path, "other_columns", "1", "_metadata.json"), "r") as handle:
    print(handle.read())
## {"columns": ["C"], "author": "aaron"}

The reading function can be similarly overridden by setting alt_read_object_function() to instruct all alt_read_object() calls to use the override. This allows applications to, e.g., do something with the metadata that we just added.

def app_read_object(path: str, metadata: Optional[Dict] = None, **kwargs):
    if metadata is None:
        with open(os.path.join(path, "OBJECT"), "r") as handle:
            metadata = json.load(handle)

    # Print custom message based on the type and application-specific metadata.
    with open(os.path.join(path, "_metadata.json"), "r") as handle:
        appmeta = json.load(handle)
        print("I am a " + metadata["type"] + " created by " + appmeta["author"])
        if metadata["type"] == "data_frame":
            print("I have the following columns: " + ", ".join(appmeta["columns"]))

    return dolomite_base.read_object(path, metadata=metadata, **kwargs)

# Creating a user-friendly function to set the override before the read operation.
def read_for_application(path: str, metadata: Optional[Dict] = None, **kwargs):
    old = dolomite_base.alt_read_object_function(app_read_object)
    try:
        return dolomite_base.alt_read_object(path, metadata=metadata, **kwargs)
    finally:
        dolomite_base.alt_read_object_function(old)

# This diverts to the override with printing of custom messages.
read_for_application(path)
## I am a data_frame created by aaron
## I have the following columns: A, B
## I am a data_frame created by aaron
## I have the following columns: C

By overriding the saving and reading process for one or more classes, each application can customize the behavior of the dolomite framework to their own needs.

Project details


Download files

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

Source Distribution

dolomite_base-0.5.1.tar.gz (62.2 kB view details)

Uploaded Source

Built Distributions

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

dolomite_base-0.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

dolomite_base-0.5.1-cp314-cp314t-manylinux_2_28_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

dolomite_base-0.5.1-cp314-cp314t-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

dolomite_base-0.5.1-cp314-cp314t-macosx_10_15_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

dolomite_base-0.5.1-cp314-cp314-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

dolomite_base-0.5.1-cp314-cp314-manylinux_2_28_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

dolomite_base-0.5.1-cp314-cp314-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

dolomite_base-0.5.1-cp314-cp314-macosx_10_15_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

dolomite_base-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

dolomite_base-0.5.1-cp313-cp313-manylinux_2_28_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

dolomite_base-0.5.1-cp313-cp313-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

dolomite_base-0.5.1-cp313-cp313-macosx_10_15_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.13macOS 10.15+ x86-64

dolomite_base-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

dolomite_base-0.5.1-cp312-cp312-manylinux_2_28_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

dolomite_base-0.5.1-cp312-cp312-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

dolomite_base-0.5.1-cp312-cp312-macosx_10_15_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.12macOS 10.15+ x86-64

dolomite_base-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

dolomite_base-0.5.1-cp311-cp311-manylinux_2_28_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

dolomite_base-0.5.1-cp311-cp311-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

dolomite_base-0.5.1-cp311-cp311-macosx_10_15_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.11macOS 10.15+ x86-64

dolomite_base-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

dolomite_base-0.5.1-cp310-cp310-manylinux_2_28_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

dolomite_base-0.5.1-cp310-cp310-macosx_11_0_arm64.whl (1.9 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

dolomite_base-0.5.1-cp310-cp310-macosx_10_15_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10macOS 10.15+ x86-64

File details

Details for the file dolomite_base-0.5.1.tar.gz.

File metadata

  • Download URL: dolomite_base-0.5.1.tar.gz
  • Upload date:
  • Size: 62.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for dolomite_base-0.5.1.tar.gz
Algorithm Hash digest
SHA256 83b202df444aa88b2f3f97a81378680f27e51bb855a4cf3ee57be1bed34b09b6
MD5 5866b78e0942d1e5e248cf20e515a8ec
BLAKE2b-256 fa15838871180e5f98de4ecabdd1b2cdcd0b402b17786858bec5db3bc3448606

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1.tar.gz:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 55fa46c193676ad4e070b119a94651c289a5ce8802dfcdb4edc8c89d7614dbe1
MD5 937efc0dc9ed357575b0ea62e9b2fe4f
BLAKE2b-256 b17b3c8f9b9c3f58ef0ee92d81d26426fe43ea9fc2ad25ad3a4ac4a8886e2fd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e4ec348aa85ef5068d38027f74a303458814240e8d49f97fd041301275a081cd
MD5 bfa4b59d87b39952e9a12d10d08fcc69
BLAKE2b-256 5b5a314489af64d4f027af91eb01e2059235fe26a14eac10e08bd6e7c052ef05

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314t-manylinux_2_28_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d0002ebf1923f96e77aa424baa802c75d312a4663675f7b451f53f4e41b07d8b
MD5 5e8704b78772f3b94c1a8acbac9ceca5
BLAKE2b-256 9cfa0f42d9fd19afe3f7d00fd4c5040938484542f022d5bd1fa461e0fad70760

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ab70b2394bc42619030ebe0368aec9bc739a71d283303fcf5492f4e668234ffa
MD5 fcfda0e770202e86264027ba1bb64f97
BLAKE2b-256 3c89a864d4c621ca41f026696405a770f9990c908caa08132b9d5c974d7ce910

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314t-macosx_10_15_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b54e3d546049f2f01bb3dcea8dda9cfd9be7ad61062fb381bc95923bcfe27efa
MD5 884330dbd8115074671da1809e286efc
BLAKE2b-256 1b4b3c56395162a2cdd0c0c7f9d4d39d8ad4d96481312eb226d8a17e2de51f37

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 256dbb5cd6856176b7e8e5181ef7552871627e08856e842d2c60df16467bfdab
MD5 15860b517c2811320c8b2cb9ebcaa435
BLAKE2b-256 42ed92ec45da8201d88db903da54938ab1967ff5e466bd26de5120f9dabe25c8

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d0c750b881e5ad0b33f1b735d6602ec958244a28af3101fe0c3c4c9d993c9be7
MD5 b5e10ac1a54332064786fd2cb40d3520
BLAKE2b-256 3fea54740ccc99319f71350f446102cbfc55f5b7bc9454428306c0cca69ec731

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 075ee90fbcb6258264c22762f54d9cbf83b61faf419d67c6da5509893146c62c
MD5 32ca541527fc8c45105c698d14cecd13
BLAKE2b-256 b1be2a7c75e0f7d07cf4cda9d2d2c77cab6a3cdbc4a8f50d596f392343902fc7

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp314-cp314-macosx_10_15_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 879315eface0855d873eb72359aec2294e6401a2fcf39b2d8f576288266b3143
MD5 d1464a9fab2e838c3f0fb0639ff09753
BLAKE2b-256 b75e41ce2623b82dc48256454d0c85fdece5af5ba377db17ca19125d61e03c25

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 90882dab218363f43177918ea533ffeff93c871be05acd1b53dcfa3cf2de6905
MD5 e2bab520250f01885c22c3d870b62c89
BLAKE2b-256 85fc7c23e049237bb9d84d05be021f60fe5249d2d772e39add01bf615aba48cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b715a68dd2c2255f5044ae605b879b58ae05c2d21fe0e35b362177decc9486db
MD5 9e2bae5492198e3f2d56cf2d9c3cdcf9
BLAKE2b-256 7941e87df1dca22c456d5338294140e74de2d24f0eca642836646981f59661fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6016d229b5cadcfd8d8cc808acf91df6fe86d0ec5768689acfd38aff912c9441
MD5 3c639cd1ec3913cb6e31adbb7e520284
BLAKE2b-256 afb35ed3245958cc86e2d1b5dacf5c6fce347445a18345a64fe516fc6e37089f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp313-cp313-macosx_10_15_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 acc647b37cfde656285681cba79cc31fa8fabb941d339f8a0ec391e036a00afc
MD5 9527c221675f57e13022ac21cdc29710
BLAKE2b-256 ffbba5338bfb2b43b2dd5ed5fd2a7b37f728426121d8b25d5a64796ea7eae5b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e07be13b7a997d123310eb7ff2c34c4da57f97e6b00867af001d21aafdda98df
MD5 21e089d3e900dc19f027047d072f7a66
BLAKE2b-256 5ed32c9b77082127d8fffc5e98711a953ad7cf61bca3887f1edc7260f7f30847

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 33225cb68c49498260d7ba42d150353c2dc34eef9e45cebd8326563b94a32183
MD5 ab754e69a602c1627ba9e85011f47251
BLAKE2b-256 83c047fa3154ac405425d9576fa2fde057913dfe738aa7c888f83b132ed30595

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 8804f7986e99d6890320ed15af67067278dfcb4e09ec38bca47091f1c5ac5fcb
MD5 82d47211af300c983bcd00ac5b225ef1
BLAKE2b-256 5ed8d2c241f7986cfb949d3ce1861492bf3e91fcc931359c808eb8e93fd713fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp312-cp312-macosx_10_15_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e02679d97fe45fce815cd9e1fb30970fa39afb6669656ce6304df97064ec71a3
MD5 9d226d26f20476179d39277830e5a0f5
BLAKE2b-256 76dc5d63b16a9107eb7472b1c5e872b9a1da91e4359803577cf3c5ca23a25b96

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9d7318300f5dc25a1c28944bf9b55e508e10d047b1d34f6fbacc54dc5c741857
MD5 d404a2cf88fda70d257c868ea2aba37b
BLAKE2b-256 863ca9f2185a5409a23d1f64fcf1642a62daecaf34a416a123ee41b6e08f738a

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 97d2ad27454492d7bf8d5cd0c8c823ab76eccf91f9011ddb9c9c51e9d649daaa
MD5 53833561e95ed929b10d65656f07e558
BLAKE2b-256 ca7d4ad5b3c86e75c5d0ff84056ee1b4bc7677118bd6118102184f8b2a764ab5

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3052e25609d1b7080bd060eaa99192b6fff5575e18af8ef2561097bcc0611163
MD5 bf5d4d05632583ee5574788130ac96b5
BLAKE2b-256 b42a399c6c2426a240a053bf2fa21a10cce05ee9d4f3378e48abf096d5e25ebf

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp311-cp311-macosx_10_15_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 982a4a9e22f6ab0a4573b4265d9ad8cccdeef3a7e065090a387cc9d340d4eae0
MD5 501ee407242ef5058633e029b4f420d1
BLAKE2b-256 6d4dd917215a79e6a3192599ebedd0272d1b543aed29053922740e1f872cf659

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 eecaddea7ec015e339f38efa77461971d7482f4f9e208804ee806404b214e925
MD5 899f2c5f76cadf490f7dd04ff8d0fb77
BLAKE2b-256 9f4b0aef7ab53a3aad6bfd1d8a9d791c12b2b6d7c432ebfae05350e25b0e8fef

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7356ae476208f1ab57c4e466f7e9198b8a168cc5c92cc21c5b4d835b95d1841c
MD5 38e908b9963dac7e3eeccdf8c7770150
BLAKE2b-256 e7c262e2671647b909c105620851b52dccf0fdf410d7f21c0957dbb8d9f92155

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dolomite_base-0.5.1-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.1-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 69f15c38722feeea3f9e1e0a62eaba803e7ebaf992595210f04b89221de6516e
MD5 47a6d1a4316f457540309a7703763998
BLAKE2b-256 19c580c0e23b2c6a27eaa506bb6981f981fe632af70edde0927b96de6db5b34d

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.1-cp310-cp310-macosx_10_15_x86_64.whl:

Publisher: publish-pypi.yml on ArtifactDB/dolomite-base

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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