Source code for okonomiyaki.platforms.platform
from __future__ import absolute_import
import platform
import sys
from ..bundled.traitlets import HasTraits, Enum, Instance, Unicode
from ..errors import OkonomiyakiError
from ._arch import Arch
DARWIN = "darwin"
LINUX = "linux"
SOLARIS = "solaris"
WINDOWS = "windows"
CENTOS = "centos"
DEBIAN = "debian"
RHEL = "rhel"
UBUNTU = "ubuntu"
MAC_OS_X = "mac_os_x"
NAME_TO_PRETTY_NAMES = {
WINDOWS: "Windows",
MAC_OS_X: "Mac OS X",
CENTOS: "CentOS",
RHEL: "RedHat",
UBUNTU: "Ubuntu",
DEBIAN: "Debian",
}
_DIST_NAME_TO_NAME = {
"centos": CENTOS,
"redhat": RHEL,
"ubuntu": UBUNTU,
"debian": DEBIAN,
}
[docs]class Platform(HasTraits):
"""
An sane generic platform representation.
"""
os = Enum([WINDOWS, LINUX, DARWIN, SOLARIS])
"""
The most generic OS description
"""
name = Enum([WINDOWS, CENTOS, RHEL, DEBIAN, UBUNTU, MAC_OS_X, SOLARIS])
"""
The most specific platform description
"""
family = Enum([WINDOWS, RHEL, DEBIAN, MAC_OS_X, SOLARIS])
"""
The 'kind' of platforms. For example, both debian and ubuntu distributions
share the same kind, 'debian'.
"""
release = Unicode()
"""
The release string. May be empty
"""
arch = Instance(Arch)
"""
Actual architecture. The architecture is guessed from the running python.
"""
machine = Instance(Arch)
"""
The machine (e.g. 'x86'). This is the CPU architecture (e.g. a 32 bits
python running on 64 bits Intel OS will be 'amd64', whereas arch will be
'x86')
"""
@classmethod
[docs] def from_running_python(cls):
""" Guess the platform, using the running python to guess the
architecture.
"""
return _guess_platform()
@classmethod
[docs] def from_running_system(cls, arch_string=None):
""" Guess the platform, with an optional architecture string.
Parameters
----------
arch_string: str, None
If given, should be a valid architecture name (e.g. 'x86')
"""
return _guess_platform(arch_string)
def __init__(self, os, name, family, arch, machine=None, release=""):
super(Platform, self).__init__(os=os, name=name, family=family,
arch=arch, machine=machine,
release=release)
if machine is None:
self.machine = self.arch
def __str__(self):
return "{0} {1.release} on {1.machine}".format(
NAME_TO_PRETTY_NAMES[self.name],
self
)
def __eq__(self, other):
if not isinstance(other, self.__class__):
return False
else:
return (self.name == other.name and self.release == other.release
and self.arch == other.arch
and self.machine == other.machine)
def __ne__(self, other):
return not (self == other)
def __hash__(self):
return hash((self.name, self.release, self.arch, self.machine))
def _guess_os():
if sys.platform == "win32":
return WINDOWS
elif sys.platform == "darwin":
return DARWIN
elif sys.platform.startswith("linux"):
return LINUX
else:
msg = "Could not guess platform from sys.platform: {0!r}"
raise OkonomiyakiError(msg.format(sys.platform))
def _guess_platform_details(os):
if os == WINDOWS:
return WINDOWS, WINDOWS, platform.win32_ver()[0]
elif os == DARWIN:
return MAC_OS_X, MAC_OS_X, platform.mac_ver()[0]
elif os == LINUX:
name = platform.linux_distribution()[0].lower()
_, release, _ = platform.dist()
if name in (DEBIAN, UBUNTU):
family = DEBIAN
elif name in (CENTOS, RHEL):
family = RHEL
else:
raise OkonomiyakiError("Unsupported platform: {0!r}".format(name))
return name, family, release
def _guess_platform(arch_string=None):
if arch_string is None:
arch = Arch.from_running_python()
else:
arch = Arch.from_name(arch_string)
machine = Arch.from_running_system()
os = _guess_os()
name, family, release = _guess_platform_details(os)
return Platform(os=os, name=name, family=family, release=release,
arch=arch, machine=machine)