Mercurial > repos > cpt > cpt_psm_comparison_table
comparison lib/CPT/GalaxyGetOpt.pm @ 1:f093e08f21f3 draft default tip
planemo upload commit 94b0cd1fff0826c6db3e7dc0c91c0c5a8be8bb0c
| author | cpt |
|---|---|
| date | Mon, 05 Jun 2023 02:47:24 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:b8b8b52904a5 | 1:f093e08f21f3 |
|---|---|
| 1 package CPT::GalaxyGetOpt; | |
| 2 use CPT::ParameterGroup; | |
| 3 use autodie; | |
| 4 use File::Spec::Functions qw[ catfile catdir ]; | |
| 5 use Carp; | |
| 6 no warnings; | |
| 7 use Moose; | |
| 8 | |
| 9 has 'appdesc' => ( is => 'rw', isa => 'Str', default => sub { 'No application description provided' } ); | |
| 10 has 'appid' => ( is => 'rw', isa => 'Str', default => sub { "unknown_app_$0" } ); | |
| 11 has 'appname' => ( is => 'rw', isa => 'Str', default => sub { "Unnamed application $0"} ); | |
| 12 has 'appvers' => ( is => 'rw', isa => 'Str', default => sub { '0.0.1' } ); | |
| 13 has 'registered_outputs' => ( is => 'rw', isa => 'HashRef' ); | |
| 14 has 'opt' => ( is => 'rw', isa => 'Any'); | |
| 15 has filetype_detector => ( | |
| 16 is => 'rw', | |
| 17 isa => 'Any', | |
| 18 ); | |
| 19 | |
| 20 | |
| 21 sub getOptions { | |
| 22 my ( $self, %passed_opts ) = @_; | |
| 23 require Getopt::Long::Descriptive; | |
| 24 # these get pushed through, thankfully. This way we can manually check for --genenrate_galaxy_export and exit slightly earlier. | |
| 25 my %args = map { $_ => 1 } @ARGV; | |
| 26 # Sections passed to us | |
| 27 my @script_args = @{ $passed_opts{'options'} }; | |
| 28 my %defaults = @{ $passed_opts{'defaults'} }; | |
| 29 | |
| 30 | |
| 31 | |
| 32 # Output Files Stuff | |
| 33 my @getopt_formatted_outputs; | |
| 34 my %outputs; | |
| 35 # This is originally an array of output files. We transform to a hash for | |
| 36 # easier lookup | |
| 37 foreach(@{$passed_opts{'outputs'}}){ | |
| 38 # Grab name/desc/opts | |
| 39 my ($name, $desc, $opts) = @{$_}; | |
| 40 $outputs{$name} = { | |
| 41 description => $desc, | |
| 42 options => $opts, | |
| 43 required => 1, | |
| 44 }; | |
| 45 my %tmp_opts_fix = %{$opts}; | |
| 46 $tmp_opts_fix{required} = 1; | |
| 47 $tmp_opts_fix{validate} = 'File/Output'; | |
| 48 push(@getopt_formatted_outputs, [$name, $desc, \%tmp_opts_fix]); | |
| 49 | |
| 50 # Adds the {name}_files_path special parameter | |
| 51 my %fp_opts = %{$opts}; | |
| 52 $fp_opts{hidden} = 1; | |
| 53 $fp_opts{value} = "${name}.files_path"; | |
| 54 $fp_opts{default} = "${name}.files_path"; | |
| 55 $fp_opts{required} = 1; | |
| 56 $fp_opts{_galaxy_specific} = 1; | |
| 57 $fp_opts{validate} = "String"; | |
| 58 #$fp_opts{_show_in_galaxy} = 0; | |
| 59 my $desc2 = "Associated HTML files for $name"; | |
| 60 my $name2 = "${name}_files_path"; | |
| 61 my @files_path = ($name2, $desc2, \%fp_opts); | |
| 62 push(@getopt_formatted_outputs, \@files_path); | |
| 63 | |
| 64 # Adds the {name}_format special parameter | |
| 65 my %fp_opts3 = %{$opts}; | |
| 66 #$fp_opts3{hidden} = 1; | |
| 67 $fp_opts3{default} = $fp_opts3{"default_format"}; | |
| 68 $fp_opts3{validate} = "File/OutputFormat"; | |
| 69 $fp_opts{required} = 1; | |
| 70 #$fp_opts3{_galaxy_specific} = 1; | |
| 71 #$fp_opts3{_show_in_galaxy} = 0; | |
| 72 my $desc3 = "Associated Format for $name"; | |
| 73 my $name3 = "${name}_format"; | |
| 74 my @files_path3 = ($name3, $desc3, \%fp_opts3); | |
| 75 push(@getopt_formatted_outputs, \@files_path3); | |
| 76 | |
| 77 # Adds the {name}_files_path special parameter | |
| 78 my %fp_opts4 = %{$opts}; | |
| 79 $fp_opts4{hidden} = 1; | |
| 80 $fp_opts4{value} = "${name}.id"; | |
| 81 $fp_opts4{default} = "${name}.id"; | |
| 82 $fp_opts4{validate} = "String"; | |
| 83 $fp_opts4{_galaxy_specific} = 1; | |
| 84 #$fp_opts4{_show_in_galaxy} = 0; | |
| 85 my $desc4 = "Associated ID Number for $name"; | |
| 86 my $name4 = "${name}_id"; | |
| 87 my @files_path4 = ($name4, $desc4, \%fp_opts4); | |
| 88 push(@getopt_formatted_outputs, \@files_path4); | |
| 89 | |
| 90 } | |
| 91 $self->registered_outputs(\%outputs); | |
| 92 | |
| 93 | |
| 94 # Store the application's name and description | |
| 95 if($defaults{appdesc}){ | |
| 96 $self->appdesc($defaults{appdesc}); | |
| 97 } | |
| 98 if($defaults{appid}){ | |
| 99 $self->appid($defaults{appid}); | |
| 100 } | |
| 101 if($defaults{appname}){ | |
| 102 $self->appname($defaults{appname}); | |
| 103 } | |
| 104 if($defaults{appvers}){ | |
| 105 $self->appvers($defaults{appvers}); | |
| 106 } | |
| 107 | |
| 108 my $usage_desc; | |
| 109 if ( $self->appname() && $self->appdesc() ) { | |
| 110 $usage_desc = sprintf( "%s: %s\n%s [options] <some-arg>", $self->appname(), $self->appdesc(), $0 ); | |
| 111 } | |
| 112 | |
| 113 # Individual parameter parsers | |
| 114 require CPT::Parameter; | |
| 115 # Which are stored in a collection of them | |
| 116 require CPT::ParameterCollection; | |
| 117 | |
| 118 | |
| 119 my $parameterCollection = CPT::ParameterCollection->new(); | |
| 120 | |
| 121 $parameterCollection->push_params( | |
| 122 [ | |
| 123 #['Standard Options'], | |
| 124 #@extra_params, | |
| 125 #[], | |
| 126 ['outfile_supporting' , 'File or folder to output to, necessary when (class == Report || multiple calls to classyReturnResults || multiple standalone output files)' , { hidden => 1, validate => 'String', default => '__new_file_path__', _galaxy_specific => 1, _show_in_galaxy => 0 }], | |
| 127 ['galaxy' , 'Run with galaxy-specific overrides' , {validate => 'Flag' , hidden=>1, _galaxy_specific => 1, _show_in_galaxy => 0}], | |
| 128 ['generate_galaxy_xml' , 'Generate a compatible galaxy-xml file. May need editing' , {validate => 'Flag' , hidden=>1, _galaxy_specific => 1, _show_in_galaxy => 0}], | |
| 129 [], | |
| 130 ['Script Options'], | |
| 131 ] | |
| 132 ); | |
| 133 | |
| 134 # If there's a default specified, we should apply that. | |
| 135 foreach (@script_args) { | |
| 136 # If it's an array, push as is, because either it's old style/label/empty | |
| 137 # However, this doesn't allow setting defaults for things that aren't parameters | |
| 138 # and it won't set defaults for old style | |
| 139 if ( ref $_ eq 'ARRAY' ) { | |
| 140 $parameterCollection->push_param($_); | |
| 141 }elsif( ref $_ eq 'HASH'){ | |
| 142 my $pG = CPT::ParameterGroup->new(); | |
| 143 $pG->set_data($_); | |
| 144 $parameterCollection->push_group($pG); | |
| 145 } | |
| 146 } | |
| 147 | |
| 148 # Our magic output files stuff | |
| 149 $parameterCollection->push_params( | |
| 150 [ | |
| 151 [], | |
| 152 ['Output Files'], | |
| 153 @getopt_formatted_outputs, | |
| 154 ] | |
| 155 ); | |
| 156 | |
| 157 # Other standard options like verbosity/version/etc | |
| 158 $parameterCollection->push_params( | |
| 159 [ | |
| 160 [], | |
| 161 ['Other Standard Options'], | |
| 162 ['verbose|v', 'Be more verbose', {validate => 'Flag', _show_in_galaxy => 0}], | |
| 163 ['version', 'Print version information', {validate => 'Flag', _show_in_galaxy => 0}], | |
| 164 ['help', 'Print usage message and exit', {validate => 'Flag', _show_in_galaxy => 0}], | |
| 165 ], | |
| 166 ); | |
| 167 | |
| 168 # If we want the galaxy_xml, do that before the reduction step is called. | |
| 169 if ( $args{'--version'} ) { | |
| 170 print $self->appvers() . "\n"; | |
| 171 exit 1; | |
| 172 } | |
| 173 | |
| 174 # If we want the galaxy_xml, do that before the reduction step is called. | |
| 175 if ( $args{'--generate_galaxy_xml'} ) { | |
| 176 require CPT::Galaxy; | |
| 177 my $galaxy_xml_generator = CPT::Galaxy->new(); | |
| 178 $galaxy_xml_generator->gen( | |
| 179 full_options => $parameterCollection, | |
| 180 appdesc => $self->appdesc(), | |
| 181 appid => $self->appid(), | |
| 182 appname => $self->appname(), | |
| 183 appvers => $self->appvers(), | |
| 184 defaults => $passed_opts{'defaults'}, | |
| 185 outputs => $passed_opts{'outputs'}, | |
| 186 tests => $passed_opts{'tests'}, | |
| 187 ); | |
| 188 exit 1; | |
| 189 } | |
| 190 | |
| 191 if( $args{'--gen_test'} ){ | |
| 192 require CPT::GenerateTests; | |
| 193 my $tgen = CPT::GenerateTests->new(); | |
| 194 if(defined $passed_opts{'tests'}){ | |
| 195 print $tgen->gen(@{$passed_opts{'tests'}}); | |
| 196 }else{ | |
| 197 print $tgen->gen_empty(); | |
| 198 } | |
| 199 exit 0; | |
| 200 } | |
| 201 | |
| 202 # Now that the options_spec is complete, we reduce to something getopt will be happy with | |
| 203 my @getopt_spec = $parameterCollection->getopt(); | |
| 204 #print STDERR Dumper \@getopt_spec; | |
| 205 #exit 1; | |
| 206 | |
| 207 # It would be nice if there was a way to ensure that it didn't die here... | |
| 208 # Execute getopt | |
| 209 my ( $local_opt, $usage ) = Getopt::Long::Descriptive::describe_options( $usage_desc, @getopt_spec ); | |
| 210 $self->opt($local_opt); | |
| 211 | |
| 212 # Now that we've gotten the user's options, we need to copy their values back to our ParameterCollection | |
| 213 $parameterCollection->populate_from_getopt($self->opt()); | |
| 214 | |
| 215 # If they want help, print + exit | |
| 216 if ( $self->opt && $self->opt->help ) { | |
| 217 print $usage; | |
| 218 exit 1; | |
| 219 } | |
| 220 # Validate their choices | |
| 221 if ( $parameterCollection->validate($self->opt) ) { | |
| 222 return $self->opt; | |
| 223 # Easy access for the script, don't want them to have to deal with PC (just yet) | |
| 224 } | |
| 225 else { | |
| 226 # Some params failed to validate, so we die. | |
| 227 croak "Validation errors were found so cannot continue"; | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 no Moose; | |
| 232 1; | |
| 233 | |
| 234 __END__ | |
| 235 | |
| 236 =pod | |
| 237 | |
| 238 =encoding UTF-8 | |
| 239 | |
| 240 =head1 NAME | |
| 241 | |
| 242 CPT::GalaxyGetOpt | |
| 243 | |
| 244 =head1 VERSION | |
| 245 | |
| 246 version 1.99.4 | |
| 247 | |
| 248 =head2 getOptions | |
| 249 | |
| 250 my $ggo = CPT::GalaxyGetOpt->new(); | |
| 251 my $options = $ggo->getOptions( | |
| 252 'options' => [ | |
| 253 [ 'file', 'Input file', { validate => 'File/Input' } ], | |
| 254 [ | |
| 255 "option" => "Select an option!", | |
| 256 { | |
| 257 validate => 'Option', | |
| 258 options => \%options, | |
| 259 multiple => 1, | |
| 260 } | |
| 261 ], | |
| 262 [ | |
| 263 "float" => "I'm a float", | |
| 264 { validate => 'Float' } | |
| 265 ], | |
| 266 [ | |
| 267 "int" => "I'm an int", | |
| 268 { validate => 'Int', default => [42, 34], required => 1, multiple => 1 } | |
| 269 ], | |
| 270 [], | |
| 271 ['New section'], | |
| 272 [ | |
| 273 "string" => "I'm a simple string", | |
| 274 { validate => 'String' } | |
| 275 ], | |
| 276 [ | |
| 277 'flag' => 'This is a flag', | |
| 278 { validate => 'Flag' } | |
| 279 ], | |
| 280 ], | |
| 281 'outputs' => [ | |
| 282 [ | |
| 283 'my_output_data', | |
| 284 'Output TXT File', | |
| 285 { | |
| 286 validate => 'File/Output', | |
| 287 required => 1, | |
| 288 default => 'out', | |
| 289 data_format => 'text/plain', | |
| 290 default_format => 'TXT', | |
| 291 } | |
| 292 ], | |
| 293 ], | |
| 294 'defaults' => [ | |
| 295 'appid' => 'TemplateScript', | |
| 296 'appname' => 'Template', | |
| 297 'appdesc' => 'A basic template for a new CPT application', | |
| 298 'appvers' => '1.94', | |
| 299 ], | |
| 300 'tests' => [ | |
| 301 { | |
| 302 test_name => "Default", | |
| 303 params => { | |
| 304 }, | |
| 305 outputs => { | |
| 306 'my_output_data' => ["out.txt", 'test-data/outputs/template.default.txt' ], | |
| 307 }, | |
| 308 }, | |
| 309 { | |
| 310 test_name => "Option A specified", | |
| 311 params => { | |
| 312 'int', '10000', | |
| 313 }, | |
| 314 outputs => { | |
| 315 'my_output_data' => ["out.txt", 'test-data/outputs/template.A.txt' ], | |
| 316 }, | |
| 317 }, | |
| 318 ], | |
| 319 ); | |
| 320 | |
| 321 my @data; | |
| 322 foreach(qw(file int string option float flag)){ | |
| 323 # Create a 2D array of all of our optoins | |
| 324 push(@data, [ $_, $options->{$_}]); | |
| 325 } | |
| 326 | |
| 327 my %table = ( | |
| 328 'Sheet1' => { | |
| 329 header => [qw(Key Value)], | |
| 330 data => \@data, | |
| 331 } | |
| 332 ); | |
| 333 | |
| 334 # And store it to file! | |
| 335 use CPT::OutputFiles; | |
| 336 my $crr_output = CPT::OutputFiles->new( | |
| 337 name => 'my_output_data', | |
| 338 GGO => $ggo, | |
| 339 ); | |
| 340 $crr_output->CRR(data => \%table); | |
| 341 | |
| 342 Gets command line options, and prints docs. Very convenient, removes the burden of writing any Getopt code from you. | |
| 343 | |
| 344 =head3 Default Options Provided | |
| 345 | |
| 346 =over 4 | |
| 347 | |
| 348 =item * | |
| 349 | |
| 350 help, man - cause an early exit and printing of the POD for your script. | |
| 351 | |
| 352 =item * | |
| 353 | |
| 354 verbose - flag to make the script verbose. Will print everything that is sent to returnResults. Individual scripts should take advantage of this option | |
| 355 | |
| 356 =back | |
| 357 | |
| 358 =head3 Advanced Options Provided | |
| 359 | |
| 360 =over 4 | |
| 361 | |
| 362 =item C<--generate_galaxy_xml> | |
| 363 | |
| 364 Generates valid XML for the tool for use in Galaxy | |
| 365 | |
| 366 =item C<--gen_test> | |
| 367 | |
| 368 Generates code to test the script using specified test data | |
| 369 | |
| 370 =back | |
| 371 | |
| 372 =head1 AUTHOR | |
| 373 | |
| 374 Eric Rasche <rasche.eric@yandex.ru> | |
| 375 | |
| 376 =head1 COPYRIGHT AND LICENSE | |
| 377 | |
| 378 This software is Copyright (c) 2014 by Eric Rasche. | |
| 379 | |
| 380 This is free software, licensed under: | |
| 381 | |
| 382 The GNU General Public License, Version 3, June 2007 | |
| 383 | |
| 384 =cut |
