Blob Blame History Raw
From afd89cd1a0f41bdfd0bf049e4245258abe7deffb Mon Sep 17 00:00:00 2001
From: Alec Leamas <leamas.alec@gmail.com>
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