From f7d4552b9efa71aa33f0a3b07fb71e2744c8e0bb Mon Sep 17 00:00:00 2001 From: Timothy Cloninger Date: Tue, 4 Sep 2018 14:17:58 -0500 Subject: [PATCH 1/2] Make SDK more pythonic --- dashbot/alexa.py | 77 +++++-------------------------- dashbot/alexa_vl.py | 97 ++++++++++++++++----------------------- dashbot/generic.py | 109 ++++++++++++++++++++------------------------ dashbot/google.py | 88 ++++++----------------------------- 4 files changed, 115 insertions(+), 256 deletions(-) diff --git a/dashbot/alexa.py b/dashbot/alexa.py index 7d56aec..33747d9 100644 --- a/dashbot/alexa.py +++ b/dashbot/alexa.py @@ -1,70 +1,15 @@ -import os -import datetime import time -import json -from .version import __version__ -from . import generic +from .generic import Generic -class alexa(generic.generic): - - def __init__(self,apiKey,debug=False,printErrors=False): - - if 'DASHBOT_SERVER_ROOT' in os.environ: - serverRoot = os.environ['DASHBOT_SERVER_ROOT'] - else: - serverRoot = 'https://tracker.dashbot.io' - self.urlRoot = serverRoot + '/track' - self.apiKey=apiKey - self.debug=debug - self.printErrors=printErrors - self.platform='alexa' - self.version = __version__ - self.source = 'pip' - - def logIncoming(self,event): - url = self.urlRoot + '?apiKey=' + self.apiKey + '&type=incoming&platform='+ self.platform + '&v=' + self.version + '-' + self.source - - now = datetime.datetime.now() - timestamp = int(1000*(time.mktime(now.timetuple()) + now.microsecond * 1e-6)) - - try: - event = json.loads(event) - except Exception as e: - if self.debug: - print(e) - - data={ - 'dashbot_timestamp':timestamp, - 'event':event, - } - - if self.debug: - print('Dashbot Incoming:'+url) - print(json.dumps(data)) - - self.makeRequest(url,'POST',data) - - def logOutgoing(self,event,response): - url = self.urlRoot + '?apiKey=' + self.apiKey + '&type=outgoing&platform='+ self.platform + '&v=' + self.version + '-' + self.source - - now = datetime.datetime.now() - timestamp = int(1000*(time.mktime(now.timetuple()) + now.microsecond * 1e-6)) - - try: - event = json.loads(event) - except Exception as e: - if self.debug: - print(e) - - data={ - 'dashbot_timestamp':timestamp, - 'event':event, - 'response':response + +class Alexa(Generic): + def _load_data(**kwargs): + data = { + 'dashbot_timestamp': int(time.time() * 1000), + 'event': kwargs['event'], } - - if self.debug: - print('Dashbot Outgoing:'+url) - print(json.dumps(data)) - - self.makeRequest(url,'POST',data) \ No newline at end of file + if 'response' in kwargs: + data['response'] = kwargs['response'] + + return data diff --git a/dashbot/alexa_vl.py b/dashbot/alexa_vl.py index b97456c..e9fabe6 100644 --- a/dashbot/alexa_vl.py +++ b/dashbot/alexa_vl.py @@ -1,69 +1,52 @@ -import os -import sys -import os.path -import json +from .alexa import Alexa -from .version import __version__ -from . import alexa -class alexa_vl(alexa.alexa): - - def __init__(self,apiKey=None,debug=False,printErrors=False): - - if 'DASHBOT_SERVER_ROOT' in os.environ: - serverRoot = os.environ['DASHBOT_SERVER_ROOT'] - else: - serverRoot = 'https://tracker.dashbot.io' - self.urlRoot = serverRoot + '/track' - self.apiKey=apiKey - self.debug=debug - self.printErrors=printErrors - self.platform='alexa' - self.version = __version__ +class AlexaVL(Alexa): + def __init__(self, api_key=None, debug=False, print_errors=False): + super(self).__init__() self.source = 'pip_vl' - - #vl initialize - def initialize(self,apiKey,session): - self.apiKey=apiKey - self.session=session - - #vl track - def track(self,intent_name,intent_request,response): - event = self.regenerateEvent(intent_request) - self.logIncoming(event) - self.logOutgoing(event,response) - - #vl helper - def regenerateEvent(self,intent_request): + + # VL initialize + def initialize(self, api_key, session): + self.api_key = api_key + self.session = session + + # VL track + def track(self, intent_request, response): + event = self.regenerate_event(intent_request) + self.log_incoming(event) + self.log_outgoing(event, response) + + # VL helper + def regenerate_event(self, intent_request): event = { 'session': self.session, - 'request':intent_request, - 'context':{ - 'System':{ - 'application':self.session['application'], - 'user':self.session['user'] + 'request': intent_request, + 'context': { + 'System': { + 'application': self.session['application'], + 'user': self.session['user'] } } } return event - - #vl helper - def generateResponse(self,speechText): - if speechText[0:7]=='': - return { - 'response':{ - 'outputSpeech':{ - 'type':'SSML', - 'ssml': speechText - } - } + + # VL helper + def generate_response(self, speech_text): + if speech_text[0:7] == '': + output_speech = { + 'type': 'SSML', + 'ssml': speech_text, } + else: - return { - 'response':{ - 'outputSpeech':{ - 'type':'Plaintext', - 'text':speechText - } - } + output_speech = { + 'text': speech_text, + 'type': 'Plaintext', } + + return { + 'response': { + 'outputSpeech': output_speech + } + } diff --git a/dashbot/generic.py b/dashbot/generic.py index fbfd6b2..903dc5a 100644 --- a/dashbot/generic.py +++ b/dashbot/generic.py @@ -1,77 +1,68 @@ from __future__ import print_function + +import json +import logging import os -import sys + import requests -import os.path -import logging -import json from .version import __version__ -class generic(): - - def __init__(self,apiKey,debug=False,printErrors=False): - - if 'DASHBOT_SERVER_ROOT' in os.environ: - serverRoot = os.environ['DASHBOT_SERVER_ROOT'] - else: - serverRoot = 'https://tracker.dashbot.io' - self.urlRoot = serverRoot + '/track' - self.apiKey=apiKey - self.debug=debug - self.printErrors=printErrors - self.platform='generic' - self.version = __version__ - self.source = 'pip' - - def getBasestring(self): - if (sys.version_info > (3, 0)): - return (str, bytes) - else: - return basestring - def makeRequest(self,url,method,json): +class Generic(): + def __init__(self, api_key, debug=False, print_errors=False): + domain = os.environ.get('DASHBOT_SERVER_ROOT', 'https://tracker.dashbot.io') + url_root = '{domain}/track'.format(domain=domain) + url = '{url_root}?apiKey={api_key}&type={{}}&platform={platform}&v={version}-{source}' + self.api_key = api_key + self.url = url.format(**{ + 'url_root': url_root, + 'api_key': api_key, + 'platform': type(self).__name__, + 'version': __version__, + 'source': 'pip', + }) + self.print_errors = print_errors + self.debug = debug + + def _load_data(self, **kwargs): + return json.loads(**kwargs['data']) + + def _make_request(self, url, method, json): try: - if method=='GET': + if method == 'GET': r = requests.get(url, params=json) - elif method=='POST': + elif method == 'POST': r = requests.post(url, json=json) else: - print('Error in makeRequest, unsupported method') + print('Error in _make_request, unsupported method') if self.debug: print('dashbot response') - print (r.text) - if r.status_code!=200: - logging.error("ERROR: occurred sending data. Non 200 response from server:"+str(r.status_code)) + print(r.text) + if r.status_code != 200: + logging.error( + "ERROR: occurred sending data. " + "Non 200 response from server: {code}".format(code=r.status_code) + ) except ValueError as e: - logging.error("ERROR: occurred sending data. Exception:"+str(e)) - - def logIncoming(self,data): - url = self.urlRoot + '?apiKey=' + self.apiKey + '&type=incoming&platform='+ self.platform + '&v=' + self.version + '-' + self.source - - try: - data = json.loads(data) - except Exception as e: - if self.debug: - print(e) - + logging.error("ERROR: occurred sending data. Exception: {e}".format(e=e)) + + def log_incoming(self, **kwargs): + url = self.url.format('incoming') + data = self._load_data(**kwargs) + if self.debug: - print('Dashbot Incoming:'+url) + print('Dashbot Incoming:' + url) print(json.dumps(data)) - - self.makeRequest(url,'POST',data) - - def logOutgoing(self,data): - url = self.urlRoot + '?apiKey=' + self.apiKey + '&type=outgoing&platform='+ self.platform + '&v=' + self.version + '-' + self.source - - try: - data = json.loads(data) - except Exception as e: - if self.debug: - print(e) - + + self._make_request(url, 'POST', data) + + def log_outgoing(self, **kwargs): + url = self.url.format('outcoming') + data = self._load_data(**kwargs) + if self.debug: - print('Dashbot Outgoing:'+url) + print('Dashbot Outgoing:' + url) print(json.dumps(data)) - - self.makeRequest(url,'POST',data) \ No newline at end of file + + self._make_request(url, 'POST', data) diff --git a/dashbot/google.py b/dashbot/google.py index 8608cc3..2e4fdb8 100644 --- a/dashbot/google.py +++ b/dashbot/google.py @@ -1,78 +1,18 @@ -import os -import datetime import time -import json -from .version import __version__ -from . import generic +from .generic import Generic -class google(generic.generic): - - def __init__(self,apiKey,debug=False,printErrors=False): - - if 'DASHBOT_SERVER_ROOT' in os.environ: - serverRoot = os.environ['DASHBOT_SERVER_ROOT'] - else: - serverRoot = 'https://tracker.dashbot.io' - self.urlRoot = serverRoot + '/track' - self.apiKey=apiKey - self.debug=debug - self.printErrors=printErrors - self.platform='google' - self.version = __version__ - self.source = 'pip' - - def logIncoming(self,event): - url = self.urlRoot + '?apiKey=' + self.apiKey + '&type=incoming&platform='+ self.platform + '&v=' + self.version + '-' + self.source - - now = datetime.datetime.now() - timestamp = int(1000*(time.mktime(now.timetuple()) + now.microsecond * 1e-6)) - - try: - event = json.loads(event) - except Exception as e: - if self.debug: - print(e) - - data={ - 'dashbot_timestamp':timestamp, - 'request_body':event, - } - - if self.debug: - print('Dashbot Incoming:'+url) - print(json.dumps(data)) - - self.makeRequest(url,'POST',data) - - def logOutgoing(self,event,response,metadata=None): - url = self.urlRoot + '?apiKey=' + self.apiKey + '&type=outgoing&platform='+ self.platform + '&v=' + self.version + '-' + self.source - - now = datetime.datetime.now() - timestamp = int(1000*(time.mktime(now.timetuple()) + now.microsecond * 1e-6)) - - try: - event = json.loads(event) - except Exception as e: - if self.debug: - print(e) - - try: - response = json.loads(response) - except Exception as e: - if self.debug: - print(e) - - data={ - 'dashbot_timestamp':timestamp, - 'request_body':event, - 'message':response + +class Google(Generic): + def _load_data(**kwargs): + data = { + 'dashbot_timestamp': int(time.time() * 1000), + 'event': kwargs['event'], } - if metadata is not None: - data['metadata']=metadata - - if self.debug: - print('Dashbot Outgoing:'+url) - print(json.dumps(data)) - - self.makeRequest(url,'POST',data) \ No newline at end of file + if 'response' in kwargs: + data['response'] = kwargs['response'] + + if 'metadata' in kwargs: + data['metadata'] = kwargs['metadata'] + + return data From 293b27f8e68c398e9530100bbb5c573bf5cf3ecf Mon Sep 17 00:00:00 2001 From: Timothy Cloninger Date: Thu, 13 Sep 2018 20:45:03 -0500 Subject: [PATCH 2/2] Deserialize SDK objects to prep for requests --- dashbot/alexa.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dashbot/alexa.py b/dashbot/alexa.py index 33747d9..862fb14 100644 --- a/dashbot/alexa.py +++ b/dashbot/alexa.py @@ -5,11 +5,13 @@ class Alexa(Generic): def _load_data(**kwargs): + event = kwargs['request_envelope'].to_dict() + event['request']['timestamp'] = event['request']['timestamp'].isoformat() data = { 'dashbot_timestamp': int(time.time() * 1000), - 'event': kwargs['event'], + 'event': event, } if 'response' in kwargs: - data['response'] = kwargs['response'] + data['response'] = kwargs['response'].to_dict() return data