Skip to content

Commit 23f9c85

Browse files
author
James Casbon
committed
store multiple metadata values with the same key, closes jamescasbon#52
1 parent 87d9ad6 commit 23f9c85

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

vcf/parser.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
'AHAP':'Integer'
4444
}
4545

46+
# Spec is a bit weak on which metadata lines are singular, like fileformat
47+
# and which can have repeats, like contig
48+
SINGULAR_METADATA = ['fileformat', 'fileDate', 'reference']
49+
4650
# Conversion between value in file and Python value
4751
field_counts = {
4852
'.': None, # Unknown number of values
@@ -750,7 +754,12 @@ def _parse_metainfo(self):
750754

751755
else:
752756
key, val = parser.read_meta(line.strip())
753-
self.metadata[key] = val
757+
if key in SINGULAR_METADATA:
758+
self.metadata[key] = val
759+
else:
760+
if key not in self.metadata:
761+
self.metadata[key] = []
762+
self.metadata[key].append(val)
754763

755764
line = self.reader.next()
756765

@@ -1010,8 +1019,11 @@ def __init__(self, stream, template):
10101019
two = '##{key}=<ID={0},Description="{1}">\n'
10111020
four = '##{key}=<ID={0},Number={num},Type={2},Description="{3}">\n'
10121021
_num = self._fix_field_count
1013-
for line in template.metadata.iteritems():
1014-
stream.write('##{0}={1}\n'.format(*line))
1022+
for (key, vals) in template.metadata.iteritems():
1023+
if key in SINGULAR_METADATA:
1024+
vals = [vals]
1025+
for val in vals:
1026+
stream.write('##{0}={1}\n'.format(key, val))
10151027
for line in template.infos.itervalues():
10161028
stream.write(four.format(key="INFO", *line, num=_num(line.num)))
10171029
for line in template.formats.itervalues():

vcf/test/test_vcf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ def test_vcf_4_1(self):
5050
# contigs were added in vcf4.1
5151
# probably need to add a reader.contigs attribute
5252
assert 'contig' in reader.metadata
53-
assert 'ID' in reader.metadata['contig']
54-
assert reader.metadata['contig']['ID'] == '20'
53+
assert 'ID' in reader.metadata['contig'][0]
54+
assert reader.metadata['contig'][0]['ID'] == '20'
5555

5656
# test we can walk the file at least
5757
for r in reader:

0 commit comments

Comments
 (0)