App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Barchart.pm view on Meta::CPAN
# Foundation; either version 3, or (at your option) any later version.
#
# Chart 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 Chart. If not, see <http://www.gnu.org/licenses/>.
# Broken by hideous recent barchart.com site.
package App::Chart::Barchart;
use 5.006;
use strict;
use warnings;
use Carp;
use Date::Calc;
use Date::Parse;
use List::Util qw (min max);
use POSIX ();
use URI::Escape;
use Locale::TextDomain ('App-Chart');
use App::Chart;
use App::Chart::Database;
use App::Chart::Download;
use App::Chart::DownloadHandler;
use App::Chart::IntradayHandler;
use App::Chart::Latest;
use App::Chart::Pagebits;
use App::Chart::Sympred;
use App::Chart::TZ;
use App::Chart::Weblink;
# uncomment this to run the ### lines
#use Smart::Comments;
our $latest_pred = App::Chart::Sympred::Any->new;
our $intraday_pred = App::Chart::Sympred::Any->new;
our $fiveday_pred = App::Chart::Sympred::Any->new;
# overridden by specific nodes
App::Chart::setup_source_help
($fiveday_pred, __p('manual-node','Barchart'));
sub setup {
my ($setup_pred) = @_;
$latest_pred->add ($setup_pred);
$intraday_pred->add ($setup_pred);
$fiveday_pred->add ($setup_pred);
}
#-----------------------------------------------------------------------------
# various
sub cookie_jar {
require HTTP::Cookies;
my $jar = HTTP::Cookies->new;
# Set-Cookie: bcad_int=1; path=/; domain=barchart.com;
$jar->set_cookie(undef, # version
'bcad_int', # key
'1', # value
'/', # path
'.barchart.com'); # domain
return $jar;
}
#-----------------------------------------------------------------------------
# symbol munging
my @commodity_mung;
sub commodity_mung {
my ($pred, %table) = @_;
push @commodity_mung, [ $pred, \%table ];
}
sub symbol_to_barchart {
my ($symbol) = @_;
foreach my $elem (@commodity_mung) {
if ($elem->[0]->match ($symbol)) {
my $commodity = App::Chart::symbol_commodity ($symbol);
my $barchart = $elem->[1]->{$commodity};
if (defined $barchart) {
$symbol =~ s/^\Q$commodity/$barchart/;
}
last;
}
}
$symbol =~ s/.[^.]*$//;
return $symbol;
}
#------------------------------------------------------------------------------
# latest
#
# The intraday commodity quotes pages are used, like oats
#
# http://www2.barchart.com/ifutpage.asp?code=BSTK&sym=O
#
# which is about 35 kbytes each. An alternative would be the combined
# pages like all grains
#
# http://www2.barchart.com/mktcom.asp?code=BSTK§ion=grains
#
# which has the front month or two of various at about 50kbytes the lot.
App::Chart::LatestHandler->new
(pred => $latest_pred,
proc => \&latest_download,
max_symbols => 1);
sub latest_download {
my ($symbol_list) = @_;
my $symbol = $symbol_list->[0];
my $commodity = App::Chart::symbol_commodity ($symbol);
( run in 0.674 second using v1.01-cache-2.11-cpan-39bf76dae61 )