65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
"""
|
|
Generic framework path manipulation
|
|
"""
|
|
|
|
import re
|
|
|
|
__all__ = ['framework_info']
|
|
|
|
STRICT_FRAMEWORK_RE = re.compile(r"""(?x)
|
|
(?P<location>^.*)(?:^|/)
|
|
(?P<name>
|
|
(?P<shortname>\w+).framework/
|
|
(?:Versions/(?P<version>[^/]+)/)?
|
|
(?P=shortname)
|
|
(?:_(?P<suffix>[^_]+))?
|
|
)$
|
|
""")
|
|
|
|
def framework_info(filename):
|
|
"""
|
|
A framework name can take one of the following four forms:
|
|
Location/Name.framework/Versions/SomeVersion/Name_Suffix
|
|
Location/Name.framework/Versions/SomeVersion/Name
|
|
Location/Name.framework/Name_Suffix
|
|
Location/Name.framework/Name
|
|
|
|
returns None if not found, or a mapping equivalent to:
|
|
dict(
|
|
location='Location',
|
|
name='Name.framework/Versions/SomeVersion/Name_Suffix',
|
|
shortname='Name',
|
|
version='SomeVersion',
|
|
suffix='Suffix',
|
|
)
|
|
|
|
Note that SomeVersion and Suffix are optional and may be None
|
|
if not present
|
|
"""
|
|
is_framework = STRICT_FRAMEWORK_RE.match(filename)
|
|
if not is_framework:
|
|
return None
|
|
return is_framework.groupdict()
|
|
|
|
def test_framework_info():
|
|
def d(location=None, name=None, shortname=None, version=None, suffix=None):
|
|
return dict(
|
|
location=location,
|
|
name=name,
|
|
shortname=shortname,
|
|
version=version,
|
|
suffix=suffix
|
|
)
|
|
assert framework_info('completely/invalid') is None
|
|
assert framework_info('completely/invalid/_debug') is None
|
|
assert framework_info('P/F.framework') is None
|
|
assert framework_info('P/F.framework/_debug') is None
|
|
assert framework_info('P/F.framework/F') == d('P', 'F.framework/F', 'F')
|
|
assert framework_info('P/F.framework/F_debug') == d('P', 'F.framework/F_debug', 'F', suffix='debug')
|
|
assert framework_info('P/F.framework/Versions') is None
|
|
assert framework_info('P/F.framework/Versions/A') is None
|
|
assert framework_info('P/F.framework/Versions/A/F') == d('P', 'F.framework/Versions/A/F', 'F', 'A')
|
|
assert framework_info('P/F.framework/Versions/A/F_debug') == d('P', 'F.framework/Versions/A/F_debug', 'F', 'A', 'debug')
|
|
|
|
if __name__ == '__main__':
|
|
test_framework_info()
|