Skip to content

Commit 02b1f5b

Browse files
Merge pull request #15 from moka-guys/development
v1.2.0 (#15) Co-Authored-By: Graeme <graeme_c_smith@hotmail.com> Co-Authored-By: rebeccahaines1 <84131466+rebeccahaines1@users.noreply.github.com>
2 parents 2bfd587 + 586c6ec commit 02b1f5b

7 files changed

+65
-28
lines changed

README.md

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ Runs a series of checks on the sample sheet, collects any errors identified. Che
1919
* Pan numbers are in the list of allowed pan numbers supplied to the script
2020
* Samplesheet contains any TSO samples
2121

22+
If samplesheet contains an input dev_panno, the package will skip samplesheet chcks for the samplesheet.
23+
2224
## Usage
2325

2426
### Python package
@@ -75,10 +77,16 @@ options:
7577
Development pan number
7678
-L LOGDIR, --logdir LOGDIR
7779
Directory to save the output logfile to
80+
-NSH NO_STREAM_HANDLER, --no_stream_handler NO_STRAM_HANDLER
81+
Provide flag when we don't want a stream handler (prevents
82+
duplication of log messages to terminal if using another
83+
logging instance)
7884
```
7985
8086
### Testing
8187
88+
This repository currently has **92% test coverage**.
89+
8290
Test datasets are stored in [/test/data](../test/data). The script has a full test suite:
8391
* [test_samplesheet_validator.py](../test/test_samplesheet_validator.py)
8492

samplesheet_validator/__main__.py

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import argparse
33
from .samplesheet_validator import SamplesheetCheck
4+
from .ss_logger import set_root_logger
45

56

67
def get_arguments():
@@ -58,6 +59,16 @@ def get_arguments():
5859
required=True,
5960
help="Directory to save the output logfile to",
6061
)
62+
parser.add_argument(
63+
"-NSH",
64+
"--no_stream_handler",
65+
action='store_true',
66+
required=False,
67+
help=(
68+
"Provide flag when we don't want a stream handler (prevents duplication of log messages "
69+
"to terminal if using another logging instance)"
70+
),
71+
)
6172
return parser.parse_args()
6273

6374

@@ -89,6 +100,8 @@ def is_valid_dir(parser: argparse.ArgumentParser, dir: str) -> str:
89100

90101
if __name__ == "__main__":
91102
parsed_args = get_arguments()
103+
if not parsed_args.no_stream_handler:
104+
set_root_logger() # Adds stream handler
92105
sscheck_obj = SamplesheetCheck(
93106
parsed_args.samplesheet_path,
94107
parsed_args.sequencer_ids,

samplesheet_validator/git_tag.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import os
2+
import subprocess
3+
4+
5+
def git_tag() -> str:
6+
"""
7+
Obtain the git tag of the current commit
8+
:return (str): Git tag
9+
"""
10+
filepath = os.path.dirname(os.path.realpath(__file__))
11+
cmd = f"git -C {filepath} describe --tags"
12+
13+
proc = subprocess.Popen(
14+
[cmd], stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True,
15+
)
16+
out, _ = proc.communicate()
17+
# Return standard out, removing any new line characters
18+
return out.rstrip().decode("utf-8")

samplesheet_validator/samplesheet_validator.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import re
1515
from typing import Union
1616
from . import config
17-
from .ss_logger import SSLogger, shutdown_logs
17+
from .ss_logger import SSLogger
1818
from seglh_naming.sample import Sample
1919
from seglh_naming.samplesheet import Samplesheet
2020

@@ -101,7 +101,6 @@ def __init__(
101101
"""
102102
self.samplesheet_path = samplesheet_path
103103
self.logdir = logdir
104-
self.logger = False
105104
self.ss_obj = False
106105
self.pannumbers = []
107106
self.tso = False
@@ -156,7 +155,6 @@ def ss_checks(self) -> None:
156155
self.check_pannos(sample, column, sample_obj)
157156
self.check_tso()
158157
self.log_summary()
159-
shutdown_logs(self.logger)
160158

161159
def check_ss_present(self) -> Union[bool, None]:
162160
"""

samplesheet_validator/ss_logger.py

+11-22
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,23 @@
88
import logging.handlers
99

1010

11-
def shutdown_logs(logger: object) -> None:
11+
def set_root_logger():
1212
"""
13-
To prevent duplicate filehandlers and system handlers close
14-
and remove all handlers for a logging object
15-
:return (None):
13+
Set up root logger and add stream handler - we only want to add stream handler once
14+
else it will duplicate log messages to the terminal
1615
"""
17-
for handler in logger.handlers[:]:
18-
logger.removeHandler(handler)
19-
handler.close()
16+
logger = logging.getLogger()
17+
logger.setLevel(logging.DEBUG)
18+
stream_handler = logging.StreamHandler(sys.stdout)
19+
stream_handler.setLevel(logging.DEBUG)
20+
stream_handler.setFormatter(logging.Formatter(config.LOGGING_FORMATTER))
21+
stream_handler.name = "stream_handler"
22+
logger.addHandler(stream_handler)
2023

2124

2225
class SSLogger:
2326
"""
24-
Creates a python logging object with a file handler, syslog handler and stream handler
27+
Creates a python logging object with a file handler and syslog handler
2528
2629
Attributes
2730
timestamp (str): Timestamp from config
@@ -35,8 +38,6 @@ class SSLogger:
3538
Get file handler for the logger
3639
_get_syslog_handler()
3740
Get syslog handler for the logger
38-
_get_stream_handler()
39-
Get stream handler for the logger (sends to stdout)
4041
"""
4142

4243
def __init__(self, logfile_path: str):
@@ -58,7 +59,6 @@ def get_logger(self) -> logging.Logger:
5859
logger.filepath = self.logfile_path
5960
logger.setLevel(logging.DEBUG)
6061
logger.addHandler(self._get_file_handler())
61-
logger.addHandler(self._get_stream_handler())
6262
logger.addHandler(self._get_syslog_handler())
6363
logger.timestamp = self.timestamp
6464
logger.log_msgs = config.LOG_MSGS
@@ -85,14 +85,3 @@ def _get_syslog_handler(self) -> logging.handlers.SysLogHandler:
8585
syslog_handler.setFormatter(self.logging_formatter)
8686
syslog_handler.name = "syslog_handler"
8787
return syslog_handler
88-
89-
def _get_stream_handler(self) -> logging.StreamHandler:
90-
"""
91-
Get stream handler for the logger (sends to stdout)
92-
:return stream_handler (logging.StreamHandler): StreamHandler
93-
"""
94-
stream_handler = logging.StreamHandler(sys.stdout)
95-
stream_handler.setLevel(logging.DEBUG)
96-
stream_handler.setFormatter(self.logging_formatter)
97-
stream_handler.name = "stream_handler"
98-
return stream_handler

setup.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from setuptools import setup
2+
from samplesheet_validator.git_tag import git_tag
23

34
setup(
45
name="samplesheet_validator",
5-
version="1.1.0",
6+
version=git_tag(),
67
description="Python library for samplesheet validation",
7-
url="http://github.com/moka-guys/samplesheet_validator",
8+
url="https://github.com/moka-guys/samplesheet_validator",
89
author="Rachel Duffin",
910
author_email="rachel.duffin2@nhs.net",
1011
license="Apache License, Version 2.0",

test/test_samplesheet_validator.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,21 @@
66
import os
77
import argparse
88
import pytest
9-
from samplesheet_validator.ss_logger import shutdown_logs
109
from samplesheet_validator import samplesheet_validator
1110
from samplesheet_validator.__main__ import is_valid_dir, is_valid_file
1211

1312

13+
def shutdown_logs(logger: object) -> None:
14+
"""
15+
To prevent duplicate filehandlers and system handlers close
16+
and remove all handlers for a logging object
17+
:return (None):
18+
"""
19+
for handler in logger.handlers[:]:
20+
logger.removeHandler(handler)
21+
handler.close()
22+
23+
1424
def get_sscheck_obj(samplesheet: str) -> object:
1525
"""
1626
Function to retrieve a samplesheet check object and carry out the

0 commit comments

Comments
 (0)