Skip to content

Commit

Permalink
MonkeyLearn API v3.0 support
Browse files Browse the repository at this point in the history
  • Loading branch information
gonz committed May 28, 2018
1 parent 0d95f82 commit a4d5489
Show file tree
Hide file tree
Showing 16 changed files with 1,057 additions and 565 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
.DS_Store
/dist/
/build/
README.html
2 changes: 1 addition & 1 deletion LICENSE.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright (c) 2015 MonkeyLearn, LLC
Copyright (c) 2015-2018 MonkeyLearn, INC


Permission is hereby granted, free of charge, to any person obtaining a copy
Expand Down
614 changes: 575 additions & 39 deletions README.md

Large diffs are not rendered by default.

33 changes: 11 additions & 22 deletions monkeylearn/__init__.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import (
print_function, unicode_literals, division, absolute_import)
from __future__ import print_function, unicode_literals, division, absolute_import

from monkeylearn.settings import DEFAULT_BASE_ENDPOINT
from monkeylearn.settings import DEFAULT_BASE_URL
from monkeylearn.classification import Classification
from monkeylearn.extraction import Extraction
from monkeylearn.pipelines import Pipelines
from monkeylearn.clustering import Clustering

class MonkeyLearn(object):

def __init__(self, token, base_endpoint=DEFAULT_BASE_ENDPOINT):
class MonkeyLearn(object):
def __init__(self, token, base_url=DEFAULT_BASE_URL):
self.token = token
self.base_endpoint = base_endpoint
self.base_url = base_url

@property
def classifiers(self):
return Classification(token=self.token,
base_endpoint=self.base_endpoint)
if not hasattr(self, '_classifiers'):
self._classifiers = Classification(token=self.token, base_url=self.base_url)
return self._classifiers

@property
def extractors(self):
return Extraction(token=self.token,
base_endpoint=self.base_endpoint)

@property
def pipelines(self):
return Pipelines(token=self.token,
base_endpoint=self.base_endpoint)

@property
def clusters(self):
return Clustering(token=self.token,
base_endpoint=self.base_endpoint)
if not hasattr(self, '_extractors'):
self._extractors = Extraction(token=self.token, base_url=self.base_url)
return self._extractors
76 changes: 76 additions & 0 deletions monkeylearn/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals, division, absolute_import

import re
import json
import time

import six
from six.moves.urllib.parse import urlencode
import requests

from monkeylearn.settings import DEFAULT_BASE_URL


class ModelEndpointSet(object):
def __init__(self, token, base_url=DEFAULT_BASE_URL):
self.token = token
self.base_url = base_url

def _add_action_or_query_string(self, url, action, query_string):
if action is not None:
url += '{}/'.format(action)
if query_string is not None:
url += '?' + urlencode(query_string)
return url

def get_list_url(self, action=None, query_string=None):
url = '{}v3/{}/'.format(self.base_url, self.model_type)
return self._add_action_or_query_string(url, action, query_string)

def get_detail_url(self, model_id, action=None, query_string=None):
url = '{}{}/'.format(self.get_list_url(), model_id)
return self._add_action_or_query_string(url, action, query_string)

def get_nested_list_url(self, parent_id, action=None, query_string=None):
url = '{}v3/{}/{}/{}/'.format(
self.base_url, self.model_type[0], parent_id, self.model_type[1]
)
return self._add_action_or_query_string(url, action, query_string)

def get_nested_detail_url(self, parent_id, children_id, action=None, query_string=None):
url = '{}{}/'.format(self.get_nested_list_url(parent_id, action=None), children_id)
return self._add_action_or_query_string(url, action, query_string)

def make_request(self, method, url, data=None, retry_if_throttled=True):
if data is not None:
data = json.dumps(data)

retries_left = 2
while retries_left:
response = requests.request(method, url, data=data, headers={
'Authorization': 'Token ' + self.token,
'Content-Type': 'application/json'
})

if response.content:
body = response.json()

if retry_if_throttled and response.status_code == 429:
error_code = body.get('error_code')

wait = None
if error_code == 'PLAN_RATE_LIMIT':
wait = int(re.findall(r'(\d+) seconds', body['detail'])[0])
elif error_code == 'CONCURRENCY_RATE_LIMIT':
wait = 2

if wait:
time.sleep(wait)
retries_left -= 1
continue

return response

def remove_none_value(self, d):
return {k: v for k, v in six.iteritems(d) if v is not None}
Loading

0 comments on commit a4d5489

Please sign in to comment.