=====
Edlib
=====
Lightweight, super fast library for sequence alignment using edit (Levenshtein) distance.
Popular use cases: aligning DNA sequences, calculating word/text similarity.
.. code:: python
edlib.align("elephant", "telephone")
# {'editDistance': 3, 'alphabetLength': 8, 'locations': [(None, 8)], 'cigar': None}
# Works with unicode characters (or any other iterable of hashable objects)!
edlib.align("ты милая", "ты гений")
# {'editDistance': 5, 'alphabetLength': 12, 'locations': [(None, 7)], 'cigar': None}
edlib.align("AACG", "TCAACCTG", mode = "HW", task = "path")
# {'editDistance': 1, 'alphabetLength': 4, 'locations': [(2, 4), (2, 5)], 'cigar': '3=1I'}
query = "elephant"; target = "telephone"
# NOTE: `task` has to be "path" in order to get nice alignment.
result = edlib.align(query, target, task = "path")
nice = edlib.getNiceAlignment(result, query, target)
print("\n".join(nice.values()))
# -elephant
# -|||||.|.
# telephone
Edlib is actually a C/C++ library, and this package is it's wrapper for Python.
Python Edlib has mostly the same API as C/C++ Edlib, so feel free to check out `C/C++ Edlib docs <http://github.com/Martinsos/edlib>`_ for more code examples, details on API and how Edlib works.
--------
Features
--------
* Calculates **edit distance**.
* It can find **optimal alignment path** (instructions how to transform first sequence into the second sequence).
* It can find just the **start and/or end locations of alignment path** - can be useful when speed is more important than having exact alignment path.
* Supports **multiple alignment methods**: global(**NW**), prefix(**SHW**) and infix(**HW**), each of them useful for different scenarios.
* You can **extend character equality definition**, enabling you to e.g. have wildcard characters, to have case insensitive alignment or to work with degenerate nucleotides.
* It can easily handle small or **very large** sequences, even when finding alignment path.
* **Super fast** thanks to Myers's bit-vector algorithm.
**NOTE**: **Alphabet length has to be <= 256** (meaning that query and target together must have <= 256 unique values).
------------
Installation
------------
::
pip install edlib
---
API
---
Edlib has two functions, ``align()`` and ``getNiceAlignment()``:
align()
-------
.. code:: python
align(query, target, [mode], [task], [k], [additionalEqualities])
Aligns ``query`` against ``target`` with edit distance.
``query`` and ``target`` can be strings, bytes, or any iterables of hashable objects, as long as all together they don't have more than 256 unique values.
Output of ``help(edlib.align)``:
.. code::
cython_function_or_method in module edlib
align(query, target, mode='NW', task='distance', k=-1, additionalEqualities=None)
Align query with target using edit distance.
@param {str or bytes or iterable of hashable objects} query, combined with target must have no more
than 256 unique values
@param {str or bytes or iterable of hashable objects} target, combined with query must have no more
than 256 unique values
@param {string} mode Optional. Alignment method do be used. Possible values are:
- 'NW' for global (default)
- 'HW' for infix
- 'SHW' for prefix.
@param {string} task Optional. Tells edlib what to calculate. The less there is to calculate,
the faster it is. Possible value are (from fastest to slowest):
- 'distance' - find edit distance and end locations in target. Default.
- 'locations' - find edit distance, end locations and start locations.
- 'path' - find edit distance, start and end locations and alignment path.
@param {int} k Optional. Max edit distance to search for - the lower this value,
the faster is calculation. Set to -1 (default) to have no limit on edit distance.
@param {list} additionalEqualities Optional.
List of pairs of characters or hashable objects, where each pair defines two values as equal.
This way you can extend edlib's definition of equality (which is that each character is equal only
to itself).
This can be useful e.g. when you want edlib to be case insensitive, or if you want certain
characters to act as a wildcards.
Set to None (default) if you do not want to extend edlib's default equality definition.
@return Dictionary with following fields:
{int} editDistance Integer, -1 if it is larger than k.
{int} alphabetLength Integer, length of unique characters in 'query' and 'target'
{[(int, int)]} locations List of locations, in format [(start, end)].
{string} cigar Cigar is a standard format for alignment path.
Here we are using extended cigar format, which uses following symbols:
Match: '=', Insertion to target: 'I', Deletion from target: 'D', Mismatch: 'X'.
e.g. cigar of "5=1X1=1I" means "5 matches, 1 mismatch, 1 match, 1 insertion (to target)".
getNiceAlignment()
------------------
.. code:: python
getNiceAlignment(alignResult, query, target)
Represents alignment from ``align()`` in a visually attractive format.
Output of ``help(edlib.getNiceAlignment)``:
.. code::
cython_function_or_method in module edlib
getNiceAlignment(alignResult, query, target, gapSymbol='-')
Output alignments from align() in NICE format
@param {dictionary} alignResult, output of the method align()
NOTE: The method align() requires the argument task="path"
@param {string} query, the exact query used for alignResult
@param {string} target, the exact target used for alignResult
@param {string} gapSymbol, default "-"
String used to represent gaps in the alignment between query and target
@return Alignment in NICE format, which is human-readable visual representation of how the query and target align to each other.
e.g., for "telephone" and "elephant", it would look like:
telephone
|||||.|.
-elephant
It is represented as dictionary with following fields:
- {string} query_aligned
- {string} matched_aligned ('|' for match, '.' for mismatch, ' ' for insertion/deletion)
- {string} target_aligned
Normally you will want to print these three in order above joined with newline character.
-----
Usage
-----
.. code:: python
import edlib
edlib.align("ACTG", "CACTRT", mode="HW", task="path")
# {'editDistance': 1, 'alphabetLength': 5, 'locations': [(1, 3), (1, 4)], 'cigar': '3=1I'}
# You can provide additional equalities.
edlib.align("ACTG", "CACTRT", mode="HW", task="path", additionalEqualities=[("R", "A"), ("R", "G")])
# {'editDistance': 0, 'alphabetLength': 5, 'locations': [(1, 4)], 'cigar': '4='}
---------
Benchmark
---------
I run a simple benchmark on 7 Feb 2017 (using timeit, on Python3) to get a feeling of how Edlib compares to other Python libraries: `editdistance <https://pypi.python.org/pypi/editdistance>`_ and `python-Levenshtein <https://pypi.python.org/pypi/python-Levenshtein>`_.
As input data I used pairs of DNA sequences of different lengths, where each pair has about 90% similarity.
::
#1: query length: 30, target length: 30
edlib.align(query, target): 1.88µs
editdistance.eval(query, target): 1.26µs
Levenshtein.distance(query, target): 0.43µs
#2: query length: 100, target length: 100
edlib.align(query, target): 3.64µs
editdistance.eval(query, target): 3.86µs
Levenshtein.distance(query, target): 14.1µs
#3: query length: 1000, target length: 1000
edlib.align(query, target): 0.047ms
editdistance.eval(query, target): 5.4ms
Levenshtein.distance(query, target): 1.9ms
#4: query length: 10000, target length: 10000
edlib.align(query, target): 0.0021s
editdistance.eval(query, target): 0.56s
Levenshtein.distance(query, target): 0.2s
#5: query length: 50000, target length: 50000
edlib.align(query, target): 0.031s
editdistance.eval(query, target): 13.8s
Levenshtein.distance(query, target): 5.0s
----
More
----
Check out `C/C++ Edlib docs <http://github.com/Martinsos/edlib>`_ for more information about Edlib!
-----------
Development
-----------
Check out `Edlib python package on Github <https://github.com/Martinsos/edlib/tree/master/bindings/python>`_.
Raw data
{
"_id": null,
"home_page": "https://github.com/Martinsos/edlib",
"name": "edlib",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "edit distance levenshtein align sequence bioinformatics",
"author": "Martin Sosic",
"author_email": "sosic.martin@gmail.com",
"download_url": null,
"platform": null,
"description": "\n=====\nEdlib\n=====\n\nLightweight, super fast library for sequence alignment using edit (Levenshtein) distance.\n\nPopular use cases: aligning DNA sequences, calculating word/text similarity.\n\n\n.. code:: python\n\n edlib.align(\"elephant\", \"telephone\")\n # {'editDistance': 3, 'alphabetLength': 8, 'locations': [(None, 8)], 'cigar': None}\n\n # Works with unicode characters (or any other iterable of hashable objects)!\n edlib.align(\"\u0442\u044b \u043c\u0438\u043b\u0430\u044f\", \"\u0442\u044b \u0433\u0435\u043d\u0438\u0439\")\n # {'editDistance': 5, 'alphabetLength': 12, 'locations': [(None, 7)], 'cigar': None}\n\n edlib.align(\"AACG\", \"TCAACCTG\", mode = \"HW\", task = \"path\")\n # {'editDistance': 1, 'alphabetLength': 4, 'locations': [(2, 4), (2, 5)], 'cigar': '3=1I'}\n\n query = \"elephant\"; target = \"telephone\"\n # NOTE: `task` has to be \"path\" in order to get nice alignment.\n result = edlib.align(query, target, task = \"path\")\n nice = edlib.getNiceAlignment(result, query, target)\n print(\"\\n\".join(nice.values()))\n # -elephant\n # -|||||.|.\n # telephone\n\n\nEdlib is actually a C/C++ library, and this package is it's wrapper for Python.\nPython Edlib has mostly the same API as C/C++ Edlib, so feel free to check out `C/C++ Edlib docs <http://github.com/Martinsos/edlib>`_ for more code examples, details on API and how Edlib works.\n\n--------\nFeatures\n--------\n\n* Calculates **edit distance**.\n* It can find **optimal alignment path** (instructions how to transform first sequence into the second sequence).\n* It can find just the **start and/or end locations of alignment path** - can be useful when speed is more important than having exact alignment path.\n* Supports **multiple alignment methods**: global(**NW**), prefix(**SHW**) and infix(**HW**), each of them useful for different scenarios.\n* You can **extend character equality definition**, enabling you to e.g. have wildcard characters, to have case insensitive alignment or to work with degenerate nucleotides.\n* It can easily handle small or **very large** sequences, even when finding alignment path.\n* **Super fast** thanks to Myers's bit-vector algorithm.\n\n**NOTE**: **Alphabet length has to be <= 256** (meaning that query and target together must have <= 256 unique values).\n\n------------\nInstallation\n------------\n::\n\n pip install edlib\n\n---\nAPI\n---\n\nEdlib has two functions, ``align()`` and ``getNiceAlignment()``:\n\nalign()\n-------\n\n.. code:: python\n\n align(query, target, [mode], [task], [k], [additionalEqualities])\n\nAligns ``query`` against ``target`` with edit distance.\n\n``query`` and ``target`` can be strings, bytes, or any iterables of hashable objects, as long as all together they don't have more than 256 unique values.\n\n\nOutput of ``help(edlib.align)``:\n\n.. code::\n\n cython_function_or_method in module edlib\n \n align(query, target, mode='NW', task='distance', k=-1, additionalEqualities=None)\n Align query with target using edit distance.\n @param {str or bytes or iterable of hashable objects} query, combined with target must have no more\n than 256 unique values\n @param {str or bytes or iterable of hashable objects} target, combined with query must have no more\n than 256 unique values\n @param {string} mode Optional. Alignment method do be used. Possible values are:\n - 'NW' for global (default)\n - 'HW' for infix\n - 'SHW' for prefix.\n @param {string} task Optional. Tells edlib what to calculate. The less there is to calculate,\n the faster it is. Possible value are (from fastest to slowest):\n - 'distance' - find edit distance and end locations in target. Default.\n - 'locations' - find edit distance, end locations and start locations.\n - 'path' - find edit distance, start and end locations and alignment path.\n @param {int} k Optional. Max edit distance to search for - the lower this value,\n the faster is calculation. Set to -1 (default) to have no limit on edit distance.\n @param {list} additionalEqualities Optional.\n List of pairs of characters or hashable objects, where each pair defines two values as equal.\n This way you can extend edlib's definition of equality (which is that each character is equal only\n to itself).\n This can be useful e.g. when you want edlib to be case insensitive, or if you want certain\n characters to act as a wildcards.\n Set to None (default) if you do not want to extend edlib's default equality definition.\n @return Dictionary with following fields:\n {int} editDistance Integer, -1 if it is larger than k.\n {int} alphabetLength Integer, length of unique characters in 'query' and 'target'\n {[(int, int)]} locations List of locations, in format [(start, end)].\n {string} cigar Cigar is a standard format for alignment path.\n Here we are using extended cigar format, which uses following symbols:\n Match: '=', Insertion to target: 'I', Deletion from target: 'D', Mismatch: 'X'.\n e.g. cigar of \"5=1X1=1I\" means \"5 matches, 1 mismatch, 1 match, 1 insertion (to target)\".\n \n\ngetNiceAlignment()\n------------------\n\n.. code:: python\n\n getNiceAlignment(alignResult, query, target)\n\nRepresents alignment from ``align()`` in a visually attractive format.\n\n\nOutput of ``help(edlib.getNiceAlignment)``:\n\n.. code::\n\n cython_function_or_method in module edlib\n \n getNiceAlignment(alignResult, query, target, gapSymbol='-')\n Output alignments from align() in NICE format\n @param {dictionary} alignResult, output of the method align() \n NOTE: The method align() requires the argument task=\"path\"\n @param {string} query, the exact query used for alignResult\n @param {string} target, the exact target used for alignResult\n @param {string} gapSymbol, default \"-\"\n String used to represent gaps in the alignment between query and target\n @return Alignment in NICE format, which is human-readable visual representation of how the query and target align to each other. \n e.g., for \"telephone\" and \"elephant\", it would look like:\n telephone\n |||||.|.\n -elephant\n It is represented as dictionary with following fields:\n - {string} query_aligned\n - {string} matched_aligned ('|' for match, '.' for mismatch, ' ' for insertion/deletion)\n - {string} target_aligned\n Normally you will want to print these three in order above joined with newline character.\n \n\n\n-----\nUsage\n-----\n\n\n.. code:: python\n\n import edlib\n\n edlib.align(\"ACTG\", \"CACTRT\", mode=\"HW\", task=\"path\")\n # {'editDistance': 1, 'alphabetLength': 5, 'locations': [(1, 3), (1, 4)], 'cigar': '3=1I'}\n\n # You can provide additional equalities.\n edlib.align(\"ACTG\", \"CACTRT\", mode=\"HW\", task=\"path\", additionalEqualities=[(\"R\", \"A\"), (\"R\", \"G\")])\n # {'editDistance': 0, 'alphabetLength': 5, 'locations': [(1, 4)], 'cigar': '4='}\n\n \n\n---------\nBenchmark\n---------\n\nI run a simple benchmark on 7 Feb 2017 (using timeit, on Python3) to get a feeling of how Edlib compares to other Python libraries: `editdistance <https://pypi.python.org/pypi/editdistance>`_ and `python-Levenshtein <https://pypi.python.org/pypi/python-Levenshtein>`_.\n\nAs input data I used pairs of DNA sequences of different lengths, where each pair has about 90% similarity.\n\n::\n\n #1: query length: 30, target length: 30\n edlib.align(query, target): 1.88\u00b5s\n editdistance.eval(query, target): 1.26\u00b5s\n Levenshtein.distance(query, target): 0.43\u00b5s\n\n #2: query length: 100, target length: 100\n edlib.align(query, target): 3.64\u00b5s\n editdistance.eval(query, target): 3.86\u00b5s\n Levenshtein.distance(query, target): 14.1\u00b5s\n\n #3: query length: 1000, target length: 1000\n edlib.align(query, target): 0.047ms\n editdistance.eval(query, target): 5.4ms\n Levenshtein.distance(query, target): 1.9ms\n\n #4: query length: 10000, target length: 10000\n edlib.align(query, target): 0.0021s\n editdistance.eval(query, target): 0.56s\n Levenshtein.distance(query, target): 0.2s\n\n #5: query length: 50000, target length: 50000\n edlib.align(query, target): 0.031s\n editdistance.eval(query, target): 13.8s\n Levenshtein.distance(query, target): 5.0s\n\n----\nMore\n----\n\nCheck out `C/C++ Edlib docs <http://github.com/Martinsos/edlib>`_ for more information about Edlib!\n\n-----------\nDevelopment\n-----------\n\nCheck out `Edlib python package on Github <https://github.com/Martinsos/edlib/tree/master/bindings/python>`_.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Lightweight, super fast library for sequence alignment using edit (Levenshtein) distance.",
"version": "1.3.9.post1",
"project_urls": {
"Homepage": "https://github.com/Martinsos/edlib"
},
"split_keywords": [
"edit",
"distance",
"levenshtein",
"align",
"sequence",
"bioinformatics"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "52564d9a3147e74234ad0d620a32d6e35761c50d951b60d20710f4f7d7b2ee7e",
"md5": "ed5e53b4571bb705da5bb94c96181e0e",
"sha256": "fc30dbee8faf0433eda805a64db4364b88a6b4fa4d7972aa84d345700dc749b0"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "ed5e53b4571bb705da5bb94c96181e0e",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 372717,
"upload_time": "2024-09-04T21:44:21",
"upload_time_iso_8601": "2024-09-04T21:44:21.534191Z",
"url": "https://files.pythonhosted.org/packages/52/56/4d9a3147e74234ad0d620a32d6e35761c50d951b60d20710f4f7d7b2ee7e/edlib-1.3.9.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "39ca532f2288774bea64b84878a6145b0be17a0d36d0a022beed99bb989d1ed3",
"md5": "453348dfbd7f42e6db21e6d499249c9e",
"sha256": "50677612047506b95a15450fb003f7d9f9fda8ad472f3e54936ef619fa7a0746"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp310-cp310-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "453348dfbd7f42e6db21e6d499249c9e",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 1458241,
"upload_time": "2024-09-04T21:44:22",
"upload_time_iso_8601": "2024-09-04T21:44:22.876362Z",
"url": "https://files.pythonhosted.org/packages/39/ca/532f2288774bea64b84878a6145b0be17a0d36d0a022beed99bb989d1ed3/edlib-1.3.9.post1-cp310-cp310-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e1899db1b45dc748a0dc56a411e32c35058fab0ebd51b2fe684d3494952a3c03",
"md5": "fa5a442fb98252f5b3332c05dc93dbbd",
"sha256": "de93447b4c20be00c3eaa533f6ee0f233225860cee943818aef987f4882b4f20"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "fa5a442fb98252f5b3332c05dc93dbbd",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 1377350,
"upload_time": "2024-09-04T21:44:24",
"upload_time_iso_8601": "2024-09-04T21:44:24.756329Z",
"url": "https://files.pythonhosted.org/packages/e1/89/9db1b45dc748a0dc56a411e32c35058fab0ebd51b2fe684d3494952a3c03/edlib-1.3.9.post1-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "41b3267cf3b9f6ba13bede5c2f29957102f4988fead04ad7fed89e4bdf89562a",
"md5": "c59f167165a39eb6fca8d375e66da7b7",
"sha256": "ea4714c98756954d19325dee61093e7b8d0ec204dae522c27d57998c32a4a796"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c59f167165a39eb6fca8d375e66da7b7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 397043,
"upload_time": "2024-09-04T21:44:26",
"upload_time_iso_8601": "2024-09-04T21:44:26.463611Z",
"url": "https://files.pythonhosted.org/packages/41/b3/267cf3b9f6ba13bede5c2f29957102f4988fead04ad7fed89e4bdf89562a/edlib-1.3.9.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9fdf70cacedb6b238b5258942bd8fdb890aa6a65b19517f9cfdc241928a0b549",
"md5": "0908d3b4be392e1863bc89732bb7cd9e",
"sha256": "82e95bcc4a025d919db53b3b48e98e967afc4c6d741d39e906cdeca6bc74deda"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp311-cp311-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "0908d3b4be392e1863bc89732bb7cd9e",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 1477867,
"upload_time": "2024-09-04T21:44:27",
"upload_time_iso_8601": "2024-09-04T21:44:27.935665Z",
"url": "https://files.pythonhosted.org/packages/9f/df/70cacedb6b238b5258942bd8fdb890aa6a65b19517f9cfdc241928a0b549/edlib-1.3.9.post1-cp311-cp311-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "65ff8fc79ffde2f54b015bd698dc69c516913f4103126ff5c467c8c8bcd81817",
"md5": "6056e142ad7c26449c1c7f90158b27dc",
"sha256": "2aba2e45677b19a26a7d9acd74bd0869a6b138b7626dbeafcd5a15aea00b36f2"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "6056e142ad7c26449c1c7f90158b27dc",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 1399372,
"upload_time": "2024-09-04T21:44:29",
"upload_time_iso_8601": "2024-09-04T21:44:29.922947Z",
"url": "https://files.pythonhosted.org/packages/65/ff/8fc79ffde2f54b015bd698dc69c516913f4103126ff5c467c8c8bcd81817/edlib-1.3.9.post1-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7a986d75b060dd4c5f8a91b5c7031faf41cccb58448ffc14d0ef03e02ecb6c67",
"md5": "f0ffbbfa558f280094561f5049530193",
"sha256": "b8539562cfb7b387decae9492e86fbc35094ded4769ea8242273015c073ad366"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f0ffbbfa558f280094561f5049530193",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 397510,
"upload_time": "2024-09-04T21:44:31",
"upload_time_iso_8601": "2024-09-04T21:44:31.511657Z",
"url": "https://files.pythonhosted.org/packages/7a/98/6d75b060dd4c5f8a91b5c7031faf41cccb58448ffc14d0ef03e02ecb6c67/edlib-1.3.9.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "dacd1acfddd17aa804ba8dcb9900c4a5c7a959310a57b351696d940617b878a9",
"md5": "60e99b42aeee4c3dec0232c2fe3a76bc",
"sha256": "508687d0a16ff1f3f63d31511f469b43028a865faf1fb68fbf5499aa78b4e7ec"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp312-cp312-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "60e99b42aeee4c3dec0232c2fe3a76bc",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 1476286,
"upload_time": "2024-09-04T21:44:33",
"upload_time_iso_8601": "2024-09-04T21:44:33.029077Z",
"url": "https://files.pythonhosted.org/packages/da/cd/1acfddd17aa804ba8dcb9900c4a5c7a959310a57b351696d940617b878a9/edlib-1.3.9.post1-cp312-cp312-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b29798c62f1c6dead23373aa968a3e5928908fb93cdc826d712e6136e0736022",
"md5": "54ca829c249c68ea15d2d44bca885d24",
"sha256": "2d6f40a19d0dc784c5f3b27c2989e431614797bcb77f15b55781491cdab1666f"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "54ca829c249c68ea15d2d44bca885d24",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 1396526,
"upload_time": "2024-09-04T21:44:34",
"upload_time_iso_8601": "2024-09-04T21:44:34.403707Z",
"url": "https://files.pythonhosted.org/packages/b2/97/98c62f1c6dead23373aa968a3e5928908fb93cdc826d712e6136e0736022/edlib-1.3.9.post1-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f9f3f12157bbace8c9149133fc7eb5bd03894ae52301d372e010a967dae1fe3b",
"md5": "b1f566a9bd909e7127730c66b8892d15",
"sha256": "6e6457ff3e80d29eb42436eea7235babd3f1db78a526565e1fdce102aa3f6fa0"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b1f566a9bd909e7127730c66b8892d15",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 396268,
"upload_time": "2024-09-04T21:44:35",
"upload_time_iso_8601": "2024-09-04T21:44:35.898893Z",
"url": "https://files.pythonhosted.org/packages/f9/f3/f12157bbace8c9149133fc7eb5bd03894ae52301d372e010a967dae1fe3b/edlib-1.3.9.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "18e2bfa5ec07a7ce0835598b00f4935c510057945580c25dc0e725fa696ee464",
"md5": "a11fbbd49f8e43ae188abbfc11689816",
"sha256": "a8ebdc95d9f5233b4ebd0b7061eb05d9786ccac05a2065faebf2dd61cf1ac945"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp313-cp313-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "a11fbbd49f8e43ae188abbfc11689816",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 1473440,
"upload_time": "2024-09-04T21:44:37",
"upload_time_iso_8601": "2024-09-04T21:44:37.023113Z",
"url": "https://files.pythonhosted.org/packages/18/e2/bfa5ec07a7ce0835598b00f4935c510057945580c25dc0e725fa696ee464/edlib-1.3.9.post1-cp313-cp313-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "276a569bf9584318fe13bf7e5e9ac580043f8e0ca54c97354e971f9cd831241b",
"md5": "a981aa553cc3cae1b8c9d4cf9ebe7eba",
"sha256": "a8dc08d4e162bd9f0c0f4a2511a2769c2953e3315915f5631e33096c85b27ac5"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "a981aa553cc3cae1b8c9d4cf9ebe7eba",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": null,
"size": 1396601,
"upload_time": "2024-09-04T21:44:38",
"upload_time_iso_8601": "2024-09-04T21:44:38.475956Z",
"url": "https://files.pythonhosted.org/packages/27/6a/569bf9584318fe13bf7e5e9ac580043f8e0ca54c97354e971f9cd831241b/edlib-1.3.9.post1-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2a7e10719533b6fac6105e5790a6dd24c9f74ce4033ae53c8da04f348ab9b5f1",
"md5": "b2081ab3dc091cb52545e84b0cb98c94",
"sha256": "e23efd98cfa4416f3a452fdb8c2cdc428fa62d561457b461054a15a5640c4ecf"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b2081ab3dc091cb52545e84b0cb98c94",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 340053,
"upload_time": "2024-09-04T21:44:39",
"upload_time_iso_8601": "2024-09-04T21:44:39.697087Z",
"url": "https://files.pythonhosted.org/packages/2a/7e/10719533b6fac6105e5790a6dd24c9f74ce4033ae53c8da04f348ab9b5f1/edlib-1.3.9.post1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8bf05c1f9a7dbdc937cedaaff4fc8e7664bb8df1bdfc4efc1cc94b2efc580f8c",
"md5": "1e4fc628c987db13bf92c1b9ba2759a6",
"sha256": "caa3b558333a18328a92d1691e4e19b11ffed50aec456118aab719b5a1cc4833"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp36-cp36m-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "1e4fc628c987db13bf92c1b9ba2759a6",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 1425138,
"upload_time": "2024-09-04T21:44:41",
"upload_time_iso_8601": "2024-09-04T21:44:41.661746Z",
"url": "https://files.pythonhosted.org/packages/8b/f0/5c1f9a7dbdc937cedaaff4fc8e7664bb8df1bdfc4efc1cc94b2efc580f8c/edlib-1.3.9.post1-cp36-cp36m-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cb80f93737f198d619734a2f6779a73f1f4989242fb79b6805e5d75262f000ae",
"md5": "b066eb2c35ee6add51f72339ddc129a6",
"sha256": "544a018acd1e1f9d2c90e10d119cecd4022bffd3a5c56480214ec6b5dcb41b15"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp36-cp36m-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "b066eb2c35ee6add51f72339ddc129a6",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 1343176,
"upload_time": "2024-09-04T21:44:42",
"upload_time_iso_8601": "2024-09-04T21:44:42.936113Z",
"url": "https://files.pythonhosted.org/packages/cb/80/f93737f198d619734a2f6779a73f1f4989242fb79b6805e5d75262f000ae/edlib-1.3.9.post1-cp36-cp36m-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "53aaedaa2567e4d39f708253ceeb74bc837c6d324c17142af912593ffb244e84",
"md5": "fa2e38292453c78b48b6a60b3b674b62",
"sha256": "4948d242587b0faa04d5a4108191da14bf1d0e69cc51c0b0ff0b0ce1ee17cf97"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "fa2e38292453c78b48b6a60b3b674b62",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 353791,
"upload_time": "2024-09-04T21:44:44",
"upload_time_iso_8601": "2024-09-04T21:44:44.077242Z",
"url": "https://files.pythonhosted.org/packages/53/aa/edaa2567e4d39f708253ceeb74bc837c6d324c17142af912593ffb244e84/edlib-1.3.9.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0403083460a33cc5e9c7edaf987641f726f46f372dec35548294782529c387cf",
"md5": "13ee2c637562c5b99dd263388c53dd64",
"sha256": "d2d65f654dbbe5f422b2ad372f7afe332870b78ae93af59f52973955e80af701"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp37-cp37m-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "13ee2c637562c5b99dd263388c53dd64",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 1433233,
"upload_time": "2024-09-04T21:44:45",
"upload_time_iso_8601": "2024-09-04T21:44:45.208676Z",
"url": "https://files.pythonhosted.org/packages/04/03/083460a33cc5e9c7edaf987641f726f46f372dec35548294782529c387cf/edlib-1.3.9.post1-cp37-cp37m-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3f881fc23baa1ccab15faae34dc47dd658c545f24f9a37b2d0c24f3425d14cb5",
"md5": "0c943ff69c8973e2af145977b63a8606",
"sha256": "d86f71dd89bdf0d3afa5a1676f01ffd8816f258d1c9b54f805c44cf0e5fd0dde"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp37-cp37m-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "0c943ff69c8973e2af145977b63a8606",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 1357768,
"upload_time": "2024-09-04T21:44:46",
"upload_time_iso_8601": "2024-09-04T21:44:46.546493Z",
"url": "https://files.pythonhosted.org/packages/3f/88/1fc23baa1ccab15faae34dc47dd658c545f24f9a37b2d0c24f3425d14cb5/edlib-1.3.9.post1-cp37-cp37m-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9657a2bd1ae75154f99bdcc9670ebc3175b526e479c67f25fcec542a353f04e1",
"md5": "5de49df091ec21e9b9741d94637ad049",
"sha256": "604d478355b5c710b54fc985c7069fb6d869d4307c0fe4a165f23062bbc7d2fc"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "5de49df091ec21e9b9741d94637ad049",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 381532,
"upload_time": "2024-09-04T21:44:48",
"upload_time_iso_8601": "2024-09-04T21:44:48.538910Z",
"url": "https://files.pythonhosted.org/packages/96/57/a2bd1ae75154f99bdcc9670ebc3175b526e479c67f25fcec542a353f04e1/edlib-1.3.9.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ab1af4f6f59c1ffc5c911b659fb3f15a61cd093b4af368695bcf544d02d42bee",
"md5": "ca350e99db3abe615b4f73c2d94ed8ab",
"sha256": "62931650016d121a5c5dfe403299865038e46c3b57521a5808b5129c960e52c3"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp38-cp38-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "ca350e99db3abe615b4f73c2d94ed8ab",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 1469747,
"upload_time": "2024-09-04T21:44:49",
"upload_time_iso_8601": "2024-09-04T21:44:49.609807Z",
"url": "https://files.pythonhosted.org/packages/ab/1a/f4f6f59c1ffc5c911b659fb3f15a61cd093b4af368695bcf544d02d42bee/edlib-1.3.9.post1-cp38-cp38-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9003166b103c8d25592d64c58c5b106c5bee2399cb8a2622978b6dbbf9a478fd",
"md5": "e35e18b9ced77271f60f63b2dc638b7b",
"sha256": "ec92058f7317436f94b9697074c3a3b016577768ee5710dc7c15a2fa4d5882fc"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp38-cp38-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "e35e18b9ced77271f60f63b2dc638b7b",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 1387083,
"upload_time": "2024-09-04T21:44:51",
"upload_time_iso_8601": "2024-09-04T21:44:51.651439Z",
"url": "https://files.pythonhosted.org/packages/90/03/166b103c8d25592d64c58c5b106c5bee2399cb8a2622978b6dbbf9a478fd/edlib-1.3.9.post1-cp38-cp38-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1307f98c0369aec3c7bd8ce1f8d0ba38894edf97323b893042f0310c9b83c6f4",
"md5": "9e1875bd11460ac378e27cc7e9a13a44",
"sha256": "650156a596db8dd098f625692c27b1c5dcf7f0c4db1fa0dfa05d87bb016b5f22"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "9e1875bd11460ac378e27cc7e9a13a44",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 374194,
"upload_time": "2024-09-04T21:44:52",
"upload_time_iso_8601": "2024-09-04T21:44:52.899214Z",
"url": "https://files.pythonhosted.org/packages/13/07/f98c0369aec3c7bd8ce1f8d0ba38894edf97323b893042f0310c9b83c6f4/edlib-1.3.9.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ff3cdd01c8e7192cb1a6f892898417b1541dcdab6e86431f896fd2d593c44e07",
"md5": "02150a79047a9c269bcc5f41fea8aee7",
"sha256": "7c5a02a5e334ce6f24bc578739b9c6a48c883c453c703dea52814953da37425c"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp39-cp39-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "02150a79047a9c269bcc5f41fea8aee7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 1457644,
"upload_time": "2024-09-04T21:44:54",
"upload_time_iso_8601": "2024-09-04T21:44:54.738121Z",
"url": "https://files.pythonhosted.org/packages/ff/3c/dd01c8e7192cb1a6f892898417b1541dcdab6e86431f896fd2d593c44e07/edlib-1.3.9.post1-cp39-cp39-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "58a4ad26dea44748762dd92c1f580445aba4565a5f36c2b04c13f2fc193fcfaf",
"md5": "b7ea0e1ee241d9201cafed983d8df64c",
"sha256": "eec42bfc5614ec92559b86e5c5b7398a15599500bc1b2bf63f08b6bf48d7f972"
},
"downloads": -1,
"filename": "edlib-1.3.9.post1-cp39-cp39-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "b7ea0e1ee241d9201cafed983d8df64c",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 1378433,
"upload_time": "2024-09-04T21:44:56",
"upload_time_iso_8601": "2024-09-04T21:44:56.051664Z",
"url": "https://files.pythonhosted.org/packages/58/a4/ad26dea44748762dd92c1f580445aba4565a5f36c2b04c13f2fc193fcfaf/edlib-1.3.9.post1-cp39-cp39-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-09-04 21:44:21",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Martinsos",
"github_project": "edlib",
"travis_ci": true,
"coveralls": false,
"github_actions": false,
"appveyor": true,
"lcname": "edlib"
}