source: orange-bioinformatics/_bioinformatics/obiKEGG2/entry/fields.py @ 1682:2e2c671e4300

Revision 1682:2e2c671e4300, 5.8 KB checked in by Lan Zagar <lan.zagar@…>, 23 months ago (diff)

Replaced split(\n) with splitlines (closes #1160).

Line 
1"""
2Wrapper classes for db entry fields to support pythoninc
3interface.
4 
5"""
6
7class DBField(object):
8    """ Base DBGET entry field
9    """
10    __SLOTS__ = ["text"]
11    def __init__(self, text):
12        self.text = text
13       
14    def _convert(self):
15        """ Convert the contents into python representation using
16        builtin types.
17         
18        """
19        return self.text.rstrip("\n")
20   
21   
22class DBSimpleField(DBField):
23    """ Simple field (with no subsections).
24    """
25    __SLOTS__ = ["text"]
26    # TITLE must be set in subclasses or object instances
27    TITLE = None
28    def __str__(self):
29        return self.format()
30       
31       
32    def format(self, section_indent=12, subsection_indent=0):
33        fmt = (" " * subsection_indent) + "%-" + \
34              str(section_indent - subsection_indent) + \
35              "s%s"
36        text = self._indent(self.text, section_indent)
37        text = fmt % (self.TITLE, text)
38        return text
39   
40    def _indent(self, text, section_indent=12):
41        indent_str = "\n" + " " * section_indent
42        nl_count = text.count("\n")
43        return text.replace("\n", indent_str, nl_count - 1)
44   
45   
46class DBEntryField(DBSimpleField):
47    """ ENTRY field (all entries start with this field)
48    """
49    __SLOTS__ = ["text"]
50    TITLE = "ENTRY"
51   
52   
53class DBNameField(DBSimpleField):
54    __SLOTS__ = ["text"]
55    TITLE = "NAME"
56   
57   
58class DBDefinitionField(DBSimpleField):
59    __SLOTS__ = ["text"]
60    TITLE = "DEFINITION"
61   
62   
63class DBFieldWithSubsections(DBSimpleField):
64    """ A field with subsections (for instance REFERENCE in genome)
65    """
66    __SLOTS__ = ["text", "subsections"]
67    TITLE = None
68    SUBSECTIONS = None
69   
70    def __init__(self, text, subsections=None):
71        self.text = text
72        self.subsections = subsections or []
73       
74    def format(self, section_indent=12, subsection_indent=2):
75        text = DBSimpleField.format(self, section_indent, subsection_indent=0)
76        subsections = [sub.format(section_indent, subsection_indent)\
77                       for sub in self.subsections]
78        return "".join([text] + subsections)
79   
80    def _convert(self):
81        my = DBSimpleField._convert(self)
82        subs = [(s.TITLE.lower(), s._convert()) \
83                for s in self.subsections]
84        return (my, subs)
85       
86       
87class DBTaxonomyField(DBFieldWithSubsections):
88    __SLOTS__ = ["text", "subsections"]
89    TITLE = "TAXONOMY"
90    SUBSECTIONS = ["LINEAGE"]
91   
92    @property
93    def taxid(self):
94        return DBSimpleField._convert(self).split(":")[1]
95   
96   
97class DBDataSourceField(DBSimpleField):
98    __SLOTS__ = ["text"]
99    TITLE = "DATA_SOURCE"
100
101
102class DBReference(DBFieldWithSubsections):
103    __SLOTS__ = ["text", "subsections"]
104    TITLE = "REFERENCE"
105    SUBSECTIONS = ["AUTHORS", "TITLE", "JOURNAL"]
106   
107    @property
108    def authors(self):
109        return self.subsections[0]
110       
111    @property
112    def title(self):
113        return self.subsections[1]
114   
115    @property
116    def journal(self):
117        return self.subsections[2]
118   
119   
120class DBDBLinks(DBSimpleField):
121    __SLOTS__ = ["text"]
122    TITLE = "DBLINKS"
123   
124    @property
125    def links(self):
126        return [tuple(s.split(": ", 1)) \
127                for s in self.text.splitlines()]
128       
129    def _convert(self):
130        # Some dblinks can span multiple lines but are always 'indented'
131        links = DBSimpleField._convert(self).replace("\n ", "").splitlines()
132        links = [tuple(link.split(": ", 1)) for link in links]
133        links = [(key, [v for v in values.split(" ") if v]) \
134                 for key, values in links]
135        return dict(links)
136   
137   
138class DBPathway(DBSimpleField):
139    __SLOTS__ = ["text"]
140    TITLE = "PATHWAY"
141   
142    @property
143    def pathways(self):
144        return self._convert()
145   
146    def _convert(self):
147        text = DBSimpleField._convert(self)
148        return [line.split(" ", 1)[0] for line in text.splitlines()]
149   
150   
151class DBAASeq(DBSimpleField):
152    __SLOTS__ = ["text"]
153    TITLE = "AASEQ"
154   
155    @property
156    def sequence(self):
157        return self.split("\n", 1)[1].replace("\n", "")
158   
159    @property
160    def sequence_lenght(self):
161        return int(self.text.split("\n", 1)[0])
162   
163    def _convert(self):
164        text = DBSimpleField._convert(self)
165        count, seq = text.split("\n", 1)
166        return seq.replace("\n", "")
167   
168   
169class DBNTSeq(DBSimpleField):
170    __SLOTS__ = ["text"]
171    TITLE = "NTSEQ"
172   
173    @property
174    def sequence(self):
175        return self.split("\n", 1)[1].replace("\n", "")
176   
177    @property
178    def sequence_lenght(self):
179        return int(self.text.split("\n", 1)[0])
180   
181    def _convert(self):
182        text = DBSimpleField._convert(self)
183        count, seq = text.split("\n", 1)
184        return seq.replace("\n", "")
185   
186   
187class DBPathwayMapField(DBSimpleField):
188    __SLOTS__ = ["text"]
189    TITLE = "PATHWAY_MAP"
190   
191    def kgml_url(self):
192        return "http://www.genome.jp/kegg-bin/download?entry={0}&format=kgml".format(self.pathway_id)
193   
194    @property
195    def pathway_id(self):
196        return self.text.split(" ", 1)[0]
197   
198   
199class DBGeneField(DBSimpleField):
200    __SLOTS__ = ["text"]
201    TITLE = "GENE"
202   
203    def _convert(self):
204        text = DBSimpleField._convert(self)
205        lines = text.splitlines()
206        return [line.split(" ", 1)[0] for line in lines]
207   
208class DBEnzymeField(DBSimpleField):
209    __SLOTS__ = ["text"]
210    TITLE = "ENZYME"
211   
212    def _convert(self):
213        text = DBSimpleField._convert(self)
214        lines = text.splitlines()
215        return lines
216   
217class DBCompoundField(DBSimpleField):
218    __SLOTS__ = ["text"]
219    TITLE = "COMPOUND"
220   
221    def _convert(self):
222        text = DBSimpleField._convert(self)
223        lines = text.splitlines()
224        return [line.split(" ", 1)[0] for line in lines]
225   
226   
Note: See TracBrowser for help on using the repository browser.