mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Merge John Ralls's 'financeapi' into stable.
This commit is contained in:
commit
6ba1adbfdf
@ -3,7 +3,12 @@
|
|||||||
<key name="alphavantage-api-key" type="s">
|
<key name="alphavantage-api-key" type="s">
|
||||||
<default>''</default>
|
<default>''</default>
|
||||||
<summary>Alpha Vantage API key</summary>
|
<summary>Alpha Vantage API key</summary>
|
||||||
<description>To retrieve online quotes from Alphavantage, this key needs to be set. A key can be retrieved from the Alpha Vantage website.</description>
|
<description>Alpha Vantage requires an API key to use their service. You can obtain a key by registering for a free account at the Alpha Vantage website, https://alphavantage.co/support/#api-key.</description>
|
||||||
|
</key>
|
||||||
|
<key name="yhfinance-api-key" type="s">
|
||||||
|
<default>''</default>
|
||||||
|
<summary>YH Finance (FinanceAPI) API key</summary>
|
||||||
|
<description>YH Finance requires an API key to use their FinanceAPI service. You can obtain a key by registering for a free account at the YH Finance website, https://financeapi.net/pricing.</description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
||||||
|
@ -3656,10 +3656,10 @@ many months before the current month</property>
|
|||||||
<property name="row-spacing">3</property>
|
<property name="row-spacing">3</property>
|
||||||
<property name="column-spacing">6</property>
|
<property name="column-spacing">6</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="apilabel">
|
<object class="GtkLabel" id="avapilabel">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="tooltip-text" translatable="yes">To retrieve online quotes from Alphavantage, this key needs to be set. A key can be retrieved from the Alpha Vantage website.</property>
|
<property name="tooltip-text" translatable="yes">Alpha Vantage requires an API key to use their service. You can obtain a key by registering for a free account at the Alpha Vantage website, https://www.alphavantage.co/support/#api-key.</property>
|
||||||
<property name="label" translatable="yes">Alpha Vantage API key</property>
|
<property name="label" translatable="yes">Alpha Vantage API key</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@ -3671,7 +3671,7 @@ many months before the current month</property>
|
|||||||
<object class="GtkEntry" id="pref/general.finance-quote/alphavantage-api-key">
|
<object class="GtkEntry" id="pref/general.finance-quote/alphavantage-api-key">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="tooltip-text" translatable="yes">To retrieve online quotes from Alphavantage, this key needs to be set. A key can be retrieved from the Alpha Vantage website.</property>
|
<property name="tooltip-text" translatable="yes">Alpha Vantage requires an API key to use their service. You can obtain a key by registering for a free account at the Alpha Vantage website, https://alphavantage.co/support/#api-key.</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
@ -3679,6 +3679,30 @@ many months before the current month</property>
|
|||||||
<property name="top-attach">1</property>
|
<property name="top-attach">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="yhapilabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">YH Finance requires an API key to use their FinanceAPI service. You can obtain a key by registering for a free account at the YH Finance website, https://financeapi.net/pricing.</property>
|
||||||
|
<property name="label" translatable="yes">YH Finance (FinanceAPI) API key</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="pref/general.finance-quote/yhfinance-api-key">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">YH Finance requires an API key to use their FinanceAPI service. You can obtain a key by registering for a free account at the YH Finance website, https://financeapi.net/pricing.</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="label22">
|
<object class="GtkLabel" id="label22">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
* Boston, MA 02110-1301, USA gnu@gnu.org *
|
* Boston, MA 02110-1301, USA gnu@gnu.org *
|
||||||
\ *******************************************************************/
|
\ *******************************************************************/
|
||||||
|
|
||||||
|
#include <boost/process/environment.hpp>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <qoflog.h>
|
#include <qoflog.h>
|
||||||
|
|
||||||
@ -61,6 +62,10 @@
|
|||||||
#include <qofbook.h>
|
#include <qofbook.h>
|
||||||
|
|
||||||
static const QofLogModule log_module = "gnc.price-quotes";
|
static const QofLogModule log_module = "gnc.price-quotes";
|
||||||
|
static const char* av_api_env = "ALPHAVANTAGE_API_KEY";
|
||||||
|
static const char* av_api_key = "alphavantage-api-key";
|
||||||
|
static const char* yh_api_env = "FINANCEAPI_API_KEY";
|
||||||
|
static const char* yh_api_key = "yhfinance-api-key";
|
||||||
|
|
||||||
namespace bl = boost::locale;
|
namespace bl = boost::locale;
|
||||||
namespace bp = boost::process;
|
namespace bp = boost::process;
|
||||||
@ -128,7 +133,7 @@ class GncFQQuoteSource final : public GncQuoteSource
|
|||||||
std::string c_fq_wrapper;
|
std::string c_fq_wrapper;
|
||||||
std::string m_version;
|
std::string m_version;
|
||||||
StrVec m_sources;
|
StrVec m_sources;
|
||||||
std::string m_api_key;
|
bp::environment m_env;
|
||||||
public:
|
public:
|
||||||
GncFQQuoteSource();
|
GncFQQuoteSource();
|
||||||
~GncFQQuoteSource() = default;
|
~GncFQQuoteSource() = default;
|
||||||
@ -137,7 +142,7 @@ public:
|
|||||||
QuoteResult get_quotes(const std::string&) const override;
|
QuoteResult get_quotes(const std::string&) const override;
|
||||||
private:
|
private:
|
||||||
QuoteResult run_cmd (const StrVec& args, const std::string& json_string) const;
|
QuoteResult run_cmd (const StrVec& args, const std::string& json_string) const;
|
||||||
|
void set_api_key(const char* api_pref, const char* api_env);
|
||||||
};
|
};
|
||||||
|
|
||||||
static void show_quotes(const bpt::ptree& pt, const StrVec& commodities, bool verbose);
|
static void show_quotes(const bpt::ptree& pt, const StrVec& commodities, bool verbose);
|
||||||
@ -148,7 +153,7 @@ static const std::string empty_string{};
|
|||||||
|
|
||||||
GncFQQuoteSource::GncFQQuoteSource() :
|
GncFQQuoteSource::GncFQQuoteSource() :
|
||||||
c_cmd{bp::search_path("perl")},
|
c_cmd{bp::search_path("perl")},
|
||||||
m_version{}, m_sources{}, m_api_key{}
|
m_version{}, m_sources{}, m_env{boost::this_process::environment()}
|
||||||
{
|
{
|
||||||
char *bindir = gnc_path_get_bindir();
|
char *bindir = gnc_path_get_bindir();
|
||||||
c_fq_wrapper = std::string(bindir) + "/finance-quote-wrapper";
|
c_fq_wrapper = std::string(bindir) + "/finance-quote-wrapper";
|
||||||
@ -180,20 +185,8 @@ m_version{}, m_sources{}, m_api_key{}
|
|||||||
m_sources = std::move(sources);
|
m_sources = std::move(sources);
|
||||||
std::sort (m_sources.begin(), m_sources.end());
|
std::sort (m_sources.begin(), m_sources.end());
|
||||||
|
|
||||||
auto av_key = gnc_prefs_get_string ("general.finance-quote", "alphavantage-api-key");
|
set_api_key(av_api_key, av_api_env);
|
||||||
if (!(av_key && *av_key))
|
set_api_key(yh_api_key, yh_api_env);
|
||||||
{
|
|
||||||
g_free (av_key);
|
|
||||||
av_key = g_strdup(getenv("ALPHAVANTAGE_API_KEY"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (av_key)
|
|
||||||
{
|
|
||||||
m_api_key = std::string(av_key);
|
|
||||||
g_free (av_key);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
PWARN("No Alpha Vantage API key set, currency quotes and other AlphaVantage based quotes won't work.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QuoteResult
|
QuoteResult
|
||||||
@ -216,25 +209,15 @@ GncFQQuoteSource::run_cmd (const StrVec& args, const std::string& json_string) c
|
|||||||
|
|
||||||
auto input_buf = bp::buffer (json_string);
|
auto input_buf = bp::buffer (json_string);
|
||||||
bp::child process;
|
bp::child process;
|
||||||
if (m_api_key.empty())
|
process = bp::child(c_cmd, args,
|
||||||
process = bp::child(c_cmd, args,
|
bp::std_out > out_buf,
|
||||||
bp::std_out > out_buf,
|
bp::std_err > err_buf,
|
||||||
bp::std_err > err_buf,
|
bp::std_in < input_buf,
|
||||||
bp::std_in < input_buf,
|
|
||||||
#ifdef BOOST_WINDOWS_API
|
#ifdef BOOST_WINDOWS_API
|
||||||
bp::windows::create_no_window,
|
bp::windows::create_no_window,
|
||||||
#endif
|
#endif
|
||||||
svc);
|
m_env,
|
||||||
else
|
svc);
|
||||||
process = bp::child(c_cmd, args,
|
|
||||||
bp::std_out > out_buf,
|
|
||||||
bp::std_err > err_buf,
|
|
||||||
bp::std_in < input_buf,
|
|
||||||
#ifdef BOOST_WINDOWS_API
|
|
||||||
bp::windows::create_no_window,
|
|
||||||
#endif
|
|
||||||
bp::env["ALPHAVANTAGE_API_KEY"] = m_api_key,
|
|
||||||
svc);
|
|
||||||
|
|
||||||
svc.run();
|
svc.run();
|
||||||
process.wait();
|
process.wait();
|
||||||
@ -272,6 +255,24 @@ GncFQQuoteSource::run_cmd (const StrVec& args, const std::string& json_string) c
|
|||||||
return QuoteResult (cmd_result, std::move(out_vec), std::move(err_vec));
|
return QuoteResult (cmd_result, std::move(out_vec), std::move(err_vec));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GncFQQuoteSource::set_api_key(const char* api_key, const char* api_env)
|
||||||
|
{
|
||||||
|
auto key = gnc_prefs_get_string("general.finance-quote", api_key);
|
||||||
|
if (key && *key)
|
||||||
|
{
|
||||||
|
m_env[api_env] = key;
|
||||||
|
g_free(key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (api_key == av_api_key && m_env.find(api_env) == m_env.end())
|
||||||
|
PWARN("No Alpha Vantage API key set, currency quotes and other "
|
||||||
|
"AlphaVantage based quotes won't work.");
|
||||||
|
g_free(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* GncQuotes implementation */
|
/* GncQuotes implementation */
|
||||||
GncQuotesImpl::GncQuotesImpl() : m_quotesource{new GncFQQuoteSource},
|
GncQuotesImpl::GncQuotesImpl() : m_quotesource{new GncFQQuoteSource},
|
||||||
m_sources{}, m_failures{},
|
m_sources{}, m_failures{},
|
||||||
@ -1031,9 +1032,7 @@ GncQuotes::GncQuotes ()
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_impl = std::make_unique<GncQuotesImpl>();
|
m_impl = std::make_unique<GncQuotesImpl>();
|
||||||
}
|
} catch (const GncQuoteSourceError &err) {
|
||||||
catch (const GncQuoteSourceError& err)
|
|
||||||
{
|
|
||||||
throw(GncQuoteException(err.what()));
|
throw(GncQuoteException(err.what()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -217,6 +217,7 @@ static QuoteSourceList single_quote_sources =
|
|||||||
{ false, SOURCE_SINGLE, "US Govt. Thrift Savings Plan", "tsp" },
|
{ false, SOURCE_SINGLE, "US Govt. Thrift Savings Plan", "tsp" },
|
||||||
{ false, SOURCE_SINGLE, "Yahoo as JSON", "yahoo_json" },
|
{ false, SOURCE_SINGLE, "Yahoo as JSON", "yahoo_json" },
|
||||||
{ false, SOURCE_SINGLE, "Yahoo Web", "yahooweb" },
|
{ false, SOURCE_SINGLE, "Yahoo Web", "yahooweb" },
|
||||||
|
{ false, SOURCE_SINGLE, "YH Finance (FinanceAPI)", "financeapi" },
|
||||||
};
|
};
|
||||||
|
|
||||||
static QuoteSourceList multiple_quote_sources =
|
static QuoteSourceList multiple_quote_sources =
|
||||||
|
Loading…
Reference in New Issue
Block a user