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
« 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:
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
13from packaging.version import parse as version_parse
15from .utils import (uname, get_homedir, nativepath, unixpath,
16 log_warning, log_error)
17from .version import __version__, __release_version__
19larch_version = __version__
20larch_release_version = __release_version__
22# lists of recommended packages that are not installed by default
23# but may be installed if several of the larch apps are run.
25def pjoin(*args):
26 "simple join"
27 return nativepath(os.path.join(*args))
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])
38# set system-wide and local larch folders
39# user_larchdir = get_homedir() + '.larch' (#unix)
40# = get_homedir() + 'larch' (#win)
41home_dir = get_homedir()
43here, i_am = os.path.split(__file__)
44icondir = os.path.join(here, 'icons')
46user_larchdir = pjoin(home_dir, '.larch')
47if uname == 'win':
48 user_larchdir = unixpath(pjoin(home_dir, 'larch'))
50if 'LARCHDIR' in os.environ:
51 user_larchdir = nativepath(os.environ['LARCHDIR'])
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
61# initialization larch files to be run on startup
62init_files = [pjoin(user_larchdir, 'init.lar')]
64if 'LARCHSTARTUP' in os.environ:
65 startup = os.environ['LARCHSTARTUP']
66 if os.path.exists(startup):
67 init_files = [nativepath(startup)]
69# history file:
70history_file = pjoin(user_larchdir, 'history.lar')
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 }
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])
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])
102 make_dir(user_larchdir)
103 for fname, text in files.items():
104 write_file(pjoin(user_larchdir, fname), text)
106 for sdir, text in subdirs.items():
107 sdir = pjoin(user_larchdir, sdir)
108 make_dir(sdir)
109 write_file(pjoin(sdir, 'README'), text)
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"""
123def show_site_config():
124 "print stie_config"
125 print(site_config())
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()
138if __name__ == '__main__':
139 show_site_config()