Mini Shell
# SPDX-License-Identifer: GPL-3.0-or-later
import re
from typing import Any
from gi.repository import Gio, GLib
def get_variant(data: Any) -> GLib.Variant:
if isinstance(data, str):
return GLib.Variant.new_string(data)
elif isinstance(data, int):
return GLib.Variant.new_int32(data)
elif isinstance(data, (list, tuple, set)):
variant_builder: GLib.VariantBuilder = GLib.VariantBuilder.new(GLib.VariantType.new('av'))
for value in data:
variant_builder.add_value(GLib.Variant.new_variant(get_variant(value)))
return variant_builder.end()
elif isinstance(data, dict):
variant_builder = GLib.VariantBuilder.new(GLib.VariantType.new('a{sv}'))
for key in data:
if data[key] is None:
continue
key_string = str(key)
variant_builder.add_value(
GLib.Variant.new_dict_entry(
get_variant(key_string), GLib.Variant.new_variant(get_variant(data[key]))
)
)
return variant_builder.end()
else:
raise Exception(f"Unknown data type: {type(data)}")
# https://wiki.gnome.org/Projects/GnomeShell/Extensions/UUIDGuidelines
def is_uuid(uuid: str):
return uuid is not None and re.match('[-a-zA-Z0-9@._]+$', uuid) is not None
def obtain_gio_settings(schema: str) -> Gio.Settings:
source: Gio.SettingsSchemaSource = Gio.SettingsSchemaSource.get_default()
if source is None:
raise Exception("No Gio.Settings schemas are installed")
if source.lookup(schema, True) is None:
raise Exception("Settings schema with id `{schema}` is missing")
return Gio.Settings.new(schema)