From 42abb47db54379bf43f55eb691c4b4feb0bc1301 Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 13 Dec 2023 14:30:16 +0100 Subject: [PATCH 01/24] added sample_gender --- clarity_epp.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/clarity_epp.py b/clarity_epp.py index e0ffd81..df8e414 100755 --- a/clarity_epp.py +++ b/clarity_epp.py @@ -121,6 +121,11 @@ def export_sample_indications(args): lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project ) +def export_sample_gender(args): + """Export sample gender table.""" + clarity_epp.export.sample.sample_gender( + lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project + ) def export_sample_related_mip(args): """Export related MIP samples""" @@ -350,6 +355,18 @@ def placement_pipetting(args): ) parser_export_sample_indications.set_defaults(func=export_sample_indications) + parser_export_sample_gender = subparser_export.add_parser( + 'sample_gender', help='Export sample gender.', parents=[output_parser] + ) + parser_export_sample_gender_group = parser_export_sample_gender.add_mutually_exclusive_group(required=True) + parser_export_sample_gender_group.add_argument('-a', '--artifact_name', help='Artifact name') + parser_export_sample_gender_group.add_argument('-r', '--sequencing_run', help='Sequencing run name') + parser_export_sample_gender.add_argument( + '-p', '--sequencing_run_project', nargs='?', help='Sequencing run project name' + ) + parser_export_sample_gender.set_defaults(func=export_sample_gender) + + parser_export_sample_related_mip = subparser_export.add_parser( 'sample_related_mip', help='Export related mip samples.', parents=[output_parser] ) From a0c2b0916a9f4ff4ac410afd15715647f350c5b7 Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 13 Dec 2023 14:30:39 +0100 Subject: [PATCH 02/24] added sample_gender --- clarity_epp/export/sample.py | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/clarity_epp/export/sample.py b/clarity_epp/export/sample.py index 74bee68..d5143a5 100644 --- a/clarity_epp/export/sample.py +++ b/clarity_epp/export/sample.py @@ -164,6 +164,45 @@ def sample_indications(lims, output_file, artifact_name=None, sequencing_run=Non print("no_sample_found") +def sample_gender(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None): + """Export table with sample gender. Lookup samples by sample name or sequencing run (project).""" + samples = [] + + # Get samples by artifact_name + if artifact_name: + artifacts = lims.get_artifacts(name=artifact_name) + samples = {artifact_name: artifact.samples[0] for artifact in artifacts} + + # Get samples by sequencing run + elif sequencing_run: + udf_query = {'Dx Sequencing Run ID': sequencing_run} + if sequencing_run_project: + udf_query['Dx Sequencing Run Project'] = sequencing_run_project + + artifacts = lims.get_artifacts(type='Analyte', udf=udf_query) + samples = {artifact.name: artifact.samples[0] for artifact in artifacts} + + # Write result + if samples: + output_file.write('Sample\tGender\n') + for sample_name, sample in samples.items(): + if 'Dx Geslacht' in sample.udf: + output_file.write( + '{sample}\t{gender}\n'.format( + sample=sample_name, + gender=sample.udf['Dx Geslacht'].split(';')[0] # select newest gender + ) + ) + else: + output_file.write( + '{sample}\t{gender}\n'.format( + sample=sample_name, + gender='unkown' + ) + ) + else: + print("no_sample_found") + def sample_related_mip(lims, process_id, output_file): """Export related mip samples for all samples in process.""" process = Process(lims, id=process_id) From b46e5609e0409981d1832b84efa59bbaccaa1db4 Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 13 Dec 2023 14:32:14 +0100 Subject: [PATCH 03/24] flake8 refactor --- clarity_epp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clarity_epp.py b/clarity_epp.py index df8e414..f9dfd1a 100755 --- a/clarity_epp.py +++ b/clarity_epp.py @@ -121,12 +121,14 @@ def export_sample_indications(args): lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project ) + def export_sample_gender(args): """Export sample gender table.""" clarity_epp.export.sample.sample_gender( lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project ) + def export_sample_related_mip(args): """Export related MIP samples""" clarity_epp.export.sample.sample_related_mip(lims, args.process_id, args.output_file) @@ -366,7 +368,6 @@ def placement_pipetting(args): ) parser_export_sample_gender.set_defaults(func=export_sample_gender) - parser_export_sample_related_mip = subparser_export.add_parser( 'sample_related_mip', help='Export related mip samples.', parents=[output_parser] ) From 4907a94f1142f4043ff09bc00677242b7523e1fd Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 13 Dec 2023 14:33:18 +0100 Subject: [PATCH 04/24] flake8 refactor --- clarity_epp/export/sample.py | 1 + 1 file changed, 1 insertion(+) diff --git a/clarity_epp/export/sample.py b/clarity_epp/export/sample.py index d5143a5..f421970 100644 --- a/clarity_epp/export/sample.py +++ b/clarity_epp/export/sample.py @@ -203,6 +203,7 @@ def sample_gender(lims, output_file, artifact_name=None, sequencing_run=None, se else: print("no_sample_found") + def sample_related_mip(lims, process_id, output_file): """Export related mip samples for all samples in process.""" process = Process(lims, id=process_id) From dc0c7c46e984df4de5ad3537ec60a7e2b58f1422 Mon Sep 17 00:00:00 2001 From: melferink Date: Thu, 14 Dec 2023 14:37:21 +0100 Subject: [PATCH 05/24] combined gender and indication into one function udf --- clarity_epp.py | 43 +++++++++++++------------------------------ 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/clarity_epp.py b/clarity_epp.py index f9dfd1a..240fe2d 100755 --- a/clarity_epp.py +++ b/clarity_epp.py @@ -115,20 +115,12 @@ def export_removed_samples(args): clarity_epp.export.sample.removed_samples(lims, args.output_file) -def export_sample_indications(args): - """Export sample indication table.""" - clarity_epp.export.sample.sample_indications( - lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project +def export_sample_udf(args): + "Export sample udf table.""" + clarity_epp.export.sample.sample_udf( + lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project, args.udf, args.column_name ) - -def export_sample_gender(args): - """Export sample gender table.""" - clarity_epp.export.sample.sample_gender( - lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project - ) - - def export_sample_related_mip(args): """Export related MIP samples""" clarity_epp.export.sample.sample_related_mip(lims, args.process_id, args.output_file) @@ -346,27 +338,18 @@ def placement_pipetting(args): ) parser_export_removed_samples.set_defaults(func=export_removed_samples) - parser_export_sample_indications = subparser_export.add_parser( - 'sample_indications', help='Export sample indication table.', parents=[output_parser] - ) - parser_export_sample_indications_group = parser_export_sample_indications.add_mutually_exclusive_group(required=True) - parser_export_sample_indications_group.add_argument('-a', '--artifact_name', help='Artifact name') - parser_export_sample_indications_group.add_argument('-r', '--sequencing_run', help='Sequencing run name') - parser_export_sample_indications.add_argument( - '-p', '--sequencing_run_project', nargs='?', help='Sequencing run project name' - ) - parser_export_sample_indications.set_defaults(func=export_sample_indications) - - parser_export_sample_gender = subparser_export.add_parser( - 'sample_gender', help='Export sample gender.', parents=[output_parser] + parser_export_sample_udf = subparser_export.add_parser( + 'sample_udf', help='Export sample udf table.', parents=[output_parser] ) - parser_export_sample_gender_group = parser_export_sample_gender.add_mutually_exclusive_group(required=True) - parser_export_sample_gender_group.add_argument('-a', '--artifact_name', help='Artifact name') - parser_export_sample_gender_group.add_argument('-r', '--sequencing_run', help='Sequencing run name') - parser_export_sample_gender.add_argument( + parser_export_sample_udf_group = parser_export_sample_udf.add_mutually_exclusive_group(required=True) + parser_export_sample_udf_group.add_argument('-a', '--artifact_name', help='Artifact name') + parser_export_sample_udf_group.add_argument('-r', '--sequencing_run', help='Sequencing run name') + parser_export_sample_udf.add_argument( '-p', '--sequencing_run_project', nargs='?', help='Sequencing run project name' ) - parser_export_sample_gender.set_defaults(func=export_sample_gender) + parser_export_sample_udf.add_argument('-u', '--udf', help='udf to query') + parser_export_sample_udf.add_argument('-c', '--column_name', help='naming of column') + parser_export_sample_udf.set_defaults(func=export_sample_udf) parser_export_sample_related_mip = subparser_export.add_parser( 'sample_related_mip', help='Export related mip samples.', parents=[output_parser] From 8439f7b93aebf50dad68b9a8e11c70eee1e022c1 Mon Sep 17 00:00:00 2001 From: melferink Date: Thu, 14 Dec 2023 14:37:39 +0100 Subject: [PATCH 06/24] combined gender and indication into one function udf --- clarity_epp/export/sample.py | 56 ++++++------------------------------ 1 file changed, 8 insertions(+), 48 deletions(-) diff --git a/clarity_epp/export/sample.py b/clarity_epp/export/sample.py index f421970..83aa60c 100644 --- a/clarity_epp/export/sample.py +++ b/clarity_epp/export/sample.py @@ -124,8 +124,8 @@ def removed_samples(lims, output_file): )) -def sample_indications(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None): - """Export table with sample indications. Lookup samples by sample name or sequencing run (project).""" +def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None, udf=None, column_name=None): + """Export table with sample udf. Lookup samples by sample name or sequencing run (project).""" samples = [] # Get samples by artifact_name @@ -144,60 +144,20 @@ def sample_indications(lims, output_file, artifact_name=None, sequencing_run=Non # Write result if samples: - output_file.write('Sample\tIndication\n') + output_file.write(f'Sample\t{column_name}\n') for sample_name, sample in samples.items(): - if 'Dx Onderzoeksindicatie' in sample.udf: + if udf in sample.udf: output_file.write( - '{sample}\t{indication}\n'.format( + '{sample}\t{udf_value}\n'.format( sample=sample_name, - indication=sample.udf['Dx Onderzoeksindicatie'].split(';')[0] # select newest indication + udf_value=sample.udf[udf].split(';')[0] # select newest udf value ) ) else: output_file.write( - '{sample}\t{indication}\n'.format( + '{sample}\t{column}\n'.format( sample=sample_name, - indication='unkown_indication' - ) - ) - else: - print("no_sample_found") - - -def sample_gender(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None): - """Export table with sample gender. Lookup samples by sample name or sequencing run (project).""" - samples = [] - - # Get samples by artifact_name - if artifact_name: - artifacts = lims.get_artifacts(name=artifact_name) - samples = {artifact_name: artifact.samples[0] for artifact in artifacts} - - # Get samples by sequencing run - elif sequencing_run: - udf_query = {'Dx Sequencing Run ID': sequencing_run} - if sequencing_run_project: - udf_query['Dx Sequencing Run Project'] = sequencing_run_project - - artifacts = lims.get_artifacts(type='Analyte', udf=udf_query) - samples = {artifact.name: artifact.samples[0] for artifact in artifacts} - - # Write result - if samples: - output_file.write('Sample\tGender\n') - for sample_name, sample in samples.items(): - if 'Dx Geslacht' in sample.udf: - output_file.write( - '{sample}\t{gender}\n'.format( - sample=sample_name, - gender=sample.udf['Dx Geslacht'].split(';')[0] # select newest gender - ) - ) - else: - output_file.write( - '{sample}\t{gender}\n'.format( - sample=sample_name, - gender='unkown' + column='unkown' ) ) else: From 042713c212341d704808ddd3d87cf776e90b0dcb Mon Sep 17 00:00:00 2001 From: melferink Date: Mon, 5 Feb 2024 08:36:58 +0100 Subject: [PATCH 07/24] split sample_udf into to functions --- clarity_epp/export/sample.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/clarity_epp/export/sample.py b/clarity_epp/export/sample.py index 83aa60c..95d9b6f 100644 --- a/clarity_epp/export/sample.py +++ b/clarity_epp/export/sample.py @@ -124,8 +124,8 @@ def removed_samples(lims, output_file): )) -def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None, udf=None, column_name=None): - """Export table with sample udf. Lookup samples by sample name or sequencing run (project).""" +def get_samples(lims, artifact_name=None, sequencing_run=None, sequencing_run_project=None): + """Lookup samples by sample name or sequencing run (project).""" samples = [] # Get samples by artifact_name @@ -142,6 +142,13 @@ def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, seque artifacts = lims.get_artifacts(type='Analyte', udf=udf_query) samples = {artifact.name: artifact.samples[0] for artifact in artifacts} + return samples + + +def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None, udf=None, column_name=None): + """Export table with sample udf.""" + samples = get_samples(lims, artifact_name, sequencing_run, sequencing_run_project) + # Write result if samples: output_file.write(f'Sample\t{column_name}\n') From b971bd741b49b95526495bbd35cdb7d42c9e547b Mon Sep 17 00:00:00 2001 From: melferink Date: Tue, 6 Feb 2024 13:45:35 +0100 Subject: [PATCH 08/24] refactor --- clarity_epp/export/sample.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/clarity_epp/export/sample.py b/clarity_epp/export/sample.py index 95d9b6f..5fc2172 100644 --- a/clarity_epp/export/sample.py +++ b/clarity_epp/export/sample.py @@ -148,7 +148,6 @@ def get_samples(lims, artifact_name=None, sequencing_run=None, sequencing_run_pr def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None, udf=None, column_name=None): """Export table with sample udf.""" samples = get_samples(lims, artifact_name, sequencing_run, sequencing_run_project) - # Write result if samples: output_file.write(f'Sample\t{column_name}\n') @@ -162,9 +161,9 @@ def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, seque ) else: output_file.write( - '{sample}\t{column}\n'.format( + '{sample}\t{udf_value}\n'.format( sample=sample_name, - column='unkown' + udf_value='unkown' ) ) else: From bd9d2d85b54ed642439653d2da03ac5c1a24e62b Mon Sep 17 00:00:00 2001 From: melferink Date: Tue, 6 Feb 2024 13:49:41 +0100 Subject: [PATCH 09/24] added get_samples tests --- tests/test_export_utils.py | 58 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index 70bfea8..87fee87 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -1,7 +1,12 @@ +import sys + +from unittest.mock import patch + from genologics.lims import Lims from genologics.entities import Artifact from clarity_epp.export import utils +from clarity_epp.export import sample def test_sort_96_well_plate(): @@ -21,3 +26,56 @@ def test_sort_artifact_list(): def test_get_well_index(): assert utils.get_well_index('A1') == 0 assert utils.get_well_index('A1', one_based=True) == 1 + + +def test_get_samples(): + # import pytest + # pytest.fixture(scope="function") + # def mock_get_upload_state(mocker): + # return mocker.patch("rsync_to_rdisc.get_upload_state") + # fake_lims = mocker.MagicMock() + # artifact_name = "Test1" + # test1 = if artifact_name, return samples for artifact + # assert sample.sample_udf(lims, artifact_name) == "no_sample_found" + # test2 = if sequencing_run and no sequencing_run_project, return all samples for run + # test3 = if sequencing_run and sequencing_run_project, return all samples for project of run + pass + + +column_name = "test_column" +sample_name = "test_sample" +udf_value = "Dx geslacht" +geslacht = "Vrouw" + + +class MyMock: + def __init__(self, udf): + self.udf = udf + + +samples_mock = {} +samples_mock[sample_name] = MyMock({udf_value: geslacht}) + + +@patch('clarity_epp.export.sample.get_samples') +def test_get_samples_1(mock_get, capsys): + mock_get.return_value = samples_mock + sample.sample_udf("lims", sys.stdout, udf=udf_value, column_name=column_name) + captured = capsys.readouterr() + assert captured.out == f"Sample\t{column_name}\n{sample_name}\t{geslacht}\n" + + +@patch('clarity_epp.export.sample.get_samples') +def test_get_samples_2(mock_get, capsys): + mock_get.return_value = samples_mock + sample.sample_udf("lims", sys.stdout, udf="udf2", column_name=column_name) + captured = capsys.readouterr() + assert captured.out == f"Sample\t{column_name}\n{sample_name}\tunkown\n" + + +@patch('clarity_epp.export.sample.get_samples') +def test_get_samples_3(mock_get, capsys): + mock_get.return_value = None + sample.sample_udf("lims", sys.stdout) + captured = capsys.readouterr() + assert captured.out == "no_sample_found\n" From ada0d2c00d818354ce071bca532f0573dfacd0f5 Mon Sep 17 00:00:00 2001 From: melferink Date: Tue, 6 Feb 2024 13:52:20 +0100 Subject: [PATCH 10/24] added pytest --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fa62ecd..0517eab 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ genologics==0.3.20 argparse==1.4.0 -xmltodict==0.12.0 \ No newline at end of file +xmltodict==0.12.0 +pytest==7.0.1 From 6ee440e1b094d75ab09ec3d9884dd6514d11148e Mon Sep 17 00:00:00 2001 From: melferink Date: Tue, 6 Feb 2024 13:53:50 +0100 Subject: [PATCH 11/24] test renamed correct function sample_udf --- tests/test_export_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index 87fee87..5c7a8b2 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -58,7 +58,7 @@ def __init__(self, udf): @patch('clarity_epp.export.sample.get_samples') -def test_get_samples_1(mock_get, capsys): +def test_sample_udf_1(mock_get, capsys): mock_get.return_value = samples_mock sample.sample_udf("lims", sys.stdout, udf=udf_value, column_name=column_name) captured = capsys.readouterr() @@ -66,7 +66,7 @@ def test_get_samples_1(mock_get, capsys): @patch('clarity_epp.export.sample.get_samples') -def test_get_samples_2(mock_get, capsys): +def test_sample_udf_2(mock_get, capsys): mock_get.return_value = samples_mock sample.sample_udf("lims", sys.stdout, udf="udf2", column_name=column_name) captured = capsys.readouterr() @@ -74,7 +74,7 @@ def test_get_samples_2(mock_get, capsys): @patch('clarity_epp.export.sample.get_samples') -def test_get_samples_3(mock_get, capsys): +def test_sample_udf_3(mock_get, capsys): mock_get.return_value = None sample.sample_udf("lims", sys.stdout) captured = capsys.readouterr() From 6bd74b5fd23c908e631c9ba085e4e5e94f51b7b6 Mon Sep 17 00:00:00 2001 From: melferink Date: Tue, 6 Feb 2024 13:56:40 +0100 Subject: [PATCH 12/24] removed test test_get_samples --- tests/test_export_utils.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index 5c7a8b2..a3f4667 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -28,20 +28,6 @@ def test_get_well_index(): assert utils.get_well_index('A1', one_based=True) == 1 -def test_get_samples(): - # import pytest - # pytest.fixture(scope="function") - # def mock_get_upload_state(mocker): - # return mocker.patch("rsync_to_rdisc.get_upload_state") - # fake_lims = mocker.MagicMock() - # artifact_name = "Test1" - # test1 = if artifact_name, return samples for artifact - # assert sample.sample_udf(lims, artifact_name) == "no_sample_found" - # test2 = if sequencing_run and no sequencing_run_project, return all samples for run - # test3 = if sequencing_run and sequencing_run_project, return all samples for project of run - pass - - column_name = "test_column" sample_name = "test_sample" udf_value = "Dx geslacht" From 47c36f860508a5e0f6e10e0864ea4240a6d9a40b Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 7 Feb 2024 14:49:35 +0100 Subject: [PATCH 13/24] fixed typo --- clarity_epp/export/sample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clarity_epp/export/sample.py b/clarity_epp/export/sample.py index 5fc2172..5a61432 100644 --- a/clarity_epp/export/sample.py +++ b/clarity_epp/export/sample.py @@ -163,7 +163,7 @@ def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, seque output_file.write( '{sample}\t{udf_value}\n'.format( sample=sample_name, - udf_value='unkown' + udf_value='unknown' ) ) else: From 7b12b347fd3d2e67fb47060e4d278e20503599d9 Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 7 Feb 2024 14:49:50 +0100 Subject: [PATCH 14/24] fixed typo --- tests/test_export_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index a3f4667..0ead926 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -56,7 +56,7 @@ def test_sample_udf_2(mock_get, capsys): mock_get.return_value = samples_mock sample.sample_udf("lims", sys.stdout, udf="udf2", column_name=column_name) captured = capsys.readouterr() - assert captured.out == f"Sample\t{column_name}\n{sample_name}\tunkown\n" + assert captured.out == f"Sample\t{column_name}\n{sample_name}\tunknown\n" @patch('clarity_epp.export.sample.get_samples') From 72627af9914cb1a9b7f8639b227827920cb12e3e Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 7 Feb 2024 14:51:23 +0100 Subject: [PATCH 15/24] fixed typo --- clarity_epp/export/ped.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clarity_epp/export/ped.py b/clarity_epp/export/ped.py index 836d7af..3ba1efd 100644 --- a/clarity_epp/export/ped.py +++ b/clarity_epp/export/ped.py @@ -33,7 +33,7 @@ def create_file(lims, process_id, output_file): ped_sample['sex'] = 0 # Determine affection - ped_sample['affection'] = 0 # unkown + ped_sample['affection'] = 0 # unknown if 'Bevestiging diagnose' in sample.udf['Dx Onderzoeksreden']: ped_sample['affection'] = 2 # affected elif 'Informativiteitstest' in sample.udf['Dx Onderzoeksreden']: From 0c8df893c42f1113d0effab30fc50538f7f3c609 Mon Sep 17 00:00:00 2001 From: melferink Date: Thu, 8 Feb 2024 13:32:13 +0100 Subject: [PATCH 16/24] refactor --- tests/test_export_utils.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index 0ead926..935dd3b 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -1,7 +1,5 @@ import sys -from unittest.mock import patch - from genologics.lims import Lims from genologics.entities import Artifact @@ -43,25 +41,31 @@ def __init__(self, udf): samples_mock[sample_name] = MyMock({udf_value: geslacht}) -@patch('clarity_epp.export.sample.get_samples') -def test_sample_udf_1(mock_get, capsys): - mock_get.return_value = samples_mock +def test_sample_udf_withudf(mocker, capsys): + patched_clarity_epp = mocker.patch( + 'clarity_epp.export.sample.get_samples', + return_value=samples_mock + ) sample.sample_udf("lims", sys.stdout, udf=udf_value, column_name=column_name) captured = capsys.readouterr() assert captured.out == f"Sample\t{column_name}\n{sample_name}\t{geslacht}\n" -@patch('clarity_epp.export.sample.get_samples') -def test_sample_udf_2(mock_get, capsys): - mock_get.return_value = samples_mock +def test_sample_udf_withoutudf(mocker, capsys): + patched_clarity_epp = mocker.patch( + 'clarity_epp.export.sample.get_samples', + return_value=samples_mock + ) sample.sample_udf("lims", sys.stdout, udf="udf2", column_name=column_name) captured = capsys.readouterr() assert captured.out == f"Sample\t{column_name}\n{sample_name}\tunknown\n" -@patch('clarity_epp.export.sample.get_samples') -def test_sample_udf_3(mock_get, capsys): - mock_get.return_value = None +def test_sample_udf_nosamples(mocker, capsys): + patched_clarity_epp = mocker.patch( + 'clarity_epp.export.sample.get_samples', + return_value=None + ) sample.sample_udf("lims", sys.stdout) captured = capsys.readouterr() assert captured.out == "no_sample_found\n" From 8da2059069ca63a15a630c72e9af27736fb82c9f Mon Sep 17 00:00:00 2001 From: melferink Date: Thu, 8 Feb 2024 13:32:44 +0100 Subject: [PATCH 17/24] added pytest-mock --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 0517eab..bde4499 100755 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ genologics==0.3.20 argparse==1.4.0 xmltodict==0.12.0 pytest==7.0.1 +pytest-mock==3.6.1 From cef220b68a4ebd4ad807dfb4d5153c0f28353744 Mon Sep 17 00:00:00 2001 From: melferink Date: Fri, 23 Feb 2024 10:47:31 +0100 Subject: [PATCH 18/24] refactor --- tests/test_export_utils.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index cbf5878..b645d1d 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -7,6 +7,11 @@ from clarity_epp.export import sample +class MyMock: + def __init__(self, udf): + self.udf = udf + + def test_sort_96_well_plate(): assert utils.sort_96_well_plate(['B2', 'A1', 'E1']) == ['A1', 'E1', 'B2'] @@ -40,21 +45,6 @@ def test_get_sample_sequence_index(): assert utils.get_sample_sequence_index('Dx 02B Agilent SureSelect XT HS2 UDI_v1 010 (TAGAGCTC)') == ['TAGAGCTC'] -column_name = "test_column" -sample_name = "test_sample" -udf_value = "Dx geslacht" -geslacht = "Vrouw" - - -class MyMock: - def __init__(self, udf): - self.udf = udf - - -samples_mock = {} -samples_mock[sample_name] = MyMock({udf_value: geslacht}) - - def test_sample_udf_withudf(mocker, capsys): patched_clarity_epp = mocker.patch( 'clarity_epp.export.sample.get_samples', @@ -83,3 +73,11 @@ def test_sample_udf_nosamples(mocker, capsys): sample.sample_udf("lims", sys.stdout) captured = capsys.readouterr() assert captured.out == "no_sample_found\n" + + +column_name = "test_column" +sample_name = "test_sample" +udf_value = "Dx geslacht" +geslacht = "Vrouw" +samples_mock = {} +samples_mock[sample_name] = MyMock({udf_value: geslacht}) From dd1f5fb134b3a426d5901d32e030a6ddcfb89ca3 Mon Sep 17 00:00:00 2001 From: melferink Date: Fri, 23 Feb 2024 11:09:32 +0100 Subject: [PATCH 19/24] refactor --- clarity_epp.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/clarity_epp.py b/clarity_epp.py index 2d0ff1f..88ecfc6 100755 --- a/clarity_epp.py +++ b/clarity_epp.py @@ -118,9 +118,16 @@ def export_removed_samples(args): def export_sample_udf(args): "Export sample udf table.""" clarity_epp.export.sample.sample_udf( - lims, args.output_file, args.artifact_name, args.sequencing_run, args.sequencing_run_project, args.udf, args.column_name + lims, + args.output_file, + args.artifact_name, + args.sequencing_run, + args.sequencing_run_project, + args.udf, + args.column_name ) + def export_sample_related_mip(args): """Export related MIP samples""" clarity_epp.export.sample.sample_related_mip(lims, args.process_id, args.output_file) From 2b04c8bbb528beb0a70f114756b1dffa6e30254f Mon Sep 17 00:00:00 2001 From: melferink Date: Fri, 23 Feb 2024 11:27:19 +0100 Subject: [PATCH 20/24] added explantation to test functions --- tests/test_export_utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index b645d1d..3b33874 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -46,6 +46,7 @@ def test_get_sample_sequence_index(): def test_sample_udf_withudf(mocker, capsys): + # Test output for sample with known udf in database patched_clarity_epp = mocker.patch( 'clarity_epp.export.sample.get_samples', return_value=samples_mock @@ -56,6 +57,7 @@ def test_sample_udf_withudf(mocker, capsys): def test_sample_udf_withoutudf(mocker, capsys): + # Test output for sample with no known udf in database patched_clarity_epp = mocker.patch( 'clarity_epp.export.sample.get_samples', return_value=samples_mock @@ -66,6 +68,7 @@ def test_sample_udf_withoutudf(mocker, capsys): def test_sample_udf_nosamples(mocker, capsys): + # Test output for sample not known in database patched_clarity_epp = mocker.patch( 'clarity_epp.export.sample.get_samples', return_value=None From 932cfbaeec8dee99b373cbf622fb0fa92416fabf Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 28 Feb 2024 10:20:11 +0100 Subject: [PATCH 21/24] removed sample tests --- tests/test_export_utils.py | 49 -------------------------------------- 1 file changed, 49 deletions(-) diff --git a/tests/test_export_utils.py b/tests/test_export_utils.py index 3b33874..f5c16c3 100644 --- a/tests/test_export_utils.py +++ b/tests/test_export_utils.py @@ -1,15 +1,7 @@ -import sys - from genologics.lims import Lims from genologics.entities import Artifact from clarity_epp.export import utils -from clarity_epp.export import sample - - -class MyMock: - def __init__(self, udf): - self.udf = udf def test_sort_96_well_plate(): @@ -43,44 +35,3 @@ def test_get_sample_sequence_index(): assert utils.get_sample_sequence_index('Dx 10G NEXTflex custom UDI 79 (TGAGGCGC)') == ['TGAGGCGC'] assert utils.get_sample_sequence_index('Dx 01G Agilent SureSelect XT HS2 UDI_v2 007 (GCAGGTTC)') == ['GCAGGTTC'] assert utils.get_sample_sequence_index('Dx 02B Agilent SureSelect XT HS2 UDI_v1 010 (TAGAGCTC)') == ['TAGAGCTC'] - - -def test_sample_udf_withudf(mocker, capsys): - # Test output for sample with known udf in database - patched_clarity_epp = mocker.patch( - 'clarity_epp.export.sample.get_samples', - return_value=samples_mock - ) - sample.sample_udf("lims", sys.stdout, udf=udf_value, column_name=column_name) - captured = capsys.readouterr() - assert captured.out == f"Sample\t{column_name}\n{sample_name}\t{geslacht}\n" - - -def test_sample_udf_withoutudf(mocker, capsys): - # Test output for sample with no known udf in database - patched_clarity_epp = mocker.patch( - 'clarity_epp.export.sample.get_samples', - return_value=samples_mock - ) - sample.sample_udf("lims", sys.stdout, udf="udf2", column_name=column_name) - captured = capsys.readouterr() - assert captured.out == f"Sample\t{column_name}\n{sample_name}\tunknown\n" - - -def test_sample_udf_nosamples(mocker, capsys): - # Test output for sample not known in database - patched_clarity_epp = mocker.patch( - 'clarity_epp.export.sample.get_samples', - return_value=None - ) - sample.sample_udf("lims", sys.stdout) - captured = capsys.readouterr() - assert captured.out == "no_sample_found\n" - - -column_name = "test_column" -sample_name = "test_sample" -udf_value = "Dx geslacht" -geslacht = "Vrouw" -samples_mock = {} -samples_mock[sample_name] = MyMock({udf_value: geslacht}) From d263926e4c66342dd07cbe7b18af6165cbdf017d Mon Sep 17 00:00:00 2001 From: melferink Date: Wed, 28 Feb 2024 10:21:58 +0100 Subject: [PATCH 22/24] initial commit --- tests/test_export_sample.py | 49 +++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 tests/test_export_sample.py diff --git a/tests/test_export_sample.py b/tests/test_export_sample.py new file mode 100644 index 0000000..92df0b0 --- /dev/null +++ b/tests/test_export_sample.py @@ -0,0 +1,49 @@ +import sys + +from clarity_epp.export import sample + + +class MyMock: + def __init__(self, udf): + self.udf = udf + + +def test_sample_udf_withudf(mocker, capsys): + # Test output for sample with known udf in database + patched_clarity_epp = mocker.patch( + 'clarity_epp.export.sample.get_samples', + return_value=samples_mock + ) + sample.sample_udf("lims", sys.stdout, udf=udf_value, column_name=column_name) + captured = capsys.readouterr() + assert captured.out == f"Sample\t{column_name}\n{sample_name}\t{geslacht}\n" + + +def test_sample_udf_withoutudf(mocker, capsys): + # Test output for sample with no known udf in database + patched_clarity_epp = mocker.patch( + 'clarity_epp.export.sample.get_samples', + return_value=samples_mock + ) + sample.sample_udf("lims", sys.stdout, udf="udf2", column_name=column_name) + captured = capsys.readouterr() + assert captured.out == f"Sample\t{column_name}\n{sample_name}\tunknown\n" + + +def test_sample_udf_nosamples(mocker, capsys): + # Test output for sample not known in database + patched_clarity_epp = mocker.patch( + 'clarity_epp.export.sample.get_samples', + return_value=None + ) + sample.sample_udf("lims", sys.stdout) + captured = capsys.readouterr() + assert captured.out == "no_sample_found\n" + + +column_name = "test_column" +sample_name = "test_sample" +udf_value = "Dx geslacht" +geslacht = "Vrouw" +samples_mock = {} +samples_mock[sample_name] = MyMock({udf_value: geslacht}) From 19494371c1ad7d987b6b11b236caca44d8e69568 Mon Sep 17 00:00:00 2001 From: melferink Date: Mon, 11 Mar 2024 08:56:06 +0100 Subject: [PATCH 23/24] added support non-string types. Included Dx-udf only --- clarity_epp.py | 24 ++++++++++++------------ clarity_epp/export/sample.py | 22 ++++++++++++++++------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/clarity_epp.py b/clarity_epp.py index 88ecfc6..917124c 100755 --- a/clarity_epp.py +++ b/clarity_epp.py @@ -115,9 +115,9 @@ def export_removed_samples(args): clarity_epp.export.sample.removed_samples(lims, args.output_file) -def export_sample_udf(args): - "Export sample udf table.""" - clarity_epp.export.sample.sample_udf( +def export_sample_udf_dx(args): + "Export table sample udf (Dx-udf only)""" + clarity_epp.export.sample.sample_udf_dx( lims, args.output_file, args.artifact_name, @@ -341,18 +341,18 @@ def placement_pipetting(args): ) parser_export_removed_samples.set_defaults(func=export_removed_samples) - parser_export_sample_udf = subparser_export.add_parser( - 'sample_udf', help='Export sample udf table.', parents=[output_parser] + parser_export_sample_udf_dx = subparser_export.add_parser( + 'sample_udf_dx', help='Export sample udf table (Dx-udf only).', parents=[output_parser] ) - parser_export_sample_udf_group = parser_export_sample_udf.add_mutually_exclusive_group(required=True) - parser_export_sample_udf_group.add_argument('-a', '--artifact_name', help='Artifact name') - parser_export_sample_udf_group.add_argument('-r', '--sequencing_run', help='Sequencing run name') - parser_export_sample_udf.add_argument( + parser_export_sample_udf_dx_group = parser_export_sample_udf_dx.add_mutually_exclusive_group(required=True) + parser_export_sample_udf_dx_group.add_argument('-a', '--artifact_name', help='Artifact name') + parser_export_sample_udf_dx_group.add_argument('-r', '--sequencing_run', help='Sequencing run name') + parser_export_sample_udf_dx.add_argument( '-p', '--sequencing_run_project', nargs='?', help='Sequencing run project name' ) - parser_export_sample_udf.add_argument('-u', '--udf', help='udf to query') - parser_export_sample_udf.add_argument('-c', '--column_name', help='naming of column') - parser_export_sample_udf.set_defaults(func=export_sample_udf) + parser_export_sample_udf_dx.add_argument('-u', '--udf', help='udf to query (limited to only Dx-udf)') + parser_export_sample_udf_dx.add_argument('-c', '--column_name', help='naming of column') + parser_export_sample_udf_dx.set_defaults(func=export_sample_udf_dx) parser_export_sample_related_mip = subparser_export.add_parser( 'sample_related_mip', help='Export related mip samples.', parents=[output_parser] diff --git a/clarity_epp/export/sample.py b/clarity_epp/export/sample.py index 5a61432..1d02d84 100644 --- a/clarity_epp/export/sample.py +++ b/clarity_epp/export/sample.py @@ -145,20 +145,30 @@ def get_samples(lims, artifact_name=None, sequencing_run=None, sequencing_run_pr return samples -def sample_udf(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None, udf=None, column_name=None): - """Export table with sample udf.""" +def sample_udf_dx(lims, output_file, artifact_name=None, sequencing_run=None, sequencing_run_project=None, udf=None, column_name=None): + """Export table with sample udf (Dx-udf only).""" samples = get_samples(lims, artifact_name, sequencing_run, sequencing_run_project) # Write result if samples: output_file.write(f'Sample\t{column_name}\n') for sample_name, sample in samples.items(): if udf in sample.udf: - output_file.write( - '{sample}\t{udf_value}\n'.format( - sample=sample_name, + if 'Dx' in udf: + if type (sample.udf[udf]) == str: udf_value=sample.udf[udf].split(';')[0] # select newest udf value + else: + udf_value=sample.udf[udf] + + output_file.write( + '{sample}\t{udf_value}\n'.format( + sample=sample_name, + udf_value=udf_value + ) + ) + else: + output_file.write( + f'Warning, udf is not type \'Dx\'\n' ) - ) else: output_file.write( '{sample}\t{udf_value}\n'.format( From 7c940f99d4557cbc899d73d199bc8c2791233f3b Mon Sep 17 00:00:00 2001 From: melferink Date: Mon, 11 Mar 2024 09:17:31 +0100 Subject: [PATCH 24/24] refactor sample_udf_dx, with new test for non Dx-udf --- tests/test_export_sample.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/tests/test_export_sample.py b/tests/test_export_sample.py index 92df0b0..e62fded 100644 --- a/tests/test_export_sample.py +++ b/tests/test_export_sample.py @@ -9,41 +9,51 @@ def __init__(self, udf): def test_sample_udf_withudf(mocker, capsys): - # Test output for sample with known udf in database + # Test output for sample with known Dx-udf in database + samples_mock[sample_name] = MyMock({"Dx geslacht": "Vrouw"}) patched_clarity_epp = mocker.patch( 'clarity_epp.export.sample.get_samples', return_value=samples_mock ) - sample.sample_udf("lims", sys.stdout, udf=udf_value, column_name=column_name) + sample.sample_udf_dx("lims", sys.stdout, udf="Dx geslacht", column_name=column_name) captured = capsys.readouterr() - assert captured.out == f"Sample\t{column_name}\n{sample_name}\t{geslacht}\n" + assert captured.out == f"Sample\t{column_name}\n{sample_name}\tVrouw\n" def test_sample_udf_withoutudf(mocker, capsys): # Test output for sample with no known udf in database + samples_mock[sample_name] = MyMock({"Dx geslacht": "Vrouw"}) patched_clarity_epp = mocker.patch( 'clarity_epp.export.sample.get_samples', return_value=samples_mock ) - sample.sample_udf("lims", sys.stdout, udf="udf2", column_name=column_name) + sample.sample_udf_dx("lims", sys.stdout, udf="udf2", column_name=column_name) captured = capsys.readouterr() assert captured.out == f"Sample\t{column_name}\n{sample_name}\tunknown\n" +def test_sample_udf_withoutdxudf(mocker, capsys): + # Test output for sample with known udf in database, but not Dx-udf + samples_mock[sample_name] = MyMock({"Geslacht": "Vrouw"}) + patched_clarity_epp = mocker.patch( + 'clarity_epp.export.sample.get_samples', + return_value=samples_mock + ) + sample.sample_udf_dx("lims", sys.stdout, udf="Geslacht", column_name=column_name) + captured = capsys.readouterr() + assert captured.out == f"Sample\t{column_name}\nWarning, udf is not type \'Dx\'\n" + def test_sample_udf_nosamples(mocker, capsys): # Test output for sample not known in database + samples_mock[sample_name] = MyMock({"Dx geslacht": "Vrouw"}) patched_clarity_epp = mocker.patch( 'clarity_epp.export.sample.get_samples', return_value=None ) - sample.sample_udf("lims", sys.stdout) + sample.sample_udf_dx("lims", sys.stdout) captured = capsys.readouterr() assert captured.out == "no_sample_found\n" - column_name = "test_column" sample_name = "test_sample" -udf_value = "Dx geslacht" -geslacht = "Vrouw" samples_mock = {} -samples_mock[sample_name] = MyMock({udf_value: geslacht})