From afd89cd1a0f41bdfd0bf049e4245258abe7deffb Mon Sep 17 00:00:00 2001 From: Alec Leamas Date: Mon, 7 Sep 2015 13:36:30 +0200 Subject: [PATCH] tools: Add missing file lirc-setup/database.py. --- tools/Makefile.am | 3 +- tools/lirc-setup/database.py | 151 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 tools/lirc-setup/database.py diff --git a/tools/Makefile.am b/tools/Makefile.am index f3fd3c4..d0d820c 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -85,7 +85,8 @@ pkgpython_PYTHON = lirc-setup/mvc_control.py \ lirc-setup/mvc_view.py \ lirc-setup/mvc_model.py \ lirc-setup/choosers.py \ - lirc-setup/baseview.py + lirc-setup/baseview.py \ + lirc-setup/database.py dist_pkgpython_SCRIPTS = lirc-setup/lirc-setup dist_pkgpython_DATA = lirc-setup/lirc-setup.ui endif diff --git a/tools/lirc-setup/database.py b/tools/lirc-setup/database.py new file mode 100644 index 0000000..1c1e70b --- /dev/null +++ b/tools/lirc-setup/database.py @@ -0,0 +1,151 @@ +''' Simple lirc setup tool - database part. + +The database is loaded from some YAML files: + + - kernel-drivers.yaml: Info on the kernel drivers. + - drivers,yaml, Info on the uerspace drivers, collected from their + compiled information. + - confs_by_driver.yaml: Mapping of drivers -> suggested remote files, + created by irdb-get. + +The directory used to load these files is (first match used): + - Current directory + - The 'configs' dir. + - The ../../configs + +Although python cannot guarantee this, the database is designed to be a +read-only structure. + +''' + + +import glob +import os +import os.path +import sys + +YAML_MSG = ''' +"Cannot import the yaml library. Please install the python3 +yaml package, on many distributions known as python3-PyYAML. It is also +available as a pypi package at https://pypi.python.org/pypi/PyYAML.''' + +try: + import yaml +except ImportError: + print(YAML_MSG) + sys.exit(1) + + +def _here(path): + ''' Return path added to current dir for __file__. ''' + return os.path.join(os.path.dirname(os.path.abspath(__file__)), path) + + +class Config(object): + ''' The configuration selected, and it's sources. ''' + # pylint: disable=too-many-instance-attributes + + def __init__(self, config=None): + self.device = None # << selected device. + self.driver = {} # << Read-only driver dict in db + self.config = {} # << Read-only config dict in db + self.modinit = "" # << Substituted data from driver + self.modprobe = "" # << Substituted data from driver + self.lircd_conf = "" # << Name of lircd.conf file + self.lircmd_conf = "" # << Name of lircmd.conf file + self.label = "" # << Label for driver + device + if config: + for key, value in config.items(): + setattr(self, key, value) + + +class Database(object): + ''' Reflects the *.yaml files in the configs/ directory. ''' + + def __init__(self, path=None): + + if path and os.path.exists(path): + configdir = path + elif path: + raise FileNotFoundError(path) + elif os.path.exists(_here('configs')): + configdir = _here('configs') + elif os.path.exists(_here('../configs')): + configdir = _here('../configs') + else: + raise FileNotFoundError(configdir) + db = {} + with open(os.path.join(configdir, "confs_by_driver.yaml")) as f: + cf = yaml.load(f.read()) + db['lircd_by_driver'] = cf['lircd_by_driver'].copy() + db['lirmcd_by_driver'] = cf['lircmd_by_driver'].copy() + + with open(os.path.join(configdir, "kernel-drivers.yaml")) as f: + cf = yaml.load(f.read()) + db['kernel-drivers'] = cf['drivers'].copy() + db['drivers'] = cf['drivers'].copy() + with open(os.path.join(configdir, "drivers.yaml")) as f: + cf = yaml.load(f.read()) + db['drivers'].update(cf['drivers'].copy()) + for key, d in db['drivers'].items(): + d['id'] = key + + configs = {} + for path in glob.glob(configdir + '/*.conf'): + with open(path) as f: + cf = yaml.load(f.read()) + configs[cf['config']['id']] = cf['config'] + db['configs'] = configs + self.db = db + + @property + def kernel_drivers(self): + ''' The kernel-drivers dictionary, drivers.yaml + kernel-drivers.yaml. + ''' + return self.db['kernel-drivers'] + + @property + def drivers(self): + ''' The drivers dictionary, drivers.yaml + kernel-drivers.yaml. ''' + return self.db['drivers'] + + @property + def configs(self): + ''' Return dict of parsed config/*.conf files, keyd by id. ''' + return self.db['configs'] + + def remotes_by_driver(self, driver): + ''' Return the list of remotes suggested for a given driver. ''' + if isinstance(driver, dict): + driver = driver['id'] + try: + return self.db['lircd_by_driver'][driver] + except KeyError: + return [] + + def driver_by_remote(self, remote): + ''' Return the driver (possibly None) suggested for a remote. ''' + for driver, files in self.db['lircd_by_driver'].items(): + if remote in files: + return self.db['drivers'][driver] + return None + + def find_config(self, key, value): + ''' Return item (a config) in configs where config[key] == value. ''' + found = [c for c in self.db['configs'].values() + if key in c and c[key] == value] + if len(found) > 1: + print("find_config: not properly found %s, %s): " % (key, value) + + ', '.join([c['id'] for c in found])) + return None + elif not found: + print("find_config: Nothing found for %s, %s): " % (key, value)) + return None + found = dict(found[0]) + if 'device_hint' not in found: + found['device_hint'] = \ + self.db['drivers'][found['driver']]['device_hint'] + return found + + +# vim: set expandtab ts=4 sw=4: -- 2.4.2