added _get_version() method
[sfa.git] / sfa / rspecs / version_manager.py
1 import os
2
3 class VersionManager:
4     default_type = 'SFA'
5     default_version_num = '1'     
6         
7     def __init__(self):
8         self.versions = []
9         self.load_versions()
10
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 not x.endswith('.pyc') and x not in ['__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'):
25                     self.versions.append(attr)
26
27     def _get_version(self, type, version_num=None, content_type=None):
28         retval = None
29         for version in self.versions:
30             if type is None or type.lower() == version.type.lower():
31                 if version_num is None or version_num == version.version:
32                     if content_type is None or content_type.lower() == version.content_type.lower():
33                         retval = version
34         if not retval:
35             raise Exception, "No such version format: %s version: %s type:%s "% (type, version_num, content_type)
36         return retval
37
38     def get_version(self, version):
39         retval = None
40         if isinstance(version, dict):
41             retval =  self._get_version(version.get('type'), version.get('version_num'), version.get('content_type'))
42         elif isinstance(version, basestring):
43             version_parts = version.split(' ')     
44             num_parts = len(version_parts)
45             type = version_parts[0]
46             version_num = None
47             content_type = None
48             if num_parts > 1:
49                 version_num = version_parts[1]
50             if num_parts > 2:
51                 content_type = version_parts[2]
52             retval = self._get_version(type, version_num, content_type) 
53         else:
54             logger.info("Unable to parse rspec version, using default")
55             retval = self._get_version(self.default_type, self.default_version_num)   
56  
57         return retval
58
59 if __name__ == '__main__':
60     v = VersionManager()
61     print v.versions
62     print v.get_version('sfa 1') 
63     print v.get_version('protogeni 2') 
64     print v.get_version('protogeni 2 advertisement') 
65     
66