From 6b08b8987a5103973cab90921db6c8c649388574 Mon Sep 17 00:00:00 2001 From: "Clark, Steve" Date: Sun, 18 Feb 2018 23:01:29 -0600 Subject: [PATCH] Add interfaces to obtain mutual fund and ETF tickers. Add unit tests for new methods. Update fixtures to support the etf and mutual fund tests. Change filename inside of zip to supported_tickers.csv Add second entry into supported_tickers.csv Added myself to authors. --- AUTHORS.rst | 1 + tests/fixtures/list_etf_tickers.yaml | 34 +++++++++++++++++++++++++++ tests/fixtures/list_fund_tickers.yaml | 34 +++++++++++++++++++++++++++ tests/test_tiingo.py | 11 +++++++++ tiingo/api.py | 21 ++++++++++++----- 5 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 tests/fixtures/list_etf_tickers.yaml create mode 100644 tests/fixtures/list_fund_tickers.yaml diff --git a/AUTHORS.rst b/AUTHORS.rst index 1a481a0..c21598e 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -12,3 +12,4 @@ Contributors * Dmitry Budaev * Bharat Kalluri +* Stephen Clark diff --git a/tests/fixtures/list_etf_tickers.yaml b/tests/fixtures/list_etf_tickers.yaml new file mode 100644 index 0000000..2248fec --- /dev/null +++ b/tests/fixtures/list_etf_tickers.yaml @@ -0,0 +1,34 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.18.4] + method: GET + uri: https://apimedia.tiingo.com/docs/tiingo/daily/supported_tickers.zip + response: + body: + string: !!binary | + UEsDBBQAAAAIAEgBU0zqbCjObwAAAI4AAAAVABwAc3VwcG9ydGVkX3RpY2tlcnMuY3N2VVQJAANI + aopaSGqKWnV4CwABBAAAAAAEAAAAACvJTM5OLdJJrUjOSMxLT9VJLC5OLQmpLEjVKSjKTE51Li0q + Ss1LrtQpLkksKnFJLEnVSc1LAdG8XI6OLkE6fpHBrgqOQc6OOq4hbjqhwS465vpGhvpGBoYGOkb6 + hmYglgUvVwQWhYb6UHVQBlAZAFBLAQIeAxQAAAAIAEgBU0zqbCjObwAAAI4AAAAVABgAAAAAAAEA + AAD/gQAAAABzdXBwb3J0ZWRfdGlja2Vycy5jc3ZVVAUAA0hqilp1eAsAAQQAAAAABAAAAABQSwUG + AAAAAAEAAQBbAAAAvgAAAAAA + headers: + Accept-Ranges: [bytes] + Age: ['820'] + Connection: [keep-alive] + Content-Length: ['2709436'] + Content-Type: [application/zip] + Date: ['Sun, 08 Oct 2017 10:17:38 GMT'] + ETag: ['"aa6b2d0623735374b5c471305911fbac"'] + Last-Modified: ['Sat, 07 Oct 2017 23:28:33 GMT'] + Server: [AmazonS3] + Via: [1.1 5d4ff22febf83d261f03aa068f5bdc04.cloudfront.net (CloudFront)] + X-Amz-Cf-Id: [Eo3QEjB2WELpsXJhXHqylxkoU2G3DVFXCa6Ka7d0sDhOh2JG3HA08w==] + X-Cache: [Hit from cloudfront] + status: {code: 200, message: OK} +version: 1 diff --git a/tests/fixtures/list_fund_tickers.yaml b/tests/fixtures/list_fund_tickers.yaml new file mode 100644 index 0000000..dbca0fb --- /dev/null +++ b/tests/fixtures/list_fund_tickers.yaml @@ -0,0 +1,34 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.18.4] + method: GET + uri: https://apimedia.tiingo.com/docs/tiingo/daily/supported_tickers.zip + response: + body: + string: !!binary | + UEsDBBQAAAAIAHQBU0zNiK0mbQAAAJ0AAAAVABwAc3VwcG9ydGVkX3RpY2tlcnMuY3N2VVQJAAOb + aopam2qKWnV4CwABBAAAAAAEAAAAACvJTM5OLdJJrUjOSMxLT9VJLC5OLQmpLEjVKSjKTE51Li0q + Ss1LrtQpLkksKnFJLEnVSc1LAdG8XI5AEKHj5+sWGKzjW1pSmpij4Faal6ITGuyiY65vbKhvZGBg + rmOkb2gGZBlagDU4OZOiAQBQSwECHgMUAAAACAB0AVNMzYitJm0AAACdAAAAFQAYAAAAAAABAAAA + /4EAAAAAc3VwcG9ydGVkX3RpY2tlcnMuY3N2VVQFAAObaopadXgLAAEEAAAAAAQAAAAAUEsFBgAA + AAABAAEAWwAAALwAAAAAAA== + headers: + Accept-Ranges: [bytes] + Age: ['820'] + Connection: [keep-alive] + Content-Length: ['2709436'] + Content-Type: [application/zip] + Date: ['Sun, 08 Oct 2017 10:17:38 GMT'] + ETag: ['"aa6b2d0623735374b5c471305911fbac"'] + Last-Modified: ['Sat, 07 Oct 2017 23:28:33 GMT'] + Server: [AmazonS3] + Via: [1.1 5d4ff22febf83d261f03aa068f5bdc04.cloudfront.net (CloudFront)] + X-Amz-Cf-Id: [Eo3QEjB2WELpsXJhXHqylxkoU2G3DVFXCa6Ka7d0sDhOh2JG3HA08w==] + X-Cache: [Hit from cloudfront] + status: {code: 200, message: OK} +version: 1 diff --git a/tests/test_tiingo.py b/tests/test_tiingo.py index a2c91f2..795285e 100644 --- a/tests/test_tiingo.py +++ b/tests/test_tiingo.py @@ -95,6 +95,17 @@ class TestTickerPrices(TestCase): assert len(tickers) > 1 assert all(ticker['assetType'] == 'Stock' for ticker in tickers) + @vcr.use_cassette('tests/fixtures/list_fund_tickers.yaml') + def test_list_fund_tickers(self): + tickers = self._client.list_fund_tickers() + assert len(tickers) > 1 + assert all(ticker['assetType'] == 'Mutual Fund' for ticker in tickers) + + @vcr.use_cassette('tests/fixtures/list_etf_tickers.yaml') + def test_list_etf_tickers(self): + tickers = self._client.list_etf_tickers() + assert len(tickers) > 1 + assert all(ticker['assetType'] == 'ETF' for ticker in tickers) # tiingo/news class TestNews(TestCase): diff --git a/tiingo/api.py b/tiingo/api.py index 2e2f200..6f69ffb 100644 --- a/tiingo/api.py +++ b/tiingo/api.py @@ -76,11 +76,11 @@ class TiingoClient(RestClient): # TICKER PRICE ENDPOINTS # https://api.tiingo.com/docs/tiingo/daily - def list_stock_tickers(self): - """Return a list of dicts of metadata tickers for all supported Stocks - as well as metadata about each ticker. This includes supported - date range, the exchange the ticker is traded on, and the currency - the stock is traded on. + def list_tickers(self, assetType): + """Return a list of dicts of metadata tickers for all supported tickers + of the specified asset type, as well as metadata about each ticker. + This includes supported date range, the exchange the ticker is traded + on, and the currency the stock is traded on. Tickers for unrelated products are omitted. https://apimedia.tiingo.com/docs/tiingo/daily/supported_tickers.zip """ @@ -91,7 +91,16 @@ class TiingoClient(RestClient): reader = csv.DictReader(raw_csv) return [row for row in reader - if row.get('assetType') == 'Stock'] + if row.get('assetType') == assetType] + + def list_stock_tickers(self): + return self.list_tickers('Stock') + + def list_etf_tickers(self): + return self.list_tickers('ETF') + + def list_fund_tickers(self): + return self.list_tickers('Mutual Fund') def get_ticker_metadata(self, ticker, fmt='json'): """Return metadata for 1 ticker