1 ######################################################################
2 # This file should be kept compatible with Python 2.3, see PEP 291. #
3 ######################################################################
5 Generic framework path manipulation
10 __all__ = ['framework_info']
12 STRICT_FRAMEWORK_RE = re.compile(r"""(?x)
13 (?P<location>^.*)(?:^|/)
15 (?P<shortname>\w+).framework/
16 (?:Versions/(?P<version>[^/]+)/)?
18 (?:_(?P<suffix>[^_]+))?
22 def framework_info(filename):
24 A framework name can take one of the following four forms:
25 Location/Name.framework/Versions/SomeVersion/Name_Suffix
26 Location/Name.framework/Versions/SomeVersion/Name
27 Location/Name.framework/Name_Suffix
28 Location/Name.framework/Name
30 returns None if not found, or a mapping equivalent to:
33 name='Name.framework/Versions/SomeVersion/Name_Suffix',
35 version='SomeVersion',
39 Note that SomeVersion and Suffix are optional and may be None
42 is_framework = STRICT_FRAMEWORK_RE.match(filename)
45 return is_framework.groupdict()
47 def test_framework_info():
48 def d(location=None, name=None, shortname=None, version=None, suffix=None):
56 assert framework_info('completely/invalid') is None
57 assert framework_info('completely/invalid/_debug') is None
58 assert framework_info('P/F.framework') is None
59 assert framework_info('P/F.framework/_debug') is None
60 assert framework_info('P/F.framework/F') == d('P', 'F.framework/F', 'F')
61 assert framework_info('P/F.framework/F_debug') == d('P', 'F.framework/F_debug', 'F', suffix='debug')
62 assert framework_info('P/F.framework/Versions') is None
63 assert framework_info('P/F.framework/Versions/A') is None
64 assert framework_info('P/F.framework/Versions/A/F') == d('P', 'F.framework/Versions/A/F', 'F', 'A')
65 assert framework_info('P/F.framework/Versions/A/F_debug') == d('P', 'F.framework/Versions/A/F_debug', 'F', 'A', 'debug')
67 if __name__ == '__main__':