App-Smolder-Report

 view release on metacpan or  search on metacpan

lib/App/Smolder/Report.pm  view on Meta::CPAN

package App::Smolder::Report;

use warnings;
use strict;
use 5.008;
use LWP::UserAgent;
use Getopt::Long;
use Carp::Clan qw(App::Smolder::Report);

our $VERSION = '0.04';


###################
# Smolder reporting

sub report {
  my $self = shift;
  
  $self->{run_as_api} = 1;
  return $self->_do_report(@_);
}

sub _do_report {
  my $self = shift;
  
  $self->_fatal("Required 'server' setting is empty or missing")
    unless $self->server;
  $self->_fatal("Required 'project_id' setting is empty or missing")
    unless $self->project_id;
  $self->_fatal("Required 'username' setting is empty or missing")
    unless $self->username;
  $self->_fatal("Required 'password' setting is empty or missing")
    unless $self->password;
  $self->_fatal("You must provide at least one report to upload")
    unless @_;
  
  return $self->_upload_reports(@_);
}

sub _upload_reports {
  my ($self, @reports) = @_;
  my $server = $self->server;
  my $reports_url;
  
  $server = "http://$server"
    unless $server =~ m/^http/;
  
  my $ua = LWP::UserAgent->new;
  my $url
    = $server
    . '/app/developer_projects/process_add_report/'
    . $self->project_id;
  
  REPORT_FILE:
  foreach my $report_file (@reports) {
    $self->_fatal("Could not read report file '$report_file'")
      unless -r $report_file;
  
    if ($self->dry_run) {
      $self->_log("Dry run: would POST to $url: $report_file");
      next REPORT_FILE;
    }
    
    my $response = $ua->post(
      $url,
      'Content-Type' => 'form-data',
      'Content'      => [
        username => $self->username,
        password => $self->password,
        tags     => '',
        report_file => [$report_file],
      ],
    );
    
    if ($response->code == 302) {
      if (! $reports_url) {
        $reports_url = $response->header('Location');
        $reports_url = "$server$reports_url"
          unless $reports_url =~ m/^http/;
      }
      
      $self->_log("Report '$report_file' sent successfully");
      
      if ($self->delete) {
        if (!unlink($report_file)) {
          $self->_log("WARNING: could not delete file $report_file: $!");
        }
      }
    }
    else {
      $self->_fatal(
        "Could not upload report '$report_file'",
        "HTTP Code: ".$response->code,
        $response->message,
      );
    }
  }
  
  $self->_log("See all reports at $reports_url") if $reports_url;
  return $reports_url;
}


###################################
# Configuration loading and merging

sub _load_configs {
  my ($self) = @_;
  
  my $filename = '.smolder.conf';
  my @files_to_check = ($filename);
  unshift @files_to_check, "$ENV{HOME}/$filename" if $ENV{HOME};
  push @files_to_check, $ENV{APP_SMOLDER_REPORT_CONF}
    if $ENV{APP_SMOLDER_REPORT_CONF};
  
  foreach my $file (@files_to_check) {
    $self->_merge_cfg_file($file);
  }
  
  return;
}

sub _merge_cfg_file {
  my ($self, $file) = @_;
  
  my $cfg = $self->_read_cfg_file($file);
  return unless $cfg;
  
  $self->_merge_cfg_hash($cfg);
  
  if (%$cfg) {
    my @bad_keys = sort keys %$cfg;
    $self->_fatal("Invalid configuration keys in $file:", @bad_keys);
  }
  
  return;
}

sub _read_cfg_file {
  my ($self, $file) = @_;
  my %cfg;
  local $_;
  
  open(my $fh, '<', $file) || return;
  while (<$fh>) {
    s/^\s+|\s+$//g;
    next if /^(#.*)?$/;
    
    if (/^(\S+)\s*=\s*(["'])(.*)\2$/) {
      $cfg{$1} = $3;
    }
    elsif (/^(\S+)\s*=\s*(.+)$/) {



( run in 1.818 second using v1.01-cache-2.11-cpan-b16cb0d3907 )