logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

dylib.py (1828B)


  1. """
  2. Generic dylib path manipulation
  3. """
  4. import re
  5. __all__ = ['dylib_info']
  6. DYLIB_RE = re.compile(r"""(?x)
  7. (?P<location>^.*)(?:^|/)
  8. (?P<name>
  9. (?P<shortname>\w+?)
  10. (?:\.(?P<version>[^._]+))?
  11. (?:_(?P<suffix>[^._]+))?
  12. \.dylib$
  13. )
  14. """)
  15. def dylib_info(filename):
  16. """
  17. A dylib name can take one of the following four forms:
  18. Location/Name.SomeVersion_Suffix.dylib
  19. Location/Name.SomeVersion.dylib
  20. Location/Name_Suffix.dylib
  21. Location/Name.dylib
  22. returns None if not found or a mapping equivalent to:
  23. dict(
  24. location='Location',
  25. name='Name.SomeVersion_Suffix.dylib',
  26. shortname='Name',
  27. version='SomeVersion',
  28. suffix='Suffix',
  29. )
  30. Note that SomeVersion and Suffix are optional and may be None
  31. if not present.
  32. """
  33. is_dylib = DYLIB_RE.match(filename)
  34. if not is_dylib:
  35. return None
  36. return is_dylib.groupdict()
  37. def test_dylib_info():
  38. def d(location=None, name=None, shortname=None, version=None, suffix=None):
  39. return dict(
  40. location=location,
  41. name=name,
  42. shortname=shortname,
  43. version=version,
  44. suffix=suffix
  45. )
  46. assert dylib_info('completely/invalid') is None
  47. assert dylib_info('completely/invalide_debug') is None
  48. assert dylib_info('P/Foo.dylib') == d('P', 'Foo.dylib', 'Foo')
  49. assert dylib_info('P/Foo_debug.dylib') == d('P', 'Foo_debug.dylib', 'Foo', suffix='debug')
  50. assert dylib_info('P/Foo.A.dylib') == d('P', 'Foo.A.dylib', 'Foo', 'A')
  51. assert dylib_info('P/Foo_debug.A.dylib') == d('P', 'Foo_debug.A.dylib', 'Foo_debug', 'A')
  52. assert dylib_info('P/Foo.A_debug.dylib') == d('P', 'Foo.A_debug.dylib', 'Foo', 'A', 'debug')
  53. if __name__ == '__main__':
  54. test_dylib_info()