From c2b8d18177257ee004a5869c9ed14f219970c959 Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Thu, 22 Aug 2024 22:48:54 +0200 Subject: [PATCH 1/2] add levenshtein utility. --- README.rst | 10 ++-- pyproject.toml | 2 +- sequana_pipetools/__init__.py | 4 +- sequana_pipetools/info.py | 6 ++- sequana_pipetools/misc.py | 51 ++++++++++++++++++- sequana_pipetools/options.py | 2 +- sequana_pipetools/scripts/main.py | 7 +-- .../snaketools/pipeline_manager.py | 1 + sequana_pipetools/snaketools/profile.py | 2 +- .../snaketools/sequana_config.py | 2 +- tests/test_misc.py | 8 ++- 11 files changed, 77 insertions(+), 18 deletions(-) diff --git a/README.rst b/README.rst index e733026..3d429b0 100644 --- a/README.rst +++ b/README.rst @@ -110,7 +110,7 @@ The **sequana_pipetools** package provide a standalone called **sequana_pipetool .. figure:: https://raw.githubusercontent.com/sequana/sequana_pipetools/main/doc/UI.png -There are currently 3-4 main application. The first one is for Linux users under +There are several applications. The first one is for Linux users under bash to obtain completion of a sequana pipeline command line arguments:: sequana_pipetools --completion fastqc @@ -126,7 +126,7 @@ This is used within th pipeline but can be used manually as well and is useful t The following command provides statistics about Sequana pipelines installed on your system (number of rules, wrappers used):: - sequana_pipetools -- stats + sequana_pipetools --stats And for developpers, a quick creation of schema file given a config file (experimental, developers would still need to edit the schema but it does 90% of the job):: @@ -283,15 +283,14 @@ so, you will need to create an environment variable:: export SEQUANA_WRAPPERS="git+file:///home/user/github/sequana-wrappers" -If you decide to use singularity/apptainer, one common error on a cluster is that non-standard paths are not found. You can bind them using the -B option but a more general set up is to create thos environment variable:: +If you decide to use singularity/apptainer, one common error on a cluster is that non-standard paths are not found. You can bind them using the -B option but a more general set up is to create this environment variable:: export SINGULARITY_BINDPATH="/path_to_bind" -for Singularity setup, or :: +for Apptainer setup :: export APPTAINER_BINDPATH="/path_to_bind" -for Apptainer setup. What is Sequana ? @@ -318,6 +317,7 @@ Changelog ========= ====================================================================== Version Description ========= ====================================================================== +1.0.3 * add levenshtein function. some typo corrections. 1.0.2 * add the dot2png command. pin docutils <0.21 due to pip error 1.0.1 * hot fix in the profile creation (regression) 1.0.0 * Stable release diff --git a/pyproject.toml b/pyproject.toml index d525b9c..d0cbd3e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api" #maintainer ?#maintainer email [tool.poetry] name = "sequana_pipetools" -version = "1.0.2" +version = "1.0.3" description = "A set of tools to help building or using Sequana pipelines" authors = ["Sequana Team"] license = "BSD-3" diff --git a/sequana_pipetools/__init__.py b/sequana_pipetools/__init__.py index beaa0be..46f672f 100644 --- a/sequana_pipetools/__init__.py +++ b/sequana_pipetools/__init__.py @@ -13,14 +13,14 @@ def get_package_version(package_name): from easydev.logging_tools import Logging -logger = Logging("sequana_pipetools", "WARNING") +logger = Logging("sequana_pipetools", "WARNING", "cyan") # To keep the inheritance/propagation of levels. Logging from easydev will do # the formatting only. import colorlog logger = colorlog.getLogger(logger.name) -from .misc import url2hash +from .misc import url2hash, levenshtein_distance from .sequana_manager import SequanaManager # , get_pipeline_location from .snaketools import ( Pipeline, diff --git a/sequana_pipetools/info.py b/sequana_pipetools/info.py index 7209912..949cdba 100644 --- a/sequana_pipetools/info.py +++ b/sequana_pipetools/info.py @@ -18,11 +18,13 @@ sequana_epilog = Colors().purple( - """If you use or like the Sequana project, +"""\U00002139\U0000FE0F To use completion, type 'sequana_pipetools --completion NAME' + +\u2705 If you use or like the Sequana project, please consider citing us (visit sequana.readthedocs.io for details) or use this citation: -Cokelaer et al, (2017), ‘Sequana’: a Set of Snakemake NGS pipelines, Journal of +\U0001F4DA Cokelaer et al, (2017), ‘Sequana’: a Set of Snakemake NGS pipelines, Journal of Open Source Software, 2(16), 352, JOSS DOI doi:10.21105/joss.00352 diff --git a/sequana_pipetools/misc.py b/sequana_pipetools/misc.py index 6aaa340..d54d2f6 100644 --- a/sequana_pipetools/misc.py +++ b/sequana_pipetools/misc.py @@ -15,9 +15,58 @@ from sequana_pipetools import get_package_version -__all__ = ["Colors", "print_version", "error", "url2hash"] +__all__ = ["Colors", "print_version", "error", "url2hash", "levenshtein_distance"] +def levenshtein_distance(token1: str, token2: str) -> int: + """Computes the Levenshtein distance between two strings using dynamic programming. + + The Levenshtein distance is a measure of the minimum number of single-character edits + (insertions, deletions, or substitutions) required to change one word into the other. + + :param str token1: The first input string. + :param str token2: The second input string. + :return: Levenshtein distance between the two input strings. + + Example:: + + >>> levenshtein_distance("kitten", "sitting") + 3 + >>> levenshtein_distance("flaw", "lawn") + 2 + + Notes: + - The function uses a 2D list to store the distances, which requires O(m * n) space, + where m and n are the lengths of the input strings. + - The time complexity is O(m * n) since each cell of the matrix is filled once. + + """ + len1, len2 = len(token1), len(token2) + + # Initialize the matrix with zeros + distances = [[0 for _ in range(len2 + 1)] for _ in range(len1 + 1)] + + # Fill the first row and column + for t1 in range(len1 + 1): + distances[t1][0] = t1 + + for t2 in range(len2 + 1): + distances[0][t2] = t2 + + # Compute the Levenshtein distance + for t1 in range(1, len1 + 1): + for t2 in range(1, len2 + 1): + if token1[t1 - 1] == token2[t2 - 1]: + distances[t1][t2] = distances[t1 - 1][t2 - 1] + else: + distances[t1][t2] = min( + distances[t1][t2 - 1], # Insertion + distances[t1 - 1][t2], # Deletion + distances[t1 - 1][t2 - 1] # Substitution + ) + 1 + + return distances[len1][len2] + def url2hash(url): md5hash = hashlib.md5() md5hash.update(url.encode()) diff --git a/sequana_pipetools/options.py b/sequana_pipetools/options.py index 7f5066a..3923097 100644 --- a/sequana_pipetools/options.py +++ b/sequana_pipetools/options.py @@ -198,7 +198,7 @@ def from_project_callback(ctx, param, value): if not value: return else: - # When --from-project is called, all value of arguments are are replaced by the ones + # When --from-project is called, all value of arguments are replaced by the ones # found in the config file. Therefore, users may ommit all arguments. However, some # may be compulsary, so we need to reset all 'required' arguments to False for option in ctx.command.params: diff --git a/sequana_pipetools/scripts/main.py b/sequana_pipetools/scripts/main.py index d294a9d..e5c154d 100644 --- a/sequana_pipetools/scripts/main.py +++ b/sequana_pipetools/scripts/main.py @@ -227,15 +227,16 @@ def main(**kwargs): subprocess.call(cmd.split()) elif kwargs["completion"]: + name = kwargs["completion"] + if kwargs["force"] is True: choice = "y" else: # pragma: no cover - msg = "This action will replace files stored in ./config/sequana/pipelines. Do you want to proceed y/n: " + msg = f"This action will replace the {name}.sh file stored in ~/.config/sequana/pipelines. Do you want to proceed y/n: " choice = input(msg) if choice != "y": # pragma: no cover sys.exit(0) - name = kwargs["completion"] try: c = ClickComplete(name) c.save_completion_script() @@ -244,7 +245,7 @@ def main(**kwargs): finally: click.echo("Please source the files using:: \n") click.echo(" source ~/.config/sequana/pipelines/{}.sh".format(name)) - click.echo("\nto activate the completion") + click.echo("\nto activate the completion. Add the line above in your environement") elif kwargs["stats"]: wrappers, rules = get_pipeline_statistics() click.echo("\n ==== Number of wrappers per pipeline") diff --git a/sequana_pipetools/snaketools/pipeline_manager.py b/sequana_pipetools/snaketools/pipeline_manager.py index cb77b43..05281e2 100644 --- a/sequana_pipetools/snaketools/pipeline_manager.py +++ b/sequana_pipetools/snaketools/pipeline_manager.py @@ -172,6 +172,7 @@ def teardown(self, extra_dirs_to_remove=[], extra_files_to_remove=[], outdir="." print("\u2705 Another successful analysis. Open summary.html in your browser. Have fun.") else: print("\u2705 Another successful analysis. Have fun.") + print("\u2705 Please consider citing us would you use Sequana in your research. See https://sequana.readthedocs.io or cite: \n\n\tCokelaer et al. Sequana': a Set of Snakemake NGS pipelines, (2007) JOSS 2(16)") def get_html_summary(self, float="left", width=30): import pandas as pd diff --git a/sequana_pipetools/snaketools/profile.py b/sequana_pipetools/snaketools/profile.py index d17abc7..7b3eb1d 100644 --- a/sequana_pipetools/snaketools/profile.py +++ b/sequana_pipetools/snaketools/profile.py @@ -17,7 +17,7 @@ def create_profile(workdir: Path, profile: str, **kwargs) -> str: with open(profile_file, "r") as fin: profile_text = fin.read() profile_text = profile_text.format(**kwargs) - except AttributeError: + except AttributeError: #pragma: no cover # python 3.8 support for back compatibility with resources.path("sequana_pipetools.resources", f"{profile}.yaml") as profile_file: profile_text = profile_file.read_text().format(**kwargs) diff --git a/sequana_pipetools/snaketools/sequana_config.py b/sequana_pipetools/snaketools/sequana_config.py index 5f6e2ea..c107d5e 100644 --- a/sequana_pipetools/snaketools/sequana_config.py +++ b/sequana_pipetools/snaketools/sequana_config.py @@ -185,7 +185,7 @@ def check_config_with_schema(self, schemafile): try: ext_name = resources.files("sequana_pipetools.resources").joinpath("ext.py") extensions = [str(ext_name)] - except AttributeError: + except AttributeError: #pragma: no cover with resources.path("sequana_pipetools.resources", "ext.py") as ext_name: extensions = [str(ext_name)] diff --git a/tests/test_misc.py b/tests/test_misc.py index 7c88f37..f70b418 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1,4 +1,10 @@ -from sequana_pipetools.misc import Colors, print_version, error, url2hash +from sequana_pipetools.misc import Colors, print_version, error, url2hash, levenshtein_distance + + + +def test_levenshtein(): + assert levenshtein_distance("kitten", "sitting") == 3 + assert levenshtein_distance("flaw", "lawn") == 2 def test_url2hash(): From 1958859a957c280064fbafa84085870d2133fd7c Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Thu, 22 Aug 2024 23:06:27 +0200 Subject: [PATCH 2/2] add logo --- doc/_static/logo_256x256.png | Bin 0 -> 45515 bytes doc/conf.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 doc/_static/logo_256x256.png diff --git a/doc/_static/logo_256x256.png b/doc/_static/logo_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..bb4a4b2ffce505049e5e86f55b3d54589cbba963 GIT binary patch literal 45515 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

Rv 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

?6MFc_kE_0pR{QA1ZXjC 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 DHPW}c literal 0 HcmV?d00001 diff --git a/doc/conf.py b/doc/conf.py index 4ecb510..86b72b4 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -157,11 +157,11 @@ # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -html_short_title = "sequana" +html_short_title = "sequana_pipetools" # The name of an image file (relative to this directory) to place at the top # of the sidebar. -# html_logo = "../../share/data/images/crx_logo.png" +html_logo = "_static/logo_256x256.png" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32