101 lines
2.5 KiB
Python
101 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
import re
|
|
from shutil import copyfile
|
|
from pathlib import Path
|
|
import os
|
|
from configparser import ConfigParser
|
|
from importlib.resources import path as resource_path
|
|
|
|
from nmreval.configs import config_paths
|
|
from nmreval.lib.logger import logger
|
|
|
|
|
|
def make_starter(app_file: str | None):
|
|
if app_file is not None:
|
|
make_starter_appimage(Path(app_file))
|
|
else:
|
|
make_starter_src()
|
|
|
|
|
|
def make_starter_appimage(app_file: Path):
|
|
new_path = Path.home() / '.local' / 'bin'
|
|
|
|
if not new_path.exists():
|
|
new_path.mkdir(parents=True)
|
|
|
|
new_path /= app_file.name
|
|
|
|
if app_file != new_path:
|
|
app_file.rename(new_path)
|
|
|
|
create_desktop_file(new_path)
|
|
|
|
|
|
def make_starter_src():
|
|
home = Path.home()
|
|
p = Path.home()
|
|
for p in Path(__file__).parents:
|
|
if p.stem == 'src':
|
|
break
|
|
elif p == home:
|
|
break
|
|
|
|
success = p != Path.home()
|
|
if success:
|
|
bin_path = p.with_name('bin') / 'evaluate.py'
|
|
success = bin_path.exists()
|
|
|
|
if not success:
|
|
logger.warning('Location of evaluate.py could not be determined')
|
|
return False
|
|
|
|
create_desktop_file(bin_path)
|
|
|
|
|
|
def create_desktop_file(new_path: Path):
|
|
logo_path = config_paths() / 'logo.png'
|
|
if not logo_path.exists():
|
|
with resource_path('resources', 'logo.png') as fp:
|
|
copyfile(fp, logo_path)
|
|
desktop_entry = f"""\
|
|
[Desktop Entry]
|
|
Name=NMReval
|
|
Comment=Best program ever (maybe)
|
|
Exec={new_path}
|
|
Icon={logo_path}
|
|
Type=Application
|
|
Terminal=false
|
|
Categories=Science;NumericalAnalysis;Physics;DataVisualization;Other;
|
|
NoDisplay=false
|
|
"""
|
|
file_name = 'pkm.vogel.nmreval.desktop'
|
|
with Path('~/.local/share/applications/', file_name).expanduser().open('w') as f:
|
|
f.write(desktop_entry)
|
|
|
|
desktop_dir = get_xkg_user_dirs('desktop')
|
|
if desktop_dir is not None:
|
|
desk_file = Path(desktop_dir, file_name)
|
|
with desk_file.open('w') as f:
|
|
f.write(desktop_entry)
|
|
|
|
desk_file.chmod(0o755)
|
|
|
|
|
|
def get_xkg_user_dirs(dir_type: str) -> str | None:
|
|
xdg_conf_home = os.getenv('XDG_CONFIG_HOME') or str(Path.home() / '.config')
|
|
|
|
with Path(xdg_conf_home, 'user-dirs.dirs').open('r') as f:
|
|
conf_string = '[XDG_USER_DIRS]\n' + f.read()
|
|
conf_string = re.sub(r'\$HOME', str(Path.home()), conf_string)
|
|
conf_string = re.sub('"', '', conf_string)
|
|
|
|
config = ConfigParser()
|
|
config.read_string(conf_string)
|
|
|
|
return config['XDG_USER_DIRS'].get(f'xdg_{dir_type}_dir')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
make_starter()
|