Beispiel #1
0
def test_logfile_path():
    """correctly assigned"""
    LOGGER = CachingLogger(create_dir=True, log_file_path=LOGFILE_NAME)
    assert LOGGER.log_file_path == str(LOGFILE_NAME)
    LOGGER.shutdown()
    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #2
0
def test_mdsum_input():
    """md5 sum of input file should be correct"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    # first file has LF, second has CRLF line endings
    hex_path = [
        ("96eb2c2632bae19eb65ea9224aaafdad", "sample-lf.fasta"),
        ("e7e219f66be15d8afc7cdb85303305a7", "sample-crlf.fasta"),
    ]
    LOGGER.input_file(TEST_ROOTDIR / "sample-lf.fasta")
    LOGGER.input_file(TEST_ROOTDIR / "sample-crlf.fasta")
    LOGGER.shutdown()

    with open(LOGFILE_NAME, "r") as infile:
        num = 0
        for line in infile:
            for h, p in hex_path:
                if p in line:
                    assert "input_file" in line
                    line = next(infile)
                    assert h in line
                    num += 1

        assert num == len(hex_path)

    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #3
0
def test_set_path_if_exists():
    """cannot change an existing logging path"""
    with TemporaryDirectory(dir=".") as dirname:
        dirname = Path(dirname)
        LOGGER = CachingLogger(create_dir=True)
        LOGGER.log_file_path = dirname / LOGFILE_NAME
        LOGGER.input_file(TEST_ROOTDIR / "sample-lf.fasta")
        with pytest.raises(AttributeError):
            LOGGER.log_file_path = dirname / "invalid.log"
        LOGGER.shutdown()
Beispiel #4
0
def test_caching():
    """should cache calls prior to logging"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.input_file(TEST_ROOTDIR / "sample-lf.fasta")
    assert ("sample-lf.fasta" in LOGGER._messages[-2]
            and "md5sum" in LOGGER._messages[-1])
    LOGGER.log_versions(["numpy"])
    assert "numpy==" in LOGGER._messages[-1]

    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.shutdown()
    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #5
0
def test_shutdown():
    """correctly purges contents"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.input_file(TEST_ROOTDIR / "sample-lf.fasta")
    LOGGER.shutdown()
    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #6
0
def test_tracks_locals():
    """details on local arguments should be present in log"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = os.path.join(LOGFILE_NAME)

    def track_func(a=1, b="abc"):
        LOGGER.log_args()

    track_func()
    LOGGER.shutdown()
    with open(LOGFILE_NAME, "r") as infile:
        for line in infile:
            index = line.find("params :")
            if index > 0:
                got = eval(line.split("params :")[1])
                break
    assert got == dict(a=1, b="abc")
    try:
        os.remove(LOGFILE_NAME)
        pass
    except OSError:
        pass
Beispiel #7
0
def test_creates_path():
    """creates a log path"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = os.path.join(DIRNAME, LOGFILE_NAME)
    LOGGER.input_file("sample.fasta")
    LOGGER.shutdown()
    assert os.path.exists(DIRNAME)
    assert os.path.exists(os.path.join(DIRNAME, LOGFILE_NAME))
    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #8
0
def test_creates_path():
    """creates a log path"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.input_file(TEST_ROOTDIR / "sample-lf.fasta")
    LOGGER.shutdown()
    assert DIRNAME.exists()
    assert LOGFILE_NAME.exists()

    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #9
0
def test_tracks_versions_empty():
    """should track version of scitrack"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.input_file(TEST_ROOTDIR / "sample-lf.fasta")
    LOGGER.log_versions()
    LOGGER.shutdown()
    contents = LOGFILE_NAME.read_text()
    for label in ["system_details", "python", "user", "command_string"]:
        assert contents.count(f"\t{label}") == 1, (
            label,
            contents.count(label),
        )
    for line in contents.splitlines():
        if "version :" in line:
            assert "==%s" % __version__ in line, line

    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #10
0
def test_tracks_args():
    """details on host, python version should be present in log"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = os.path.join(LOGFILE_NAME)
    LOGGER.input_file("sample.fasta")
    LOGGER.shutdown()
    with open(LOGFILE_NAME, "r") as infile:
        contents = "".join(infile.readlines())
        for label in ["system_details", "python", "user", "command_string"]:
            assert contents.count(label) == 1, (label, contents.count(label))
    try:
        os.remove(LOGFILE_NAME)
    except OSError:
        pass
Beispiel #11
0
def test_tracks_versions():
    """should track versions"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = os.path.join(LOGFILE_NAME)
    LOGGER.input_file("sample.fasta")
    LOGGER.log_versions(["numpy"])
    LOGGER.shutdown()
    with open(LOGFILE_NAME, "r") as infile:
        contents = "".join(infile.readlines())
        for label in ["system_details", "python", "user", "command_string"]:
            assert contents.count(label) == 1, (label, contents.count(label))
        for line in contents.splitlines():
            if "version :" in line:
                if "numpy" not in line:
                    assert "==%s" % __version__ in line, line
                else:
                    assert "numpy" in line, line
        print("\n\n", contents)
    try:
        os.remove(LOGFILE_NAME)
    except OSError:
        pass
Beispiel #12
0
def test_tracks_args():
    """details on host, python version should be present in log"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.input_file(TEST_ROOTDIR / "sample-lf.fasta")
    LOGGER.shutdown()
    contents = LOGFILE_NAME.read_text()
    for label in ["system_details", "python", "user", "command_string"]:
        assert contents.count(f"\t{label}") == 1, (
            label,
            contents.count(label),
        )

    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #13
0
def test_logging_text():
    """correctly logs text data"""
    text = "abcde\nedfgu\nyhbnd"
    hexd = "f06597f8a983dfc93744192b505a8af9"
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.text_data(text, label="UNIQUE")
    LOGGER.shutdown()
    contents = LOGFILE_NAME.read_text().splitlines()
    unique = None
    for line in contents:
        if "UNIQUE" in line:
            unique = line
            break
    assert hexd in unique
    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #14
0
def test_tracks_versions_module():
    """should track version if package is a module"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = os.path.join(LOGFILE_NAME)
    import numpy

    expect = "numpy==%s" % numpy.__version__
    LOGGER.log_versions(numpy)
    LOGGER.shutdown()
    del numpy
    with open(LOGFILE_NAME, "r") as infile:
        contents = "".join(infile.readlines())
        for line in contents.splitlines():
            if "version :" in line and "numpy" in line:
                assert expect in line, line
    try:
        os.remove(LOGFILE_NAME)
    except OSError:
        pass
Beispiel #15
0
def test_tracks_versions_string():
    """should track version if package name is a string"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.log_versions("numpy")
    LOGGER.shutdown()
    import numpy

    expect = "numpy==%s" % numpy.__version__
    del numpy
    with open(LOGFILE_NAME, "r") as infile:
        contents = "".join(infile.readlines())
        for line in contents.splitlines():
            if "version :" in line and "numpy" in line:
                assert expect in line, line

    try:
        shutil.rmtree(DIRNAME)
    except OSError:
        pass
Beispiel #16
0
def test_mdsum_input():
    """md5 sum of input file should be correct"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = os.path.join(LOGFILE_NAME)
    LOGGER.input_file("sample.fasta")
    LOGGER.shutdown()

    with open(LOGFILE_NAME, "r") as infile:
        num = 0
        for line in infile:
            line = line.strip()
            if "input_file_path md5sum" in line:
                assert "96eb2c2632bae19eb65ea9224aaafdad" in line
                num += 1
        assert num == 1

    try:
        os.remove(LOGFILE_NAME)
    except OSError:
        pass
Beispiel #17
0
from scitrack import CachingLogger

from mutation_motif.util import makedirs, abspath, just_nucs,\
    load_from_fasta
from mutation_motif import profile, motif_count

__author__ = "Gavin Huttley"
__copyright__ = "Copyright 2016, Gavin Huttley, Yicheng Zhu"
__credits__ = ["Gavin Huttley", "Yicheng Zhu"]
__license__ = "GPL"
__version__ = "0.3"
__maintainer__ = "Gavin Huttley"
__email__ = "*****@*****.**"
__status__ = "Development"

LOGGER = CachingLogger(create_dir=True)
fn_suffixes = re.compile(r"\.(fa|fasta)\.*(gz|gzip|bz2)*$")


def get_counts_filename(align_path, output_dir):
    """returns counts output path

    Arguments:
        - align_path: path to the alignment file. The basename will be
          modified to use a .txt suffix
        - output_dir: directory where the counts file is to be written
    """

    fn = os.path.basename(align_path)
    fn = fn_suffixes.sub(".txt", fn)
    counts_filename = os.path.join(output_dir, fn)
#!/usr/bin/env python3.5
"""code for annotating SNP positions on reference sequences in an alignment"""
import os, re, pickle, glob, gzip, time

import copy
from copy import deepcopy
from cogent3 import LoadSeqs, LoadTable, LoadTree, DNA
from cogent3.core.annotation import Feature
from cogent3.evolve.models import HKY85
from cogent3.core.alignment import Alignment

import click
from scitrack import CachingLogger

LOGGER = CachingLogger()


def get_files(input_path):
    """return a list of files with a specific glob pattern from a directory"""
    fns = []
    for file_extension in ['fasta.gz', 'fasta', 'fa', 'fa.gz']:
        fns += glob.glob(os.path.join(input_path, '*.' + file_extension))
    if not fns:
        raise RuntimeError('Error selscting files')

    return fns


def get_syntenic_alignment(aln, var_name, var_start, ref_name, aln_flank):
    """target the variant and slice out the syntenic region, with the
     variant allocate in the middle."""
Beispiel #19
0
def test_appending():
    """appending to an existing logfile should work"""
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.input_file("sample.fasta")
    LOGGER.shutdown()
    records = Counter()
    with open(LOGFILE_NAME) as infile:
        for line in infile:
            records[line] += 1
    vals = set(list(records.values()))
    assert vals == {1}
    LOGGER = CachingLogger(create_dir=True)
    LOGGER.mode = "a"
    LOGGER.log_file_path = LOGFILE_NAME
    LOGGER.input_file("sample.fasta")
    LOGGER.shutdown()

    records = Counter()
    with open(LOGFILE_NAME) as infile:
        for line in infile:
            records[line] += 1
    vals = set(list(records.values()))

    assert vals == {2}

    try:
        os.remove(LOGFILE_NAME)
    except OSError:
        pass