import os
import json
import re
from attrdict import AttrDict
HERE = os.path.abspath(__file__)
PARENT = os.path.dirname(HERE)
[docs]class Project(AttrDict):
pass
[docs]class Projects(object):
[docs] @classmethod
def sync(cls):
"""Fetch the current set of Data Catalog projects
"""
# TODO - enable retrieval from a Tapis metadata record
projects_obj = Projects()
projects_file = os.path.join(PARENT, 'projects.json')
projects = json.load(open(projects_file, 'r'))
for p in projects:
for project_id, project_body in p.items():
# project_id = proj
new_project_body = Project(project_body)
setattr(projects_obj,
cls._propertize_project_id(project_id),
new_project_body)
return projects_obj
@classmethod
def _propertize_project_id(cls, project_id):
project_id = project_id.upper()
project_id = project_id.replace('.', '_')
project_id = project_id.replace('-', '_')
if re.match('^[0-9]', project_id):
project_id = '_' + project_id
return project_id
[docs] def names(self):
"""Return the property-named list of projects
"""
names = list()
for prop in dir(self):
p = getattr(self, prop)
if isinstance(p, Project):
names.append(prop)
names.sort()
return names
[docs] def project_names(self):
"""Return a sorted list of project identifiers
"""
ids = list()
for prop in dir(self):
p = getattr(self, prop)
if isinstance(p, Project):
ids.append(p.tacc_name)
ids.sort()
return ids
[docs] def validate_project_id(self, project_id, permissive=True):
"""Validate the supplied string against known project identifiers
"""
if project_id in self.project_names():
return True
else:
if permissive is True:
return False
else:
raise ValueError('{} not a known project id'.format(project_id))