source: orange-bioinformatics/_bioinformatics/obiKEGG/brite.py @ 1734:91d14dd2cf0e

Revision 1734:91d14dd2cf0e, 2.4 KB checked in by Ales Erjavec <ales.erjavec@…>, 14 months ago (diff)

obiKEGG code style fixes.

Line 
1"""
2KEGG Brite
3
4"""
5from __future__ import absolute_import
6
7import os
8import re
9import urllib2
10
11from Orange.utils import deprecated_attribute
12
13from . import conf
14
15
16class BriteEntry(object):
17    _search_re = {
18        "ids": re.compile('(?P<ids>\[.*:.*\])'),
19        "title": re.compile(r'(<[Bb]>)?(?P<title>\b[a-zA-Z0-9_/\s,;:.+=\-\[\]{}\(\)]+?)(?(1)</[Bb]>)$'),
20        "links": re.compile('(?P<links><a href=".+?">.*?</a>)')
21    }
22
23    def __init__(self, line):
24        self.entries = []
25        self.line = line[1:].strip()
26        for name, re in self._search_re.items():
27            search = re.search(self.line)
28            setattr(self, name, search.group(name) if search else None)
29
30    def __iter__(self):
31        return iter(self.entries)
32
33    entrys = deprecated_attribute("entrys", "entries")
34
35
36class Brite(BriteEntry):
37    VERSION = "v1.0"
38    BRITE_URL_FORMAT = "http://www.genome.jp/kegg-bin/download_htext?htext={brite_id}.keg&format=htext&filedir="
39
40    def __init__(self, brite_id, local_cache=None):
41        super(Brite, self).__init__("")
42        self.brite_id = id
43        if local_cache is None:
44            local_cache = conf.params["cache.path"]
45        self.local_cache = local_cache
46
47        self.load(brite_id)
48
49    def _get_brite(self, brite_id):
50        url = self.BRITE_URL_FORMAT.format(brite_id=brite_id)
51        local_filename = os.path.join(self.local_cache, brite_id + ".keg")
52        if not os.path.exists(local_filename):
53            brite = urllib2.urlopen(url).read()
54            with open(local_filename, "wb") as f:
55                f.write(brite)
56
57        return open(local_filename, "rb")
58
59    def load(self, brite_id):
60        lines = self._get_brite(brite_id).read().split("\n!\n")[1].splitlines()
61
62        # TODO: Implement a proper parser
63
64        def collect(lines, depth, collection):
65            while lines:
66                line = lines[0]
67                if line.startswith("#"):
68                    lines.pop(0)
69                elif line.startswith(depth) and len(line.strip()) > 1:
70                    collection.append(BriteEntry(lines.pop(0)))
71                elif line[0] > depth:
72                    collect(lines, line[0], collection[-1].entries)
73                elif line[0] < depth:
74                    return
75                else:
76                    lines.pop(0)
77
78        collect([line for line in lines
79                 if not line.startswith("#") and len(line) > 1], "A",
80                self.entries)
Note: See TracBrowser for help on using the repository browser.