5
5
import platform
6
6
import struct
7
7
import sys
8
- from typing import List , Optional , Tuple , Union
8
+ from typing import Dict , Optional , Union
9
9
10
+ from pandas ._typing import JSONSerializable
10
11
from pandas .compat ._optional import VERSIONS , _get_version , import_optional_dependency
11
12
12
13
@@ -21,43 +22,32 @@ def _get_commit_hash() -> Optional[str]:
21
22
return versions ["full-revisionid" ]
22
23
23
24
24
- def get_sys_info () -> List [ Tuple [ str , Optional [ Union [ str , int ]]] ]:
25
+ def _get_sys_info () -> Dict [ str , JSONSerializable ]:
25
26
"""
26
- Returns system information as a list
27
+ Returns system information as a JSON serializable dictionary.
28
+ """
29
+ uname_result = platform .uname ()
30
+ language_code , encoding = locale .getlocale ()
31
+ return {
32
+ "commit" : _get_commit_hash (),
33
+ "python" : "." .join (str (i ) for i in sys .version_info ),
34
+ "python-bits" : struct .calcsize ("P" ) * 8 ,
35
+ "OS" : uname_result .system ,
36
+ "OS-release" : uname_result .release ,
37
+ "Version" : uname_result .version ,
38
+ "machine" : uname_result .machine ,
39
+ "processor" : uname_result .processor ,
40
+ "byteorder" : sys .byteorder ,
41
+ "LC_ALL" : os .environ .get ("LC_ALL" ),
42
+ "LANG" : os .environ .get ("LANG" ),
43
+ "LOCALE" : {"language-code" : language_code , "encoding" : encoding },
44
+ }
45
+
46
+
47
+ def _get_dependency_info () -> Dict [str , JSONSerializable ]:
48
+ """
49
+ Returns dependency information as a JSON serializable dictionary.
27
50
"""
28
- blob : List [Tuple [str , Optional [Union [str , int ]]]] = []
29
-
30
- # get full commit hash
31
- commit = _get_commit_hash ()
32
-
33
- blob .append (("commit" , commit ))
34
-
35
- try :
36
- (sysname , nodename , release , version , machine , processor ) = platform .uname ()
37
- blob .extend (
38
- [
39
- ("python" , "." .join (map (str , sys .version_info ))),
40
- ("python-bits" , struct .calcsize ("P" ) * 8 ),
41
- ("OS" , f"{ sysname } " ),
42
- ("OS-release" , f"{ release } " ),
43
- # FIXME: dont leave commented-out
44
- # ("Version", f"{version}"),
45
- ("machine" , f"{ machine } " ),
46
- ("processor" , f"{ processor } " ),
47
- ("byteorder" , f"{ sys .byteorder } " ),
48
- ("LC_ALL" , f"{ os .environ .get ('LC_ALL' , 'None' )} " ),
49
- ("LANG" , f"{ os .environ .get ('LANG' , 'None' )} " ),
50
- ("LOCALE" , "." .join (map (str , locale .getlocale ()))),
51
- ]
52
- )
53
- except (KeyError , ValueError ):
54
- pass
55
-
56
- return blob
57
-
58
-
59
- def show_versions (as_json = False ):
60
- sys_info = get_sys_info ()
61
51
deps = [
62
52
"pandas" ,
63
53
# required
@@ -86,39 +76,45 @@ def show_versions(as_json=False):
86
76
"IPython" ,
87
77
"pandas_datareader" ,
88
78
]
89
-
90
79
deps .extend (list (VERSIONS ))
91
- deps_blob = []
92
80
81
+ result : Dict [str , JSONSerializable ] = {}
93
82
for modname in deps :
94
83
mod = import_optional_dependency (
95
84
modname , raise_on_missing = False , on_version = "ignore"
96
85
)
97
- ver : Optional [str ]
98
- if mod :
99
- ver = _get_version (mod )
100
- else :
101
- ver = None
102
- deps_blob .append ((modname , ver ))
86
+ result [modname ] = _get_version (mod ) if mod else None
87
+ return result
88
+
89
+
90
+ def show_versions (as_json : Union [str , bool ] = False ) -> None :
91
+ sys_info = _get_sys_info ()
92
+ deps = _get_dependency_info ()
103
93
104
94
if as_json :
105
- j = dict (system = dict ( sys_info ) , dependencies = dict ( deps_blob ) )
95
+ j = dict (system = sys_info , dependencies = deps )
106
96
107
97
if as_json is True :
108
98
print (j )
109
99
else :
100
+ assert isinstance (as_json , str ) # needed for mypy
110
101
with codecs .open (as_json , "wb" , encoding = "utf8" ) as f :
111
102
json .dump (j , f , indent = 2 )
112
103
113
104
else :
105
+ assert isinstance (sys_info ["LOCALE" ], dict ) # needed for mypy
106
+ language_code = sys_info ["LOCALE" ]["language-code" ]
107
+ encoding = sys_info ["LOCALE" ]["encoding" ]
108
+ sys_info ["LOCALE" ] = f"{ language_code } .{ encoding } "
109
+
114
110
maxlen = max (len (x ) for x in deps )
115
111
print ("\n INSTALLED VERSIONS" )
116
112
print ("------------------" )
117
- for k , stat in sys_info :
118
- print (f"{ k :<{maxlen }} : { stat } " )
113
+ for k , v in sys_info . items () :
114
+ print (f"{ k :<{maxlen }} : { v } " )
119
115
print ("" )
120
- for k , stat in deps_blob :
121
- print (f"{ k :<{maxlen }} : { stat } " )
116
+ for k , v in deps . items () :
117
+ print (f"{ k :<{maxlen }} : { v } " )
122
118
123
119
124
120
def main () -> int :
0 commit comments