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.4.tar.gz (891.3 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.11 Windows x86-64

lsm-0.5.4-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.4-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.4-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.4-cp310-cp310-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

lsm-0.5.4-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.4-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.4-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.4-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.4-cp39-cp39-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.5.4-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.4-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.4-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.4-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.4-cp38-cp38-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.5.4-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.4-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.4-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.4-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.4-cp37-cp37m-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.5.4-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.4-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.4-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.4-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.4.tar.gz.

File metadata

  • Download URL: lsm-0.5.4.tar.gz
  • Upload date:
  • Size: 891.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for lsm-0.5.4.tar.gz
Algorithm Hash digest
SHA256 2048586ce2202de895270e557500e86dc2127d44f5943b99091b9deb19380e55
MD5 c0255f353109131a4e675c4126c9c3df
BLAKE2b-256 066b0ffe3ccab39dc87807aa52ddde66c7947324bbf1827604df571a44c5a64e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 812654eeb02b4441445369b8ce2c8fc5a865e1e092e31e80b63f16fd2e3d2b6d
MD5 3a3dd66daf539455cc43da69856951b4
BLAKE2b-256 1fb77e63a1f8925aff680b39e4d71a035fc14621d22d6d5db29d8674ab136e39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f20b82b82faf3b88022fcbf2605fd22f21c641a58d849ae870e183cbfc1ffbe2
MD5 bf940dd02893cee6578d067e3b2c12de
BLAKE2b-256 17e08873804a2e76338ee47a5d99e1f652c294a552d31e0e57c8fc194481e31e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e89ec0cee4a86a86373f61bfacdff9c4e8a1527d46e8abbe579766c804af01a9
MD5 a0526b9f3b94ea934b6eb6a8c0cf8d10
BLAKE2b-256 1ffe88e2198b84f34b0583354cda3e35965e1b7be181bf6167c230104bbe9ad6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 672b1c37b9c42de0d1090a30b5dc2b0a25b76e6882f4912869be54dda5c8a597
MD5 477eec57e324d14613658a227d8e6636
BLAKE2b-256 8fbbe02a85da9e1da3ad7c150a4e52fb3427110d48daf23ff0d9442d4037b3bc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 bb498840c471c36d1a5a798323ab02e8dd0c748d9bfe8388e799e037a5bc46e3
MD5 1e5dca192616d40560dfac103815b0dd
BLAKE2b-256 ecd424221f9520260b8f812450f1055ad430e00557c1b77d15f623086a99c93a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 16373c7d6f2d7bcf3cf164d87fa331d33feb561ac2c6a4053d3c2187ae70314a
MD5 0b284d101923f9beb70be212acea7ba4
BLAKE2b-256 95296504dc500ba90f279b69052f1a07b1e288eb8627bfe1127b5bbeafb3099d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9f78ea0ee5324f543c89d28d43abd28e8582450bdc259a85d54b41e6448f66ec
MD5 0a169a345662dd55985e2d56381348bc
BLAKE2b-256 bcc2b5e7cb91dd837cce3a24186343b679aa6cb428b557570b61da8e333f2215

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 b265d3237b27019cc490c43f681646a6eb3b8d6c499f6f69e339dd9b430f3604
MD5 13ef6c52ab966b74a309a52a3dff83d9
BLAKE2b-256 c669b9ae85ff4c9ce982e104e6a7e27ad8feba2ed59f3897f2e63cc1730afdd5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 acc953e61e75b1efa36d909b604f1237762dedef955b065f77080bb5ccc06b6f
MD5 081775682466f06b35c9de985081c110
BLAKE2b-256 2e2c0dc11291fa4abd99e4366e33e9b18116cc93715dcc7406980b69f74fe622

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 54c848fea5cd8771bc62276c73fee69bdd84823d49a0a1d2efa6168494956e75
MD5 1378e5a6b28a7cca6fc63d7b2069385e
BLAKE2b-256 b5653dce69bc0103b3d0cb441ab1aee1238a415343bf9bd9dc5442cd8d8680c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 72e48572e75db24a3ef98aeafcb4e3c8c4b2546025e57bca859aa6e97574dfcd
MD5 b3df6687e16ac9f52d7ae43bb2766034
BLAKE2b-256 432d0e8548df768694fbe28974d65882ce11cac1c754ba6df08ba5918cf3203d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9bc285ebd1cc038bdbd15e00abc71a22c15d381a358744bd7816f9fb29955a44
MD5 53142c214b3f658e5473822aac147053
BLAKE2b-256 4c15c342a05fc632eafcc7dacd6f87262257d03def0a48e3226f974326dea52b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 cf9c95851fa41f8dbd590056f271fc5a9afab311a865a9f77cbd920e4f3f48c5
MD5 8a7ed707c56daa1c97adf37475faeb78
BLAKE2b-256 eaef5e65e774a7811a46a8c2bc810713d154e5b1419c5b1cb95401830e5c8d3d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 43dd488443eb0347f3ece19f77040888581190bd3f28c76dd217c90674b6f55d
MD5 bcc8f8a468ed8961da17cdfdce03c720
BLAKE2b-256 02bbddbdd88b68b5379b26c0029d6c4c3dee369f35c5fd8e8e5ae830e20d369d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 8589723021a4091e07fddfbf15ead6c4f99133502c00ca6ef9c118acb95d5163
MD5 34853068ae229c18047bc015a9592292
BLAKE2b-256 627d6f5e8e77e737e2c68d25d3450007626eb1a9a8c88b1bf90563133fa74ac6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1f6315cfb014abd49d4570708d97d8894406b3bca8a7b23865935059d156ca08
MD5 a52a03262f185b3e60aa25a197b79b29
BLAKE2b-256 da740b193cd2cf4aa0b770834cdc75bb487f85dbe62095d1ad60d88d6c3a5e38

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e8ab1e76acc867b5e72d0974623e3830d25d60e5cf48025b509ee3a0e27b33b8
MD5 e69366014a5d578b87ac2fab6ad14e70
BLAKE2b-256 84ce97aa7f86b59d6c276e50340773c35b285ad4215d7fdc8e863bce0946faa6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp38-cp38-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 57c4eab9fe6500c8b73333aa5c0fd23b23120ab9bffa512277903238480706ff
MD5 70abe5f2ed895fcaa6b68c5cbd165140
BLAKE2b-256 f52be7ea2e0b33e2f1dbda75f1e247d0271d0f3c06077dfa113a80e164a17bec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 97c4bc88284a0ef59f1a4726fef9bed575b5154f358b9bda171c057abe9568fe
MD5 abae8f4230240263c005e0fe20e2a6c4
BLAKE2b-256 ca4b620604464daffb6c96c764209d86927206e03bed2bd69b9fd7b276e987be

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 15809f186e2d5f44e31bce57792a6b1a0e6c945ad2cdf750386fdd8efe452b38
MD5 e046cccc7f261c47b2ff9dff56825ee8
BLAKE2b-256 1d59ae5308dd7b61b320181bddb2cf5cb21f1601937389f3bf806f18458d58ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ebe692d83456fd57bd24c5c057326f15dd517107aee56bdd1a063507234a9ebd
MD5 0631b74c515fc5536c7599f11ea6ab66
BLAKE2b-256 2fba150aa501e7ad631738adedaa32350d06523c8d747f7f1c7e769bf7a25ae2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8ccf2ba35e6814868592fa01be379ca2c33b25c558456d6f2b65f3ae6b5cb914
MD5 8e2b39fd81387c708023210f1b750f97
BLAKE2b-256 a49dac73c416c539ec7acee73de47a35293cb3eae70815e4b58f3d29ce78da33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.4-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f6b233641c9f40ba30aff20f7a7916c04e3bc6d8e3efeda29397d5d81b60c37e
MD5 3bde1d44616a4d79ba04608aaf2c22a6
BLAKE2b-256 8996aa39a1dad7d3f6e48351c5b3fcca1063be1c9e60736d8b085377b024fdd6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.4-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.4-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fd620afa8068699a877702a1003d542f8135e6f14b66bc49d581a6f4b19d9fbb
MD5 6ab45d2a890b745451356c674237ffc4
BLAKE2b-256 940eae9c9c64ef4f2cf93e12cf9fdc2e0e14a58cfa1203e5b5a141f71f502589

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