1 """ 2 Generic framework path manipulation 3 """ 4 5 import re 6 7 __all__ = ['framework_info'] 8 9 STRICT_FRAMEWORK_RE = re.compile(r"""(?x) 10 (?P<location>^.*)(?:^|/) 11 (?P<name> 12 (?P<shortname>\w+).framework/ 13 (?:Versions/(?P<version>[^/]+)/)? 14 (?P=shortname) 15 (?:_(?P<suffix>[^_]+))? 16 )$ 17 """) 18 19 def framework_info(filename): 20 """ 21 A framework name can take one of the following four forms: 22 Location/Name.framework/Versions/SomeVersion/Name_Suffix 23 Location/Name.framework/Versions/SomeVersion/Name 24 Location/Name.framework/Name_Suffix 25 Location/Name.framework/Name 26 27 returns None if not found, or a mapping equivalent to: 28 dict( 29 location='Location', 30 name='Name.framework/Versions/SomeVersion/Name_Suffix', 31 shortname='Name', 32 version='SomeVersion', 33 suffix='Suffix', 34 ) 35 36 Note that SomeVersion and Suffix are optional and may be None 37 if not present 38 """ 39 is_framework = STRICT_FRAMEWORK_RE.match(filename) 40 if not is_framework: 41 return None 42 return is_framework.groupdict() 43 44 def test_framework_info(): 45 def d(location=None, name=None, shortname=None, version=None, suffix=None): 46 return dict( 47 location=location, 48 name=name, 49 shortname=shortname, 50 version=version, 51 suffix=suffix 52 ) 53 assert framework_info('completely/invalid') is None 54 assert framework_info('completely/invalid/_debug') is None 55 assert framework_info('P/F.framework') is None 56 assert framework_info('P/F.framework/_debug') is None 57 assert framework_info('P/F.framework/F') == d('P', 'F.framework/F', 'F') 58 assert framework_info('P/F.framework/F_debug') == d('P', 'F.framework/F_debug', 'F', suffix='debug') 59 assert framework_info('P/F.framework/Versions') is None 60 assert framework_info('P/F.framework/Versions/A') is None 61 assert framework_info('P/F.framework/Versions/A/F') == d('P', 'F.framework/Versions/A/F', 'F', 'A') 62 assert framework_info('P/F.framework/Versions/A/F_debug') == d('P', 'F.framework/Versions/A/F_debug', 'F', 'A', 'debug') 63 64 if __name__ == '__main__': 65 test_framework_info() 66