Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
add getopt function to Mojo::Util
  • Loading branch information
kraih committed Nov 1, 2016
1 parent 86b822a commit d9ccbf6
Show file tree
Hide file tree
Showing 14 changed files with 68 additions and 47 deletions.
3 changes: 2 additions & 1 deletion Changes
@@ -1,5 +1,6 @@

7.10 2016-10-23
7.10 2016-11-01
- Added getopt function to Mojo::Util.

7.09 2016-10-22
- Added every_header method to Mojo::Headers.
Expand Down
25 changes: 24 additions & 1 deletion lib/Mojo/Util.pm
Expand Up @@ -8,6 +8,7 @@ use Digest::SHA qw(hmac_sha1_hex sha1 sha1_hex);
use Encode 'find_encoding';
use Exporter 'import';
use File::Find 'find';
use Getopt::Long 'GetOptionsFromArray';
use IO::Poll qw(POLLIN POLLPRI);
use List::Util 'min';
use MIME::Base64 qw(decode_base64 encode_base64);
Expand Down Expand Up @@ -55,7 +56,7 @@ my %CACHE;

our @EXPORT_OK = (
qw(b64_decode b64_encode camelize class_to_file class_to_path decamelize),
qw(decode deprecated dumper encode files hmac_sha1_sum html_unescape),
qw(decode deprecated dumper encode files getopt hmac_sha1_sum html_unescape),
qw(md5_bytes md5_sum monkey_patch punycode_decode punycode_encode quote),
qw(secure_compare sha1_bytes sha1_sum slurp split_cookie_header),
qw(split_header spurt steady_time tablify term_escape trim unindent unquote),
Expand Down Expand Up @@ -138,6 +139,13 @@ sub files {
return sort keys %files;
}

sub getopt {
my $opts = ref $_[1] eq 'ARRAY' ? splice @_, 1, 1 : [];
my $save = Getopt::Long::Configure(qw(no_auto_abbrev no_ignore_case), @$opts);
GetOptionsFromArray shift, @_;
Getopt::Long::Configure($save);
}

sub html_unescape {
my $str = shift;
$str
Expand Down Expand Up @@ -592,6 +600,21 @@ Include hidden files and directories.
=back
=head2 getopt
getopt $array,
'H|headers=s' => \my @headers,
't|timeout=i' => \my $timeout,
'v|verbose' => \my $verbose;
getopt $array, ['pass_through'],
'H|headers=s' => \my @headers,
't|timeout=i' => \my $timeout,
'v|verbose' => \my $verbose;
Extract options from an array reference with L<Getopt::Long>, but without
changing its global configuration. The configuration options C<no_auto_abbrev>
and C<no_ignore_case> are enabled by default.
=head2 hmac_sha1_sum
my $checksum = hmac_sha1_sum $bytes, 'passw0rd';
Expand Down
4 changes: 2 additions & 2 deletions lib/Mojolicious/Command/cgi.pm
@@ -1,15 +1,15 @@
package Mojolicious::Command::cgi;
use Mojo::Base 'Mojolicious::Command';

use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::Server::CGI;
use Mojo::Util 'getopt';

has description => 'Start application with CGI';
has usage => sub { shift->extract_usage };

sub run {
my ($self, @args) = @_;
GetOptionsFromArray \@args, nph => \(my $nph = 0);
getopt \@args, nph => \(my $nph = 0);
Mojo::Server::CGI->new(app => $self->app, nph => $nph)->run;
}

Expand Down
4 changes: 2 additions & 2 deletions lib/Mojolicious/Command/cpanify.pm
Expand Up @@ -2,15 +2,15 @@ package Mojolicious::Command::cpanify;
use Mojo::Base 'Mojolicious::Command';

use File::Basename 'basename';
use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::Util 'getopt';

has description => 'Upload distribution to CPAN';
has usage => sub { shift->extract_usage };

sub run {
my ($self, @args) = @_;

GetOptionsFromArray \@args,
getopt \@args,
'p|password=s' => \(my $password = ''),
'u|user=s' => \(my $user = '');
die $self->usage unless my $file = shift @args;
Expand Down
4 changes: 2 additions & 2 deletions lib/Mojolicious/Command/daemon.pm
@@ -1,8 +1,8 @@
package Mojolicious::Command::daemon;
use Mojo::Base 'Mojolicious::Command';

use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::Server::Daemon;
use Mojo::Util 'getopt';

has description => 'Start application with HTTP and WebSocket server';
has usage => sub { shift->extract_usage };
Expand All @@ -11,7 +11,7 @@ sub run {
my ($self, @args) = @_;

my $daemon = Mojo::Server::Daemon->new(app => $self->app);
GetOptionsFromArray \@args,
getopt \@args,
'b|backlog=i' => sub { $daemon->backlog($_[1]) },
'c|clients=i' => sub { $daemon->max_clients($_[1]) },
'i|inactivity-timeout=i' => sub { $daemon->inactivity_timeout($_[1]) },
Expand Down
4 changes: 2 additions & 2 deletions lib/Mojolicious/Command/eval.pm
@@ -1,15 +1,15 @@
package Mojolicious::Command::eval;
use Mojo::Base 'Mojolicious::Command';

use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::Util 'getopt';

has description => 'Run code against application';
has usage => sub { shift->extract_usage };

sub run {
my ($self, @args) = @_;

GetOptionsFromArray \@args, 'v|verbose' => \my $v1, 'V' => \my $v2;
getopt \@args, 'v|verbose' => \my $v1, 'V' => \my $v2;
my $code = shift @args || '';

# Run code against application
Expand Down
5 changes: 2 additions & 3 deletions lib/Mojolicious/Command/get.pm
@@ -1,13 +1,12 @@
package Mojolicious::Command::get;
use Mojo::Base 'Mojolicious::Command';

use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::DOM;
use Mojo::IOLoop;
use Mojo::JSON qw(encode_json j);
use Mojo::JSON::Pointer;
use Mojo::UserAgent;
use Mojo::Util qw(decode encode);
use Mojo::Util qw(getopt decode encode);
use Scalar::Util 'weaken';

has description => 'Perform HTTP request';
Expand All @@ -16,7 +15,7 @@ has usage => sub { shift->extract_usage };
sub run {
my ($self, @args) = @_;

GetOptionsFromArray \@args,
getopt \@args,
'C|charset=s' => \my $charset,
'c|content=s' => \(my $content = ''),
'H|header=s' => \my @headers,
Expand Down
4 changes: 2 additions & 2 deletions lib/Mojolicious/Command/prefork.pm
@@ -1,8 +1,8 @@
package Mojolicious::Command::prefork;
use Mojo::Base 'Mojolicious::Command';

use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::Server::Prefork;
use Mojo::Util 'getopt';

has description =>
'Start application with pre-forking HTTP and WebSocket server';
Expand All @@ -12,7 +12,7 @@ sub run {
my ($self, @args) = @_;

my $prefork = Mojo::Server::Prefork->new(app => $self->app);
GetOptionsFromArray \@args,
getopt \@args,
'a|accepts=i' => sub { $prefork->accepts($_[1]) },
'b|backlog=i' => sub { $prefork->backlog($_[1]) },
'c|clients=i' => sub { $prefork->max_clients($_[1]) },
Expand Down
5 changes: 2 additions & 3 deletions lib/Mojolicious/Command/routes.pm
Expand Up @@ -2,16 +2,15 @@ package Mojolicious::Command::routes;
use Mojo::Base 'Mojolicious::Command';

use re 'regexp_pattern';
use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::Util qw(encode tablify);
use Mojo::Util qw(encode getopt tablify);

has description => 'Show available routes';
has usage => sub { shift->extract_usage };

sub run {
my ($self, @args) = @_;

GetOptionsFromArray \@args, 'v|verbose' => \my $verbose;
getopt \@args, 'v|verbose' => \my $verbose;

my $rows = [];
_walk($_, 0, $rows, $verbose) for @{$self->app->routes->children};
Expand Down
4 changes: 2 additions & 2 deletions lib/Mojolicious/Command/test.pm
@@ -1,15 +1,15 @@
package Mojolicious::Command::test;
use Mojo::Base 'Mojolicious::Command';

use Getopt::Long qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case);
use Mojo::Util 'getopt';

has description => 'Run tests';
has usage => sub { shift->extract_usage };

sub run {
my ($self, @args) = @_;

GetOptionsFromArray \@args, 'v|verbose' => \$ENV{HARNESS_VERBOSE};
getopt \@args, 'v|verbose' => \$ENV{HARNESS_VERBOSE};

if (!@args && (my $home = $self->app->home)) {
die "Can't find test directory.\n" unless -d $home->rel_dir('t');
Expand Down
13 changes: 4 additions & 9 deletions lib/Mojolicious/Commands.pm
@@ -1,10 +1,9 @@
package Mojolicious::Commands;
use Mojo::Base 'Mojolicious::Command';

use Getopt::Long 'GetOptionsFromArray';
use Mojo::Loader qw(find_modules find_packages load_class);
use Mojo::Server;
use Mojo::Util 'tablify';
use Mojo::Util qw(getopt tablify);

has hint => <<EOF;
Expand Down Expand Up @@ -73,15 +72,11 @@ sub start_app { shift; Mojo::Server->new->build_app(shift)->start(@_) }

# Command line options for MOJO_HELP, MOJO_HOME and MOJO_MODE
sub _args {
return if __PACKAGE__->detect;

my $save
= Getopt::Long::Configure(qw(no_auto_abbrev no_ignore_case pass_through));
GetOptionsFromArray shift,
getopt shift, ['pass_through'],
'h|help' => \$ENV{MOJO_HELP},
'home=s' => \$ENV{MOJO_HOME},
'm|mode=s' => \$ENV{MOJO_MODE};
Getopt::Long::Configure($save);
'm|mode=s' => \$ENV{MOJO_MODE}
unless __PACKAGE__->detect;
}

# Do not remove options from @ARGV
Expand Down
13 changes: 5 additions & 8 deletions script/hypnotoad
Expand Up @@ -3,21 +3,18 @@
use strict;
use warnings;

use Getopt::Long qw(GetOptions :config no_auto_abbrev no_ignore_case);
use Mojo::Server::Hypnotoad;
use Mojo::Util 'getopt';
use Mojolicious::Command;

GetOptions
getopt \@ARGV,
'f|foreground' => \$ENV{HYPNOTOAD_FOREGROUND},
'h|help' => \my $help,
's|stop' => \$ENV{HYPNOTOAD_STOP},
't|test' => \$ENV{HYPNOTOAD_TEST};

my $app = shift || $ENV{HYPNOTOAD_APP};
if ($help || !$app) {
require Mojolicious::Command;
die Mojolicious::Command->new->extract_usage;
}

require Mojo::Server::Hypnotoad;
die Mojolicious::Command->new->extract_usage if $help || !$app;
Mojo::Server::Hypnotoad->new->run($app);

=encoding utf8
Expand Down
13 changes: 5 additions & 8 deletions script/morbo
Expand Up @@ -3,22 +3,19 @@
use strict;
use warnings;

use Getopt::Long qw(GetOptions :config no_auto_abbrev no_ignore_case);
use Mojo::Server::Morbo;
use Mojo::Util 'getopt';
use Mojolicious::Command;

GetOptions
getopt \@ARGV,
'h|help' => \my $help,
'l|listen=s' => \my @listen,
'm|mode=s' => \$ENV{MOJO_MODE},
'v|verbose' => \$ENV{MORBO_VERBOSE},
'w|watch=s' => \my @watch;

my $app = shift;
if ($help || !$app) {
require Mojolicious::Command;
die Mojolicious::Command->new->extract_usage;
}

require Mojo::Server::Morbo;
die Mojolicious::Command->new->extract_usage if $help || !$app;
my $morbo = Mojo::Server::Morbo->new;
$morbo->daemon->listen(\@listen) if @listen;
$morbo->watch(\@watch) if @watch;
Expand Down
14 changes: 12 additions & 2 deletions t/mojo/util.t
Expand Up @@ -12,8 +12,8 @@ use Mojo::DeprecationTest;

use Mojo::Util
qw(b64_decode b64_encode camelize class_to_file class_to_path decamelize),
qw(decode dumper encode files hmac_sha1_sum html_unescape md5_bytes md5_sum),
qw(monkey_patch punycode_decode punycode_encode quote secure_compare),
qw(decode dumper encode files getopt hmac_sha1_sum html_unescape md5_bytes),
qw(md5_sum monkey_patch punycode_decode punycode_encode quote secure_compare),
qw(secure_compare sha1_bytes sha1_sum slurp split_cookie_header),
qw(split_header spurt steady_time tablify term_escape trim unindent unquote),
qw(url_escape url_unescape xml_escape xor_encode);
Expand Down Expand Up @@ -115,6 +115,16 @@ $tree = [
];
is_deeply split_cookie_header($header), $tree, 'right result';

# getopt
my $array = ['-t', 'test', '-h', '--whatever', 'Whatever!', 'stuff'];
getopt $array, ['pass_through'], 't|test=s' => \my $test;
is $test, 'test', 'right string';
is_deeply $array, ['-h', '--whatever', 'Whatever!', 'stuff'], 'right structure';
getopt $array, 'h' => \my $flag, 'w|whatever=s' => \my $whatever;
ok $flag, 'flag has been set';
is $whatever, 'Whatever!', 'right string';
is_deeply $array, ['stuff'], 'right structure';

# unindent
is unindent(" test\n 123\n 456\n"), "test\n 123\n456\n",
'right unindented result';
Expand Down

0 comments on commit d9ccbf6

Please sign in to comment.