Skip to main content

fast bindings for the sophia database

Project description

sophy, fast Python bindings for Sophia embedded database, v2.2.

About sophy

  • Written in Cython for speed and low-overhead
  • Clean, memorable APIs
  • Extensive support for Sophia's features
  • Python 2 and Python 3 support
  • No 3rd-party dependencies besides Cython
  • Documentation on readthedocs

About Sophia

  • Ordered key/value store
  • Keys and values can be composed of multiple fieldsdata-types
  • ACID transactions
  • MVCC, optimistic, non-blocking concurrency with multiple readers and writers.
  • Multiple databases per environment
  • Multiple- and single-statement transactions across databases
  • Prefix searches
  • Automatic garbage collection and key expiration
  • Hot backup
  • Compression
  • Multi-threaded compaction
  • mmap support, direct I/O support
  • APIs for variety of statistics on storage engine internals
  • BSD licensed

Some ideas of where Sophia might be a good fit

  • Running on application servers, low-latency / high-throughput
  • Time-series
  • Analytics / Events / Logging
  • Full-text search
  • Secondary-index for external data-store

Limitations

  • Not tested on Windoze.

If you encounter any bugs in the library, please open an issue, including a description of the bug and any related traceback.

Installation

The sophia sources are bundled with the sophy source code, so the only thing you need to install is Cython. You can install from GitHub or from PyPI.

Pip instructions:

$ pip install sophy

Or to install the latest code from master:

$ pip install -e git+https://github.com/coleifer/sophy#egg=sophy

Git instructions:

$ pip install Cython
$ git clone https://github.com/coleifer/sophy
$ cd sophy
$ python setup.py build
$ python setup.py install

To run the tests:

$ python tests.py


Overview

Sophy is very simple to use. It acts like a Python dict object, but in addition to normal dictionary operations, you can read slices of data that are returned efficiently using cursors. Similarly, bulk writes using update() use an efficient, atomic batch operation.

Despite the simple APIs, Sophia has quite a few advanced features. There is too much to cover everything in this document, so be sure to check out the official Sophia storage engine documentation.

The next section will show how to perform common actions with sophy.

Using Sophy

Let's begin by import sophy and creating an environment. The environment can host multiple databases, each of which may have a different schema. In this example our database will store arbitrary binary data as the key and value. Finally we'll open the environment so we can start storing and retrieving data.

from sophy import Sophia, Schema, StringIndex

# Instantiate our environment by passing a directory path which will store the
# various data and metadata for our databases.
env = Sophia('/path/to/store/data')

# We'll define a very simple schema consisting of a single utf-8 string for the
# key, and a single utf-8 string for the associated value.
schema = Schema(key_parts=[StringIndex('key')],
                value_parts=[StringIndex('value')])

# Create a key/value database using the schema above.
db = env.add_database('example_db', schema)

if not env.open():
    raise Exception('Unable to open Sophia environment.')

CRUD operations

Sophy databases use the familiar dict APIs for CRUD operations:

db['name'] = 'Huey'
db['animal_type'] = 'cat'
print db['name'], 'is a', db['animal_type']  # Huey is a cat

'name' in db  # True
'color' in db  # False

db['temp_val'] = 'foo'
del db['temp_val']
print db['temp_val']  # raises a KeyError.

Use update() for bulk-insert, and multi_get() for bulk-fetch. Unlike __getitem__(), calling multi_get() with a non-existant key will not raise an exception and return None instead.

db.update(k1='v1', k2='v2', k3='v3')

for value in db.multi_get('k1', 'k3', 'kx'):
    print value
# v1
# v3
# None

result_dict = db.multi_get_dict(['k1', 'k3', 'kx'])
# {'k1': 'v1', 'k3': 'v3'}

Other dictionary methods

Sophy databases also provides efficient implementations for keys(), values() and items(). Unlike dictionaries, however, iterating directly over a Sophy database will return the equivalent of the items() (as opposed to the just the keys):

db.update(k1='v1', k2='v2', k3='v3')

list(db)
# [('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')]


db.items()
# same as above.


db.keys()
# ['k1', 'k2', 'k3']


db.values()
# ['v1', 'v2', 'v3']

There are two ways to get the count of items in a database. You can use the len() function, which is not very efficient since it must allocate a cursor and iterate through the full database. An alternative is the index_count property, which may not be exact as it includes transactional duplicates and not-yet-merged duplicates.

print(len(db))
# 4

print(db.index_count)
# 4

Fetching ranges

Because Sophia is an ordered data-store, performing ordered range scans is efficient. To retrieve a range of key-value pairs with Sophy, use the ordinary dictionary lookup with a slice instead.

db.update(k1='v1', k2='v2', k3='v3', k4='v4')


# Slice key-ranges are inclusive:
db['k1':'k3']
# [('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')]


# Inexact matches are fine, too:
db['k1.1':'k3.1']
# [('k2', 'v2'), ('k3', 'v3')]


# Leave the start or end empty to retrieve from the first/to the last key:
db[:'k2']
# [('k1', 'v1'), ('k2', 'v2')]

db['k3':]
# [('k3', 'v3'), ('k4', 'v4')]


# To retrieve a range in reverse order, use the higher key first:
db['k3':'k1']
# [('k3', 'v3'), ('k2', 'v2'), ('k1', 'v1')]

To retrieve a range in reverse order where the start or end is unspecified, you can pass in True as the step value of the slice to also indicate reverse:

db[:'k2':True]
# [('k2', 'k1'), ('k1', 'v1')]

db['k3'::True]
# [('k4', 'v4'), ('k3', 'v3')]

db[::True]
# [('k4', 'v4'), ('k3', 'v3'), ('k2', 'v2'), ('k1', 'v1')]

Cursors

For finer-grained control over iteration, or to do prefix-matching, Sophy provides a cursor interface.

The cursor() method accepts 5 parameters:

  • order (default=>=) -- semantics for matching the start key and ordering results.
  • key -- the start key
  • prefix -- search for prefix matches
  • keys -- (default=True) -- return keys while iterating
  • values -- (default=True) -- return values while iterating

Suppose we were storing events in a database and were using an ISO-8601-formatted date-time as the key. Since ISO-8601 sorts lexicographically, we could retrieve events in correct order simply by iterating. To retrieve a particular slice of time, a prefix could be specified:

# Iterate over events for July, 2017:
for timestamp, event_data in db.cursor(key='2017-07-01T00:00:00',
                                       prefix='2017-07-'):
    do_something()

Transactions

Sophia supports ACID transactions. Even better, a single transaction can cover operations to multiple databases in a given environment.

Example usage:

account_balance = env.add_database('balance', ...)
transaction_log = env.add_database('transaction_log', ...)

# ...

def transfer_funds(from_acct, to_acct, amount):
    with env.transaction() as txn:
        # To write to a database within a transaction, obtain a reference to
        # a wrapper object for the db:
        txn_acct_bal = txn[account_balance]
        txn_log = txn[transaction_log]

        # Transfer the asset by updating the respective balances. Note that we
        # are operating on the wrapper database, not the db instance.
        from_bal = txn_acct_bal[from_acct]
        txn_acct_bal[to_account] = from_bal + amount
        txn_acct_bal[from_account] = from_bal - amount

        # Log the transaction in the transaction_log database. Again, we use
        # the wrapper for the database:
        txn_log[from_account, to_account, get_timestamp()] = amount

Multiple transactions are allowed to be open at the same time, but if there are conflicting changes, an exception will be thrown when attempting to commit the offending transaction:

# Create a basic k/v store. Schema.key_value() is a convenience/factory-method.
kv = env.add_database('main', Schema.key_value())

# ...

# Instead of using the context manager, we'll call begin() explicitly so we
# can show the interaction of 2 open transactions.
txn = env.transaction().begin()

t_kv = txn[kv]
t_kv['k1'] = 'v1'

txn2 = env.transaction().begin()
t2_kv = txn2[kv]

t2_kv['k1'] = 'v1-x'

txn2.commit()  # ERROR !!
# SophiaError('txn is not finished, waiting for concurrent txn to finish.')

txn.commit()  # OK

# Try again?
txn2.commit()  # ERROR !!
# SophiaError('transasction rolled back by another concurrent transaction.')

Index types, multi-field keys and values

Sophia supports multi-field keys and values. Additionally, the individual fields can have different data-types. Sophy provides the following field types:

  • StringIndex - stores UTF8-encoded strings, e.g. text.
  • BytesIndex - stores bytestrings, e.g. binary data.
  • JsonIndex - stores arbitrary objects as UTF8-encoded JSON data.
  • MsgPackIndex - stores arbitrary objects using msgpack serialization.
  • PickleIndex - stores arbitrary objects using Python pickle library.
  • UUIDIndex - stores UUIDs.
  • U64Index and reversed, U64RevIndex
  • U32Index and reversed, U32RevIndex
  • U16Index and reversed, U16RevIndex
  • U8Index and reversed, U8RevIndex
  • SerializedIndex - which is basically a BytesIndex that accepts two functions: one for serializing the value to the db, and another for deserializing.

To store arbitrary data encoded using msgpack, you could use MsgPackIndex:

schema = Schema(StringIndex('key'), MsgPackIndex('value'))
db = sophia_env.add_database('main', schema)

To declare a database with a multi-field key or value, you will pass the individual fields as arguments when constructing the Schema object. To initialize a schema where the key is composed of two strings and a 64-bit unsigned integer, and the value is composed of a string, you would write:

key = [StringIndex('last_name'), StringIndex('first_name'), U64Index('area_code')]
value = [StringIndex('address_data')]
schema = Schema(key_parts=key, value_parts=value)

address_book = sophia_env.add_database('address_book', schema)

To store data, we use the same dictionary methods as usual, just passing tuples instead of individual values:

sophia_env.open()

address_book['kitty', 'huey', 66604] = '123 Meow St'
address_book['puppy', 'mickey', 66604] = '1337 Woof-woof Court'

To retrieve our data:

huey_address = address_book['kitty', 'huey', 66604]

To delete a row:

del address_book['puppy', 'mickey', 66604]

Indexing and slicing works as you would expect.

Note: when working with a multi-part value, a tuple containing the value components will be returned. When working with a scalar value, instead of returning a 1-item tuple, the value itself is returned.

Configuring and Administering Sophia

Sophia can be configured using special properties on the Sophia and Database objects. Refer to the configuration document for the details on the available options, including whether they are read-only, and the expected data-type.

For example, to query Sophia's status, you can use the status property, which is a readonly setting returning a string:

print(env.status)
"online"

Other properties can be changed by assigning a new value to the property. For example, to read and then increase the number of threads used by the scheduler:

nthreads = env.scheduler_threads
env.scheduler_threads = nthread + 2

Database-specific properties are available as well. For example to get the number of GET and SET operations performed on a database, you would write:

print(db.stat_get, 'get operations')
print(db.stat_set, 'set operations')

Refer to the documentation for complete lists of settings. Dotted-paths are translated into underscore-separated attributes.

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

sophy-0.6.5.tar.gz (202.2 kB view details)

Uploaded Source

Built Distributions

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

sophy-0.6.5-cp314-cp314t-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

sophy-0.6.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.0 MB view details)

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

sophy-0.6.5-cp314-cp314-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

sophy-0.6.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.0 MB view details)

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

sophy-0.6.5-cp313-cp313-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

sophy-0.6.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.0 MB view details)

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

sophy-0.6.5-cp312-cp312-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

sophy-0.6.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.0 MB view details)

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

sophy-0.6.5-cp311-cp311-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

sophy-0.6.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.0 MB view details)

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

sophy-0.6.5-cp310-cp310-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

sophy-0.6.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.0 MB view details)

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

sophy-0.6.5-cp39-cp39-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

sophy-0.6.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.9 MB view details)

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

sophy-0.6.5-cp38-cp38-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

sophy-0.6.5-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.0 MB view details)

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

File details

Details for the file sophy-0.6.5.tar.gz.

File metadata

  • Download URL: sophy-0.6.5.tar.gz
  • Upload date:
  • Size: 202.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sophy-0.6.5.tar.gz
Algorithm Hash digest
SHA256 95bade83d4325446a96d0bffdd9dd844bc5c1b568ba240e7f8d64729d188c5ec
MD5 9ad40e463fb06a598bd8b3f7ea49a5f1
BLAKE2b-256 41f266a95c32b5a045b6864b32f9c113be3e7c51ecafaeec37dfe0f71d9547e7

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c2d725b20b2161927115fe55a9bfe184506d2118ac52271604af26a752a99543
MD5 5844971a96582916ab75da65e7e80a04
BLAKE2b-256 3f0ffb61b289640fcb01f3608234219ff4fcb54aff0f4d0cd42387274845a48c

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2c486b404b053c9f47fc450ce441ff5e0545239beacb655f8b34c7304de5a273
MD5 01866fef3988c3d5ea9b0247aec9beb1
BLAKE2b-256 d826b2a231802786050c95172a6d74a2148850be534f57d909e3f2f3d80e8a9d

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b8873f34604d5ce2619c42fed56d156c1fceab7b3b45285fd3b59dacc93ad883
MD5 06dec375cd2b8f6cc7cbaa4adefee831
BLAKE2b-256 70968c054fa464c68c7b18d6d01534b734f0834f95e38793f93307ad8f564658

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a14e50864516b91bb3e17b119eae9f0f36e8f20e80f660a10445bcd5e7b4aac9
MD5 68e722f93cf649398545f99a1e36a28e
BLAKE2b-256 5feec698559575932c9d7c0b3cddcb5117cdd46f7dc10b69359db4f5a8a8b475

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0a1d8ac59eb50efd7b9a5425a72181600efc007a23eafe1ef188db2955703d07
MD5 7b36ae4a0bfb58df03e4695b3f0213de
BLAKE2b-256 3b9bcf4109fc4ca2dc231d59653f035b2e9d958001066702d7ce1958e0f733a1

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 923c94fc5ce13aae36ac43a837b514f6db034d49e5c4bf9b86b1d74047fae247
MD5 c095b562f0065de0691ca0ab74d291a8
BLAKE2b-256 4c248dcc708c7dddce27b73c7efdc444b7647c0de93f9d4eb49f4e5838f86018

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 be0ec63af94fceffd4bc845c1675e3a200f267e27f6b82cc80789008e3611f59
MD5 13fcff4b46c1e5d2f0e2e7af6a89ee8c
BLAKE2b-256 5f8a73f45dcc8e028182261bd3b6f8dd478ee0cd2553a3ef47bcffd9b35af78e

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4434b507bda43da96a21ed1ba63b86ec1a396c56aa04e8d662d9e8b34a914a8a
MD5 722fd25808caa2774f3222937378ceaf
BLAKE2b-256 a7ff76a31f5c9c8f95d50afbf229d2ed889f2f5824e6ef6ddaf380a9e44d6801

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 86970d54515ab21f4bd45067d9751e52b38106701ec64cecbb103b1021874142
MD5 f7c96261393b02c3efd5fbcbe37f4205
BLAKE2b-256 6227b4427c82ef6a6596533a086ab11cdf4124ac39f8ac7be652b9ad2177f3a6

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c81726a1f6f6aa8c01b9b78f5c0c02537cad9cb48540f604c10c3a2412de5446
MD5 905d7dccfca4c16272d0fea261c51827
BLAKE2b-256 ced933033cac522508fd607489082a577f07d71b740691ca1d526b8926076512

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 00775f8ed74c755d814ce7e68563e22a38d8a34b5f0ba49afd6e5d0cbf8c3343
MD5 516dfcb96804245e6fc0b6ff120c6e80
BLAKE2b-256 012be0e60e2a86799407f4d0f2dd499f47e245c183fcb7ba95c3d3f50b508bf6

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 33b8cc44ad5c5486ca69a7cb514a99b41e111e8e15e60f37081538f5d317b47a
MD5 0a9ad0f40379f4a1ecf8413811ebfe84
BLAKE2b-256 46f481045a9fdda0b781577d5bceb825d81ba2b95970e8a36e6d171473815c61

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4b915e1eac1ef63c08cd28dae745534030745eb6e816d7932b6126fda78fdf81
MD5 d06050dcdeed1f1c1df853926842e33c
BLAKE2b-256 bc43be32e30c42eb8443d81a44f4b9c16beab36399f5201f946f4b02f06dbed4

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 14fdba8dcc921cc9ade0dfadef7148e4ff6611bfa2155e2828d4a5bc229c5ace
MD5 5cb5b1fb8031c51ba1780e6b43ced637
BLAKE2b-256 3943e7002d5ae6260634b212905e97b200e6e9479fdae2f656914a9b1db9ec70

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bbe5384cc19e855a5739d3ff7dda0d5bcd621fcca140ceeb7b722546faf4970c
MD5 b6950585b1699da8deea697ebeee5e0b
BLAKE2b-256 f53354520f9fe07ff67059718baac01065f7815fc1542ee1f5737ffaf43f3081

See more details on using hashes here.

File details

Details for the file sophy-0.6.5-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sophy-0.6.5-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 592b303793acc1149fb9678f6923f66a476133153e088ddf80f525ab8e107cb8
MD5 3ed85c7dd92e4e793e6c91c829ad9d03
BLAKE2b-256 7989134d6c525304763c3d05f00921640a61aff7511c0bad62ad9c018eb28d7d

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