Skip to content

Commit

Permalink
Merge pull request #620 from pysam-developers/AH-add_alignmentfilehea…
Browse files Browse the repository at this point in the history
…der_dict_methods

{AH} add backwards compatibility functions for AlignmentHeader, fixes…
  • Loading branch information
AndreasHeger authored Feb 9, 2018
2 parents d84ba01 + b7ce5e6 commit af6ff23
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
29 changes: 29 additions & 0 deletions pysam/libcalignmentfile.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,35 @@ cdef class AlignmentHeader(object):
text += "\n" + self._build_sequence_section()
return text

# dictionary access methods, for backwards compatibility.
def __setitem__(self, key, value):
raise TypeError("AlignmentHeader does not support item assignment (use header.to_dict()")

def __getitem__(self, key):
return self.to_dict().__getitem__(key)

def items(self):
return self.to_dict().items()

# PY2 compatibility
def iteritems(self):
return self.to_dict().items()

def keys(self):
return self.to_dict().keys()

def values(self):
return self.to_dict().values()

def get(self, *args):
return self.to_dict().get(*args)

def __len__(self):
return self.to_dict().__len__()

def __contains__(self, key):
return self.to_dict().__contains__(key)


cdef class AlignmentFile(HTSFile):
"""AlignmentFile(filepath_or_object, mode=None, template=None,
Expand Down
31 changes: 31 additions & 0 deletions tests/AlignmentFileHeader_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,37 @@ def test_name_mapping(self):
self.assertEqual(self.samfile.gettid("chr?"), -1)
self.assertRaises(ValueError, self.samfile.getrname, 2)

def test_dictionary_access_works(self):
for key in self.header.keys():
self.compare_headers({key: self.header[key]},
{key: self.samfile.header[key]})

def test_dictionary_setting_raises_error(self):
self.assertRaises(TypeError,
self.samfile.header.__setitem__,
"CO",
["This is a final comment"])

def test_dictionary_len_works(self):
self.assertEqual(len(self.header), len(self.samfile.header))

def test_dictionary_keys_works(self):
# sort for py2.7
self.assertEqual(sorted(self.header.keys()),
sorted(self.samfile.header.keys()))

def test_dictionary_values_works(self):
self.assertEqual(len(self.header.values()), len(self.samfile.header.values()))

def test_dictionary_get_works(self):
self.assertEqual(self.header.get("HD"), {'VN': '1.0'})
self.assertEqual(self.header.get("UK", "xyz"), "xyz")
self.assertEqual(self.header.get("UK"), None)

def test_dictionary_contains_works(self):
self.assertTrue("HD" in self.header)
self.assertFalse("UK" in self.header)

def tearDown(self):
self.samfile.close()

Expand Down

0 comments on commit af6ff23

Please sign in to comment.