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() |
---|