|
|
|
@ -18,15 +18,18 @@ import jsonschema
|
|
|
|
|
|
|
|
|
|
from flask import Response as FlaskResponse
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEFINITIONS_FILE = 'definitions.json'
|
|
|
|
|
CONTEXT_PATH = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'schemas', 'context.jsonld')
|
|
|
|
|
CONTEXT_PATH = os.path.join(
|
|
|
|
|
os.path.dirname(os.path.realpath(__file__)), 'schemas', 'context.jsonld')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_schema_path(schema_file, absolute=False):
|
|
|
|
|
if absolute:
|
|
|
|
|
return os.path.realpath(schema_file)
|
|
|
|
|
else:
|
|
|
|
|
return os.path.join(os.path.dirname(os.path.realpath(__file__)), 'schemas', schema_file)
|
|
|
|
|
return os.path.join(
|
|
|
|
|
os.path.dirname(os.path.realpath(__file__)), 'schemas',
|
|
|
|
|
schema_file)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def read_schema(schema_file, absolute=False):
|
|
|
|
@ -34,13 +37,13 @@ def read_schema(schema_file, absolute=False):
|
|
|
|
|
schema_uri = 'file://{}'.format(schema_path)
|
|
|
|
|
with open(schema_path) as f:
|
|
|
|
|
return jsonref.load(f, base_uri=schema_uri)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
base_schema = read_schema(DEFINITIONS_FILE)
|
|
|
|
|
logging.debug(base_schema)
|
|
|
|
|
|
|
|
|
|
class Context(dict):
|
|
|
|
|
|
|
|
|
|
class Context(dict):
|
|
|
|
|
@staticmethod
|
|
|
|
|
def load(context):
|
|
|
|
|
logging.debug('Loading context: {}'.format(context))
|
|
|
|
@ -60,17 +63,16 @@ class Context(dict):
|
|
|
|
|
except IOError:
|
|
|
|
|
return context
|
|
|
|
|
else:
|
|
|
|
|
raise AttributeError('Please, provide a valid context')
|
|
|
|
|
raise AttributeError('Please, provide a valid context')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
base_context = Context.load(CONTEXT_PATH)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SenpyMixin(object):
|
|
|
|
|
context = base_context["@context"]
|
|
|
|
|
|
|
|
|
|
def flask(self,
|
|
|
|
|
in_headers=False,
|
|
|
|
|
headers=None,
|
|
|
|
|
**kwargs):
|
|
|
|
|
def flask(self, in_headers=False, headers=None, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
Return the values and error to be used in flask.
|
|
|
|
|
So far, it returns a fixed context. We should store/generate different
|
|
|
|
@ -87,33 +89,34 @@ class SenpyMixin(object):
|
|
|
|
|
'rel="http://www.w3.org/ns/json-ld#context";'
|
|
|
|
|
' type="application/ld+json"' % url)
|
|
|
|
|
})
|
|
|
|
|
return FlaskResponse(json.dumps(js, indent=2, sort_keys=True),
|
|
|
|
|
status=getattr(self, "status", 200),
|
|
|
|
|
headers=headers,
|
|
|
|
|
mimetype="application/json")
|
|
|
|
|
|
|
|
|
|
return FlaskResponse(
|
|
|
|
|
json.dumps(
|
|
|
|
|
js, indent=2, sort_keys=True),
|
|
|
|
|
status=getattr(self, "status", 200),
|
|
|
|
|
headers=headers,
|
|
|
|
|
mimetype="application/json")
|
|
|
|
|
|
|
|
|
|
def serializable(self):
|
|
|
|
|
def ser_or_down(item):
|
|
|
|
|
if hasattr(item, 'serializable'):
|
|
|
|
|
return item.serializable()
|
|
|
|
|
elif isinstance(item, dict):
|
|
|
|
|
temp = dict()
|
|
|
|
|
for kp in item:
|
|
|
|
|
vp = item[kp]
|
|
|
|
|
temp[kp] = ser_or_down(vp)
|
|
|
|
|
return temp
|
|
|
|
|
elif isinstance(item, list):
|
|
|
|
|
return list(ser_or_down(i) for i in item)
|
|
|
|
|
else:
|
|
|
|
|
return item
|
|
|
|
|
return ser_or_down(self._plain_dict())
|
|
|
|
|
if hasattr(item, 'serializable'):
|
|
|
|
|
return item.serializable()
|
|
|
|
|
elif isinstance(item, dict):
|
|
|
|
|
temp = dict()
|
|
|
|
|
for kp in item:
|
|
|
|
|
vp = item[kp]
|
|
|
|
|
temp[kp] = ser_or_down(vp)
|
|
|
|
|
return temp
|
|
|
|
|
elif isinstance(item, list):
|
|
|
|
|
return list(ser_or_down(i) for i in item)
|
|
|
|
|
else:
|
|
|
|
|
return item
|
|
|
|
|
|
|
|
|
|
return ser_or_down(self._plain_dict())
|
|
|
|
|
|
|
|
|
|
def jsonld(self, with_context=True, context_uri=None):
|
|
|
|
|
ser = self.serializable()
|
|
|
|
|
|
|
|
|
|
if with_context:
|
|
|
|
|
if with_context:
|
|
|
|
|
context = []
|
|
|
|
|
if context_uri:
|
|
|
|
|
context = context_uri
|
|
|
|
@ -133,10 +136,8 @@ class SenpyMixin(object):
|
|
|
|
|
ser["@context"] = context
|
|
|
|
|
return ser
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def to_JSON(self, *args, **kwargs):
|
|
|
|
|
js = json.dumps(self.jsonld(*args, **kwargs), indent=4,
|
|
|
|
|
sort_keys=True)
|
|
|
|
|
js = json.dumps(self.jsonld(*args, **kwargs), indent=4, sort_keys=True)
|
|
|
|
|
return js
|
|
|
|
|
|
|
|
|
|
def validate(self, obj=None):
|
|
|
|
@ -145,18 +146,19 @@ class SenpyMixin(object):
|
|
|
|
|
if hasattr(obj, "jsonld"):
|
|
|
|
|
obj = obj.jsonld()
|
|
|
|
|
jsonschema.validate(obj, self.schema)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SenpyModel(SenpyMixin, dict):
|
|
|
|
|
|
|
|
|
|
schema = base_schema
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
self.id = kwargs.pop('id', '{}_{}'.format(type(self).__name__,
|
|
|
|
|
time.time()))
|
|
|
|
|
self.id = kwargs.pop('id', '{}_{}'.format(
|
|
|
|
|
type(self).__name__, time.time()))
|
|
|
|
|
|
|
|
|
|
temp = dict(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
for obj in [self.schema,]+self.schema.get('allOf', []):
|
|
|
|
|
for obj in [self.schema, ] + self.schema.get('allOf', []):
|
|
|
|
|
for k, v in obj.get('properties', {}).items():
|
|
|
|
|
if 'default' in v:
|
|
|
|
|
temp[k] = copy.deepcopy(v['default'])
|
|
|
|
@ -172,7 +174,6 @@ class SenpyModel(SenpyMixin, dict):
|
|
|
|
|
self.__dict__['context'] = Context.load(context)
|
|
|
|
|
super(SenpyModel, self).__init__(temp)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_key(self, key):
|
|
|
|
|
key = key.replace("__", ":", 1)
|
|
|
|
|
return key
|
|
|
|
@ -180,7 +181,6 @@ class SenpyModel(SenpyMixin, dict):
|
|
|
|
|
def __setitem__(self, key, value):
|
|
|
|
|
dict.__setitem__(self, key, value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __delitem__(self, key):
|
|
|
|
|
dict.__delitem__(self, key)
|
|
|
|
|
|
|
|
|
@ -195,62 +195,80 @@ class SenpyModel(SenpyMixin, dict):
|
|
|
|
|
|
|
|
|
|
def __delattr__(self, key):
|
|
|
|
|
self.__delitem__(self._get_key(key))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _plain_dict(self):
|
|
|
|
|
d = { k: v for (k,v) in self.items() if k[0] != "_"}
|
|
|
|
|
d = {k: v for (k, v) in self.items() if k[0] != "_"}
|
|
|
|
|
d["@id"] = d.pop('id')
|
|
|
|
|
return d
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Response(SenpyModel):
|
|
|
|
|
schema = read_schema('response.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Results(SenpyModel):
|
|
|
|
|
schema = read_schema('results.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Entry(SenpyModel):
|
|
|
|
|
schema = read_schema('entry.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Sentiment(SenpyModel):
|
|
|
|
|
schema = read_schema('sentiment.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Analysis(SenpyModel):
|
|
|
|
|
schema = read_schema('analysis.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EmotionSet(SenpyModel):
|
|
|
|
|
schema = read_schema('emotionSet.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Emotion(SenpyModel):
|
|
|
|
|
schema = read_schema('emotion.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EmotionModel(SenpyModel):
|
|
|
|
|
schema = read_schema('emotionModel.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Suggestion(SenpyModel):
|
|
|
|
|
schema = read_schema('suggestion.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PluginModel(SenpyModel):
|
|
|
|
|
schema = read_schema('plugin.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EmotionPluginModel(SenpyModel):
|
|
|
|
|
schema = read_schema('plugin.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SentimentPluginModel(SenpyModel):
|
|
|
|
|
schema = read_schema('plugin.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Plugins(SenpyModel):
|
|
|
|
|
schema = read_schema('plugins.json')
|
|
|
|
|
|
|
|
|
|
class Error(SenpyMixin, BaseException ):
|
|
|
|
|
|
|
|
|
|
def __init__(self, message, status=500, params=None, errors=None, *args, **kwargs):
|
|
|
|
|
class Error(SenpyMixin, BaseException):
|
|
|
|
|
def __init__(self,
|
|
|
|
|
message,
|
|
|
|
|
status=500,
|
|
|
|
|
params=None,
|
|
|
|
|
errors=None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs):
|
|
|
|
|
self.message = message
|
|
|
|
|
self.status = status
|
|
|
|
|
self.params = params or {}
|
|
|
|
|
self.errors = errors or ""
|
|
|
|
|
|
|
|
|
|
def _plain_dict(self):
|
|
|
|
|
return self.__dict__
|
|
|
|
|
return self.__dict__
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return str(self.jsonld())
|
|
|
|
|
return str(self.jsonld())
|
|
|
|
|