Skip to main content

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.

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.2.tar.gz (63.3 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.2-cp315-cp315-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.15musllinux: musl 1.2+ x86-64

dolomite_base-0.5.2-cp315-cp315-manylinux_2_28_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.28+ x86-64

dolomite_base-0.5.2-cp315-cp315-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded CPython 3.15macOS 11.0+ ARM64

dolomite_base-0.5.2-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.2-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.2-cp314-cp314-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

dolomite_base-0.5.2-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.2-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.2-cp313-cp313-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

dolomite_base-0.5.2-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.2-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.2-cp312-cp312-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

dolomite_base-0.5.2-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.2-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.2-cp311-cp311-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

dolomite_base-0.5.2-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.2-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.2-cp310-cp310-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: dolomite_base-0.5.2.tar.gz
  • Upload date:
  • Size: 63.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for dolomite_base-0.5.2.tar.gz
Algorithm Hash digest
SHA256 261d159e76fcac88d44804f01da64c38bdd9106a739892247ca3943aa4bdac7a
MD5 b3111fb85029cf9fdc66096d3de9908d
BLAKE2b-256 b6f32d5523b429b51c88d77775ecb50c30f68e9ce7ac2a44426d0958e09f567a

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2.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.2-cp315-cp315-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp315-cp315-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4dad14c6c64981b44569f20805dbdaecfa3d8b2b4f685772f5df807fb07464fa
MD5 e81d8824ce6bf60fa915857c0dd4d73c
BLAKE2b-256 07f49dba18747af952867be0d5c690950456d24e51195b6d194aa22ffa086f8f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-cp315-cp315-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.2-cp315-cp315-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp315-cp315-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4a153b3cc140d016c2a687ae4e8a6870558a0e38ddceddde0d5a0d26154da933
MD5 6df8c982592a6d92aaf74e560a0e0131
BLAKE2b-256 16c0ab1229ebb21a3f51f741e5ac9b7fd7d1722fa452150f7edc937acaefb661

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-cp315-cp315-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.2-cp315-cp315-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp315-cp315-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 32ba2994a8e69eed3c57c71cc63cb379ae6fa6d2d0fb1f4b9946b50565987725
MD5 434e33c4b614e275a8c0c12d274099a6
BLAKE2b-256 52104abf7c0c9c97d223cdf6fc9817e28d02f6040f3823efc0a26af51c587f75

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-cp315-cp315-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.2-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 eab6d4711d8c9bdd75f7c864f6c185cab22112612914d49eb32bbeca5e5c6e41
MD5 15f5ebe0044c80165c4b9038aaff6503
BLAKE2b-256 65075a54e2ba6bf94e57fe1b27e7186324c0df2217c4ee65ca1406453d9d0b63

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4034ebd27450b9e626e9e6ed694768599ddfa84256c56788899c933c4072c668
MD5 efb3f427a2cd7c692c850a89e435091a
BLAKE2b-256 61e332cb0621ff41203b0a03c58048841dfa6a438ddb6e65758002badd082dcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 02bd75591a7b75399c4e76fd81b81dad07b7b4c78ddb32708462c5d54a9de9e1
MD5 b3066f9fc84f161a4910b50079783181
BLAKE2b-256 32aa186883ee533636c8c839f4f7218d0284946a29a2e36f74e9c9a481537f0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3078471dbc9fd281352fa93666fad7454be6c7731552915c73f5579229ffbbe1
MD5 21999ee578fd10bac72268ac7df098d0
BLAKE2b-256 ca8240faec2eba2e255642cbf73676f6f1242b71b29ae4b92e3816fbc2fa7593

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9403cc99ae867492f4e9a0632111459148d765b8297a7e4aa4ced06a50616374
MD5 1a00ac4d37ab559cbee138f60e8248cf
BLAKE2b-256 bb673aa4c86f8142a90d4278da3f8af8e8837bbcc760c86db73ed29ce25eefe6

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d9275fb149c6a786cd925e0e40bab3c15342c5193e509eebb4bc788ed8c7218
MD5 c04bb72c7d8ff7ffdd2e651e641a022d
BLAKE2b-256 ef09531643d8c35c2616707eca8f6e17e817dfaf9609d2d8328607b659b4e08f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 75e8af1bba71e72c6aeaf7722463e7bfe30a871f216737521b3ed989cce8d852
MD5 d81ba6f10afb04ca95d2ffc24913b54f
BLAKE2b-256 9fb63e410352ab93296d016485e69904076255b623e0be896e0c43747be987f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 69b513caa9a9dcf9e0f05617a57f88d7594481b167155b6e6727fc00b0d4b3cd
MD5 7c00ba47b2405fb9061d42ca8bbcf622
BLAKE2b-256 a18b400953dd6f5e8c8b6f5f3b0c2fe0c43918609ddff2e1c9dfaf0d54091de3

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2e1fff71e26412d1924a1e2b71027c8249bca9ad50d38dda9d60260958a520e3
MD5 cb53036d420cbb745e7a68fd48bb37be
BLAKE2b-256 4fd71d594ceeb2aa682ab6dda19b8b80ce85961d753edb6c1a3aef58e23874bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6bd325d8834fb8c5fbf1962ce235313d84342fce4dfa67012f4a55317d1a610b
MD5 4c03b8a89082cde07f9712ec82adae43
BLAKE2b-256 f2dcaeb102ba21ef42ea5a159dc1e6fcc60cde61d708662597e158ccd92a5f8f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 953ed44e6ddddefe8211129b4a564ab2df45dfabc873f906ccef5a9ed8e6f53b
MD5 a287b98f5d40d24eebd24eb3e92268b0
BLAKE2b-256 ff22aa295f9ce39c282f40c147c93bc2efe2f23adefc7ef5bbdb940e58d8aba5

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c1ba31cd586bb3fdb96320160c6887d90c0ce43b45e0472e2d084ad908e51d0
MD5 fabd6c1f332427d5816009120229ec7c
BLAKE2b-256 38b55d4e8b4e0314acbab021fe9f7ab3f26612627985bdc710b02c2468fba760

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b50795b0c58f449f8258781508c15908425f1e04294992959828248bbee19ebc
MD5 9308d5d468ea10c9fcdd649f6c86cffe
BLAKE2b-256 eea6daf6a59483af47a238ffb08e1f679318e8792352d268de47de96b41e3605

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 30c4e0747b0bb98cf6266448c7061b79c95de01d1c3a053d07bf2b5c9915a71f
MD5 790abc99620614075f86626d3add4292
BLAKE2b-256 e01fabec19632d2edc7f3a9b7f5b6d2d3b8b91d34d60cf0bc327472b3811ae8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dolomite_base-0.5.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 82e8fb0e6e72364352d8ba338d47b7f2e54fa432552ab399d72a97141e033860
MD5 853b61d2b9d435ea6d2828409c5b9bba
BLAKE2b-256 72a944b89b9aea9ac1cb567f659d575c7e9fc0e1839a982bfa8cd6456f529aaa

See more details on using hashes here.

Provenance

The following attestation bundles were made for dolomite_base-0.5.2-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.

Release history Release notifications | RSS feed

This release

0.5.2 This release

19 files

0.5.1

25 files

0.5.0

3 files

0.4.5

26 files

0.4.4

26 files

0.4.3

21 files

0.4.2

21 files

0.4.0

17 files

0.3.0

21 files

0.2.4

21 files

0.2.3

21 files

0.2.2

21 files

0.2.1

21 files

0.2.0

21 files

0.0.2

15 files

0.0.1

15 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page