22# Copyright (c) 2019. JetBrains s.r.o.
33# Use of this source code is governed by the MIT license that can be found in the LICENSE file.
44#
5+ import os
56from typing import Dict , Any
67
78from ._version import __version__
89
10+ # Public environment variables
11+ ENV_HTML_ISOLATED_FRAME = 'LETS_PLOT_HTML_ISOLATED_FRAME' # bool
12+ ENV_DEV_HTML_ISOLATED_FRAME = 'LETS_PLOT_DEV_HTML_ISOLATED_FRAME' # bool
13+ ENV_OFFLINE = 'LETS_PLOT_OFFLINE' # bool
14+ ENV_DEV_OFFLINE = 'LETS_PLOT_DEV_OFFLINE' # bool
15+
16+ HTML_ISOLATED_FRAME = 'html_isolated_frame'
17+
18+
19+ def _init_value (actual_name : str , def_val : Any ) -> Any :
20+ env_val = _get_env_val (actual_name )
21+ return env_val if env_val else def_val
22+
23+
24+ def _get_env_val (actual_name : str ) -> Any :
25+ env_name = "LETS_PLOT_{}" .format (actual_name .upper ())
26+ return os .environ .get (env_name )
27+
28+
929_settings = {
10- 'offline' : False , # default: download from CDN
30+ 'offline' : _init_value ( 'offline' , False ) , # default: download from CDN
1131 'js_base_url' : 'https://dl.bintray.com/jetbrains/lets-plot' ,
1232 'js_name' : '' , # default: lets-plot-<version>.min.js
1333
14- 'dev_offline' : True , # default: embed js into the notebook
34+ 'dev_offline' : _init_value ( 'dev_offline' , True ) , # default: embed js into the notebook
1535 'dev_js_base_url' : "http://0.0.0.0:8080" ,
1636 'dev_js_name' : '' # default: lets-plot-<version>.js
1737}
@@ -23,44 +43,58 @@ def apply(cls, settings: Dict):
2343 _settings .update (settings )
2444
2545
26- def _is_production () -> bool :
46+ def _to_actual_name (name : str ) -> str :
47+ if name .startswith ("dev_" ):
48+ return name
49+
50+ return name if is_production () else 'dev_' + name
51+
52+
53+ def _get_global_val_intern (actual_name : str ) -> Any :
54+ # `settings` dict has precedence over environment variables.
55+ env_val = _get_env_val (actual_name )
56+ return _settings .get (actual_name , env_val )
57+
58+
59+ def is_production () -> bool :
2760 return 'dev' not in __version__
2861
2962
30- def _has_global_value (name : str ) -> bool :
31- actual_name = name if _is_production () else 'dev_' + name
32- val = _settings [ actual_name ]
63+ def has_global_value (name : str ) -> bool :
64+ val = _get_global_val_intern ( _to_actual_name ( name ))
65+
3366 if isinstance (val , bool ):
3467 return True
3568 if isinstance (val , str ) and not val .strip ():
3669 return False
3770 return val
3871
3972
40- def _to_actual_name (name : str ) -> str :
41- if name .startswith ("dev_" ):
42- return name
43-
44- return name if _is_production () else 'dev_' + name
73+ def get_global_val (name : str ) -> Any :
74+ if not has_global_value (name ):
75+ raise ValueError ("Not defined '{}'" .format (_to_actual_name (name )))
4576
77+ return _get_global_val_intern (_to_actual_name (name ))
4678
47- def _get_global_val (name : str ) -> Any :
48- actual_name = _to_actual_name (name )
49- if not _has_global_value (name ):
50- raise ValueError ("Not defined '{}'" .format (actual_name ))
5179
52- return _settings [actual_name ]
53-
54-
55- def _get_global_str (name : str ) -> str :
56- val = _get_global_val (name )
80+ def get_global_str (name : str ) -> str :
81+ val = get_global_val (name )
5782 if not isinstance (val , str ):
5883 raise ValueError ("Not string value: ['{}'] : {}" .format (_to_actual_name (name ), type (val )))
5984 return val
6085
6186
62- def _get_global_bool (name : str ) -> bool :
63- val = _get_global_val (name )
64- if not isinstance (val , bool ):
65- raise ValueError ("Not boolean value: ['{}'] : {}" .format (_to_actual_name (name ), type (val )))
66- return val
87+ def get_global_bool (name : str ) -> bool :
88+ val = get_global_val (name )
89+ if isinstance (val , bool ):
90+ return val
91+
92+ if isinstance (val , str ):
93+ if val .lower () in ['true' , '1' , 't' , 'y' , 'yes' ]:
94+ return True
95+ elif val .lower () in ['false' , '0' , 'f' , 'n' , 'no' ]:
96+ return False
97+ else :
98+ raise ValueError ("Can't convert str to boolean : ['{}'] : {}" .format (_to_actual_name (name ), val ))
99+
100+ raise ValueError ("Not boolean value: ['{}'] : {}" .format (_to_actual_name (name ), type (val )))
0 commit comments