From 7cf9fd67ad22d16a2e5c5209df35b4dd98be6e15 Mon Sep 17 00:00:00 2001 From: Jose Navas Date: Fri, 1 May 2015 16:27:53 -0700 Subject: [PATCH 1/4] Adding check_restrictions functionality and tests --- .../base_metadata_template.py | 21 +++++++++++++++++++ .../test/test_prep_template.py | 17 ++++++++++++++- .../test/test_sample_template.py | 11 ++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/qiita_db/metadata_template/base_metadata_template.py b/qiita_db/metadata_template/base_metadata_template.py index 61beccd7f..e3eb4009e 100644 --- a/qiita_db/metadata_template/base_metadata_template.py +++ b/qiita_db/metadata_template/base_metadata_template.py @@ -1157,3 +1157,24 @@ def update_category(self, category, samples_and_values): % (category, value_str, value_types_str, column_type)) raise e + + def check_restrictions(self, restrictions): + """Checks if the template fulfills the restrictions + + Parameters + ---------- + restrictions : list of Restriction + The restrictions to test if the template fulfills + + Returns + ------- + set of str + The missing columns + """ + def _col_iter(): + for restriction in restrictions: + for col in restriction.columns: + yield col + categories = self.categories() + missing = {col for col in _col_iter() if col not in categories} + return missing diff --git a/qiita_db/metadata_template/test/test_prep_template.py b/qiita_db/metadata_template/test/test_prep_template.py index 72cc8b5dc..49a29087c 100644 --- a/qiita_db/metadata_template/test/test_prep_template.py +++ b/qiita_db/metadata_template/test/test_prep_template.py @@ -32,7 +32,8 @@ get_count) from qiita_db.metadata_template.prep_template import PrepTemplate, PrepSample from qiita_db.metadata_template.sample_template import SampleTemplate, Sample -from qiita_db.metadata_template.constants import PREP_TEMPLATE_COLUMNS +from qiita_db.metadata_template.constants import ( + PREP_TEMPLATE_COLUMNS, PREP_TEMPLATE_COLUMNS_TARGET_GENE) class BaseTestPrepSample(TestCase): @@ -1299,6 +1300,20 @@ def test_qiime_map_fp(self): '1_prep_1_qiime_19700101-000000.txt') self.assertEqual(pt.qiime_map_fp, exp) + def test_check_restrictions(self): + obs = self.tester.check_restrictions([PREP_TEMPLATE_COLUMNS['EBI']]) + self.assertEqual(obs, set()) + + del self.metadata['primer'] + pt = npt.assert_warns(QiitaDBWarning, PrepTemplate.create, + self.metadata, self.new_raw_data, + self.test_study, self.data_type) + + obs = pt.check_restrictions( + [PREP_TEMPLATE_COLUMNS['EBI'], + PREP_TEMPLATE_COLUMNS_TARGET_GENE['demultiplex']]) + self.assertEqual(obs, {'primer'}) + EXP_PREP_TEMPLATE = ( 'sample_name\tbarcode\tcenter_name\tcenter_project_name\t' diff --git a/qiita_db/metadata_template/test/test_sample_template.py b/qiita_db/metadata_template/test/test_sample_template.py index 706980037..6d91cc1dd 100644 --- a/qiita_db/metadata_template/test/test_sample_template.py +++ b/qiita_db/metadata_template/test/test_sample_template.py @@ -7,6 +7,7 @@ # ----------------------------------------------------------------------------- from future.builtins import zip +from future.utils import viewvalues from unittest import TestCase, main from datetime import datetime from tempfile import mkstemp @@ -1955,6 +1956,16 @@ def test_to_dataframe(self): 'anonymized_name', 'tot_org_carb', 'description_duplicate', 'env_feature'}) + def test_check_restrictions(self): + obs = self.tester.check_restrictions([SAMPLE_TEMPLATE_COLUMNS['EBI']]) + self.assertEqual(obs, set()) + + del self.metadata['collection_timestamp'] + st = npt.assert_warns(QiitaDBWarning, SampleTemplate.create, + self.metadata, self.new_study) + obs = st.check_restrictions([SAMPLE_TEMPLATE_COLUMNS['EBI']]) + self.assertEqual(obs, {'collection_timestamp'}) + EXP_SAMPLE_TEMPLATE = ( "sample_name\tcollection_timestamp\tdescription\tdna_extracted" "\thost_subject_id\tint_column\tlatitude\tlongitude" From 7c9089e166fe8344a753b8b61a229614d18788d9 Mon Sep 17 00:00:00 2001 From: Jose Navas Date: Fri, 1 May 2015 19:17:02 -0700 Subject: [PATCH 2/4] pep8ing... --- qiita_db/metadata_template/test/test_sample_template.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qiita_db/metadata_template/test/test_sample_template.py b/qiita_db/metadata_template/test/test_sample_template.py index 6d91cc1dd..984758bab 100644 --- a/qiita_db/metadata_template/test/test_sample_template.py +++ b/qiita_db/metadata_template/test/test_sample_template.py @@ -7,7 +7,6 @@ # ----------------------------------------------------------------------------- from future.builtins import zip -from future.utils import viewvalues from unittest import TestCase, main from datetime import datetime from tempfile import mkstemp From 55944f226c29423df90173cbd1619bb08096ab5d Mon Sep 17 00:00:00 2001 From: Jose Navas Date: Fri, 1 May 2015 19:26:26 -0700 Subject: [PATCH 3/4] Using set operations --- qiita_db/metadata_template/base_metadata_template.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/qiita_db/metadata_template/base_metadata_template.py b/qiita_db/metadata_template/base_metadata_template.py index e3eb4009e..b174ad793 100644 --- a/qiita_db/metadata_template/base_metadata_template.py +++ b/qiita_db/metadata_template/base_metadata_template.py @@ -1175,6 +1175,5 @@ def _col_iter(): for restriction in restrictions: for col in restriction.columns: yield col - categories = self.categories() - missing = {col for col in _col_iter() if col not in categories} - return missing + + return set(_col_iter()).difference(self.categories()) From 20eebdbb56f24bd7bf43b75c7c08cf792b0adbb5 Mon Sep 17 00:00:00 2001 From: Jose Navas Date: Mon, 4 May 2015 14:50:00 -0700 Subject: [PATCH 4/4] Addressing @wasade's comment --- qiita_db/metadata_template/base_metadata_template.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/qiita_db/metadata_template/base_metadata_template.py b/qiita_db/metadata_template/base_metadata_template.py index b174ad793..b02c8b22f 100644 --- a/qiita_db/metadata_template/base_metadata_template.py +++ b/qiita_db/metadata_template/base_metadata_template.py @@ -1171,9 +1171,7 @@ def check_restrictions(self, restrictions): set of str The missing columns """ - def _col_iter(): - for restriction in restrictions: - for col in restriction.columns: - yield col + cols = {col for restriction in restrictions + for col in restriction.columns} - return set(_col_iter()).difference(self.categories()) + return cols.difference(self.categories())