commit 5c4c110e5d353be3f9651eb930ded4320b45948c
Author: Damian Johnson <atagar(a)torproject.org>
Date: Fri Aug 25 10:26:11 2017 -0700
Sqlite support for manual content
Adding support for using sqlite to persist manual content rather than our
config module.
---
stem/manual.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++---
test/unit/manual.py | 16 +++++++++++++--
2 files changed, 70 insertions(+), 5 deletions(-)
diff --git a/stem/manual.py b/stem/manual.py
index 66e0abf3..c61a73ea 100644
--- a/stem/manual.py
+++ b/stem/manual.py
@@ -327,6 +327,9 @@ class Manual(object):
# TODO: drop _from_config_cache() with stem 2.x
+ if path is None:
+ path = CACHE_PATH
+
if path is not None and path.endswith('.sqlite'):
return Manual._from_sqlite_cache(path)
else:
@@ -334,12 +337,38 @@ class Manual(object):
@staticmethod
def _from_sqlite_cache(path):
- pass
+ with sqlite3.connect(path) as conn:
+ cursor = conn.cursor()
+
+ cursor.execute('SELECT name, synopsis, description, man_commit, stem_commit FROM metadata')
+ name, synopsis, description, man_commit, stem_commit = cursor.fetchone()
+
+ cursor.execute('SELECT name, description FROM commandline')
+ commandline = dict(cursor.fetchall())
+
+ cursor.execute('SELECT name, description FROM signals')
+ signals = dict(cursor.fetchall())
+
+ cursor.execute('SELECT name, description FROM files')
+ files = dict(cursor.fetchall())
+
+ cursor.execute('SELECT name, category, usage, summary, description FROM torrc')
+ config_options = OrderedDict()
+
+ for entry in cursor.fetchall():
+ option, category, usage, summary, option_description = entry
+ config_options[option] = ConfigOption(option, category, usage, summary, option_description)
+
+ manual = Manual(name, synopsis, description, commandline, signals, files, config_options)
+ manual.man_commit = man_commit
+ manual.stem_commit = stem_commit
+
+ return manual
@staticmethod
def _from_config_cache(path):
conf = stem.util.conf.Config()
- conf.load(path if path else CACHE_PATH, commenting = False)
+ conf.load(path, commenting = False)
config_options = OrderedDict()
@@ -469,7 +498,31 @@ class Manual(object):
return self._save_as_config(path)
def _save_as_sqlite(self, path):
- pass
+ with sqlite3.connect(path + '.new') as conn:
+ conn.execute('CREATE TABLE metadata(name TEXT, synopsis TEXT, description TEXT, man_commit TEXT, stem_commit TEXT)')
+ conn.execute('CREATE TABLE commandline(name TEXT PRIMARY KEY, description TEXT)')
+ conn.execute('CREATE TABLE signals(name TEXT PRIMARY KEY, description TEXT)')
+ conn.execute('CREATE TABLE files(name TEXT PRIMARY KEY, description TEXT)')
+ conn.execute('CREATE TABLE torrc(name TEXT PRIMARY KEY, category TEXT, usage TEXT, summary TEXT, description TEXT)')
+
+ conn.execute('INSERT INTO metadata(name, synopsis, description, man_commit, stem_commit) VALUES (?,?,?,?,?)', (self.name, self.synopsis, self.description, self.man_commit, self.stem_commit))
+
+ for k, v in self.commandline_options.items():
+ conn.execute('INSERT INTO commandline(name, description) VALUES (?,?)', (k, v))
+
+ for k, v in self.signals.items():
+ conn.execute('INSERT INTO signals(name, description) VALUES (?,?)', (k, v))
+
+ for k, v in self.files.items():
+ conn.execute('INSERT INTO files(name, description) VALUES (?,?)', (k, v))
+
+ for v in self.config_options.values():
+ conn.execute('INSERT INTO torrc(name, category, usage, summary, description) VALUES (?,?,?,?,?)', (v.name, v.category, v.usage, v.summary, v.description))
+
+ if os.path.exists(path):
+ os.remove(path)
+
+ os.rename(path + '.new', path)
def _save_as_config(self, path):
conf = stem.util.conf.Config()
diff --git a/test/unit/manual.py b/test/unit/manual.py
index 0e6a50df..f025c1a1 100644
--- a/test/unit/manual.py
+++ b/test/unit/manual.py
@@ -189,9 +189,9 @@ class TestManual(unittest.TestCase):
self.assertEqual('Description of this new option.', option.description)
@test.require.command('man')
- def test_saving_manual(self):
+ def test_saving_manual_as_config(self):
"""
- Check that we can save and reload manuals.
+ Check that we can save and reload manuals as a config.
"""
manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH)
@@ -201,6 +201,18 @@ class TestManual(unittest.TestCase):
loaded_manual = stem.manual.Manual.from_cache(tmp.name)
self.assertEqual(manual, loaded_manual)
+ def test_saving_manual_as_sqlite(self):
+ """
+ Check that we can save and reload manuals as sqlite.
+ """
+
+ manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH)
+
+ with tempfile.NamedTemporaryFile(prefix = 'saved_test_manual.', suffix = '.sqlite') as tmp:
+ manual.save(tmp.name)
+ loaded_manual = stem.manual.Manual.from_cache(tmp.name)
+ self.assertEqual(manual, loaded_manual)
+
def test_cached_manual(self):
manual = _cached_manual()