Revert "Update Alphavantage source for changes in which endpoint is premium."

This reverts commit d6036c9d14.
This commit is contained in:
Chris Berkhout 2023-08-26 10:50:41 +02:00
parent 786ddd3c8c
commit 2b0f01110a
3 changed files with 24 additions and 14 deletions

View file

@ -51,7 +51,8 @@ class AlphaVantage(BaseSource):
"will list all digital and physical currency symbols.\n"
"The PAIR for stocks is the stock symbol only. The quote currency "
f"will be determined automatically. {self._stock_symbols_message()}\n"
"The price type 'adjclose' is only available for stocks.\n"
"The price type 'adjclose' is only available for stocks, and "
"requires an access key for which premium endpoints are unlocked.\n"
"Beware that digital currencies quoted in non-USD currencies may "
"be converted from USD data at one recent exchange rate rather "
"than using historical rates.\n"
@ -186,9 +187,10 @@ class AlphaVantage(BaseSource):
def _stock_data(self, series):
output_quote = self._stock_currency(series.base) or "UNKNOWN"
# As of 2022-11-24 TIME_SERIES_DAILY_ADJUSTED is no longer premium, but
# now TIME_SERIES_DAILY is. So, always use TIME_SERIES_DAILY_ADJUSTED.
if series.type == "adjclose":
function = "TIME_SERIES_DAILY_ADJUSTED"
else:
function = "TIME_SERIES_DAILY"
params = {
"function": function,
@ -339,7 +341,7 @@ class AlphaVantage(BaseSource):
raise exceptions.RateLimit(data["Note"])
if (
"Information" in data
and "unlock all premium endpoints" in data["Information"]
and "ways to unlock premium" in data["Information"]
):
msg = "You were denied access to a premium endpoint."
raise exceptions.CredentialsError([self.API_KEY_NAME], self, msg)

View file

@ -63,11 +63,11 @@ name="Alpha Vantage stocks"
cmd="pricehist fetch alphavantage TSLA -s 2021-01-04 -e 2021-01-08"
read -r -d '' expected <<END
date,base,quote,amount,source,type
2021-01-04,TSLA,USD,729.77,alphavantage,close
2021-01-05,TSLA,USD,735.11,alphavantage,close
2021-01-06,TSLA,USD,755.98,alphavantage,close
2021-01-07,TSLA,USD,816.04,alphavantage,close
2021-01-08,TSLA,USD,880.02,alphavantage,close
2021-01-04,TSLA,USD,729.7700,alphavantage,close
2021-01-05,TSLA,USD,735.1100,alphavantage,close
2021-01-06,TSLA,USD,755.9800,alphavantage,close
2021-01-07,TSLA,USD,816.0400,alphavantage,close
2021-01-08,TSLA,USD,880.0200,alphavantage,close
END
if [[ "$(date --iso-8601)" < "2023-10-01" ]]; then
skip_test "$name" "$cmd" "$expected"

View file

@ -48,6 +48,9 @@ search_url = re.compile(
r"https://www\.alphavantage\.co/query\?function=SYMBOL_SEARCH.*"
)
stock_url = re.compile(
r"https://www\.alphavantage\.co/query\?function=TIME_SERIES_DAILY&.*"
)
adj_stock_url = re.compile(
r"https://www\.alphavantage\.co/query\?function=TIME_SERIES_DAILY_ADJUSTED.*"
)
physical_url = re.compile(r"https://www\.alphavantage\.co/query\?function=FX_DAILY.*")
@ -66,7 +69,12 @@ rate_limit_json = (
premium_json = (
'{ "Information": "Thank you for using Alpha Vantage! This is a premium '
"endpoint. You may subscribe to any of the premium plans at "
"endpoint and there are multiple ways to unlock premium endpoints: (1) "
"become a holder of Alpha Vantage Coin (AVC), an Ethereum-based "
"cryptocurrency that provides various utility & governance functions "
"within the Alpha Vantage ecosystem (AVC mining guide: "
"https://www.alphatournament.com/avc_mining_guide/) to unlock all "
"premium endpoints, (2) subscribe to any of the premium plans at "
"https://www.alphavantage.co/premium/ to instantly unlock all premium "
'endpoints" }'
)
@ -109,7 +117,7 @@ def ibm_ok(requests_mock):
@pytest.fixture
def ibm_adj_ok(requests_mock):
json = (Path(os.path.splitext(__file__)[0]) / "ibm-partial-adj.json").read_text()
requests_mock.add(responses.GET, stock_url, body=json, status=200)
requests_mock.add(responses.GET, adj_stock_url, body=json, status=200)
yield requests_mock
@ -296,7 +304,7 @@ def test_fetch_stock_known(src, type, search_ok, ibm_ok):
stock_req = ibm_ok.calls[1].request
assert search_req.params["function"] == "SYMBOL_SEARCH"
assert search_req.params["keywords"] == "IBM"
assert stock_req.params["function"] == "TIME_SERIES_DAILY_ADJUSTED"
assert stock_req.params["function"] == "TIME_SERIES_DAILY"
assert stock_req.params["symbol"] == "IBM"
assert stock_req.params["outputsize"] == "full"
assert (series.base, series.quote) == ("IBM", "USD")
@ -419,7 +427,7 @@ def test_fetch_stock_rate_limit(src, type, search_ok, requests_mock):
def test_fetch_stock_premium(src, search_ok, requests_mock):
requests_mock.add(responses.GET, stock_url, body=premium_json)
requests_mock.add(responses.GET, adj_stock_url, body=premium_json)
with pytest.raises(exceptions.CredentialsError) as e:
src.fetch(Series("IBM", "", "adjclose", "2021-01-04", "2021-01-08"))
assert "denied access to a premium endpoint" in str(e.value)