def test_route_version_chunker_replacement(self): """ Try to get valid reffs """ urn = "urn:cts:latinLit:phi1294.phi002.perseus-lat2" def chunker(text, level): self.assertIsInstance(text, MyCapytain.resources.inventory.Text) self.assertEqual(str(text.urn), "urn:cts:latinLit:phi1294.phi002.perseus-lat2") return True nemo = Nemo( api_url=NemoTestControllers.endpoint, inventory="annotsrc", chunker={"default": chunker} ) with patch('requests.get', return_value=self.getValidReff) as patched: view = nemo.r_version("latinLit", "phi1294", "phi002", "perseus-lat2") self.assertIsInstance(view["version"], MyCapytain.resources.inventory.Text) patched.assert_called_once_with( NemoTestControllers.endpoint, params={ "inv": "annotsrc", "request": "GetCapabilities" } ) self.assertEqual(view["reffs"], True)
def test_template_folder(self): app = Flask(__name__) nemo = Nemo(app=app, template_folder="/examples") nemo.register_routes() self.assertEqual(nemo.template_folder, "/examples") self.assertEqual(nemo.blueprint.template_folder, "/examples")
class TestFilters(NemoResource): def test_f_active_link(self): """ Test checking if something is in the path """ wrong = Nemo.f_active_link("phi003", {"collection": "latinLit"}) wrong2 = Nemo.f_active_link("phi003", {"collection": "latinLit", "textgroup": "phi0003"}) right = Nemo.f_active_link("phi003", {"collection": "latinLit", "textgroup": "phi0003", "work": "phi003"}) self.assertEqual(wrong, "") self.assertEqual(wrong2, "") self.assertEqual(right, "active") def test_f_collection_i18n(self): """ Test internationalization of collection identifier """ self.assertEqual(Nemo.f_collection_i18n("latinLit"), "Latin") self.assertEqual(Nemo.f_collection_i18n("greekLit"), "Ancient Greek") self.assertEqual(Nemo.f_collection_i18n("freLit"), "freLit") def test_f_formatting_passage_reference(self): """ Test split of passage range identifier """ self.assertEqual(Nemo.f_formatting_passage_reference("1.1-1.2"), "1.1") self.assertEqual(Nemo.f_formatting_passage_reference("1.1"), "1.1") def test_register_filter(self): app = Flask(__name__) self.nemo = Nemo(app=app) self.nemo.register_filters() self.assertEqual(self.nemo.app.jinja_env.filters["formatting_passage_reference"], Nemo.f_formatting_passage_reference) self.assertEqual(self.nemo.app.jinja_env.filters["collection_i18n"], Nemo.f_collection_i18n) self.assertEqual(self.nemo.app.jinja_env.filters["active_link"], Nemo.f_active_link)
def test_f_active_link(self): """ Test checking if something is in the path """ wrong = Nemo.f_active_link("phi003", {"collection": "latinLit"}) wrong2 = Nemo.f_active_link("phi003", {"collection": "latinLit", "textgroup": "phi0003"}) right = Nemo.f_active_link("phi003", {"collection": "latinLit", "textgroup": "phi0003", "work": "phi003"}) self.assertEqual(wrong, "") self.assertEqual(wrong2, "") self.assertEqual(right, "active")
def test_static_url_path(self): app = Flask(__name__) nemo = Nemo(app=app, static_url_path="/assets/nemoOo") nemo.register_routes() self.assertIn("flask_nemo", app.blueprints) rules = [(rule.rule, rule.endpoint) for rule in app.url_map.iter_rules()] self.assertIn("/nemo/assets/nemoOo/<path:filename>", [rule[0] for rule in rules]) self.assertIn("/nemo/assets/nemoOo.secondary/<type>/<asset>", [rule[0] for rule in rules])
def test_view_maker(self): """ View maker should take care of returning a lambda using the function self.route and the function identified by the parameter name """ nemo = Nemo() nemo.route = Mock() view = nemo.view_maker("r_collection") view(collection="latinLit") nemo.route.assert_called_with(nemo.r_collection, collection="latinLit")
def test_overwrite_urls(self): routes = [("/index.html", "r_index", ["GET"])] + Nemo.ROUTES[1:] app = Flask(__name__) nemo = Nemo(app=app, urls=routes) nemo.register_routes() self.assertIn("flask_nemo", app.blueprints) rules = [(rule.rule, rule.endpoint) for rule in app.url_map.iter_rules()] self.assertIn("/nemo/index.html", [rule[0] for rule in rules]) self.assertNotIn("/nemo/", [rule[0] for rule in rules])
def test_default_chunker(self): """ Test default chunker """ text = self.inventory["urn:cts:latinLit:phi1294.phi002.perseus-lat2"] reffs = Nemo.default_chunker(text, self.make_get_reff(3)) self.assertEqual(reffs, [ ("1.pr.5", "1.pr.5"), ("1.1.7", "1.1.7") ]) Nemo.default_chunker(self.inventory["urn:cts:latinLit:phi0959.phi003.perseus-lat2"], self.make_get_reff(2))
def test_additional_template(self): # Line 568-575 app = Flask(__name__) nemo = Nemo(app=app, templates={"menu": "examples/ciham.menu.html"}) blueprint = nemo.create_blueprint() html, path, function = blueprint.jinja_loader.get_source("", "examples/ciham.menu.html") self.assertIn("Text provided by CIHAM", html) with self.assertRaises(TemplateNotFound): html, path, function = blueprint.jinja_loader.get_source("", "examples/unknown.html")
def test_transform_default_none(self): """ Test that the transform default is called and applied """ nemo = Nemo() transformed = nemo.transform( MyCapytain.resources.inventory.Text( urn="urn:cts:phi1294.phi002.perseus-lat2" ), etree.fromstring("<a/>") ) self.assertEqual(transformed, "<a/>")
def test_get_siblings(self): """ Test first passage """ app = Flask("Nemo") nemo = Nemo(app=app, base_url="", resolver=NautilusDummy, original_breadcrumb=False, chunker={ "default": lambda x, y: level_grouper(x, y, groupby=20) }) # First range p = nemo.get_passage("urn:cts:latinLit:phi1294.phi002.perseus-lat2", "1.pr.1-1.pr.20") l, r = nemo.get_siblings( "urn:cts:latinLit:phi1294.phi002.perseus-lat2", "1.pr.1-1.pr.20", p) self.assertEqual(l, None, "There should be nothing on the left") self.assertEqual(r, "1.pr.21-1.pr.22", "Next passage should not be 20 long") # Second range p = nemo.get_passage("urn:cts:latinLit:phi1294.phi002.perseus-lat2", "1.pr.21-1.pr.22") l, r = nemo.get_siblings( "urn:cts:latinLit:phi1294.phi002.perseus-lat2", "1.pr.21-1.pr.22", p) self.assertEqual(l, "1.pr.1-1.pr.20", "There should be something on the left") self.assertEqual(r, "1.1.1-1.1.6", "Next passage should not be 20 long") # Last range p = nemo.get_passage("urn:cts:latinLit:phi1294.phi002.perseus-lat2", "14.223.1-14.223.2") l, r = nemo.get_siblings( "urn:cts:latinLit:phi1294.phi002.perseus-lat2", "14.223.1-14.223.2", p) self.assertEqual(l, "14.222.1-14.222.2", "Previous passage does not have to be 20 long") self.assertEqual(r, None, "There should be nothing on the right") # Passage with unknown range p = nemo.get_passage("urn:cts:latinLit:phi1294.phi002.perseus-lat2", "1.11.1-1.11.2") l, r = nemo.get_siblings( "urn:cts:latinLit:phi1294.phi002.perseus-lat2", "1.11.1-1.11.2", p) self.assertEqual( l, "1.10.3-1.10.4", "Passage should be computed specifically if texts have unknown range" ) self.assertEqual( r, "1.11.3-1.11.4", "Passage should be computed specifically if texts have unknown range" )
def test_route_passage_without_urn_xslt(self): nemo = Nemo( api_url=NemoTestControllers.endpoint, inventory="annotsrc", transform={"urn:cts:latinLit:phi1294.phi002.perseus-lat3": NemoTestControllers.body_xsl} ) with patch('requests.get', return_value=self.getPassage_Route) as patched: view = nemo.r_passage("latinLit", "phi1294", "phi002", "perseus-lat2", "1.pr.1") # Reparsing xml xml = etree.fromstring(str(view["text_passage"])) self.assertEqual( len(xml.xpath("//tei:body", namespaces={"tei": "http://www.tei-c.org/ns/1.0"})), 1 )
def test_transform_urn_xslt(self): """ Test that the transform default is called and applied """ nemo = Nemo(transform={ "default": "testing_data/xsl_test.xml" }) transformed = nemo.transform( MyCapytain.resources.inventory.Text( urn="urn:cts:phi1294.phi002.perseus-lat2" ), etree.fromstring('<tei:body xmlns:tei="http://www.tei-c.org/ns/1.0" />') ) self.assertEqual(transformed, '<tei:notbody xmlns:tei="http://www.tei-c.org/ns/1.0"/>')
def test_scheme_chunker(self): """ Test chunking according to scheme """ text = self.inventory["urn:cts:latinLit:phi1294.phi002.perseus-lat2"] # book, poem reffs = Nemo.scheme_chunker(text, self.make_get_reff(2)) self.assertEqual(reffs, [ ("1.pr.5", "1.pr.5"), ("1.1.7", "1.1.7") ]) with patch("flask_nemo.Nemo.line_chunker", return_value=True) as line_chunker: self.assertEqual(Nemo.scheme_chunker( self.inventory["urn:cts:latinLit:phi0959.phi007.perseus-lat2"], self.make_get_reff(2) ), True)
def test_urntransform_override_function(self): """ Test that the transform override is called and applied """ def override(urn): self.assertEqual(str(urn), "urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr") return "override" nemo = Nemo(urntransform={ "urn:cts:latinLit:phi1294.phi002.perseus-lat2": override }) transformed = nemo.transform_urn( MyCapytain.resources.inventory.Text( urn="urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr" ).urn ) self.assertEqual(transformed, "override")
def test_get_validreffs_without_specific_callback(self): """ Try to get valid reffs """ self.nemo = Nemo(api_url=NemoTestControllers.endpoint, inventory="annotsrc") with patch('requests.get', return_value=self.getValidReff) as patched: text, callback = self.nemo.get_reffs("latinLit", "phi1294", "phi002", "perseus-lat2") self.assertIsInstance(text, MyCapytain.resources.inventory.Text) reffs = callback(level=3) self.assertIsInstance(reffs, list) self.assertEqual(reffs[0], "urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.1") self.assertEqual(patched.mock_calls, [ call( NemoTestControllers.endpoint, params={ "inv": "annotsrc", "request": "GetCapabilities" } ), call( NemoTestControllers.endpoint, params={ "inv": "annotsrc", "request": "GetValidReff", "level": "3", "urn": "urn:cts:latinLit:phi1294.phi002.perseus-lat2" } ) ] )
def test_route_passage_with_transform(self): """ Try with a non xslt just to be sure """ urn = "urn:cts:latinLit:phi1294.phi002.perseus-lat2" def transformer(version, text): self.assertEqual(str(version.urn), "urn:cts:latinLit:phi1294.phi002.perseus-lat2") self.assertIsInstance(text, etree._Element) return "<a>Hello</a>" nemo = Nemo( api_url=NemoTestControllers.endpoint, inventory="annotsrc", transform={"default": transformer} ) with patch('requests.get', return_value=self.getPassage_Route) as patched: view = nemo.r_passage("latinLit", "phi1294", "phi002", "perseus-lat2", "1.pr.1") self.assertEqual(view["text_passage"], Markup("<a>Hello</a>"))
def test_register_filter(self): app = Flask(__name__) self.nemo = Nemo(app=app) self.nemo.register_filters() self.assertEqual(self.nemo.app.jinja_env.filters["formatting_passage_reference"], Nemo.f_formatting_passage_reference) self.assertEqual(self.nemo.app.jinja_env.filters["collection_i18n"], Nemo.f_collection_i18n) self.assertEqual(self.nemo.app.jinja_env.filters["active_link"], Nemo.f_active_link)
def test_urntransform_default_function(self): """ Test that the transform default is called and applied """ def default(urn): self.assertEqual(str(urn), "urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr") return str(urn) nemo = Nemo(urntransform={ "default": default }) transformed = nemo.transform_urn( MyCapytain.resources.inventory.Text( urn="urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr" ).urn ) self.assertEqual(transformed, "urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr")
def test_route_assets_all(self): nemo = Nemo( statics=["testing_data/getcapabilities.xml"], js=["testing_data/getcapabilities.xml"], css=["testing_data/style.css"] ) nemo.blueprint = Mock() nemo.register_assets() with patch("flask_nemo.send_from_directory") as patched: nemo.r_assets("js", "getcapabilities.xml") nemo.r_assets("static", "getcapabilities.xml") nemo.r_assets("css", "style.css") patched.assert_has_calls([ call(directory="testing_data", filename="getcapabilities.xml"), call(directory="testing_data", filename="getcapabilities.xml"), call(directory="testing_data", filename="style.css") ])
def test_transform_default_function(self): """ Test that the transform default is called and applied when it's a function """ def default(work, xml): self.assertEqual(str(work.urn), "urn:cts:phi1294.phi002.perseus-lat2") self.assertEqual(xml, "<a></a>") return "<b></b>" nemo = Nemo(transform={ "default": default }) transformed = nemo.transform( MyCapytain.resources.inventory.Text( urn="urn:cts:phi1294.phi002.perseus-lat2" ), "<a></a>" ) self.assertEqual(transformed, "<b></b>")
def test_chunker_default(self): """ Test that the chunker default is called and applied """ def default(text, reffs): self.assertEqual(str(text.urn), "urn:cts:phi1294.phi002.perseus-lat2") self.assertEqual(reffs, ["1.pr"]) return [("1.pr", "I PR")] nemo = Nemo(chunker={ "default": default }) chunked = nemo.chunk( MyCapytain.resources.inventory.Text( urn="urn:cts:phi1294.phi002.perseus-lat2" ), ["1.pr"] ) self.assertEqual(chunked, [("1.pr", "I PR")])
def test_transform_default_xslt(self): """ Test that the transform default is called and applied """ def default(text, cb): self.assertEqual(str(text.urn), "urn:cts:phi1294.phi002.perseus-lat2") self.assertEqual(cb(1), 1) return [("1.pr", "I PR")] nemo = Nemo(prevnext={ "default": default }) prevnext = nemo.getprevnext( MyCapytain.resources.inventory.Text( urn="urn:cts:phi1294.phi002.perseus-lat2" ), lambda x: x ) self.assertEqual(prevnext, [("1.pr", "I PR")])
def test_prevnext_urn(self): """ Test that the prevnext by urn is called and applied """ def urn(text, cb): self.assertEqual(str(text.urn), "urn:cts:phi1294.phi002.perseus-lat2") self.assertEqual(cb(1), 1) return [("1.pr", "I PR")] nemo = Nemo(prevnext={ "default": lambda x, y: y, "urn:cts:phi1294.phi002.perseus-lat2": urn }) chunked = nemo.getprevnext( MyCapytain.resources.inventory.Text( urn="urn:cts:phi1294.phi002.perseus-lat2" ), lambda x: x ) self.assertEqual(chunked, [("1.pr", "I PR")])
def test_route_passage_with_xslt(self): nemo = Nemo( api_url=NemoTestControllers.endpoint, inventory="annotsrc", transform={"default": NemoTestControllers.body_xsl} ) with patch('requests.get', return_value=self.getPassage_Route) as patched: view = nemo.r_passage("latinLit", "phi1294", "phi002", "perseus-lat2", "1.pr.1") self.assertEqual(view["template"], nemo.templates["text"]) self.assertIsInstance(view["version"], MyCapytain.resources.inventory.Text) self.assertEqual(str(view["version"].urn), "urn:cts:latinLit:phi1294.phi002.perseus-lat2") self.assertEqual(view["prev"], "1.1.1") self.assertEqual(view["next"], "1.1.3") self.assertIsInstance(view["text_passage"], Markup) # Reparsing xml xml = etree.fromstring(str(view["text_passage"])) self.assertEqual( len(xml.xpath("//tei:notbody", namespaces={"tei":"http://www.tei-c.org/ns/1.0"})), 1 )
def test_line_chunker(self): """ Test line grouping chunker """ def validReff(level): self.assertEqual(level, 3) return ["urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.1","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.2","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.3","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.4","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.5","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.6","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.7","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.8","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.9","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.10","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.11","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.12","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.13","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.14","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.15","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.16","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.17","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.18","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.19","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.20","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.21","urn:cts:latinLit:phi1294.phi002.perseus-lat2:1.pr.22"] reffs = Nemo.line_chunker(self.inventory["urn:cts:latinLit:phi1294.phi002.perseus-lat2"], validReff, 5) self.assertEqual(reffs, [ ("1.pr.1-1.pr.5","1.pr.1"), ("1.pr.6-1.pr.10","1.pr.6"), ("1.pr.11-1.pr.15","1.pr.11"), ("1.pr.16-1.pr.20","1.pr.16"), ("1.pr.21-1.pr.22","1.pr.21") ]) reffs = Nemo.line_chunker(self.inventory["urn:cts:latinLit:phi1294.phi002.perseus-lat2"], validReff, 11) self.assertEqual(reffs, [ ("1.pr.1-1.pr.11","1.pr.1"), ("1.pr.12-1.pr.22","1.pr.12") ])
def test_register_route(self): app = Flask(__name__) nemo = Nemo(app=app, base_url="/perseus") nemo.register_routes() self.assertIn("flask_nemo", app.blueprints) rules = [(rule.rule, rule.endpoint) for rule in app.url_map.iter_rules()] self.assertIn("/perseus/read/<collection>/<textgroup>/<work>/<version>/<passage_identifier>", [rule[0] for rule in rules]) self.assertIn("flask_nemo.r_passage", [rule[1] for rule in rules]) app = Flask(__name__) nemo = Nemo("nemo", app=app) nemo.register_routes() self.assertIn("nemo", app.blueprints) rules = [(rule.rule, rule.endpoint) for rule in app.url_map.iter_rules()] self.assertIn("/nemo/read/<collection>/<textgroup>/<work>/<version>/<passage_identifier>", [rule[0] for rule in rules]) self.assertIn("nemo.r_passage", [rule[1] for rule in rules]) nemo = Nemo() self.assertEqual(nemo.register_routes(), None)
def test_flask_nemo(self): """ Testing Flask Nemo is set up""" a = Nemo() self.assertIsInstance(a, Nemo) a = Nemo()
app = Flask("Nautilus") nautilus_cache = RedisCache("redis", port=6379, default_timeout=0) nautilus = FlaskNautilus(app=app, prefix="/api/cts", name="nautilus", resources=[ os.path.join(d, o) for o in os.listdir(d) if os.path.isdir(os.path.join(d, o)) ], parser_cache=WerkzeugCacheWrapper(nautilus_cache), http_cache=Cache(config={'CACHE_TYPE': "simple"})) # We set up Nemo nemo = Nemo(app=app, name="nemo", base_url="", api_url="/api/cts", retriever=nautilus.retriever, chunker={"default": Nemo.level_grouper}, css=["/opt/static/assets/nemo.secondary/css/theme-ext.css"], transform={"default": "/opt/static/assets/xslt/epidocShort.xsl"}, templates={"passage_footer": "templates/passage_footer.html"}) # We register its routes nemo.register_routes() # We register its filters nemo.register_filters() app.debug = True if __name__ == "__main__": app.run(debug=True, host='0.0.0.0')
nemo = Nemo( # API URL is the URL of your endpoint. api_url="http://services2.perseids.org/exist/restxq/cts", # We set up the base url to be empty. If you want nemo to be on a # subpath called "cts", you would have # base_url="cts", base_url="", name="nemo", # In our case, we have an inventory named "nemo" inventory="nemo", css=[ # USE Own CSS Files "static/tei.pb.min.css", "static/ciham.css" ], js=[ # use own js file to load a script to go from normalized edition to diplomatic one. "static/ciham.js" ], transform={ "urn:cts:froLit:jns915.jns1856.ciham-fro1": "static/ciham.xslt" }, # We give thee ap object #app=app chunker={ # The default chunker takes care of book, poem, lines # but it would be cool to have 30 lines group for Nemo "urn:cts:latinLit:phi0959.phi005.perseus-lat2": lambda version, callback: Nemo.line_chunker( version, callback, lines=30), "urn:cts:froLit:jns915.jns1856.ciham-fro1": lambda text, getLevel: [(reff.split(":")[-1], reff.split(":")[-1]) for reff in getLevel(1)], "urn:cts:latinLit:phi0472.phi001.perseus-lat2": lambda text, getLevel: [(reff.split(":")[-1], reff.split(":")[-1]) for reff in getLevel(1)], "urn:cts:latinLit:phi1212.phi002.perseus-lat1": lambda version, callback: Nemo. line_chunker(version, callback, lines=5 ), #Apuleius, Metamorphoses, 5 sections at a time "default": Nemo.level_grouper # lambda text, cb: Nemo.line_grouper(text, cb, 50), }, templates={"passage_footer": "templates/passage_footer.html"})
nemo = Nemo( # API URL is the URL of your endpoint. api_url="http://services2.perseids.org/exist/restxq/cts", # We set up the base url to be empty. If you want nemo to be on a # subpath called "cts", you would have # base_url="cts", base_url="", name="nemo", # In our case, we have an inventory named "nemo" inventory="nemo", css=[ # USE Own CSS Files "static/tei.pb.min.css", "static/ciham.css" ], js=[ # use own js file to load a script to go from normalized edition to diplomatic one. "static/ciham.js" ], transform={ "urn:cts:froLit:jns915.jns1856.ciham-fro1" : "static/ciham.xslt" }, # We give thee ap object #app=app chunker={ # The default chunker takes care of book, poem, lines # but it would be cool to have 30 lines group for Nemo "urn:cts:latinLit:phi0959.phi005.perseus-lat2": lambda version, callback: Nemo.line_chunker(version, callback, lines=30), "urn:cts:froLit:jns915.jns1856.ciham-fro1": lambda text, getLevel: [(reff.split(":")[-1], reff.split(":")[-1]) for reff in getLevel(1)], "urn:cts:latinLit:phi0472.phi001.perseus-lat2": lambda text, getLevel: [(reff.split(":")[-1], reff.split(":")[-1]) for reff in getLevel(1)], "urn:cts:latinLit:phi1212.phi002.perseus-lat1": lambda version, callback: Nemo.line_chunker(version, callback, lines=5), #Apuleius, Metamorphoses, 5 sections at a time "default": Nemo.level_grouper # lambda text, cb: Nemo.line_grouper(text, cb, 50), }, templates = { "passage_footer": "templates/passage_footer.html" } )
resources=[os.path.join(d,o) for o in os.listdir(d) if os.path.isdir(os.path.join(d,o))], parser_cache=WerkzeugCacheWrapper(nautilus_cache), http_cache=Cache(config={'CACHE_TYPE': "simple"}) ) # We set up Nemo nemo = Nemo( app=app, name="nemo", base_url="", api_url="/api/cts", retriever=nautilus.retriever, chunker={ "default": Nemo.level_grouper }, css=[ "/opt/static/assets/nemo.secondary/css/theme-ext.css" ], transform={ "default": "/opt/static/assets/xslt/epidocShort.xsl" }, templates = { "passage_footer": "templates/passage_footer.html" } ) # We register its routes nemo.register_routes() # We register its filters nemo.register_filters() app.debug = True
def test_f_formatting_passage_reference(self): """ Test split of passage range identifier """ self.assertEqual(Nemo.f_formatting_passage_reference("1.1-1.2"), "1.1") self.assertEqual(Nemo.f_formatting_passage_reference("1.1"), "1.1")
nemo = Nemo( # API URL is the URL of your endpoint. api_url="http://services2.perseids.org/exist/restxq/cts", # We set up the base url to be empty. If you want nemo to be on a # subpath called "cts", you would have # base_url="cts", base_url="", name="nemo", # In our case, we have an inventory named "nemo" inventory="nemo", css=[ # USE Own CSS Files "static/tei.pb.min.css", "static/ciham.css" ], js=[ # use own js file to load a script to go from normalized edition to diplomatic one. "static/ciham.js" ], transform={ "urn:cts:froLit:jns915.jns1856.ciham-fro1" : "static/ciham.xslt" }, # We give thee ap object #app=app chunker={ # The default chunker takes care of book, poem, lines # but it would be cool to have 30 lines group for Nemo "urn:cts:latinLit:phi0959.phi005.perseus-lat2": lambda version, callback: Nemo.line_chunker(version, callback, lines=30), "urn:cts:froLit:jns915.jns1856.ciham-fro1": lambda text, getLevel: [(reff.split(":")[-1], reff.split(":")[-1]) for reff in getLevel(1)], "urn:cts:latinLit:phi0472.phi001.perseus-lat2": lambda text, getLevel: [(reff.split(":")[-1], reff.split(":")[-1]) for reff in getLevel(1)], "urn:cts:latinLit:stoa0276.stoa010.opp-lat1": lambda version, callback: Nemo.line_chunker(version, callback, lines=30), "default": Nemo.scheme_chunker # lambda text, cb: Nemo.line_grouper(text, cb, 50), }, templates = { "passage_footer": "templates/passage_footer.html" } )
d = "/opt/data" app = Flask("Nautilus") nautilus_cache = FileSystemCache("/opt/cache") nautilus = FlaskNautilus( app=app, prefix="/api/cts", name="nautilus", resources=[os.path.join(d,o) for o in os.listdir(d) if os.path.isdir(os.path.join(d,o))], parser_cache=WerkzeugCacheWrapper(nautilus_cache), http_cache=Cache(config={'CACHE_TYPE': "simple"}) ) # We set up Nemo nemo = Nemo( app=app, name="nemo", base_url="", api_url="/api/cts", retriever=nautilus.retriever, **nemo_config ) # We register its routes nemo.register_routes() # We register its filters nemo.register_filters() app.debug = True if __name__ == "__main__": app.run(debug=True, host='0.0.0.0')