[geneagrapher] 210/226: Enable caching in end-to-end usage.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Sat Jul 11 17:11:12 UTC 2015


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch master
in repository geneagrapher.

commit 6521504453eee07f75623917d3f1ae9791fa1308
Author: David Alber <alber.david at gmail.com>
Date:   Sat Dec 31 07:37:25 2011 -0800

    Enable caching in end-to-end usage.
    
    This change adds command-line arguments for enabling the local
    cache and for setting the cache file name.
    
    This changeset is a component of #8.
---
 src/geneagrapher/geneagrapher.py                |  27 ++++++-
 tests/geneagrapher/test_geneagrapher_methods.py |  96 ++++++++++++++++++------
 tests/geneagrapher/testdata/end-to-end-30484    | Bin 0 -> 12288 bytes
 3 files changed, 97 insertions(+), 26 deletions(-)

diff --git a/src/geneagrapher/geneagrapher.py b/src/geneagrapher/geneagrapher.py
index 999bb34..7dae923 100644
--- a/src/geneagrapher/geneagrapher.py
+++ b/src/geneagrapher/geneagrapher.py
@@ -2,6 +2,7 @@ from argparse import ArgumentParser
 from collections import deque
 import pkg_resources
 import sys
+from cache_grabber import CacheGrabber
 from graph import Graph
 from grabber import Grabber
 
@@ -18,6 +19,8 @@ class Geneagrapher:
         self.get_descendants = False
         self.verbose = False
         self.write_filename = None
+        self.use_cache = False
+        self.cache_file = 'geneacache'
 
     def parse_input(self):
         """
@@ -45,6 +48,13 @@ in graph")
                                  default=False,
                                  help="retrieve descendants of IDs and \
 include in graph")
+        self.parser.add_argument('-c', '--cache', action='store_true',
+                                 dest='use_cache', default=False,
+                                 help='store records in local cache')
+        self.parser.add_argument('--cache-file', dest='cache_file',
+                                 help='write cache to FILE [default: \
+geneacache]',
+                                 metavar='FILE', default='geneacache')
         self.parser.add_argument("-v", "--verbose", action="store_true",
                                  dest="verbose", default=False,
                                  help="list nodes being retrieved")
@@ -57,6 +67,8 @@ include in graph")
         self.get_descendants = args.get_descendants
         self.verbose = args.verbose
         self.write_filename = args.filename
+        self.use_cache = args.use_cache
+        self.cache_file = args.cache_file
         self.seed_ids = [int(arg) for arg in args.ids]
 
     def build_graph_portion(self, grab_queue, is_seed, grabber, **kwargs):
@@ -86,7 +98,7 @@ include in graph")
                 if self.get_descendants and 'descendant_queue' in kwargs:
                     kwargs['descendant_queue'].extend(descendants)
 
-    def build_graph(self, record_grabber=Grabber, **kwargs):
+    def build_graph_complete(self, record_grabber=Grabber, **kwargs):
         """
         Populate the graph member by grabbing the mathematician
         pages and extracting relevant data.
@@ -110,6 +122,15 @@ include in graph")
                 self.build_graph_portion(descendant_queue, False, grabber,
                                          descendant_queue=descendant_queue)
 
+    def build_graph(self):
+        """Call the graph builder method with the correct arguments, based
+        on the command-line arguments."""
+        if self.use_cache:
+            record_grabber = CacheGrabber
+        else:
+            record_grabber = Grabber
+        self.build_graph_complete(record_grabber, filename=self.cache_file)
+
     def generate_dot_file(self):
         dotfile = self.graph.generate_dot_file(self.get_ancestors,
                                                self.get_descendants)
@@ -122,10 +143,10 @@ include in graph")
             print dotfile,
 
 
-def ggrapher(record_grabber=Grabber):
+def ggrapher():
     """Function to run the Geneagrapher. This is the function called when
     the ggrapher script is run."""
     ggrapher = Geneagrapher()
     ggrapher.parse_input()
-    ggrapher.build_graph(record_grabber)
+    ggrapher.build_graph()
     ggrapher.generate_dot_file()
diff --git a/tests/geneagrapher/test_geneagrapher_methods.py b/tests/geneagrapher/test_geneagrapher_methods.py
index 2267c2e..1c4f6d1 100644
--- a/tests/geneagrapher/test_geneagrapher_methods.py
+++ b/tests/geneagrapher/test_geneagrapher_methods.py
@@ -21,6 +21,8 @@ class TestGeneagrapherMethods(unittest.TestCase):
         self.assertEqual(self.ggrapher.get_descendants, False)
         self.assertEqual(self.ggrapher.verbose, False)
         self.assertEqual(self.ggrapher.write_filename, None)
+        self.assertEqual(self.ggrapher.use_cache, False)
+        self.assertEqual(self.ggrapher.cache_file, 'geneacache')
 
     def test_parse_empty(self):
         """Test parse_input() with no arguments."""
@@ -32,7 +34,9 @@ class TestGeneagrapherMethods(unittest.TestCase):
         sys.stderr = stderr_intercept
 
         expected = """usage: geneagrapher [-h] [--version] [-f FILE] [-a] \
-[-d] [-v] ID [ID ...]
+[-d] [-c]
+                    [--cache-file FILE] [-v]
+                    ID [ID ...]
 geneagrapher: error: too few arguments
 """
         try:
@@ -54,34 +58,41 @@ geneagrapher: error: too few arguments
         self.assertEqual(self.ggrapher.get_descendants, False)
         self.assertEqual(self.ggrapher.verbose, False)
         self.assertEqual(self.ggrapher.write_filename, None)
+        self.assertEqual(self.ggrapher.use_cache, False)
+        self.assertEqual(self.ggrapher.cache_file, 'geneacache')
         self.assertEqual(self.ggrapher.seed_ids, [3])
 
     def test_parse_options(self):
         """Test parse_input() with options."""
         sys.argv = ['geneagrapher', '--with-ancestors', '--with-descendants',
-                    '--file=filler', '--verbose', '3', '43']
+                    '--file=filler', '--verbose', '--cache', '--cache-file',
+                    'foo', '3', '43']
         self.ggrapher.parse_input()
         self.assertEqual(self.ggrapher.get_ancestors, True)
         self.assertEqual(self.ggrapher.get_descendants, True)
         self.assertEqual(self.ggrapher.verbose, True)
         self.assertEqual(self.ggrapher.write_filename, "filler")
+        self.assertEqual(self.ggrapher.use_cache, True)
+        self.assertEqual(self.ggrapher.cache_file, 'foo')
         self.assertEqual(self.ggrapher.seed_ids, [3, 43])
 
     def test_parse_short_options(self):
         """Test parse_input() with short versions of the options."""
-        sys.argv = ['geneagrapher', '-a', '-d', '-f', 'filler', '-v', '3',
-                    '43']
+        sys.argv = ['geneagrapher', '-a', '-d', '-f', 'filler', '-v', '-c',
+                    '3', '43']
         self.ggrapher.parse_input()
         self.assertEqual(self.ggrapher.get_ancestors, True)
         self.assertEqual(self.ggrapher.get_descendants, True)
         self.assertEqual(self.ggrapher.verbose, True)
         self.assertEqual(self.ggrapher.write_filename, "filler")
+        self.assertEqual(self.ggrapher.use_cache, True)
+        self.assertEqual(self.ggrapher.cache_file, 'geneacache')
         self.assertEqual(self.ggrapher.seed_ids, [3, 43])
 
-    def test_build_graph_only_self(self):
+    def test_build_graph_complete_only_self(self):
         """Graph building with no ancestors or descendants."""
         self.ggrapher.seed_ids.append(127946)
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
         graph = self.ggrapher.graph
         self.assertEqual(len(graph), 1)
         self.assertTrue(127946 in graph)
@@ -96,10 +107,11 @@ geneagrapher: error: too few arguments
         self.assertEqual(record.year, 1672)
         self.assertEqual(record.id, 127946)
 
-    def test_build_graph_only_self_verbose_cache_grabber(self):
+    def test_build_graph_complete_only_self_verbose_cache_grabber(self):
         """Graph building with no ancestors or descendants using the cache
         grabber to verify its verbose printing."""
         self.ggrapher.verbose = True
+        self.ggrapher.use_cache = True
         self.ggrapher.seed_ids.append(127946)
 
         # Redirect stdout to capture output.
@@ -108,13 +120,13 @@ geneagrapher: error: too few arguments
         sys.stdout = stdout_intercept
         cache_fname = LocalDataGrabber.data_file(
             'geneagrapher_verbose_cache_grabber_test')
-        self.ggrapher.build_graph(CacheGrabber, filename=cache_fname)
+        self.ggrapher.build_graph_complete(CacheGrabber, filename=cache_fname)
         sys.stdout = stdout
 
         self.assertEqual(stdout_intercept.getvalue().decode('utf-8'),
                          u"Grabbing record #127946...cache hit\n")
 
-    def test_build_graph_only_self_verbose(self):
+    def test_build_graph_complete_only_self_verbose(self):
         """Graph building with no ancestors or descendants."""
         self.ggrapher.verbose = True
         self.ggrapher.seed_ids.append(127946)
@@ -123,7 +135,7 @@ geneagrapher: error: too few arguments
         stdout = sys.stdout
         stdout_intercept = StringIO.StringIO()
         sys.stdout = stdout_intercept
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
         sys.stdout = stdout
 
         graph = self.ggrapher.graph
@@ -143,11 +155,11 @@ geneagrapher: error: too few arguments
         self.assertEqual(stdout_intercept.getvalue().decode('utf-8'),
                          u"Grabbing record #127946...\n")
 
-    def test_build_graph_with_ancestors(self):
+    def test_build_graph_complete_with_ancestors(self):
         """Graph building with ancestors."""
         self.ggrapher.seed_ids.append(127946)
         self.ggrapher.get_ancestors = True
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
         graph = self.ggrapher.graph
         self.assertEqual(len(graph), 4)
         self.assertTrue(127946 in graph)
@@ -195,11 +207,11 @@ geneagrapher: error: too few arguments
         self.assertEqual(record.year, None)
         self.assertEqual(record.id, 143630)
 
-    def test_build_graph_with_descendants(self):
+    def test_build_graph_complete_with_descendants(self):
         """Graph building with descendants."""
         self.ggrapher.seed_ids.append(79568)
         self.ggrapher.get_descendants = True
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
         graph = self.ggrapher.graph
         self.assertEqual(len(graph), 3)
         self.assertTrue(79568 in graph)
@@ -236,14 +248,14 @@ geneagrapher: error: too few arguments
         self.assertEqual(record.year, 2003)
         self.assertEqual(record.id, 99457)
 
-    def test_build_graph_bad_id(self):
+    def test_build_graph_complete_bad_id(self):
         """Graph building with a bad ID."""
         self.ggrapher.seed_ids.append(79568583832)
-        self.assertRaises(ValueError, self.ggrapher.build_graph,
+        self.assertRaises(ValueError, self.ggrapher.build_graph_complete,
                           LocalDataGrabber)
 
         try:
-            self.ggrapher.build_graph(LocalDataGrabber)
+            self.ggrapher.build_graph_complete(LocalDataGrabber)
         except ValueError as e:
             self.assertEqual(str(e), "Invalid id 79568583832")
         else:
@@ -260,7 +272,42 @@ geneagrapher: error: too few arguments
         self.assertEqual(self.ggrapher.write_filename, None)
         self.assertEqual(self.ggrapher.seed_ids, [30484])
 
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
+
+        # Redirect stdout to capture output.
+        stdout = sys.stdout
+        stdout_intercept = StringIO.StringIO()
+        sys.stdout = stdout_intercept
+        self.ggrapher.generate_dot_file()
+        sys.stdout = stdout
+
+        expected = u"""digraph genealogy {
+    graph [charset="utf-8"];
+    node [shape=plaintext];
+    edge [style=bold];
+
+    30484 [label="Peter Chris Pappas \\nThe Pennsylvania State University \
+(1982)"];
+
+}
+"""
+        self.assertEqual(stdout_intercept.getvalue().decode('utf-8'), expected)
+
+    def test_end_to_end_self_stdout(self):
+        """Complete test using cache getting no ancestors or descendants and
+        writing the result to stdout."""
+        cache_fname = LocalDataGrabber.data_file(
+            'end-to-end-30484')
+        sys.argv = ['geneagrapher', '-c', '--cache-file', cache_fname,
+                    '30484']
+        self.ggrapher.parse_input()
+        self.assertEqual(self.ggrapher.get_ancestors, False)
+        self.assertEqual(self.ggrapher.get_descendants, False)
+        self.assertEqual(self.ggrapher.verbose, False)
+        self.assertEqual(self.ggrapher.write_filename, None)
+        self.assertEqual(self.ggrapher.seed_ids, [30484])
+
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
 
         # Redirect stdout to capture output.
         stdout = sys.stdout
@@ -293,7 +340,7 @@ geneagrapher: error: too few arguments
         self.assertEqual(self.ggrapher.write_filename, None)
         self.assertEqual(self.ggrapher.seed_ids, [127946])
 
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
 
         # Redirect stdout to capture output.
         stdout = sys.stdout
@@ -331,7 +378,7 @@ geneagrapher: error: too few arguments
         self.assertEqual(self.ggrapher.write_filename, None)
         self.assertEqual(self.ggrapher.seed_ids, [79568])
 
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
 
         # Redirect stdout to capture output.
         stdout = sys.stdout
@@ -367,7 +414,7 @@ geneagrapher: error: too few arguments
         self.assertEqual(self.ggrapher.write_filename, outfname)
         self.assertEqual(self.ggrapher.seed_ids, [30484])
 
-        self.ggrapher.build_graph(LocalDataGrabber)
+        self.ggrapher.build_graph_complete(LocalDataGrabber)
         self.ggrapher.generate_dot_file()
 
         expected = u"""digraph genealogy {
@@ -387,13 +434,16 @@ geneagrapher: error: too few arguments
     def test_end_to_end_through_ggrapher_self_stdout(self):
         """Complete test calling ggrapher getting no ancestors or descendants
         and writing the result to stdout."""
-        sys.argv = ['geneagrapher', '30484']
+        cache_fname = LocalDataGrabber.data_file(
+            'end-to-end-30484')
+        sys.argv = ['geneagrapher', '-c', '--cache-file', cache_fname,
+                    '30484']
 
         # Redirect stdout to capture output.
         stdout = sys.stdout
         stdout_intercept = StringIO.StringIO()
         sys.stdout = stdout_intercept
-        geneagrapher.ggrapher(LocalDataGrabber)
+        geneagrapher.ggrapher()
         sys.stdout = stdout
 
         expected = u"""digraph genealogy {
diff --git a/tests/geneagrapher/testdata/end-to-end-30484 b/tests/geneagrapher/testdata/end-to-end-30484
new file mode 100644
index 0000000..34f5948
Binary files /dev/null and b/tests/geneagrapher/testdata/end-to-end-30484 differ

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/geneagrapher.git



More information about the debian-science-commits mailing list