Skip to main content

Python bindings for SQLite's LSM key/value engine

Project description

lsm

Fast Python bindings for SQLite's LSM key/value store. The LSM storage engine was initially written as part of the experimental SQLite4 rewrite (now abandoned). More recently, the LSM source code was moved into the SQLite3 source tree and has seen some improvements and fixes. This project uses the LSM code from the SQLite3 source tree.

Features:

  • Embedded zero-conf database.
  • Keys support in-order traversal using cursors.
  • Transactional (including nested transactions).
  • Single writer/multiple reader MVCC based transactional concurrency model.
  • On-disk database stored in a single file.
  • Data is durable in the face of application or power failure.
  • Thread-safe.
  • Releases GIL for read and write operations (each connection has own mutex)
  • Page compression (lz4 or zstd)
  • Zero dependency static library
  • Python 3.x.

Limitations:

The source for Python lsm is hosted on GitHub.

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

Quick-start

Below is a sample interactive console session designed to show some of the basic features and functionality of the lsm Python library.

To begin, instantiate a LSM object, specifying a path to a database file.

from lsm import LSM
db = LSM('test.ldb')
assert db.open()

More pythonic variant is using context manager:

from lsm import LSM
with LSM("test.ldb") as db:
    assert db.info()

Not opened database will raise a RuntimeError:

import pytest
from lsm import LSM

db = LSM('test.ldb')

with pytest.raises(RuntimeError):
    db.info()

Binary/string mode

You should select mode for opening the database with binary: bool = True argument.

For example when you want to store strings just pass binary=False:

from lsm import LSM
with LSM("test_0.ldb", binary=False) as db:
    # must be str for keys and values
    db['foo'] = 'bar'
    assert db['foo'] == "bar"

Otherwise, you must pass keys and values ad bytes (default behaviour):

from lsm import LSM

with LSM("test.ldb") as db:
    db[b'foo'] = b'bar'
    assert db[b'foo'] == b'bar'

Key/Value Features

lsm is a key/value store, and has a dictionary-like API:

from lsm import LSM
with LSM("test.ldb", binary=False) as db:
    db['foo'] = 'bar'
    assert db['foo'] == 'bar'

Database apply changes as soon as possible:

import pytest
from lsm import LSM

with LSM("test.ldb", binary=False) as db:
    for i in range(4):
         db[f'k{i}'] = str(i)

    assert 'k3' in db
    assert 'k4' not in db
    del db['k3']

    with pytest.raises(KeyError):
        print(db['k3'])

By default, when you attempt to look up a key, lsm will search for an exact match. You can also search for the closest key, if the specific key you are searching for does not exist:

import pytest
from lsm import LSM, SEEK_LE, SEEK_GE, SEEK_LEFAST


with LSM("test.ldb", binary=False) as db:
    for i in range(4):
        db[f'k{i}'] = str(i)

    # Here we will match "k1".
    assert db['k1xx', SEEK_LE] == '1'

    # Here we will match "k1" but do not fetch a value
    # In this case the value will always be ``True`` or there will
    # be an exception if the key is not found
    assert db['k1xx', SEEK_LEFAST] is True

    with pytest.raises(KeyError):
        print(db['000', SEEK_LEFAST])

    # Here we will match "k2".
    assert db['k1xx', SEEK_GE] == "2"

LSM supports other common dictionary methods such as:

  • keys()
  • values()
  • items()
  • update()

Slices and Iteration

The database can be iterated through directly, or sliced. When you are slicing the database the start and end keys need not exist -- lsm will find the closest key (details can be found in the LSM.fetch_range() documentation).

from lsm import LSM

with LSM("test_slices.ldb", binary=False) as db:

    # clean database
    for key in db.keys():
        del db[key]

    db['foo'] = 'bar'

    for i in range(3):
        db[f'k{i}'] = str(i)

    # Can easily iterate over the database items
    assert (
        sorted(item for item in db.items()) == [
            ('foo', 'bar'), ('k0', '0'), ('k1', '1'), ('k2', '2')
        ]
    )

    # However, you will not read the entire database into memory, as special
    # iterator objects are used.
    assert str(db['k0':'k99']).startswith("<lsm_slice object at")

    # But you can cast it to the list for example
    assert list(db['k0':'k99']) == [('k0', '0'), ('k1', '1'), ('k2', '2')]

You can use open-ended slices. If the lower- or upper-bound is outside the range of keys an empty list is returned.

with LSM("test_slices.ldb", binary=False, readonly=True) as db:
    assert list(db['k0':]) == [('k0', '0'), ('k1', '1'), ('k2', '2')]
    assert list(db[:'k1']) == [('foo', 'bar'), ('k0', '0'), ('k1', '1')]
    assert list(db[:'aaa']) == []

To retrieve keys in reverse order or stepping over more than one item, simply use a third slice argument as usual. Negative step value means reverse order, but first and second arguments must be ordinarily ordered.

with LSM("test_slices.ldb", binary=False, readonly=True) as db:
    assert list(db['k0':'k99':2]) == [('k0', '0'), ('k2', '2')]
    assert list(db['k0'::-1]) == [('k2', '2'), ('k1', '1'), ('k0', '0')]
    assert list(db['k0'::-2]) == [('k2', '2'), ('k0', '0')]
    assert list(db['k0'::3]) == [('k0', '0')]

You can also delete slices of keys, but note that delete will not include the keys themselves:

with LSM("test_slices.ldb", binary=False) as db:
    del db['k0':'k99']

    # Note that 'k0' still exists.
    assert list(db.items()) == [('foo', 'bar'), ('k0', '0')]

Cursors

While slicing may cover most use-cases, for finer-grained control you can use cursors for traversing records.

from lsm import LSM, SEEK_GE, SEEK_LE

with LSM("test_cursors.ldb", binary=False) as db:
    del db["a":"z"]

    db["spam"] = "spam"

    with db.cursor() as cursor:
        cursor.seek('spam')
        key, value = cursor.retrieve()
        assert key == 'spam'
        assert value == 'spam'

Seeking over cursors:

with LSM("test_cursors.ldb", binary=False) as db:
    db.update({'k0': '0', 'k1': '1', 'k2': '2', 'k3': '3', 'foo': 'bar'})

    with db.cursor() as cursor:

        cursor.first()
        key, value = cursor.retrieve()
        assert key == "foo"
        assert value == "bar"

        cursor.last()
        key, value = cursor.retrieve()
        assert key == "spam"
        assert value == "spam"

        cursor.previous()
        key, value = cursor.retrieve()
        assert key == "k3"
        assert value == "3"

Finding the first match that is greater than or equal to 'k0' and move forward until the key is less than 'k99'

with LSM("test_cursors.ldb", binary=False) as db:
    with db.cursor() as cursor:
        cursor.seek("k0", SEEK_GE)
        results = []

        while cursor.compare("k99") > 0:
            key, value = cursor.retrieve()
            results.append((key, value))
            cursor.next()

    assert results == [('k0', '0'), ('k1', '1'), ('k2', '2'), ('k3', '3')]

Finding the last match that is lower than or equal to 'k99' and move backward until the key is less than 'k0'

with LSM("test_cursors.ldb", binary=False) as db:
    with db.cursor() as cursor:
        cursor.seek("k99", SEEK_LE)
        results = []

        while cursor.compare("k0") >= 0:
            key, value = cursor.retrieve()
            results.append((key, value))
            cursor.previous()

    assert results == [('k3', '3'), ('k2', '2'), ('k1', '1'), ('k0', '0')]

It is very important to close a cursor when you are through using it. For this reason, it is recommended you use the LSM.cursor() context-manager, which ensures the cursor is closed properly.

Transactions

lsm supports nested transactions. The simplest way to use transactions is with the LSM.transaction() method, which returns a context-manager:

from lsm import LSM

with LSM("test_tx.ldb", binary=False) as db:
    del db["a":"z"]
    for i in range(10):
        db[f"k{i}"] = f"{i}"


with LSM("test_tx.ldb", binary=False) as db:
    with db.transaction() as tx1:
        db['k1'] = '1-mod'

        with db.transaction() as tx2:
            db['k2'] = '2-mod'
            tx2.rollback()

    assert db['k1'] == '1-mod'
    assert db['k2'] == '2'

You can commit or roll-back transactions part-way through a wrapped block:

from lsm import LSM

with LSM("test_tx_2.ldb", binary=False) as db:
    del db["a":"z"]
    for i in range(10):
        db[f"k{i}"] = f"{i}"

with LSM("test_tx_2.ldb", binary=False) as db:
    with db.transaction() as txn:
        db['k1'] = 'outer txn'

        # The write operation is preserved.
        txn.commit()

        db['k1'] = 'outer txn-2'

        with db.transaction() as txn2:
            # This is committed after the block ends.
            db['k1'] = 'inner-txn'

        assert db['k1'] == "inner-txn"

        # Rolls back both the changes from txn2 and the preceding write.
        txn.rollback()

        assert db['k1'] == 'outer txn', db['k1']

If you like, you can also explicitly call LSM.begin(), LSM.commit(), and LSM.rollback().

from lsm import LSM

# fill db
with LSM("test_db_tx.ldb", binary=False) as db:
    del db["k":"z"]
    for i in range(10):
        db[f"k{i}"] = f"{i}"


with LSM("test_db_tx.ldb", binary=False) as db:
    # start transaction
    db.begin()
    db['k1'] = '1-mod'

    # nested transaction
    db.begin()
    db['k2'] = '2-mod'
    # rolling back nested transaction
    db.rollback()

    # comitting top-level transaction
    db.commit()

    assert db['k1'] == '1-mod'
    assert db['k2'] == '2'

Thanks to

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

lsm-0.5.3.tar.gz (897.3 kB view details)

Uploaded Source

Built Distributions

lsm-0.5.3-cp311-cp311-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.11 Windows x86-64

lsm-0.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

lsm-0.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

lsm-0.5.3-cp311-cp311-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

lsm-0.5.3-cp310-cp310-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

lsm-0.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

lsm-0.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

lsm-0.5.3-cp310-cp310-macosx_12_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.10 macOS 12.0+ ARM64

lsm-0.5.3-cp310-cp310-macosx_11_0_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

lsm-0.5.3-cp310-cp310-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

lsm-0.5.3-cp39-cp39-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

lsm-0.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

lsm-0.5.3-cp39-cp39-macosx_11_0_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

lsm-0.5.3-cp39-cp39-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

lsm-0.5.3-cp38-cp38-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

lsm-0.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

lsm-0.5.3-cp38-cp38-macosx_11_0_universal2.whl (2.2 MB view details)

Uploaded CPython 3.8 macOS 11.0+ universal2 (ARM64, x86-64)

lsm-0.5.3-cp38-cp38-macosx_10_15_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

lsm-0.5.3-cp37-cp37m-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.5.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

lsm-0.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

lsm-0.5.3-cp37-cp37m-macosx_10_15_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

lsm-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file lsm-0.5.3.tar.gz.

File metadata

  • Download URL: lsm-0.5.3.tar.gz
  • Upload date:
  • Size: 897.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3.tar.gz
Algorithm Hash digest
SHA256 91f948d1c3967dfd4fc532ea1211c7ef665f85cd821c767726f803f2df73cac7
MD5 3f85ffe089294c0da3059b7c06e91bb8
BLAKE2b-256 5080c77abb8f76aa854608a61def25b75f143065d8a1716ff9bce138f8966ff8

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.2

File hashes

Hashes for lsm-0.5.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 196ef6faa6a5195a1655e68ee0c79afd6bd284f4a846d1f4816d39a43c9a9854
MD5 422a82605143106db64aa6df12f5d18f
BLAKE2b-256 d25acce6161fe3d1e44bd72283f8b4fa4901fd9cebf9cfa8741106c24166813b

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d0276ae9e18d3a983508a34916b7787cdd8f8e726ddde85d866de52cd55ef777
MD5 559924dd5f009147d975f264c8d8ae0a
BLAKE2b-256 7f13d70c8cd06941b850b59adcb0bf04526bfc55f91af1f110317b83561010fd

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5c02a3c57667482385829c2b2fb3eb7ab7b09726b0688c7b5f764cdd6521ca27
MD5 b081b9df4db2c3f28dcf0de464a13197
BLAKE2b-256 5f2303a387c539abdc0a28b3166ba136c5ba92be1f9d7b5c6e267b7d2c45aec0

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

  • Download URL: lsm-0.5.3-cp311-cp311-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.11, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6116207821bdeaaf0372f59eadfc2777eab30b74cd670ac4e173e3a7198e68eb
MD5 68fb2190b7df08cb9b3503793c744a27
BLAKE2b-256 0c52024bff3f6d2a10066b3a5c5e4d1c9f4ff0ff5c08b8f32edc1e563351f01f

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for lsm-0.5.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fd204cd90a0b6163c7c2fcf39fd3cd9721aa0687966e8aba97ee89f475a53832
MD5 99f54ea0c7a337e644f717b9c2facc86
BLAKE2b-256 6ad86e091e205e214c10b7f06569babba9ae4e929002562d8e86affc28faaf9b

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1a9396b7a6f5ad3c607de646618c7a090b3bbba57d739b9e396604808e4ccba6
MD5 5df12d5e06e3170d7c60d70d85404077
BLAKE2b-256 1ef2dd02bc930b669a39d83720d9780edd9e7d562e2df022b8244047b9613de2

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4aa32487bacbddd4b5cd6b2dcce33f7ae7466d1ba44750e56b65d28ed1532def
MD5 c0dd178d3ea09c11185bbe47c128a4a6
BLAKE2b-256 81e67da503095cd0eb908c7ee785af0eb65f45ffb562acbec50a0cacc3a78137

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp310-cp310-macosx_12_0_arm64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp310-cp310-macosx_12_0_arm64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.10, macOS 12.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp310-cp310-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 8a04de0a8130f163cd03821df2dee4ca31ab9f8867a9f2536b0018c84d328ba3
MD5 ec020a55d85dbfc74ef72dca0629e519
BLAKE2b-256 fa5b62aac6935ae0971d605b4ebbe09d5aeda109ef9d9024bfffbe4fe187582a

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 2e69eb71912d5d4fa188c58e044fe9946ad7a3cedd88679006e4bb1e714c333f
MD5 3804ed194d1e4aecebc90650011fbd56
BLAKE2b-256 169e6de8fd78e0e097b31ff171a156debef2f70b2cbd6b9b4f4f9631226c6641

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

  • Download URL: lsm-0.5.3-cp310-cp310-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.10, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ecf1a453eafdce0013361cc11f9a27a74f86616f0a599a2295c74746394ac0ec
MD5 96d4f66baed7745b9be2a28b1f62ad44
BLAKE2b-256 80acb70581f7cfcc4b8333703417f1de572d995a8e40d24a8500366a32ff804d

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.13

File hashes

Hashes for lsm-0.5.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 1884ad69b51e7b1a91c2aad38de9a77ff91af9ee7aff46f878886de232bf4a44
MD5 bc1a295d5c58e5f4ed0513ed83d7fe44
BLAKE2b-256 d3279226ecfb68c672e1d6cfca90055b4c9441ed92de812cfda14de3ce605968

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e916755342269aa75fffc8b48b28d9a8c81e8ce626897aa3cd9b6bfd0cd36db2
MD5 9d0a8257497adbb360b51990ec0370e8
BLAKE2b-256 cfa8262b051ba6d170b621543ea84e8a85e352c4c5bd11af9bfc79ae8799f712

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.9, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b13ce24b99ff8a73771ef48cc3591803972a142b916c75877b7b6d24b0ba5a4e
MD5 ae41b979b607f4efb96d634c4799c219
BLAKE2b-256 5ef2be35bdbb12bb70803ce8503faf1ce5a5bf7745ee29057adbe25f4406569a

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6d1cd1906cd9e13d73ca684c6332399700166b26632a23b99fbd2162bd047225
MD5 96d317671d4c78222620d83d35a17c58
BLAKE2b-256 8efaf15eb47b67d9ced9b76936d39424889efb18ee4c2fda410df546c02ab11a

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

  • Download URL: lsm-0.5.3-cp39-cp39-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.9, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ed7a9b1507f42f7a3b1ae52d6e4cf8b47034ccb351b6648b1a82629bcb2969e2
MD5 cc9aadc88cebf66c1de9a862f9fdd2f1
BLAKE2b-256 3c13b36e92ac35750ddb28a54f662ecc6601f80dcf2ae91aca6625a67b962988

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.10

File hashes

Hashes for lsm-0.5.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 484eef52c462282ee5180354dd424a1924d030c0e5c1008b04ef645956d347bc
MD5 5f357a376ff1d67f22dc41af97a1ee3f
BLAKE2b-256 8ad19dc3f9bf282d6912d0e30601eb9b820bf8613942ef09e6a1f1ca51b716cc

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dfba8a6e07bc4ad7fc7e3b2f92fc28c565bbdc9669f237409e57ecda2b741148
MD5 37ceafdcabfa4e0931ee8a4403ec2c2e
BLAKE2b-256 bf93a8cb3c38db6bfed425e67fb578325dab59d5cf9c51e9ae5148da884091e8

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.8, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a8abf1be2b4343fe853b537de8ff29495930d4741b4324cd1ea99fcb27cef334
MD5 f4e5e90769b6d014d7f6a55af8ce50d3
BLAKE2b-256 081a14594717df991084f0d554a8fdf621293b5ddc86c61c323f44f2f2b849cb

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp38-cp38-macosx_11_0_universal2.whl.

File metadata

  • Download URL: lsm-0.5.3-cp38-cp38-macosx_11_0_universal2.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8, macOS 11.0+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp38-cp38-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2bc470cb9357fd39d17148ebc6d5ffc090f98ad9ec021968801df3f1c08c39d1
MD5 ad02c707cc3d89168ad206efda4e8773
BLAKE2b-256 38c3301c17e56c79a7d11ff854a0e505b9dadb37b1c7a6c817bdd8d641810fbb

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d1a218837da3ad0142e90377e5bc7b5edf30c345ef29e4d808bbc3f11a3a6543
MD5 6d56f66a9e887857bd49db701554ff63
BLAKE2b-256 63f94333774d75f3e6f861a85f784ed68716d7af51b5de762511809ae4528388

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for lsm-0.5.3-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 0a9086817812aa7efb5b1abca443cf2d97d32758dc49688f64b68ee6dc00fb28
MD5 bb4b5a1112bca7678a9292c38bd9d1fc
BLAKE2b-256 e2c9f0924b8767ef530d871e7b22298612e4fe9a9704c8bf1278ec732d8cfd62

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e94b22ae65d0a6ff93e21e57567d65b5ef679fadcff74dfef15ccf40e29d72d6
MD5 cd01286ef1c63323259f3586dcd11c15
BLAKE2b-256 a0954d54e0bdb0c401997b9aaa2bc4e3565606cb90809c8063dd795515b0172f

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c6fd241665787a54e41bdab150b69647ea309e53ac50a8e5a7d12f11926bdf94
MD5 9732f09133cdcb4658442cb6c594dfa1
BLAKE2b-256 bc0f885a5fb6a2044b358db9f137c2620dbba6fb51001c7f816f6f42aec18527

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.5.3-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 8a86a34d3cf467b77d12ae19eeb976cd3644f38d437d269fa4f9b02392a73e61
MD5 df151930165f8136e21f14f0b001ad81
BLAKE2b-256 e4973ae6076e48b17c98b4c478e83e28d297266cd79507ddf8452a2fffb1a4fe

See more details on using hashes here.

File details

Details for the file lsm-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: lsm-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/5.2.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.3-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ed9bdcba8cbb4429dd6623d1474229398681c9a29a49fad09ed62b242a29194e
MD5 eb53031e484d892cdcc71b4cbe08e5f0
BLAKE2b-256 81ae6f68413f70d737549ad28ac69500a4ffeccb75125ed53f34860062fc403f

See more details on using hashes here.

Supported by

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