Skip to content

Commit

Permalink
Add YH Finance (FINANCEAPI) API Key to Quotes infrastructure.
Browse files Browse the repository at this point in the history
And add financeapi to known sources.
  • Loading branch information
jralls committed Sep 19, 2024
1 parent 19e6f7e commit a23506c
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@
<key name="alphavantage-api-key" type="s">
<default>''</default>
<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>
</schema>
</schemalist>
30 changes: 27 additions & 3 deletions gnucash/gtkbuilder/dialog-preferences.glade
Original file line number Diff line number Diff line change
Expand Up @@ -3656,10 +3656,10 @@ many months before the current month</property>
<property name="row-spacing">3</property>
<property name="column-spacing">6</property>
<child>
<object class="GtkLabel" id="apilabel">
<object class="GtkLabel" id="avapilabel">
<property name="visible">True</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>
</object>
<packing>
Expand All @@ -3671,14 +3671,38 @@ many months before the current month</property>
<object class="GtkEntry" id="pref/general.finance-quote/alphavantage-api-key">
<property name="visible">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>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</packing>
</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>
<object class="GtkLabel" id="label22">
<property name="visible">True</property>
Expand Down
73 changes: 41 additions & 32 deletions libgnucash/app-utils/gnc-quotes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
* Boston, MA 02110-1301, USA [email protected] *
\ *******************************************************************/

#include <boost/process/environment.hpp>
#include <config.h>
#include <qoflog.h>

Expand Down Expand Up @@ -61,6 +62,8 @@
#include <qofbook.h>

static const QofLogModule log_module = "gnc.price-quotes";
static const char* av_api_env = "ALPHAVANTAGE_API_KEY";
static const char* yh_api_env = "FINANCEAPI_API_KEY";

namespace bl = boost::locale;
namespace bp = boost::process;
Expand Down Expand Up @@ -128,7 +131,8 @@ class GncFQQuoteSource final : public GncQuoteSource
std::string c_fq_wrapper;
std::string m_version;
StrVec m_sources;
std::string m_api_key;
std::string m_av_api_key;
std::string m_yh_api_key;
public:
GncFQQuoteSource();
~GncFQQuoteSource() = default;
Expand All @@ -146,9 +150,28 @@ static std::string parse_quotesource_error(const std::string& line);

static const std::string empty_string{};

static inline std::string
get_api_key(const char* prefskey, const char* envvar)
{
std::string keyval{};
auto key = gnc_prefs_get_string ("general.finance-quote", prefskey);
if (!(key && *key))
{
g_free (key);
key = g_strdup(getenv(envvar));
}

if (key)
{
keyval = std::string(key);
g_free (key);
}
return keyval;
}

GncFQQuoteSource::GncFQQuoteSource() :
c_cmd{bp::search_path("perl")},
m_version{}, m_sources{}, m_api_key{}
m_version{}, m_sources{}, m_av_api_key{}, m_yh_api_key{}
{
char *bindir = gnc_path_get_bindir();
c_fq_wrapper = std::string(bindir) + "/finance-quote-wrapper";
Expand Down Expand Up @@ -180,20 +203,10 @@ m_version{}, m_sources{}, m_api_key{}
m_sources = std::move(sources);
std::sort (m_sources.begin(), m_sources.end());

auto av_key = gnc_prefs_get_string ("general.finance-quote", "alphavantage-api-key");
if (!(av_key && *av_key))
{
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
m_av_api_key = get_api_key("alphavantage-api-key", av_api_env);
if (m_av_api_key.empty())
PWARN("No Alpha Vantage API key set, currency quotes and other AlphaVantage based quotes won't work.");
m_yh_api_key = get_api_key("yhfinance-api-key", yh_api_env);
}

QuoteResult
Expand All @@ -215,26 +228,22 @@ GncFQQuoteSource::run_cmd (const StrVec& args, const std::string& json_string) c
boost::asio::io_service svc;

auto input_buf = bp::buffer (json_string);
auto curr_env{boost::this_process::environment()};
bp::environment new_env{curr_env};
bp::child process;
if (m_api_key.empty())
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
svc);
else
process = bp::child(c_cmd, args,
bp::std_out > out_buf,
bp::std_err > err_buf,
bp::std_in < input_buf,
if (!m_av_api_key.empty())
new_env[av_api_env] = m_av_api_key;
if (!m_yh_api_key.empty())
new_env[yh_api_env] = m_yh_api_key;
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,
bp::windows::create_no_window,
#endif
bp::env["ALPHAVANTAGE_API_KEY"] = m_api_key,
svc);
new_env,
svc);

svc.run();
process.wait();
Expand Down
1 change: 1 addition & 0 deletions libgnucash/engine/gnc-commodity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ static QuoteSourceList single_quote_sources =
{ false, SOURCE_SINGLE, "US Govt. Thrift Savings Plan", "tsp" },
{ false, SOURCE_SINGLE, "Yahoo as JSON", "yahoo_json" },
{ false, SOURCE_SINGLE, "Yahoo Web", "yahooweb" },
{ false, SOURCE_SINGLE, "YH Finance (FinanceAPI)", "financeapi" },
};

static QuoteSourceList multiple_quote_sources =
Expand Down

0 comments on commit a23506c

Please sign in to comment.