from __future__ import absolute_import
import os
import warnings
from .validate import ValidationError
from .base import HubComponent
[docs]
class Hub(HubComponent):
# map proper track hub stanza field names to pythonic attribute names in
# this class.
[docs]
def __init__(
self,
hub,
short_label=None,
long_label=None,
genomes_file=None,
genomes_filename=None,
email="",
url=None,
filename=None,
):
"""
Represents a top-level track hub container.
hub : str
Top-level name of the hub.
short_label : str
Short label for the hub, alias for UCSC parameter shortLabel.
long_label : str
Long label for the hub, alias for UCSC parameter longLabel. If
None, will copy `short_label`.
genomes_file : GenomesFile
If you already have a GenomesFile created, you can add it here;
otherwise when one is created you'll have to add one later with the
`add_genomes_file` method.
email : str
Email that will be provided in the hub for contact info
url : str
Deprecated.
filename : str
If None, defaults to the value of `hub` plus ".hub.txt". When
uploaded, the filename is relative to the uploaded location.
"""
HubComponent.__init__(self)
if url is not None:
self.url = url
warnings.DeprecationWarning("url is no longer used for Hub objects")
self.hub = hub
if not short_label:
short_label = hub
self.short_label = short_label
if not long_label:
long_label = short_label
self.long_label = long_label
self.email = email
self.genomes_file = None
if genomes_file is not None:
self.add_genomes_file(genomes_file)
if filename is None:
filename = hub + ".hub.txt"
self.filename = filename
[docs]
def validate(self):
if self.genomes_file is None:
raise ValidationError(
"No GenomesFile attached to Hub (use add_genomes_file())"
)
self.genomes_file.validate()
return True
[docs]
def add_genomes_file(self, genomes_file):
"""
If a GenomesFile object was not provided upon instantiating this
object, attach one now
"""
self.genomes_file = self.add_child(genomes_file)
def __str__(self):
s = []
genomes_file = None
if self.genomes_file:
genomes_file = self.genomes_file.filename
for label, value in [
("hub", "hub"),
("shortLabel", self.short_label),
("longLabel", self.long_label),
("genomesFile", genomes_file),
("email", self.email),
]:
s.append("{0} {1}".format(label, value))
return "\n".join(s)
def _render(self, staging="staging"):
"""
Render just this object, and not all the underlying GenomeFiles and
their TrackDb.
"""
rendered_filename = os.path.join(staging, self.filename)
self.makedirs(rendered_filename)
fout = open(rendered_filename, "w")
fout.write(str(self))
fout.close()
return fout.name