Updating from earlier versions

From v1.*

Update from v1.* to v2.* should be straightforward; the only reason the major version was updated was because the cache argument was removed from the Ontology constructor.

From v0.*

Render to OBO

Exporting an ontology to the OBO (or other supported formats) is now done with the dump and dumps methods:

# before
print(ontology.obo)
open("out.obo", "w").write(ontology.obo)

# after
print(ontology.dumps(format="obo"))
ontoloy.dump(open("out.obo", "w"), format="obo")

Subclasses and superclasses

pronto is not opinionated about the direction of a relationship. Subclassing relationships are now handled as a special case, following the semantics of the rdfs:subClassOf property in the RDF schema.

Therefore, the code to access subclasses and superclasses of a Term has been updated:

# before
children: pronto.TermList = term.rchildren()
parents: pronto.TermList = term.rparents()

# after
children_iter: Iterable[Term] = term.subclasses()
parents_iter: Iterable[Term] = term.superclasses()

Because we follow the RDF semantics, any class is also its own subclass and superclass; therefore, both of these iterators will yield the term itself as the first member of the iteration. This behaviour can be annoying, so you can disable it by giving with_self=False as an argument to only get true subclasses or superclasses:

children_iter: Iterable[Term] = term.subclasses(with_self=False)
parents_iter: Iterable[Term] = term.superclasses(with_self=False)

To only get the direct subclasses or superclasses (i.e., what Term.children and Term.parents used to do), pass distance=1 as an argument as well:

children: Iterable[Term] = term.subclasses(with_self=False, distance=1)
parents: Iterable[Term] = term.superclasses(with_self=False, distance=1)

Since querying of subclasses and superclasses now gives you an iterator, but your previous code was expecting a TermList, you can use the to_set method to obtain a TermSet which hopefully will prevent the rest of your code to require more update.

# you can use `to_set` to get a `TermSet` from the iterator
children: pronto.TermSet = term.subclasses().to_set()
parents: pronto.TermSet = term.superclasses().to_set()