2 from sfa.util.faults import InvalidRSpec, UnsupportedRSpecVersion
3 from sfa.rspecs.version import RSpecVersion
4 from sfa.util.sfalogging import logger
11 def load_versions(self):
12 path = os.path.dirname(os.path.abspath( __file__ ))
13 versions_path = path + os.sep + 'versions'
14 versions_module_path = 'sfa.rspecs.versions'
15 valid_module = lambda x: os.path.isfile(os.sep.join([versions_path, x])) \
16 and x.endswith('.py') and x != '__init__.py'
17 files = [f for f in os.listdir(versions_path) if valid_module(f)]
18 for filename in files:
19 basename = filename.split('.')[0]
20 module_path = versions_module_path +'.'+basename
21 module = __import__(module_path, fromlist=module_path)
22 for attr_name in dir(module):
23 attr = getattr(module, attr_name)
24 if hasattr(attr, 'version') and hasattr(attr, 'enabled') and attr.enabled == True:
25 print filename, module, attr
26 self.versions.append(attr())
28 def _get_version(self, type, version_num=None, content_type=None):
30 for version in self.versions:
31 if type is None or type.lower() == version.type.lower():
32 if version_num is None or str(float(version_num)) == str(float(version.version)):
33 if content_type is None or content_type.lower() == version.content_type.lower() \
34 or version.content_type == '*':
36 ### sounds like we should be glad with the first match, not the last one
39 raise UnsupportedRSpecVersion("[%s %s %s] is not suported here"% (type, version_num, content_type))
42 def get_version(self, version=None):
44 if isinstance(version, dict):
45 retval = self._get_version(version.get('type'), version.get('version'), version.get('content_type'))
46 elif isinstance(version, basestring):
47 version_parts = version.split(' ')
48 num_parts = len(version_parts)
49 type = version_parts[0]
53 version_num = version_parts[1]
55 content_type = version_parts[2]
56 retval = self._get_version(type, version_num, content_type)
57 elif isinstance(version, RSpecVersion):
60 retval = self.versions[0]
62 raise UnsupportedRSpecVersion("No such version: %s "% str(version))
66 def get_version_by_schema(self, schema):
68 for version in self.versions:
69 if schema == version.schema:
72 raise InvalidRSpec("Unkwnown RSpec schema: %s" % schema)
75 def show_by_string(string):
77 print v.get_version(string)
80 def show_by_schema(string):
82 print v.get_version_by_schema(string)
86 if __name__ == '__main__':
89 show_by_string('sfa 1')
90 show_by_string('protogeni 2')
91 show_by_string('protogeni 2 advertisement')
92 show_by_schema('http://www.protogeni.net/resources/rspec/2/ad.xsd')
93 show_by_schema('http://sorch.netmode.ntua.gr/ws/RSpec/ad.xsd')