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

Uploaded Source

Built Distributions

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

Uploaded CPython 3.11 Windows x86-64

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

Uploaded CPython 3.10 Windows x86-64

lsm-0.5.2-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.2-cp310-cp310-macosx_12_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.10 macOS 12.0+ ARM64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.7m Windows x86-64

lsm-0.5.2-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.2-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.2-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.2.tar.gz.

File metadata

  • Download URL: lsm-0.5.2.tar.gz
  • Upload date:
  • Size: 891.2 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.2.tar.gz
Algorithm Hash digest
SHA256 5b2a8f9875442d0686abb60c3ac670b4a6fe036b35fe68a46fbb7e399267687a
MD5 1b4e748cf7bb77719f92880454cdaaaf
BLAKE2b-256 cbf3e667863f262f19523ef0c0ed41c325812e9937ebfe3638d55543ee574633

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 38bdbe3100302d7960b6d79f5d79b05198a1f5bce4353a9fe4b526d2e656513a
MD5 69c27818038dda92f5ad5503b1d2b5d6
BLAKE2b-256 65ee5655bf03af08e575c33d3e64cdfea991830afaa627b35f6e00ea1064067b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fa8dafdfe82afd6978ef3a2c12a09af5f6643ede5c5565803a2c7799afdee22e
MD5 a5ac40ef41b10e6833df08722ccf7c88
BLAKE2b-256 480312ddd798f83b8af7f729303bce813e7762f463b9c430ceeb049fc5204c04

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.8.3 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/21.8.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.2-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9010ee9358659c5c53eb06a96f7c896c9b4aed8be19a8c96102a6fee52f83d02
MD5 87054df75ed95120d7e2a2bec111a926
BLAKE2b-256 44e848fd899ed86aae3fd8da359a941f087088db2f4495bfe0b2c4ede508c2f9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dac645656f7583f94b3aced12301b5b0895eb0952bc6d836b62befc93f390eea
MD5 2fa916bd0c9a13a5f96147ccf5d2f138
BLAKE2b-256 20244238993fc164d227764b8401c5282252a64d7b68e0c3379ea992e05ea9f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 df227219f81334e8485e076e192ab20cb91db223301d86111a755734b620c732
MD5 51f575600dbd30f78c70341e3bc11a4d
BLAKE2b-256 4908ffe8aeca30ceaeb7b73f19a99a8e021f6613660a483d00d7eece0c2360e1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.8.3 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/21.8.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.2-cp310-cp310-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 4a06cbd501e5d5c5f4a11177d0c2d0a7ed67e3017c2b8603b7e42b134c31606e
MD5 fdf01e656b96854ea85b3879072b9e1b
BLAKE2b-256 bc0c5b5f938e0afa303cb4b1cd0c8f61190363c786767716643e867d789bdff3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 94ec615423db3580747f6ce57fc6276aff41cd02e4633a64744622a9ff0556e0
MD5 56c460a165a6e4d95cc63076d0a5fed2
BLAKE2b-256 953abae8a04d0d6d111a9807263e27b178ef8b4d681962f62f2d61c7bd551329

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.8.3 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/21.8.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.2-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9d787f7c78de5ed4ee068f6a871ea071570e3a5c302f9bea6ef49730563eec9c
MD5 5eb715f05c3defc32b905fa34fe23752
BLAKE2b-256 6a474e137d45836520a7d00e13d32baa796368465ae86b93efec8bafef3992ae

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8e06f5c87f0dd14a24cbb42efc5370681db92ff3667f6245689606207b0d0b7c
MD5 76f3b921ce86e646ccb2296bee0ce564
BLAKE2b-256 9ba7035b1226a25864d4b9767a97bb5772deb53bfbb30bfc6146e730d26c5327

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c01c9dba2c6ee1ff1b479c50874d687fe516d51db3b23ceee5eb6735f7d06714
MD5 27b9a121c1b175d4ed48ed4afdae17ab
BLAKE2b-256 a5d48d78841393dbd20b6633ea1831102deaaf00fe69432b71d5b2f455fac9c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 51ad010d6fb49b18980bf9554e1401d192addbca47721a819be18fdb0521f3e2
MD5 0157298401c6f1409d40ba921dd5d72a
BLAKE2b-256 f5a37b518c355b3a32b8a58b7b3b5096c097799cecbeb83b6effa8b4f39111b2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.8.3 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/21.8.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.2-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9f941b7fc3d29b3bf342e9136366807a1512459c4eaa4dce7681d57386b739e8
MD5 0eba66c57249cea4006b5bf9dd27d8a3
BLAKE2b-256 5aa95cc56d9d3ca1cca5005f399ee498411d91ec4efac00f337834092cadb04a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 ae87b796953078d68468aaec08d6ba819df1c836cc17e17140aab5dcb256c53b
MD5 530fe9c3c123503d8d780dee3ada3519
BLAKE2b-256 3e4e58c65e780a1037ff8cc1b4369c33d87a51ec1b77e05fadf3d4c2e16a6427

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5459378c7dc41f44533ab97279d96966f6e8ab35cb8e05506c22b270bc919bf6
MD5 2f03ad5d5ddbde5c82f7117c7cda2940
BLAKE2b-256 a6a26386c5a5fd7ba6b055dd543831bf22b473a3380d6587ec361fdec205e9f7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.8.3 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/21.8.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.2-cp38-cp38-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 db0f342529721476f9d976ed08696c59b3efe8df237fd2a552b9a2a294fa63b3
MD5 cd2a0ea24905854533b1c24989f19d8e
BLAKE2b-256 5c9727ba672aef3b2f1025e621c07224edbbab511458f095b56c8c41132c9cd6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 391642a39b13f001211a150d59c07ab12a5ff2ee858655a4ad989dc60b49858d
MD5 99b2a9d6f1c3b9e9f52d2bada5e1b4f5
BLAKE2b-256 5cc507937689a5eb2f20cdbc4cd40ef96dcbec2f319e7a3a7e182faf9f31e7e6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 0944b3e75fb8dd5a3890d8840fd530a91a7c5c2b6183e843117e465dc2f0247e
MD5 ea0dfe33f9b364d8d07971bd933442de
BLAKE2b-256 4e7461c58a2deffcea2b673b5e53a67a36547e929823bfa9b600e3fce2c1f309

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5f5aac1404061a8f445d82457640b6885431330ec6ff7d5f62155ef8aa8f34ab
MD5 a3a4217c649ec51daad082d97565dc04
BLAKE2b-256 35834acf122665bce13916046a9da2824cb1372297c1c6310b01df8b345e7098

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lsm-0.5.2-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b23d593fd332e68adabae99881c2070ced66a5debf1ad7c8c1777077f0501366
MD5 f4e9923ce0a4b99af73927cf5a08b2f0
BLAKE2b-256 5f4568f2e3fc6bf1e901d628e28947e731a244bea35626d60349c09c3d7d2373

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.5.2-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.8.3 readme-renderer/32.0 requests/2.28.1 requests-toolbelt/0.9.1 urllib3/1.26.12 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/21.8.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for lsm-0.5.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 dfe2eb9fd839310774a1e0e34e2b4e955ae80518504c133d04b5fddf35c524a1
MD5 76f2a1f2dc741fd5329e76c2dc7c8c01
BLAKE2b-256 c58546bca7b31c725da92f223d51269f353022b3f04373e79c3206d78d8d5ee9

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