2 from sfa.util.faults import InvalidRSpec
3 from sfa.util.sfalogging import logger
7 default_version_num = '1'
13 def load_versions(self):
14 path = os.path.dirname(os.path.abspath( __file__ ))
15 versions_path = path + os.sep + 'versions'
16 versions_module_path = 'sfa.rspecs.versions'
17 valid_module = lambda x: os.path.isfile(os.sep.join([versions_path, x])) \
18 and not x.endswith('.pyc') and x not in ['__init__.py']
19 files = [f for f in os.listdir(versions_path) if valid_module(f)]
20 for filename in files:
21 basename = filename.split('.')[0]
22 module_path = versions_module_path +'.'+basename
23 module = __import__(module_path, fromlist=module_path)
24 for attr_name in dir(module):
25 attr = getattr(module, attr_name)
26 if hasattr(attr, 'version') and hasattr(attr, 'enabled') and attr.enabled == True:
27 self.versions.append(attr())
29 def _get_version(self, type, version_num=None, content_type=None):
31 for version in self.versions:
32 if type is None or type.lower() == version.type.lower():
33 if version_num is None or version_num == version.version:
34 if content_type is None or content_type.lower() == version.content_type.lower():
37 raise InvalidRSpec("No such version format: %s version: %s type:%s "% (type, version_num, content_type))
40 def get_version(self, version=None):
42 if isinstance(version, dict):
43 retval = self._get_version(version.get('type'), version.get('version'), version.get('content_type'))
44 elif isinstance(version, basestring):
45 version_parts = version.split(' ')
46 num_parts = len(version_parts)
47 type = version_parts[0]
51 version_num = version_parts[1]
53 content_type = version_parts[2]
54 retval = self._get_version(type, version_num, content_type)
56 logger.info("Unable to parse rspec version, using default")
57 retval = self._get_version(self.default_type, self.default_version_num)
61 def get_version_by_schema(self, schema):
63 for version in self.versions:
64 if schema == version.schema:
67 raise InvalidRSpec("Unkwnown RSpec schema: %s" % schema)
70 if __name__ == '__main__':
73 print v.get_version('sfa 1')
74 print v.get_version('protogeni 2')
75 print v.get_version('protogeni 2 advertisement')
76 print v.get_version_by_schema('http://www.protogeni.net/resources/rspec/2/ad.xsd')