File Coverage

blib/lib/MooseX/App/Plugin/BashCompletion/Command.pm
Criterion Covered Total %
statement 45 45 100.0
branch n/a
condition n/a
subroutine 6 6 100.0
pod 0 1 0.0
total 51 52 98.0


line stmt bran cond sub pod time code
1             # ============================================================================
2             package MooseX::App::Plugin::BashCompletion::Command;
3             # ============================================================================
4              
5 4     4   1159 use 5.010;
  4         11  
6 4     4   16 use utf8;
  4         5  
  4         23  
7              
8 4     4   74 use namespace::autoclean;
  4         6  
  4         24  
9 4     4   240 use Moose;
  4         6  
  4         21  
10 4     4   18646 use MooseX::App::Command;
  4         8  
  4         15  
11              
12             command_short_description q(Bash completion automator);
13              
14             sub bash_completion {
15 1     1 0 2 my ($self,$app) = @_;
16              
17 1         1 my %command_map;
18 1         5 my $app_meta = $app->meta;
19 1         44 my $commands = $app_meta->app_commands;
20 1         2 my @commands_to_complete = grep { $_ ne 'bash_completion' } keys %{$commands};
  8         10  
  1         4  
21 1         4 my $command_list = join (' ', @commands_to_complete);
22 1         2 my $package = __PACKAGE__;
23 1         29 my $prefix = $app_meta->app_base;
24              
25 1         142 my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
26 1         4 $year += 1900;
27 1         8 $mday = sprintf('%02i',$mday);
28 1         2 $mon = sprintf('%02i',$mon+1);
29              
30 1         3 $prefix =~ tr/./_/;
31              
32 1         3 foreach my $command (@commands_to_complete) {
33 7         21 my $command_class = $commands->{$command};
34 7         18 Class::Load::load_class($command_class);
35             #my @parameters = $app_meta->command_usage_attributes($command_class->meta,'parameter');
36 7         2824 my @options = $app_meta->command_usage_attributes($command_class->meta,[qw(option proto)]);
37             $command_map{$command} = {
38             #parameters => [ map { $_->is_required } @parameters ],
39 7         22 options => [ map { $_->cmd_usage_name } @options ],
  34         82  
40             };
41             }
42              
43 1         4 my $syntax = '';
44              
45 1         14 $syntax .= <<"EOT";
46             #!/bin/bash
47              
48             # Built with $package on $year/$mon/$mday
49              
50             ${prefix}_COMMANDS='help $command_list'
51              
52             _${prefix}_macc_help() {
53             if [ \$COMP_CWORD = 2 ]; then
54             _${prefix}_compreply "\$${prefix}_COMMANDS"
55             else
56             COMPREPLY=()
57             fi
58             }
59              
60             EOT
61              
62 1         6 foreach my $command (keys %command_map) {
63 7         14 $syntax .= "_${prefix}_macc_${command}() {\n _${prefix}_compreply \"";
64             #$syntax .= join(" ", @{$data->{parameters}});
65 7         8 $syntax .= join(" ", @{$command_map{$command}->{options}});
  7         40  
66 7         12 $syntax .= "\"\n}\n\n";
67             }
68              
69 1         9 $syntax .= <<"EOT";
70             _${prefix}_compreply() {
71             COMPREPLY=(\$(compgen -W "\$1" -- \${COMP_WORDS[COMP_CWORD]}))
72             }
73              
74             _${prefix}_macc() {
75             case \$COMP_CWORD in
76             0)
77             ;;
78             1)
79             _${prefix}_compreply "\$${prefix}_COMMANDS"
80             ;;
81             *)
82             eval _${prefix}_macc_\${COMP_WORDS[1]}
83              
84             esac
85             }
86              
87             EOT
88              
89 1         53 $syntax .= "complete -o default -F _${prefix}_macc ". $app_meta->app_base. "\n";
90              
91 1         58 return MooseX::App::Message::Envelope->new(
92             MooseX::App::Message::Block->new({ body => $syntax })
93             );
94             }
95              
96             __PACKAGE__->meta->make_immutable;
97             1;