Skip to content

Commit 6a93f10

Browse files
committed
Refactor code to improve compatibility and maintainability:
- Update CI configuration to support Python 3.8-3.12 and actions versions. - Replace deprecated `imp` module with modern imports in analyzeSBML.py and libsbml2bngl.py. - Introduce utility functions `get_size` and `get_item` for better handling of object sizes and indexing. - Update SBML2BNGL class to utilize new utility functions for size retrieval. - Enhance error handling in tests to provide clearer output on exceptions.
1 parent 46aeffa commit 6a93f10

13 files changed

Lines changed: 124 additions & 92 deletions

File tree

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ jobs:
2121
fail-fast: false
2222
matrix:
2323
os: [ubuntu-latest, windows-latest, macos-latest]
24-
python-version: [3.7, 3.8]
24+
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
2525
steps:
26-
- uses: actions/checkout@v2
26+
- uses: actions/checkout@v4
2727
with:
2828
fetch-depth: 0
2929
- name: Set up Python ${{ matrix.python-version }}
30-
uses: actions/setup-python@v2
30+
uses: actions/setup-python@v5
3131
with:
3232
python-version: ${{ matrix.python-version }}
3333
- name: Cache pip
34-
uses: actions/cache@v2
34+
uses: actions/cache@v4
3535
with:
3636
path: ~/.cache/pip
3737
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-dev.txt') }}

bionetgen/atomizer/atomizer/analyzeSBML.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
"""
77

88
import enum
9-
import imp
109
from pyparsing import Word, Suppress, Optional, alphanums, Group, ZeroOrMore
1110
import numpy as np
1211
import json

bionetgen/atomizer/libsbml2bngl.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
#!/usr/bin/env python
99
from collections import OrderedDict
10-
from telnetlib import IP
1110
import time
1211
import libsbml
1312
import bionetgen.atomizer.writer.bnglWriter as writer

bionetgen/atomizer/sbml2bngl.py

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from collections import Counter
1313
from collections import defaultdict
1414
import math as pymath
15-
from bionetgen.atomizer.utils.util import logMess, TranslationException
15+
from bionetgen.atomizer.utils.util import logMess, TranslationException, get_size, get_item
1616
import libsbml
1717
from bionetgen.atomizer.bngModel import bngModel
1818

@@ -220,7 +220,7 @@ def extractModelAnnotation(self):
220220
annotation = self.model.getAnnotation()
221221
lista = libsbml.CVTermList()
222222
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotation, lista)
223-
for idx in range(lista.getSize()):
223+
for idx in range(get_size(lista)):
224224
# biol,qual = lista.get(idx).getBiologicalQualifierType(), lista.get(idx).getModelQualifierType()
225225
qualifierType = lista.get(idx).getQualifierType()
226226
qualifierDescription = (
@@ -230,8 +230,8 @@ def extractModelAnnotation(self):
230230
)
231231
if qualifierDescription not in metaInformation:
232232
metaInformation[qualifierDescription] = set([])
233-
for idx2 in range(0, lista.get(idx).getResources().getLength()):
234-
resource = lista.get(idx).getResources().getValue(idx2)
233+
for idx2 in range(0, get_size(get_item(lista, idx).getResources())):
234+
resource = get_item(lista, idx).getResources().getValue(idx2)
235235
metaInformation[qualifierDescription].add(resource)
236236
return metaInformation
237237

@@ -338,7 +338,7 @@ def getRawSpecies(self, species, parameters=[], logEntries=True):
338338
# by compartment
339339
if logEntries and standardizedName != "0":
340340
if standardizedName in self.speciesMemory:
341-
if len(list(self.model.getListOfCompartments())) == 1:
341+
if get_size(self.model.getListOfCompartments()) == 1:
342342
standardizedName += "_" + species.getId()
343343
else:
344344
# we can differentiate by compartment tag, no need to attach it to the name
@@ -649,23 +649,9 @@ def find_all_symbols(self, math, reactionID):
649649
)
650650
l = math.getListOfNodes()
651651
replace_dict = {}
652-
653-
# libSBML versions differ in how list-like objects expose size/length
654-
if hasattr(l, "getSize"):
655-
size = l.getSize()
656-
elif hasattr(l, "size"):
657-
size = l.size()
658-
else:
659-
try:
660-
size = len(l)
661-
except Exception:
662-
size = 0
663-
652+
size = get_size(l)
664653
for inode in range(size):
665-
if hasattr(l, "get"):
666-
node = l.get(inode)
667-
else:
668-
node = l[inode]
654+
node = get_item(l, inode)
669655
# Sympy doesn't like "def" in our string
670656
name = node.getName()
671657
if name == "def":
@@ -1293,9 +1279,9 @@ def __getRawRules(
12931279
for compartment in (self.model.getListOfCompartments()):
12941280
if compartment.getId() not in compartmentList:
12951281
if len(rReactant) != 2:
1296-
rateL = '{0} * {1}'.format(rateL,compartment.getSize())
1282+
rateL = '{0} * {1}'.format(rateL, get_size(compartment))
12971283
if len(rProduct) != 2:
1298-
rateR = '{0} * {1}'.format(rateR,compartment.getSize())
1284+
rateR = '{0} * {1}'.format(rateR,get_size(compartment))
12991285
"""
13001286
return {
13011287
"reactants": reactant,
@@ -1621,7 +1607,7 @@ def __getRawCompartments(self, compartment):
16211607
"""
16221608
idid = compartment.getId()
16231609
name = compartment.getName()
1624-
size = compartment.getSize()
1610+
size = get_size(compartment)
16251611
# volume messes up the reactions
16261612
# size = 1.0
16271613
dimensions = compartment.getSpatialDimensions()
@@ -2871,7 +2857,7 @@ def check_noCompartment(self, parameters=[]):
28712857
self.bngModel.noCompartment = True
28722858
return
28732859
for compartment in self.model.getListOfCompartments():
2874-
self.compartmentDict[compartment.getId()] = compartment.getSize()
2860+
self.compartmentDict[compartment.getId()] = get_size(compartment)
28752861
self.noCompartment = False
28762862
self.bngModel.noCompartment = False
28772863
# Get all rawSpecies
@@ -2945,7 +2931,7 @@ def default_to_regular(d):
29452931
speciesAnnotationInfo = default_to_regular(self.getFullAnnotation())
29462932
annotationInfo = {"moleculeTypes": {}, "species": {}}
29472933
for compartment in self.model.getListOfCompartments():
2948-
compartmentDict[compartment.getId()] = compartment.getSize()
2934+
compartmentDict[compartment.getId()] = get_size(compartment)
29492935
unitFlag = True
29502936
for species in self.model.getListOfSpecies():
29512937
# making molecule and seed species objs for
@@ -2971,7 +2957,7 @@ def default_to_regular(d):
29712957
if rawSpecies["returnID"] in rawSpeciesName:
29722958
rawSpeciesName.remove(rawSpecies["returnID"])
29732959
if (
2974-
translator[rawSpecies["returnID"]].getSize() == 1
2960+
get_size(translator[rawSpecies["returnID"]]) == 1
29752961
and translator[rawSpecies["returnID"]].molecules[0].name
29762962
not in names
29772963
and translator[rawSpecies["returnID"]].molecules[0].name
@@ -3086,9 +3072,9 @@ def default_to_regular(d):
30863072
if self.noCompartment:
30873073
compartmentSize = 1.0
30883074
else:
3089-
compartmentSize = self.model.getCompartment(
3090-
rawSpecies["compartment"]
3091-
).getSize()
3075+
compartmentSize = get_size(
3076+
self.model.getCompartment(rawSpecies["compartment"])
3077+
)
30923078
newParameter = compartmentSize * newParameter
30933079
# temp testing AS
30943080
spec_obj.val = newParameter
@@ -3261,7 +3247,7 @@ def default_to_regular(d):
32613247
sorted(rawSpeciesName, key=len)
32623248
for species in rawSpeciesName:
32633249
if (
3264-
translator[species].getSize() == 1
3250+
get_size(translator[species]) == 1
32653251
and translator[species].molecules[0].name not in names
32663252
):
32673253
names.append(translator[species].molecules[0].name)
@@ -3401,10 +3387,10 @@ def getSpeciesAnnotation(self):
34013387
annotationXML = species.getAnnotation()
34023388
lista = libsbml.CVTermList()
34033389
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotationXML, lista)
3404-
if lista.getSize() == 0:
3390+
if get_size(lista) == 0:
34053391
self.speciesAnnotation[rawSpecies["returnID"]] = []
34063392
else:
3407-
for idx in range(lista.getSize()):
3393+
for idx in range(get_size(lista)):
34083394
self.speciesAnnotation[rawSpecies["returnID"]].append(
34093395
lista.get(idx).getResources()
34103396
)
@@ -3421,11 +3407,11 @@ def getFullAnnotation(self):
34213407
annotationXML = species.getAnnotation()
34223408
lista = libsbml.CVTermList()
34233409
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotationXML, lista)
3424-
if lista.getSize() == 0:
3410+
if get_size(lista) == 0:
34253411
continue
34263412
else:
3427-
for idx in range(lista.getSize()):
3428-
for idx2 in range(0, lista.get(idx).getResources().getLength()):
3413+
for idx in range(get_size(lista)):
3414+
for idx2 in range(0, get_size(get_item(lista, idx).getResources())):
34293415
resource = lista.get(idx).getResources().getValue(idx2)
34303416
qualifierType = lista.get(idx).getQualifierType()
34313417
qualifierDescription = (
@@ -3444,7 +3430,7 @@ def getModelAnnotation(self):
34443430
annotationXML = self.model.getAnnotation()
34453431
lista = libsbml.CVTermList()
34463432
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotationXML, lista)
3447-
if lista.getSize() == 0:
3433+
if get_size(lista) == 0:
34483434
modelAnnotations = []
34493435
else:
34503436
tempDict = {}

bionetgen/atomizer/sbml2json.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import libsbml
99
import json
1010
from optparse import OptionParser
11+
from .utils.util import get_size
1112

1213

1314
def factorial(x):
@@ -114,7 +115,7 @@ def __getRawCompartments(self):
114115
compartmentList = {}
115116
for compartment in self.model.getListOfCompartments():
116117
name = compartment.getId()
117-
size = compartment.getSize()
118+
size = get_size(compartment)
118119
outside = compartment.getOutside()
119120
dimensions = compartment.getSpatialDimensions()
120121
compartmentList[name] = [dimensions, size, outside]

bionetgen/atomizer/utils/annotationDeletion.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import progressbar
99

1010
import libsbml
11-
from util import logMess
11+
from util import logMess, get_size, get_item
1212
from sbml2bngl import SBML2BNGL as SBML2BNGL
1313
import structures
1414
import atomizer.moleculeCreation as mc
@@ -125,15 +125,15 @@ def parseAnnotation(annotation):
125125
speciesAnnotationDict = defaultdict(list)
126126
lista = libsbml.CVTermList()
127127
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotation, lista)
128-
for idx in range(0, lista.getSize()):
129-
for idx2 in range(0, lista.get(idx).getResources().getLength()):
130-
resource = lista.get(idx).getResources().getValue(idx2)
128+
for idx in range(0, get_size(lista)):
129+
for idx2 in range(0, get_size(get_item(lista, idx).getResources())):
130+
resource = get_item(lista, idx).getResources().getValue(idx2)
131131

132-
qualifierType = lista.get(idx).getQualifierType()
132+
qualifierType = get_item(lista, idx).getQualifierType()
133133
qualifierDescription = (
134-
bioqual[lista.get(idx).getBiologicalQualifierType()]
134+
bioqual[get_item(lista, idx).getBiologicalQualifierType()]
135135
if qualifierType
136-
else modqual[lista.get(idx).getModelQualifierType()]
136+
else modqual[get_item(lista, idx).getModelQualifierType()]
137137
)
138138
speciesAnnotationDict[qualifierDescription].append(resource)
139139
return speciesAnnotationDict

bionetgen/atomizer/utils/annotationExtender.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"""
77

88
import libsbml
9-
from util import logMess
9+
from util import logMess, get_size, get_item
1010
from sbml2bngl import SBML2BNGL as SBML2BNGL
1111
import structures
1212
import atomizer.resolveSCT as mc
@@ -128,15 +128,15 @@ def parseAnnotation(annotation):
128128
speciesAnnotationDict = defaultdict(list)
129129
lista = libsbml.CVTermList()
130130
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotation, lista)
131-
for idx in range(0, lista.getSize()):
132-
for idx2 in range(0, lista.get(idx).getResources().getLength()):
133-
resource = lista.get(idx).getResources().getValue(idx2)
131+
for idx in range(0, get_size(lista)):
132+
for idx2 in range(0, get_size(get_item(lista, idx).getResources())):
133+
resource = get_item(lista, idx).getResources().getValue(idx2)
134134

135-
qualifierType = lista.get(idx).getQualifierType()
135+
qualifierType = get_item(lista, idx).getQualifierType()
136136
qualifierDescription = (
137-
bioqual[lista.get(idx).getBiologicalQualifierType()]
137+
bioqual[get_item(lista, idx).getBiologicalQualifierType()]
138138
if qualifierType
139-
else modqual[lista.get(idx).getModelQualifierType()]
139+
else modqual[get_item(lista, idx).getModelQualifierType()]
140140
)
141141
speciesAnnotationDict[qualifierDescription].append(resource)
142142
return speciesAnnotationDict

bionetgen/atomizer/utils/annotationExtractor.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import libsbml
99
from sbml2bngl import SBML2BNGL as SBML2BNGL
10+
from .util import get_size, get_item
1011
import structures
1112
import atomizer.moleculeCreation as mc
1213
import os
@@ -96,14 +97,14 @@ def parseAnnotation(self, annotation):
9697
lista = libsbml.CVTermList()
9798
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotation, lista)
9899
# print '----',species.getName()
99-
for idx in range(0, lista.getSize()):
100-
for idx2 in range(0, lista.get(idx).getResources().getLength()):
101-
resource = lista.get(idx).getResources().getValue(idx2)
102-
qualifierType = lista.get(idx).getQualifierType()
100+
for idx in range(0, get_size(lista)):
101+
for idx2 in range(0, get_size(get_item(lista, idx).getResources())):
102+
resource = get_item(lista, idx).getResources().getValue(idx2)
103+
qualifierType = get_item(lista, idx).getQualifierType()
103104
qualifierDescription = (
104-
bioqual[lista.get(idx).getBiologicalQualifierType()]
105+
bioqual[get_item(lista, idx).getBiologicalQualifierType()]
105106
if qualifierType
106-
else modqual[lista.get(idx).getModelQualifierType()]
107+
else modqual[get_item(lista, idx).getModelQualifierType()]
107108
)
108109
speciesAnnotationDict[qualifierDescription].append(resource)
109110
return speciesAnnotationDict
@@ -294,20 +295,20 @@ def getModelAnnotations(self):
294295
lista = libsbml.CVTermList()
295296
libsbml.RDFAnnotationParser.parseRDFAnnotation(annotationXML, lista)
296297
modelAnnotations = []
297-
for idx in range(lista.getSize()):
298-
for idx2 in range(lista.get(idx).getResources().getLength()):
299-
if lista.get(idx).getQualifierType():
298+
for idx in range(get_size(lista)):
299+
for idx2 in range(get_size(get_item(lista, idx).getResources())):
300+
if get_item(lista, idx).getQualifierType():
300301
modelAnnotations.append(
301302
[
302-
bioqual[lista.get(idx).getBiologicalQualifierType()],
303-
lista.get(idx).getResources().getValue(idx2),
303+
bioqual[get_item(lista, idx).getBiologicalQualifierType()],
304+
get_item(lista, idx).getResources().getValue(idx2),
304305
]
305306
)
306307
else:
307308
modelAnnotations.append(
308309
[
309-
modqual[lista.get(idx).getModelQualifierType()],
310-
lista.get(idx).getResources().getValue(idx2),
310+
modqual[get_item(lista, idx).getModelQualifierType()],
311+
get_item(lista, idx).getResources().getValue(idx2),
311312
]
312313
)
313314

bionetgen/atomizer/utils/util.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,27 @@ def logMess(logType, logMessage):
321321
logger.error(logMessage, loc=f"{__file__} : {module}.logMess()")
322322

323323

324+
def get_size(obj):
325+
if hasattr(obj, "getSize"):
326+
return obj.getSize()
327+
elif hasattr(obj, "size"):
328+
return obj.size()
329+
elif hasattr(obj, "getLength"):
330+
return obj.getLength()
331+
else:
332+
try:
333+
return len(obj)
334+
except:
335+
return 0
336+
337+
338+
def get_item(obj, idx):
339+
if hasattr(obj, "get"):
340+
return obj.get(idx)
341+
else:
342+
return obj[idx]
343+
344+
324345
def testBNGFailure(fileName):
325346
with open(os.devnull, "w") as f:
326347
result = call(["bngdev", fileName], stdout=f)

0 commit comments

Comments
 (0)