blob: ad6ed554ba0c221a0673e077f451fc7fbac25f24 [file] [log] [blame]
Thomas Hellerbabddfc2006-03-08 19:56:54 +00001"""
2Generic framework path manipulation
3"""
4
5import re
6
7__all__ = ['framework_info']
8
9STRICT_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
19def 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
44def 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
64if __name__ == '__main__':
65 test_framework_info()