Thomas Heller | babddfc | 2006-03-08 19:56:54 +0000 | [diff] [blame] | 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() |