Inherit from MutableMapping for ResultMap.
authorDiane Trout <diane@caltech.edu>
Fri, 31 Aug 2012 19:19:42 +0000 (12:19 -0700)
committerDiane Trout <diane@caltech.edu>
Fri, 31 Aug 2012 19:26:12 +0000 (12:26 -0700)
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

htsworkflow/submission/results.py
htsworkflow/submission/test/test_condorfastq.py
htsworkflow/submission/test/test_daf.py
htsworkflow/submission/test/test_results.py

index daeb7d1fed1d65b867b57b5b9a1e3dbaf60c3013..ca6f1e92438ff9a7dd64042196545e6bf06129b6 100644 (file)
@@ -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.
index bb2b3c9995ff9a2fcf8510e9b6cf2860c71d029e..6aaf5846de8f3eb86e4f73145e487c73bc2ae914 100644 (file)
@@ -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)
index 334a71a9203e7ca5d621b634a62bfc9b5fd299a6..95dc1d9064688f4b63ca4c7b1a70866587deb9f7 100644 (file)
@@ -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)
 
index 8579c582a5ea134dee51bcfd1be8cb6963a80a79..2d8cd57c30dbc661a88733a5d1af36efd9ecd3e9 100644 (file)
@@ -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)