Esempio n. 1
0
    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)))
Esempio n. 2
0
File: trace.py Progetto: ktbs/ktbs
    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)))
Esempio n. 3
0
 def get_trace_end_dt(self):
     """
     I return the end timestamp of the obsel.
     """
     return lit2datetime(self.state.value(self.uri, KTBS.hasTraceEndDT))
Esempio n. 4
0
 def get_trace_begin_dt(self):
     """
     I return the begin dateteime of the obsel.
     """
     return lit2datetime(self.state.value(self.uri, KTBS.hasTraceBeginDT))
Esempio n. 5
0
    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 == []
Esempio n. 6
0
    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, [])