Files
deskflow/scripts/lib/config.py
Chris Rizzitello ed1217e9cc Use Deskflow Name (#7519)
* Use Deskflow Name

* Remove business-oriented options from issue templates

* Remove business-oriented workflow

* Bump version to 3.0.0 (to avoid confusion with previously used version numbers 1.x & 2.x)

* Update readme to reflect new project name and goals

* Found some more "synergy" to rename

* Rename `synlib` to `app`

* Rename `syntool` to `deskflow-legacy`

* Rename `synwinhk` to `dfwhook`

* Rename dirs from synergy to deskflow

* Rename more "Synergy" files

* Rename app bundle ID

* Fixed copyright typo

* Rename only title in serial key dialog (to be moved downstream later)

* Preserve original serial key window for moving downstream

* Restore dialogs ready for moving downstream

* Rename `QDeskflowApplication` to `DeskflowApplication` (the Q is confusing)

* Restore Volker's original project name

* Fixed mimetype

* Fixed weird grammar

* Fixed (more) weird grammar

* Broken link, restoring (but we should move all links out of source)

* Broken link, restoring (but we should move all links out of source)

* Add write permission to valgrind-analysis.yml

* Restore AUR conflicts

* Apply Clang format

* Update ChangeLog

* Back out version change

---------

Co-authored-by: Nick Bolton <nick@symless.com>
2024-09-17 20:00:25 +01:00

130 lines
4.6 KiB
Python

# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import yaml
import lib.env as env
import lib.cmd_utils as cmd_utils
config_file = "config.yaml"
root_key = "config"
deps_key = "dependencies"
command_key = "command"
command_pre_key = "command-pre"
subprojects_key = "subprojects"
arrow = ""
class ConfigKeyError(RuntimeError):
def __init__(self, config_file, key):
self.config_file = config_file
self.key = key
def __str__(self):
return f"Not found in {self.config_file}: {self.key}"
def _get(dict, key, key_parent=None, required=True):
value = dict.get(key)
if required and not value:
key_path = f"{root_key}{arrow}{key_parent}{arrow}{key}" if key_parent else key
raise ConfigKeyError(config_file, key_path)
return value
class Config:
"""Reads the project configuration YAML file."""
def __init__(self):
with open(config_file, "r") as f:
data = yaml.safe_load(f)
self.os_name = env.get_os()
print("Config for OS:", self.os_name)
self.root = _get(data, root_key)
self.os = _get(self.root, self.os_name)
def get_os_value(self, key, required=True, linux_distro=None):
if linux_distro:
# recurse with the linux distro as the key parameter to get the base distro key.
distro = self.get_os_value(key=linux_distro)
return _get(distro, key, f"{self.os_name}{arrow}{linux_distro}", required)
else:
return _get(self.os, key, self.os_name, required)
def get_qt_config(self):
qt_key = "qt"
qt = self.get_os_deps_value(qt_key)
parent_key = f"{self.os_name}{arrow}{deps_key}"
mirror_url = _get(qt, "mirror", parent_key)
version = _get(qt, "version", parent_key)
base_dir = _get(qt, "base-dir", parent_key)
modules = _get(qt, "modules", parent_key, required=False)
return mirror_url, version, base_dir, modules
def get_os_deps_value(self, key, required=True, linux_distro=None):
deps = self.get_os_value(deps_key, required, linux_distro)
if linux_distro:
key_parent = f"{self.os_name}{arrow}{linux_distro}{arrow}{deps_key}"
else:
key_parent = f"{self.os_name}{arrow}{deps_key}"
return _get(deps, key, key_parent, required)
def get_os_deps_command(self, key=command_key, required=True, linux_distro=None):
command = self.get_os_deps_value(key, required, linux_distro)
if command:
return cmd_utils.strip_continuation_sequences(command)
else:
return None
def get_os_subprojects(self):
distro, _distro_like, _distro_version = env.get_linux_distro()
return self.get_os_value(subprojects_key, linux_distro=distro, required=False)
def get_subproject_deps_command(self, subproject_name):
subprojects = _get(self.root, subprojects_key)
subproject = _get(subprojects, subproject_name, subprojects_key)
deps_parent = f"{subprojects_key}{arrow}{subproject_name}"
deps = _get(subproject, deps_key, deps_parent)
if env.is_linux():
distro, _distro_like, _distro_version = env.get_linux_distro()
if not distro:
raise RuntimeError("Unable to detect Linux distro")
command = _get(deps, distro, f"{deps_parent}{arrow}{deps_key}")
else:
command = _get(deps, self.os_name, f"{deps_parent}{arrow}{deps_key}")
return cmd_utils.strip_continuation_sequences(command)
def get_os_deps_command_pre(self, required=True, linux_distro=None):
return self.get_os_deps_command(command_pre_key, required, linux_distro)
def get_windows_ci_config(self):
choco_ci_key = "ci"
choco_ci = self.get_os_deps_value(choco_ci_key)
choco_ci_path = f"{self.os_name}{arrow}{deps_key}{arrow}{choco_ci_key}"
edit_config = _get(choco_ci, "edit-config", choco_ci_path)
skip_packages = _get(choco_ci, "skip-packages", choco_ci_path)
return edit_config, skip_packages