Mercurial > code > home > repos > homeauto
changeset 694:925bc4137c93
extract rdfStatementsFromRequest for sharing with other tools
Ignore-this: 74eba63f3a29f48b48c6fb1ae74780d3
author | drewp@bigasterisk.com |
---|---|
date | Fri, 31 Jan 2020 23:54:20 -0800 |
parents | be2fbdbdf549 |
children | 80f6b3ee9c7f |
files | service/mqtt_graph_bridge/mqtt_graph_bridge.py service/mqtt_graph_bridge/rdf_over_http.py |
diffstat | 2 files changed, 44 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/service/mqtt_graph_bridge/mqtt_graph_bridge.py Wed Jan 29 01:05:15 2020 -0800 +++ b/service/mqtt_graph_bridge/mqtt_graph_bridge.py Fri Jan 31 23:54:20 2020 -0800 @@ -7,14 +7,14 @@ import json from docopt import docopt -from rdflib import Namespace, URIRef, Literal, Graph -from rdflib.parser import StringInputSource +from rdflib import Namespace, Literal from twisted.internet import reactor import cyclone.web from mqtt_client import MqttClient from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler from standardservice.logsetup import log, verboseLogging +import rdf_over_http ROOM = Namespace('http://projects.bigasterisk.com/room/') @@ -29,30 +29,17 @@ }, } -def rdfGraphBody(body, headers): - g = Graph() - g.parse(StringInputSource(body), format='nt') - return g class OutputPage(cyclone.web.RequestHandler): def put(self): - arg = self.request.arguments - if arg.get('s') and arg.get('p'): - subj = URIRef(arg['s'][-1]) - pred = URIRef(arg['p'][-1]) - turtleLiteral = self.request.body - try: - obj = Literal(float(turtleLiteral)) - except ValueError: - obj = Literal(turtleLiteral) - stmt = (subj, pred, obj) - else: - g = rdfGraphBody(self.request.body, self.request.headers) - assert len(g) == 1, len(g) - stmt = g.triples((None, None, None)).next() - self._onStatement(stmt) - + for stmt in rdf_over_http.rdfStatementsFromRequest( + self.request.arguments, + self.request.body, + self.request.headers): + self._onStatement(stmt) + def _onStatement(self, stmt): + log.info(f'incoming statement: {stmt}') ignored = True for dev, attrs in devs.items(): if stmt[0:2] == (dev, ROOM['brightness']): @@ -100,5 +87,5 @@ for dev, attrs in devs.items(): masterGraph.patchObject(attrs['ctx'], dev, ROOM['brightness'], Literal(0.0)) - + reactor.run()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/mqtt_graph_bridge/rdf_over_http.py Fri Jan 31 23:54:20 2020 -0800 @@ -0,0 +1,34 @@ +from rdflib import Graph, URIRef, Literal, Namespace +from rdflib.parser import StringInputSource + +ROOM = Namespace('http://projects.bigasterisk.com/room/') + + +def rdfGraphBody(body, headers): + g = Graph() + g.parse(StringInputSource(body), format='nt') + return g + + +def expandQueryParamUri(txt) -> URIRef: + if txt.startswith(':'): + return ROOM[txt.lstrip(':')] + # etc + return URIRef(txt) + + +def rdfStatementsFromRequest(arg, body, headers): + if arg.get('s') and arg.get('p'): + subj = expandQueryParamUri(arg['s'][-1]) + pred = expandQueryParamUri(arg['p'][-1]) + turtleLiteral = body + try: + obj = Literal(float(turtleLiteral)) + except ValueError: + obj = Literal(turtleLiteral) + yield (subj, pred, obj) + else: + g = rdfGraphBody(body, headers) + assert len(g) == 1, len(g) + yield g.triples((None, None, None)).next() + # could support multiple stmts