Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package perl-Finance-Quote for openSUSE:Factory checked in at 2026-05-18 17:57:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Finance-Quote (Old) and /work/SRC/openSUSE:Factory/.perl-Finance-Quote.new.1966 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Finance-Quote" Mon May 18 17:57:59 2026 rev:44 rq:1353853 version:1.690.0 Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Finance-Quote/perl-Finance-Quote.changes 2026-01-03 17:27:52.640865838 +0100 +++ /work/SRC/openSUSE:Factory/.perl-Finance-Quote.new.1966/perl-Finance-Quote.changes 2026-05-18 17:58:01.477148926 +0200 @@ -1,0 +2,12 @@ +Sun Apr 19 06:55:14 UTC 2026 - Tina Müller <[email protected]> + +- updated to 1.690.0 (1.69) + see /usr/share/doc/packages/perl-Finance-Quote/Changes + + 1.69 2026-04-18 11:47:37-07:00 America/Los_Angeles + * Sinvestor.pm - trim whitespace before parsing date and price + * XETRA.pm: trim whitespace from date-time before extracting the actual date value. PR #557 + * Modified Stooq.pm to send cookies. Stooq requires European visitors to their website to accept cookies. Cookies are set using JavaScript. Current version of module hard codes these cookies gleaned from a browser session. + * Added CurrencyRates/TwelveData.pm. + +------------------------------------------------------------------- Old: ---- Finance-Quote-1.68.tar.gz New: ---- Finance-Quote-1.69.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Finance-Quote.spec ++++++ --- /var/tmp/diff_new_pack.uZK7aR/_old 2026-05-18 17:58:02.373186028 +0200 +++ /var/tmp/diff_new_pack.uZK7aR/_new 2026-05-18 17:58:02.377186194 +0200 @@ -1,7 +1,7 @@ # # spec file for package perl-Finance-Quote # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,10 +18,10 @@ %define cpan_name Finance-Quote Name: perl-Finance-Quote -Version: 1.680.0 +Version: 1.690.0 Release: 0 -# 1.68 -> normalize -> 1.680.0 -%define cpan_version 1.68 +# 1.69 -> normalize -> 1.690.0 +%define cpan_version 1.69 #Upstream: GPL-1.0-or-later License: GPL-2.0-or-later Summary: Get stock and mutual fund quotes from various exchanges @@ -134,6 +134,7 @@ Provides: perl(Finance::Quote::CurrencyRates::FinanceAPI) = %{version} Provides: perl(Finance::Quote::CurrencyRates::Fixer) = %{version} Provides: perl(Finance::Quote::CurrencyRates::OpenExchange) = %{version} +Provides: perl(Finance::Quote::CurrencyRates::TwelveData) = %{version} Provides: perl(Finance::Quote::CurrencyRates::YahooJSON) = %{version} Provides: perl(Finance::Quote::Deka) = %{version} Provides: perl(Finance::Quote::FTfunds) = %{version} ++++++ Finance-Quote-1.68.tar.gz -> Finance-Quote-1.69.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/Changes new/Finance-Quote-1.69/Changes --- old/Finance-Quote-1.68/Changes 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/Changes 2026-04-18 20:47:43.000000000 +0200 @@ -1,3 +1,9 @@ +1.69 2026-04-18 11:47:37-07:00 America/Los_Angeles + * Sinvestor.pm - trim whitespace before parsing date and price + * XETRA.pm: trim whitespace from date-time before extracting the actual date value. PR #557 + * Modified Stooq.pm to send cookies. Stooq requires European visitors to their website to accept cookies. Cookies are set using JavaScript. Current version of module hard codes these cookies gleaned from a browser session. + * Added CurrencyRates/TwelveData.pm. + 1.68 2025-12-21 11:40:59-08:00 America/Los_Angeles * Changes to AlphaVantage.pm and CurrencyRates/AlphaVantage.pm to throttle queries - Issue #546 * YahooJSON.pm - Add additional fields/labels - PR #544 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/MANIFEST new/Finance-Quote-1.69/MANIFEST --- old/Finance-Quote-1.68/MANIFEST 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/MANIFEST 2026-04-18 20:47:43.000000000 +0200 @@ -52,6 +52,7 @@ lib/Finance/Quote/CurrencyRates/FinanceAPI.pm lib/Finance/Quote/CurrencyRates/Fixer.pm lib/Finance/Quote/CurrencyRates/OpenExchange.pm +lib/Finance/Quote/CurrencyRates/TwelveData.pm lib/Finance/Quote/CurrencyRates/YahooJSON.pm lib/Finance/Quote/Deka.pm lib/Finance/Quote/FTfunds.pm diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/META.json new/Finance-Quote-1.69/META.json --- old/Finance-Quote-1.68/META.json 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/META.json 2026-04-18 20:47:43.000000000 +0200 @@ -1,8 +1,8 @@ { "abstract" : "Get stock and mutual fund quotes from various exchanges", "author" : [ - "Erik Colson <[email protected]>", "Bruce Schuck <[email protected]>", + "Erik Colson <[email protected]>", "Paul Fenwick <[email protected]>", "Vincent Lucarelli <[email protected]>", "David Hampton <[email protected]>", @@ -143,7 +143,7 @@ "web" : "https://github.com/finance-quote/finance-quote" } }, - "version" : "1.68", + "version" : "1.69", "x_generated_by_perl" : "v5.34.0", "x_serialization_backend" : "Cpanel::JSON::XS version 4.27", "x_spdx_expression" : "GPL-2.0-only" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/META.yml new/Finance-Quote-1.69/META.yml --- old/Finance-Quote-1.68/META.yml 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/META.yml 2026-04-18 20:47:43.000000000 +0200 @@ -1,8 +1,8 @@ --- abstract: 'Get stock and mutual fund quotes from various exchanges' author: - - 'Erik Colson <[email protected]>' - 'Bruce Schuck <[email protected]>' + - 'Erik Colson <[email protected]>' - 'Paul Fenwick <[email protected]>' - 'Vincent Lucarelli <[email protected]>' - 'David Hampton <[email protected]>' @@ -115,7 +115,7 @@ bugtracker: https://github.com/finance-quote/finance-quote/issues homepage: http://finance-quote.sourceforge.net/ repository: git://github.com/finance-quote/finance-quote -version: '1.68' +version: '1.69' x_generated_by_perl: v5.34.0 x_serialization_backend: 'YAML::Tiny version 1.73' x_spdx_expression: GPL-2.0-only diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/Makefile.PL new/Finance-Quote-1.69/Makefile.PL --- old/Finance-Quote-1.68/Makefile.PL 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/Makefile.PL 2026-04-18 20:47:43.000000000 +0200 @@ -8,7 +8,7 @@ my %WriteMakefileArgs = ( "ABSTRACT" => "Get stock and mutual fund quotes from various exchanges", - "AUTHOR" => "Erik Colson <eco\@ecocode.net>, Bruce Schuck <bschuck\@asgard-systems.com>, Paul Fenwick <pjf\@perltraining.com.au>, Vincent Lucarelli <vincent.lucarelli\@gmail.com>, David Hampton <hampton-sf\@rainbolthampton.net>, moenny <>, jvolkening <jdv\@base2bio.com>, Pawel Konieczny <konieczp\@zonnet.nl>, Mike Alexander <mta\@umich.edu>, AndreJ <Andre-J\@users.noreply.github.com>, Vinay S Shastry <vinayshastry\@gmail.com>, Bradley Dean <bjdean\@bjdean.id.au>, Chris Good <goodchris96\@gmail.com>, Brent Neal <brent\@reindeergraphics.com>, Jacinta Richardson <jarich\@perltraining.com.au>, Manuel Friedli <manuel\@fritteli.ch>, e-dorigatti <emilio.dorigatti\@gmail.com>, Gustavo R. Montesino <grmontesino\@gmail.com>, Paul Howarth <paul\@city-fan.org>, Sam Morris <sam\@robots.org.uk>, Linas Vepstas <linas\@linas.org>, Rajan Vaswani <111571283+bgr22112\@users.noreply.github.com>, Hiranya Samarasekera <hiranyas\@gmail.com>, Przemys\x{142}aw Kryger <pkryger\@gmail.com>, Achim Winkler <m umpitzstuff\@gmail.com>, Diego Marcolungo <diego.marcolungo\@gmail.com>, John Haiducek <jhaiduce\@gmail.com>, Paolo Maero <paolo\@maero.com>, alex314159 <alex314159\@users.noreply.github.com>, gregor herrmann <gregoa\@debian.org>, Jalon Avens <jalonavens\@snave.info>, Sigve Indregard <sigve\@indregard.no>, bgr22112 <111571283+bgr22112\@users.noreply.github.com>", + "AUTHOR" => "Bruce Schuck <bschuck\@asgard-systems.com>, Erik Colson <eco\@ecocode.net>, Paul Fenwick <pjf\@perltraining.com.au>, Vincent Lucarelli <vincent.lucarelli\@gmail.com>, David Hampton <hampton-sf\@rainbolthampton.net>, moenny <>, jvolkening <jdv\@base2bio.com>, Pawel Konieczny <konieczp\@zonnet.nl>, Mike Alexander <mta\@umich.edu>, AndreJ <Andre-J\@users.noreply.github.com>, Vinay S Shastry <vinayshastry\@gmail.com>, Bradley Dean <bjdean\@bjdean.id.au>, Chris Good <goodchris96\@gmail.com>, Brent Neal <brent\@reindeergraphics.com>, Jacinta Richardson <jarich\@perltraining.com.au>, Manuel Friedli <manuel\@fritteli.ch>, e-dorigatti <emilio.dorigatti\@gmail.com>, Gustavo R. Montesino <grmontesino\@gmail.com>, Paul Howarth <paul\@city-fan.org>, Sam Morris <sam\@robots.org.uk>, Linas Vepstas <linas\@linas.org>, Rajan Vaswani <111571283+bgr22112\@users.noreply.github.com>, Hiranya Samarasekera <hiranyas\@gmail.com>, Przemys\x{142}aw Kryger <pkryger\@gmail.com>, Achim Winkler <m umpitzstuff\@gmail.com>, Diego Marcolungo <diego.marcolungo\@gmail.com>, John Haiducek <jhaiduce\@gmail.com>, Paolo Maero <paolo\@maero.com>, alex314159 <alex314159\@users.noreply.github.com>, gregor herrmann <gregoa\@debian.org>, Jalon Avens <jalonavens\@snave.info>, Sigve Indregard <sigve\@indregard.no>, bgr22112 <111571283+bgr22112\@users.noreply.github.com>", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, @@ -85,7 +85,7 @@ "feature" => 0, "open" => 0 }, - "VERSION" => "1.68", + "VERSION" => "1.69", "test" => { "TESTS" => "t/*.t" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/README new/Finance-Quote-1.69/README --- old/Finance-Quote-1.68/README 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/README 2026-04-18 20:47:43.000000000 +0200 @@ -1,5 +1,5 @@ This archive contains the distribution Finance-Quote, -version 1.68: +version 1.69: Get stock and mutual fund quotes from various exchanges diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/htdocs/index.html new/Finance-Quote-1.69/htdocs/index.html --- old/Finance-Quote-1.68/htdocs/index.html 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/htdocs/index.html 2026-04-18 20:47:43.000000000 +0200 @@ -66,7 +66,9 @@ our <a href="download.html">download page</a>.</p> <h2 align="center">News</h2> - <p class="new"><b>2025-Dec-21</b> + <p class="new"><b>2026-Apr-18</b> + Release 1.69 is available from CPAN and Sourceforge. Added TwelveData currency module. Fixes to Sinvestor.pm, XETRA.pm, and Stooq.pm. See the "Changes" file for more details. + <p><b>2025-Dec-21</b> Release 1.68 is available from CPAN and Sourceforge. CMBChina.pm removed, USBonds.pm added. Restored throttling in AlphaVantage.pm. See the "Changes" file for more details. <p><b>2025-Oct-18</b> Release 1.67 is available from CPAN and Sourceforge. Fixes to ASEGR.pm, BorsaItaliana.pm, TesouroDireto.pm, MorningstarCH.pm, and MorningstarUK.pm. Added new module, SwissFundData.pm. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/AEX.pm new/Finance-Quote-1.69/lib/Finance/Quote/AEX.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/AEX.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/AEX.pm 2026-04-18 20:47:43.000000000 +0200 @@ -28,7 +28,7 @@ use Web::Scraper; use String::Util qw(trim); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $EURONEXT_URL = "https://live.euronext.com/en/search_instruments/"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/ASEGR.pm new/Finance-Quote-1.69/lib/Finance/Quote/ASEGR.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/ASEGR.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/ASEGR.pm 2026-04-18 20:47:43.000000000 +0200 @@ -30,7 +30,7 @@ use Text::Template; use JSON qw( decode_json ); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'ASEGR - Athens Exchange Group, GR'; our @LABELS = qw/symbol method instrument name isin currency last close high low open volume isodate date/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/ASX.pm new/Finance-Quote-1.69/lib/Finance/Quote/ASX.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/ASX.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/ASX.pm 2026-04-18 20:47:43.000000000 +0200 @@ -43,7 +43,7 @@ use vars qw/$ASX_URL/; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'ASX - Australian Securities Exchange'; our @LABELS = qw/symbol ask bid p_change net type name last price volume currency method/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/AlphaVantage.pm new/Finance-Quote-1.69/lib/Finance/Quote/AlphaVantage.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/AlphaVantage.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/AlphaVantage.pm 2026-04-18 20:47:43.000000000 +0200 @@ -33,7 +33,7 @@ use JSON qw( decode_json ); use HTTP::Request::Common; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # Alpha Vantage recommends that API call frequency does not extend far # beyond ~1 call per second so that they can continue to deliver diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/BSEIndia.pm new/Finance-Quote-1.69/lib/Finance/Quote/BSEIndia.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/BSEIndia.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/BSEIndia.pm 2026-04-18 20:47:43.000000000 +0200 @@ -24,7 +24,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION use vars qw($BSE_URL); $BSE_URL = "https://www.bseindia.com"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/BVB.pm new/Finance-Quote-1.69/lib/Finance/Quote/BVB.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/BVB.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/BVB.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# vi: set ts=2 sw=2 noai ic showmode showmatch: +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # # Copyright (C) 2023, Bruce Schuck <[email protected]> # @@ -33,24 +33,34 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $BVB_URL = 'https://bvb.ro/FinancialInstruments/Details/FinancialInstrumentsDetails.aspx?s='; -sub methods { - return (bvb => \&bvb, - romania => \&bvb, - tradeville => \&bvb, - europe => \&bvb); +our $DISPLAY = 'BVB - Bucharest Stock Exchange'; +our @LABELS = + qw/symbol name open high low last bid ask date currency method/; +our $METHODHASH = {subroutine => \&bvb, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + bvb => $METHODHASH, + romania => $METHODHASH, + tradeville => $METHODHASH, + europe => $METHODHASH, + ); } -our @labels = qw/symbol name open high low last bid ask date currency method/; +sub labels { + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; +} -sub labels { - return (bvb => \@labels, - romania => \@labels, - tradeville => \@labels, - europe => \@labels); +sub methods { + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } sub bvb { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/BorsaItaliana.pm new/Finance-Quote-1.69/lib/Finance/Quote/BorsaItaliana.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/BorsaItaliana.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/BorsaItaliana.pm 2026-04-18 20:47:43.000000000 +0200 @@ -32,7 +32,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # URL example = https://www.borsaitaliana.it/borsa/search/scheda.html?code=IT0001086567&lang=it my $YIND_URL_HEAD = 'https://www.borsaitaliana.it/borsa/search/scheda.html?code='; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Bourso.pm new/Finance-Quote-1.69/lib/Finance/Quote/Bourso.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Bourso.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Bourso.pm 2026-04-18 20:47:43.000000000 +0200 @@ -84,7 +84,7 @@ use JSON qw( decode_json ); use utf8; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $Bourso_URL = 'https://www.boursorama.com/cours/'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CSE.pm new/Finance-Quote-1.69/lib/Finance/Quote/CSE.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CSE.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CSE.pm 2026-04-18 20:47:43.000000000 +0200 @@ -27,7 +27,7 @@ use JSON qw( decode_json ); use String::Util qw(trim); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'CSE - Colombo Stock Exchange'; our @LABELS = qw/isin close last high low cap change p_change name symbol currency method symbol date isodate/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Comdirect.pm new/Finance-Quote-1.69/lib/Finance/Quote/Comdirect.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Comdirect.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Comdirect.pm 2026-04-18 20:47:43.000000000 +0200 @@ -28,7 +28,7 @@ use String::Util qw(trim); use Encode qw(encode_utf8); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'Comdirect - Frankfurt and other exchanges'; our $FEATURES = { 'EXCHANGE' => 'select market place (i.e. "gettex", "Xetra", "Tradegate")' }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Consorsbank.pm new/Finance-Quote-1.69/lib/Finance/Quote/Consorsbank.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Consorsbank.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Consorsbank.pm 2026-04-18 20:47:43.000000000 +0200 @@ -32,7 +32,7 @@ use if DEBUG, 'Smart::Comments'; use if DEBUG, 'Data::Dumper'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $CONSORS_URL = 'https://www.consorsbank.de/web-financialinfo-service/api/marketdata/stocks?'; my $CONSORS_SOURCE_BASE_URL = 'https://www.consorsbank.de/web/Wertpapier/'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Currencies.pm new/Finance-Quote-1.69/lib/Finance/Quote/Currencies.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Currencies.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Currencies.pm 2026-04-18 20:47:43.000000000 +0200 @@ -31,7 +31,7 @@ use HTML::TableExtract; use Encode qw(decode); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION @EXPORT_OK = qw( known_currencies fetch_live_currencies ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/AlphaVantage.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/AlphaVantage.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/AlphaVantage.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/AlphaVantage.pm 2026-04-18 20:47:43.000000000 +0200 @@ -25,7 +25,7 @@ use JSON; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION sub parameters { return ('API_KEY'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/CurrencyFreaks.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/CurrencyFreaks.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/CurrencyFreaks.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/CurrencyFreaks.pm 2026-04-18 20:47:43.000000000 +0200 @@ -30,7 +30,7 @@ use JSON; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION sub parameters { return ('API_KEY'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/ECB.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/ECB.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/ECB.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/ECB.pm 2026-04-18 20:47:43.000000000 +0200 @@ -25,7 +25,7 @@ use XML::LibXML; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION sub new { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/FinanceAPI.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/FinanceAPI.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/FinanceAPI.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/FinanceAPI.pm 2026-04-18 20:47:43.000000000 +0200 @@ -32,7 +32,7 @@ use JSON; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $YIND_URL_HEAD = 'https://yfapi.net/v8/finance/chart/'; my $YIND_URL_TAIL = '?metrics=high&interval=1d&range=1d'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/Fixer.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/Fixer.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/Fixer.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/Fixer.pm 2026-04-18 20:47:43.000000000 +0200 @@ -25,7 +25,7 @@ use JSON; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION sub parameters { return ('API_KEY'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/OpenExchange.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/OpenExchange.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/OpenExchange.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/OpenExchange.pm 2026-04-18 20:47:43.000000000 +0200 @@ -25,7 +25,7 @@ use JSON; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION sub parameters { return ('API_KEY'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/TwelveData.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/TwelveData.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/TwelveData.pm 1970-01-01 01:00:00.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/TwelveData.pm 2026-04-18 20:47:43.000000000 +0200 @@ -0,0 +1,156 @@ +#!/usr/bin/perl -w +# vi: set ts=2 sw=2 ic noai showmode showmatch: + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA + +# Copyright (C) 2025, Bruce Schuck <[email protected]> + +# Changes: +# 2025-12-22 - Initial version. Base code opied from +# CurrencyRates/FinanceAPI.pm + +package Finance::Quote::CurrencyRates::TwelveData; + +use strict; +use warnings; + +use constant DEBUG => $ENV{DEBUG}; +use if DEBUG, 'Smart::Comments'; + +use JSON; + +our $VERSION = '1.69'; # VERSION + +my $TWELVEDATA_URL_HEAD = 'https://api.twelvedata.com/exchange_rate?symbol='; + +sub new +{ + my $self = shift; + my $class = ref($self) || $self; + + my $this = {}; + bless $this, $class; + + my $args = shift; + + ### TwelveData->new args : $args + + # TwelveData is permitted to use an environment variable for API key + # (for backwards compatibility). + # New modules should use the API_KEY from args. + + $this->{API_KEY} = $ENV{'TWELVEDATA_API_KEY'}; + $this->{API_KEY} = $args->{API_KEY} if (ref $args eq 'HASH') and (exists $args->{API_KEY}); + + return $this; +} + +sub multipliers +{ + my ($this, $ua, $from, $to) = @_; + + my $json_data; + my $rate; + +# Set headers. API key is sent as a header. + my @ua_headers = ( + 'Accept' => 'application/json', + ); + + my $reply = $ua->get($TWELVEDATA_URL_HEAD + . ${from} + . '%2F' + . ${to} + . '&apikey=' + . $this->{API_KEY}, @ua_headers); + + ### HTTP Status: $reply->code + return unless ($reply->code == 200); + + my $body = $reply->content; + + $json_data = JSON::decode_json $body; + + ### JSON: $json_data + + if ( !$json_data || !$json_data->{'rate'} ) { + return; + } + + $rate = + $json_data->{'rate'}; + + ### Rate from JSON: $rate + + return unless $rate + 0; + + # For small rates, request the inverse + if ($rate < 0.001) { + ### Rate is too small, requesting inverse : $rate + my ($a, $b) = $this->multipliers($ua, $to, $from); + return ($b, $a); + } + + return (1.0, $rate); +} + + +1; + +=head1 NAME + +Finance::Quote::CurrencyRates::TwelveData - Obtain currency rates from +https://api.twelvedata.com/exchange_rate + +=head1 SYNOPSIS + + use Finance::Quote; + + $q = Finance::Quote->new(currency_rates => + {order => ['TwelveData'], + twelvedata => {API_KEY => ...} + }); + + $value = $q->currency('18.99 EUR', 'USD'); + +=head1 DESCRIPTION + +This module fetches currency rates from +https://api.twelvedata.com/exchange_rate provides data to Finance::Quote +to convert the first argument to the equivalent value in the currency +indicated by the second argument. + +This module is not the default currency conversion module for a Finance::Quote +object. +It can be utilized by setting the environment variable FQ_CURRENCY=TwelveData. + +=head1 API_KEY + +https://api.twelvedata.com/exchange_rate requires users to register and obtain an API key. + +The API key can be set by setting the Environment variable +"TWELVEDATA_API_KEY" or providing a 'twelvedata' hash inside the +'currency_rates' hash to Finance::Quote->new as in the above example. + +=head1 Terms & Conditions + +Use of https://api.twelvedata.com/exchange_rate is +governed by any terms & conditions of that site. + +Finance::Quote is released under the GNU General Public License, version 2, +which explicitly carries a "No Warranty" clause. + +=cut diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/YahooJSON.pm new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/YahooJSON.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/CurrencyRates/YahooJSON.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/CurrencyRates/YahooJSON.pm 2026-04-18 20:47:43.000000000 +0200 @@ -32,7 +32,7 @@ use JSON; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $YIND_URL_HEAD = 'https://query1.finance.yahoo.com/v8/finance/chart/'; my $YIND_URL_TAIL = '?metrics=high&interval=1d&range=1d'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Deka.pm new/Finance-Quote-1.69/lib/Finance/Quote/Deka.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Deka.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Deka.pm 2026-04-18 20:47:43.000000000 +0200 @@ -10,7 +10,7 @@ use LWP::UserAgent; use HTTP::Request::Common; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'Deka Investments, DE'; our @LABELS = qw/exchange name date isodate price method/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/FTfunds.pm new/Finance-Quote-1.69/lib/Finance/Quote/FTfunds.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/FTfunds.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/FTfunds.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # ftfunds.pm # @@ -59,7 +60,7 @@ use HTML::TokeParser; # use Data::Dumper; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION $FTFUNDS_MAIN_URL = "https://markets.ft.com"; $FTFUNDS_LOOK_LD = "https://markets.ft.com/data/funds/tearsheet/summary?s="; @@ -69,14 +70,28 @@ # FIXME - -sub methods { return (ftfunds => \&ftfunds_fund, - ukfunds => \&ftfunds_fund); } +our $DISPLAY = 'FTfunds - Financial Times, UK'; +our @LABELS = + qw/name currency last date time price nav source iso_date method net p_change success errormsg/; +our $METHODHASH = {subroutine => \&ftfunds_fund, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + ftfunds => $METHODHASH, + ukfunds => $METHODHASH, + ); +} -{ - my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/; +sub labels { + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; +} - sub labels { return (ftfunds => \@labels, - ukfunds => \@labels); } +sub methods { + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/FinanceAPI.pm new/Finance-Quote-1.69/lib/Finance/Quote/FinanceAPI.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/FinanceAPI.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/FinanceAPI.pm 2026-04-18 20:47:43.000000000 +0200 @@ -33,7 +33,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $FINANCEAPI_URL = 'https://yfapi.net/v6/finance/quote?region=US&lang=en&symbols='; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Finanzpartner.pm new/Finance-Quote-1.69/lib/Finance/Quote/Finanzpartner.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Finanzpartner.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Finanzpartner.pm 2026-04-18 20:47:43.000000000 +0200 @@ -26,7 +26,7 @@ use Web::Scraper; use Encode; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $FINANZPARTNER_URL = "https://www.finanzpartner.de/fi/"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Fondsweb.pm new/Finance-Quote-1.69/lib/Finance/Quote/Fondsweb.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Fondsweb.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Fondsweb.pm 2026-04-18 20:47:43.000000000 +0200 @@ -24,7 +24,7 @@ use HTTP::Request::Common; use HTML::TreeBuilder::XPath; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $FONDSWEB_URL = "https://www.fondsweb.com/de/"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Fool.pm new/Finance-Quote-1.69/lib/Finance/Quote/Fool.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Fool.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Fool.pm 2026-04-18 20:47:43.000000000 +0200 @@ -37,7 +37,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $SEARCHURL = Text::Template->new(TYPE => 'STRING', SOURCE => 'https://api.fool.com/quotes/v4/instruments/search/?maxResults=10&apikey=public&domain=fool.com&query={$symbol}'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/GoldMoney.pm new/Finance-Quote-1.69/lib/Finance/Quote/GoldMoney.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/GoldMoney.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/GoldMoney.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # # Copyright (C) 1998, Dj Padzensky <[email protected]> # Copyright (C) 1998, 1999 Linas Vepstas <[email protected]> @@ -35,14 +36,28 @@ use strict; use warnings; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION -sub methods { - return ( goldmoney => \&goldmoney ); +our $DISPLAY = 'GoldMoney - Gold, Silver, Platinum '; +our @LABELS = qw/exchange name date isodate price method/; +our $METHODHASH = {subroutine => \&goldmoney, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + goldmoney => $METHODHASH, + ); } sub labels { - return ( goldmoney => [qw/exchange name date isodate price method/] ); + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; +} + +sub methods { + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } # goldmoney($quoter, @symbols) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/GoogleWeb.pm new/Finance-Quote-1.69/lib/Finance/Quote/GoogleWeb.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/GoogleWeb.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/GoogleWeb.pm 2026-04-18 20:47:43.000000000 +0200 @@ -31,7 +31,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $GOOGLE_URL = 'https://www.google.com/finance/'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/IndiaMutual.pm new/Finance-Quote-1.69/lib/Finance/Quote/IndiaMutual.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/IndiaMutual.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/IndiaMutual.pm 2026-04-18 20:47:43.000000000 +0200 @@ -32,20 +32,34 @@ use HTTP::Status; use IO::String; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # URLs of where to obtain information. $AMFI_MAIN_URL = ("http://www.amfiindia.com/"); $AMFI_URL = ("https://www.amfiindia.com/spages/NAVAll.txt"); -sub methods { return (indiamutual => \&amfiindia, - amfiindia => \&amfiindia); } +our $DISPLAY = 'IndiaMutual - Assoc of Mutual Funds in India'; +our @LABELS = qw/method source link name currency date isodate nav/; +our $METHODHASH = {subroutine => \&amfiindia, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + amfiindia => $METHODHASH, + indiamutual => $METHODHASH, + ); +} + +sub labels { + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; +} -{ - my @labels = qw/method source link name currency date isodate nav/; - sub labels { return (indiamutual => \@labels, - amfiindia => \@labels); } +sub methods { + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/MarketWatch.pm new/Finance-Quote-1.69/lib/Finance/Quote/MarketWatch.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/MarketWatch.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/MarketWatch.pm 2026-04-18 20:47:43.000000000 +0200 @@ -31,7 +31,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'MarketWatch'; our $FEATURES = {}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/MorningstarCH.pm new/Finance-Quote-1.69/lib/Finance/Quote/MorningstarCH.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/MorningstarCH.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/MorningstarCH.pm 2026-04-18 20:47:43.000000000 +0200 @@ -48,7 +48,7 @@ use JSON qw(decode_json); use Text::Template; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION $MSTARCH_MAIN_URL = "https://www.morningstar.ch"; $MSTARCH_LOOK_UP = "https://www.morningstar.ch/ch/funds/SecuritySearchResults.aspx?search="; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/MorningstarJP.pm new/Finance-Quote-1.69/lib/Finance/Quote/MorningstarJP.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/MorningstarJP.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/MorningstarJP.pm 2026-04-18 20:47:43.000000000 +0200 @@ -28,7 +28,7 @@ use LWP::UserAgent; use String::Util qw(trim); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'Morningstar JP'; our @LABELS = qw/nav isin symbol name currency date isodate/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/MorningstarUK.pm new/Finance-Quote-1.69/lib/Finance/Quote/MorningstarUK.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/MorningstarUK.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/MorningstarUK.pm 2026-04-18 20:47:43.000000000 +0200 @@ -45,7 +45,7 @@ use JSON qw(decode_json); use Text::Template; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION $MSTARUK_MAIN_URL = "https://www.morningstar.co.uk"; $MSTARUK_LOOK_UP = "https://www.morningstar.co.uk/uk/funds/SecuritySearchResults.aspx?search="; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/NSEIndia.pm new/Finance-Quote-1.69/lib/Finance/Quote/NSEIndia.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/NSEIndia.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/NSEIndia.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,7 +17,6 @@ # 02110-1301, USA package Finance::Quote::NSEIndia; -require 5.010; use strict; use POSIX qw(strftime); @@ -25,21 +25,33 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION use vars qw($NSE_MAIN_URL $NSE_URL); $NSE_MAIN_URL = "https://www.nseindia.com"; $NSE_URL = "https://nsearchives.nseindia.com"; -sub methods { return ( 'india' => \&nseindia, - 'nseindia' => \&nseindia ); } +our $DISPLAY = 'NSEIndia - NSE India'; +our @LABELS = qw/close last high low open prevclose exchange name/; +our $METHODHASH = {subroutine => \&nseindia, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + nseindia => $METHODHASH, + india => $METHODHASH, + ); +} sub labels { - my @labels = qw/close last high low open prevclose exchange name/; - return ( - india => \@labels, - nseindia => \@labels - ); + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; +} + +sub methods { + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } sub nseindia { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/NZX.pm new/Finance-Quote-1.69/lib/Finance/Quote/NZX.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/NZX.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/NZX.pm 2026-04-18 20:47:43.000000000 +0200 @@ -30,7 +30,7 @@ use Web::Scraper; use String::Util qw(trim); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'NZX - New Zealand Exchange'; our @LABELS = qw/last isin name currency date isodate/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/OnVista.pm new/Finance-Quote-1.69/lib/Finance/Quote/OnVista.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/OnVista.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/OnVista.pm 2026-04-18 20:47:43.000000000 +0200 @@ -35,7 +35,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $ONVISTA_URL = 'https://www.onvista.de/suche/'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/SIX.pm new/Finance-Quote-1.69/lib/Finance/Quote/SIX.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/SIX.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/SIX.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,16 +29,28 @@ use String::Util qw(trim); use Scalar::Util qw(looks_like_number); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION -our @labels = qw/last date isodate symbol/; +our $DISPLAY = 'SIX - Swiss Stock Exchange'; +our @LABELS = qw/last close date isodate symbol currency isin name/; +our $METHODHASH = {subroutine => \&six, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + six => $METHODHASH, + ); +} sub labels { - return ( six => \@labels ); + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; } sub methods { - return ( six => \&six ); + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } sub six { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Sinvestor.pm new/Finance-Quote-1.69/lib/Finance/Quote/Sinvestor.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Sinvestor.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Sinvestor.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or @@ -19,6 +20,7 @@ use strict; use warnings; use HTML::Entities; +use String::Util qw(trim); use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments'; @@ -27,7 +29,7 @@ use Web::Scraper; use Encode qw(encode_utf8); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $SINVESTOR_URL = 'https://web.s-investor.de/app/detail.htm?isin='; @@ -68,6 +70,7 @@ sub get_de_number { my $number = shift; + $number = trim($number); $number =~ s/\.//g; $number =~ s/,/\./; return ($number =~ /^([-+]?[0-9]+(\.[0-9]+)?)/) ? $1 : undef; @@ -148,6 +151,7 @@ eval { my $tree = HTML::TreeBuilder->new_from_url($url); + ### [<now>] tree: $tree my $lastvalue = $tree->look_down('class'=>'si_seitenbezeichnung'); @@ -222,8 +226,8 @@ $info{$symbol, 'high'} = get_de_number(td_search($t, 'Hoch')); my ($child) = td_search($t, 'Datum/Zeit'); - my $date = substr($child, 0, 8); - my $time = substr($child, 9, 5); # CE(S)T + my $date = substr(trim($child), 0, 8); + my $time = substr(trim($child), 9, 5); # CE(S)T $quoter->store_date(\%info, $symbol, {eurodate => $date}); $info{$symbol, 'time'} = $1 if $time =~ /^([0-9]{2}:[0-9]{2})/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/StockData.pm new/Finance-Quote-1.69/lib/Finance/Quote/StockData.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/StockData.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/StockData.pm 2026-04-18 20:47:43.000000000 +0200 @@ -31,7 +31,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $STOCKDATA_URL = 'https://api.stockdata.org/v1/data/quote?symbols='; # Gets appended with '$stock&api_token=$token' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Stooq.pm new/Finance-Quote-1.69/lib/Finance/Quote/Stooq.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Stooq.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Stooq.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# vi: set ts=2 sw=2 noai ic showmode showmatch: +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # # Copyright (C) 2023, Bruce Schuck <[email protected]> # @@ -28,12 +28,13 @@ use LWP::UserAgent; use HTTP::Request::Common; use HTTP::CookieJar::LWP (); +use HTTP::Cookies; use HTML::TableExtract; use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'Stooq - Warsaw Stock Exchange'; our @LABELS = qw/symbol name open high low last bid ask date currency method/; @@ -86,12 +87,28 @@ my $quoter = shift; my @stocks = @_; my (%info, $tree, $table, $pricetable, $url, $reply); - my $cj = HTTP::CookieJar::LWP->new; -# my $ua = LWP::UserAgent->new(cookie_jar => $cj); + + my $cj = HTTP::Cookies->new(); + # Cookies content gleaned from browser session + $cj->set_cookie(0, 'cookie_user', '%3F+++1dllg000G+1100d1300c3%7Clrq', '/', '.stooq.com'); + $cj->set_cookie(0, 'cookie_uu', '260114000', '/', '.stooq.com'); + $cj->set_cookie(0, 'FCCDCF', '%5Bnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B%5B32%2C%22%5B%5C%22ab16ab99-60a0-4da1-a296-29c8a27efbf9%5C%22%2C%5B1767931790%2C786000000%5D%5D%22%5D%2C%5B13%2C%22%5B%5C%22DBABL~BVQqAAAAAg%5C%22%2C%5B%5B7%2C%5B1768425873%2C984063000%5D%5D%5D%5D%22%5D%5D%5D', '/', '.stooq.com'); + $cj->set_cookie(0, 'FCNEC', '%5B%5B%22AKsRol_Zywhkz7ukryuiQZ7evZsxa0eSbPMEpqvZUwq6Kmf32IqN4xQFgJjIG_fDDxo4f5sLKIXXGsrdQayx3tROTwoyC8BZX4rNDu3fBfzCikX_gkuhCra5dJotNToqdQrxouYXlgE_k7KTmpnQn7AEOImeVQrz2g%3D%3D%22%5D%5D', '/', '.stooq.com'); + $cj->set_cookie(0, 'PHPSESSID', '3vqtfg7shbf23iog9frtbqdn15', '/', 'stooq.com'); + $cj->set_cookie(0, 'privacy', '1768598448', '/', 'stooq.com'); + $cj->set_cookie(0, 'uid', 'usb132zim841xr4doi8j12uk4a', '/', 'stooq.com'); + my $ua = $quoter->user_agent(); + $ua->cookie_jar($cj); - $ua->default_header('Accept-Encoding' => 'deflate'); - $ua->default_header('Accept-Language' => 'en-US,en;q=0.5'); + + $ua->default_header('Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'); + $ua->default_header('Accept-Encoding' => 'gzip, deflate, br, zstd'); + $ua->default_header('Accept-Language' => 'en-US,en;q=0.9'); + $ua->default_header('Host' => 'stooq.com'); + $ua->default_header('Pragma' => 'no-cache'); + $ua->default_header('Upgrade-Insecure-Requests' => '1'); + $ua->default_header('User-Agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36'); foreach my $stock (@stocks) { @@ -103,6 +120,7 @@ my $headers = $reply->headers_as_string; my $body = $reply->decoded_content; + ### Headers: $headers ### Body: $body my ($name, $bid, $ask, $last, $open, $high, $low, $date, $currency); @@ -266,3 +284,12 @@ =item currency =back + +=head1 Caveat + +When accessed from Europe the website requires cookie consent. Many of the +cookies are set via Google's "Google's Privacy & messaging tool +(formerly known as Google Funding Choices)". It may be necessary to +manually capture cookies in a browser and replace the values in this +module. + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/SwissFundData.pm new/Finance-Quote-1.69/lib/Finance/Quote/SwissFundData.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/SwissFundData.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/SwissFundData.pm 2026-04-18 20:47:43.000000000 +0200 @@ -47,7 +47,7 @@ $SFDCH_MAIN_URL = "https://www.swissfunddata.ch"; $SFDCH_LOOK_UP = "https://www.swissfunddata.ch/sfdpub/en/funds/prices?text="; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = "SwissFundData"; our @LABELS = qw/name currency date nav isodate method success errormsg/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/TMX.pm new/Finance-Quote-1.69/lib/Finance/Quote/TMX.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/TMX.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/TMX.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,18 +29,30 @@ use JSON qw( decode_json encode_json ); use String::Util qw(trim); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION -our @labels = qw/currency name exchange volume open high low cap close year_range last p_change symbol isodate date/; +our $DISPLAY = 'TMX - Toronto Stock Exchange'; +our @LABELS = qw/currency name exchange volume open high low cap close year_range last p_change symbol isodate date/; +our $METHODHASH = {subroutine => \&tmx, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + tmx => $METHODHASH, + tsx => $METHODHASH, + canada => $METHODHASH, + ); +} sub labels { - return ( tmx => \@labels ); + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; } sub methods { - return ( tmx => \&tmx, - tsx => \&tmx, - canada => \&tmx ); + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } sub tmx { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/TSP.pm new/Finance-Quote-1.69/lib/Finance/Quote/TSP.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/TSP.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/TSP.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# vi: set ts=2 sw=2 noai ic showmode showmatch: +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # # Copyright (C) 1998, Dj Padzensky <[email protected]> # Copyright (C) 1998, 1999 Linas Vepstas <[email protected]> @@ -41,18 +41,33 @@ use HTTP::Request::Common; use POSIX; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # URLs of where to obtain information $TSP_URL = 'https://www.tsp.gov/data/fund-price-history.csv'; $TSP_MAIN_URL = 'http://www.tsp.gov'; @HEADERS = ('user-agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36'); -sub methods { return (tsp => \&tsp) } +our $DISPLAY = 'TSP - US Gov Thrift Savings Plan'; +our @LABELS = qw/name date isodate currency close/; +our $METHODHASH = {subroutine => \&tsp, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + tsp => $METHODHASH, + ); +} + +sub labels { + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; +} -{ - my @labels = qw/name date isodate currency close/; - sub labels { return (tsp => \@labels); } +sub methods { + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } sub format_name { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/TesouroDireto.pm new/Finance-Quote-1.69/lib/Finance/Quote/TesouroDireto.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/TesouroDireto.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/TesouroDireto.pm 2026-04-18 20:47:43.000000000 +0200 @@ -31,7 +31,7 @@ use HTTP::Request::Common; use Time::Piece; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION our $DISPLAY = 'Brazilian Govt Bonds, tesouro_direto'; our $FEATURES = {}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Tradegate.pm new/Finance-Quote-1.69/lib/Finance/Quote/Tradegate.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Tradegate.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Tradegate.pm 2026-04-18 20:47:43.000000000 +0200 @@ -26,7 +26,7 @@ use LWP::UserAgent; use Web::Scraper; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $TRADEGATE_URL = 'https://web.s-investor.de/app/detail.htm?boerse=TDG&isin='; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/TreasuryDirect.pm new/Finance-Quote-1.69/lib/Finance/Quote/TreasuryDirect.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/TreasuryDirect.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/TreasuryDirect.pm 2026-04-18 20:47:43.000000000 +0200 @@ -2,6 +2,7 @@ # # TreasuryDirect.pm # +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: =begin comment @@ -23,7 +24,7 @@ # April, 2018 # -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION use vars qw /$VERSION/ ; @@ -34,14 +35,26 @@ my $TREASURY_DIRECT_URL = 'https://www.treasurydirect.gov/GA-FI/FedInvest/todaySecurityPriceDate.htm'; -sub methods { - return treasurydirect => \&treasurydirect; +our $DISPLAY = 'TreasuryDirect - US Treasury Bonds'; +our @LABELS = qw/method source symbol rate bid ask price date isodate/; +our $METHODHASH = {subroutine => \&treasurydirect, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + treasurydirect => $METHODHASH, + ); } - sub labels { - my @labels = qw/ method source symbol rate bid ask price date isodate /; - return treasurydirect => \@labels; + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; +} + +sub methods { + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } sub treasurydirect { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/TwelveData.pm new/Finance-Quote-1.69/lib/Finance/Quote/TwelveData.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/TwelveData.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/TwelveData.pm 2026-04-18 20:47:43.000000000 +0200 @@ -27,7 +27,7 @@ use Text::Template; use DateTime::Format::Strptime qw( strptime strftime ); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $URL = Text::Template->new(TYPE => 'STRING', SOURCE => 'https://api.twelvedata.com/quote?symbol={$symbol}&apikey={$token}'); my $THROTTLE = 1.05 * 60.0/8.0; # 5% more than maximum seconds / request for free tier diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/USBonds.pm new/Finance-Quote-1.69/lib/Finance/Quote/USBonds.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/USBonds.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/USBonds.pm 2026-04-18 20:47:43.000000000 +0200 @@ -37,7 +37,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments', '###'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # # Define constants. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/Union.pm new/Finance-Quote-1.69/lib/Finance/Quote/Union.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/Union.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/Union.pm 2026-04-18 20:47:43.000000000 +0200 @@ -49,7 +49,7 @@ use JSON qw(decode_json); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # This url retrieve a JSON data structure containing data for all funds our $UNION_URL = 'https://internal.api.union-investment.de/beta/web/funddata/fundsearch?segment=web_de&type=fondssuche&api-version=beta-2.0.0'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/UserAgent.pm new/Finance-Quote-1.69/lib/Finance/Quote/UserAgent.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/UserAgent.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/UserAgent.pm 2026-04-18 20:47:43.000000000 +0200 @@ -31,7 +31,7 @@ use vars qw/@ISA /; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION @ISA = qw/LWP::UserAgent/; # A very simple extension. When we generate a LWP::UserAgent object, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/XETRA.pm new/Finance-Quote-1.69/lib/Finance/Quote/XETRA.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/XETRA.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/XETRA.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# vi: set ts=2 sw=2 noai ic showmode showmatch: +# vi: set ts=2 sw=2 noai ic showmode showmatch: # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or @@ -20,6 +20,7 @@ use strict; use warnings; use HTML::Entities; +use String::Util qw(trim); use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments'; @@ -27,7 +28,7 @@ use LWP::UserAgent; use Web::Scraper; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION my $xetra_URL = 'https://web.s-investor.de/app/detail.htm?boerse=GER&isin='; @@ -35,12 +36,12 @@ our $FEATURES = {'INST_ID' => 'Required Institution ID'}; our @LABELS = qw/symbol last close exchange volume open price change p_change/; our $METHODHASH = {subroutine => \&xetra, - display => $DISPLAY, + display => $DISPLAY, labels => \@LABELS, features => $FEATURES}; sub methodinfo { - return ( + return ( xetra => $METHODHASH, europe => $METHODHASH, ); @@ -102,7 +103,7 @@ $td1 = ($lastvalue->look_down('_tag'=>'td'))[7]; @child = $td1->content_list; - my $date = substr($child[0], 0, 8); + my $date = substr(trim($child[0]), 0, 8); $td1 = ($lastvalue->look_down('_tag'=>'td'))[9]; @child = $td1->content_list; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/YahooJSON.pm new/Finance-Quote-1.69/lib/Finance/Quote/YahooJSON.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/YahooJSON.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/YahooJSON.pm 2026-04-18 20:47:43.000000000 +0200 @@ -36,7 +36,7 @@ use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments'; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # Required to successfully read extra long headers returned from yahoo my %OPTS = @LWP::Protocol::http::EXTRA_SOCK_OPTS; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/YahooWeb.pm new/Finance-Quote-1.69/lib/Finance/Quote/YahooWeb.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/YahooWeb.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/YahooWeb.pm 2026-04-18 20:47:43.000000000 +0200 @@ -32,7 +32,7 @@ use constant URLTAG => "data-url"; use constant JSONBODY => "body"; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION # Fix for 500 Header line too long message push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, MaxLineLength => 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote/ZA.pm new/Finance-Quote-1.69/lib/Finance/Quote/ZA.pm --- old/Finance-Quote-1.68/lib/Finance/Quote/ZA.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote/ZA.pm 2026-04-18 20:47:43.000000000 +0200 @@ -1,4 +1,5 @@ #!/usr/bin/perl -w +# vi: set ts=2 sw=2 noai expandtab ic showmode showmatch: # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -27,16 +28,28 @@ use Web::Scraper; use String::Util qw(trim); -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION -our @labels = qw/method source name symbol currency last date isodate high low p_change/; +our $DISPLAY = 'ZA - Sharenet South Africa'; +our @LABELS = qw/method source name symbol currency last price date isodate exchange/; +our $METHODHASH = {subroutine => \&sharenet, + display => $DISPLAY, + labels => \@LABELS}; + +sub methodinfo { + return ( + za => $METHODHASH, + ); +} sub labels { - return ( sharenet => \@labels ); + my %m = methodinfo(); + return map {$_ => [@{$m{$_}{labels}}] } keys %m; } sub methods { - return ( za => \&sharenet ); + my %m = methodinfo(); + return map {$_ => $m{$_}{subroutine} } keys %m; } sub sharenet { @@ -77,6 +90,7 @@ $info{$symbol, 'symbol'} = $symbol; $info{$symbol, 'source'} = 'sharenet.co.za'; $info{$symbol, 'exchange'} = 'JSE'; + $info{$symbol, 'method'} = 'za'; if ($result->{day} =~ /(\d+)\s+(\w{3})/) { $quoter->store_date(\%info, $symbol, {day => $1, month => $2}); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/lib/Finance/Quote.pm new/Finance-Quote-1.69/lib/Finance/Quote.pm --- old/Finance-Quote-1.68/lib/Finance/Quote.pm 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/lib/Finance/Quote.pm 2026-04-18 20:47:43.000000000 +0200 @@ -48,7 +48,7 @@ $TIMEOUT @MODULES %MODULES %METHODS $AUTOLOAD @CURRENCY_RATES_MODULES $USE_EXPERIMENTAL_UA/; -our $VERSION = '1.68'; # VERSION +our $VERSION = '1.69'; # VERSION @CURRENCY_RATES_MODULES = qw/ AlphaVantage @@ -57,6 +57,7 @@ FinanceAPI Fixer OpenExchange + TwelveData YahooJSON /; @@ -880,7 +881,7 @@ return $amount if ($from_code eq $to_code); # Trivial case. my $ua = $this->get_user_agent; - + foreach my $rate (@{$this->{currency_rate_method}}) { ### rate: ref($rate) my $final = eval { @@ -1704,6 +1705,7 @@ Finance::Quote::CurrencyRates::FinanceAPI, Finance::Quote::CurrencyRates::Fixer, Finance::Quote::CurrencyRates::OpenExchange, + Finance::Quote::CurrencyRates::TwelveData, Finance::Quote::CurrencyRates::YahooJSON, Finance::Quote::AEX, Finance::Quote::ASEGR, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/t/currency.t new/Finance-Quote-1.69/t/currency.t --- old/Finance-Quote-1.68/t/currency.t 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/t/currency.t 2026-04-18 20:47:43.000000000 +0200 @@ -116,6 +116,20 @@ module_check('FinanceAPI', \@valid, \@invalid, {cache => 1, API_KEY => $ENV{TEST_FINANCEAPI_API_KEY}}); }; +# Check TwelveData +subtest 'TwelveData' => sub { + if ( not $ENV{TEST_TWELVEDATA_API_KEY} ) { + plan skip_all => + 'Set $ENV{TEST_TWELVEDATA_API_KEY} to run this test; get one at https://financeapi.net'; + } + + my @valid = + ( ['100.00 USD', 'EUR'], ['1.00 GBP', 'IDR'], ['1.23 IDR', 'CAD'] ); + my @invalid = ( ['20.12 ZZZ', 'GBP'] ); + + module_check('TwelveData', \@valid, \@invalid, {cache => 1, API_KEY => $ENV{TEST_TWELVEDATA_API_KEY}}); +}; + # Check YahooJSON subtest 'YahooJSON' => sub { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/t/ftfunds.t new/Finance-Quote-1.69/t/ftfunds.t --- old/Finance-Quote-1.68/t/ftfunds.t 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/t/ftfunds.t 2026-04-18 20:47:43.000000000 +0200 @@ -13,21 +13,21 @@ my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; -my %quotes = $q->ftfunds("GB0031834814","GB0030881337","GB0003865176","GB00B7W6PR65","BOGUS"); +my %quotes = $q->ftfunds("GB0031293995","GB0030366719","GB0003865176","GB00B7W6PR65","BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. -ok($quotes{"GB0031834814","last"} > 0); -ok($quotes{"GB0031834814","success"}); +ok($quotes{"GB0031293995","last"} > 0); +ok($quotes{"GB0031293995","success"}); ok($quotes{"GB00B7W6PR65","last"} > 0); ok($quotes{"GB00B7W6PR65","success"}); ok($quotes{"GB00B7W6PR65","currency"} eq "GBP", "Currency (GBP) for GB00B7W6PR65 is ".$quotes{"GB00B7W6PR65","currency"}); ok($quotes{"GB00B7W6PR65","price"}<100,"Price for GB00B7W6PR65 < 100 : ".$quotes{"GB00B7W6PR65","price"}); -ok($quotes{"GB0030881337","last"} > 0); -ok($quotes{"GB0030881337","success"}); +ok($quotes{"GB0030366719","last"} > 0); +ok($quotes{"GB0030366719","success"}); ok($quotes{"GB0003865176","last"} > 0); ok($quotes{"GB0003865176","success"}); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/t/indiamutual.t new/Finance-Quote-1.69/t/indiamutual.t --- old/Finance-Quote-1.68/t/indiamutual.t 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/t/indiamutual.t 2026-04-18 20:47:43.000000000 +0200 @@ -3,6 +3,9 @@ use Test::More; use Finance::Quote; +use constant DEBUG => $ENV{DEBUG}; +use if DEBUG, 'Smart::Comments'; + if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } @@ -10,7 +13,7 @@ # Test IndiaMutual functions. my $q = Finance::Quote->new(); -my @funds = ("102676", "103131", "148181", "INF194K01W88", "INF090I01FN7", +my @funds = ("102676", "103131", "INF194K01W88", "INF090I01FN7", "INF082J01127"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; @@ -20,6 +23,8 @@ my %quotes = $q->fetch("indiamutual", @funds); ok(%quotes); +### Quotes Hash: %quotes + # Check that the name and nav are defined for all of the funds. foreach my $fund (@funds) { ok($quotes{$fund,"nav"} > 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/t/six.t new/Finance-Quote-1.69/t/six.t --- old/Finance-Quote-1.68/t/six.t 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/t/six.t 2026-04-18 20:47:43.000000000 +0200 @@ -38,7 +38,6 @@ 'close' => sub {not defined $_[0] or looks_like_number($_[0])}, 'ask' => sub {not defined $_[0] or looks_like_number($_[0])}, 'currency' => sub {$_[0] =~ /^[A-Z]{3}$/}, - 'name' => sub {$_[0] eq $valid{$_[1]}}, 'isin' => sub {$_[0] =~ /^[A-Z0-9]{12}$/}, 'isodate' => sub {Date::Range->new($today - $window, $today)->includes(Date::Simple::ISO->new($_[0]))}, 'date' => sub {my $a = Date::Manip::Date->new(); $a->parse_format('%m/%d/%Y', $_[0]); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/t/tmx.t new/Finance-Quote-1.69/t/tmx.t --- old/Finance-Quote-1.68/t/tmx.t 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/t/tmx.t 2026-04-18 20:47:43.000000000 +0200 @@ -17,7 +17,7 @@ my %valid = ('STN' => 'Stantec Inc.', 'BCE' => 'BCE Inc.', 'BMO' => 'Bank of Montreal', - 'HBI:US' => 'Hanesbrands Inc.' + 'GIL:US' => 'Gildan Activewear Inc. Class A Sub. Vot.' ); my @invalid = ('BOGUS'); my @symbols = (keys %valid, @invalid); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/t/tsp.t new/Finance-Quote-1.69/t/tsp.t --- old/Finance-Quote-1.68/t/tsp.t 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/t/tsp.t 2026-04-18 20:47:43.000000000 +0200 @@ -11,7 +11,7 @@ my $lastyear = $year - 1; my $quoter = Finance::Quote->new(); -my @symbols = qw/C F G I S L2025 L2030 L2035 L2040 L2045 L2050 L2055 L2060 L2065 LINCOME/; +my @symbols = qw/C F G I S L2030 L2035 L2040 L2045 L2050 L2055 L2060 L2065 LINCOME/; plan tests => 12*(1+$#symbols)+3; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Finance-Quote-1.68/t/za.t new/Finance-Quote-1.69/t/za.t --- old/Finance-Quote-1.68/t/za.t 2025-12-21 20:41:05.000000000 +0100 +++ new/Finance-Quote-1.69/t/za.t 2026-04-18 20:47:43.000000000 +0200 @@ -18,7 +18,7 @@ } my %valid = ('AGL' => 'ANGLO AMERICAN PLC - AGL', - 'AMS' => 'ANGLO AMERICAN PLATINUM CORPORATION LIMITED - AMS' + 'MTN' => 'MTN GROUP LIMITED - MTN' ); my @invalid = ('BOGUS'); my @symbols = (keys %valid, @invalid); ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.uZK7aR/_old 2026-05-18 17:58:02.677198616 +0200 +++ /var/tmp/diff_new_pack.uZK7aR/_new 2026-05-18 17:58:02.689199113 +0200 @@ -1,6 +1,6 @@ -mtime: 1766381895 -commit: c6fb46ab16a01b8f9d6f9fab285438210d1172f98873d74848c1214f75867caa -url: https://src.opensuse.org/perl/perl-Finance-Quote.git -revision: c6fb46ab16a01b8f9d6f9fab285438210d1172f98873d74848c1214f75867caa +mtime: 1776581714 +commit: 8ddffc12046d65d372a60fe5a8463b902c90a0bb41396f60f4df8077aa15e6fe +url: https://src.opensuse.org/perl/perl-Finance-Quote +revision: 8ddffc12046d65d372a60fe5a8463b902c90a0bb41396f60f4df8077aa15e6fe projectscmsync: https://src.opensuse.org/perl/_ObsPrj ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-04-19 08:55:14.000000000 +0200 @@ -0,0 +1 @@ +.osc
