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

Uploaded Source

Built Distributions

lsm-0.4.0-cp310-cp310-win_amd64.whl (747.6 kB view details)

Uploaded CPython 3.10 Windows x86-64

lsm-0.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (917.0 kB view details)

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

lsm-0.4.0-cp310-cp310-macosx_10_14_x86_64.whl (997.2 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

lsm-0.4.0-cp39-cp39-win_amd64.whl (747.7 kB view details)

Uploaded CPython 3.9 Windows x86-64

lsm-0.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (917.1 kB view details)

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

lsm-0.4.0-cp39-cp39-macosx_10_14_x86_64.whl (997.2 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

lsm-0.4.0-cp38-cp38-win_amd64.whl (748.2 kB view details)

Uploaded CPython 3.8 Windows x86-64

lsm-0.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (917.4 kB view details)

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

lsm-0.4.0-cp38-cp38-macosx_10_14_x86_64.whl (996.5 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

lsm-0.4.0-cp37-cp37m-win_amd64.whl (744.0 kB view details)

Uploaded CPython 3.7m Windows x86-64

lsm-0.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (917.4 kB view details)

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

lsm-0.4.0-cp37-cp37m-macosx_10_14_x86_64.whl (993.0 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

lsm-0.4.0-cp36-cp36m-win_amd64.whl (744.0 kB view details)

Uploaded CPython 3.6m Windows x86-64

lsm-0.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (917.4 kB view details)

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

lsm-0.4.0-cp36-cp36m-macosx_10_14_x86_64.whl (993.0 kB view details)

Uploaded CPython 3.6m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: lsm-0.4.0.tar.gz
  • Upload date:
  • Size: 381.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.4.0.tar.gz
Algorithm Hash digest
SHA256 5062d289df50a8b2612b6db7d4f45db56b29de0476a9bdd9c355464d106dba75
MD5 f6fbff84a0841af9ffb2539520f4e2ad
BLAKE2b-256 f4354c8f1c093d9ac225d6224af8dc0a1d164a1ac4569a9e41182e8046cae6ff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 747.6 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.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 675b87528b6f19c3e2d05abdb6d7f2cb09a032e0ebaca6fd4ff04e5f435c1555
MD5 06faf5612c387a39653b0441c62bab67
BLAKE2b-256 063afa8c9d267aa9727eb155bd63508432bee71fef78e810d2034131992e70d0

See more details on using hashes here.

File details

Details for the file lsm-0.4.0-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.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 55660140ed6a1882f563f3c253dd32cf3a3199f76acedaf9ab1f32edaaf12752
MD5 64c3816daaba5c799c116e11cd81d8ad
BLAKE2b-256 4e0debbfbb59099002cd91f80c98605523b057745d1a4d167faa32ce0a864919

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp310-cp310-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 997.2 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.4.0-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 7732085de0b82fcad7983cd5017ddf64a3aa5eba1fef1bbeb3b721778665f117
MD5 5422b52bf7f493c11b65bfdc7cc2c5b2
BLAKE2b-256 e05d5aea425801cb29a70b71f96864b0573416bc57bedeef3ca49a78130dcd58

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 747.7 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.4.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f4dffd5bed4318bae6e6c4fa10633da20861aebe8f42c866d0a6f0d0fcb72df7
MD5 7c82aa730a12995f3aed32fab0692cbf
BLAKE2b-256 588aa7f2994cb63be9f0cff8e6c2327f3aa20a28f07d128e9940c7e19aa32e36

See more details on using hashes here.

File details

Details for the file lsm-0.4.0-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.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7dbc7c3250e17c96c69944c454fe512d66a12178ba832467fe7c155249e230a0
MD5 81aa15ee26e857f862fe9a22e737d6b3
BLAKE2b-256 ac71a482a681c2a6aa2abcabbdb6a1c6e42b2e33a2837fd0d92b4f5839dfbcac

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 997.2 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.4.0-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 abb37a18ff505cac9bdca5b08e900ebbe49febf61af87730ed49772b26d3877a
MD5 f5d1e9f4640a6b37b196995b0ab40d5f
BLAKE2b-256 734ba4ee5caf7019b51b83fb6051a682a297c03902c46e4e1164f94b7345b849

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 748.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.4.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b67e3fa1243d90a52f82f18ccfa15920897530ef7cb1f65d0a6f67348b651b1a
MD5 266ee00a0cc65f9f98d4758dc53679a9
BLAKE2b-256 79646c1ae31bf0dfcae8df9bbccaee85661326f22d88463b40ee5869e9ae3e81

See more details on using hashes here.

File details

Details for the file lsm-0.4.0-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.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e6ee5eea619370da462ddb29cda695bd8c3758cbe344cb23a9c67dbf2bc887fe
MD5 666097dc0b6eabb996546f220b9c476a
BLAKE2b-256 826509b12710e7247dc23fd5026665286662210cfcbf181cea7a462c2837dfed

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 996.5 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.4.0-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 957d0a5358e3f574bfc5d14e0d4575a1fe1eab514036bbb62998b2875d6cdc3a
MD5 b2d194ef05b1572898cfcc3b73bbda12
BLAKE2b-256 4f5cbdad6b3faa7897367d45bbb47596f52d9efdde00186e25e4f841b1c4b066

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 744.0 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.4.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 09788fe0d7632e41734da3c433f9fc3b9b66636b065bc5ecd242083d26448c0b
MD5 08b9c8be6696ac676d5f6b71f25d5e12
BLAKE2b-256 adab349f57eabb88ea7ee38e5b49b30a388154f503684547327cb310eef88d66

See more details on using hashes here.

File details

Details for the file lsm-0.4.0-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.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 b45eb7615f252ad367f3d9111f4a0df3198005dd2abceb8f6d293a81509ad9fe
MD5 447a7b9773d92957b3f4eb98070bfe48
BLAKE2b-256 18c73421b539fd745f09c9e9858fd0937ad827793321328c0322d125d43c1af4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 993.0 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.4.0-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 cd974d0126132a2e12255ca06d075017482964e5cff515edd4321e4f62aeadf1
MD5 00c8eea66a163ebc5eca98d282df2e78
BLAKE2b-256 dc2695a902fd4cc45675156db8a727bf2e86b49eac98b489946d8c96734c83e5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 744.0 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.4.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 b4dbdceb585facf7e9c3133e1a824332c29a616226b184431af56f97aae24527
MD5 34c283ca2f0256993757e644c928e819
BLAKE2b-256 16559dc4e729f02fd675deab85510e749f04ce295a38cc93634b6ff853747fad

See more details on using hashes here.

File details

Details for the file lsm-0.4.0-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.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a43def0bd416667c86fa7668bfe60ff570372236db11d30071a477274847fb33
MD5 93b7bc0c2a16145f71f52f1abf08fb7e
BLAKE2b-256 66748d5555efed9966f96a07f31187c4cc03cebaf1d85093c060017651081b02

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lsm-0.4.0-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 993.0 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.4.0-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 f9f9f7e111fd3e1579833333f2dadab611e216a4ebe1a371b7acd76a1109260c
MD5 b058a165841d3f1c2c723fef36f0f0dc
BLAKE2b-256 f174ccfff2074c53e56700554152fbe637795571323b7a16afb684ec855ca1a9

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