Source code for schrodinger.utils.platform
import sys
import inflect
# The values are same as what is returned by sys.platform in version 3.6
# See https://docs.python.org/3/library/sys.html#sys.platform
LINUX = 'linux'
WINDOWS = 'win32'
DARWIN = 'darwin'
_PLATFORM_DISPLAY_NAME = {LINUX: 'Linux', WINDOWS: 'Windows', DARWIN: 'Mac'}
[docs]def validate_localhost_platform_compatibility(compatible_platforms):
    """
    :param compatible_platforms: Compatible platforms. Use LINUX, WINDOWS or
            DARWIN as values for platforms.
    :type compatible_platforms: list[str]
    :raises ValueError: If a value in `compatible_platforms` is not LINUX,
            WINDOWS or DARWIN.
    :return: Whether the localhost's platform is in `compatible_platforms`.
            Also returns a non empty message if platform is incompatible. The
            return value can be used directly with af2 validators and task
            preprocessors.
    :rtype: tuple(bool, str)
    """
    if is_localhost_platform_compatible(compatible_platforms):
        return True, ''
    return False, _get_platform_incompatibility_message(compatible_platforms)
[docs]def is_localhost_platform_compatible(compatible_platforms):
    """
    :param compatible_platforms: Compatible platforms. Use LINUX, WINDOWS or
            DARWIN as values for platforms.
    :type compatible_platforms: list[str]
    :raises ValueError: If a value in `compatible_platforms` is not LINUX,
            WINDOWS or DARWIN.
    :return: Whether the localhost's platform is compatible.
    :rtype: bool
    """
    unknown_platforms = [
        platform for platform in compatible_platforms
        if platform not in (LINUX, WINDOWS, DARWIN)
    ]
    if unknown_platforms:
        platform_str = inflect.engine().plural('platform',
                                               len(unknown_platforms))
        msg = f"Unknown compatible {platform_str} - {', '.join(unknown_platforms)}"
        raise ValueError(msg)
    # We use the 'startswith' idiom to ensure backward compatibility as
    # sys.platform also returned the major version previously.
    # See https://docs.python.org/3/library/sys.html#sys.platform
    return any([
        sys.platform.startswith(platform) for platform in compatible_platforms
    ])
def _get_platform_incompatibility_message(compatible_platforms):
    """
    :param compatible_platforms: Compatible platforms.
    :type compatible_platforms: list[str]
    :return: Platform incompatibility message.
    :rtype: str
    """
    compatible_platforms_str = ' or a '.join([
        _PLATFORM_DISPLAY_NAME[platform]
        if platform in _PLATFORM_DISPLAY_NAME else platform
        for platform in compatible_platforms
    ])
    return (f"The requested job requires a {compatible_platforms_str} "
            "host. If your installation has been configured to include a "
            f"{compatible_platforms_str} server, select that machine "
            "from the Host list in Job Settings before launching the job.")