parent
a0e1f48424
commit
59f2b49f64
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,185 @@
|
||||
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
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue