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')
>>> db.open()
>>> print(db)
<LSM at "/tmp/test.ldb" as 0x10951e450>

More pythonic variant is using context manager:

>>> from lsm import LSM
>>> with LSM("/tmp/test.ldb") as db:
...     print(db)
<LSM at "/tmp/test.ldb" as 0x10951e450>

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("/tmp/test.ldb", binary=False) as db:
...    db['foo'] = 'bar'   # must be str for keys and values
...    print(db['foo'])
bar

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

>>> from lsm import LSM
>>> with LSM("/tmp/test.ldb") as db:
...    db[b'foo'] = b'bar'   # must be bytes for keys and values
...    print(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("/tmp/test.ldb", binary=False) as db:
...    db['foo'] = 'bar'
...    print(db['foo'])
bar

Database apply changes as soon as possible:

>>> from lsm import LSM
>>> db = LSM("/tmp/test.ldb", binary=False)
>>> db.open()
True
>>> for i in range(4):
...     db[f'k{i}'] = str(i)
...
>>> 'k3' in db
True
>>> 'k4' in db
False
>>> del db['k3']
>>> db['k3']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "Key 'k3' was not found"

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:

>>> from lsm import, LSM, SEEK_LE, SEEK_GE
>>> db = LSM("/tmp/test.ldb", binary=False)
>>> db.open()
True
>>> db['k1xx', SEEK_LE]  # Here we will match "k1".
'1'
>>> db['k1xx', SEEK_GE]  # Here we will match "k2".
'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).

>>> [item for item in db.items()]
[('foo', 'bar'), ('k0', '0'), ('k1', '1'), ('k2', '2')]

>>> db['k0':'k99']
<lsm_slice object at 0x10d4f3500>

>>> 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.

>>> list(db['k0':])
[('k0', '0'), ('k1', '1'), ('k2', '2')]

>>> list(db[:'k1'])
[('foo', 'bar'), ('k0', '0'), ('k1', '1')]

>>> list(db[:'aaa'])
[]

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

>>> list(db['k0':'k99':2])
[('k0', '0'), ('k2', '2')]

>>> list(db['k0'::-1])
[('k2', '2'), ('k1', '1'), ('k0', '0')]

>>> list(db['k0'::-2])
[('k2', '2'), ('k0', '0')]


>>> list(db['k0'::3])
[('k0', '0')]

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

>>> del db['k0':'k99']

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

Cursors

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

>>> with db.cursor() as cursor:
...     for key, value in cursor:
...         print(key, '=>', value)
...
foo => bar
k0 => 0

>>> db.update({'k1': '1', 'k2': '2', 'k3': '3', 'foo': 'bar'})

>>> with db.cursor() as cursor:
...     cursor.first()
...     print(cursor.key())
...     cursor.last()
...     print(cursor.key())
...     cursor.previous()
...     print(cursor.key())
...
foo
k3
k2

>>> with db.cursor() as cursor:
...     cursor.seek('k0', SEEK_GE)
...     print(list(cursor.fetch_until('k99')))
...
[('k0', '0'), ('k1', '1'), ('k2', '2'), ('k3', '3')]

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 doubles as a context-manager or decorator.

>>> with db.transaction() as txn:
...     db['k1'] = '1-mod'
...     with db.transaction() as txn2:
...         db['k2'] = '2-mod'
...         txn2.rollback()
...
True
>>> print(db['k1'], db['k2'])
1-mod 2

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

>>> with db.transaction() as txn:
...    db['k1'] = 'outer txn'
...    txn.commit()  # The write is preserved.
...
...    db['k1'] = 'outer txn-2'
...    with db.transaction() as txn2:
...        db['k1'] = 'inner-txn'  # This is commited after the block ends.
...    print(db['k1']  # Prints "inner-txn".)
...    txn.rollback()  # Rolls back both the changes from txn2 and the preceding write.
...    print(db['k1'])
...
1              <- Return value from call to commit().
inner-txn      <- Printed after end of txn2.
True           <- Return value of call to rollback().
outer txn      <- Printed after rollback.

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

>>> db.begin()
>>> db['foo'] = 'baze'
>>> print(db['foo'])
baze
>>> db.rollback()
True
>>> print(db['foo'])
bar

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

Uploaded Source

Built Distributions

lsm-0.3.12-cp310-cp310-win_amd64.whl (725.9 kB view details)

Uploaded CPython 3.10 Windows x86-64

lsm-0.3.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.12-cp310-cp310-macosx_10_14_x86_64.whl (951.6 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

lsm-0.3.12-cp39-cp39-win_amd64.whl (726.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.3.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.3 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.12-cp39-cp39-macosx_10_14_x86_64.whl (951.6 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.3.12-cp38-cp38-win_amd64.whl (726.2 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.3.12-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.5 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.12-cp38-cp38-macosx_10_14_x86_64.whl (951.0 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.3.12-cp37-cp37m-win_amd64.whl (722.1 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.3.12-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.4 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.12-cp37-cp37m-macosx_10_14_x86_64.whl (947.4 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.3.12-cp36-cp36m-win_amd64.whl (722.1 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.3.12-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (873.4 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

lsm-0.3.12-cp36-cp36m-macosx_10_14_x86_64.whl (947.4 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.3.12.tar.gz
  • Upload date:
  • Size: 369.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.12.tar.gz
Algorithm Hash digest
SHA256 8c05ce4ba7272dbc172804380313dd3386ec03a1d5d91fa826762d75eddbc409
MD5 1e5ac8a566a2a6a4b69e9948f38709f7
BLAKE2b-256 76b770bd63917f34743374acaa5c72d1891eb254016a339194cd3a72c49d95fa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.12-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 725.9 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for lsm-0.3.12-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8f567c49ee8fe88fca2840d5c146f958bd08deb0d1233a758288e58c56d58ae4
MD5 24d80504fc308366b9ec4c2a4a61e1da
BLAKE2b-256 2a35b97ea334a037a96044eae06715f6b66d8dd07a665150509c7d3c63c1eaf7

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3cf57af8c29c961e67525400fe82472a8668c6992af1750f566214b77272282c
MD5 5c422797a7aaf207d7f5fa14f4911b6c
BLAKE2b-256 852c485fcd8007a8f448d2e3bd15d53aa7c82871f7fb76c15b37688a2f3c8670

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.12-cp310-cp310-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.6 kB
  • Tags: CPython 3.10, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for lsm-0.3.12-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 73a3424051ffef247cb017d3be7182f93b9095e68d3fbb5cf5c9e4ac1a91a8d2
MD5 84ab434816361849fad057a7594bb988
BLAKE2b-256 d2c399810877e0f5d4dcb7fd0ac02e1b8f7a92dc3a8ff2d402d66af3a0031dc5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.12-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 726.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.12-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c26972d615b9c9e6d07980b013d41a82ed12091d89ca12e69362c8314f9dba34
MD5 b8a86964f85f15ebff5bfc23989ef5bb
BLAKE2b-256 867397bb10b4c718b1d75237e3cad5ff939333c386a92a91fa0e7ea5f465622b

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a490ec5a40259cc02da3583fdc527a03989b8a974c967fc862d67aaf789a2831
MD5 22a80bb3811c4fa1d18ca909b0437bb8
BLAKE2b-256 b503f397ff89e9ec4392ba12bf8253ee7fe7180945267ce0a3bf3550b71916f2

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.12-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.6 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.8

File hashes

Hashes for lsm-0.3.12-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 83273f4f9d7e837abdcb05906c256d008e0113e93d3f3ab3ba03af09635e3c8c
MD5 2166eda5f08fd0df95875ae3879c9ee6
BLAKE2b-256 e20c02b1973366fe72d319a538012f1742b3ef3e83f8771542e1ca7a0d13a8e0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.12-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 726.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for lsm-0.3.12-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 03ba7f338bf9efe411b914502af13f7db0e7fe24a6334b3edcf794db27e84e76
MD5 2db90ac8659320486e44b387ac78e9d1
BLAKE2b-256 99270e035140bbb48b126a634ee3ff8a9be114c0ddb8c3bfca5388a9d636b9e5

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.12-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 fafcb88a39ff35e7a2929eeae1380d43facff09913851ea1634dfb27a9101bef
MD5 56b739eff6d32e3b105bf605f0031645
BLAKE2b-256 5421815484d531c24c11e7def7b0f1b907089452db2b1f734799ffc91e432165

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.12-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 951.0 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for lsm-0.3.12-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 842c190228f25b47dee68498a87827d5319fe9bd4929f3668f69050f7ec828c9
MD5 3e7dd919cd52dfdfeaa59160384b4e95
BLAKE2b-256 c81af261758c5c21adbe2e58357a72f10a085043eace22f8e108e65127f9de24

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.3.12-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 722.1 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.9

File hashes

Hashes for lsm-0.3.12-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 4668bb79db85b29d8b751a09254d394b10e1a13afec8c103dd3e5141ebaecb5b
MD5 24f16d22e44177e6482e168734651b27
BLAKE2b-256 fa9df0bab907b3cd130c441cbffd87d00c64403df1379003a13d5361b1e5cc2b

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.12-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 778c75c702f84fc9383c0fd3bb168fbe4dfff0a7d1e34dcdf9be8b0372c08009
MD5 03b66574db904cb85199e84151f43bbf
BLAKE2b-256 68c4a7d64a01e009af733c8500c541e6671f944846d19ef70d30b7e8b681a770

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.12-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.4 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.12

File hashes

Hashes for lsm-0.3.12-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 1d9259d56346c5c42176a6528dc93fa494391406335e05c7858fb1f0bfa0a2b5
MD5 9316d659b5f3e504bb4e5b01bceffdb3
BLAKE2b-256 6a0f89a334565bc63a78f5cb056664b5635e56d94c29c2a9c5f6291637f0f2a3

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: lsm-0.3.12-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 722.1 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.6.8

File hashes

Hashes for lsm-0.3.12-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 2db70ad4b70a3a273bba2cc9ad7a3fce6cadbac782fe6485b824a8c3055256a1
MD5 c1c710c709ecc240676aff7e719c93e0
BLAKE2b-256 41b076d215a03fdb989ebe7c3beb862fb708adffc073e9e54812c79b5b7a695a

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for lsm-0.3.12-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 b5d2a41c8d475c0a98a7535758ae30598f2c4bf1a30c098cc722df3d0c1e6fc1
MD5 d5b51547a4ba7508e074069f2aab86e0
BLAKE2b-256 4b114567fb3b36f79b4d1a56d07e6dc6163a227731b50a7f103ae0636b0a916f

See more details on using hashes here.

File details

Details for the file lsm-0.3.12-cp36-cp36m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: lsm-0.3.12-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 947.4 kB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.6.15

File hashes

Hashes for lsm-0.3.12-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 593d374f2e4af00078e67279e6cba292b8cdbaa3260074caf275b094a49a7b6b
MD5 9159c7a696872c261e5ba5eae8d95f22
BLAKE2b-256 77c5515bebd3a096dd7fb1a1528537b6dd7ce6994854a052c4b5c8d71e9ff7f5

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