Mercurial > code > home > repos > rdferry
changeset 12:ba73d8ba81dc default tip
refactor
author | drewp@bigasterisk.com |
---|---|
date | Mon, 18 Mar 2024 16:51:44 -0700 |
parents | 0bc06da6bf74 |
children | |
files | examples/serve_inline_graph_test.py src/rdferry/patch/patch.py src/rdferry/patchablegraph.py src/rdferry/server.py |
diffstat | 4 files changed, 46 insertions(+), 45 deletions(-) [+] |
line wrap: on
line diff
--- a/examples/serve_inline_graph_test.py Mon Mar 18 16:42:21 2024 -0700 +++ b/examples/serve_inline_graph_test.py Mon Mar 18 16:51:44 2024 -0700 @@ -1,8 +1,12 @@ +import logging from pathlib import Path -import logging + import pytest -from examples._run_server_child import RunHttpServerChildProcess, assert_event_stream_starts_with +from examples._run_server_child import ( + RunHttpServerChildProcess, + assert_event_stream_starts_with, +) log = logging.getLogger('test') logging.basicConfig(level=logging.INFO)
--- a/src/rdferry/patch/patch.py Mon Mar 18 16:42:21 2024 -0700 +++ b/src/rdferry/patch/patch.py Mon Mar 18 16:51:44 2024 -0700 @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Collection -from rdflib import ConjunctiveGraph +from rdflib import ConjunctiveGraph, Graph, URIRef from rdflib.graph import _QuadType as Quad @@ -28,3 +28,16 @@ g.addN(quads) return g + +def quadsWithGraphContexts(quads): + for s, p, o, c in quads: + if isinstance(c, URIRef): + c = Graph(identifier=c) + if not isinstance(c, Graph): + raise TypeError("bad quad context type in %r" % ((s, p, o, c), )) + yield s, p, o, c + + +def addWholeGraphPatch(graph: ConjunctiveGraph) -> Patch: + """a patch that adds every quad in the graph""" + return Patch(adds=list(quadsWithGraphContexts(graph.quads())))
--- a/src/rdferry/patchablegraph.py Mon Mar 18 16:42:21 2024 -0700 +++ b/src/rdferry/patchablegraph.py Mon Mar 18 16:51:44 2024 -0700 @@ -1,14 +1,15 @@ import asyncio import itertools -import json +import logging +import weakref from typing import NewType -import weakref + +from prometheus_client import Counter, Gauge, Summary +from rdflib import ConjunctiveGraph + +from rdferry.patch.patch import Patch, addWholeGraphPatch from rdferry.patch_quads import patchQuads from rdferry.rdflib_issues.contains_with_context_398 import inGraph -from rdflib import ConjunctiveGraph, Graph, URIRef -import logging -from rdferry.patch.patch import Patch -from prometheus_client import Counter, Gauge, Summary log = logging.getLogger('patchablegraph') STATEMENT_COUNT = Gauge('statement_count', @@ -84,23 +85,10 @@ OBSERVERS_CURRENT.labels(graph=self.label).set(len( self._subscriptions)) # minus one? -def clearEvent() -> SseEvent: - return SseEvent(('clear', 'ferry1')) - - -def quadsWithGraphContexts(quads): - for s, p, o, c in quads: - if isinstance(c, URIRef): - c = Graph(identifier=c) - if not isinstance(c, Graph): - raise TypeError("bad quad context type in %r" % ((s, p, o, c), )) - yield s, p, o, c - -def addWholeGraphPatch(graph: ConjunctiveGraph) -> Patch: - """a patch that adds every quad in the graph""" - return Patch(adds=list(quadsWithGraphContexts(graph.quads()))) +def clearEvent() -> SseEvent: + return SseEvent(('clear', 'ferry1')) def patchEvent(p: Patch) -> SseEvent:
--- a/src/rdferry/server.py Mon Mar 18 16:42:21 2024 -0700 +++ b/src/rdferry/server.py Mon Mar 18 16:51:44 2024 -0700 @@ -3,13 +3,15 @@ from typing import Awaitable, Callable import uvicorn +from prometheus_client import Summary +from sse_starlette import ServerSentEvent +from sse_starlette.sse import EventSourceResponse from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import PlainTextResponse, Response -from sse_starlette.sse import EventSourceResponse + from rdferry.patchablegraph import PatchableGraph -from sse_starlette import ServerSentEvent -from prometheus_client import Summary + log = logging.getLogger('serv') SEND_SIMPLE_GRAPH = Summary('send_simple_graph', 'calls to _writeGraphResponse') @@ -32,23 +34,8 @@ def add_graph_routes(self, path: str, graph: PatchableGraph): """Adds {path} and {path}/events""" - self.add_route(path, partial(self._on_graph_request, graph)) - self.add_route(path + '/events', - self._graph_events_request_handler(graph)) - - def _on_graph_request(self, graph: PatchableGraph, - request: Request) -> PlainTextResponse: - format = request.headers.get('Accept', '*/*') - if format == '*/*': - format = 'application/trig' - return PlainTextResponse(content=graph._graph.serialize(format=format), - media_type=format) - - def _graph_events_request_handler( - self, - graph: PatchableGraph, - ) -> Callable[[Request], EventSourceResponse]: - return _GraphEvents(graph) + self.add_route(path, partial(_simple_graph_response, graph)) + self.add_route(path + '/events', _graphEvents(graph)) def serve(self): if not self.root_route_is_set: @@ -56,7 +43,16 @@ uvicorn.run(self.app, host="0.0.0.0", port=8005) -def _GraphEvents( +def _simple_graph_response(graph: PatchableGraph, + request: Request) -> PlainTextResponse: + format = request.headers.get('Accept', '*/*') + if format == '*/*': + format = 'application/trig' + return PlainTextResponse(content=graph._graph.serialize(format=format), + media_type=format) + + +def _graphEvents( masterGraph: PatchableGraph ) -> Callable[[Request], EventSourceResponse]: