[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