Bio::EnsEMBL::Utils
ConfParser
Toolbar
Summary
Bio::EnsEMBL::Utils::ConfParser - configuration parser for perl scripts
Package variables
No package variables defined.
Included modules
Cwd qw ( abs_path )
Getopt::Long
Pod::Usage qw ( pod2usage )
Text::Wrap
Synopsis
my $conf = new Bio::EnsEMBL::Utils::ConfParser(
-SERVERROOT => "/path/to/ensembl",
-DEFAULT_CONF => "my.default.conf"
);
# parse options from configuration file and commandline
$conf->parse_options(
'mandatory_string_opt=s' => 1,
'optional_numeric_opt=n' => 0,
);
# get a paramter value
my $val = $conf->param('manadatory_string_op');
Description
This module parses a configuration file and the commandline options
passed to a script (the latter superseed the former). Configuration
files contain ini-file style name-value pairs, and the commandline
options are passed to Getopt::Long for parsing.
The parameter values are consequently accessible via the param()
method. You can also create a commandline string of all current
parameters and their values to pass to another script.
Methods
Methods description
Arg[1..n] : list of parameter names to parse Example : $conf->comma_to_list('chromosomes'); Description : Transparently converts comma-separated lists into arrays (to allow different styles of commandline options, see perldoc Getopt::Long for details). Parameters are converted in place (accessible through $self->param('name')). Return type : true on success Exceptions : none Caller : general Status : At Risk : under development |
Example : $conf->confirm_params; Description : If the script is run with the --interactive switch, this method prints a table of all parameters and their values and asks user to confirm if he wants to proceed. Return type : true on success Exceptions : none Caller : parse_options() Status : At Risk : under development |
Arg[1..n] : param/value pairs which should be added to or override the currently defined parameters Example : $conf->create_commandline_options( 'dbname' => 'homo_sapiens_vega_33_35e', 'interactive' => 0 ); Description : Creates a commandline options string of all current paramters that can be passed to another script. Return type : String - commandline options string Exceptions : none Caller : general Status : At Risk : under development |
Arg[1] : (optional) String - default configuration file Example : $conf->default_conf('my.default.conf'); Description : Getter/setter for the default configuration file. Return type : String Exceptions : none Caller : new(), general Status : At Risk : under development |
Arg[1] : Parameter name Example : unless ($conf->is_true('upload')) { print "Won't upload data.\n"; next; } Description : Checks whether a param value is set to 'true', which is defined here as TRUE (in the Perl sense) but not the string 'no'. Return type : Boolean Exceptions : thrown if no parameter name is supplied Caller : general Status : At Risk : under development |
Arg[1] : Name of parameter to parse Example : $conf->list_or_file('gene_stable_id'); Description : Determines whether a parameter holds a list or it is a filename to read the list entries from. Return type : true on success Exceptions : thrown if list file can't be opened Caller : general Status : At Risk : under development |
Example : print LOG $conf->list_param_values; Description : prints a table of the parameters used in the script Return type : String - the table to print Exceptions : none Caller : general Status : At Risk : under development |
Example : print "Current parameter names:\n"; foreach my $param (@{ $conf->list_params }) { print " $param\n"; } Description : Returns a list of the currently available parameter names. The list will be in the same order as option definitions were passed to the new() method. Return type : Arrayref of parameter names Exceptions : none Caller : list_param_values(), create_commandline_options() Status : At Risk : under development |
Arg [SERVERROOT] : String $serverroot - root directory of your ensembl code Arg [DEFAULT_CONF] : String $default_conf - default configuration file Example : my $conf = new Bio::EnsEMBL::Utils::ConfParser( -SERVERROOT => '/path/to/ensembl', -DEFAULT_CONF => 'my.default.conf' ); Description : object constructor Return type : Bio::EnsEMBL::Utils::ConfParser object Exceptions : thrown if no serverroot is provided Caller : general Status : At Risk : under development |
Arg[1] : Parameter name Arg[2..n] : (optional) List of values to set Example : # getter my $dbname = $conf->param('dbname');
# setter
$conf->param('port', 3306);
$conf->param('chromosomes', 1, 6, 'X');
Description : Getter/setter for parameters. Accepts single-value params and
list params.
Return type : Scalar value for single-value parameters, array of values for
list parameters
Exceptions : thrown if no parameter name is supplied
Caller : general
Status : At Risk
: under development |
Arg[1..n] : pairs of option definitions and mandatory flag (see below for details) Example : $conf->parse_options( 'mandatory_string_opt=s' => 1, 'optional_numeric_opt=n' => 0, ); Description : This method reads options from an (optional) configuration file and parses the commandline options supplied by the user. Commandline options will superseed config file settings. The string "$SERVERROOT" in the configuration entries will be replaced by the appropriate value.
The arguments passed to this method are pairs of a Getopt::Long
style option definition (in fact it will be passed to
GetOptions() directly) and a flag indicating whether this
option is mandatory (1) or optional (0).
In addition to these user-defined options, a set of common
options is always parsed. See _common_options() for details.
If you run your script with --interactive the user will be
asked to confirm the parameters after parsing.
All parameters will then be accessible via $self->param('name').
Return type : true on success
Exceptions : thrown if configuration file can't be opened
thrown on missing mandatory parameters
Caller : general
Status : At Risk
: under development |
Arg[1] : (optional) String - root directory of your ensembl checkout Example : my $serverroot = $conf->serverroot; Description : Getter/setter for the root directory of your ensembl checkout. Return type : String Exceptions : none Caller : new(), general Status : At Risk : under development |
Methods code
_common_options | description | prev | next | Top |
sub _common_options
{ my $self = shift;
return (
'conffile|conf=s' => 0,
'logfile|log=s' => 0,
'logauto!' => 0,
'logautobase=s' => 0,
'logautoid=s' => 0,
'logpath=s' => 0,
'logappend|log_append|log-append!' => 0,
'loglevel=s' => 0,
'is_component|is-component!' => 0,
'interactive|i!' => 0,
'dry_run|dry-run|dry|n!' => 0,
'help|h|?' => 0,
); } |
sub comma_to_list
{ my $self = shift;
foreach my $param (@_) {
$self->param($param, split (/,/, join (',', $self->param($param))));
}
return(1); } |
sub confirm_params
{ my $self = shift;
if ($self->param('interactive')) {
print "Running script with these parameters:\n\n";
print $self->list_param_values;
exit unless user_proceed("Continue?", 1, 'n');
}
return(1); } |
sub create_commandline_options
{ my ($self, %replace) = @_;
my %param_hash;
foreach my $param (@{ $self->list_params }) {
my ($first, @rest) = $self->param($param);
next unless (defined($first));
if (@rest) {
$first = join(",", $first, @rest);
}
$param_hash{$param} = $first;
}
foreach my $key (keys %replace) {
$param_hash{$key} = $replace{$key};
}
my $options_string;
foreach my $param (keys %param_hash) {
my $val = $param_hash{$param};
if ($self->{'_flag_params'}->{$param}) {
$param = 'no'.$param unless ($val);
$val = undef;
} else {
next unless (defined($val));
if ($val =~ /\s+/) {
($val =~ /'/) ? ($val = qq("$val")) : ($val = qq('$val'));
}
}
$options_string .= sprintf(qq(--%s %s ), $param, $val);
}
return $options_string; } |
sub default_conf
{ my $self = shift;
$self->{'_default_conf'} = shift if (@_);
return $self->{'_default_conf'};
}
1; } |
sub is_true
{ my $self = shift;
my $name = shift or throw("You must supply a parameter name");
my $param = $self->param($name);
if ($param and !($param =~ /^no$/i)) {
return(1);
} else {
return(0);
} } |
sub list_or_file
{ my ($self, $param) = @_;
my @vals = $self->param($param);
return unless (@vals);
my $firstval = $vals[0];
if (scalar(@vals) == 1 && -e $firstval) {
@vals = ();
open(IN, $firstval) or throw("Cannot open $firstval for reading: $!");
while(<IN>){
chomp;
push(@vals, $_);
}
close(IN);
$self->param($param, @vals);
}
$self->comma_to_list($param);
return(1); } |
sub list_param_values
{ my $self = shift;
$Text::Wrap::colums = 72;
my $txt = sprintf " %-20s%-40s\n", qw(PARAMETER VALUE);
$txt .= " " . "-"x70 . "\n";
foreach my $key (@{ $self->list_params }) {
my $val;
if (defined($self->param($key))) {
$txt .= Text::Wrap::wrap(sprintf(' %-19s ', $key), ' 'x24,
join(", ", $self->param($key)))."\n";
}
}
$txt .= "\n";
return $txt; } |
sub list_params
{ my $self = shift;
return $self->{'_ordered_params'} || []; } |
sub new
{ my $caller = shift;
my $class = ref($caller) || $caller;
my ($serverroot, $default_conf) =
rearrange([qw(SERVERROOT DEFAULT_CONF)], @_);
throw("You must supply a serverroot.") unless ($serverroot);
my $self = {};
bless ($self, $class);
$self->serverroot($serverroot);
$self->default_conf($default_conf || "$ENV{HOME}/.ensembl_script.conf");
return $self; } |
sub param
{ my $self = shift;
my $name = shift or throw("You must supply a parameter name");
if (@_) {
if (scalar(@_) == 1) {
$self->{'_param'}->{$name} = shift;
} else {
undef $self->{'_param'}->{$name};
@{ $self->{'_param'}->{$name} } = @_;
}
}
if (ref($self->{'_param'}->{$name}) eq 'ARRAY') {
return @{ $self->{'_param'}->{$name} };
} elsif (defined($self->{'_param'}->{$name})) {
return $self->{'_param'}->{$name};
} else {
return undef;
} } |
sub parse_options
{ my ($self, @params) = @_;
push @params, $self->_common_options;
my %h;
my %params = @params;
Getopt::Long::Configure('pass_through');
&GetOptions(\%h, keys %params);
my $conffile = $h{'conffile'} || $self->default_conf;
$conffile = abs_path($conffile);
if (-e $conffile) {
open(CONF, $conffile) or throw(
"Unable to open configuration file $conffile for reading: $!");
my $serverroot = $self->serverroot;
my $last;
while (my $line = <CONF>) {
chomp $line;
$line =~ s/^\s*//;
$line =~ s/\s*$//;
$line = $last . $line;
if ($line =~ /\\$/) {
$line =~ s/\\$//;
$last = $line;
next;
} else {
$last = undef;
}
$line =~ s/^[#;].*//;
$line =~ s/\s+[;].*$//;
next unless ($line =~ /(\w\S*)\s*=\s*(.*)/);
my $name = $1;
my $val = $2;
$val =~ s/^["'](.*)["']/$1/;
if ($val =~ /\$SERVERROOT/) {
$val =~ s/\$SERVERROOT/$serverroot/g;
$val = abs_path($val);
}
$self->param($name, $val);
}
$self->param('conffile', $conffile);
}
map { $self->param($_, $h{$_}) } keys %h;
my @missing = ();
my $i = 0;
foreach my $param (@params) {
next if ($i++ % 2);
my $required = $params{$param};
my ($list, $flag);
$list = 1 if ($param =~ /\@$/);
$flag = 1 if ($param =~ /!$/);
$param =~ s/(^\w+).*/$1/;
$self->comma_to_list($param) if ($list);
push @missing, $param if ($required and !$self->param($param));
push @{ $self->{'_ordered_params'} }, $param;
$self->{'_flag_params'}->{$param} = 1 if ($flag);
}
if (@missing) {
throw("Missing parameters: @missing.\nYou must specify them on the commandline or in your conffile.\n");
}
pod2usage(1) if ($self->param('help'));
$self->confirm_params;
return(1);
}
} |
sub serverroot
{ my $self = shift;
$self->{'_serverroot'} = shift if (@_);
return $self->{'_serverroot'}; } |
General documentation
Copyright (c) 1999-2009 The European Bioinformatics Institute and
Genome Research Limited. All rights reserved.
This software is distributed under a modified Apache license.
For license details, please see
/info/about/code_licence.html