[tor-commits] [stem/master] Sqlite support for manual content

atagar at torproject.org atagar at torproject.org
Fri Aug 25 20:32:14 UTC 2017


commit 5c4c110e5d353be3f9651eb930ded4320b45948c
Author: Damian Johnson <atagar at 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()
 





More information about the tor-commits mailing list