# -*- coding: utf-8 -*-
"""Version information for PyKEEN."""
import os
import sys
from functools import lru_cache
from subprocess import CalledProcessError, check_output # noqa: S404
from typing import Optional
__all__ = [
'VERSION',
'get_version',
'get_git_hash',
'get_git_branch',
'env',
]
VERSION = '1.5.0'
[docs]@lru_cache(maxsize=2)
def get_git_hash(terse: bool = True) -> str:
"""Get the PyKEEN git hash.
:return:
The git hash, equals 'UNHASHED' if encountered CalledProcessError, signifying that the
code is not installed in development mode.
"""
rv = _run('git', 'rev-parse', 'HEAD')
if rv is None:
return 'UNHASHED'
if terse:
return rv[:8]
return rv
[docs]@lru_cache(maxsize=1)
def get_git_branch() -> Optional[str]:
"""Get the PyKEEN branch, if installed from git in editable mode.
:return:
Returns the name of the current branch, or None if not installed in development mode.
"""
return _run('git', 'branch', '--show-current')
def _run(*args: str) -> Optional[str]:
with open(os.devnull, 'w') as devnull:
try:
ret = check_output( # noqa: S603,S607
args,
cwd=os.path.dirname(__file__),
stderr=devnull,
)
except CalledProcessError:
return None
else:
return ret.strip().decode('utf-8')
[docs]def get_version(with_git_hash: bool = False) -> str:
"""Get the PyKEEN version string, including a git hash.
:param with_git_hash:
If set to True, the git hash will be appended to the version.
:return: The PyKEEN version as well as the git hash, if the parameter with_git_hash was set to true.
"""
return f'{VERSION}-{get_git_hash(terse=True)}' if with_git_hash else VERSION
def env_table(tablefmt='github', headers=('Key', 'Value')) -> str:
"""Generate a table describing the environment in which PyKEEN is being run."""
import torch
import platform
from tabulate import tabulate
import getpass
import time
rows = [
('OS', os.name),
('Platform', platform.system()),
('Release', platform.release()),
('User', getpass.getuser()),
('Time', str(time.asctime())),
('Python', f'{sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]}'),
('PyKEEN', get_version()),
('PyKEEN Hash', get_git_hash()),
('PyKEEN Branch', get_git_branch()),
('PyTorch', torch.__version__),
('CUDA Available?', str(torch.cuda.is_available()).lower()),
('CUDA Version', torch.version.cuda or 'N/A'),
('cuDNN Version', torch.backends.cudnn.version() or 'N/A'),
]
return tabulate(rows, tablefmt=tablefmt, headers=headers)
def env_html():
"""Output the environment table as HTML for usage in Jupyter."""
from IPython.display import HTML
return HTML(env_table(tablefmt='html'))
[docs]def env(file=None):
"""Print the env or output as HTML if in Jupyter.
:param: The file to print to if not in a Jupyter setting. Defaults to sys.stdout
:returns: A :class:`IPython.display.HTML` if in a Jupyter notebook setting, otherwise none.
"""
if _in_jupyter():
return env_html()
else:
print(env_table(), file=file)
def _in_jupyter() -> bool:
try:
get_ipython = sys.modules['IPython'].get_ipython # type: ignore
if 'IPKernelApp' not in get_ipython().config:
raise ImportError("console")
if 'VSCODE_PID' in os.environ:
raise ImportError("vscode")
except Exception:
return False
else:
return True
if __name__ == '__main__':
print(get_version(with_git_hash=True))