Coverage for /Users/Newville/Codes/xraylarch/larch/site_config.py: 63%

71 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2023-11-09 10:08 -0600

1#!/usr/bin/env python 

2""" 

3site configuration for larch: 

4 

5 init_files: list of larch files run (in order) on startup 

6 history_file: 

7""" 

8import sys 

9import os 

10import importlib.metadata 

11from subprocess import check_call, CalledProcessError, TimeoutExpired 

12 

13from packaging.version import parse as version_parse 

14 

15from .utils import (uname, get_homedir, nativepath, unixpath, 

16 log_warning, log_error) 

17from .version import __version__, __release_version__ 

18 

19larch_version = __version__ 

20larch_release_version = __release_version__ 

21 

22# lists of recommended packages that are not installed by default 

23# but may be installed if several of the larch apps are run. 

24 

25def pjoin(*args): 

26 "simple join" 

27 return nativepath(os.path.join(*args)) 

28 

29def update_larch(with_larix=True): 

30 "pip upgrade larch" 

31 target = 'xraylarch' 

32 if with_larix: 

33 target = 'xraylarch\[larix\]' 

34 check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', target]) 

35 

36 

37 

38# set system-wide and local larch folders 

39# user_larchdir = get_homedir() + '.larch' (#unix) 

40# = get_homedir() + 'larch' (#win) 

41home_dir = get_homedir() 

42 

43here, i_am = os.path.split(__file__) 

44icondir = os.path.join(here, 'icons') 

45 

46user_larchdir = pjoin(home_dir, '.larch') 

47if uname == 'win': 

48 user_larchdir = unixpath(pjoin(home_dir, 'larch')) 

49 

50if 'LARCHDIR' in os.environ: 

51 user_larchdir = nativepath(os.environ['LARCHDIR']) 

52 

53# on Linux, check for HOME/.local/share, 

54# make with mode=711 if needed 

55if uname in ('linux', 'darwin') and os.getuid() > 0: 

56 lshare = os.path.join(home_dir, '.local', 'share') 

57 if not os.path.exists(lshare): 

58 os.makedirs(lshare, mode=457) # for octal 711 

59 

60 

61# initialization larch files to be run on startup 

62init_files = [pjoin(user_larchdir, 'init.lar')] 

63 

64if 'LARCHSTARTUP' in os.environ: 

65 startup = os.environ['LARCHSTARTUP'] 

66 if os.path.exists(startup): 

67 init_files = [nativepath(startup)] 

68 

69# history file: 

70history_file = pjoin(user_larchdir, 'history.lar') 

71 

72def make_user_larchdirs(): 

73 """create user's larch directories""" 

74 files = {'init.lar': 'put custom startup larch commands:', 

75 'history.lar': 'history of commands for larch CLI', 

76 'history_larchgui.lar': 'history of commands for larch GUI', 

77 } 

78 subdirs = {'matplotlib': 'matplotlib may put cache files here', 

79 'feff': 'Feff files and subfolders here', 

80 'fdmnes': 'FDMNES files and subfolders here', 

81 } 

82 

83 def make_dir(dname): 

84 "create directory" 

85 if not os.path.exists(dname): 

86 try: 

87 os.mkdir(dname, mode=493) 

88 except PermissionError: 

89 log_warning(f'no permission to create directory {dname}') 

90 except (OSError, TypeError): 

91 log_error(sys.exc_info()[1]) 

92 

93 def write_file(fname, text): 

94 "write wrapper" 

95 if not os.path.exists(fname): 

96 try: 

97 with open(fname, 'w', encoding=sys.getdefaultencoding()) as fileh: 

98 fileh.write(f'# {text}\n') 

99 except IOError: 

100 log_error(sys.exc_info()[1]) 

101 

102 make_dir(user_larchdir) 

103 for fname, text in files.items(): 

104 write_file(pjoin(user_larchdir, fname), text) 

105 

106 for sdir, text in subdirs.items(): 

107 sdir = pjoin(user_larchdir, sdir) 

108 make_dir(sdir) 

109 write_file(pjoin(sdir, 'README'), text) 

110 

111 

112def site_config(): 

113 "retutn string of site config" 

114 return f"""#== Larch Configuration: 

115 Release version: {__release_version__} 

116 Development version: {__version__} 

117 Python executable: {sys.executable} 

118 User larch dir: {user_larchdir} 

119 User history_file: {history_file} 

120#======================== 

121""" 

122 

123def show_site_config(): 

124 "print stie_config" 

125 print(site_config()) 

126 

127def system_settings(): 

128 """set system-specific Environmental Variables, and make sure 

129 that the user larchdirs exist. 

130 This is run by the interpreter on startup.""" 

131 # ubuntu / unity hack 

132 if uname.startswith('linux'): 

133 if 'ubuntu' in os.uname()[3].lower(): 

134 os.environ['UBUNTU_MENUPROXY'] = '0' 

135 make_user_larchdirs() 

136 

137 

138if __name__ == '__main__': 

139 show_site_config()