mirror of
https://github.com/wassname/IndicoIo-python.git
synced 2026-09-09 11:14:32 +08:00
ADD: Versioning
This commit is contained in:
@@ -4,7 +4,7 @@ from indicoio.utils.image import image_preprocess
|
|||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
|
|
||||||
|
|
||||||
def facial_localization(image, cloud=None, batch=False, api_key=None, **kwargs):
|
def facial_localization(image, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given an image, returns a list of faces found within the image.
|
Given an image, returns a list of faces found within the image.
|
||||||
For each face, we return a dictionary containing the upper left corner and lower right corner.
|
For each face, we return a dictionary containing the upper left corner and lower right corner.
|
||||||
@@ -24,8 +24,8 @@ def facial_localization(image, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
|
|
||||||
:param image: The image to be analyzed.
|
:param image: The image to be analyzed.
|
||||||
:type image: filepath or ndarray
|
:type image: filepath or ndarray
|
||||||
:rtype: List of faces (dict) found.
|
:rtype: List of faces (dict) found.
|
||||||
"""
|
"""
|
||||||
image = image_preprocess(image, batch=batch)
|
image = image_preprocess(image, batch=batch)
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(image, cloud=cloud, api="faciallocalization", url_params=url_params, **kwargs)
|
return api_handler(image, cloud=cloud, api="faciallocalization", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import requests
|
|||||||
from indicoio.utils.image import image_preprocess
|
from indicoio.utils.image import image_preprocess
|
||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
|
|
||||||
def facial_features(image, cloud=None, batch=False, api_key=None, **kwargs):
|
def facial_features(image, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given an grayscale input image of a face, returns a 48 dimensional feature vector explaining that face.
|
Given an grayscale input image of a face, returns a 48 dimensional feature vector explaining that face.
|
||||||
Useful as a form of feature engineering for face oriented tasks.
|
Useful as a form of feature engineering for face oriented tasks.
|
||||||
@@ -26,10 +26,10 @@ def facial_features(image, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:rtype: List containing feature responses
|
:rtype: List containing feature responses
|
||||||
"""
|
"""
|
||||||
image = image_preprocess(image, batch=batch, size=(48,48))
|
image = image_preprocess(image, batch=batch, size=(48,48))
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(image, cloud=cloud, api="facialfeatures", url_params=url_params, **kwargs)
|
return api_handler(image, cloud=cloud, api="facialfeatures", url_params=url_params, **kwargs)
|
||||||
|
|
||||||
def image_features(image, cloud=None, batch=False, api_key=None, **kwargs):
|
def image_features(image, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given an input image, returns a 2048 dimensional sparse feature vector explaining that image.
|
Given an input image, returns a 2048 dimensional sparse feature vector explaining that image.
|
||||||
Useful as a form of feature engineering for image oriented tasks.
|
Useful as a form of feature engineering for image oriented tasks.
|
||||||
@@ -60,5 +60,5 @@ def image_features(image, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:rtype: List containing features
|
:rtype: List containing features
|
||||||
"""
|
"""
|
||||||
image = image_preprocess(image, batch=batch, size=(64,64))
|
image = image_preprocess(image, batch=batch, size=(64,64))
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(image, cloud=cloud, api="imagefeatures", url_params=url_params, **kwargs)
|
return api_handler(image, cloud=cloud, api="imagefeatures", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from indicoio.utils.api import api_handler
|
|||||||
from indicoio.utils.image import image_preprocess
|
from indicoio.utils.image import image_preprocess
|
||||||
import indicoio.config as config
|
import indicoio.config as config
|
||||||
|
|
||||||
def fer(image, cloud=None, batch=False, api_key=None, **kwargs):
|
def fer(image, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given a grayscale input image of a face, returns a probability distribution over emotional state.
|
Given a grayscale input image of a face, returns a probability distribution over emotional state.
|
||||||
Input should be in a list of list format, resizing will be attempted internally but for best
|
Input should be in a list of list format, resizing will be attempted internally but for best
|
||||||
@@ -31,6 +31,6 @@ def fer(image, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
image = image_preprocess(image, batch=batch,
|
image = image_preprocess(image, batch=batch,
|
||||||
size=None if kwargs.get("detect") else (48, 48)
|
size=None if kwargs.get("detect") else (48, 48)
|
||||||
)
|
)
|
||||||
|
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(image, cloud=cloud, api="fer", url_params=url_params, **kwargs)
|
return api_handler(image, cloud=cloud, api="fer", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from indicoio.utils.api import api_handler
|
|||||||
from indicoio.utils.image import image_preprocess
|
from indicoio.utils.image import image_preprocess
|
||||||
import indicoio.config as config
|
import indicoio.config as config
|
||||||
|
|
||||||
def content_filtering(image, cloud=None, batch=False, api_key=None, **kwargs):
|
def content_filtering(image, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given a grayscale input image, returns how obcene the image is.
|
Given a grayscale input image, returns how obcene the image is.
|
||||||
Input should be in a list of list format.
|
Input should be in a list of list format.
|
||||||
@@ -25,5 +25,5 @@ def content_filtering(image, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:rtype: float of nsfwness
|
:rtype: float of nsfwness
|
||||||
"""
|
"""
|
||||||
image = image_preprocess(image, batch=batch, min_axis=128)
|
image = image_preprocess(image, batch=batch, min_axis=128)
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(image, cloud=cloud, api="contentfiltering", url_params=url_params, **kwargs)
|
return api_handler(image, cloud=cloud, api="contentfiltering", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
import indicoio.config as config
|
import indicoio.config as config
|
||||||
|
|
||||||
def keywords(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def keywords(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns series of keywords and associated scores
|
Given input text, returns series of keywords and associated scores
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
import indicoio.config as config
|
import indicoio.config as config
|
||||||
|
|
||||||
def language(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def language(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns a probability distribution over 33 possible
|
Given input text, returns a probability distribution over 33 possible
|
||||||
languages of what language the text was written in.
|
languages of what language the text was written in.
|
||||||
@@ -23,5 +23,5 @@ def language(text, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:type text: str or unicode
|
:type text: str or unicode
|
||||||
:rtype: Dictionary of language probability pairs
|
:rtype: Dictionary of language probability pairs
|
||||||
"""
|
"""
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(text, cloud=cloud, api="language", url_params=url_params, **kwargs)
|
return api_handler(text, cloud=cloud, api="language", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
import indicoio.config as config
|
import indicoio.config as config
|
||||||
|
|
||||||
def named_entities(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def named_entities(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns named entities (proper nouns) found in the text
|
Given input text, returns named entities (proper nouns) found in the text
|
||||||
|
|
||||||
@@ -26,5 +26,5 @@ def named_entities(text, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:type text: str or unicode
|
:type text: str or unicode
|
||||||
:rtype: Dictionary of language probability pairs
|
:rtype: Dictionary of language probability pairs
|
||||||
"""
|
"""
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(text, cloud=cloud, api="namedentities", url_params=url_params, **kwargs)
|
return api_handler(text, cloud=cloud, api="namedentities", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
|
|
||||||
def political(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def political(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns a probability distribution over the political alignment of the speaker.
|
Given input text, returns a probability distribution over the political alignment of the speaker.
|
||||||
|
|
||||||
@@ -25,10 +25,10 @@ def political(text, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:type text: str or unicode
|
:type text: str or unicode
|
||||||
:rtype: Dictionary of party probability pairs
|
:rtype: Dictionary of party probability pairs
|
||||||
"""
|
"""
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(text, cloud=cloud, api="political", url_params=url_params, **kwargs)
|
return api_handler(text, cloud=cloud, api="political", url_params=url_params, **kwargs)
|
||||||
|
|
||||||
def posneg(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def posneg(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns a scalar estimate of the sentiment of that text.
|
Given input text, returns a scalar estimate of the sentiment of that text.
|
||||||
Values are roughly in the range 0 to 1 with 0.5 indicating neutral sentiment.
|
Values are roughly in the range 0 to 1 with 0.5 indicating neutral sentiment.
|
||||||
@@ -48,10 +48,10 @@ def posneg(text, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:type text: str or unicode
|
:type text: str or unicode
|
||||||
:rtype: Float
|
:rtype: Float
|
||||||
"""
|
"""
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(text, cloud=cloud, api="sentiment", url_params=url_params, **kwargs)
|
return api_handler(text, cloud=cloud, api="sentiment", url_params=url_params, **kwargs)
|
||||||
|
|
||||||
def sentiment_hq(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def sentiment_hq(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns a scalar estimate of the sentiment of that text.
|
Given input text, returns a scalar estimate of the sentiment of that text.
|
||||||
Values are roughly in the range 0 to 1 with 0.5 indicating neutral sentiment.
|
Values are roughly in the range 0 to 1 with 0.5 indicating neutral sentiment.
|
||||||
@@ -71,5 +71,5 @@ def sentiment_hq(text, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:type text: str or unicode
|
:type text: str or unicode
|
||||||
:rtype: Float
|
:rtype: Float
|
||||||
"""
|
"""
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(text, cloud=cloud, api="sentimenthq", url_params=url_params, **kwargs)
|
return api_handler(text, cloud=cloud, api="sentimenthq", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
import indicoio.config as config
|
import indicoio.config as config
|
||||||
|
|
||||||
def text_tags(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def text_tags(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns a probability distribution over 100 document categories
|
Given input text, returns a probability distribution over 100 document categories
|
||||||
|
|
||||||
@@ -22,5 +22,5 @@ def text_tags(text, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:type text: str or unicode
|
:type text: str or unicode
|
||||||
:rtype: Dictionary of class probability pairs
|
:rtype: Dictionary of class probability pairs
|
||||||
"""
|
"""
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(text, cloud=cloud, api="texttags", url_params=url_params, **kwargs)
|
return api_handler(text, cloud=cloud, api="texttags", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from indicoio.utils.api import api_handler
|
from indicoio.utils.api import api_handler
|
||||||
import indicoio.config as config
|
import indicoio.config as config
|
||||||
|
|
||||||
def twitter_engagement(text, cloud=None, batch=False, api_key=None, **kwargs):
|
def twitter_engagement(text, cloud=None, batch=False, api_key=None, version=None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Given input text, returns an engagment score between 0 and 1
|
Given input text, returns an engagment score between 0 and 1
|
||||||
|
|
||||||
@@ -18,5 +18,5 @@ def twitter_engagement(text, cloud=None, batch=False, api_key=None, **kwargs):
|
|||||||
:type text: str or unicode
|
:type text: str or unicode
|
||||||
:rtype: Float of engagement between 0 and 1
|
:rtype: Float of engagement between 0 and 1
|
||||||
"""
|
"""
|
||||||
url_params = {"batch": batch, "api_key": api_key}
|
url_params = {"batch": batch, "api_key": api_key, "version": version}
|
||||||
return api_handler(text, cloud=cloud, api="twitterengagement", url_params=url_params, **kwargs)
|
return api_handler(text, cloud=cloud, api="twitterengagement", url_params=url_params, **kwargs)
|
||||||
|
|||||||
@@ -18,12 +18,13 @@ def api_handler(arg, cloud, api, url_params=None, **kwargs):
|
|||||||
json_data = json.dumps(data)
|
json_data = json.dumps(data)
|
||||||
cloud = cloud or config.cloud
|
cloud = cloud or config.cloud
|
||||||
host = "%s.indico.domains" % cloud if cloud else config.PUBLIC_API_HOST
|
host = "%s.indico.domains" % cloud if cloud else config.PUBLIC_API_HOST
|
||||||
url = create_url(host, api, url_params)
|
|
||||||
|
url = create_url(host, api, dict(kwargs, **url_params))
|
||||||
response = requests.post(url, data=json_data, headers=JSON_HEADERS)
|
response = requests.post(url, data=json_data, headers=JSON_HEADERS)
|
||||||
|
|
||||||
if response.status_code == 503 and cloud != None:
|
if response.status_code == 503 and cloud != None:
|
||||||
raise IndicoError("Private cloud '%s' does not include api '%s'" % (cloud, api))
|
raise IndicoError("Private cloud '%s' does not include api '%s'" % (cloud, api))
|
||||||
|
|
||||||
json_results = response.json()
|
json_results = response.json()
|
||||||
results = json_results.get('results', False)
|
results = json_results.get('results', False)
|
||||||
if results is False:
|
if results is False:
|
||||||
@@ -36,11 +37,14 @@ def create_url(host, api, url_params):
|
|||||||
api_key = url_params.get("api_key") or config.api_key
|
api_key = url_params.get("api_key") or config.api_key
|
||||||
is_batch = url_params.get("batch")
|
is_batch = url_params.get("batch")
|
||||||
apis = url_params.get("apis")
|
apis = url_params.get("apis")
|
||||||
|
version = url_params.get("version") or url_params.get("v")
|
||||||
|
|
||||||
host_url_seg = config.url_protocol + "//%s" % host
|
host_url_seg = config.url_protocol + "//%s" % host
|
||||||
api_url_seg = "/%s" % api
|
api_url_seg = "/%s" % api
|
||||||
batch_url_seg = "/batch" if is_batch else ""
|
batch_url_seg = "/batch" if is_batch else ""
|
||||||
key_url_seg = "?key=%s" % api_key
|
key_url_seg = "?key=%s" % api_key
|
||||||
multi_url_seg = "&apis=%s" % ",".join(apis) if apis else ""
|
multi_url_seg = "&apis=%s" % ",".join(apis) if apis else ""
|
||||||
|
version_seg = ("&version=%s" % str(version)) if version else ""
|
||||||
|
|
||||||
return host_url_seg + api_url_seg + batch_url_seg + key_url_seg + multi_url_seg
|
return host_url_seg + api_url_seg + batch_url_seg + key_url_seg \
|
||||||
|
+ multi_url_seg + version_seg
|
||||||
|
|||||||
@@ -58,11 +58,11 @@ class TestConfigurationFile(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
assert self.settings.cloud() == self.cloud
|
assert self.settings.cloud() == self.cloud
|
||||||
|
|
||||||
def test_set_auth_from_config_file(self):
|
def test_set_auth_from_config_file(self):
|
||||||
"""
|
"""
|
||||||
Ensure cloud authentication credentials are read in from file
|
Ensure cloud authentication credentials are read in from file
|
||||||
"""
|
"""
|
||||||
assert self.settings.api_key() == self.api_key
|
assert self.settings.api_key() == self.api_key
|
||||||
|
|
||||||
|
|
||||||
class TestPrecedence(unittest.TestCase):
|
class TestPrecedence(unittest.TestCase):
|
||||||
@@ -74,7 +74,7 @@ class TestPrecedence(unittest.TestCase):
|
|||||||
self.file_api_key = "file-api-key"
|
self.file_api_key = "file-api-key"
|
||||||
self.file_cloud = "file-cloud"
|
self.file_cloud = "file-cloud"
|
||||||
|
|
||||||
self.env_api_key = "env-api-key"
|
self.env_api_key = "env-api-key"
|
||||||
self.env_cloud = "env-cloud"
|
self.env_cloud = "env-cloud"
|
||||||
config = """
|
config = """
|
||||||
[auth]
|
[auth]
|
||||||
@@ -97,12 +97,12 @@ class TestPrecedence(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
assert self.settings.cloud() == self.env_cloud
|
assert self.settings.cloud() == self.env_cloud
|
||||||
|
|
||||||
def test_set_auth_from_config_file(self):
|
def test_set_auth_from_config_file(self):
|
||||||
"""
|
"""
|
||||||
Ensure cloud authentication credentials set in environment variables
|
Ensure cloud authentication credentials set in environment variables
|
||||||
are used over those in config files
|
are used over those in config files
|
||||||
"""
|
"""
|
||||||
assert self.settings.api_key() == self.env_api_key
|
assert self.settings.api_key() == self.env_api_key
|
||||||
|
|
||||||
|
|
||||||
class TestConfigFilePrecedence(unittest.TestCase):
|
class TestConfigFilePrecedence(unittest.TestCase):
|
||||||
@@ -154,7 +154,7 @@ class TestConfigFilePrecedence(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
assert self.settings.cloud() == self.high_priority_cloud
|
assert self.settings.cloud() == self.high_priority_cloud
|
||||||
|
|
||||||
def test_auth_config_file_priority(self):
|
def test_auth_config_file_priority(self):
|
||||||
"""
|
"""
|
||||||
Ensure the cloud auth priority is handled properly
|
Ensure the cloud auth priority is handled properly
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from indicoio import config
|
||||||
|
from indicoio import sentiment
|
||||||
|
|
||||||
|
class TestVersioning(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.api_key = config.api_key
|
||||||
|
|
||||||
|
def test_specify_version(self):
|
||||||
|
test_data = ['Worst song ever', 'Best song ever']
|
||||||
|
response = sentiment(test_data, api_key = self.api_key, version="1")
|
||||||
|
self.assertIsInstance(response, list)
|
||||||
|
self.assertEqual(len(response), 2)
|
||||||
|
self.assertTrue(response[0] < .5)
|
||||||
|
self.assertTrue(response[1] > .5)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user