X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Frspecs%2Fversion_manager.py;h=4e60bacb6bdc9fb17487c2d0bd92f499d840f8dd;hb=dc78e3f893a576ed12c695682770a124f1462acc;hp=511ede0f2a0fe864b25afaf5fb0d3bb591d54e12;hpb=03ebda9002f2f2af01e15d101df7fa69f5a1d537;p=sfa.git diff --git a/sfa/rspecs/version_manager.py b/sfa/rspecs/version_manager.py index 511ede0f..4e60bacb 100644 --- a/sfa/rspecs/version_manager.py +++ b/sfa/rspecs/version_manager.py @@ -1,7 +1,9 @@ import os +from sfa.util.faults import InvalidRSpec, UnsupportedRSpecVersion +from sfa.rspecs.version import RSpecVersion +from sfa.util.sfalogging import logger class VersionManager: - def __init__(self): self.versions = [] self.load_versions() @@ -11,7 +13,7 @@ class VersionManager: versions_path = path + os.sep + 'versions' versions_module_path = 'sfa.rspecs.versions' valid_module = lambda x: os.path.isfile(os.sep.join([versions_path, x])) \ - and not x.endswith('.pyc') and x not in ['__init__.py'] + and x.endswith('.py') and x != '__init__.py' files = [f for f in os.listdir(versions_path) if valid_module(f)] for filename in files: basename = filename.split('.')[0] @@ -19,24 +21,73 @@ class VersionManager: module = __import__(module_path, fromlist=module_path) for attr_name in dir(module): attr = getattr(module, attr_name) - if hasattr(attr, 'version'): - self.versions.append(attr) + if hasattr(attr, 'version') and hasattr(attr, 'enabled') and attr.enabled == True: + self.versions.append(attr()) - def get_version(self, format, version_num=None, type=None): + def _get_version(self, type, version_num=None, content_type=None): retval = None for version in self.versions: - if format is None or format.lower() == version.format.lower(): - if version_num is None or version_num == version.version: - if type is None or type.lower() == version.type.lower(): + if type is None or type.lower() == version.type.lower(): + if version_num is None or str(float(version_num)) == str(float(version.version)): + if content_type is None or content_type.lower() == version.content_type.lower() \ + or version.content_type == '*': retval = version + ### sounds like we should be glad with the first match, not the last one + break if not retval: - raise Exception, "No such version format: %s version: %s type:%s "% (format, version_num, type) - return retval - + raise UnsupportedRSpecVersion("[%s %s %s] is not suported here"% (type, version_num, content_type)) + return retval + + def get_version(self, version=None): + retval = None + if isinstance(version, dict): + retval = self._get_version(version.get('type'), version.get('version'), version.get('content_type')) + elif isinstance(version, basestring): + version_parts = version.split(' ') + num_parts = len(version_parts) + type = version_parts[0] + version_num = None + content_type = None + if num_parts > 1: + version_num = version_parts[1] + if num_parts > 2: + content_type = version_parts[2] + retval = self._get_version(type, version_num, content_type) + elif isinstance(version, RSpecVersion): + retval = version + elif not version: + retval = self.versions[0] + else: + raise UnsupportedRSpecVersion("No such version: %s "% str(version)) + + return retval + + def get_version_by_schema(self, schema): + retval = None + for version in self.versions: + if schema == version.schema: + retval = version + if not retval: + raise InvalidRSpec("Unkwnown RSpec schema: %s" % schema) + return retval + +def show_by_string(string): + try: + print v.get_version(string) + except Exception,e: + print e +def show_by_schema(string): + try: + print v.get_version_by_schema(string) + except Exception,e: + print e if __name__ == '__main__': v = VersionManager() print v.versions - print v.get_version('sfa') - + show_by_string('sfa 1') + show_by_string('protogeni 2') + show_by_string('protogeni 2 advertisement') + show_by_schema('http://www.protogeni.net/resources/rspec/2/ad.xsd') + show_by_schema('http://sorch.netmode.ntua.gr/ws/RSpec/ad.xsd')