File: test_add_metadata.py

package info (click to toggle)
python-biom-format 2.1.7%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 51,820 kB
  • sloc: python: 12,757; makefile: 155; sh: 79
file content (134 lines) | stat: -rw-r--r-- 6,346 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python

# -----------------------------------------------------------------------------
# Copyright (c) 2011-2017, The BIOM Format Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
# -----------------------------------------------------------------------------

import tempfile
from unittest import TestCase, main

import biom
from biom.cli.metadata_adder import _add_metadata


class TestAddMetadata(TestCase):

    def setUp(self):
        """Set up data for use in unit tests."""
        self.cmd = _add_metadata
        with tempfile.NamedTemporaryFile('w') as fh:
            fh.write(biom1)
            fh.flush()
            self.biom_table1 = biom.load_table(fh.name)
        self.sample_md_lines1 = sample_md1.split('\n')
        self.obs_md_lines1 = obs_md1.split('\n')

    def test_add_sample_metadata_no_casting(self):
        """Correctly adds sample metadata without casting it."""
        # Add a subset of sample metadata to a table that doesn't have any
        # sample metadata to begin with. Don't perform any casting.
        obs = self.cmd(table=self.biom_table1,
                       sample_metadata=self.sample_md_lines1)

        self.assertEqual(obs.metadata()[obs.index('f4', 'sample')],
                         {'bar': '0.23', 'foo': '9', 'baz': 'abc;123'})
        self.assertEqual(obs.metadata()[obs.index('not16S.1', 'sample')],
                         {'bar': '-4.2', 'foo': '0', 'baz': '123;abc'})
        self.assertEqual(obs.metadata()[obs.index('f2', 'sample')], {})

    def test_add_sample_metadata_with_casting(self):
        """Correctly adds sample metadata with casting."""
        obs = self.cmd(table=self.biom_table1,
                       sample_metadata=self.sample_md_lines1,
                       sc_separated=['baz'], int_fields=['foo'],
                       float_fields=['bar'])

        self.assertEqual(obs.metadata()[obs.index('f4', 'sample')],
                         {'bar': 0.23, 'foo': 9, 'baz': ['abc', '123']})
        self.assertEqual(obs.metadata()[obs.index('not16S.1', 'sample')],
                         {'bar': -4.2, 'foo': 0, 'baz': ['123', 'abc']})
        self.assertEqual(obs.metadata()[obs.index('f2', 'sample')], {})

    def test_add_observation_metadata_no_casting(self):
        """Correctly adds observation metadata without casting it."""
        # Add observation metadata to a table that already has observation
        # metadata. Some observations won't be modified, and metadata for
        # observations that aren't in the table are included. Don't perform any
        # casting.
        obs = self.cmd(table=self.biom_table1,
                       observation_metadata=self.obs_md_lines1)

        metadata = obs.metadata(axis='observation')
        self.assertEqual(
            metadata[obs.index('None7', 'observation')],
            {'foo': '6', 'taxonomy': 'abc;123|def;456'})
        self.assertEqual(
            metadata[obs.index('879972', 'observation')],
            {'foo': '3', 'taxonomy': '123;abc|456;def'})
        self.assertEqual(
            metadata[obs.index('None8', 'observation')],
            {'taxonomy': ['k__Bacteria']})

    def test_add_observation_metadata_with_casting(self):
        """Correctly adds observation metadata with casting."""
        obs = self.cmd(table=self.biom_table1,
                       observation_metadata=self.obs_md_lines1,
                       sc_pipe_separated=['taxonomy'], int_fields=['foo'])

        metadata = obs.metadata(axis='observation')
        self.assertEqual(
            metadata[obs.index('None7', 'observation')],
            {'foo': 6, 'taxonomy': [['abc', '123'], ['def', '456']]})
        self.assertEqual(
            metadata[obs.index('879972', 'observation')],
            {'foo': 3, 'taxonomy': [['123', 'abc'], ['456', 'def']]})
        self.assertEqual(
            metadata[obs.index('None8', 'observation')],
            {'taxonomy': ['k__Bacteria']})


biom1 = ('{"id": "None","format": "Biological Observation Matrix 1.0.0","form'
         'at_url": "http://biom-format.org","type": "OTU table","generated_by'
         '": "QIIME 1.6.0-dev","date": "2013-02-09T09:30:11.550590","matrix_t'
         'ype": "sparse","matrix_element_type": "int","shape": [14, 9],"data"'
         ': [[0,0,20],[0,1,18],[0,2,18],[0,3,22],[0,4,4],[1,4,1],[2,0,1],[2,4'
         ',1],[2,5,1],[3,6,1],[4,4,1],[5,7,20],[6,4,1],[7,4,1],[7,5,1],[8,4,1'
         '],[8,6,2],[8,8,3],[9,7,2],[10,5,1],[11,4,9],[11,5,20],[11,6,1],[11,'
         '8,4],[12,4,3],[12,6,19],[12,8,15],[13,0,1],[13,1,4],[13,2,4]],"rows'
         '": [{"id": "295053", "metadata": {"taxonomy": ["k__Bacteria"]}},{"i'
         'd": "42684", "metadata": {"taxonomy": ["k__Bacteria", "p__Proteobac'
         'teria"]}},{"id": "None11", "metadata": {"taxonomy": ["Unclassified"'
         ']}},{"id": "None10", "metadata": {"taxonomy": ["Unclassified"]}},{"'
         'id": "None7", "metadata": {"taxonomy": ["Unclassified"]}},{"id": "N'
         'one6", "metadata": {"taxonomy": ["Unclassified"]}},{"id": "None5", '
         '"metadata": {"taxonomy": ["k__Bacteria"]}},{"id": "None4", "metadat'
         'a": {"taxonomy": ["Unclassified"]}},{"id": "None3", "metadata": {"t'
         'axonomy": ["k__Bacteria"]}},{"id": "None2", "metadata": {"taxonomy"'
         ': ["k__Bacteria"]}},{"id": "None1", "metadata": {"taxonomy": ["Uncl'
         'assified"]}},{"id": "879972", "metadata": {"taxonomy": ["k__Bacteri'
         'a"]}},{"id": "None9", "metadata": {"taxonomy": ["Unclassified"]}},{'
         '"id": "None8", "metadata": {"taxonomy": ["k__Bacteria"]}}],"columns'
         '": [{"id": "f2", "metadata": null},{"id": "f1", "metadata": null},{'
         '"id": "f3", "metadata": null},{"id": "f4", "metadata": null},{"id":'
         ' "p2", "metadata": null},{"id": "p1", "metadata": null},{"id": "t1"'
         ', "metadata": null},{"id": "not16S.1", "metadata": null},{"id": "t2'
         '", "metadata": null}]}')

sample_md1 = """#SampleID\tfoo\tbar\tbaz
f4\t9\t0.23\tabc;123
not16S.1\t0\t-4.2\t123;abc
"""

obs_md1 = """#OTUID\tfoo\ttaxonomy
None7\t6\tabc;123|def;456
best-observation\t8\tghi;789|jkl;101112
879972\t3\t123;abc|456;def
"""


if __name__ == "__main__":
    main()