def complete_new_graph(cls, service, uri, parameters, new_graph, resource=None): """I implement :meth:`ILocalCore.complete_new_graph`. At create time, I add default values for missing information about the trace. """ super(StoredTrace, cls).complete_new_graph(service, uri, parameters, new_graph, resource) if resource is None: origin = new_graph.value(uri, KTBS.hasOrigin) if origin is None: origin = Literal("o" + random_token(32)) # start origin with a letter because if it starts with 4 digits, # it will be misinterpreted for a year new_graph.add((uri, KTBS.hasOrigin, origin)) elif unicode(origin) == "now": origin = Literal("%sZ" % datetime.utcnow().isoformat()) new_graph.set((uri, KTBS.hasOrigin, origin)) # compute begin and/or end if beginDT and/or endDT are provided begin_dt = lit2datetime(new_graph.value(uri, KTBS.hasTraceBeginDT)) end_dt = lit2datetime(new_graph.value(uri, KTBS.hasTraceEndDT)) if begin_dt or end_dt: model = universal_factory(new_graph.value(uri, KTBS.hasModel), [KTBS.TraceModel]) delta2unit = get_converter_to_unit(model.unit) origin = lit2datetime(new_graph.value(uri, KTBS.hasOrigin)) if origin is not None: if delta2unit is not None: if begin_dt is not None: begin = delta2unit(begin_dt - origin) new_graph.add( (uri, KTBS.hasTraceBegin, Literal(begin))) if end_dt is not None: end = delta2unit(end_dt - origin) new_graph.add((uri, KTBS.hasTraceEnd, Literal(end)))
def complete_new_graph(cls, service, uri, parameters, new_graph, resource=None): """I implement :meth:`ILocalCore.complete_new_graph`. At create time, I add default values for missing information about the trace. """ super(StoredTrace, cls).complete_new_graph(service, uri, parameters, new_graph, resource) if resource is None: origin = new_graph.value(uri, KTBS.hasOrigin) if origin is None: origin = Literal("o"+random_token(32)) # start origin with a letter because if it starts with 4 digits, # it will be misinterpreted for a year new_graph.add((uri, KTBS.hasOrigin, origin)) elif unicode(origin) == "now": origin = Literal("%sZ" % datetime.utcnow().isoformat()) new_graph.set((uri, KTBS.hasOrigin, origin)) # compute begin and/or end if beginDT and/or endDT are provided begin_dt = lit2datetime(new_graph.value(uri, KTBS.hasTraceBeginDT)) end_dt = lit2datetime(new_graph.value(uri, KTBS.hasTraceEndDT)) if begin_dt or end_dt: model = universal_factory(new_graph.value(uri, KTBS.hasModel), [KTBS.TraceModel]) delta2unit = get_converter_to_unit(model.unit) origin = lit2datetime(new_graph.value(uri, KTBS.hasOrigin)) if origin is not None: if delta2unit is not None: if begin_dt is not None: begin = delta2unit(begin_dt - origin) new_graph.add((uri, KTBS.hasTraceBegin, Literal(begin))) if end_dt is not None: end = delta2unit(end_dt - origin) new_graph.add((uri, KTBS.hasTraceEnd, Literal(end)))
def get_trace_end_dt(self): """ I return the end timestamp of the obsel. """ return lit2datetime(self.state.value(self.uri, KTBS.hasTraceEndDT))
def get_trace_begin_dt(self): """ I return the begin dateteime of the obsel. """ return lit2datetime(self.state.value(self.uri, KTBS.hasTraceBeginDT))
def test_ktbs(self): my_ktbs = self.my_ktbs with assert_raises(MethodNotAllowedError): my_ktbs.delete() assert len(my_ktbs.builtin_methods) == 9 assert my_ktbs.bases == [] base = my_ktbs.create_base(label="My new base") print "--- base:", base assert base.label == "My new base" base.label = "My base" assert base.label == "My base" assert my_ktbs.bases == [base] assert base.models == [] model1 = base.create_model(id=None, label="My first trace-model") print "--- model1:", model1 assert model1.label == "My first trace-model" assert base.models == [model1] assert model1.unit == KTBS.millisecond model1.unit = KTBS.second assert model1.unit == KTBS.second model2 = base.create_model("model2") assert model2.uri == URIRef(base.uri + "model2") assert len(base.models) == 2 assert model1.obsel_types == [] with assert_raises(InvalidDataError): model1.create_obsel_type("OpenChat") # leading '#' is missing open_chat = model1.create_obsel_type("#OpenChat") print "--- obsel type open_chat:", open_chat assert model1.obsel_types == [open_chat] with assert_raises(InvalidDataError): model1.create_obsel_type("#OpenChat") # already in use with_on_channel = model1.create_obsel_type("#WithOnChannel") abstract_msg = model1.create_obsel_type("#AbstractMsg", [with_on_channel]) send_msg = model1.create_obsel_type("#SendMsg", [abstract_msg.uri]) recv_msg = model1.create_obsel_type("#RecvMsg", ["#AbstractMsg"]) close_chat = model1.create_obsel_type("#CloseChat", [with_on_channel]) assert len(model1.obsel_types) == 6 assert model1.attribute_types == [] with assert_raises(InvalidDataError): model1.create_attribute_type("channel", [open_chat]) # leading '#' is missing channel = model1.create_attribute_type("#channel", [open_chat]) print "--- attribute type channel:", channel assert model1.attribute_types == [channel] with assert_raises(InvalidDataError): model1.create_attribute_type("#channel", [open_chat]) # already in use msg = model1.create_attribute_type("#msg", ["#AbstractMsg"]) with assert_raises(InvalidDataError): recv_msg.create_attribute_type("from") # leading '#' is missing recv_msg.create_attribute_type("#from") with assert_raises(InvalidDataError): send_msg.create_attribute_type("#from") # already in use in this *model1* (even if on another obsel type) assert len(model1.attribute_types) == 3 assert model1.relation_types == [] with assert_raises(InvalidDataError): model1.create_relation_type("onChannel", [with_on_channel], ["#OpenChat"]) # leading '#' is missing on_channel = model1.create_relation_type("#onChannel", [with_on_channel], ["#OpenChat"]) print "--- relation type on_channel:", on_channel assert model1.relation_types == [on_channel] with assert_raises(InvalidDataError): model1.create_relation_type("#onChannel", [open_chat], [with_on_channel]) # already in use in this *model1* (even if on another obsel type) with assert_raises(InvalidDataError): close_chat.create_relation_type("closes", ["#OpenChat"], [on_channel]) # leading '#' is missing closes = close_chat.create_relation_type("#closes", ["#OpenChat"], [on_channel]) with assert_raises(InvalidDataError): open_chat.create_relation_type("#closes", [with_on_channel], [on_channel]) # already in use in this *model1* (even if on another obsel type) assert len(model1.relation_types) == 2 assert base.methods == [] method1 = base.create_method("method1", KTBS.external, {"command-line": cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z"}) print "--- method1:", method1 assert base.methods == [method1] with assert_raises(InvalidDataError): base.create_method("method2", model1) # parent is not a method with assert_raises(InvalidDataError): base.create_method("method2", "method3") # parent doesn't exist with assert_raises(InvalidDataError): base.create_method("method2", "http://example.org/") # parent is neither in same base nor built-in method2 = base.create_method(None, method1, {"foo": "FOO"}, label="m2") if not isinstance(method2, HttpClientCore): ## the test above fails in TestHttpKtbs, because method2.parent ## returns a rdfrest.cores.local.LocalCore -- this is a side ## effect of having the HTTP server in the same process as the ## client assert method2.parent is method1 assert method2.parent.uri == method1.uri assert method1.children == [method2] assert method2.parameters_as_dict == \ {"command-line":cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z", "foo":"FOO"} assert method2.get_parameter("foo") == "FOO" assert method2.get_parameter("command-line") == cmdline # inherited method2.set_parameter("foo", "BAR") assert method2.get_parameter("foo") == "BAR" method2.set_parameter("command-line", "456789") # can override inherited method2.set_parameter("command-line", None) # can remove override assert len(base.methods) == 2 assert method1.used_by == [] assert method2.used_by == [] assert base.traces == [] with assert_raises(InvalidDataError): trace1 = base.create_stored_trace("trace1", model2) # URI must end with '/' with assert_raises(ValueError): trace1 = base.create_stored_trace("trace1/") # stored trace must have a model trace1 = base.create_stored_trace(None, model2, label="trace1") with assert_raises(InvalidDataError): trace1 = base.create_stored_trace(trace1.uri, model2) # trace already exists print "--- trace1:", trace1 assert base.traces == [trace1] if not isinstance(trace1, HttpClientCore): ## see similar exception above assert trace1.model is model2 assert trace1.model_uri == model2.uri trace1.model = str(model1.uri) if not isinstance(trace1, HttpClientCore): ## see similar exception above assert trace1.model is model1 assert trace1.model_uri == model1.uri if isinstance(trace1, LocalCore): ## only the local implementation of AbstractTrace has a unit prop assert trace1.unit == model1.unit assert lit2datetime(trace1.origin) == None trace1.origin = origin = datetime.now(UTC) assert (timedelta(microseconds=-1) <= (lit2datetime(trace1.origin) - origin) <= timedelta(microseconds=1)) # above, we do not test for equality, because *sometimes* there is a # difference of 1µs (rounding error?) assert trace1.default_subject == None trace1.default_subject = URIRef("http://example.org/alice") assert trace1.default_subject == URIRef("http://example.org/alice") trace1.default_subject = "alice" assert trace1.default_subject == Literal("alice") assert trace1.obsels == [] trace1.origin = datetime.now(UTC) with assert_raises(ValueError): obs1 = trace1.create_obsel(None) # obsel must have an obsel type obs1 = trace1.create_obsel(None, open_chat.uri) print "--- obs1:", obs1 assert trace1.obsels == [obs1] assert obs1.obsel_type == open_chat assert obs1.begin <= 2, obs1.begin # approximating the delay to 2s max assert obs1.begin == obs1.end assert obs1.subject == trace1.default_subject obs2 = trace1.create_obsel(None, open_chat, obs1.end+1, obs1.end+2, "alice", { msg.uri: "hello world" }, [ (on_channel, obs1) ], [], [obs1], "obs #2") assert len(base.traces) == 1 with assert_raises(InvalidDataError): ctr = base.create_computed_trace("ctr", method1) # URI must end with '/' with assert_raises(ValueError): ctr = base.create_computed_trace("ctr/") # computed trace must have a model ctr = base.create_computed_trace(None, method1, label="ctr") with assert_raises(InvalidDataError): ctr = base.create_computed_trace(ctr.uri, method1) # trace already exists print "--- ctr:", ctr assert len(base.traces) == 2 if not isinstance(ctr, HttpClientCore): ## see similar exception above assert ctr.method is method1 assert ctr.method.uri == method1.uri ctr.method = str(method2.uri) assert method2.used_by == [ctr] assert method2.parameters_as_dict == \ {"command-line":cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z", "foo":"BAR"} # inherited ctr.set_parameter("baz", "BAZ") assert ctr.parameters_as_dict == \ {"command-line":cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z", "foo":"BAR", "baz": "BAZ"} assert ctr.get_parameter("baz") == "BAZ" assert ctr.get_parameter("foo") == "BAR" # inherited assert ctr.get_parameter("command-line") == cmdline # doubly inher. assert ctr.source_traces == [] print "---", "adding source" ctr.add_source_trace(trace1.uri) assert ctr.source_traces == [trace1] assert trace1.transformed_traces == [ctr] print "---", "removing source" ctr.del_source_trace(trace1.uri) assert ctr.source_traces == [] assert trace1.transformed_traces == [] ctr.add_source_trace(trace1.uri) # TODO SOON tests with model and origin with assert_raises(CanNotProceedError): base.remove() with assert_raises(CanNotProceedError): trace1.remove() # used by crt with assert_raises(CanNotProceedError): method2.remove() # used by crt with assert_raises(CanNotProceedError): method1.remove() # used by method2 # TODO SOON uncomment test below once this is implemented #with assert_raises(CanNotProceedError): # method1.remove() # used by method2 ctr.remove() trace1.remove() assert base.traces == [] model2.remove() model1.remove() assert base.models == [] method2.remove() method1.remove() assert base.methods == [] base.remove() my_ktbs.force_state_refresh() assert my_ktbs.bases == []
def test_ktbs(self): my_ktbs = self.my_ktbs with assert_raises(MethodNotAllowedError): my_ktbs.delete() assert_equal(len(my_ktbs.builtin_methods), 5) assert_equal(my_ktbs.bases, []) base = my_ktbs.create_base(label="My new base") print "--- base:", base assert_equal(base.label, "My new base") base.label = "My base" assert_equal(base.label, "My base") assert_equal(my_ktbs.bases, [base]) assert_equal(base.models, []) model1 = base.create_model(id=None, label="My first trace-model") print "--- model1:", model1 assert_equal(model1.label, "My first trace-model") assert_equal(base.models, [model1]) assert_equal(model1.unit, KTBS.millisecond) model1.unit = KTBS.second assert_equal(model1.unit, KTBS.second) model2 = base.create_model("model2") assert_equal(model2.uri, URIRef(base.uri + "model2")) assert_equal(len(base.models), 2) assert_equal(model1.obsel_types, []) with assert_raises(InvalidDataError): model1.create_obsel_type("OpenChat") # leading '#' is missing open_chat = model1.create_obsel_type("#OpenChat") print "--- obsel type open_chat:", open_chat assert_equal(model1.obsel_types, [open_chat]) with assert_raises(InvalidDataError): model1.create_obsel_type("#OpenChat") # already in use with_on_channel = model1.create_obsel_type("#WithOnChannel") abstract_msg = model1.create_obsel_type("#AbstractMsg", [with_on_channel]) send_msg = model1.create_obsel_type("#SendMsg", [abstract_msg.uri]) recv_msg = model1.create_obsel_type("#RecvMsg", ["#AbstractMsg"]) close_chat = model1.create_obsel_type("#CloseChat", [with_on_channel]) assert_equal(len(model1.obsel_types), 6) assert_equal(model1.attribute_types, []) with assert_raises(InvalidDataError): model1.create_attribute_type("channel", [open_chat]) # leading '#' is missing channel = model1.create_attribute_type("#channel", [open_chat]) print "--- attribute type channel:", channel assert_equal(model1.attribute_types, [channel]) with assert_raises(InvalidDataError): model1.create_attribute_type("#channel", [open_chat]) # already in use msg = model1.create_attribute_type("#msg", ["#AbstractMsg"]) with assert_raises(InvalidDataError): recv_msg.create_attribute_type("from") # leading '#' is missing recv_msg.create_attribute_type("#from") with assert_raises(InvalidDataError): send_msg.create_attribute_type("#from") # already in use in this *model1* (even if on another obsel type) assert_equal(len(model1.attribute_types), 3) assert_equal(model1.relation_types, []) with assert_raises(InvalidDataError): model1.create_relation_type("onChannel", [with_on_channel], ["#OpenChat"]) # leading '#' is missing on_channel = model1.create_relation_type("#onChannel", [with_on_channel], ["#OpenChat"]) print "--- relation type on_channel:", on_channel assert_equal(model1.relation_types, [on_channel]) with assert_raises(InvalidDataError): model1.create_relation_type("#onChannel", [open_chat], [with_on_channel]) # already in use in this *model1* (even if on another obsel type) with assert_raises(InvalidDataError): close_chat.create_relation_type("closes", ["#OpenChat"], [on_channel]) # leading '#' is missing closes = close_chat.create_relation_type("#closes", ["#OpenChat"], [on_channel]) with assert_raises(InvalidDataError): open_chat.create_relation_type("#closes", [with_on_channel], [on_channel]) # already in use in this *model1* (even if on another obsel type) assert_equal(len(model1.relation_types), 2) assert_equal(base.methods, []) method1 = base.create_method( "method1", KTBS.external, { "command-line": cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z" }) print "--- method1:", method1 assert_equal(base.methods, [method1]) with assert_raises(InvalidDataError): base.create_method("method2", model1) # parent is not a method with assert_raises(InvalidDataError): base.create_method("method2", "method3") # parent doesn't exist with assert_raises(InvalidDataError): base.create_method("method2", "http://example.org/") # parent is neither in same base nor built-in method2 = base.create_method(None, method1, {"foo": "FOO"}, label="m2") if not isinstance(method2, HttpClientCore): ## the test above fails in TestHttpKtbs, because method2.parent ## returns a rdfrest.cores.local.LocalCore -- this is a side ## effect of having the HTTP server in the same process as the ## client assert method2.parent is method1 assert_equal(method2.parent.uri, method1.uri) assert_equal(method1.children, [method2]) assert_equal( method2.parameters_as_dict, { "command-line": cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z", "foo": "FOO" }) assert_equal(method2.get_parameter("foo"), "FOO") assert_equal(method2.get_parameter("command-line"), cmdline) # inherited method2.set_parameter("foo", "BAR") assert_equal(method2.get_parameter("foo"), "BAR") method2.set_parameter("command-line", "456789") # can override inherited method2.set_parameter("command-line", None) # can remove override assert_equal(len(base.methods), 2) assert_equal(method1.used_by, []) assert_equal(method2.used_by, []) assert_equal(base.traces, []) with assert_raises(InvalidDataError): trace1 = base.create_stored_trace("trace1", model2) # URI must end with '/' with assert_raises(ValueError): trace1 = base.create_stored_trace("trace1/") # stored trace must have a model trace1 = base.create_stored_trace(None, model2, label="trace1") with assert_raises(InvalidDataError): trace1 = base.create_stored_trace(trace1.uri, model2) # trace already exists print "--- trace1:", trace1 assert_equal(base.traces, [trace1]) if not isinstance(trace1, HttpClientCore): ## see similar exception above assert trace1.model is model2 assert_equal(trace1.model_uri, model2.uri) trace1.model = str(model1.uri) if not isinstance(trace1, HttpClientCore): ## see similar exception above assert trace1.model is model1 assert_equal(trace1.model_uri, model1.uri) if isinstance(trace1, LocalCore): ## only the local implementation of AbstractTrace has a unit prop assert_equal(trace1.unit, model1.unit) assert_equal(lit2datetime(trace1.origin), None) trace1.origin = origin = datetime.now(UTC) assert (timedelta(microseconds=-1) <= (lit2datetime(trace1.origin) - origin) <= timedelta(microseconds=1)) # above, we do not test for equality, because *sometimes* there is a # difference of 1µs (rounding error?) assert_equal(trace1.default_subject, None) trace1.default_subject = URIRef("http://example.org/alice") assert_equal(trace1.default_subject, URIRef("http://example.org/alice")) trace1.default_subject = "alice" assert_equal(trace1.default_subject, Literal("alice")) assert_equal(trace1.obsels, []) trace1.origin = datetime.now(UTC) with assert_raises(ValueError): obs1 = trace1.create_obsel(None) # obsel must have an obsel type obs1 = trace1.create_obsel(None, open_chat.uri) print "--- obs1:", obs1 assert_equal(trace1.obsels, [obs1]) assert_equal(obs1.obsel_type, open_chat) assert obs1.begin <= 2, obs1.begin # approximating the delay to 2s max assert_equal(obs1.begin, obs1.end) assert_equal(obs1.subject, trace1.default_subject) obs2 = trace1.create_obsel(None, open_chat, obs1.end + 1, obs1.end + 2, "alice", {msg.uri: "hello world"}, [(on_channel, obs1)], [], [obs1], "obs #2") assert_equal(len(base.traces), 1) with assert_raises(InvalidDataError): ctr = base.create_computed_trace("ctr", method1) # URI must end with '/' with assert_raises(ValueError): ctr = base.create_computed_trace("ctr/") # computed trace must have a model ctr = base.create_computed_trace(None, method1, label="ctr") with assert_raises(InvalidDataError): ctr = base.create_computed_trace(ctr.uri, method1) # trace already exists print "--- ctr:", ctr assert_equal(len(base.traces), 2) if not isinstance(ctr, HttpClientCore): ## see similar exception above assert ctr.method is method1 assert_equal(ctr.method.uri, method1.uri) ctr.method = str(method2.uri) assert_equal(method2.used_by, [ctr]) assert_equal( { "command-line": cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z", "foo": "BAR" }, method2.parameters_as_dict) # inherited ctr.set_parameter("baz", "BAZ") assert_equal( { "command-line": cmdline, "model": "http://example.org/model", "origin": "1970-01-01T00:00:00Z", "foo": "BAR", "baz": "BAZ" }, ctr.parameters_as_dict) assert_equal(ctr.get_parameter("baz"), "BAZ") assert_equal(ctr.get_parameter("foo"), "BAR") # inherited assert_equal(ctr.get_parameter("command-line"), cmdline) # doubly inher. assert_equal(ctr.source_traces, []) print "---", "adding source" ctr.add_source_trace(trace1.uri) assert_equal(ctr.source_traces, [trace1]) assert_equal(trace1.transformed_traces, [ctr]) print "---", "removing source" ctr.del_source_trace(trace1.uri) assert_equal(ctr.source_traces, []) assert_equal(trace1.transformed_traces, []) ctr.add_source_trace(trace1.uri) # TODO SOON tests with model and origin with assert_raises(CanNotProceedError): base.remove() with assert_raises(CanNotProceedError): trace1.remove() # used by crt with assert_raises(CanNotProceedError): method2.remove() # used by crt with assert_raises(CanNotProceedError): method1.remove() # used by method2 # TODO SOON uncomment test below once this is implemented #with assert_raises(CanNotProceedError): # method1.remove() # used by method2 ctr.remove() trace1.remove() assert_equal(base.traces, []) model2.remove() model1.remove() assert_equal(base.models, []) method2.remove() method1.remove() assert_equal(base.methods, []) base.remove() my_ktbs.force_state_refresh() assert_equal(my_ktbs.bases, [])