Skip to content

Commit

Permalink
Issue #44 (#49)
Browse files Browse the repository at this point in the history
* Reproduction system for bug in issue #44 [Caching graph and instance graph differs]
* Updated tests
* Added incoming change from MyCapytain
  • Loading branch information
PonteIneptique committed Mar 6, 2017
1 parent 3b65b35 commit 360061d
Show file tree
Hide file tree
Showing 9 changed files with 95 additions and 8 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -1,6 +1,7 @@
# IDE
.idea
env
venv
*.rdb
*.autosave

Expand Down
5 changes: 4 additions & 1 deletion capitains_nautilus/cts/resolver.py
Expand Up @@ -10,6 +10,7 @@
from MyCapytain.resources.collections.cts import TextInventory, TextGroup, Work, Citation, Edition
from MyCapytain.resources.prototypes.cts.inventory import TextInventoryCollection
from MyCapytain.resources.texts.locals.tei import Text
from MyCapytain.common.constants import set_graph

from capitains_nautilus import _cache_key
from capitains_nautilus.errors import *
Expand All @@ -24,7 +25,7 @@ class NautilusCTSResolver(CTSCapitainsLocalResolver):
:param cache: Cache object to be used for the inventory
:type cache: BaseCache
:param logger: Logging object
:type logger: logging
:type logger: logging.logger
:ivar inventory_cache_key: Werkzeug Cache key to get or set cache for the TextInventory
:ivar texts_cache_key: Werkzeug Cache key to get or set cache for lists of metadata texts objects
Expand Down Expand Up @@ -79,11 +80,13 @@ def cache(self):
def inventory(self):
if self.__inventory__ is None or len(self.__inventory__.readableDescendants) == 0:
self.__inventory__ = self.get_or(self.inventory_cache_key, self.parse, self.__resources__)
set_graph(self.__inventory__.graph)
return self.__inventory__

@inventory.setter
def inventory(self, value):
self.__inventory__ = value

self.cache.set(self.inventory_cache_key, value)

@property
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Expand Up @@ -3,5 +3,5 @@ Flask>=0.12
Werkzeug>=0.11.3
redis>=2.10.5
flask-caching>=1.2.0
MyCapytain>=2.0.0b14
MyCapytain>=2.0.0b18
logassert
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -10,7 +10,7 @@
license='MIT',
packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
install_requires=[
"MyCapytain>=2.0.0b17",
"MyCapytain>=2.0.0b18",
"tornado>=4.3",
"Flask>=0.12",
"Werkzeug>=0.11.3",
Expand Down
Empty file added tests/cts/__init__.py
Empty file.
2 changes: 2 additions & 0 deletions tests/cts/config.py
@@ -0,0 +1,2 @@
subprocess_repository = ["./tests/test_data/farsiLit"]
subprocess_cache_dir = "cache_dir"
7 changes: 7 additions & 0 deletions tests/cts/run_cache.py
@@ -0,0 +1,7 @@
from capitains_nautilus.cts.resolver import NautilusCTSResolver
from werkzeug.contrib.cache import FileSystemCache
from tests.cts.config import subprocess_repository, subprocess_cache_dir

cache = FileSystemCache(subprocess_cache_dir)
resolver = NautilusCTSResolver(resource=subprocess_repository, cache=cache)
resolver.parse()
14 changes: 9 additions & 5 deletions tests/cts/test_resolver.py
Expand Up @@ -2,7 +2,7 @@

from __future__ import unicode_literals

from MyCapytain.common.constants import NS, Mimetypes, NAMESPACES, GRAPH
from MyCapytain.common.constants import NS, Mimetypes, NAMESPACES, get_graph
from MyCapytain.common.reference import URN, Reference
from MyCapytain.resources.prototypes.metadata import Collection
from MyCapytain.resources.collections.cts import TextInventory
Expand Down Expand Up @@ -152,7 +152,7 @@ def test_pagination(self):
class TextXMLFolderResolver(TestCase):
""" Ensure working state of resolver """
def setUp(self):
GRAPH.remove((None, None, None))
get_graph().remove((None, None, None))
self.resolver = NautilusCTSResolver(["./tests/testing_data/latinLit2"])

def test_getPassage_full(self):
Expand Down Expand Up @@ -576,7 +576,7 @@ def test_getReffs_full(self):
class TextXMLFolderResolverDispatcher(TestCase):
""" Ensure working state of resolver """
def setUp(self):
GRAPH.remove((None, None, None))
get_graph().remove((None, None, None))

def test_dispatching_latin_greek(self):
tic = TextInventoryCollection()
Expand Down Expand Up @@ -612,6 +612,7 @@ def dispatchGreekLit(collection, path=None, **kwargs):
["./tests/testing_data/latinLit2"],
dispatcher=dispatcher
)
resolver.logger.disabled = True
resolver.REMOVE_EMPTY = False
resolver.parse()
latin_stuff = resolver.getMetadata("urn:perseus:latinLit")
Expand Down Expand Up @@ -661,6 +662,7 @@ def dispatchLatinLit(collection, path=None, **kwargs):
["./tests/testing_data/latinLit2"],
dispatcher=dispatcher
)
resolver.logger.disabled = True
resolver.parse()

NautilusCTSResolver.RAISE_ON_UNDISPATCHED = False
Expand All @@ -669,6 +671,7 @@ def dispatchLatinLit(collection, path=None, **kwargs):
["./tests/testing_data/latinLit2"],
dispatcher=dispatcher
)
resolver.logger.disabled = True
resolver.REMOVE_EMPTY = False
resolver.parse()
except UndispatchedTextError as E:
Expand Down Expand Up @@ -708,14 +711,15 @@ def dispatchGreekLit(collection, path=None, **kwargs):
["./tests/testing_data/latinLit2"],
dispatcher=dispatcher
)
resolver.logger.disabled = True
resolver.REMOVE_EMPTY = False
resolver.parse()

all = resolver.getMetadata().export(Mimetypes.XML.CTS)
latin_stuff = resolver.getMetadata("urn:perseus:latinLit").export(Mimetypes.XML.CTS)
greek_stuff = resolver.getMetadata("urn:perseus:greekLit").export(Mimetypes.XML.CTS)
farsi_stuff = resolver.getMetadata("urn:perseus:farsiLit").export(Mimetypes.XML.CTS)
GRAPH.remove((None, None, None))
get_graph().remove((None, None, None))
latin_stuff, greek_stuff, farsi_stuff = TextInventory.parse(latin_stuff), TextInventory.parse(greek_stuff),\
TextInventory.parse(farsi_stuff)
self.assertEqual(
Expand All @@ -737,7 +741,7 @@ def dispatchGreekLit(collection, path=None, **kwargs):
greek_stuff.get_label("fre"), None, # Text inventory have no label in CTS
"Label should be correct"
)
GRAPH.remove((None, None, None))
get_graph().remove((None, None, None))
all = TextInventory.parse(all)
self.assertEqual(
len(all.readableDescendants), 25,
Expand Down
70 changes: 70 additions & 0 deletions tests/cts/test_resolver_cache.py
@@ -0,0 +1,70 @@
from unittest import TestCase
from subprocess import call
from sys import executable
import os
from capitains_nautilus.cts.resolver import NautilusCTSResolver
from werkzeug.contrib.cache import FileSystemCache
from MyCapytain.common.constants import Mimetypes
from tests.cts.config import subprocess_cache_dir, subprocess_repository

cwd = os.getcwd()
cwd = cwd.replace("tests/cts", "")
python = executable


class TestCache(TestCase):
def setUp(self):
output = call([python, "./tests/cts/run_cache.py"], cwd=cwd)
if output != 0:
raise Exception("Creating cache failed")

self.cache = FileSystemCache(subprocess_cache_dir)
self.resolver = NautilusCTSResolver(resource=subprocess_repository, cache=self.cache)
self.resolver.logger.disabled = True

def x(*k, **kw):
raise Exception("Parse should not be called")
self.resolver.parse = x

def tearDown(self):
self.cache.clear()

def test_argumentless_metadata(self):
inventory = self.resolver.getMetadata()

self.assertIn(
"Divān (English)",
inventory.export(Mimetypes.XML.CTS),
"Metadata are there"
)
self.assertEqual(
len(inventory.readableDescendants), 4
)

def test_first_child(self):
key = list(self.resolver.getMetadata().children.keys())[0]
inventory = self.resolver.getMetadata(key)

self.assertIn(
"Divān (English)",
inventory.export(Mimetypes.XML.CTS),
"Metadata are there"
)
self.assertEqual(
len(inventory.readableDescendants), 4
)

def test_textgroup(self):
""" Found to fail originally because of different GRAPH constant used across modules
(one from the cache vs. the world) """
inventory = self.resolver.getMetadata("urn:cts:farsiLit:hafez")

self.assertIn(
"Divān (English)",
inventory.export(Mimetypes.XML.CTS),
"Metadata are there"
)
self.assertEqual(
len(inventory.readableDescendants), 3
)

0 comments on commit 360061d

Please sign in to comment.