From 9de19fd813de6f12291370ef2b2f65d5903c0dfe Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Wed, 20 Sep 2017 19:06:31 -0700 Subject: [PATCH 01/34] Bumped v0.8.0 Signed-off-by: Vishal Rana --- README.md | 19 +++---- labstack/__init__.py | 4 +- labstack/client.py | 21 ++----- labstack/{message.py => hub.py} | 8 +-- labstack/{email.py => jet.py} | 16 +++--- labstack/log.py | 80 --------------------------- labstack/store.py | 97 --------------------------------- setup.py | 4 +- 8 files changed, 30 insertions(+), 219 deletions(-) rename labstack/{message.py => hub.py} (85%) rename labstack/{email.py => jet.py} (82%) delete mode 100644 labstack/log.py delete mode 100644 labstack/store.py diff --git a/README.md b/README.md index 870af2e..acb1019 100644 --- a/README.md +++ b/README.md @@ -13,15 +13,14 @@ Create a file `app.py` with the following content: ```python -from labstack import Client - -client = Client('', '') -store = client.store() -doc = store.insert('users', { - name: 'Jack', - location: 'Disney' -}) -print(doc) +from labstack import Client, JetMessage + +client = Client('ACCOUNT_ID', '') +jet = client.jet() +message = JetMessage('jack@labstack.com', 'LabStack', 'Hello') +message.body = 'hello' +message.add_inline('walle.png') +message = jet.send(message) ``` From terminal run your app: @@ -30,4 +29,4 @@ From terminal run your app: python app.py ``` -## [Docs](https://labstack.com/docs) | [Forum](https://forum.labstack.com) \ No newline at end of file +## [Documentation](https://labstack.com/docs) | [Forum](https://forum.labstack.com) \ No newline at end of file diff --git a/labstack/__init__.py b/labstack/__init__.py index 8b32371..8744c93 100644 --- a/labstack/__init__.py +++ b/labstack/__init__.py @@ -1,4 +1,2 @@ from .client import Client -from .email import EmailMessage, EmailError -from .log import Level, LogError -from .store import StoreError \ No newline at end of file +from .jet import JetMessage, JetError \ No newline at end of file diff --git a/labstack/client.py b/labstack/client.py index b7b66af..6e6793a 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -1,8 +1,6 @@ import requests -from .message import _Message -from .email import _Email -from .log import _Log -from .store import _Store +from .hub import _Hub +from .jet import _Jet class _Interceptor(requests.auth.AuthBase): def __init__(self, api_key): @@ -19,16 +17,9 @@ def __init__(self, account_id, api_key): self.api_key = api_key self.interceptor = _Interceptor(api_key) - def message(self, client_id): - return _Message(self.account_id, self.api_key, client_id) + def hub(self, client_id): + return _Hub(self.account_id, self.api_key, client_id) - def email(self): - return _Email(self.interceptor) - - def log(self): - log = _Log(self.interceptor) - return log - - def store(self): - return _Store(self.interceptor) + def jet(self): + return _Jet(self.interceptor) \ No newline at end of file diff --git a/labstack/message.py b/labstack/hub.py similarity index 85% rename from labstack/message.py rename to labstack/hub.py index b418151..9841b41 100644 --- a/labstack/message.py +++ b/labstack/hub.py @@ -1,6 +1,6 @@ import paho.mqtt.client as mqtt -class _Message(): +class _Hub(): def __init__(self, account_id, api_key, client_id): self.account_id = account_id self.client = mqtt.Client(client_id=client_id, clean_session=True) @@ -12,10 +12,10 @@ def connect_handler(client, userdata, flags, rc): handler() self.client.on_connect = connect_handler - def data_handler(self, handler): - def data_handler(client, userdata, msg): + def message_handler(self, handler): + def message_handler(client, userdata, msg): handler(msg.topic, msg.payload) - self.client.on_message = data_handler + self.client.on_message = message_handler def publish(self, topic, message): self.client.publish('{}/{}'.format(self.account_id, topic), message) diff --git a/labstack/email.py b/labstack/jet.py similarity index 82% rename from labstack/email.py rename to labstack/jet.py index 46fb118..f2c53fd 100644 --- a/labstack/email.py +++ b/labstack/jet.py @@ -4,21 +4,21 @@ import json from .common import API_URL -class _Email(): +class _Jet(): def __init__(self, interceptor): - self.path = '/email' + self.path = '/jet' self.interceptor = interceptor def send(self, message): message._add_inlines() message._add_attachments() - r = requests.post(API_URL + self.path, auth=self.interceptor, data=message.to_json()) + r = requests.post('{}{}/send'.format(API_URL, self.path), auth=self.interceptor, data=message.to_json()) data = r.json() if not 200 <= r.status_code < 300: - raise EmailError(data['code'], data['message']) - return EmailMessage.from_json(data) + raise JetError(data['code'], data['message']) + return JetMessage.from_json(data) -class EmailMessage(): +class JetMessage(): def __init__(self, to, from_, subject): self._inlines = [] self._attachments = [] @@ -64,13 +64,13 @@ def to_json(self): @classmethod def from_json(self, message): - em = EmailMessage(message['to'], message['from'], message['subject']) + em = JetMessage(message['to'], message['from'], message['subject']) em.id = message['id'] em.time = message['time'] em.status = message['status'] return em -class EmailError(Exception): +class JetError(Exception): def __init__(self, code, message): self.code = code self.message = message diff --git a/labstack/log.py b/labstack/log.py deleted file mode 100644 index b8c496b..0000000 --- a/labstack/log.py +++ /dev/null @@ -1,80 +0,0 @@ -import os -import sys -import base64 -import json -import time -import threading -import traceback -from enum import IntEnum -import requests -import arrow -from .common import API_URL - -class _Log(): - def __init__(self, interceptor): - self.path = '/log' - self.interceptor = interceptor - self.level = Level.INFO - self.fields = {} - - # Automatically report uncaught fatal error - def excepthook(type, value, trace): - self.fatal(message=str(value), stack_trace=''.join(traceback.format_tb(trace))) - sys.__excepthook__(type, value, trace) - sys.excepthook = excepthook - - def _write(self, entry): - r = requests.post(API_URL + self.path, auth=self.interceptor, data=json.dumps(entry)) - if not 200 <= r.status_code < 300: - data = r.json() - raise LogError(data['code'], data['message']) - - def add_fields(self, **kwargs): - self.fields.update(kwargs) - - def debug(self, **kwargs): - self._log(Level.DEBUG, **kwargs) - - def info(self, **kwargs): - self._log(Level.INFO, **kwargs) - - def warn(self, **kwargs): - self._log(Level.WARN, **kwargs) - - def error(self, **kwargs): - self._log(Level.ERROR, **kwargs) - - def fatal(self, **kwargs): - self._log(Level.FATAL, **kwargs) - - def _log(self, level, **kwargs): - if level < self.level: - return - - # Log fields - kwargs['time'] = arrow.now().format('YYYY-MM-DDTHH:mm:ss.SSSZ') - kwargs['level'] = level.name - for k, v in self.fields.items(): - kwargs[k] = v - - # Write log - try: - self._write(kwargs) - except LogError as err: - print('log error: code={}, message={}'.format(err.code, err.message)) - -class Level(IntEnum): - DEBUG = 0 - INFO = 1 - WARN = 2 - ERROR = 3 - FATAL = 4 - OFF = 5 - -class LogError(Exception): - def __init__(self, code, message): - self.code = code - self.message = message - - def __str__(self): - return self.message diff --git a/labstack/store.py b/labstack/store.py deleted file mode 100644 index 43b90f1..0000000 --- a/labstack/store.py +++ /dev/null @@ -1,97 +0,0 @@ -import os -import requests -import json -from .common import API_URL - -class _Store(): - def __init__(self, interceptor): - self.path = '/store' - self.interceptor = interceptor - - def insert(self, collection, document): - r = requests.post('{}{}/{}'.format(API_URL, self.path, collection), auth=self.interceptor, json=document) - data = r.json() - if not 200 <= r.status_code < 300: - raise StoreError(data['code'], data['message']) - return data - - def get(self, collection, id): - r = requests.get('{}{}/{}/{}'.format(API_URL, self.path, collection, id), auth=self.interceptor) - data = r.json() - if not 200 <= r.status_code < 300: - raise StoreError(data['code'], data['message']) - return data - - def search(self, - collection, - query=None, - query_string='*', - sort=None, - size=None, - from_=None): - params = { - 'query': query, - 'query_string': query_string, - 'sort': sort, - 'size': size, - 'from': from_ - } - r = requests.post('{}{}/{}/search'.format(API_URL, self.path, collection), auth=self.interceptor, json=params) - data = r.json() - if not 200 <= r.status_code < 300: - raise StoreError(data['code'], data['message']) - return data - - def update(self, collection, id, document): - r = requests.patch('{}{}/{}/{}'.format(API_URL, self.path, collection, id), auth=self.interceptor, json=document) - if not 200 <= r.status_code < 300: - data = r.json() - raise StoreError(data['code'], data['message']) - - def delete(self, collection, id): - r = requests.delete('{}{}/{}/{}'.format(API_URL, self.path, collection, id), auth=self.interceptor) - if not 200 <= r.status_code < 300: - data = r.json() - raise StoreError(data['code'], data['message']) - -class StoreEntry(): - def __init__(self, key=None, value=None): - self.key = key - self.value = value - self.created_at = None - self.updated_at = None - - def to_json(self): - return json.dumps({ - 'key': self.key, - 'value': self.value - }) - - @classmethod - def from_json(self, entry): - se = StoreEntry(entry['key'], entry['value']) - se.created_at = entry['created_at'] - se.updated_at = entry['updated_at'] - return se - -# class StoreSearchResponse(): -# def __init__(self): -# self.total = 0 -# self.documents = [] - -# @classmethod -# def from_json(self, response): -# qr = StoreSearchResponse() -# qr.total = response['total'] -# for entry in response['entries']: -# qr.documents.append(StoreEntry.from_json(entry)) -# return qr - -class StoreError(Exception): - def __init__(self, code, message): - self.code = code - self.message = message - - def __str__(self): - return self.message - \ No newline at end of file diff --git a/setup.py b/setup.py index 4b50ed4..f421ee7 100644 --- a/setup.py +++ b/setup.py @@ -2,10 +2,10 @@ setup( name='labstack', - version='0.7.1', + version='0.8.0', description='Official Python client library for the LabStack platform', long_description='``_', - keywords='labstack cube email log mqtt store', + keywords='labstack, email as a service, http analytics, pub/sub messaging', url='https://github.com/labstack/labstack-python', author='Vishal Rana', author_email='vr@labstack.com', From af4f06bf27797b799e41dce9670242329c1bad33 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sun, 19 Nov 2017 13:49:54 -0800 Subject: [PATCH 02/34] Per new api Signed-off-by: Vishal Rana --- labstack/__init__.py | 3 +- labstack/client.py | 41 +++++++++++++++++------ labstack/hub.py | 33 ------------------ labstack/jet.py | 80 -------------------------------------------- 4 files changed, 32 insertions(+), 125 deletions(-) delete mode 100644 labstack/hub.py delete mode 100644 labstack/jet.py diff --git a/labstack/__init__.py b/labstack/__init__.py index 8744c93..bc2abbd 100644 --- a/labstack/__init__.py +++ b/labstack/__init__.py @@ -1,2 +1 @@ -from .client import Client -from .jet import JetMessage, JetError \ No newline at end of file +from .client import Client \ No newline at end of file diff --git a/labstack/client.py b/labstack/client.py index 6e6793a..f49f8c3 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -1,6 +1,6 @@ import requests -from .hub import _Hub -from .jet import _Jet + +API_URL = 'https://api.labstack.com' class _Interceptor(requests.auth.AuthBase): def __init__(self, api_key): @@ -8,18 +8,39 @@ def __init__(self, api_key): def __call__(self, r): r.headers['Authorization'] = 'Bearer ' + self.api_key - r.headers['Content-Type'] = 'application/json; charset=utf-8' return r class Client(): - def __init__(self, account_id, api_key): - self.account_id = account_id + def __init__(self, api_key): self.api_key = api_key self.interceptor = _Interceptor(api_key) - def hub(self, client_id): - return _Hub(self.account_id, self.api_key, client_id) + def image_compress(self, file=None): + files = {'file': open(file, 'rb')} + r = requests.post('{}/image/compress'.format(API_URL), auth=self.interceptor, files=files) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + + def image_resize(self, file=None, width=None, height=None, crop=None): + files = {'file': open(file, 'rb')} + data = { + 'width': width, + 'height': height, + 'crop': crop + } + r = requests.post('{}/image/resize'.format(API_URL), auth=self.interceptor, + files=files, data=data) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data - def jet(self): - return _Jet(self.interceptor) - \ No newline at end of file +class APIError(Exception): + def __init__(self, code, message): + self.code = code + self.message = message + + def __str__(self): + return self.messag \ No newline at end of file diff --git a/labstack/hub.py b/labstack/hub.py deleted file mode 100644 index 9841b41..0000000 --- a/labstack/hub.py +++ /dev/null @@ -1,33 +0,0 @@ -import paho.mqtt.client as mqtt - -class _Hub(): - def __init__(self, account_id, api_key, client_id): - self.account_id = account_id - self.client = mqtt.Client(client_id=client_id, clean_session=True) - self.client.username_pw_set(account_id, api_key) - self.client.connect("iot.labstack.com", 1883) - - def connect_handler(self, handler): - def connect_handler(client, userdata, flags, rc): - handler() - self.client.on_connect = connect_handler - - def message_handler(self, handler): - def message_handler(client, userdata, msg): - handler(msg.topic, msg.payload) - self.client.on_message = message_handler - - def publish(self, topic, message): - self.client.publish('{}/{}'.format(self.account_id, topic), message) - - def subscribe(self, topic, shared=False): - topic = '{}/{}'.format(self.account_id, topic) - if shared: - topic = '$queue/' + topic - self.client.subscribe(topic) - - def disconnect(self): - self.client.disconnect() - - def loop_forever(self): - self.client.loop_forever() \ No newline at end of file diff --git a/labstack/jet.py b/labstack/jet.py deleted file mode 100644 index f2c53fd..0000000 --- a/labstack/jet.py +++ /dev/null @@ -1,80 +0,0 @@ -import os -import base64 -import requests -import json -from .common import API_URL - -class _Jet(): - def __init__(self, interceptor): - self.path = '/jet' - self.interceptor = interceptor - - def send(self, message): - message._add_inlines() - message._add_attachments() - r = requests.post('{}{}/send'.format(API_URL, self.path), auth=self.interceptor, data=message.to_json()) - data = r.json() - if not 200 <= r.status_code < 300: - raise JetError(data['code'], data['message']) - return JetMessage.from_json(data) - -class JetMessage(): - def __init__(self, to, from_, subject): - self._inlines = [] - self._attachments = [] - self.to = to - self.from_ = from_ - self.subject = subject - self.body = '' - self.inlines = [] - self.attachments = [] - self.status = '' - - def _add_inlines(self): - for inline in self.inlines: - with open(inline, 'rb') as file: - self._inlines.append({ - 'name': os.path.basename(inline), - 'content': base64.b64encode(file.read()).decode('utf-8') - }) - - def _add_attachments(self): - for attachment in self.attachments: - with open(attachment, 'rb') as file: - self._attachments.append({ - 'name': os.path.basename(attachment), - 'content': base64.b64encode(file.read()).decode('utf-8') - }) - - def add_inline(self, path): - self.inlines.append(path) - - def add_attachment(self, path): - self.attachments.append(path) - - def to_json(self): - return json.dumps({ - 'to': self.to, - 'from': self.from_, - 'subject': self.subject, - 'body': self.body, - 'inlines': self._inlines, - 'attachments': self._attachments - }) - - @classmethod - def from_json(self, message): - em = JetMessage(message['to'], message['from'], message['subject']) - em.id = message['id'] - em.time = message['time'] - em.status = message['status'] - return em - -class JetError(Exception): - def __init__(self, code, message): - self.code = code - self.message = message - - def __str__(self): - return self.message - \ No newline at end of file From 6ab59f380a5f77c3e059c608501d2242b479290c Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sun, 19 Nov 2017 16:40:17 -0800 Subject: [PATCH 03/34] Bumped v0.10.0 Signed-off-by: Vishal Rana --- README.md | 19 ++++++++++--------- labstack/__init__.py | 2 +- labstack/client.py | 19 +++++++++++++++++++ setup.py | 8 +++----- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index acb1019..88d4fc1 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,15 @@ Create a file `app.py` with the following content: ```python -from labstack import Client, JetMessage - -client = Client('ACCOUNT_ID', '') -jet = client.jet() -message = JetMessage('jack@labstack.com', 'LabStack', 'Hello') -message.body = 'hello' -message.add_inline('walle.png') -message = jet.send(message) +from labstack import Client, APIError + +client = Client('') + +try: + response = client.barcode_generate(format='qr_code', content='https://labstack.com') + client.download(response['id'], '/tmp/' + response['name']) +except APIError as error: + print(error) ``` From terminal run your app: @@ -29,4 +30,4 @@ From terminal run your app: python app.py ``` -## [Documentation](https://labstack.com/docs) | [Forum](https://forum.labstack.com) \ No newline at end of file +## [API](https://labstack.com/api) | [Forum](https://forum.labstack.com) \ No newline at end of file diff --git a/labstack/__init__.py b/labstack/__init__.py index bc2abbd..cc9f2cc 100644 --- a/labstack/__init__.py +++ b/labstack/__init__.py @@ -1 +1 @@ -from .client import Client \ No newline at end of file +from .client import Client, APIError \ No newline at end of file diff --git a/labstack/client.py b/labstack/client.py index f49f8c3..27a4435 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -15,6 +15,25 @@ def __init__(self, api_key): self.api_key = api_key self.interceptor = _Interceptor(api_key) + def download(self, id, path): + r = requests.get('{}/download/{}'.format(API_URL, id), stream=True) + with open(path, 'wb') as f: + for chunk in r.iter_content(chunk_size=1024): + if chunk: + f.write(chunk) + f.flush() + + def barcode_generate(self, format=None, content=None): + json = { + 'format': format, + 'content': content + } + r = requests.post('{}/barcode/generate'.format(API_URL), auth=self.interceptor, json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + def image_compress(self, file=None): files = {'file': open(file, 'rb')} r = requests.post('{}/image/compress'.format(API_URL), auth=self.interceptor, files=files) diff --git a/setup.py b/setup.py index f421ee7..d9f35f0 100644 --- a/setup.py +++ b/setup.py @@ -2,18 +2,16 @@ setup( name='labstack', - version='0.8.0', - description='Official Python client library for the LabStack platform', + version='0.10.0', + description='Official Python client library for the LabStack API', long_description='``_', - keywords='labstack, email as a service, http analytics, pub/sub messaging', + keywords='image compress, image resize, text summary, barcode generate, barcode scan', url='https://github.com/labstack/labstack-python', author='Vishal Rana', author_email='vr@labstack.com', license='MIT', packages=['labstack'], install_requires=[ - 'arrow==0.10.0', - 'paho-mqtt==1.3.0', 'requests==2.18.1' ], classifiers=[ From 701228d2ffdb026c9282246eb87bb3214b8bc43f Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sun, 19 Nov 2017 16:52:01 -0800 Subject: [PATCH 04/34] Bumped v0.10.1 Signed-off-by: Vishal Rana --- labstack/client.py | 18 ++++++++++++++---- setup.py | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index 27a4435..70cc396 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -23,12 +23,22 @@ def download(self, id, path): f.write(chunk) f.flush() - def barcode_generate(self, format=None, content=None): + def barcode_generate(self, format=None, content=None, size=None): json = { 'format': format, - 'content': content + 'content': content, + 'size': size } - r = requests.post('{}/barcode/generate'.format(API_URL), auth=self.interceptor, json=json) + r = requests.post(API_URL + '/barcode/generate', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + + def barcode_scan(self, file=None): + files = {'file': open(file, 'rb')} + r = requests.post(API_URL + '/barcode/scan', auth=self.interceptor, files=files) data = r.json() if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) @@ -36,7 +46,7 @@ def barcode_generate(self, format=None, content=None): def image_compress(self, file=None): files = {'file': open(file, 'rb')} - r = requests.post('{}/image/compress'.format(API_URL), auth=self.interceptor, files=files) + r = requests.post(API_URL + '/image/compress', auth=self.interceptor, files=files) data = r.json() if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) diff --git a/setup.py b/setup.py index d9f35f0..d63145f 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.10.0', + version='0.10.1', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From e2f51e4e7b36894300f37f8fc609af7dd630ca0f Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Mon, 20 Nov 2017 12:22:41 -0800 Subject: [PATCH 05/34] Bumped v0.11.0 Signed-off-by: Vishal Rana --- labstack/client.py | 41 +++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/labstack/client.py b/labstack/client.py index 70cc396..b8eba53 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -44,6 +44,15 @@ def barcode_scan(self, file=None): raise APIError(data['code'], data['message']) return data + def email_verify(self, email=None): + json = {'email': email} + r = requests.post(API_URL + '/email/verify', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + def image_compress(self, file=None): files = {'file': open(file, 'rb')} r = requests.post(API_URL + '/image/compress', auth=self.interceptor, files=files) @@ -65,6 +74,38 @@ def image_resize(self, file=None, width=None, height=None, crop=None): if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) return data + + def text_sentiment(self, text=None): + json = {'text': text} + r = requests.post(API_URL + '/text/sentiment', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + + def text_spell_check(self, text=None): + json = {'text': text} + r = requests.post(API_URL + '/text/spell-check', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + + def text_summary(self, text=None, url=None, language=None, length=None): + json = { + 'text': text, + 'url': url, + 'language': language, + 'length': length + } + r = requests.post(API_URL + '/text/summary', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data class APIError(Exception): def __init__(self, code, message): diff --git a/setup.py b/setup.py index d63145f..be053ae 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.10.1', + version='0.11.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 60ba7d45281f0fa57047d6fd0b8a56d78ec572b8 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Tue, 21 Nov 2017 21:54:05 -0800 Subject: [PATCH 06/34] Bumped v0.12.0 Signed-off-by: Vishal Rana --- labstack/client.py | 37 +++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/labstack/client.py b/labstack/client.py index b8eba53..45e17b0 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -43,6 +43,18 @@ def barcode_scan(self, file=None): if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) return data + + def dns_lookup(self, domain=None, type=None): + json = { + 'domain': domain, + 'type': type + } + r = requests.post(API_URL + '/dns/lookup', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data def email_verify(self, email=None): json = {'email': email} @@ -75,6 +87,22 @@ def image_resize(self, file=None, width=None, height=None, crop=None): raise APIError(data['code'], data['message']) return data + def pdf_extract_image(self, file=None): + files = {'file': open(file, 'rb')} + r = requests.post(API_URL + '/pdf/extract-image', auth=self.interceptor, files=files) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + + def pdf_to_image(self, file=None): + files = {'file': open(file, 'rb')} + r = requests.post(API_URL + '/pdf/to-image', auth=self.interceptor, files=files) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + def text_sentiment(self, text=None): json = {'text': text} r = requests.post(API_URL + '/text/sentiment', auth=self.interceptor, @@ -107,6 +135,15 @@ def text_summary(self, text=None, url=None, language=None, length=None): raise APIError(data['code'], data['message']) return data + def word_lookup(self, word=None): + json = {'word': word} + r = requests.post(API_URL + '/word/lookup', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + class APIError(Exception): def __init__(self, code, message): self.code = code diff --git a/setup.py b/setup.py index be053ae..773884d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.11.0', + version='0.12.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 097ed8b2c7c4217a9259472d3d15f1366eb54042 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Fri, 24 Nov 2017 18:23:25 -0800 Subject: [PATCH 07/34] Bumped v0.13.0 Signed-off-by: Vishal Rana --- labstack/client.py | 13 +++++++++++++ setup.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/labstack/client.py b/labstack/client.py index 45e17b0..ea5d70b 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -134,6 +134,19 @@ def text_summary(self, text=None, url=None, language=None, length=None): if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) return data + + def webpage_to_pdf(self, url=None, size=None, layout=None): + json = { + 'url': url, + 'size': size, + 'layout': layout + } + r = requests.post(API_URL + '/webpage/to-pdf', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data def word_lookup(self, word=None): json = {'word': word} diff --git a/setup.py b/setup.py index 773884d..3c8d4b2 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.12.0', + version='0.13.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 24396ccb257761c59df01ad665020edd364a8f2f Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Fri, 24 Nov 2017 22:19:04 -0800 Subject: [PATCH 08/34] Bumped v0.14.0 Signed-off-by: Vishal Rana --- labstack/client.py | 16 ++++------------ setup.py | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index ea5d70b..886ef7f 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -87,17 +87,9 @@ def image_resize(self, file=None, width=None, height=None, crop=None): raise APIError(data['code'], data['message']) return data - def pdf_extract_image(self, file=None): + def pdf_image(self, file=None): files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/pdf/extract-image', auth=self.interceptor, files=files) - data = r.json() - if not 200 <= r.status_code < 300: - raise APIError(data['code'], data['message']) - return data - - def pdf_to_image(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/pdf/to-image', auth=self.interceptor, files=files) + r = requests.post(API_URL + '/pdf/image', auth=self.interceptor, files=files) data = r.json() if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) @@ -135,13 +127,13 @@ def text_summary(self, text=None, url=None, language=None, length=None): raise APIError(data['code'], data['message']) return data - def webpage_to_pdf(self, url=None, size=None, layout=None): + def webpage_pdf(self, url=None, size=None, layout=None): json = { 'url': url, 'size': size, 'layout': layout } - r = requests.post(API_URL + '/webpage/to-pdf', auth=self.interceptor, + r = requests.post(API_URL + '/webpage/pdf', auth=self.interceptor, json=json) data = r.json() if not 200 <= r.status_code < 300: diff --git a/setup.py b/setup.py index 3c8d4b2..477b9f4 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.13.0', + version='0.14.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From b0401b5509e57b91203d40047cc66710b0c5d1fc Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Tue, 28 Nov 2017 18:33:15 -0800 Subject: [PATCH 09/34] Bumped v0.15.0 Signed-off-by: Vishal Rana --- labstack/client.py | 10 ++++++++++ setup.py | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/labstack/client.py b/labstack/client.py index 886ef7f..2f16d49 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -43,6 +43,16 @@ def barcode_scan(self, file=None): if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) return data + + def currency_exchange(self, base=None): + json = {'base': base} + r = requests.post(API_URL + '/currency/exchange', auth=self.interceptor, + json=json) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + def dns_lookup(self, domain=None, type=None): json = { diff --git a/setup.py b/setup.py index 477b9f4..257b3b5 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.14.0', + version='0.15.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 1341d7d8fd56c25f1b4f3959779e51817af5662f Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 2 Dec 2017 19:46:41 -0800 Subject: [PATCH 10/34] Bumped v0.16.0 Signed-off-by: Vishal Rana --- labstack/client.py | 30 ++++++++++++++++++++++++++++-- setup.py | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index 2f16d49..a200a49 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -96,10 +96,36 @@ def image_resize(self, file=None, width=None, height=None, crop=None): if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) return data + + def pdf_compress(self, file=None, quality=None, dpi=None): + files = {'file': open(file, 'rb')} + data = { + 'quality': quality, + 'dpi': dpi + } + r = requests.post(API_URL + '/pdf/compress', auth=self.interceptor, files=files, data=data) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data - def pdf_image(self, file=None): + def pdf_image(self, file=None, extract=None): + files = {'file': open(file, 'rb')} + data = { + 'extract': extract + } + r = requests.post(API_URL + '/pdf/image', auth=self.interceptor, files=files, data=data) + data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + + def pdf_split(self, file=None, pages=None): files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/pdf/image', auth=self.interceptor, files=files) + data = { + 'pages': pages + } + r = requests.post(API_URL + '/pdf/split', auth=self.interceptor, files=files, data=data) data = r.json() if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) diff --git a/setup.py b/setup.py index 257b3b5..622a79c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.15.0', + version='0.16.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 1e9d1473568c39a9b3c324413739ba5defd66b20 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Thu, 7 Dec 2017 21:41:23 -0800 Subject: [PATCH 11/34] Bumped v0.16.1 Signed-off-by: Vishal Rana --- labstack/client.py | 8 ++------ setup.py | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index a200a49..dea43d8 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -97,13 +97,9 @@ def image_resize(self, file=None, width=None, height=None, crop=None): raise APIError(data['code'], data['message']) return data - def pdf_compress(self, file=None, quality=None, dpi=None): + def pdf_compress(self, file=None): files = {'file': open(file, 'rb')} - data = { - 'quality': quality, - 'dpi': dpi - } - r = requests.post(API_URL + '/pdf/compress', auth=self.interceptor, files=files, data=data) + r = requests.post(API_URL + '/pdf/compress', auth=self.interceptor, files=files) data = r.json() if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) diff --git a/setup.py b/setup.py index 622a79c..a0f093d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.16.0', + version='0.16.1', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From c557955060d5a6a2d617cbfb6eaca0e7f9b7a7bc Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Thu, 21 Dec 2017 20:58:08 -0800 Subject: [PATCH 12/34] Bumpled v0.17.0 Signed-off-by: Vishal Rana --- labstack/client.py | 23 +++++++++++++++++++++-- setup.py | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index dea43d8..ad893ac 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -83,16 +83,35 @@ def image_compress(self, file=None): raise APIError(data['code'], data['message']) return data - def image_resize(self, file=None, width=None, height=None, crop=None): + def image_resize(self, file=None, width=None, height=None, format=None): files = {'file': open(file, 'rb')} data = { 'width': width, 'height': height, - 'crop': crop + 'format': format } r = requests.post('{}/image/resize'.format(API_URL), auth=self.interceptor, files=files, data=data) data = r.json() + if not 200 <= r.status_code < 300: + raise APIError(data['code'], data['message']) + return data + + def image_watermark(self, file=None, text=None, font=None, size=None, color=None, opacity=None, + position=None, margin=None): + files = {'file': open(file, 'rb')} + data = { + 'text': text, + 'font': font, + 'size': size, + 'color': color, + 'opacity': opacity, + 'position': position, + 'margin': margin + } + r = requests.post('{}/image/watermark'.format(API_URL), auth=self.interceptor, + files=files, data=data) + data = r.json() if not 200 <= r.status_code < 300: raise APIError(data['code'], data['message']) return data diff --git a/setup.py b/setup.py index a0f093d..2895b82 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.16.1', + version='0.17.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 5782e841eb58704a962a5d41aabecf802e964246 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Fri, 5 Jan 2018 12:21:21 -0800 Subject: [PATCH 13/34] Bumped v0.18.0 Signed-off-by: Vishal Rana --- labstack/client.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index ad893ac..d3dc9d1 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -155,9 +155,9 @@ def text_sentiment(self, text=None): raise APIError(data['code'], data['message']) return data - def text_spell_check(self, text=None): + def text_spellcheck(self, text=None): json = {'text': text} - r = requests.post(API_URL + '/text/spell-check', auth=self.interceptor, + r = requests.post(API_URL + '/text/spellcheck', auth=self.interceptor, json=json) data = r.json() if not 200 <= r.status_code < 300: diff --git a/setup.py b/setup.py index 2895b82..dbcad32 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.17.0', + version='0.18.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From cea1fdcc25020bf16e979efbe58e43475bfc6818 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Mon, 8 Jan 2018 12:10:47 -0800 Subject: [PATCH 14/34] Bumped v0.18.1 Signed-off-by: Vishal Rana --- labstack/client.py | 39 +++++++++++++++++++++------------------ setup.py | 2 +- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index d3dc9d1..5fb3287 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -15,6 +15,9 @@ def __init__(self, api_key): self.api_key = api_key self.interceptor = _Interceptor(api_key) + def _error(r): + return not 200 <= r.status_code < 300 + def download(self, id, path): r = requests.get('{}/download/{}'.format(API_URL, id), stream=True) with open(path, 'wb') as f: @@ -32,7 +35,7 @@ def barcode_generate(self, format=None, content=None, size=None): r = requests.post(API_URL + '/barcode/generate', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -40,16 +43,16 @@ def barcode_scan(self, file=None): files = {'file': open(file, 'rb')} r = requests.post(API_URL + '/barcode/scan', auth=self.interceptor, files=files) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data - def currency_exchange(self, base=None): + def currency_convert(self, base=None): json = {'base': base} - r = requests.post(API_URL + '/currency/exchange', auth=self.interceptor, + r = requests.post(API_URL + '/currency/convert', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -62,7 +65,7 @@ def dns_lookup(self, domain=None, type=None): r = requests.post(API_URL + '/dns/lookup', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -71,7 +74,7 @@ def email_verify(self, email=None): r = requests.post(API_URL + '/email/verify', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -79,7 +82,7 @@ def image_compress(self, file=None): files = {'file': open(file, 'rb')} r = requests.post(API_URL + '/image/compress', auth=self.interceptor, files=files) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -93,7 +96,7 @@ def image_resize(self, file=None, width=None, height=None, format=None): r = requests.post('{}/image/resize'.format(API_URL), auth=self.interceptor, files=files, data=data) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -112,7 +115,7 @@ def image_watermark(self, file=None, text=None, font=None, size=None, color=None r = requests.post('{}/image/watermark'.format(API_URL), auth=self.interceptor, files=files, data=data) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -120,7 +123,7 @@ def pdf_compress(self, file=None): files = {'file': open(file, 'rb')} r = requests.post(API_URL + '/pdf/compress', auth=self.interceptor, files=files) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -131,7 +134,7 @@ def pdf_image(self, file=None, extract=None): } r = requests.post(API_URL + '/pdf/image', auth=self.interceptor, files=files, data=data) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -142,7 +145,7 @@ def pdf_split(self, file=None, pages=None): } r = requests.post(API_URL + '/pdf/split', auth=self.interceptor, files=files, data=data) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -151,7 +154,7 @@ def text_sentiment(self, text=None): r = requests.post(API_URL + '/text/sentiment', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -160,7 +163,7 @@ def text_spellcheck(self, text=None): r = requests.post(API_URL + '/text/spellcheck', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -174,7 +177,7 @@ def text_summary(self, text=None, url=None, language=None, length=None): r = requests.post(API_URL + '/text/summary', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -187,7 +190,7 @@ def webpage_pdf(self, url=None, size=None, layout=None): r = requests.post(API_URL + '/webpage/pdf', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data @@ -196,7 +199,7 @@ def word_lookup(self, word=None): r = requests.post(API_URL + '/word/lookup', auth=self.interceptor, json=json) data = r.json() - if not 200 <= r.status_code < 300: + if self._error(r): raise APIError(data['code'], data['message']) return data diff --git a/setup.py b/setup.py index dbcad32..83904f1 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.18.0', + version='0.18.1', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 0febdb5618089970d71b391b12a5be52f633ed0e Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Mon, 8 Jan 2018 19:11:12 -0800 Subject: [PATCH 15/34] Bumped v0.19.0 Signed-off-by: Vishal Rana --- labstack/client.py | 37 +++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/labstack/client.py b/labstack/client.py index 5fb3287..4e4a7dd 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -77,6 +77,43 @@ def email_verify(self, email=None): if self._error(r): raise APIError(data['code'], data['message']) return data + + def geocode_address(self, location=None, longitude=None, latitude=None, osm_tag=None, limit=None): + json = { + 'location': location, + 'longitude': longitude, + 'latitude': latitude, + 'osm_tag': osm_tag, + 'limit': limit + } + r = requests.post(API_URL + '/geocode/address', auth=self.interceptor, + json=json) + data = r.json() + if self._error(r): + raise APIError(data['code'], data['message']) + return data + + def geocode_ip(self, ip=None): + json = {'ip': ip} + r = requests.post(API_URL + '/geocode/ip', auth=self.interceptor, + json=json) + data = r.json() + if self._error(r): + raise APIError(data['code'], data['message']) + return data + + def geocode_reverse(self, longitude=None, latitude=None, limit=None): + json = { + 'longitude': longitude, + 'latitude': latitude, + 'limit': limit + } + r = requests.post(API_URL + '/geocode/reverse', auth=self.interceptor, + json=json) + data = r.json() + if self._error(r): + raise APIError(data['code'], data['message']) + return data def image_compress(self, file=None): files = {'file': open(file, 'rb')} diff --git a/setup.py b/setup.py index 83904f1..e262746 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.18.1', + version='0.19.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 7cbf0be37c1c8f0c0234d3794d9c4665ad499478 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Mon, 5 Feb 2018 21:56:41 -0800 Subject: [PATCH 16/34] Bumped v0.20.0 Signed-off-by: Vishal Rana --- README.md | 2 +- labstack/client.py | 4 ++-- setup.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 88d4fc1..e331b0f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Create a file `app.py` with the following content: ```python from labstack import Client, APIError -client = Client('') +client = Client('', '') try: response = client.barcode_generate(format='qr_code', content='https://labstack.com') diff --git a/labstack/client.py b/labstack/client.py index 4e4a7dd..23f5692 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -11,11 +11,11 @@ def __call__(self, r): return r class Client(): - def __init__(self, api_key): + def __init__(self, account_id, api_key): self.api_key = api_key self.interceptor = _Interceptor(api_key) - def _error(r): + def _error(self, r): return not 200 <= r.status_code < 300 def download(self, id, path): diff --git a/setup.py b/setup.py index e262746..d0c18c4 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.19.0', + version='0.20.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 78e96fe8dd74048a634e5ea2c8b4d96458cc456a Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Wed, 28 Feb 2018 22:32:31 -0800 Subject: [PATCH 17/34] Restructured Signed-off-by: Vishal Rana --- labstack/client.py | 160 ++++++++++++++++----------------------------- setup.py | 2 +- 2 files changed, 56 insertions(+), 106 deletions(-) diff --git a/labstack/client.py b/labstack/client.py index 23f5692..248888e 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -26,118 +26,107 @@ def download(self, id, path): f.write(chunk) f.flush() - def barcode_generate(self, format=None, content=None, size=None): - json = { - 'format': format, - 'content': content, - 'size': size + def currency_convert(self, from=None, to=None, value=None): + params = { + 'from': from, + 'to': to, + 'value': value } - r = requests.post(API_URL + '/barcode/generate', auth=self.interceptor, - json=json) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def barcode_scan(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/barcode/scan', auth=self.interceptor, files=files) + r = requests.get(API_URL + '/currency/convert', auth=self.interceptor, + params=params) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data - def currency_convert(self, base=None): - json = {'base': base} - r = requests.post(API_URL + '/currency/convert', auth=self.interceptor, - json=json) + def currency_rates(self, base=None): + params = {'base': base} + r = requests.get(API_URL + '/currency/rates', auth=self.interceptor, + params=params) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data - - def dns_lookup(self, domain=None, type=None): - json = { - 'domain': domain, - 'type': type - } - r = requests.post(API_URL + '/dns/lookup', auth=self.interceptor, - json=json) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - def email_verify(self, email=None): - json = {'email': email} - r = requests.post(API_URL + '/email/verify', auth=self.interceptor, - json=json) + params = {'email': email} + r = requests.get(API_URL + '/email/verify', auth=self.interceptor, + params=params) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data def geocode_address(self, location=None, longitude=None, latitude=None, osm_tag=None, limit=None): - json = { + params = { 'location': location, 'longitude': longitude, 'latitude': latitude, 'osm_tag': osm_tag, 'limit': limit } - r = requests.post(API_URL + '/geocode/address', auth=self.interceptor, - json=json) + r = requests.get(API_URL + '/geocode/address', auth=self.interceptor, + params=params) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data def geocode_ip(self, ip=None): - json = {'ip': ip} - r = requests.post(API_URL + '/geocode/ip', auth=self.interceptor, - json=json) + params = {'ip': ip} + r = requests.get(API_URL + '/geocode/ip', auth=self.interceptor, + params=params) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data def geocode_reverse(self, longitude=None, latitude=None, limit=None): - json = { + params = { 'longitude': longitude, 'latitude': latitude, 'limit': limit } - r = requests.post(API_URL + '/geocode/reverse', auth=self.interceptor, - json=json) + r = requests.get(API_URL + '/geocode/reverse', auth=self.interceptor, + params=params) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data - - def image_compress(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/image/compress', auth=self.interceptor, files=files) + + def compress_audio(self, file=None): + files = {'file': open(file, 'rb')} + r = requests.post(API_URL + '/compress/audio', auth=self.interceptor, files=files) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data - def image_resize(self, file=None, width=None, height=None, format=None): + def compress_image(self, file=None): files = {'file': open(file, 'rb')} - data = { - 'width': width, - 'height': height, - 'format': format - } - r = requests.post('{}/image/resize'.format(API_URL), auth=self.interceptor, - files=files, data=data) + r = requests.post(API_URL + '/compress/image', auth=self.interceptor, files=files) + data = r.json() + if self._error(r): + raise APIError(data['code'], data['message']) + return data + + def compress_pdf(self, file=None): + files = {'file': open(file, 'rb')} + r = requests.post(API_URL + '/compress/pdf', auth=self.interceptor, files=files) + data = r.json() + if self._error(r): + raise APIError(data['code'], data['message']) + return data + + def compress_video(self, file=None): + files = {'file': open(file, 'rb')} + r = requests.post(API_URL + '/compress/video', auth=self.interceptor, files=files) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data - def image_watermark(self, file=None, text=None, font=None, size=None, color=None, opacity=None, + def watermark_image(self, file=None, text=None, font=None, size=None, color=None, opacity=None, position=None, margin=None): files = {'file': open(file, 'rb')} data = { @@ -149,44 +138,14 @@ def image_watermark(self, file=None, text=None, font=None, size=None, color=None 'position': position, 'margin': margin } - r = requests.post('{}/image/watermark'.format(API_URL), auth=self.interceptor, + r = requests.post('{}/watermark/image'.format(API_URL), auth=self.interceptor, files=files, data=data) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) return data - - def pdf_compress(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/pdf/compress', auth=self.interceptor, files=files) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def pdf_image(self, file=None, extract=None): - files = {'file': open(file, 'rb')} - data = { - 'extract': extract - } - r = requests.post(API_URL + '/pdf/image', auth=self.interceptor, files=files, data=data) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def pdf_split(self, file=None, pages=None): - files = {'file': open(file, 'rb')} - data = { - 'pages': pages - } - r = requests.post(API_URL + '/pdf/split', auth=self.interceptor, files=files, data=data) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - def text_sentiment(self, text=None): + def nlp_sentiment(self, text=None): json = {'text': text} r = requests.post(API_URL + '/text/sentiment', auth=self.interceptor, json=json) @@ -195,7 +154,7 @@ def text_sentiment(self, text=None): raise APIError(data['code'], data['message']) return data - def text_spellcheck(self, text=None): + def nlp_spellcheck(self, text=None): json = {'text': text} r = requests.post(API_URL + '/text/spellcheck', auth=self.interceptor, json=json) @@ -204,7 +163,7 @@ def text_spellcheck(self, text=None): raise APIError(data['code'], data['message']) return data - def text_summary(self, text=None, url=None, language=None, length=None): + def nlp_summary(self, text=None, url=None, language=None, length=None): json = { 'text': text, 'url': url, @@ -218,23 +177,14 @@ def text_summary(self, text=None, url=None, language=None, length=None): raise APIError(data['code'], data['message']) return data - def webpage_pdf(self, url=None, size=None, layout=None): - json = { + def webpage_pdf(self, url=None, layout=None, format=None): + params = { 'url': url, - 'size': size, 'layout': layout + 'format': format, } - r = requests.post(API_URL + '/webpage/pdf', auth=self.interceptor, - json=json) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def word_lookup(self, word=None): - json = {'word': word} - r = requests.post(API_URL + '/word/lookup', auth=self.interceptor, - json=json) + r = requests.get(API_URL + '/webpage/pdf', auth=self.interceptor, + params=params) data = r.json() if self._error(r): raise APIError(data['code'], data['message']) diff --git a/setup.py b/setup.py index d0c18c4..b5cf773 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.20.0', + version='0.21.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From e1da3958222c2b9c3765fda6e1d5d2c9a5c9cdc6 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Thu, 10 May 2018 06:31:01 -0700 Subject: [PATCH 18/34] Bumped version Signed-off-by: Vishal Rana --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b5cf773..4f5595b 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.21.0', + version='0.30.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 922743926edc65e38d6ec950199898f3fc1e9fac Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Thu, 10 May 2018 07:11:08 -0700 Subject: [PATCH 19/34] Bumped version Signed-off-by: Vishal Rana --- README.md | 2 +- labstack/client.py | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e331b0f..88d4fc1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Create a file `app.py` with the following content: ```python from labstack import Client, APIError -client = Client('', '') +client = Client('') try: response = client.barcode_generate(format='qr_code', content='https://labstack.com') diff --git a/labstack/client.py b/labstack/client.py index 248888e..a9b08d4 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -11,7 +11,7 @@ def __call__(self, r): return r class Client(): - def __init__(self, account_id, api_key): + def __init__(self, api_key): self.api_key = api_key self.interceptor = _Interceptor(api_key) diff --git a/setup.py b/setup.py index 4f5595b..e1b6e36 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.30.0', + version='0.30.1', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 57a6bdf078a9661b95572e1d4a482ac5ef76e89e Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Fri, 11 May 2018 19:46:36 -0700 Subject: [PATCH 20/34] Bumped version Signed-off-by: Vishal Rana --- README.md | 9 +- labstack/client.py | 246 +++++++++++++++--------------------------- labstack/common.py | 1 - labstack/currency.py | 15 +++ labstack/geocode.py | 24 +++++ labstack/post.py | 8 ++ labstack/watermark.py | 19 ++++ labstack/webpage.py | 12 +++ setup.py | 2 +- 9 files changed, 171 insertions(+), 165 deletions(-) delete mode 100644 labstack/common.py create mode 100644 labstack/currency.py create mode 100644 labstack/geocode.py create mode 100644 labstack/post.py create mode 100644 labstack/watermark.py create mode 100644 labstack/webpage.py diff --git a/README.md b/README.md index 88d4fc1..77b3209 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,12 @@ Create a file `app.py` with the following content: ```python from labstack import Client, APIError -client = Client('') +client = new Client('') +geocode = client.geocode() try: - response = client.barcode_generate(format='qr_code', content='https://labstack.com') - client.download(response['id'], '/tmp/' + response['name']) + response = geocode.address('eiffel tower') + print(response) except APIError as error: print(error) ``` @@ -30,4 +31,4 @@ From terminal run your app: python app.py ``` -## [API](https://labstack.com/api) | [Forum](https://forum.labstack.com) \ No newline at end of file +## [API](https://labstack.com/api) | [Forum](https://forum.labstack.com) diff --git a/labstack/client.py b/labstack/client.py index a9b08d4..98856d0 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -1,4 +1,9 @@ import requests +from .currency import Currency +from .geocode import Geocode +from .post import Post +from .watermark import Watermark +from .webpage import Webpage API_URL = 'https://api.labstack.com' @@ -15,9 +20,32 @@ def __init__(self, api_key): self.api_key = api_key self.interceptor = _Interceptor(api_key) + def _request(self, method, path, params=None, files=None, data=None): + r = requests.request(method, API_URL + path, auth=self.interceptor, + params=params, files=files, data=data) + data = r.json() + if self._error(r): + raise APIError(data['code'], data['message']) + return data + def _error(self, r): return not 200 <= r.status_code < 300 + def currency(self): + return Currency(self) + + def geocode(self): + return Geocode(self) + + def post(self): + return Post(self) + + def watermark(self): + return Watermark(self) + + def webpage(self): + return Webpage(self) + def download(self, id, path): r = requests.get('{}/download/{}'.format(API_URL, id), stream=True) with open(path, 'wb') as f: @@ -25,175 +53,75 @@ def download(self, id, path): if chunk: f.write(chunk) f.flush() + + # def compress_audio(self, file=None): + # files = {'file': open(file, 'rb')} + # r = requests.post(API_URL + '/compress/audio', auth=self.interceptor, files=files) + # data = r.json() + # if self._error(r): + # raise APIError(data['code'], data['message']) + # return data - def currency_convert(self, from=None, to=None, value=None): - params = { - 'from': from, - 'to': to, - 'value': value - } - r = requests.get(API_URL + '/currency/convert', auth=self.interceptor, - params=params) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def currency_rates(self, base=None): - params = {'base': base} - r = requests.get(API_URL + '/currency/rates', auth=self.interceptor, - params=params) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def email_verify(self, email=None): - params = {'email': email} - r = requests.get(API_URL + '/email/verify', auth=self.interceptor, - params=params) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def geocode_address(self, location=None, longitude=None, latitude=None, osm_tag=None, limit=None): - params = { - 'location': location, - 'longitude': longitude, - 'latitude': latitude, - 'osm_tag': osm_tag, - 'limit': limit - } - r = requests.get(API_URL + '/geocode/address', auth=self.interceptor, - params=params) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def geocode_ip(self, ip=None): - params = {'ip': ip} - r = requests.get(API_URL + '/geocode/ip', auth=self.interceptor, - params=params) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def geocode_reverse(self, longitude=None, latitude=None, limit=None): - params = { - 'longitude': longitude, - 'latitude': latitude, - 'limit': limit - } - r = requests.get(API_URL + '/geocode/reverse', auth=self.interceptor, - params=params) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def compress_audio(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/compress/audio', auth=self.interceptor, files=files) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def compress_image(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/compress/image', auth=self.interceptor, files=files) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data + # def compress_image(self, file=None): + # files = {'file': open(file, 'rb')} + # r = requests.post(API_URL + '/compress/image', auth=self.interceptor, files=files) + # data = r.json() + # if self._error(r): + # raise APIError(data['code'], data['message']) + # return data - def compress_pdf(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/compress/pdf', auth=self.interceptor, files=files) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data + # def compress_pdf(self, file=None): + # files = {'file': open(file, 'rb')} + # r = requests.post(API_URL + '/compress/pdf', auth=self.interceptor, files=files) + # data = r.json() + # if self._error(r): + # raise APIError(data['code'], data['message']) + # return data - def compress_video(self, file=None): - files = {'file': open(file, 'rb')} - r = requests.post(API_URL + '/compress/video', auth=self.interceptor, files=files) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data + # def compress_video(self, file=None): + # files = {'file': open(file, 'rb')} + # r = requests.post(API_URL + '/compress/video', auth=self.interceptor, files=files) + # data = r.json() + # if self._error(r): + # raise APIError(data['code'], data['message']) + # return data - def watermark_image(self, file=None, text=None, font=None, size=None, color=None, opacity=None, - position=None, margin=None): - files = {'file': open(file, 'rb')} - data = { - 'text': text, - 'font': font, - 'size': size, - 'color': color, - 'opacity': opacity, - 'position': position, - 'margin': margin - } - r = requests.post('{}/watermark/image'.format(API_URL), auth=self.interceptor, - files=files, data=data) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data + # def nlp_sentiment(self, text=None): + # json = {'text': text} + # r = requests.post(API_URL + '/text/sentiment', auth=self.interceptor, + # json=json) + # data = r.json() + # if self._error(r): + # raise APIError(data['code'], data['message']) + # return data - def nlp_sentiment(self, text=None): - json = {'text': text} - r = requests.post(API_URL + '/text/sentiment', auth=self.interceptor, - json=json) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data + # def nlp_spellcheck(self, text=None): + # json = {'text': text} + # r = requests.post(API_URL + '/text/spellcheck', auth=self.interceptor, + # json=json) + # data = r.json() + # if self._error(r): + # raise APIError(data['code'], data['message']) + # return data - def nlp_spellcheck(self, text=None): - json = {'text': text} - r = requests.post(API_URL + '/text/spellcheck', auth=self.interceptor, - json=json) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data + # def nlp_summary(self, text=None, url=None, language=None, length=None): + # json = { + # 'text': text, + # 'url': url, + # 'language': language, + # 'length': length + # } + # r = requests.post(API_URL + '/text/summary', auth=self.interceptor, + # json=json) + # data = r.json() + # if self._error(r): + # raise APIError(data['code'], data['message']) + # return data - def nlp_summary(self, text=None, url=None, language=None, length=None): - json = { - 'text': text, - 'url': url, - 'language': language, - 'length': length - } - r = requests.post(API_URL + '/text/summary', auth=self.interceptor, - json=json) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def webpage_pdf(self, url=None, layout=None, format=None): - params = { - 'url': url, - 'layout': layout - 'format': format, - } - r = requests.get(API_URL + '/webpage/pdf', auth=self.interceptor, - params=params) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - class APIError(Exception): def __init__(self, code, message): self.code = code self.message = message def __str__(self): - return self.messag \ No newline at end of file + return self.message \ No newline at end of file diff --git a/labstack/common.py b/labstack/common.py deleted file mode 100644 index d9045dc..0000000 --- a/labstack/common.py +++ /dev/null @@ -1 +0,0 @@ -API_URL = 'https://api.labstack.com' \ No newline at end of file diff --git a/labstack/currency.py b/labstack/currency.py new file mode 100644 index 0000000..5868536 --- /dev/null +++ b/labstack/currency.py @@ -0,0 +1,15 @@ +import requests + +class Currency(): + def __init__(self, client): + self.client = client + + def convert(self, from_, to, value): + return self.client._request('GET', '/currency/convert', params={ + 'from': from_, + 'to': to, + 'value': value + }) + + def rates(self, base): + return self.client._request('GET', '/currency/rates', params={'base': base}) diff --git a/labstack/geocode.py b/labstack/geocode.py new file mode 100644 index 0000000..751be54 --- /dev/null +++ b/labstack/geocode.py @@ -0,0 +1,24 @@ +import requests + +class Geocode(): + def __init__(self, client): + self.client = client + + def address(self, location, longitude=None, latitude=None, osm_tag=None, limit=None): + return self.client._request('GET', '/geocode/address', params={ + 'location': location, + 'longitude': longitude, + 'latitude': latitude, + 'osm_tag': osm_tag, + 'limit': limit + }) + + def ip(self, ip): + return self.client._request('GET', '/geocode/ip', params={'ip': ip}) + + def reverse(self, longitude, latitude, limit=None): + return self.client._request('GET', '/geocode/reverse', params={ + 'longitude': longitude, + 'latitude': latitude, + 'limit': limit + }) diff --git a/labstack/post.py b/labstack/post.py new file mode 100644 index 0000000..72b6f74 --- /dev/null +++ b/labstack/post.py @@ -0,0 +1,8 @@ +import requests + +class Post(): + def __init__(self, client): + self.client = client + + def verify(self, email): + return self.client._request('GET', '/post/verify', params={'email': email}) \ No newline at end of file diff --git a/labstack/watermark.py b/labstack/watermark.py new file mode 100644 index 0000000..227c815 --- /dev/null +++ b/labstack/watermark.py @@ -0,0 +1,19 @@ +import requests + +class Watermark(): + def __init__(self, client): + self.client = client + + def image(self, file, text, font=None, size=None, color=None, opacity=None, + position=None, margin=None): + files = {'file': open(file, 'rb')} + data = { + 'text': text, + 'font': font, + 'size': size, + 'color': color, + 'opacity': opacity, + 'position': position, + 'margin': margin + } + return self.client._request('POST', '/watermark/image', files=files, data=data) \ No newline at end of file diff --git a/labstack/webpage.py b/labstack/webpage.py new file mode 100644 index 0000000..04ed2fb --- /dev/null +++ b/labstack/webpage.py @@ -0,0 +1,12 @@ +import requests + +class Webpage(): + def __init__(self, client): + self.client = client + + def webpage(self, url, format=None, layout=None): + return self.client._request('POST', '/webpage/pdf', params={ + 'url': url, + 'format': format, + 'layout': layout + }) \ No newline at end of file diff --git a/setup.py b/setup.py index e1b6e36..aada2e8 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.30.1', + version='0.31.0', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 0fa1a7872e6095b08fa8dcf233a69b909991755b Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 12 May 2018 10:25:25 -0700 Subject: [PATCH 21/34] Currency value to amount Signed-off-by: Vishal Rana --- labstack/currency.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/labstack/currency.py b/labstack/currency.py index 5868536..1f8892f 100644 --- a/labstack/currency.py +++ b/labstack/currency.py @@ -4,11 +4,11 @@ class Currency(): def __init__(self, client): self.client = client - def convert(self, from_, to, value): + def convert(self, from_, to, amount): return self.client._request('GET', '/currency/convert', params={ 'from': from_, 'to': to, - 'value': value + 'amount': amount }) def rates(self, base): diff --git a/setup.py b/setup.py index aada2e8..43cc4eb 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.31.0', + version='0.31.1', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From c2db1b98614b6090c22a8bc8a5184e33e148682e Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 12 May 2018 12:10:10 -0700 Subject: [PATCH 22/34] Fixed lat/long params Signed-off-by: Vishal Rana --- README.md | 2 +- labstack/geocode.py | 18 ++++++++++++------ setup.py | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 77b3209..2707378 100644 --- a/README.md +++ b/README.md @@ -31,4 +31,4 @@ From terminal run your app: python app.py ``` -## [API](https://labstack.com/api) | [Forum](https://forum.labstack.com) +## [Docs](https://labstack.com/docs/api) | [Forum](https://forum.labstack.com) diff --git a/labstack/geocode.py b/labstack/geocode.py index 751be54..fbd6b1f 100644 --- a/labstack/geocode.py +++ b/labstack/geocode.py @@ -4,21 +4,27 @@ class Geocode(): def __init__(self, client): self.client = client - def address(self, location, longitude=None, latitude=None, osm_tag=None, limit=None): + def address(self, location, latitude=None, longitude=None, osm_tag=None, + format=None, limit=None): return self.client._request('GET', '/geocode/address', params={ 'location': location, - 'longitude': longitude, 'latitude': latitude, + 'longitude': longitude, 'osm_tag': osm_tag, + 'format': format, 'limit': limit }) - def ip(self, ip): - return self.client._request('GET', '/geocode/ip', params={'ip': ip}) + def ip(self, ip, format=None): + return self.client._request('GET', '/geocode/ip', params={ + 'ip': ip, + 'format': format + }) - def reverse(self, longitude, latitude, limit=None): + def reverse(self, latitude, longitude, limit=None): return self.client._request('GET', '/geocode/reverse', params={ - 'longitude': longitude, 'latitude': latitude, + 'longitude': longitude, + 'format': format, 'limit': limit }) diff --git a/setup.py b/setup.py index 43cc4eb..29f537a 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.31.1', + version='0.31.2', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From be98fa1682ad55a7f91868888adb0b2f1f5f735f Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sun, 13 May 2018 09:31:58 -0700 Subject: [PATCH 23/34] Currency api changes Signed-off-by: Vishal Rana --- labstack/currency.py | 6 +++--- setup.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/labstack/currency.py b/labstack/currency.py index 1f8892f..28d54f4 100644 --- a/labstack/currency.py +++ b/labstack/currency.py @@ -4,11 +4,11 @@ class Currency(): def __init__(self, client): self.client = client - def convert(self, from_, to, amount): + def convert(self, amount, from_, to): return self.client._request('GET', '/currency/convert', params={ + 'amount': amount, 'from': from_, - 'to': to, - 'amount': amount + 'to': to }) def rates(self, base): diff --git a/setup.py b/setup.py index 29f537a..263dd36 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.31.2', + version='0.31.3', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 28167ab86ddb791cbe6ef164d60ae745324eaf83 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 26 May 2018 09:35:47 -0700 Subject: [PATCH 24/34] Added cube Signed-off-by: Vishal Rana --- labstack/cube.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++ labstack/django.py | 35 +++++++++++++++++++++ labstack/flask.py | 29 ++++++++++++++++++ labstack/util.py | 8 +++++ setup.py | 8 ++--- 5 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 labstack/cube.py create mode 100644 labstack/django.py create mode 100644 labstack/flask.py create mode 100644 labstack/util.py diff --git a/labstack/cube.py b/labstack/cube.py new file mode 100644 index 0000000..69024ba --- /dev/null +++ b/labstack/cube.py @@ -0,0 +1,76 @@ +import os +import time +import socket +import threading +from datetime import datetime +from apscheduler.schedulers.background import BackgroundScheduler +import requests +import psutil + +sched = BackgroundScheduler() + +class Cube(): + def __init__(self, api_key, node=socket.gethostname(), batch_size=60, + dispatch_interval=60, tags=None): + self.api_key = api_key + self.node = node + self.batch_size = batch_size + self.dispatch_interval = dispatch_interval + self.tags = tags + self.start_time = time.time() + self.uptime = 0 + self.cpu = 0.0 + self.memory = 0 + self.active_requests = 0 + self.requests = [] + self.lock = threading.Lock() + + def system(): + p = psutil.Process(os.getpid()) + self.uptime = int(time.time() - self.start_time) + self.cpu = p.cpu_percent() + self.memory = p.memory_full_info().rss + + sched.add_job(self._dispatch, 'interval', seconds=dispatch_interval) + sched.add_job(system, 'interval', seconds=1) + sched.start() + + def _dispatch(self): + if not self.requests: + return + + r = requests.post('https://api.labstack.com/cube', headers={ + 'User-Agent': 'labstack/cube', + 'Authorization': 'Bearer ' + self.api_key + }, json=self.requests) + if not 200 <= r.status_code < 300: + # TOTO: handler error + print('cube error', r.json()) + + # Reset requests + self.requests.clear() + + def start(self, request): + with self.lock: + self.active_requests += 1 + + request['time'] = int(datetime.now().timestamp() * 1000000) + request['active'] = self.active_requests + request['node'] = self.node + request['uptime'] = self.uptime + request['cpu'] = self.cpu + request['memory'] = self.memory + request['tags'] = self.tags + self.requests.append(request) + + return request + + def stop(self, request): + with self.lock: + self.active_requests -= 1 + request['latency'] = int(datetime.now().timestamp() * 1000000) - request['time'] + + # Dispatch batch + if len(self.requests) >= self.batch_size: + threading.Thread(target=self._dispatch).start() + \ No newline at end of file diff --git a/labstack/django.py b/labstack/django.py new file mode 100644 index 0000000..d9471e4 --- /dev/null +++ b/labstack/django.py @@ -0,0 +1,35 @@ +from django.conf import settings +from .cube import Cube +from .util import strip_port + +def cube(get_response): + options = settings.CUBE + c = Cube(**options) + + def middleware(request): + r = c.start({ + 'id': request.META.get('HTTP_X_REQUEST_ID'), + 'host': strip_port(request.get_host()), + 'path': request.path, + 'method': request.method, + 'bytes_in': int(request.META.get('CONTENT_LENGTH') or 0), + # TODO: revisit + 'remote_ip': request.META.get('HTTP_X_FORWARDED_FOR') or request.META.get('REMOTE_ADDR'), + 'client_id': request.META.get('HTTP_X_CLIENT_ID'), + 'user_agent': request.META.get('HTTP_USER_AGENT') + }) + + response = get_response(request) + + # https://docs.djangoproject.com/en/2.0/_modules/django/middleware/common/#CommonMiddleware + if not response.streaming and not response.has_header('Content-Length'): + response['Content-Length'] = str(len(response.content)) + + r['id'] = r['id'] or response.get('X-Request-ID') + r['status'] = response.status_code + r['bytes_out'] = int(response.get('Content-Length') or 0) + c.stop(r) + + return response + + return middleware \ No newline at end of file diff --git a/labstack/flask.py b/labstack/flask.py new file mode 100644 index 0000000..8867cda --- /dev/null +++ b/labstack/flask.py @@ -0,0 +1,29 @@ +from flask import request, g +from .cube import Cube +from .util import strip_port + +def cube(app, api_key, **kwargs): + c = Cube(api_key, **kwargs) + + @app.before_request + def before_request(): + g._r = c.start({ + 'id': request.headers.get('X-Request-ID'), + 'host': strip_port(request.host), + 'path': request.path, + 'method': request.method, + 'bytes_in': int(request.headers.get('Content-Length') or 0), + # TODO: revisit + 'remote_ip': request.headers.get('X-Forwarded-For', request.remote_addr), + 'client_id': request.headers.get('X-Client-ID'), + 'user_agent': request.headers.get('User-Agent') + }) + + @app.after_request + def after_request(response): + r = g._r + r['id'] = r['id'] or response.headers.get('X-Request-ID') + r['status'] = response.status_code + r['bytes_out'] = int(response.headers.get('Content-Length') or 0) + c.stop(r) + return response diff --git a/labstack/util.py b/labstack/util.py new file mode 100644 index 0000000..61dbfa1 --- /dev/null +++ b/labstack/util.py @@ -0,0 +1,8 @@ +def strip_port(host): + colon = host.find(':') + if colon == -1: + return host + i = host.find(']') + if i != -1: + return host[host.find('(')+1:i] + return host[:colon] \ No newline at end of file diff --git a/setup.py b/setup.py index 263dd36..80df577 100644 --- a/setup.py +++ b/setup.py @@ -2,8 +2,8 @@ setup( name='labstack', - version='0.31.3', - description='Official Python client library for the LabStack API', + version='0.31.4', + description='Official Python client library for the LabStack platform', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', url='https://github.com/labstack/labstack-python', @@ -15,7 +15,7 @@ 'requests==2.18.1' ], classifiers=[ - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6' + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6' ] ) From 0594f349830825a44a5cbab2cf007306e60b1f5a Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 26 May 2018 09:40:49 -0700 Subject: [PATCH 25/34] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2707378..e81c58f 100644 --- a/README.md +++ b/README.md @@ -31,4 +31,4 @@ From terminal run your app: python app.py ``` -## [Docs](https://labstack.com/docs/api) | [Forum](https://forum.labstack.com) +## [Docs](https://labstack.com/docs) | [Forum](https://forum.labstack.com) From 7da6acabdf948b5ecbfcf3e136f71a474db54710 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 26 May 2018 18:20:50 -0700 Subject: [PATCH 26/34] Added hub Signed-off-by: Vishal Rana --- labstack/__init__.py | 3 +- labstack/client.py | 6 ++-- labstack/{post.py => email.py} | 4 +-- labstack/hub.py | 50 ++++++++++++++++++++++++++++++++++ setup.py | 2 +- 5 files changed, 58 insertions(+), 7 deletions(-) rename labstack/{post.py => email.py} (52%) create mode 100644 labstack/hub.py diff --git a/labstack/__init__.py b/labstack/__init__.py index cc9f2cc..e0e7c20 100644 --- a/labstack/__init__.py +++ b/labstack/__init__.py @@ -1 +1,2 @@ -from .client import Client, APIError \ No newline at end of file +from .client import Client, APIError +from .hub import Hub \ No newline at end of file diff --git a/labstack/client.py b/labstack/client.py index 98856d0..a246cd0 100644 --- a/labstack/client.py +++ b/labstack/client.py @@ -1,7 +1,7 @@ import requests from .currency import Currency from .geocode import Geocode -from .post import Post +from .email import Email from .watermark import Watermark from .webpage import Webpage @@ -37,8 +37,8 @@ def currency(self): def geocode(self): return Geocode(self) - def post(self): - return Post(self) + def email(self): + return Email(self) def watermark(self): return Watermark(self) diff --git a/labstack/post.py b/labstack/email.py similarity index 52% rename from labstack/post.py rename to labstack/email.py index 72b6f74..24a24d3 100644 --- a/labstack/post.py +++ b/labstack/email.py @@ -1,8 +1,8 @@ import requests -class Post(): +class Email(): def __init__(self, client): self.client = client def verify(self, email): - return self.client._request('GET', '/post/verify', params={'email': email}) \ No newline at end of file + return self.client._request('GET', '/email/verify', params={'email': email}) \ No newline at end of file diff --git a/labstack/hub.py b/labstack/hub.py new file mode 100644 index 0000000..5ae757f --- /dev/null +++ b/labstack/hub.py @@ -0,0 +1,50 @@ +import signal +import time +import paho.mqtt.client as mqtt + +class Hub(): + def __init__(self, account_id, api_key, client_id=None): + self.account_id = account_id + self.client = mqtt.Client(client_id=client_id, clean_session=True) + self.client.username_pw_set(account_id, api_key) + # self.client.tls_set(ca_certs='labstack.com/cert.pem') + self.handlers = {} + def handler(client, userdata, msg): + self.handlers[msg.topic](msg.payload) + self.client.on_message = handler + self._run = True + signal.signal(signal.SIGINT, self._stop) + signal.signal(signal.SIGTERM, self._stop) + + def connect(self, handler=None): + self.client.connect("hub.labstack.com", 1883) + self.client.loop_start() + def on_connect(client, userdata, flags, rc): + handler() + self.client.on_connect = on_connect + + def publish(self, topic, message): + self.client.publish('{}/{}'.format(self.account_id, topic), message) + + # def subscribe(self, topic, handler, shared=False): + def subscribe(self, topic, handler): + topic = '{}/{}'.format(self.account_id, topic) + # if shared: + # topic = '$queue/' + topic + self.client.subscribe(topic) + self.handlers[topic] = handler + + def unsubscribe(self, topic): + self.client.unsubscribe(topic) + + def disconnect(self): + self.client.loop_stop() + self.client.disconnect() + + def run(self): + while self._run: + time.sleep(1) + + def _stop(self, signum, frame): + self._run = False + self.disconnect() \ No newline at end of file diff --git a/setup.py b/setup.py index 80df577..3066901 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.31.4', + version='0.31.5', description='Official Python client library for the LabStack platform', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 08880c2ecfc00801e1d3829655cf21f97be22e3b Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 26 May 2018 23:42:07 -0700 Subject: [PATCH 27/34] Updated hub Signed-off-by: Vishal Rana --- labstack/hub.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/labstack/hub.py b/labstack/hub.py index 5ae757f..fe45fc3 100644 --- a/labstack/hub.py +++ b/labstack/hub.py @@ -1,4 +1,3 @@ -import signal import time import paho.mqtt.client as mqtt @@ -12,15 +11,13 @@ def __init__(self, account_id, api_key, client_id=None): def handler(client, userdata, msg): self.handlers[msg.topic](msg.payload) self.client.on_message = handler - self._run = True - signal.signal(signal.SIGINT, self._stop) - signal.signal(signal.SIGTERM, self._stop) def connect(self, handler=None): self.client.connect("hub.labstack.com", 1883) self.client.loop_start() def on_connect(client, userdata, flags, rc): - handler() + if handler is not None: + handler() self.client.on_connect = on_connect def publish(self, topic, message): @@ -42,9 +39,8 @@ def disconnect(self): self.client.disconnect() def run(self): - while self._run: - time.sleep(1) - - def _stop(self, signum, frame): - self._run = False - self.disconnect() \ No newline at end of file + try: + while True: + time.sleep(1) + except (KeyboardInterrupt): + pass \ No newline at end of file From 8dc4cb6a0f165eb7b1ad898a7fe8278b6a011e8b Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sun, 27 May 2018 10:28:53 -0700 Subject: [PATCH 28/34] Bumped version Signed-off-by: Vishal Rana --- labstack/hub.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/labstack/hub.py b/labstack/hub.py index fe45fc3..d5d247f 100644 --- a/labstack/hub.py +++ b/labstack/hub.py @@ -18,7 +18,7 @@ def connect(self, handler=None): def on_connect(client, userdata, flags, rc): if handler is not None: handler() - self.client.on_connect = on_connect + self.client.on_connect = on_connect def publish(self, topic, message): self.client.publish('{}/{}'.format(self.account_id, topic), message) @@ -32,7 +32,7 @@ def subscribe(self, topic, handler): self.handlers[topic] = handler def unsubscribe(self, topic): - self.client.unsubscribe(topic) + self.client.unsubscribe('{}/{}'.format(self.account_id, topic)) def disconnect(self): self.client.loop_stop() diff --git a/setup.py b/setup.py index 3066901..0ebae79 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.31.5', + version='0.31.6', description='Official Python client library for the LabStack platform', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From e41a5af6225a2d089cbe4176e12060458575dfa1 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sat, 2 Jun 2018 14:45:04 -0700 Subject: [PATCH 29/34] Enhanced hub Signed-off-by: Vishal Rana --- labstack/hub.py | 28 +++++++++++++++++++--------- setup.py | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/labstack/hub.py b/labstack/hub.py index d5d247f..fa60e4d 100644 --- a/labstack/hub.py +++ b/labstack/hub.py @@ -2,37 +2,47 @@ import paho.mqtt.client as mqtt class Hub(): - def __init__(self, account_id, api_key, client_id=None): + def __init__(self, account_id, api_key, device_id=None, message_handler=None): self.account_id = account_id - self.client = mqtt.Client(client_id=client_id, clean_session=True) + self.client = mqtt.Client(client_id=device_id, clean_session=True) self.client.username_pw_set(account_id, api_key) # self.client.tls_set(ca_certs='labstack.com/cert.pem') self.handlers = {} def handler(client, userdata, msg): - self.handlers[msg.topic](msg.payload) + topic = self._denormalize_topic(msg.topic) + if message_handler: + message_handler(topic, msg.payload) + h = self.handlers.get(topic) + if h: + h(topic, msg.payload) self.client.on_message = handler + + def _normalize_topic(self, topic): + return '{}/{}'.format(self.account_id, topic) + + def _denormalize_topic(self, topic): + return topic.lstrip(self.account_id + '/') def connect(self, handler=None): self.client.connect("hub.labstack.com", 1883) self.client.loop_start() def on_connect(client, userdata, flags, rc): - if handler is not None: + if handler: handler() self.client.on_connect = on_connect def publish(self, topic, message): - self.client.publish('{}/{}'.format(self.account_id, topic), message) + self.client.publish(self._normalize_topic(topic), message) # def subscribe(self, topic, handler, shared=False): - def subscribe(self, topic, handler): - topic = '{}/{}'.format(self.account_id, topic) + def subscribe(self, topic, handler=None): # if shared: # topic = '$queue/' + topic - self.client.subscribe(topic) + self.client.subscribe(self._normalize_topic(topic)) self.handlers[topic] = handler def unsubscribe(self, topic): - self.client.unsubscribe('{}/{}'.format(self.account_id, topic)) + self.client.unsubscribe(self._normalize_topic(topic)) def disconnect(self): self.client.loop_stop() diff --git a/setup.py b/setup.py index 0ebae79..29620d0 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.31.6', + version='0.32.0', description='Official Python client library for the LabStack platform', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 323b138c23b6134cc3a71ccbe74d6c049bf2d7eb Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Sun, 3 Jun 2018 10:11:58 -0700 Subject: [PATCH 30/34] Device id is must Signed-off-by: Vishal Rana --- labstack/hub.py | 15 +++++++++------ setup.py | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/labstack/hub.py b/labstack/hub.py index fa60e4d..2681c32 100644 --- a/labstack/hub.py +++ b/labstack/hub.py @@ -2,9 +2,9 @@ import paho.mqtt.client as mqtt class Hub(): - def __init__(self, account_id, api_key, device_id=None, message_handler=None): + def __init__(self, account_id, api_key, device_id, message_handler=None): self.account_id = account_id - self.client = mqtt.Client(client_id=device_id, clean_session=True) + self.client = mqtt.Client(client_id=self._normalize_device_id(device_id), clean_session=True) self.client.username_pw_set(account_id, api_key) # self.client.tls_set(ca_certs='labstack.com/cert.pem') self.handlers = {} @@ -17,11 +17,14 @@ def handler(client, userdata, msg): h(topic, msg.payload) self.client.on_message = handler - def _normalize_topic(self, topic): - return '{}/{}'.format(self.account_id, topic) + def _normalize_device_id(self, id): + return '{}:{}'.format(self.account_id, id) + + def _normalize_topic(self, name): + return '{}/{}'.format(self.account_id, name) - def _denormalize_topic(self, topic): - return topic.lstrip(self.account_id + '/') + def _denormalize_topic(self, name): + return name.lstrip(self.account_id + '/') def connect(self, handler=None): self.client.connect("hub.labstack.com", 1883) diff --git a/setup.py b/setup.py index 29620d0..863094d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='0.32.0', + version='0.32.1', description='Official Python client library for the LabStack platform', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', From 5b40e3b2898867423b55a09e7c73b5efb7dc1fbe Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Thu, 28 Jun 2018 10:12:43 -0700 Subject: [PATCH 31/34] Hub to axis Signed-off-by: Vishal Rana --- labstack/__init__.py | 4 +- labstack/{hub.py => axis.py} | 56 ++++++++++----- labstack/client.py | 127 ----------------------------------- labstack/cube.py | 76 --------------------- labstack/currency.py | 15 ----- labstack/django.py | 35 ---------- labstack/email.py | 8 --- labstack/flask.py | 29 -------- labstack/geocode.py | 30 --------- labstack/util.py | 8 --- labstack/watermark.py | 19 ------ labstack/webpage.py | 12 ---- 12 files changed, 40 insertions(+), 379 deletions(-) rename labstack/{hub.py => axis.py} (53%) delete mode 100644 labstack/client.py delete mode 100644 labstack/cube.py delete mode 100644 labstack/currency.py delete mode 100644 labstack/django.py delete mode 100644 labstack/email.py delete mode 100644 labstack/flask.py delete mode 100644 labstack/geocode.py delete mode 100644 labstack/util.py delete mode 100644 labstack/watermark.py delete mode 100644 labstack/webpage.py diff --git a/labstack/__init__.py b/labstack/__init__.py index e0e7c20..7534ba7 100644 --- a/labstack/__init__.py +++ b/labstack/__init__.py @@ -1,2 +1,2 @@ -from .client import Client, APIError -from .hub import Hub \ No newline at end of file +# from .client import Client, APIError +from .axis import Axis \ No newline at end of file diff --git a/labstack/hub.py b/labstack/axis.py similarity index 53% rename from labstack/hub.py rename to labstack/axis.py index 2681c32..d0bd765 100644 --- a/labstack/hub.py +++ b/labstack/axis.py @@ -1,34 +1,54 @@ import time +import requests import paho.mqtt.client as mqtt -class Hub(): - def __init__(self, account_id, api_key, device_id, message_handler=None): - self.account_id = account_id - self.client = mqtt.Client(client_id=self._normalize_device_id(device_id), clean_session=True) - self.client.username_pw_set(account_id, api_key) - # self.client.tls_set(ca_certs='labstack.com/cert.pem') +class Axis(): + def __init__(self, api_key, client_id, message_handler=None): + self.api_key = api_key + self.client_id = client_id + self.message_handler = message_handler self.handlers = {} - def handler(client, userdata, msg): - topic = self._denormalize_topic(msg.topic) - if message_handler: - message_handler(topic, msg.payload) - h = self.handlers.get(topic) - if h: - h(topic, msg.payload) - self.client.on_message = handler def _normalize_device_id(self, id): - return '{}:{}'.format(self.account_id, id) + return '{}:{}'.format(self.project_id, id) def _normalize_topic(self, name): - return '{}/{}'.format(self.account_id, name) + return '{}/{}'.format(self.project_id, name) def _denormalize_topic(self, name): - return name.lstrip(self.account_id + '/') + return name.lstrip(self.project_id + '/') + + def _find_project_id(self): + headers = { + 'Authorization': 'Bearer ' + self.api_key + } + r = requests.get('https://api.labstack.com/axis/key', headers=headers) + if not 200 <= r.status_code < 300: + pass + # raise APIError(data['code'], data['message']) + data = r.json() + self.project_id = data['project_id'] def connect(self, handler=None): - self.client.connect("hub.labstack.com", 1883) + # Find project id + self._find_project_id() + + # Connect + self.client = mqtt.Client(client_id=self._normalize_device_id(self.client_id), + clean_session=True) + self.client.username_pw_set(self.project_id, self.api_key) + # self.client.tls_set(ca_certs='labstack.com/cert.pem') + def message_handler(client, userdata, msg): + topic = self._denormalize_topic(msg.topic) + if self.message_handler: + self.message_handler(topic, msg.payload) + h = self.handlers.get(topic) + if h: + h(topic, msg.payload) + self.client.on_message = message_handler + self.client.connect("axis.labstack.com", 1883) self.client.loop_start() + def on_connect(client, userdata, flags, rc): if handler: handler() diff --git a/labstack/client.py b/labstack/client.py deleted file mode 100644 index a246cd0..0000000 --- a/labstack/client.py +++ /dev/null @@ -1,127 +0,0 @@ -import requests -from .currency import Currency -from .geocode import Geocode -from .email import Email -from .watermark import Watermark -from .webpage import Webpage - -API_URL = 'https://api.labstack.com' - -class _Interceptor(requests.auth.AuthBase): - def __init__(self, api_key): - self.api_key = api_key - - def __call__(self, r): - r.headers['Authorization'] = 'Bearer ' + self.api_key - return r - -class Client(): - def __init__(self, api_key): - self.api_key = api_key - self.interceptor = _Interceptor(api_key) - - def _request(self, method, path, params=None, files=None, data=None): - r = requests.request(method, API_URL + path, auth=self.interceptor, - params=params, files=files, data=data) - data = r.json() - if self._error(r): - raise APIError(data['code'], data['message']) - return data - - def _error(self, r): - return not 200 <= r.status_code < 300 - - def currency(self): - return Currency(self) - - def geocode(self): - return Geocode(self) - - def email(self): - return Email(self) - - def watermark(self): - return Watermark(self) - - def webpage(self): - return Webpage(self) - - def download(self, id, path): - r = requests.get('{}/download/{}'.format(API_URL, id), stream=True) - with open(path, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): - if chunk: - f.write(chunk) - f.flush() - - # def compress_audio(self, file=None): - # files = {'file': open(file, 'rb')} - # r = requests.post(API_URL + '/compress/audio', auth=self.interceptor, files=files) - # data = r.json() - # if self._error(r): - # raise APIError(data['code'], data['message']) - # return data - - # def compress_image(self, file=None): - # files = {'file': open(file, 'rb')} - # r = requests.post(API_URL + '/compress/image', auth=self.interceptor, files=files) - # data = r.json() - # if self._error(r): - # raise APIError(data['code'], data['message']) - # return data - - # def compress_pdf(self, file=None): - # files = {'file': open(file, 'rb')} - # r = requests.post(API_URL + '/compress/pdf', auth=self.interceptor, files=files) - # data = r.json() - # if self._error(r): - # raise APIError(data['code'], data['message']) - # return data - - # def compress_video(self, file=None): - # files = {'file': open(file, 'rb')} - # r = requests.post(API_URL + '/compress/video', auth=self.interceptor, files=files) - # data = r.json() - # if self._error(r): - # raise APIError(data['code'], data['message']) - # return data - - # def nlp_sentiment(self, text=None): - # json = {'text': text} - # r = requests.post(API_URL + '/text/sentiment', auth=self.interceptor, - # json=json) - # data = r.json() - # if self._error(r): - # raise APIError(data['code'], data['message']) - # return data - - # def nlp_spellcheck(self, text=None): - # json = {'text': text} - # r = requests.post(API_URL + '/text/spellcheck', auth=self.interceptor, - # json=json) - # data = r.json() - # if self._error(r): - # raise APIError(data['code'], data['message']) - # return data - - # def nlp_summary(self, text=None, url=None, language=None, length=None): - # json = { - # 'text': text, - # 'url': url, - # 'language': language, - # 'length': length - # } - # r = requests.post(API_URL + '/text/summary', auth=self.interceptor, - # json=json) - # data = r.json() - # if self._error(r): - # raise APIError(data['code'], data['message']) - # return data - -class APIError(Exception): - def __init__(self, code, message): - self.code = code - self.message = message - - def __str__(self): - return self.message \ No newline at end of file diff --git a/labstack/cube.py b/labstack/cube.py deleted file mode 100644 index 69024ba..0000000 --- a/labstack/cube.py +++ /dev/null @@ -1,76 +0,0 @@ -import os -import time -import socket -import threading -from datetime import datetime -from apscheduler.schedulers.background import BackgroundScheduler -import requests -import psutil - -sched = BackgroundScheduler() - -class Cube(): - def __init__(self, api_key, node=socket.gethostname(), batch_size=60, - dispatch_interval=60, tags=None): - self.api_key = api_key - self.node = node - self.batch_size = batch_size - self.dispatch_interval = dispatch_interval - self.tags = tags - self.start_time = time.time() - self.uptime = 0 - self.cpu = 0.0 - self.memory = 0 - self.active_requests = 0 - self.requests = [] - self.lock = threading.Lock() - - def system(): - p = psutil.Process(os.getpid()) - self.uptime = int(time.time() - self.start_time) - self.cpu = p.cpu_percent() - self.memory = p.memory_full_info().rss - - sched.add_job(self._dispatch, 'interval', seconds=dispatch_interval) - sched.add_job(system, 'interval', seconds=1) - sched.start() - - def _dispatch(self): - if not self.requests: - return - - r = requests.post('https://api.labstack.com/cube', headers={ - 'User-Agent': 'labstack/cube', - 'Authorization': 'Bearer ' + self.api_key - }, json=self.requests) - if not 200 <= r.status_code < 300: - # TOTO: handler error - print('cube error', r.json()) - - # Reset requests - self.requests.clear() - - def start(self, request): - with self.lock: - self.active_requests += 1 - - request['time'] = int(datetime.now().timestamp() * 1000000) - request['active'] = self.active_requests - request['node'] = self.node - request['uptime'] = self.uptime - request['cpu'] = self.cpu - request['memory'] = self.memory - request['tags'] = self.tags - self.requests.append(request) - - return request - - def stop(self, request): - with self.lock: - self.active_requests -= 1 - request['latency'] = int(datetime.now().timestamp() * 1000000) - request['time'] - - # Dispatch batch - if len(self.requests) >= self.batch_size: - threading.Thread(target=self._dispatch).start() - \ No newline at end of file diff --git a/labstack/currency.py b/labstack/currency.py deleted file mode 100644 index 28d54f4..0000000 --- a/labstack/currency.py +++ /dev/null @@ -1,15 +0,0 @@ -import requests - -class Currency(): - def __init__(self, client): - self.client = client - - def convert(self, amount, from_, to): - return self.client._request('GET', '/currency/convert', params={ - 'amount': amount, - 'from': from_, - 'to': to - }) - - def rates(self, base): - return self.client._request('GET', '/currency/rates', params={'base': base}) diff --git a/labstack/django.py b/labstack/django.py deleted file mode 100644 index d9471e4..0000000 --- a/labstack/django.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.conf import settings -from .cube import Cube -from .util import strip_port - -def cube(get_response): - options = settings.CUBE - c = Cube(**options) - - def middleware(request): - r = c.start({ - 'id': request.META.get('HTTP_X_REQUEST_ID'), - 'host': strip_port(request.get_host()), - 'path': request.path, - 'method': request.method, - 'bytes_in': int(request.META.get('CONTENT_LENGTH') or 0), - # TODO: revisit - 'remote_ip': request.META.get('HTTP_X_FORWARDED_FOR') or request.META.get('REMOTE_ADDR'), - 'client_id': request.META.get('HTTP_X_CLIENT_ID'), - 'user_agent': request.META.get('HTTP_USER_AGENT') - }) - - response = get_response(request) - - # https://docs.djangoproject.com/en/2.0/_modules/django/middleware/common/#CommonMiddleware - if not response.streaming and not response.has_header('Content-Length'): - response['Content-Length'] = str(len(response.content)) - - r['id'] = r['id'] or response.get('X-Request-ID') - r['status'] = response.status_code - r['bytes_out'] = int(response.get('Content-Length') or 0) - c.stop(r) - - return response - - return middleware \ No newline at end of file diff --git a/labstack/email.py b/labstack/email.py deleted file mode 100644 index 24a24d3..0000000 --- a/labstack/email.py +++ /dev/null @@ -1,8 +0,0 @@ -import requests - -class Email(): - def __init__(self, client): - self.client = client - - def verify(self, email): - return self.client._request('GET', '/email/verify', params={'email': email}) \ No newline at end of file diff --git a/labstack/flask.py b/labstack/flask.py deleted file mode 100644 index 8867cda..0000000 --- a/labstack/flask.py +++ /dev/null @@ -1,29 +0,0 @@ -from flask import request, g -from .cube import Cube -from .util import strip_port - -def cube(app, api_key, **kwargs): - c = Cube(api_key, **kwargs) - - @app.before_request - def before_request(): - g._r = c.start({ - 'id': request.headers.get('X-Request-ID'), - 'host': strip_port(request.host), - 'path': request.path, - 'method': request.method, - 'bytes_in': int(request.headers.get('Content-Length') or 0), - # TODO: revisit - 'remote_ip': request.headers.get('X-Forwarded-For', request.remote_addr), - 'client_id': request.headers.get('X-Client-ID'), - 'user_agent': request.headers.get('User-Agent') - }) - - @app.after_request - def after_request(response): - r = g._r - r['id'] = r['id'] or response.headers.get('X-Request-ID') - r['status'] = response.status_code - r['bytes_out'] = int(response.headers.get('Content-Length') or 0) - c.stop(r) - return response diff --git a/labstack/geocode.py b/labstack/geocode.py deleted file mode 100644 index fbd6b1f..0000000 --- a/labstack/geocode.py +++ /dev/null @@ -1,30 +0,0 @@ -import requests - -class Geocode(): - def __init__(self, client): - self.client = client - - def address(self, location, latitude=None, longitude=None, osm_tag=None, - format=None, limit=None): - return self.client._request('GET', '/geocode/address', params={ - 'location': location, - 'latitude': latitude, - 'longitude': longitude, - 'osm_tag': osm_tag, - 'format': format, - 'limit': limit - }) - - def ip(self, ip, format=None): - return self.client._request('GET', '/geocode/ip', params={ - 'ip': ip, - 'format': format - }) - - def reverse(self, latitude, longitude, limit=None): - return self.client._request('GET', '/geocode/reverse', params={ - 'latitude': latitude, - 'longitude': longitude, - 'format': format, - 'limit': limit - }) diff --git a/labstack/util.py b/labstack/util.py deleted file mode 100644 index 61dbfa1..0000000 --- a/labstack/util.py +++ /dev/null @@ -1,8 +0,0 @@ -def strip_port(host): - colon = host.find(':') - if colon == -1: - return host - i = host.find(']') - if i != -1: - return host[host.find('(')+1:i] - return host[:colon] \ No newline at end of file diff --git a/labstack/watermark.py b/labstack/watermark.py deleted file mode 100644 index 227c815..0000000 --- a/labstack/watermark.py +++ /dev/null @@ -1,19 +0,0 @@ -import requests - -class Watermark(): - def __init__(self, client): - self.client = client - - def image(self, file, text, font=None, size=None, color=None, opacity=None, - position=None, margin=None): - files = {'file': open(file, 'rb')} - data = { - 'text': text, - 'font': font, - 'size': size, - 'color': color, - 'opacity': opacity, - 'position': position, - 'margin': margin - } - return self.client._request('POST', '/watermark/image', files=files, data=data) \ No newline at end of file diff --git a/labstack/webpage.py b/labstack/webpage.py deleted file mode 100644 index 04ed2fb..0000000 --- a/labstack/webpage.py +++ /dev/null @@ -1,12 +0,0 @@ -import requests - -class Webpage(): - def __init__(self, client): - self.client = client - - def webpage(self, url, format=None, layout=None): - return self.client._request('POST', '/webpage/pdf', params={ - 'url': url, - 'format': format, - 'layout': layout - }) \ No newline at end of file From dfbe157238068022ae2ac8c8fff0274866ca76ee Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Thu, 1 Aug 2019 23:09:16 -0700 Subject: [PATCH 32/34] Bumped v1 Signed-off-by: Vishal Rana --- Makefile | 3 ++ README.md | 2 +- fix_virtualenv | 15 ++++++++ labstack/__init__.py | 3 +- labstack/axis.py | 79 --------------------------------------- labstack/client.py | 57 ++++++++++++++++++++++++++++ labstack/currency.py | 15 ++++++++ labstack/domain.py | 23 ++++++++++++ labstack/email.py | 11 ++++++ labstack/ip.py | 10 +++++ labstack/test_currency.py | 20 ++++++++++ labstack/test_domain.py | 33 ++++++++++++++++ labstack/test_email.py | 14 +++++++ labstack/test_ip.py | 14 +++++++ labstack/test_webpage.py | 20 ++++++++++ labstack/util.py | 8 ++++ labstack/webpage.py | 15 ++++++++ pyvenv.cfg | 3 ++ setup.py | 35 ++++++++--------- 19 files changed, 281 insertions(+), 99 deletions(-) create mode 100644 fix_virtualenv delete mode 100644 labstack/axis.py create mode 100644 labstack/client.py create mode 100644 labstack/currency.py create mode 100644 labstack/domain.py create mode 100644 labstack/email.py create mode 100644 labstack/ip.py create mode 100644 labstack/test_currency.py create mode 100644 labstack/test_domain.py create mode 100644 labstack/test_email.py create mode 100644 labstack/test_ip.py create mode 100644 labstack/test_webpage.py create mode 100644 labstack/util.py create mode 100644 labstack/webpage.py create mode 100644 pyvenv.cfg diff --git a/Makefile b/Makefile index d82e3b5..ed09bad 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ +test: + nose2 + publish: rm -rf dist python setup.py sdist bdist_wheel diff --git a/README.md b/README.md index e81c58f..8239e09 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Create a file `app.py` with the following content: ```python -from labstack import Client, APIError +from labstack import Client, LabStackError client = new Client('') geocode = client.geocode() diff --git a/fix_virtualenv b/fix_virtualenv new file mode 100644 index 0000000..3d02d56 --- /dev/null +++ b/fix_virtualenv @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +ENV_PATH="$(dirname "$(dirname "$(which pip)")")" +SYSTEM_VIRTUALENV="$(which -a virtualenv|tail -1)" + +echo "Ensure the root of current virtualenv:" +echo " $ENV_PATH" +read -p "‼️ Say no if you are not sure (y/N) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "♻️ Removing old symbolic links......" + find "$ENV_PATH" -type l -delete -print + echo "💫 Creating new symbolic links......" + $SYSTEM_VIRTUALENV "$ENV_PATH" + echo "🎉 Done!" +fi \ No newline at end of file diff --git a/labstack/__init__.py b/labstack/__init__.py index 7534ba7..5564901 100644 --- a/labstack/__init__.py +++ b/labstack/__init__.py @@ -1,2 +1 @@ -# from .client import Client, APIError -from .axis import Axis \ No newline at end of file +from .client import Client, LabStackError diff --git a/labstack/axis.py b/labstack/axis.py deleted file mode 100644 index d0bd765..0000000 --- a/labstack/axis.py +++ /dev/null @@ -1,79 +0,0 @@ -import time -import requests -import paho.mqtt.client as mqtt - -class Axis(): - def __init__(self, api_key, client_id, message_handler=None): - self.api_key = api_key - self.client_id = client_id - self.message_handler = message_handler - self.handlers = {} - - def _normalize_device_id(self, id): - return '{}:{}'.format(self.project_id, id) - - def _normalize_topic(self, name): - return '{}/{}'.format(self.project_id, name) - - def _denormalize_topic(self, name): - return name.lstrip(self.project_id + '/') - - def _find_project_id(self): - headers = { - 'Authorization': 'Bearer ' + self.api_key - } - r = requests.get('https://api.labstack.com/axis/key', headers=headers) - if not 200 <= r.status_code < 300: - pass - # raise APIError(data['code'], data['message']) - data = r.json() - self.project_id = data['project_id'] - - def connect(self, handler=None): - # Find project id - self._find_project_id() - - # Connect - self.client = mqtt.Client(client_id=self._normalize_device_id(self.client_id), - clean_session=True) - self.client.username_pw_set(self.project_id, self.api_key) - # self.client.tls_set(ca_certs='labstack.com/cert.pem') - def message_handler(client, userdata, msg): - topic = self._denormalize_topic(msg.topic) - if self.message_handler: - self.message_handler(topic, msg.payload) - h = self.handlers.get(topic) - if h: - h(topic, msg.payload) - self.client.on_message = message_handler - self.client.connect("axis.labstack.com", 1883) - self.client.loop_start() - - def on_connect(client, userdata, flags, rc): - if handler: - handler() - self.client.on_connect = on_connect - - def publish(self, topic, message): - self.client.publish(self._normalize_topic(topic), message) - - # def subscribe(self, topic, handler, shared=False): - def subscribe(self, topic, handler=None): - # if shared: - # topic = '$queue/' + topic - self.client.subscribe(self._normalize_topic(topic)) - self.handlers[topic] = handler - - def unsubscribe(self, topic): - self.client.unsubscribe(self._normalize_topic(topic)) - - def disconnect(self): - self.client.loop_stop() - self.client.disconnect() - - def run(self): - try: - while True: - time.sleep(1) - except (KeyboardInterrupt): - pass \ No newline at end of file diff --git a/labstack/client.py b/labstack/client.py new file mode 100644 index 0000000..9c0d6e2 --- /dev/null +++ b/labstack/client.py @@ -0,0 +1,57 @@ +import requests +from .currency import CurrencyService +from .domain import DomainService +from .email import EmailService +from .ip import IPService +from .webpage import WebpageService + + +class _Interceptor(requests.auth.AuthBase): + def __init__(self, key): + self.key = key + + def __call__(self, r): + r.headers['Authorization'] = 'Bearer ' + self.key + return r + + +class Client(): + def __init__(self, key): + self.key = key + self.interceptor = _Interceptor(key) + + def _request(self, method, url, params=None, files=None, data=None): + r = requests.request(method, url, auth=self.interceptor, + params=params, files=files, data=data) + data = r.json() + if self._is_error(r): + raise LabStackError(data['code'], data['message']) + return data + + def _is_error(self, r): + return not 200 <= r.status_code < 300 + + def currency(self): + return CurrencyService(self) + + def domain(self): + return DomainService(self) + + def email(self): + return EmailService(self) + + def ip(self): + return IPService(self) + + def webpage(self): + return WebpageService(self) + + +class LabStackError(Exception): + def __init__(self, statusCode, code, message): + self.statusCode = statusCode + self.code = code + self.message = message + + def __str__(self): + return self.message diff --git a/labstack/currency.py b/labstack/currency.py new file mode 100644 index 0000000..557b4ae --- /dev/null +++ b/labstack/currency.py @@ -0,0 +1,15 @@ +import requests + + +class CurrencyService(): + def __init__(self, client): + self.client = client + self.url = 'https://currency.labstack.com/api/v1' + + def convert(self, request): + return self.client._request('GET', '{}/convert/{}/{}/{}'. + format(self.url, request['amount'], + request['from'], request['to'])) + + def list(self, request): + return self.client._request('GET', '{}/list'.format(self.url)) diff --git a/labstack/domain.py b/labstack/domain.py new file mode 100644 index 0000000..630be8a --- /dev/null +++ b/labstack/domain.py @@ -0,0 +1,23 @@ +import requests + + +class DomainService(): + def __init__(self, client): + self.client = client + self.url = 'https://domain.labstack.com/api/v1' + + def dns(self, request): + return self.client._request('GET', '{}/{}/{}'. + format(self.url, request['type'], request['domain'])) + + def search(self, request): + return self.client._request('GET', '{}/search/{}'. + format(self.url, request['domain'])) + + def status(self, request): + return self.client._request('GET', '{}/status/{}'. + format(self.url, request['domain'])) + + def whois(self, request): + return self.client._request('GET', '{}/whois/{}'. + format(self.url, request['domain'])) diff --git a/labstack/email.py b/labstack/email.py new file mode 100644 index 0000000..02ecd50 --- /dev/null +++ b/labstack/email.py @@ -0,0 +1,11 @@ +import requests + + +class EmailService(): + def __init__(self, client): + self.client = client + self.url = 'https://email.labstack.com/api/v1' + + def verify(self, request): + return self.client._request('GET', '{}/verify/{}'. + format(self.url, request['email'])) diff --git a/labstack/ip.py b/labstack/ip.py new file mode 100644 index 0000000..2ab5c17 --- /dev/null +++ b/labstack/ip.py @@ -0,0 +1,10 @@ +import requests + + +class IPService(): + def __init__(self, client): + self.client = client + self.url = 'https://ip.labstack.com/api/v1' + + def lookup(self, request): + return self.client._request('GET', '{}/{}'.format(self.url, request['ip'])) diff --git a/labstack/test_currency.py b/labstack/test_currency.py new file mode 100644 index 0000000..51bd917 --- /dev/null +++ b/labstack/test_currency.py @@ -0,0 +1,20 @@ +import os +import unittest +from .client import Client + + +class TestCurrency(unittest.TestCase): + def setUp(self): + self.s = Client(os.getenv('KEY')).currency() + + def test_convert(self): + response = self.s.convert({ + 'amount': 10, + 'from': 'USD', + 'to': 'INR' + }) + self.assertNotEqual(response['amount'], 0) + + def test_list(self): + response = self.s.list({}) + self.assertNotEqual(len(response['currencies']), 0) diff --git a/labstack/test_domain.py b/labstack/test_domain.py new file mode 100644 index 0000000..60223e0 --- /dev/null +++ b/labstack/test_domain.py @@ -0,0 +1,33 @@ +import os +import unittest +from .client import Client + + +class TestDomain(unittest.TestCase): + def setUp(self): + self.s = Client(os.getenv('KEY')).domain() + + def test_dns(self): + response = self.s.dns({ + 'type': 'A', + 'domain': 'twilio.com' + }) + self.assertNotEqual(len(response['records']), 0) + + def test_search(self): + response = self.s.search({ + 'domain': 'twilio.com' + }) + self.assertNotEqual(len(response['results']), 0) + + def test_status(self): + response = self.s.status({ + 'domain': 'twilio.com' + }) + self.assertEqual(response['result'], 'unavailable') + + def test_whois(self): + response = self.s.whois({ + 'domain': 'twilio.com' + }) + self.assertNotEqual(response['raw'], '') diff --git a/labstack/test_email.py b/labstack/test_email.py new file mode 100644 index 0000000..67bfdc3 --- /dev/null +++ b/labstack/test_email.py @@ -0,0 +1,14 @@ +import os +import unittest +from .client import Client + + +class TestEmail(unittest.TestCase): + def setUp(self): + self.s = Client(os.getenv('KEY')).email() + + def test_verify(self): + response = self.s.verify({ + 'email': 'jon@labstack.com' + }) + self.assertEqual(response['result'], 'deliverable') diff --git a/labstack/test_ip.py b/labstack/test_ip.py new file mode 100644 index 0000000..0b83601 --- /dev/null +++ b/labstack/test_ip.py @@ -0,0 +1,14 @@ +import os +import unittest +from .client import Client + + +class TestIP(unittest.TestCase): + def setUp(self): + self.s = Client(os.getenv('KEY')).ip() + + def test_ip(self): + response = self.s.lookup({ + 'ip': '96.45.83.67' + }) + self.assertNotEqual(response['country'], '') diff --git a/labstack/test_webpage.py b/labstack/test_webpage.py new file mode 100644 index 0000000..9174d1e --- /dev/null +++ b/labstack/test_webpage.py @@ -0,0 +1,20 @@ +import os +import unittest +from .client import Client + + +class TestWebpage(unittest.TestCase): + def setUp(self): + self.s = Client(os.getenv('KEY')).webpage() + + def test_image(self): + response = self.s.image({ + 'url': 'http://amazon.com' + }) + self.assertNotEqual(response['image'], '') + + def test_pdf(self): + response = self.s.pdf({ + 'url': 'http://amazon.com' + }) + self.assertNotEqual(response['pdf'], '') diff --git a/labstack/util.py b/labstack/util.py new file mode 100644 index 0000000..61dbfa1 --- /dev/null +++ b/labstack/util.py @@ -0,0 +1,8 @@ +def strip_port(host): + colon = host.find(':') + if colon == -1: + return host + i = host.find(']') + if i != -1: + return host[host.find('(')+1:i] + return host[:colon] \ No newline at end of file diff --git a/labstack/webpage.py b/labstack/webpage.py new file mode 100644 index 0000000..cbc9476 --- /dev/null +++ b/labstack/webpage.py @@ -0,0 +1,15 @@ +import requests + + +class WebpageService(): + def __init__(self, client): + self.client = client + self.url = 'https://webpage.labstack.com/api/v1' + + def image(self, request): + return self.client._request('GET', '{}/image' + .format(self.url), params=request) + + def pdf(self, request): + return self.client._request('GET', '{}/pdf' + .format(self.url), params=request) diff --git a/pyvenv.cfg b/pyvenv.cfg new file mode 100644 index 0000000..fef5aa2 --- /dev/null +++ b/pyvenv.cfg @@ -0,0 +1,3 @@ +home = /usr/local/opt/python/libexec/bin +include-system-site-packages = false +version = 3.7.4 diff --git a/setup.py b/setup.py index 863094d..33a5924 100644 --- a/setup.py +++ b/setup.py @@ -1,21 +1,22 @@ from setuptools import setup setup( - name='labstack', - version='0.32.1', - description='Official Python client library for the LabStack platform', - long_description='``_', - keywords='image compress, image resize, text summary, barcode generate, barcode scan', - url='https://github.com/labstack/labstack-python', - author='Vishal Rana', - author_email='vr@labstack.com', - license='MIT', - packages=['labstack'], - install_requires=[ - 'requests==2.18.1' - ], - classifiers=[ - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6' - ] + name='labstack', + version='1.0.0', + description='Official Python client library for the LabStack API', + long_description='``_', + keywords='image compress, image resize, text summary, barcode generate, barcode scan', + url='https://github.com/labstack/labstack-python', + author='Vishal Rana', + author_email='vr@labstack.com', + license='MIT', + packages=['labstack'], + install_requires=[ + 'requests==2.22.0' + ], + classifiers=[ + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7' + ] ) From 20eabcab0e01d25e05274a80abbdc3a2cff13f4c Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Tue, 10 Dec 2019 21:01:52 +0530 Subject: [PATCH 33/34] Updated domain/search Signed-off-by: Vishal Rana --- labstack/domain.py | 4 ++-- labstack/test_domain.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/labstack/domain.py b/labstack/domain.py index 630be8a..67f0868 100644 --- a/labstack/domain.py +++ b/labstack/domain.py @@ -11,8 +11,8 @@ def dns(self, request): format(self.url, request['type'], request['domain'])) def search(self, request): - return self.client._request('GET', '{}/search/{}'. - format(self.url, request['domain'])) + return self.client._request('GET', '{}/search'. + format(self.url, params={'q': request['q']})) def status(self, request): return self.client._request('GET', '{}/status/{}'. diff --git a/labstack/test_domain.py b/labstack/test_domain.py index 60223e0..a8ab4a4 100644 --- a/labstack/test_domain.py +++ b/labstack/test_domain.py @@ -16,7 +16,7 @@ def test_dns(self): def test_search(self): response = self.s.search({ - 'domain': 'twilio.com' + 'q': 'twilio' }) self.assertNotEqual(len(response['results']), 0) From cc0a6dd5078071b4f4ceeb627d2afdd021bf3d0f Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Tue, 10 Dec 2019 22:10:23 +0530 Subject: [PATCH 34/34] Updated currency/rates Signed-off-by: Vishal Rana --- labstack/currency.py | 3 +++ labstack/test_currency.py | 4 ++++ setup.py | 6 +++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/labstack/currency.py b/labstack/currency.py index 557b4ae..36e54b7 100644 --- a/labstack/currency.py +++ b/labstack/currency.py @@ -13,3 +13,6 @@ def convert(self, request): def list(self, request): return self.client._request('GET', '{}/list'.format(self.url)) + + def rates(self, request): + return self.client._request('GET', '{}/rates'.format(self.url)) diff --git a/labstack/test_currency.py b/labstack/test_currency.py index 51bd917..8db06a7 100644 --- a/labstack/test_currency.py +++ b/labstack/test_currency.py @@ -18,3 +18,7 @@ def test_convert(self): def test_list(self): response = self.s.list({}) self.assertNotEqual(len(response['currencies']), 0) + + def test_rates(self): + response = self.s.rates({}) + self.assertNotEqual(len(response['rates']), 0) diff --git a/setup.py b/setup.py index 33a5924..3e9fadb 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='labstack', - version='1.0.0', + version='1.0.1', description='Official Python client library for the LabStack API', long_description='``_', keywords='image compress, image resize, text summary, barcode generate, barcode scan', @@ -15,8 +15,8 @@ 'requests==2.22.0' ], classifiers=[ - 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7' + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8' ] )