Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/site-packages/pysam/utils.py @ 69:33d812a61356
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 17:55:14 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/site-packages/pysam/utils.py Tue Mar 18 17:55:14 2025 -0400 @@ -0,0 +1,126 @@ +from typing import ( + Callable, + List, + Optional, + Tuple, + Iterable, + Union, +) + +from pysam.libcutils import _pysam_dispatch + + +class SamtoolsError(Exception): + '''exception raised in case of an error incurred in the samtools + library.''' + + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + + +class PysamDispatcher(object): + '''The dispatcher emulates the samtools/bctools command line. + + Captures stdout and stderr. + + Raises a :class:`pysam.SamtoolsError` exception in case samtools + exits with an error code other than 0. + + Some command line options are associated with parsers. For + example, the samtools command "pileup -c" creates a tab-separated + table on standard output. In order to associate parsers with + options, an optional list of parsers can be supplied. The list + will be processed in order checking for the presence of each + option. + + If no parser is given or no appropriate parser is found, the + stdout output of samtools/bcftools commands will be returned. + + ''' + + dispatch = None + parsers = None + collection = None + + def __init__( + self, + collection: str, + dispatch: str, + parsers: Optional[Iterable[Tuple[str, Callable[[Union[str, List[str]]], Union[str, List[str]]]]]] = None, + ): + self.collection = collection + self.dispatch = dispatch + self.parsers = parsers + self.stderr = [] + + def __call__(self, *args: str, **kwargs) -> Union[str, List[str]]: + ''' + execute a samtools command. + + Keyword arguments: + catch_stdout -- redirect stdout from the samtools command and + return as variable (default True) + save_stdout -- redirect stdout to a filename. + raw -- ignore any parsers associated with this samtools command. + split_lines -- return stdout (if catch_stdout is True and stderr + as a list of strings. + ''' + retval, stderr, stdout = _pysam_dispatch( + self.collection, + self.dispatch, + args, + catch_stdout=kwargs.get("catch_stdout", True), + save_stdout=kwargs.get("save_stdout", None)) + + if kwargs.get("split_lines", False): + stdout = stdout.splitlines() + if stderr: + stderr = stderr.splitlines() + + if retval: + raise SamtoolsError( + "%s returned with error %i: " + "stdout=%s, stderr=%s" % + (self.collection, + retval, + stdout, + stderr)) + + self.stderr = stderr + + # call parser for stdout: + if not kwargs.get("raw") and stdout and self.parsers: + for options, parser in self.parsers: + for option in options: + if option not in args: + break + else: + return parser(stdout) + + return stdout + + def get_messages(self): + return self.stderr + + def usage(self): + '''return the samtools usage information for this command''' + retval, stderr, stdout = _pysam_dispatch( + self.collection, + self.dispatch, + is_usage=True, + catch_stdout=True) + # some tools write usage to stderr, such as mpileup + if stderr: + return stderr + else: + return stdout + + +class unquoted_str(str): + '''Tag a value as an unquoted string. Meta-information in the VCF + header takes the form of key=value pairs. By default, pysam will + enclose the value in quotation marks. Tagging that value with + unquoted_str will prevent this quoting.'''