2003-01-22 21:54:37 -06:00
|
|
|
#!/usr/bin/perl
|
|
|
|
#
|
|
|
|
# Copyright (C) 2003, David Hampton <hampton@employees.org>
|
|
|
|
#
|
|
|
|
# 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., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
# 02111-1307, USA
|
|
|
|
#
|
|
|
|
|
|
|
|
use strict;
|
2003-02-14 13:03:30 -06:00
|
|
|
|
|
|
|
sub check_modules {
|
2003-02-16 19:35:26 -06:00
|
|
|
my @modules = qw(Date::Manip Finance::Quote LWP HTML::TableExtract);
|
2003-02-14 13:03:30 -06:00
|
|
|
my @missing;
|
|
|
|
|
|
|
|
foreach my $mod (@modules) {
|
|
|
|
if (eval "require $mod") {
|
|
|
|
$mod->import();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
push (@missing, $mod);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return unless @missing;
|
|
|
|
|
|
|
|
print STDERR "$0 cannot find all the Perl modules needed to run.\n";
|
|
|
|
print STDERR "You need to install the following Perl modules:\n";
|
|
|
|
foreach my $mod (@missing) {
|
|
|
|
print STDERR " ".$mod."\n";
|
|
|
|
}
|
|
|
|
print STDERR "Run 'update-finance-quote' as root to install them.\n";
|
|
|
|
|
|
|
|
exit 1;
|
|
|
|
}
|
2003-01-22 21:54:37 -06:00
|
|
|
|
|
|
|
sub report {
|
|
|
|
my($itemname, $qh) = @_;
|
|
|
|
my ($symbol, $date, $currency, $last, $nav, $price, $timezone, $keyname);
|
|
|
|
|
|
|
|
# Parse the quote fields and put warnings where necessary.
|
|
|
|
$symbol = defined($$qh{$itemname, "symbol"})
|
|
|
|
? $$qh{$itemname, "symbol"} : "$itemname (deduced)";
|
|
|
|
$date = defined($$qh{$itemname, "date"})
|
|
|
|
? $$qh{$itemname, "date"} : "** missing **";
|
|
|
|
$currency = defined($$qh{$itemname, "currency"})
|
|
|
|
? $$qh{$itemname, "currency"} : "** missing **";
|
|
|
|
if ((!defined($$qh{$itemname, "last"})) &&
|
|
|
|
(!defined($$qh{$itemname, "nav" })) &&
|
|
|
|
(!defined($$qh{$itemname, "price"}))) {
|
|
|
|
$$qh{$itemname, "last"} = "**missing**";
|
|
|
|
$$qh{$itemname, "nav"} = "**missing**";
|
|
|
|
$$qh{$itemname, "price"} = "**missing**";
|
|
|
|
} else {
|
|
|
|
$last = defined($$qh{$itemname, "last"})
|
|
|
|
? $$qh{$itemname, "last"} : "";
|
|
|
|
$nav = defined($$qh{$itemname, "nav"})
|
|
|
|
? $$qh{$itemname, "nav"} : "";
|
|
|
|
$price = defined($$qh{$itemname, "price"})
|
|
|
|
? $$qh{$itemname, "price"} : "";
|
|
|
|
}
|
|
|
|
$timezone = defined($$qh{$itemname, "timezone"})
|
|
|
|
? $$qh{$itemname, "timezone"} : "";
|
|
|
|
|
|
|
|
# Dump gnucsah recognized fields
|
|
|
|
printf "Finance::Quote fields Gnucash uses:\n";
|
|
|
|
printf " symbol: %-20s <=== required\n", $symbol;
|
|
|
|
printf " date: %-20s <=== required\n", $date;
|
|
|
|
printf " currency: %-20s <=== required\n", $currency;
|
|
|
|
printf " last: %-20s <=\\ \n", $last;
|
|
|
|
printf " nav: %-20s <=== one of these\n", $nav;
|
|
|
|
printf " price: %-20s <=/ \n", $price;
|
|
|
|
printf " timezone: %-20s <=== optional\n", $timezone;
|
|
|
|
|
|
|
|
# Dump all fields
|
|
|
|
printf "\nAll Finance::Quote Fields\n";
|
|
|
|
foreach $keyname (sort keys %$qh) {
|
|
|
|
my ($item, $key) = split('\034', $keyname);
|
|
|
|
printf "%10s: %s\n", $key, $$qh{$item, $key}, "\n";
|
|
|
|
}
|
|
|
|
print "\n";
|
|
|
|
}
|
|
|
|
|
2003-02-14 13:03:30 -06:00
|
|
|
# Check for and load non-standard modules
|
|
|
|
check_modules ();
|
|
|
|
|
2003-01-22 21:54:37 -06:00
|
|
|
my $q = Finance::Quote->new;
|
|
|
|
$q->timeout(60);
|
|
|
|
|
|
|
|
if ($#ARGV < 1) {
|
|
|
|
my @sources = $q->sources();
|
|
|
|
printf "\nUsage: $0 <quote-source> <stock> [<stock> ...]\n\n";
|
|
|
|
printf "Available sources are: \n %s\n\n", join(' ', @sources);
|
|
|
|
exit 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $exchange = shift;
|
|
|
|
while ($#ARGV >= 0) {
|
|
|
|
my $stock = shift;
|
|
|
|
my %quotes = $q->fetch($exchange, $stock);
|
|
|
|
$stock =~ tr/a-z/A-Z/;
|
|
|
|
report($stock, \%quotes);
|
|
|
|
if ($#ARGV >= 0) {
|
|
|
|
printf "=====\n\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
=head1 NAME
|
|
|
|
|
|
|
|
dump-finance-quote - Print out data from the F::Q module
|
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
|
|
|
|
dump-finance-quote yahoo CSCO JNPR
|
|
|
|
dump-finance-quote yahoo BAESY.PK
|
|
|
|
dump-finance-quote europe 48406.PA 13000.PA
|
|
|
|
dump-finance-quote vwd 632034
|
|
|
|
dump-finance-quote ftportfolios FKYGTX
|
|
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
|
|
|
|
This program obtains information from Finance::Quote about any
|
|
|
|
specified stock, and then dumps it to the screen in annotated form.
|
|
|
|
This will allow someone to see what is returned, and whether it
|
|
|
|
provides all the information needed by Gnucash.
|
|
|
|
|
|
|
|
=cut
|