From 04eb74c231138474fc5156a8199ce21527739681 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 16 Feb 2020 16:02:04 +0000 Subject: [PATCH 1/3] CLN: show_versions --- pandas/util/_print_versions.py | 97 ++++++++++++++++------------------ 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/pandas/util/_print_versions.py b/pandas/util/_print_versions.py index fdfa436ce6536..c4900963e8544 100644 --- a/pandas/util/_print_versions.py +++ b/pandas/util/_print_versions.py @@ -6,19 +6,13 @@ import struct import subprocess import sys -from typing import List, Optional, Tuple, Union +from typing import Dict, Optional, Union +from pandas._typing import JSONSerializable from pandas.compat._optional import VERSIONS, _get_version, import_optional_dependency -def get_sys_info() -> List[Tuple[str, Optional[Union[str, int]]]]: - """ - Returns system information as a list - """ - blob: List[Tuple[str, Optional[Union[str, int]]]] = [] - - # get full commit hash - commit = None +def _get_full_commit_hash() -> Optional[str]: if os.path.isdir(".git") and os.path.isdir("pandas"): try: pipe = subprocess.Popen( @@ -31,36 +25,35 @@ def get_sys_info() -> List[Tuple[str, Optional[Union[str, int]]]]: pass else: if pipe.returncode == 0: - commit = so.decode("utf-8").strip().strip('"') - - blob.append(("commit", commit)) - - try: - (sysname, nodename, release, version, machine, processor) = platform.uname() - blob.extend( - [ - ("python", ".".join(map(str, sys.version_info))), - ("python-bits", struct.calcsize("P") * 8), - ("OS", f"{sysname}"), - ("OS-release", f"{release}"), - # FIXME: dont leave commented-out - # ("Version", f"{version}"), - ("machine", f"{machine}"), - ("processor", f"{processor}"), - ("byteorder", f"{sys.byteorder}"), - ("LC_ALL", f"{os.environ.get('LC_ALL', 'None')}"), - ("LANG", f"{os.environ.get('LANG', 'None')}"), - ("LOCALE", ".".join(map(str, locale.getlocale()))), - ] - ) - except (KeyError, ValueError): - pass + return so.decode("utf-8").strip().strip('"') + return None - return blob - -def show_versions(as_json=False): - sys_info = get_sys_info() +def _get_sys_info() -> Dict[str, Optional[JSONSerializable]]: + """ + Returns system information as a JSON serializable dictionary. + """ + uname_result = platform.uname() + return { + "commit": _get_full_commit_hash(), + "python": ".".join(str(i) for i in sys.version_info), + "python-bits": struct.calcsize("P") * 8, + "OS": uname_result.system, + "OS-release": uname_result.release, + "Version": uname_result.version, + "machine": uname_result.machine, + "processor": uname_result.processor, + "byteorder": sys.byteorder, + "LC_ALL": os.environ.get("LC_ALL"), + "LANG": os.environ.get("LANG"), + "LOCALE": list(locale.getlocale()), + } + + +def _get_dependency_info() -> Dict[str, Optional[JSONSerializable]]: + """ + Returns dependency information as a JSON serializable dictionary. + """ deps = [ "pandas", # required @@ -89,39 +82,43 @@ def show_versions(as_json=False): "IPython", "pandas_datareader", ] - deps.extend(list(VERSIONS)) - deps_blob = [] + result: Dict[str, Optional[JSONSerializable]] = {} for modname in deps: mod = import_optional_dependency( modname, raise_on_missing=False, on_version="ignore" ) - ver: Optional[str] - if mod: - ver = _get_version(mod) - else: - ver = None - deps_blob.append((modname, ver)) + result[modname] = _get_version(mod) if mod else None + return result + + +def show_versions(as_json: Union[str, bool] = False) -> None: + sys_info = _get_sys_info() + deps = _get_dependency_info() if as_json: - j = dict(system=dict(sys_info), dependencies=dict(deps_blob)) + j = dict(system=sys_info, dependencies=deps) if as_json is True: print(j) else: + assert isinstance(as_json, str) # needed for mypy with codecs.open(as_json, "wb", encoding="utf8") as f: json.dump(j, f, indent=2) else: + assert isinstance(sys_info["LOCALE"], list) # needed for mypy + sys_info["LOCALE"] = ".".join(str(i) for i in sys_info["LOCALE"]) + maxlen = max(len(x) for x in deps) print("\nINSTALLED VERSIONS") print("------------------") - for k, stat in sys_info: - print(f"{{k:<{maxlen}}}: {{stat}}") + for k, v in sys_info.items(): + print(f"{k:<{maxlen}}: {v}") print("") - for k, stat in deps_blob: - print(f"{{k:<{maxlen}}}: {{stat}}") + for k, v in deps.items(): + print(f"{k:<{maxlen}}: {v}") def main() -> int: From 08bcebd75eefdc0c4835bb0c95115782b00f2358 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 16 Feb 2020 16:35:14 +0000 Subject: [PATCH 2/3] LOCALE as dict --- pandas/util/_print_versions.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pandas/util/_print_versions.py b/pandas/util/_print_versions.py index c4900963e8544..586af7be99783 100644 --- a/pandas/util/_print_versions.py +++ b/pandas/util/_print_versions.py @@ -34,6 +34,7 @@ def _get_sys_info() -> Dict[str, Optional[JSONSerializable]]: Returns system information as a JSON serializable dictionary. """ uname_result = platform.uname() + language_code, encoding = locale.getlocale() return { "commit": _get_full_commit_hash(), "python": ".".join(str(i) for i in sys.version_info), @@ -46,7 +47,7 @@ def _get_sys_info() -> Dict[str, Optional[JSONSerializable]]: "byteorder": sys.byteorder, "LC_ALL": os.environ.get("LC_ALL"), "LANG": os.environ.get("LANG"), - "LOCALE": list(locale.getlocale()), + "LOCALE": {"language-code": language_code, "encoding": encoding}, } @@ -108,8 +109,10 @@ def show_versions(as_json: Union[str, bool] = False) -> None: json.dump(j, f, indent=2) else: - assert isinstance(sys_info["LOCALE"], list) # needed for mypy - sys_info["LOCALE"] = ".".join(str(i) for i in sys_info["LOCALE"]) + assert isinstance(sys_info["LOCALE"], dict) # needed for mypy + language_code = sys_info["LOCALE"]["language-code"] + encoding = sys_info["LOCALE"]["encoding"] + sys_info["LOCALE"] = f"{language_code}.{encoding}" maxlen = max(len(x) for x in deps) print("\nINSTALLED VERSIONS") From 2ac9d30f302e59de035cbea89188d5421212b000 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 16 Feb 2020 16:40:49 +0000 Subject: [PATCH 3/3] add None to JSONSerializable --- pandas/_typing.py | 2 +- pandas/util/_print_versions.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/_typing.py b/pandas/_typing.py index e2858441605f7..3b7392f781525 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -64,7 +64,7 @@ Label = Optional[Hashable] Level = Union[Label, int] Ordered = Optional[bool] -JSONSerializable = Union[PythonScalar, List, Dict] +JSONSerializable = Optional[Union[PythonScalar, List, Dict]] Axes = Collection # For functions like rename that convert one label to another diff --git a/pandas/util/_print_versions.py b/pandas/util/_print_versions.py index 586af7be99783..262720f04a66e 100644 --- a/pandas/util/_print_versions.py +++ b/pandas/util/_print_versions.py @@ -29,7 +29,7 @@ def _get_full_commit_hash() -> Optional[str]: return None -def _get_sys_info() -> Dict[str, Optional[JSONSerializable]]: +def _get_sys_info() -> Dict[str, JSONSerializable]: """ Returns system information as a JSON serializable dictionary. """ @@ -51,7 +51,7 @@ def _get_sys_info() -> Dict[str, Optional[JSONSerializable]]: } -def _get_dependency_info() -> Dict[str, Optional[JSONSerializable]]: +def _get_dependency_info() -> Dict[str, JSONSerializable]: """ Returns dependency information as a JSON serializable dictionary. """ @@ -85,7 +85,7 @@ def _get_dependency_info() -> Dict[str, Optional[JSONSerializable]]: ] deps.extend(list(VERSIONS)) - result: Dict[str, Optional[JSONSerializable]] = {} + result: Dict[str, JSONSerializable] = {} for modname in deps: mod = import_optional_dependency( modname, raise_on_missing=False, on_version="ignore"