#
# The high-throughput toolkit (httk)
# Copyright (C) 2012-2015 Rickard Armiento
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from httk.core.httkobject import HttkObject, httk_typed_init
from httk.core.reference import Reference
[docs]class Code(HttkObject):
"""
Object for keeping track of httk data about a computer software or script
"""
@httk_typed_init({'name': str, 'version': str}, index=['name', 'version'])
def __init__(self, name, version):
"""
Private constructor, as per httk coding guidelines. Use .create method instead.
"""
super(Code, self).__init__()
self.name = name
self.version = version
self._tags = {}
self._refs = []
self._codependent_callbacks = []
self._codependent_data = []
self._codependent_info = [{'class': CodeTag, 'column': 'code', 'add_method': 'add_tags'},
{'class': CodeRef, 'column': 'code', 'add_method': 'add_refs'}]
[docs] @classmethod
def create(cls, name, version, refs=None, tags=None):
"""
Create a Computation object.
"""
new = cls(name, version)
if tags is not None:
new.add_tags(tags)
if refs is not None:
new.add_refs(refs)
return new
def _fill_codependent_data(self):
self._tags = {}
self._refs = []
for x in self._codependent_callbacks:
x(self)
[docs] def add_tag(self, tag, val):
if self._tags is None:
self._fill_codependent_data()
new = CodeTag(self, tag, val)
self._tags[tag] = new
self._codependent_data += [new]
[docs] def get_tag(self, tag):
if self._tags is None:
self._fill_codependent_data()
return self._tags[tag]
[docs] def get_refs(self):
if self._refs is None:
self._fill_codependent_data()
return self._refs
[docs] def add_ref(self, ref):
if self._refs is None:
self._fill_codependent_data()
if isinstance(ref, CodeRef):
refobj = ref.reference
else:
refobj = Reference.use(ref)
new = CodeRef(self, refobj)
self._refs += [new]
self._codependent_data += [new]
[docs] def add_refs(self, refs):
for ref in refs:
self.add_ref(ref)
[docs]class CodeTag(HttkObject):
@httk_typed_init({'code': Code, 'tag': str, 'value': str},
index=['code', 'tag', ('tag', 'value'), ('structure', 'tag', 'value')], skip=['hexhash'])
def __init__(self, structure, tag, value):
self.tag = tag
self.structure = structure
self.value = value
def __str__(self):
return "(Tag) "+self.tag+": "+self.value+""
[docs]class CodeRef(HttkObject):
@httk_typed_init({'code': Code, 'reference': Reference}, index=['code', 'reference'], skip=['hexhash'])
def __init__(self, code, reference):
self.code = code
self.reference = reference
def __str__(self):
return str(self.reference)
if __name__ == "__main__":
main()