Home | History | Annotate | Download | only in macholib
      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()
     66