Bio-Gonzales

 view release on metacpan or  search on metacpan

lib/Bio/Gonzales/Project.pm  view on Meta::CPAN

package Bio::Gonzales::Project;

use Mouse;

use warnings;
use strict;
use Carp;
use FindBin;
use File::Spec;
use Bio::Gonzales::Util::File qw/slurpc/;
use Bio::Gonzales::Util::Cerial;
use Bio::Gonzales::Util::Development::File;
use Data::Visitor::Callback;
use Bio::Gonzales::Util::Log;
use Data::Printer;
use POSIX;

use 5.010;

our $VERSION = '0.0546'; # VERSION

has 'analysis_version' => ( is => 'rw', builder    => '_build_analysis_version' );
has '_substitute_conf' => ( is => 'rw', lazy_build => 1 );
has 'config'           => ( is => 'rw', lazy_build => 1 );
has 'log'              => ( is => 'rw', builder    => '_build_log' );

sub _build_analysis_version {
  my ($self) = @_;

  if ( $ENV{ANALYSIS_VERSION} ) {
    return $ENV{ANALYSIS_VERSION};
  } elsif ( -f 'av' ) {
    return ( slurpc('av') )[0];
  } else {
    carp "using current dir as output dir";
    return '.';
  }
}

sub _build__substitute_conf {
  my ($self) = @_;

  my %subs = (
    av      => sub { return $self->analysis_version },
    path_to => sub { return $self->path_to(@_) },
    data    => sub { return $self->path_to('data') },
  );

  return Data::Visitor::Callback->new(
    plain_value => sub {
      return unless defined $_;
      $_ =~ s{ ^ ~ ( [^/]* ) }
            { $1
                ? (getpwnam($1))[7]
                : ( $ENV{HOME} || (getpwuid($>))[7] )
            }ex;

      my $subsre = join "|", keys %subs;
      s{__($subsre)(?:\((.+?)\))?__}{ $subs{ $1 }->( $2 ? split( /,/, $2 ) : () ) }eg;
    }
  );
}

sub _build_log {
  my ($self) = @_;

  return Bio::Gonzales::Util::Log->new(
    path      => $self->_nfi('gonz.log'),
    level     => 'info',
    namespace => $FindBin::Script
  );
}

sub _build_config {
  my ($self) = @_;

  my $data;
  if ( -f 'gonz.conf.yml' ) {
    $data = yslurp('gonz.conf.yml');
  } elsif ( -f 'gonzconf.yml' ) {
    $data = yslurp('gonzconf.yml');
  } elsif ( -f 'iof.yml' ) {
    $data = yslurp('iof.yml');
  } elsif ( -f 'io_files.yml' ) {
    $data = thaw_file('io_files.yml');
  } elsif ( -f 'iof.json' ) {
    $data = jslurp('iof.json');
  } else {
    confess "io file not found";
  }
  $self->_substitute_conf->visit($data);
  return $data;
}

sub BUILD {
  my ($self) = @_;

  my $av = $self->analysis_version;
  unless ( $av && $av =~ /^[-A-Za-z_.0-9]+$/ ) {
    carp "analysis version not or not correctly specified, variable contains: " . ( $av // 'nothing' );
    carp "using current dir as output dir";
    $self->analysis_version('.');
  } else {
    mkdir $av unless ( -d $av );
  }

  $self->log->info("invoked")    # if a script is run, log it
    if ( !$ENV{GONZLOG_SILENT} );
}

sub av { shift->analysis_version(@_) }

sub c { shift->conf(@_) }

sub nfi {



( run in 1.753 second using v1.01-cache-2.11-cpan-99c4e6809bf )