config.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from enum import auto, Enum
  2. import platform
  3. from typing import NamedTuple, Optional, Union
  4. __all__ = ['Arch', 'PythonImpl', 'PythonVersion']
  5. class Arch(Enum):
  6. '''Supported platform architectures.'''
  7. AARCH64 = auto()
  8. I686 = auto()
  9. X86_64 = auto()
  10. def __str__(self):
  11. return self.name.lower()
  12. @classmethod
  13. def from_host(cls) -> 'Arch':
  14. return cls.from_str(platform.machine())
  15. @classmethod
  16. def from_str(cls, value) -> 'Arch':
  17. for arch in cls:
  18. if value == str(arch):
  19. return arch
  20. else:
  21. raise NotImplementedError(value)
  22. class LinuxTag(Enum):
  23. '''Supported platform tags.'''
  24. MANYLINUX_1 = auto()
  25. MANYLINUX_2010 = auto()
  26. MANYLINUX_2014 = auto()
  27. MANYLINUX_2_24 = auto()
  28. MANYLINUX_2_28 = auto()
  29. def __str__(self):
  30. tag = self.name.lower()
  31. if self in (LinuxTag.MANYLINUX_1, LinuxTag.MANYLINUX_2010,
  32. LinuxTag.MANYLINUX_2014):
  33. return tag.replace('_', '')
  34. else:
  35. return tag
  36. @classmethod
  37. def from_str(cls, value) -> 'LinuxTag':
  38. for tag in cls:
  39. if value == str(tag):
  40. return tag
  41. else:
  42. raise NotImplementedError(value)
  43. @classmethod
  44. def from_brief(cls, value) -> 'LinuxTag':
  45. if value.startswith('2_'):
  46. return cls.from_str('manylinux_' + value)
  47. else:
  48. return cls.from_str('manylinux' + value)
  49. class PythonImpl(Enum):
  50. '''Supported Python implementations.'''
  51. CPYTHON = auto()
  52. def __str__(self):
  53. return 'python'
  54. class PythonVersion(NamedTuple):
  55. ''''''
  56. major: int
  57. minor: int
  58. patch: Union[int, str]
  59. flavour: Optional[str]=None
  60. @classmethod
  61. def from_str(cls, value: str) -> 'PythonVersion':
  62. major, minor, patch = value.split('.', 2)
  63. try:
  64. patch, flavour = patch.split('-', 1)
  65. except ValueError:
  66. flavour = None
  67. else:
  68. if flavour == 'nogil':
  69. flavour = 't'
  70. elif flavour == 'ucs2':
  71. flavour = 'm'
  72. elif flavour == 'ucs4':
  73. flavour = 'mu'
  74. else:
  75. raise NotImplementedError(value)
  76. try:
  77. patch = int(patch)
  78. except ValueError:
  79. pass
  80. return cls(int(major), int(minor), patch, flavour)
  81. def flavoured(self) -> str:
  82. flavour = self.flavour if self.flavour == 't' else ''
  83. return f'{self.major}.{self.minor}{flavour}'
  84. def long(self) -> str:
  85. return f'{self.major}.{self.minor}.{self.patch}'
  86. def short(self) -> str:
  87. return f'{self.major}.{self.minor}'