App-Chart

 view release on metacpan or  search on metacpan

lib/App/Chart/LatestHandler.pm  view on Meta::CPAN


  my (@symbol_list, @extra_list);
  {
    # delete duplicates and any extra_list already in symbol_list
    my %hash;
    @symbol_list = grep {!$hash{$_}++} @$orig_symbol_list;
    @extra_list  = grep {!$hash{$_}++} @$orig_extra_list;
  }

  foreach my $symbol (@symbol_list, @extra_list) {
    App::Chart::symbol_setups ($symbol);
  }

  while (@symbol_list) {
    ### LatestHandler considering: "@symbol_list"
    my @this_list = (shift @symbol_list);

    my $handler = $class->handler_for_symbol ($this_list[0]);
    if (! $handler) {
      print "No latest handler for \"",$this_list[0],"\"\n";
      next;
    }
    my $pred = $handler->{'pred'};
    my $max_symbols = $handler->{'max_symbols'} || 1_000_000;

    foreach my $list (\@symbol_list, \@extra_list) {
      for (my $i = 0; @this_list < $max_symbols && $i < @$list; ) {
        my $symbol = $list->[$i];
        if ($pred->match ($symbol)) {
          push @this_list, $symbol;
          splice @$list, $i,1;
        } else {
          $i++;
        }
      }
    }

    my $proc = $handler->{'proc'};
    my $trace;
    unless (do {
      local $SIG{'__DIE__'} =
        (# $App::Chart::option{'verbose'} &&
         eval { require Devel::StackTrace; 1 }
         ? sub {
           { local $@; $trace = Devel::StackTrace->new; }
           die $@;
         }
         : $SIG{'__DIE__'});
      eval { $proc->(\@this_list); 1 };
    }) {
      my $err = $@;
      unless (utf8::is_utf8($err)) { $err = Encode::decode('locale',$err); }
      print "Latest download error: ", $err, "\n";
      if (defined $trace) {
        print $trace->as_string, "\n";
      }
    }
  }
}

sub expand_arguments {
  my ($args) = @_;
  my @symbol_list = ();
  foreach my $arg (@$args) {
    if (ref $arg) {
      push @symbol_list, $arg->symbols;
    } else {
      push @symbol_list, App::Chart::Download::symbol_glob ($arg);
    }
  }
  return @symbol_list;
}

sub command_line_download {
  my ($class, $args) = @_;
  my @symbol_list = expand_arguments ($args);
  $class->download (\@symbol_list, []);
}



1;
__END__

=for stopwords intraday undef

=head1 NAME

App::Chart::LatestHandler -- latest quotes download handler object

=head1 SYNOPSIS

 use App::Chart::LatestHandler;

=head1 FUNCTIONS

=over 4

=item C<< App::Chart::LatestHandler->new (...) >>

Create and register a new intraday image handler.  The return is a new
C<App::Chart::LatestHandler> object, though usually this is not of interest
(only all the handlers later with C<handlers_for_symbol> below).

    my $pred = App::Chart::Sympred::Suffix->new ('.NZ');

    App::Chart::LatestHandler->new
      (pred => $pred,
       proc => \&latest_download);

=item C<< App::Chart::LatestHandler->handler_for_symbol ($symbol) >>

Return the C<App::Chart::LatestHandler> object which handles C<$symbol>, or
return undef if none.

=item C<< App::Chart::LatestHandler->download ($symbol_list, $extra_list) >>


=back



( run in 1.090 second using v1.01-cache-2.11-cpan-5623c5533a1 )