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

Uploaded Source

Built Distributions

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

Uploaded CPython 3.10 Windows x86-64

lsm-0.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.4 MB view details)

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

lsm-0.4.1-cp310-cp310-macosx_10_14_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

lsm-0.4.1-cp39-cp39-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.4 MB view details)

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

lsm-0.4.1-cp39-cp39-macosx_10_14_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.4.1-cp38-cp38-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.4 MB view details)

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

lsm-0.4.1-cp38-cp38-macosx_10_14_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.4.1-cp37-cp37m-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.4 MB view details)

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

lsm-0.4.1-cp37-cp37m-macosx_10_14_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.4.1-cp36-cp36m-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.4.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.4 MB view details)

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

lsm-0.4.1-cp36-cp36m-macosx_10_14_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.4.1.tar.gz
  • Upload date:
  • Size: 798.8 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.4.1.tar.gz
Algorithm Hash digest
SHA256 02389051eeddc6211f1ad1dd9973576db607174f93a86f793fca1e834c60b983
MD5 20b66edf09bceedef9b0bf4d4aaf3b3c
BLAKE2b-256 fa742782815c5af982ca2f7009f7940ebb1e6ff79b2fb0a9ca277ca5f717fc03

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-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/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.4.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1948d7667cb3984507df766c6ac22cb4f14dee80658c65f6f86f5856a024ae98
MD5 f6db481e4d9f7f56c3471084f178dc89
BLAKE2b-256 20099cee27b38a3db88462f5c121c7e28453af758a27d1fbeafd4c88b0943fdb

See more details on using hashes here.

File details

Details for the file lsm-0.4.1-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.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 dbc9b8aa46232746727f9cf76dc1f7bf522eda33a6697c794ecf3809abbb9b2c
MD5 9490345799d1a54723007e662c1308f0
BLAKE2b-256 2b9bad615a421f16b47682b28e6ca3386a31e252ae407cc3b965464865e3a4e0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp310-cp310-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • 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.4.1-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 0213e0b4bad928273275ce0258f89a61540364da73814a046a1961c4903ffaa9
MD5 a5abaf8aca61c1794dd641fd35cf9d29
BLAKE2b-256 c86d1252857ac182a714d505ac9a112e3107eefa032976eda6dd7d6da4d15a59

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • 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.4.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c66a63148f84cc181ce073e5b07b39cb9601f0514f652992778d42a8800807d7
MD5 3073cce4a7a2bd3af0d1a602aed28f57
BLAKE2b-256 4724f3ad850d816b8fce9fbc9ad08f511af1e2202654dcae230d22e8cd254c86

See more details on using hashes here.

File details

Details for the file lsm-0.4.1-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.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a7ca3b410834dd9357e38ea7ca14cd46322af3ca36ce0967fd9ce77f65c76635
MD5 05bbbe7f32e3e0c234ac3fb9e6030f41
BLAKE2b-256 04c13e41c06fe95e3b9218be56697d03953a87106e4a97b5f705c8f858b3d4b0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • 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.4.1-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 0b0c3a76be7cc5fe66f8ae02e05dad662e8a884499d36d26457306e0dc3eb9cb
MD5 49b4156e507824edd7b926548d38976a
BLAKE2b-256 97b466bb0c7d705fa067133a44d2c5a645939a6d379a62334526661606475340

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • 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.4.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 3478496c7f2baebf405314ff88f2409044ea12c2f00b9eb69888931bb2eb6ef3
MD5 4fea469db9d31a8285734c65833b83f9
BLAKE2b-256 0cd85b5f8c4c12aef7ee3f0c82dfac979d53687eabb9f954efb7b05b8e1c5b89

See more details on using hashes here.

File details

Details for the file lsm-0.4.1-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.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 eac49ffee37b5cf77f3d3fe0630f6fc510ca05f301072fef341ab23d6cfc739b
MD5 a14090f99e612f8fbd1e0f8b8141e2ea
BLAKE2b-256 847c5cddd94f728578f927aa0a735b252f62a685cb34a580c839cfcb3292ca49

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • 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.4.1-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 b9e22cb4632c86a5467bb541eedbb95d53fd09c4f15bae589bc7bfba257b5690
MD5 664e6aab3723c0ffc3a3d0af2d547233
BLAKE2b-256 b6aa40db49b7dbada1939392fd7dacd49f565019e7dc54416f15cb7505281c3b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • 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.4.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 53feb5fe0388dc549d1a0ba302705dd612abbc3424ad408cfd65473d907d1e58
MD5 5925bb2db61375e99d53daab574f7a0d
BLAKE2b-256 cf3de39145dd2998f8bd2b1fed41851d67429131d76b9f432b207759625909b6

See more details on using hashes here.

File details

Details for the file lsm-0.4.1-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.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 528eb62291371fa69e7ba323ae40ca841c4273ec4b9cb6407f019c59b3fab611
MD5 7e91f32f4c37407f3d46a08ba0b315ef
BLAKE2b-256 cded9e084d528c209807894138bcda09c1f8b347c315326639b56fb2ba37e88a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • 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.4.1-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 26a65fb48f3f6058cc46f306c4012210eb62e0966c7aaf6e4620f273e5519134
MD5 0cc34ba294386e23c7f752f51948bc8f
BLAKE2b-256 ec8a9c8af3721beeecf5de7afb62f5e3c711649176c0de8bfffc5915999942bd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • 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.4.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 b9e3124132a714c1f3438827b928a2be9bcba5afb3d36b931de50e630f3c2a42
MD5 95a5a144418e36ca59a83cf4bf43ef98
BLAKE2b-256 6707a05755a363d7f9e2d98e8575795362979659bfea62e65385c703f3b85936

See more details on using hashes here.

File details

Details for the file lsm-0.4.1-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.4.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 11efa31fbfbc7e99fa19061e8578e768a0dcb99cb722e60e1f1f51ae54c68644
MD5 a584b199416aed00c3ae5d259ac8d828
BLAKE2b-256 b2a55f5d6544742865ad084330dae73adb055320320d4ad2c83682a8ffe362b5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.1-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • 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.4.1-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 fd072dbcd3cf5c1fc903aab59dee5b0250b206028ba2192f555836dc7284b09c
MD5 4ab670cdf171dd81c787b80751e52e2f
BLAKE2b-256 1e2ff03cffc8c23c7e6b46f4e2701b3982009f253ba6f5f801802c26fb2fee2b

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