Module conversationkg.conversations.ledger

Expand source code
# -*- coding: utf-8 -*-

import json
import importlib



#%%


#class Universe(type):
#    d = {}
#    
#    def __call__(cls, *args, **kwargs):
#        obj = type.__call__(cls, *args, **kwargs)
#        
#        if hash(obj) in Universe.d:
#            print(f"found {obj} in d")
#            return Universe.d[hash(obj)]
#        
#        else:
#            print(f"{obj} not in d")
#            Universe.d[hash(obj)] = obj
#            return obj
#        
#        
#class X(metaclass=Universe):
#    def __init__(self, x):
#        self.x = x
#    
#    def __hash__(self):
#        return hash(self.x)
        
#%%


import datetime

class Universe(type):
    current_timer = None
    current_time = datetime.datetime(1, 1, 1)
    
    times = []
    timers = []
    observed = dict()
    
    def __call__(cls, *args, **kwargs):
        obj = type.__call__(cls, *args, **kwargs)
        
        if hasattr(obj, "time"):
            Universe.times.append(obj.time)
            Universe.timers.append(obj)
        
        return obj
    
#        obj = type.__call__(cls, *args, **kwargs)
#        
#        if hasattr(obj, "time"):
#            Universe.current_timer = obj
#            Universe.current_time = obj.time
##            print(f"obj of type {obj.__class__.__name__}")
#
#        if hash(obj) in Universe.observed:
#            return Universe.observed[hash(obj)]
#        else:
#            if not hasattr(obj, "time_first_observed"):
#                obj.time_first_observed = []
#            obj.time_first_observed.append(Universe.current_time)
#            Universe.observed[hash(obj)] = obj
#            return obj
            
    @classmethod
    def observe(cls, obj, witness, mode):
        pass






# a.k.a. Ledger, FactUniverse
#class Universe(type):        
#    mentioned_in = dict()
#    evidenced_by = dict()
#    
#    nothing_to_register = []
#    def __call__(cls, *args, **kwargs):
#        obj = type.__call__(cls, *args, **kwargs)
#        
#        if "evidenced_by" in kwargs:
#            witness = kwargs["evidenced_by"]
#            Universe.observe(obj, witness, "evidenced_by")
#            
#        elif "mentioned_in" in kwargs:
#            witness = kwargs["mentioned_in"]
#            Universe.observe(obj, witness, "mentioned_in")
#            
#        else:
#            Universe.nothing_to_register.append(obj)
#
#        return obj
#    
#    @classmethod
#    def reset(cls):
#        cls.mentioned_in = dict()
#        cls.evidenced_by = dict()
#        
#    @classmethod 
#    def observe(cls, obj, witness, mode):    
##        print(obj, mode)
#        
#        mode_dict = getattr(cls, mode)    
##        obj_cls = type(obj)
##        witness_cls = type(witness)
#        k, v = obj, witness
#        if not k in mode_dict:
#            mode_dict[k] = []
#        mode_dict[k].append(v)
        
#    @classmethod
#    def to_json(cls, dumps=False):
#        raise NotImplementedError()
#    
#    @classmethod
#    def from_json(cls, json_dict):
#        raise NotImplementedError()
        
        
#%%        
        
"""
IDEA

instantiate Universe in an object, make ledgers object specific and override the __call__ function to 


"""
        
# a.k.a. Ledger, FactUniverse
class Universe2(type):        
    mentioned_in = dict()
    evidenced_by = dict()
    nothing_to_register = []
    
    name = "Universe"
    bases = object,
    
    def __new__(cls, *args):
        print(args)
        return super().__new__(cls, cls.name, cls.bases, dict())
    
    def __init__(self, *args):
        self.mentioned_in = {}
        self.evidenced_by = {}
        self.nothing_to_register = []
        
        print(self)
        self.__class__.__call__ = self.call_self #self.get_call_self()
    
    def call_self(self, *args, **kwargs):
        print("SELF:", self)
        obj = type.__call__(self.__class__, *args, **kwargs)
        self.evidenced_by[hash(obj)] = obj
        return obj
        

    
    
    
    def get_call_self(self):
        def call_self(cls, *args, **kwargs):
            obj = cls.__call__(*args, **kwargs)
            return obj
        return call_self
            
    def __call__(cls, *args, **kwargs):
        print(args)
        universe_obj = cls
        if "self" in kwargs:
            print("SELF:", kwargs["self"])
            universe_obj = kwargs["self"]
            
        print(cls, isinstance(cls, Universe))
        obj = type.__call__(cls, *args, **kwargs)
        
        universe_obj[hash(obj)] = obj
#        
#        if "evidenced_by" in kwargs:
#            witness = kwargs["evidenced_by"]
#            universe_obj.observe(obj, witness, "evidenced_by")
#            
#        elif "mentioned_in" in kwargs:
#            witness = kwargs["mentioned_in"]
#            universe_obj.observe(obj, witness, "mentioned_in")
#            
#        else:
#            universe_obj.nothing_to_register.append(obj)

        return obj
    
    @classmethod
    def reset(cls):
        cls.mentioned_in = dict()
        cls.evidenced_by = dict()
        
    @classmethod 
    def observe(cls, obj, witness, mode):        
        mode_dict = getattr(cls, mode)    
        k, v = obj, witness
        if not k in mode_dict:
            mode_dict[k] = []
        mode_dict[k].append(v)
        
    @classmethod
    def to_json(cls, dumps=False):
        raise NotImplementedError()
    
    @classmethod
    def from_json(cls, json_dict):
        raise NotImplementedError()

#%%        


#class X(metaclass=Universe):
#    def __new__(cls, x):
#        print("new", x)
#        self = super().__new__(cls)
#        return self
#    
#    def __init__(self, x):
#        print("hello", x)
#        self.x = x
#        
#    def __hash__(self):
#        return hash((self.__class__.__name__, self.x))
        
#%%




#class Conversation(tuple):
#    def __new__(cls, email_args):
#        self =  super().__new__(cls, (Email(*args) for args in email_args))
#        for email in self:
#            Universe.observe(email, self, "evidenced_by")
#        return self
#    
#    
#
#
#
#class Email(metaclass=Universe):
#    def __init__(self, body, sender, receiver):        
#        self.body = Body(body, evidenced_by=self)
#        
#        self.entities = [Person(w, "", mentioned_in=self.body) for w in self.body.split(" ")]
#        
#        self.sender = Person(*sender, evidenced_by=self)
#        self.receiver = Person(*receiver, evidenced_by=self)
#        
#    def __hash__(self):
#        return hash((self.body, self.sender, self.receiver))
#
#
#class EntityUniverse(Universe):
#    entities = set()
#    def __call__(cls, *args, **kwargs):
#        obj = Universe.__call__(cls, *args, **kwargs)
#        
#        EntityUniverse.entities.add(obj)
#        
#        return obj
#
#
#class Entity(metaclass=EntityUniverse):
#    def __init__(self, name, **kwargs):
#        self.name = name
#        
#        
#    def __hash__(self):
#        return hash(self.name)
#
#    def __str__(self):
#        return repr(self)
#        
#    def __repr__(self):
#        return str(self.name)
#
#
#class Person(Entity):
#    def __init__(self, name, address, **kwargs):
#        super().__init__(name)
#        
#        self.address = address
#
#    def __hash__(self):
#        return hash((self.name, self.address))
#    
#        
#class Body(str, metaclass=Universe):
#    def __new__(cls, body, **kwargs):
#        return super().__new__(cls, body)
#        
#    def __init__(self, body, **kwargs):
#        pass

Classes

class Universe (*args, **kwargs)

type(object_or_name, bases, dict) type(object) -> the object's type type(name, bases, dict) -> a new type

Expand source code
class Universe(type):
    current_timer = None
    current_time = datetime.datetime(1, 1, 1)
    
    times = []
    timers = []
    observed = dict()
    
    def __call__(cls, *args, **kwargs):
        obj = type.__call__(cls, *args, **kwargs)
        
        if hasattr(obj, "time"):
            Universe.times.append(obj.time)
            Universe.timers.append(obj)
        
        return obj
    
#        obj = type.__call__(cls, *args, **kwargs)
#        
#        if hasattr(obj, "time"):
#            Universe.current_timer = obj
#            Universe.current_time = obj.time
##            print(f"obj of type {obj.__class__.__name__}")
#
#        if hash(obj) in Universe.observed:
#            return Universe.observed[hash(obj)]
#        else:
#            if not hasattr(obj, "time_first_observed"):
#                obj.time_first_observed = []
#            obj.time_first_observed.append(Universe.current_time)
#            Universe.observed[hash(obj)] = obj
#            return obj
            
    @classmethod
    def observe(cls, obj, witness, mode):
        pass

Ancestors

  • builtins.type

Class variables

var current_time
var current_timer
var observed
var timers
var times

Static methods

def observe(obj, witness, mode)
Expand source code
@classmethod
def observe(cls, obj, witness, mode):
    pass
class Universe2 (*args)

type(object_or_name, bases, dict) type(object) -> the object's type type(name, bases, dict) -> a new type

Expand source code
class Universe2(type):        
    mentioned_in = dict()
    evidenced_by = dict()
    nothing_to_register = []
    
    name = "Universe"
    bases = object,
    
    def __new__(cls, *args):
        print(args)
        return super().__new__(cls, cls.name, cls.bases, dict())
    
    def __init__(self, *args):
        self.mentioned_in = {}
        self.evidenced_by = {}
        self.nothing_to_register = []
        
        print(self)
        self.__class__.__call__ = self.call_self #self.get_call_self()
    
    def call_self(self, *args, **kwargs):
        print("SELF:", self)
        obj = type.__call__(self.__class__, *args, **kwargs)
        self.evidenced_by[hash(obj)] = obj
        return obj
        

    
    
    
    def get_call_self(self):
        def call_self(cls, *args, **kwargs):
            obj = cls.__call__(*args, **kwargs)
            return obj
        return call_self
            
    def __call__(cls, *args, **kwargs):
        print(args)
        universe_obj = cls
        if "self" in kwargs:
            print("SELF:", kwargs["self"])
            universe_obj = kwargs["self"]
            
        print(cls, isinstance(cls, Universe))
        obj = type.__call__(cls, *args, **kwargs)
        
        universe_obj[hash(obj)] = obj
#        
#        if "evidenced_by" in kwargs:
#            witness = kwargs["evidenced_by"]
#            universe_obj.observe(obj, witness, "evidenced_by")
#            
#        elif "mentioned_in" in kwargs:
#            witness = kwargs["mentioned_in"]
#            universe_obj.observe(obj, witness, "mentioned_in")
#            
#        else:
#            universe_obj.nothing_to_register.append(obj)

        return obj
    
    @classmethod
    def reset(cls):
        cls.mentioned_in = dict()
        cls.evidenced_by = dict()
        
    @classmethod 
    def observe(cls, obj, witness, mode):        
        mode_dict = getattr(cls, mode)    
        k, v = obj, witness
        if not k in mode_dict:
            mode_dict[k] = []
        mode_dict[k].append(v)
        
    @classmethod
    def to_json(cls, dumps=False):
        raise NotImplementedError()
    
    @classmethod
    def from_json(cls, json_dict):
        raise NotImplementedError()

Ancestors

  • builtins.type

Class variables

var bases
var evidenced_by
var mentioned_in
var name
var nothing_to_register

Static methods

def from_json(json_dict)
Expand source code
@classmethod
def from_json(cls, json_dict):
    raise NotImplementedError()
def observe(obj, witness, mode)
Expand source code
@classmethod 
def observe(cls, obj, witness, mode):        
    mode_dict = getattr(cls, mode)    
    k, v = obj, witness
    if not k in mode_dict:
        mode_dict[k] = []
    mode_dict[k].append(v)
def reset()
Expand source code
@classmethod
def reset(cls):
    cls.mentioned_in = dict()
    cls.evidenced_by = dict()
def to_json(dumps=False)
Expand source code
@classmethod
def to_json(cls, dumps=False):
    raise NotImplementedError()

Methods

def call_self(self, *args, **kwargs)
Expand source code
def call_self(self, *args, **kwargs):
    print("SELF:", self)
    obj = type.__call__(self.__class__, *args, **kwargs)
    self.evidenced_by[hash(obj)] = obj
    return obj
def get_call_self(self)
Expand source code
def get_call_self(self):
    def call_self(cls, *args, **kwargs):
        obj = cls.__call__(*args, **kwargs)
        return obj
    return call_self