diff --git a/HISTORY.rst b/HISTORY.rst index 615e5ce..ade7552 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -6,6 +6,8 @@ History 0.10.x (2019-XX-XX) ------------------ * Documentation: Added a "Peer Comparison Analysis" Jupyter Notebook under "/examples" (@i3creations #197) +* Minor: Update error message to clarify multiple tickers only work with single metrics +* Updated development dependencies 0.9.x (2019-01-30) diff --git a/tests/test_tiingo.py b/tests/test_tiingo.py index 0d0da23..9d920c2 100644 --- a/tests/test_tiingo.py +++ b/tests/test_tiingo.py @@ -6,7 +6,7 @@ from unittest import TestCase import vcr from tiingo import TiingoClient -from tiingo.api import InvalidFrequencyError +from tiingo.exceptions import InvalidFrequencyError from tiingo.restclient import RestClientError diff --git a/tests/test_tiingo_pandas.py b/tests/test_tiingo_pandas.py index 54ed91e..7d22ba7 100644 --- a/tests/test_tiingo_pandas.py +++ b/tests/test_tiingo_pandas.py @@ -4,7 +4,7 @@ import vcr from unittest import TestCase from tiingo import TiingoClient -from tiingo.api import APIColumnNameError, InstallPandasException +from tiingo.exceptions import APIColumnNameError, InstallPandasException, MissingRequiredArgumentError try: import pandas as pd pandas_is_installed = True @@ -69,6 +69,10 @@ class TestTiingoWithPython(TestCase): self._client.get_dataframe(['GOOGL', 'AAPL'], startDate='2018-01-05', endDate='2018-01-19', metric_name='xopen', frequency='weekly') + def test_metric_name_missing_when_multiple_tickers(self): + with self.assertRaises(MissingRequiredArgumentError): + self._client.get_dataframe(['GOOGL', 'AAPL'], frequency='weekly') + @vcr.use_cassette('tests/fixtures/ticker_price_pandas_single.yaml') def test_pandas_edge_case(self): """Test single price/date being returned as a frame""" diff --git a/tiingo/api.py b/tiingo/api.py index f2ec61b..b8b3467 100644 --- a/tiingo/api.py +++ b/tiingo/api.py @@ -1,15 +1,22 @@ # -*- coding: utf-8 -*- -import os -import sys -import pkg_resources +from collections import namedtuple import csv import json -from collections import namedtuple -from zipfile import ZipFile -from tiingo.restclient import RestClient -import requests +import os import re +import sys +import pkg_resources +from zipfile import ZipFile + +import requests + +from tiingo.restclient import RestClient +from tiingo.exceptions import ( + InstallPandasException, + APIColumnNameError, + InvalidFrequencyError, + MissingRequiredArgumentError) try: import pandas as pd @@ -49,17 +56,6 @@ def dict_to_object(item, object_name): object_hook=lambda d: namedtuple(object_name, fields)(*values)) -class InstallPandasException(Exception): - pass - - -class APIColumnNameError(Exception): - pass - - -class InvalidFrequencyError(Exception): - pass - class TiingoClient(RestClient): """Class for managing interactions with the Tiingo REST API @@ -227,12 +223,16 @@ class TiingoClient(RestClient): frequency (string): Resample frequency (defaults to daily). """ - valid_columns = ['open', 'high', 'low', 'close', 'volume', 'adjOpen', 'adjHigh', 'adjLow', - 'adjClose', 'adjVolume', 'divCash', 'splitFactor'] + valid_columns = {'open', 'high', 'low', 'close', 'volume', 'adjOpen', 'adjHigh', 'adjLow', + 'adjClose', 'adjVolume', 'divCash', 'splitFactor'} if metric_name is not None and metric_name not in valid_columns: raise APIColumnNameError('Valid data items are: ' + str(valid_columns)) + if metric_name is None and isinstance(tickers, list): + raise MissingRequiredArgumentError("""When tickers is provided as a list, metric_name is a required argument. + Please provide a metric_name, or call this method with one ticker at a time.""") + params = { 'format': 'json', 'resampleFreq': frequency diff --git a/tiingo/exceptions.py b/tiingo/exceptions.py new file mode 100644 index 0000000..b510b75 --- /dev/null +++ b/tiingo/exceptions.py @@ -0,0 +1,14 @@ +# Exception Clasess +class InstallPandasException(Exception): + pass + + +class APIColumnNameError(Exception): + pass + + +class InvalidFrequencyError(Exception): + pass + +class MissingRequiredArgumentError(Exception): + pass