diff --git a/.coveragerc b/.coveragerc index e05a8a7f..5e96c646 100644 --- a/.coveragerc +++ b/.coveragerc @@ -6,9 +6,11 @@ include = */pandas_datareader/* omit = */_version.py */yahoo/* + */edgar.py */google/options.py */google/quotes.py */tests/google/test_options.py + */tests/test_edgar.py [report] # Regexes for lines to exclude from consideration diff --git a/pandas_datareader/base.py b/pandas_datareader/base.py index 1a359fcf..200d6717 100644 --- a/pandas_datareader/base.py +++ b/pandas_datareader/base.py @@ -125,6 +125,7 @@ def _get_response(self, url, params=None, headers=None): # initial attempt + retry pause = self.pause + last_response_text = '' for i in range(self.retry_count + 1): response = self.session.get(url, params=params, @@ -132,6 +133,7 @@ def _get_response(self, url, params=None, headers=None): if response.status_code == requests.codes.ok: return response + last_response_text = response.text.encode(response.encoding) time.sleep(pause) # Increase time between subsequent requests, per subclass. @@ -146,8 +148,11 @@ def _get_response(self, url, params=None, headers=None): if params is not None and len(params) > 0: url = url + "?" + urlencode(params) + msg = 'Unable to read URL: {0}'.format(url) + if last_response_text: + msg += '\nResponse Text:\n{0}'.format(last_response_text) - raise RemoteDataError('Unable to read URL: {0}'.format(url)) + raise RemoteDataError(msg) def _get_crumb(self, *args): """ To be implemented by subclass """ diff --git a/pandas_datareader/compat/__init__.py b/pandas_datareader/compat/__init__.py index 91724a7f..743050b6 100644 --- a/pandas_datareader/compat/__init__.py +++ b/pandas_datareader/compat/__init__.py @@ -1,10 +1,13 @@ # flake8: noqa +import sys +from distutils.version import LooseVersion +from io import BytesIO + import pandas as pd -import pandas.io.common as com import pandas.compat as compat +import pandas.io.common as com -from io import BytesIO -from distutils.version import LooseVersion +PY3 = sys.version_info >= (3, 0) PANDAS_VERSION = LooseVersion(pd.__version__) diff --git a/pandas_datareader/tests/test_tiingo.py b/pandas_datareader/tests/test_tiingo.py index 29f6057a..c656da19 100644 --- a/pandas_datareader/tests/test_tiingo.py +++ b/pandas_datareader/tests/test_tiingo.py @@ -3,10 +3,13 @@ import pandas as pd import pytest +from pandas_datareader.compat import PY3 from pandas_datareader.tiingo import TiingoDailyReader, TiingoMetaDataReader, \ - TiingoQuoteReader + TiingoQuoteReader, get_tiingo_symbols TEST_API_KEY = os.getenv('TIINGO_API_KEY') +# Ensure blank TEST_API_KEY not used in pull request +TEST_API_KEY = None if not TEST_API_KEY else TEST_API_KEY syms = ['GOOG', ['GOOG', 'XOM']] ids = list(map(str, syms)) @@ -42,3 +45,18 @@ def test_tiingo_metadata(symbols): if isinstance(symbols, str): symbols = [symbols] assert df.shape[1] == len(symbols) + + +@pytest.mark.skipif(not PY3, reason='test.support missing on Python 2') +def test_tiingo_no_api_key(symbols): + from test.support import EnvironmentVarGuard + env = EnvironmentVarGuard() + env.unset('TIINGO_API_KEY') + with env: + with pytest.raises(ValueError): + TiingoMetaDataReader(symbols=symbols) + + +def test_tiingo_stock_symbols(): + sym = get_tiingo_symbols() + assert isinstance(sym, pd.DataFrame) diff --git a/pandas_datareader/tiingo.py b/pandas_datareader/tiingo.py index eaed50e0..144ce064 100644 --- a/pandas_datareader/tiingo.py +++ b/pandas_datareader/tiingo.py @@ -58,8 +58,8 @@ def __init__(self, symbols, start=None, end=None, retry_count=3, pause=0.1, self.symbols = [self.symbols] self._symbol = '' if api_key is None: - api_key = os.environ.get('TIINGO_API_KEY', None) - if api_key is None: + api_key = os.getenv('TIINGO_API_KEY') + if not api_key or not isinstance(api_key, str): raise ValueError('The tiingo API key must be provided either ' 'through the api_key variable or through the ' 'environmental variable TIINGO_API_KEY.')