diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f08471e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,24 @@ +language: python +python: + - 2.7 + +# Setup anaconda +before_install: + - wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh + - chmod +x miniconda.sh + - ./miniconda.sh -b + - export PATH=/home/travis/miniconda/bin:$PATH + - conda update --yes conda + # The next couple lines fix a crash with multiprocessing on Travis and are not specific to using Miniconda + - sudo rm -rf /dev/shm + - sudo ln -s /run/shm /dev/shm + +# Install packages +install: + - conda install --yes python=$TRAVIS_PYTHON_VERSION atlas numpy scipy matplotlib nose dateutil pandas statsmodels requests requests six scikit-image + - python setup.py install + +# Run test +script: + - nosetests -w ./tests/remote + \ No newline at end of file diff --git a/indicoio/__init__.py b/indicoio/__init__.py index 0646c43..d92b8ba 100644 --- a/indicoio/__init__.py +++ b/indicoio/__init__.py @@ -1,16 +1,16 @@ from functools import partial -from utils import config +import indicoio.config as config JSON_HEADERS = {'Content-type': 'application/json', 'Accept': 'text/plain'} Version, version, __version__, VERSION = ('0.4.5',) * 4 -from text.sentiment import political, posneg -from text.sentiment import posneg as sentiment -from text.lang import language -from images.fer import fer -from images.features import facial_features -from images.features import image_features +from indicoio.text.sentiment import political, posneg +from indicoio.text.sentiment import posneg as sentiment +from indicoio.text.lang import language +from indicoio.images.fer import fer +from indicoio.images.features import facial_features +from indicoio.images.features import image_features political = partial(political, config.api_root) posneg = partial(posneg, config.api_root) diff --git a/indicoio/utils/config.py b/indicoio/config.py similarity index 100% rename from indicoio/utils/config.py rename to indicoio/config.py diff --git a/indicoio/images/features.py b/indicoio/images/features.py index cd56087..f7c0f2a 100644 --- a/indicoio/images/features.py +++ b/indicoio/images/features.py @@ -3,8 +3,7 @@ import json import requests import numpy as np -from indicoio import JSON_HEADERS -from indicoio.utils import image_preprocess +from indicoio.utils import image_preprocess, api_handler def facial_features(api_root, image): """ @@ -28,14 +27,7 @@ def facial_features(api_root, image): :type image: list of lists :rtype: List containing feature responses """ - - data_dict = json.dumps({"face": image}) - response = requests.post(api_root + "facialfeatures", data=data_dict, headers=JSON_HEADERS) - response_dict = response.json() - if 'response' not in response_dict: - raise ValueError(response_dict.values()[0]) - else: - return response_dict['response'] + return api_handler(image, api_root + "facialfeatures") def image_features(api_root, image): """ @@ -68,10 +60,4 @@ def image_features(api_root, image): :rtype: List containing features """ image = image_preprocess(image) - data_dict = json.dumps({"image": image}) - response = requests.post(api_root + "imagefeatures", data=data_dict, headers=JSON_HEADERS) - response_dict = response.json() - if 'Features' not in response_dict: - raise ValueError(response_dict.values()[0]) - else: - return response_dict['Features'] \ No newline at end of file + return api_handler(image, api_root + "imagefeatures") diff --git a/indicoio/images/fer.py b/indicoio/images/fer.py index 27f8162..1e600aa 100644 --- a/indicoio/images/fer.py +++ b/indicoio/images/fer.py @@ -2,7 +2,7 @@ import json import requests import numpy as np -from indicoio import JSON_HEADERS +from indicoio.utils import api_handler def fer(api_root, image): """ @@ -28,10 +28,4 @@ def fer(api_root, image): :rtype: Dictionary containing emotion probability pairs """ - data_dict = json.dumps({"face": image}) - response = requests.post(api_root + "fer", data=data_dict, headers=JSON_HEADERS) - response_dict = response.json() - if len(response_dict) < 2: - raise ValueError(response_dict.values()[0]) - else: - return response_dict + return api_handler(image, api_root + "fer") diff --git a/indicoio/local/__init__.py b/indicoio/local/__init__.py index 2d50e7f..9d44439 100644 --- a/indicoio/local/__init__.py +++ b/indicoio/local/__init__.py @@ -1,5 +1,5 @@ from functools import partial -from indicoio.utils import config +import indicoio.config as config JSON_HEADERS = {'Content-type': 'application/json', 'Accept': 'text/plain'} diff --git a/indicoio/text/lang.py b/indicoio/text/lang.py index 665522d..169b415 100644 --- a/indicoio/text/lang.py +++ b/indicoio/text/lang.py @@ -1,7 +1,7 @@ import requests import json -from indicoio import JSON_HEADERS +from indicoio.utils import api_handler def language(api_root, text): """ @@ -26,10 +26,4 @@ def language(api_root, text): :rtype: Dictionary of language probability pairs """ - data_dict = json.dumps({'text': text}) - response = requests.post(api_root + "language", data=data_dict, headers=JSON_HEADERS) - response_dict = response.json() - if len(response_dict) < 2: - raise ValueError(response_dict.values()[0]) - else: - return response_dict \ No newline at end of file + return api_handler(text, api_root + "language") diff --git a/indicoio/text/sentiment.py b/indicoio/text/sentiment.py index b570f5f..e60cd42 100644 --- a/indicoio/text/sentiment.py +++ b/indicoio/text/sentiment.py @@ -2,7 +2,7 @@ import requests import json from indicoio import JSON_HEADERS -from indicoio.utils import normalize +from indicoio.utils import api_handler def political(api_root, text): """ @@ -30,13 +30,7 @@ def political(api_root, text): :rtype: Dictionary of party probability pairs """ - data_dict = json.dumps({'text': text}) - response = requests.post(api_root + "political", data=data_dict, headers=JSON_HEADERS) - response_dict = response.json() - if len(response_dict) < 2: - raise ValueError(response_dict.values()[0]) - else: - return response_dict + return api_handler(text, api_root + "political") def posneg(api_root, text): """ @@ -59,10 +53,4 @@ def posneg(api_root, text): :rtype: Float """ - data_dict = json.dumps({'text': text}) - response = requests.post(api_root + "sentiment", data=data_dict, headers=JSON_HEADERS) - response_dict = response.json() - if 'Sentiment' not in response_dict: - raise ValueError(response_dict.values()[0]) - else: - return response_dict['Sentiment'] + return api_handler(text, api_root + "sentiment") diff --git a/indicoio/utils/__init__.py b/indicoio/utils/__init__.py index 18ae6db..f01ac36 100644 --- a/indicoio/utils/__init__.py +++ b/indicoio/utils/__init__.py @@ -1,7 +1,18 @@ -import inspect +import inspect, json, requests import numpy as np from skimage.transform import resize +from indicoio import JSON_HEADERS + +def api_handler(arg, url): + data_dict = json.dumps({'data': arg}) + response = requests.post(url, data=data_dict, headers=JSON_HEADERS).json() + results = response.get('results', False) + if not results: + error = response.get('error') + raise ValueError(error) + return results + class TypeCheck(object): """ Decorator that performs a typecheck on the input to a function diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bc40c5f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +numpy>=1.8.0 +six>=1.3.0 +scikit-image>=0.10.1 +requests>=2.2.1 diff --git a/setup.py b/setup.py index c1166f5..b0d3a21 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ except ImportError: setup( name="IndicoIo", - version='0.4.5', + version='0.4.6', packages=[ "indicoio", "indicoio.text", diff --git a/tests/local/__init__.py b/tests/local/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_local.py b/tests/local/test_local.py similarity index 100% rename from tests/test_local.py rename to tests/local/test_local.py diff --git a/tests/remote/__init__.py b/tests/remote/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_remote.py b/tests/remote/test_remote.py similarity index 100% rename from tests/test_remote.py rename to tests/remote/test_remote.py