From: Diane Trout Date: Fri, 31 Aug 2012 19:19:42 +0000 (-0700) Subject: Inherit from MutableMapping for ResultMap. X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=htsworkflow.git;a=commitdiff_plain;h=122f85fc2dc1fb9fd7c8cfbe9b25964af9251a1a Inherit from MutableMapping for ResultMap. This gets me automatic methods. I did it because my for x in resultmap wasn't working correctly. It was using a list key (0) instead of a map key (library id) and tossing a key error. Also instead of using ResultMap.add_result(key, destination) I can do ResultMap[key] = destination --- diff --git a/htsworkflow/submission/results.py b/htsworkflow/submission/results.py index daeb7d1..ca6f1e9 100644 --- a/htsworkflow/submission/results.py +++ b/htsworkflow/submission/results.py @@ -1,5 +1,6 @@ """Help collect and process results for submission """ +from collections import MutableMapping import os import logging @@ -7,25 +8,34 @@ from collections import namedtuple LOGGER = logging.getLogger(__name__) -class ResultMap(object): +class ResultMap(MutableMapping): """Store list of results """ def __init__(self): self.results_order = [] self.results = {} - def keys(self): - return self.results_order + def __iter__(self): + for item in self.results_order: + yield item - def values(self): - return ( self.results[r] for r in self.results_order ) + def __len__(self): + l = len(self.results) + assert l == len(self.results_order) + return l - def items(self): - return ( (r, self.results[r]) for r in self.results_order ) + def __setitem__(self, key, value): + self.results_order.append(key) + self.results[key] = value def __getitem__(self, key): return self.results[key] + def __delitem__(self, key): + del self.results[key] + i = self.results_order.index(key) + del self.results_order[i] + def add_results_from_file(self, filename): pathname = os.path.abspath(filename) basepath, name = os.path.split(pathname) @@ -33,11 +43,7 @@ class ResultMap(object): for lib_id, lib_path in results: if not os.path.isabs(lib_path): lib_path = os.path.join(basepath, lib_path) - self.add_result(lib_id, lib_path) - - def add_result(self, lib_id, lib_path): - self.results_order.append(lib_id) - self.results[lib_id] = lib_path + self[lib_id] = lib_path def make_tree_from(self, source_path, destpath = None): """Create a tree using data files from source path. diff --git a/htsworkflow/submission/test/test_condorfastq.py b/htsworkflow/submission/test/test_condorfastq.py index bb2b3c9..6aaf584 100644 --- a/htsworkflow/submission/test/test_condorfastq.py +++ b/htsworkflow/submission/test/test_condorfastq.py @@ -173,7 +173,7 @@ class TestCondorFastq(unittest.TestCase): os.mkdir(self.subdir) self.result_map = ResultMap() - self.result_map.add_result('11154', self.subname) + self.result_map['11154'] = self.subname def tearDown(self): shutil.rmtree(self.tempdir) diff --git a/htsworkflow/submission/test/test_daf.py b/htsworkflow/submission/test/test_daf.py index 334a71a..95dc1d9 100644 --- a/htsworkflow/submission/test/test_daf.py +++ b/htsworkflow/submission/test/test_daf.py @@ -301,7 +301,7 @@ thisView:FastqRd1 dafTerm:filename_re ".*\\\\.fastq" ; result_map = results.ResultMap() result_dir = os.path.join(self.sourcedir, test_results.S1_NAME) - result_map.add_result('1000', result_dir) + result_map['1000'] = result_dir submission.link_daf(result_map) diff --git a/htsworkflow/submission/test/test_results.py b/htsworkflow/submission/test/test_results.py index 8579c58..2d8cd57 100644 --- a/htsworkflow/submission/test/test_results.py +++ b/htsworkflow/submission/test/test_results.py @@ -48,14 +48,13 @@ class TestResultMap(unittest.TestCase): def tearDown(self): shutil.rmtree(self.tempdir) - def test_dict_like(self): """Make sure the result map works like an ordered dictionary """ results = ResultMap() - results.add_result('1000', 'dir1000') - results.add_result('2000', 'dir2000') - results.add_result('1500', 'dir1500') + results['1000'] = 'dir1000' + results['2000'] = 'dir2000' + results['1500'] = 'dir1500' self.failUnlessEqual(results.keys(), ['1000', '2000', '1500']) self.failUnlessEqual(list(results.values()), @@ -69,10 +68,15 @@ class TestResultMap(unittest.TestCase): self.failUnlessEqual(results['1500'], 'dir1500') self.failUnlessEqual(results['2000'], 'dir2000') + self.assertTrue(u'2000' in results) + self.assertTrue('2000' in results) + self.assertFalse(u'77777' in results) + self.assertFalse('77777' in results) + def test_make_from(self): results = ResultMap() - results.add_result('1000', S1_NAME) - results.add_result('2000', S2_NAME) + results['1000'] = S1_NAME + results['2000'] = S2_NAME results.make_tree_from(self.sourcedir, self.resultdir)