-
Notifications
You must be signed in to change notification settings - Fork 44
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
1,057 additions
and
565 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,3 +4,4 @@ | |
.DS_Store | ||
/dist/ | ||
/build/ | ||
README.html |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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} |
Oops, something went wrong.