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
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
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()
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
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
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
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
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
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
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
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
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
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
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
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
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
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."""
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