Skip to content

Commit

Permalink
Merge pull request #245 from jonls/sbml-celementtree
Browse files Browse the repository at this point in the history
sbml: Use cElementTree if possible
  • Loading branch information
jonls committed May 26, 2017
2 parents 9690b9e + 7db2584 commit a1f7537
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 18 deletions.
21 changes: 17 additions & 4 deletions psamm/datasource/sbml.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,20 @@

from __future__ import unicode_literals

import xml.etree.ElementTree as ET
from decimal import Decimal
from fractions import Fraction
from functools import partial
import logging
import re
import json

# Import ElementTree XML parser. The lxml etree implementation may also be
# used with SBMLReader but has compatiblity issues with SBMLWriter.
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET

from six import itervalues, iteritems, text_type, PY3

from .context import FileMark
Expand Down Expand Up @@ -640,23 +646,26 @@ def __init__(self, file, strict=False, ignore_boundary=True,
self._sbml_tag('listOfCompartments'))
for compartment in self._compartments.iterfind(
self._sbml_tag('compartment')):
filemark = FileMark(self._context, None, None)
filemark = FileMark(
self._context, self._get_sourceline(compartment), None)
entry = CompartmentEntry(self, compartment, filemark=filemark)
self._model_compartments[entry.id] = entry

# Species
self._model_species = {}
self._species = self._model.find(self._sbml_tag('listOfSpecies'))
for species in self._species.iterfind(self._sbml_tag('species')):
filemark = FileMark(self._context, None, None)
filemark = FileMark(
self._context, self._get_sourceline(species), None)
entry = SpeciesEntry(self, species, filemark=filemark)
self._model_species[entry.id] = entry

# Reactions
self._model_reactions = {}
self._reactions = self._model.find(self._sbml_tag('listOfReactions'))
for reaction in self._reactions.iterfind(self._sbml_tag('reaction')):
filemark = FileMark(self._context, None, None)
filemark = FileMark(
self._context, self._get_sourceline(reaction), None)
entry = ReactionEntry(self, reaction, filemark=filemark)
self._model_reactions[entry.id] = entry

Expand Down Expand Up @@ -700,6 +709,10 @@ def __init__(self, file, strict=False, ignore_boundary=True,

self._active_objective = self._model_objectives[active]

def _get_sourceline(self, element):
"""Get source line of element (only supported by lxml)."""
return getattr(element, 'sourceline', None)

def get_compartment(self, compartment_id):
"""Return :class:`.CompartmentEntry` corresponding to id."""
return self._model_compartments[compartment_id]
Expand Down
6 changes: 3 additions & 3 deletions psamm/tests/test_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import sys
import os
import argparse
import codecs
import shutil
import tempfile
from contextlib import contextmanager
Expand Down Expand Up @@ -103,6 +102,7 @@ class MockSolverCommand(SolverCommandMixin, Command):
"""
def run(self):
solver = self._get_solver()
print(solver)


class BaseCommandTest(object):
Expand Down Expand Up @@ -579,7 +579,7 @@ def test_command_argument_error(self):

class TestSBMLCommandMain(unittest.TestCase, BaseCommandTest):
def setUp(self):
doc = StringIO('''<?xml version="1.0" encoding="UTF-8"?>
doc = BytesIO('''<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core"
xmlns:fbc="http://www.sbml.org/sbml/level3/version1/fbc/version1"
xmlns:html="http://www.w3.org/1999/xhtml"
Expand Down Expand Up @@ -631,7 +631,7 @@ def setUp(self):
<fbc:fluxBound fbc:reaction="R_Biomass" fbc:operation="lessEqual" fbc:value="1000"/>
</fbc:listOfFluxBounds>
</model>
</sbml>''')
</sbml>'''.encode('utf-8'))

reader = sbml.SBMLReader(doc)
self._model = reader.create_model()
Expand Down
24 changes: 13 additions & 11 deletions psamm/tests/test_datasource_sbml.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,23 @@
#
# Copyright 2014-2017 Jon Lund Steffensen <jon_steffensen@uri.edu>

from __future__ import unicode_literals

import unittest

from psamm.datasource import sbml
from psamm.reaction import Reaction, Compound, Direction

from decimal import Decimal
from fractions import Fraction
from six import StringIO
from six import BytesIO


class TestSBMLDatabaseL1V2(unittest.TestCase):
"""Test parsing of a simple level 1 version 2 SBML file"""

def setUp(self):
self.doc = StringIO('''<?xml version="1.0" encoding="UTF-8"?>
self.doc = BytesIO('''<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level1"
xmlns:html="http://www.w3.org/1999/xhtml"
level="1" version="2">
Expand Down Expand Up @@ -70,7 +72,7 @@ def setUp(self):
</reaction>
</listOfReactions>
</model>
</sbml>''')
</sbml>'''.encode('utf-8'))

def test_model_name(self):
reader = sbml.SBMLReader(self.doc)
Expand Down Expand Up @@ -169,7 +171,7 @@ class TestSBMLDatabaseL2V5(unittest.TestCase):
"""Test parsing of a simple level 2 version 5 SBML file"""

def setUp(self):
self.doc = StringIO('''<?xml version="1.0" encoding="UTF-8"?>
self.doc = BytesIO('''<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level2/version5"
xmlns:html="http://www.w3.org/1999/xhtml"
level="2" version="5">
Expand Down Expand Up @@ -209,7 +211,7 @@ def setUp(self):
</reaction>
</listOfReactions>
</model>
</sbml>''')
</sbml>'''.encode('utf-8'))

def test_model_name(self):
reader = sbml.SBMLReader(self.doc)
Expand Down Expand Up @@ -309,7 +311,7 @@ class TestSBMLDatabaseL3V1(unittest.TestCase):
"""Test parsing of a simple level 3 version 1 SBML file"""

def setUp(self):
self.doc = StringIO('''<?xml version="1.0" encoding="UTF-8"?>
self.doc = BytesIO('''<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core"
xmlns:html="http://www.w3.org/1999/xhtml"
level="3" version="1">
Expand Down Expand Up @@ -349,7 +351,7 @@ def setUp(self):
</reaction>
</listOfReactions>
</model>
</sbml>''')
</sbml>'''.encode('utf-8'))

def test_model_name(self):
reader = sbml.SBMLReader(self.doc)
Expand Down Expand Up @@ -446,7 +448,7 @@ class TestSBMLDatabaseL3V1WithFBCV1(unittest.TestCase):
"""Test parsing of a level 3 version 1 SBML file with FBC version 1"""

def setUp(self):
self.doc = StringIO('''<?xml version="1.0" encoding="UTF-8"?>
self.doc = BytesIO('''<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core"
xmlns:fbc="http://www.sbml.org/sbml/level3/version1/fbc/version1"
xmlns:html="http://www.w3.org/1999/xhtml"
Expand Down Expand Up @@ -498,7 +500,7 @@ def setUp(self):
<fbc:fluxBound fbc:reaction="R_Biomass" fbc:operation="lessEqual" fbc:value="1000"/>
</fbc:listOfFluxBounds>
</model>
</sbml>''')
</sbml>'''.encode('utf-8'))

def test_model_name(self):
reader = sbml.SBMLReader(self.doc)
Expand Down Expand Up @@ -616,7 +618,7 @@ class TestSBMLDatabaseL3V1WithFBCV2(unittest.TestCase):
"""Test parsing of a level 3 version 1 SBML file with FBC version 2"""

def setUp(self):
self.doc = StringIO('''<?xml version="1.0" encoding="UTF-8"?>
self.doc = BytesIO('''<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core"
xmlns:fbc="http://www.sbml.org/sbml/level3/version1/fbc/version2"
xmlns:html="http://www.w3.org/1999/xhtml"
Expand Down Expand Up @@ -667,7 +669,7 @@ def setUp(self):
</fbc:objective>
</fbc:listOfObjectives>
</model>
</sbml>''')
</sbml>'''.encode('utf-8'))

def test_model_name(self):
reader = sbml.SBMLReader(self.doc)
Expand Down

0 comments on commit a1f7537

Please sign in to comment.