Python C Extention 2 Sequence Compare
Edit distance, Similarity and 2 sequence differences printing.
How to Install?
pip install cdiffer
Requirement
- python3.6 or later
cdiffer.dist
Compute absolute Levenshtein distance of two strings.
Usage
dist(sequence, sequence)
Examples (it's hard to spell Levenshtein correctly):
Help on built-in function dist in module cdiffer:
dist(...)
Compute absolute Levenshtein distance of two strings.
dist(sequence, sequence)
Examples (it's hard to spell Levenshtein correctly):
>>> dist('coffee', 'cafe')
4
>>> dist(list('coffee'), list('cafe'))
4
>>> dist(tuple('coffee'), tuple('cafe'))
4
>>> dist(iter('coffee'), iter('cafe'))
4
>>> dist(range(4), range(5))
1
>>> dist('coffee', 'xxxxxx')
12
>>> dist('coffee', 'coffee')
0
cdiffer.similar
Compute similarity of two strings.
Usage
similar(sequence, sequence)
The similarity is a number between 0 and 1, base on levenshtein edit distance.
Examples
>>> from cdiffer import similar
>>>
>>> similar('coffee', 'cafe')
0.6
>>> similar('hoge', 'bar')
0.0
cdiffer.differ
Find sequence of edit operations transforming one string to another.
Usage
differ(source_sequence, destination_sequence, diffonly=False, rep_rate=60)
Examples
>>> from cdiffer import differ
>>>
>>> for x in differ('coffee', 'cafe'):
... print(x)
...
['equal', 0, 0, 'c', 'c']
['delete', 1, None,'o',None]
['insert', None, 1,None,'a']
['equal', 2, 2, 'f', 'f']
['delete', 3, None,'f',None]
['delete', 4, None,'e',None]
['equal', 5, 3, 'e', 'e']
>>> for x in differ('coffee', 'cafe', diffonly=True):
... print(x)
...
['delete', 1, None,'o',None]
['insert', None, 1,None,'a']
['delete', 3, None,'f',None]
['delete', 4, None,'e',None]
>>> for x in differ('coffee', 'cafe', rep_rate = 0):
... print(x)
...
['equal', 0, 0, 'c', 'c']
['replace', 1, 1, 'o', 'a']
['equal', 2, 2, 'f', 'f']
['delete', 3, None,'f',None]
['delete', 4, None,'e',None]
['equal', 5, 3, 'e', 'e']
>>> for x in differ('coffee', 'cafe', diffonly=True, rep_rate = 0):
... print(x)
...
['replace', 1, 1, 'o', 'a']
['delete', 3, None,'f',None]
['delete', 4, None,'e',None]
cdiffer.compare
This Function is compare and prety printing 2 sequence data.
Usage
compare(source_sequence, destination_sequence, diffonly=False, rep_rate=60, condition_value=" ---> ")
Parameters :
arg1 -> iterable : left comare target data.
arg2 -> iterable : right comare target data.
keya -> callable one argument function : Using sort and compare with key about `a` object.
keyb -> callable one argument function : Using sort and compare with key about `a` object.
header -> bool : output data with header(True) or without header(False). <default True>
diffonly -> bool : output data with equal data(False) or without equal data(True). <default False>
rep_rate -> int: Threshold to be considered as replacement.(-1 ~ 100). -1: allways replacement.
startidx -> int: output record index starting number. <default `0`>
condition_value -> str : Conjunctions for comparison.
na_value -> str: if not found data when filled value.
delete_sign_value -> str: if deleted data when adding sign value.
insert_sign_value -> str: if insert data when adding sign value.
Return : Lists of List
1st column -> matching rate (0 ~ 100).
2nd column -> matching tagname (unicode string).
3rd over -> compare data.
Examples
In [1]: from cdiffer import compare
... compare('coffee', 'cafe')
[['tag', 'index_a', 'index_b', 'data'],
['equal', 0, 0, 'c'],
['insert', '-', 1, 'ADD ---> a'],
['delete', 1, '-', 'o ---> DEL'],
['equal', 2, 2, 'f'],
['delete', 3, '-', 'f ---> DEL'],
['equal', 4, 3, 'e'],
['delete', 5, '-', 'e ---> DEL']]
In [2]: compare([list("abc"), list("abc")], [list("abc"), list("acc"), list("xtz")], rep_rate=50)
[['tag', 'index_a', 'index_b', 'COL_00', 'COL_01', 'COL_02', 'COL_03'],
['equal', 0, 0, 'a', 'b', 'c'],
['replace', 1, 1, 'a', 'b ---> DEL', 'ADD ---> c', 'c'],
['insert', '-', 2, 'ADD ---> x', 'ADD ---> t', 'ADD ---> z']]
In [3]: compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=40)
[['tag', 'index_a', 'index_b', 'data'],
['equal', 0, 0, 'abc'],
['replace', 1, 1, 'abc ---> acc'],
['insert', '-', 2, 'ADD ---> xtz']]
In [4]: compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=50)
[['tag', 'index_a', 'index_b', 'data'],
['equal', 0, 0, 'abc'],
['replace', 1, 1, 'abc ---> acc'],
['insert', '-', 2, 'ADD ---> xtz']]
Performance
C:\Windows\system>ipython
Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.21.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from cdiffer import *
In [2]: %timeit dist('coffee', 'cafe')
...: %timeit dist(list('coffee'), list('cafe'))
...: %timeit dist(tuple('coffee'), tuple('cafe'))
...: %timeit dist(iter('coffee'), iter('cafe'))
...: %timeit dist(range(4), range(5))
...: %timeit dist('coffee', 'xxxxxx')
...: %timeit dist('coffee', 'coffee')
125 ns ± 0.534 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
677 ns ± 2.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
638 ns ± 3.42 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
681 ns ± 2.16 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
843 ns ± 3.66 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
125 ns ± 0.417 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
50.5 ns ± 0.338 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [3]: %timeit similar('coffee', 'cafe')
...: %timeit similar(list('coffee'), list('cafe'))
...: %timeit similar(tuple('coffee'), tuple('cafe'))
...: %timeit similar(iter('coffee'), iter('cafe'))
...: %timeit similar(range(4), range(5))
...: %timeit similar('coffee', 'xxxxxx')
...: %timeit similar('coffee', 'coffee')
123 ns ± 0.301 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
680 ns ± 2.64 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
647 ns ± 1.78 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
680 ns ± 7.57 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
848 ns ± 4.19 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
130 ns ± 0.595 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
54.8 ns ± 0.691 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [4]: %timeit differ('coffee', 'cafe')
...: %timeit differ(list('coffee'), list('cafe'))
...: %timeit differ(tuple('coffee'), tuple('cafe'))
...: %timeit differ(iter('coffee'), iter('cafe'))
...: %timeit differ(range(4), range(5))
...: %timeit differ('coffee', 'xxxxxx')
...: %timeit differ('coffee', 'coffee')
735 ns ± 4.18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.36 µs ± 5.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.31 µs ± 5.25 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.37 µs ± 5.04 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.33 µs ± 5.32 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.07 µs ± 6.75 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
638 ns ± 3.67 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [5]: a = dict(zip('012345', 'coffee'))
...: b = dict(zip('0123', 'cafe'))
...: %timeit dist(a, b)
...: %timeit similar(a, b)
...: %timeit differ(a, b)
524 ns ± 2.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
539 ns ± 2.23 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.07 µs ± 1.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [6]: %timeit compare("coffee", "cafe")
...: %timeit compare([list("abc"), list("abc")], [list("abc"), list("acc"), list("xtz")], rep_rate=50)
...: %timeit compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=40)
...: %timeit compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=50)
844 ns ± 3.88 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
3.32 µs ± 6.92 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.16 µs ± 3.94 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.3 µs ± 31.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Release files for cdiffer 0.7.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cdiffer-0.7.2.tar.gz | 30.8 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| cdiffer-0.7.2-cp39-cp39-win_amd64.whl | CPython 3.9 | CPython 3.9 | Windows x86-64 | Details |
| cdiffer-0.7.2-cp39-cp39-manylinux2010_x86_64.whl | CPython 3.9 | CPython 3.9 | Linux glibc 2.12+ x86-64 | Details |
| cdiffer-0.7.2-cp39-cp39-macosx_10_16_x86_64.whl | CPython 3.9 | CPython 3.9 | macOS 10.16+ x86-64 | Details |
| cdiffer-0.7.2-cp38-cp38-win_amd64.whl | CPython 3.8 | CPython 3.8 | Windows x86-64 | Details |
| cdiffer-0.7.2-cp38-cp38-manylinux2010_x86_64.whl | CPython 3.8 | CPython 3.8 | Linux glibc 2.12+ x86-64 | Details |
| cdiffer-0.7.2-cp38-cp38-macosx_10_16_x86_64.whl | CPython 3.8 | CPython 3.8 | macOS 10.16+ x86-64 | Details |
| cdiffer-0.7.2-cp37-cp37m-win_amd64.whl | CPython 3.7 | CPython 3.7 pymalloc | Windows x86-64 | Details |
| cdiffer-0.7.2-cp37-cp37m-manylinux2010_x86_64.whl | CPython 3.7 | CPython 3.7 pymalloc | Linux glibc 2.12+ x86-64 | Details |
| cdiffer-0.7.2-cp37-cp37m-macosx_10_16_x86_64.whl | CPython 3.7 | CPython 3.7 pymalloc | macOS 10.16+ x86-64 | Details |
| cdiffer-0.7.2-cp36-cp36m-win_amd64.whl | CPython 3.6 | CPython 3.6 pymalloc | Windows x86-64 | Details |
| cdiffer-0.7.2-cp36-cp36m-manylinux2010_x86_64.whl | CPython 3.6 | CPython 3.6 pymalloc | Linux glibc 2.12+ x86-64 | Details |
| cdiffer-0.7.2-cp36-cp36m-macosx_10_16_x86_64.whl | CPython 3.6 | CPython 3.6 pymalloc | macOS 10.16+ x86-64 | Details |
Total release size: 9.6 MB
Release files / cdiffer-0.7.2.tar.gz
| Download URL | cdiffer-0.7.2.tar.gz |
|---|---|
| Size | 30.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d72409850a5cb03b9c47d04a5328bdcd521bd1b4277c08b37a8f7ae4a0d7a5e7
|
|
BLAKE2b-256 checksum How to use checksums |
fd550606c03869f8c9ea2036cbfe1106de5ad5ab95ff76e56aebe52c9cd5ca63
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp39-cp39-win_amd64.whl
| Download URL | cdiffer-0.7.2-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 554.3 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
693b517e3d3e10cb65a2f1e41366ea88fe23cb012e60e8306f6ce1a559e54353
|
|
BLAKE2b-256 checksum How to use checksums |
5fe9c0ed061e755e79a4c67575b7c6bfd2d4c44a774130ed2113a037ea9695fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp39-cp39-manylinux2010_x86_64.whl
| Download URL | cdiffer-0.7.2-cp39-cp39-manylinux2010_x86_64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.9 Linux glibc 2.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
fde77caf855e42639ff54711a5a74e814d71b3f8d0261de8665db6ced53420b2
|
|
BLAKE2b-256 checksum How to use checksums |
dfcc8f45eeca007ae4006b764c95e236040decb669eb4121fa7755d149f1df89
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp39-cp39-macosx_10_16_x86_64.whl
| Download URL | cdiffer-0.7.2-cp39-cp39-macosx_10_16_x86_64.whl |
|---|---|
| Size | 442.2 kB |
| Tags | CPython 3.9 macOS 10.16+ x86-64 |
|
SHA-256 checksum How to use checksums |
0add3c3d74227d3cb4c05c38d03e0b454563c1e194e62bdf8c07e92359cba0fd
|
|
BLAKE2b-256 checksum How to use checksums |
10d50a6b8577e8d4c7d05478c621ced5301d6e71c8f4eca792c537fef5451f4e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp38-cp38-win_amd64.whl
| Download URL | cdiffer-0.7.2-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 553.1 kB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
dfa5cedd5f370966ef1af0164726b4637ddc7e324bbb1ff6945941668bbe06e5
|
|
BLAKE2b-256 checksum How to use checksums |
27a384d1f64ee831453dedd9fc3de2cd149426f9e4c7a91e0ec24dc61b5c8236
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp38-cp38-manylinux2010_x86_64.whl
| Download URL | cdiffer-0.7.2-cp38-cp38-manylinux2010_x86_64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.8 Linux glibc 2.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
17701a0f5affb2dfdad1e3bb0cdbb352a66b1bf8548f2a8d78470387e4972848
|
|
BLAKE2b-256 checksum How to use checksums |
6eb10e6b2198ff4fb9fd3ccad8623d3014ee0ba6027ef09fe84369bea2be0037
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp38-cp38-macosx_10_16_x86_64.whl
| Download URL | cdiffer-0.7.2-cp38-cp38-macosx_10_16_x86_64.whl |
|---|---|
| Size | 441.8 kB |
| Tags | CPython 3.8 macOS 10.16+ x86-64 |
|
SHA-256 checksum How to use checksums |
e59d03e0be3dadb9009d9c620bd5a1c53210d584ec6361d0606f83358a7ab203
|
|
BLAKE2b-256 checksum How to use checksums |
add0c8520a170649324a314b3bfef957c35bf9fd2eb16b62f86533bdb3cd6627
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp37-cp37m-win_amd64.whl
| Download URL | cdiffer-0.7.2-cp37-cp37m-win_amd64.whl |
|---|---|
| Size | 561.1 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc Windows x86-64 |
|
SHA-256 checksum How to use checksums |
fb6f68607376532f57dabc51a857cc1b6e4faea0651f2754982685e6da76d8de
|
|
BLAKE2b-256 checksum How to use checksums |
1b99f071c55df6e06bb48fe7061332aafe9f87ac59625ffacbec014d4abaa8b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp37-cp37m-manylinux2010_x86_64.whl
| Download URL | cdiffer-0.7.2-cp37-cp37m-manylinux2010_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
a7d1b56eabc160745c1f0ce08575f0b5e1e36eb726742f1b5ce9a807ee2becf4
|
|
BLAKE2b-256 checksum How to use checksums |
4858f66bcf02cc55fd891b0bcf511092c5f5a673eb0490e65c8e67ef208e1cba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp37-cp37m-macosx_10_16_x86_64.whl
| Download URL | cdiffer-0.7.2-cp37-cp37m-macosx_10_16_x86_64.whl |
|---|---|
| Size | 481.1 kB |
| Tags | CPython 3.7 CPython 3.7 pymalloc macOS 10.16+ x86-64 |
|
SHA-256 checksum How to use checksums |
090dbd6a64482c8be0f6d0bcebbc75f175141328ef107bc32fc99422caf65fe0
|
|
BLAKE2b-256 checksum How to use checksums |
101f87a42d71f76565e3d235fbd73bc6d7233eb1f0e91fb269baaaa78d3ce6c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp36-cp36m-win_amd64.whl
| Download URL | cdiffer-0.7.2-cp36-cp36m-win_amd64.whl |
|---|---|
| Size | 561.0 kB |
| Tags | CPython 3.6 CPython 3.6 pymalloc Windows x86-64 |
|
SHA-256 checksum How to use checksums |
ea2b3064fe73e3b3026fa9bae505755655d88abe572b24b68d5bcdd76a238ef5
|
|
BLAKE2b-256 checksum How to use checksums |
b1d1be62bbb2d3a825d87de7fa2c0e42c8328772713bb1456f7b83c3831f5917
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp36-cp36m-manylinux2010_x86_64.whl
| Download URL | cdiffer-0.7.2-cp36-cp36m-manylinux2010_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
13a988e9021ab43741ec5b57d71dc27412801d3f9bc7a3f26464401e0a9f6af1
|
|
BLAKE2b-256 checksum How to use checksums |
89960a75ce08daae92cdaa55ff09a5163f7f76ca3739c7723bb1771cdfd685a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Release files / cdiffer-0.7.2-cp36-cp36m-macosx_10_16_x86_64.whl
| Download URL | cdiffer-0.7.2-cp36-cp36m-macosx_10_16_x86_64.whl |
|---|---|
| Size | 481.1 kB |
| Tags | CPython 3.6 CPython 3.6 pymalloc macOS 10.16+ x86-64 |
|
SHA-256 checksum How to use checksums |
d5be4be67eeb8b2e445568905ebfd6abb6a4e6f571be57a05ffa179541222e39
|
|
BLAKE2b-256 checksum How to use checksums |
1e12f33c7cb7a5eb632d815dfd7e0447579b58dffe329703ddf528f2d12f09ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|