File Coverage

blib/lib/Perl/Critic/Policy/logicLAB/RequireSheBang.pm
Criterion Covered Total %
statement 57 79 72.1
branch 12 18 66.6
condition 8 16 50.0
subroutine 15 15 100.0
pod 3 3 100.0
total 95 131 72.5


line stmt bran cond sub pod time code
1             package Perl::Critic::Policy::logicLAB::RequireSheBang;
2              
3             # $Id$
4              
5 4     4   3257 use strict;
  4         7  
  4         129  
6 4     4   17 use warnings;
  4         5  
  4         144  
7 4     4   17 use base 'Perl::Critic::Policy';
  4         7  
  4         3276  
8 4     4   783427 use Perl::Critic::Utils qw{ $SEVERITY_MEDIUM :booleans };
  4         11  
  4         323  
9 4     4   430 use List::MoreUtils qw(none);
  4         9  
  4         68  
10 4     4   5706 use Data::Dumper;
  4         29238  
  4         394  
11 4     4   101 use 5.008;
  4         13  
12              
13             $Data::Dumper::Useqq = 1;
14              
15             our $VERSION = '0.07';
16              
17             Readonly::Scalar my $EXPL => q{she-bang line should adhere to requirement};
18             Readonly::Scalar my $DEBUG => q{DEBUG logicLAB::RequireSheBang};
19              
20 4     4   27 use constant default_severity => $SEVERITY_MEDIUM;
  4         6  
  4         322  
21 4     4   25 use constant default_themes => qw(logiclab);
  4         6  
  4         244  
22 4     4   23 use constant supported_parameters => qw(formats debug);
  4         6  
  4         3462  
23              
24             sub prepare_to_scan_document {
25 18     18 1 50374 my ( $self, $document ) = @_;
26 18 50 33     110 if ( $self->{exempt_modules} && $document->is_module() ) {
27 0         0 return 0;
28             }
29              
30 18         157 return $document->is_program();
31             }
32              
33             sub violates {
34 138     138 1 1648 my ( $self, $element, $doc ) = @_;
35              
36 138         259 my $statement = $doc->find_first('PPI::Token::Comment');
37              
38 138 50       1557 if ( not $statement->location()->[0] ) {
39 0         0 return $self->violation( q{she-bang line not located as first line},
40             $EXPL, $statement );
41             }
42              
43 138 50       1163 if ( $self->{debug} ) {
44 0         0 print {*STDERR} "$DEBUG: we got statement:\n";
  0         0  
45 0         0 print {*STDERR} Dumper $statement;
  0         0  
46             }
47              
48 138         250 my ( $shebang, $cli ) = $element =~ m{
49             \A #beginning of string
50             (\#!) #actual she-bang
51             #([^\r\n]*?) #the path and possible flags
52             ([/\-\w ]+?) #the path and possible flags, note the space character
53             \s* #possible left over whitespace (PPI?)
54             \Z #indication of end of string to assist above capture
55             }xsm;
56              
57 138 100       779 if ($cli) {
58 18         53 $cli =~ s{
59             \s+ #one or more whitespace character, PCPLRSB-9 / http://logiclab.jira.com/browse/PCPLRSB-9
60             $ #end of string
61             }{}xsm;
62             }
63              
64 138 50 33     463 if ( $self->{debug} && $shebang && $cli ) {
    50 33        
65 0         0 print {*STDERR} "$DEBUG: we got a shebang line:\n";
  0         0  
66 0         0 print {*STDERR} '>' . $shebang . $cli . "<\n";
  0         0  
67              
68 0         0 print {*STDERR} "$DEBUG: comparing against formats:\n";
  0         0  
69 0         0 print {*STDERR} Dumper $self->{_formats};
  0         0  
70 0         0 print {*STDERR} "\n";
  0         0  
71              
72             }
73             elsif ( $self->{debug} ) {
74 0         0 print {*STDERR} "$DEBUG: not a shebang, ignoring...\n";
  0         0  
75             }
76              
77 138 100 100 24   282 if ( $shebang && none { ( $shebang . $cli ) eq $_ } @{ $self->{_formats} } )
  24         129  
  18         148  
78             {
79              
80 9 50       26 if ( $self->{debug} ) {
81 0         0 print {*STDERR} "$DEBUG: we got a violation:\n";
  0         0  
82 0         0 print {*STDERR} '>' . $shebang . $cli . "<\n";
  0         0  
83             }
84              
85 9         41 return $self->violation(
86             q{she-bang line not conforming with requirement},
87             $EXPL, $element );
88             }
89              
90 129         268 return;
91             }
92              
93             sub initialize_if_enabled {
94 4     4 1 8652538 my ( $self, $config ) = @_;
95              
96             #Formats:
97             #Setting the default
98 4         18 $self->{_formats} = [ ('#!/usr/local/bin/perl') ];
99              
100             #fetching configured formats
101 4         78 my $formats = $config->get('formats');
102              
103             #parsing configured formats, see also _parse_formats
104 4 100       43 if ($formats) {
105 3         13 $self->{_formats} = $self->_parse_formats($formats);
106             }
107              
108             #debug
109 4   50     18 $self->{debug} = $config->get('debug') || 0;
110              
111             #exempt_modules
112 4   50     53 $self->{exempt_modules} = $config->get('exempt_modules') || 1;
113              
114 4         50 return $TRUE;
115             }
116              
117             sub _parse_formats {
118 3     3   6 my ( $self, $config_string ) = @_;
119              
120 3         32 my @formats = split m{ \s* [||]+ \s* }xsm, $config_string;
121              
122 3         11 return \@formats;
123             }
124              
125             1;
126              
127             __END__
128              
129             =pod
130              
131             =begin markdown
132              
133             [![CPAN version](https://badge.fury.io/pl/Perl-Critic-Policy-logicLAB-RequireSheBang.svg)](http://badge.fury.io/pl/Perl-Critic-Policy-logicLAB-RequireSheBang)
134             [![Build Status](https://travis-ci.org/jonasbn/pcplrsb.svg?branch=master)](https://travis-ci.org/jonasbn/pcplrsb)
135             [![Coverage Status](https://coveralls.io/repos/jonasbn/pcplrsb/badge.png)](https://coveralls.io/r/jonasbn/pcplrsb)
136              
137             =end markdown
138              
139             =head1 NAME
140              
141             Perl::Critic::Policy::logicLAB::RequireSheBang - simple policy for keeping your shebang line uniform
142              
143             =head1 AFFILIATION
144              
145             This policy is a policy in the Perl::Critic::logicLAB distribution. The policy
146             is themed: logiclab.
147              
148             =head1 VERSION
149              
150             This documentation describes version 0.07.
151              
152             =head1 DESCRIPTION
153              
154             This policy is intended in guarding your use of the shebang line. It assists
155             in making sure that your shebang line adheres to certain formats.
156              
157             The default format is
158              
159             #!/usr/local/bin/perl
160              
161             You can however specify another or define your own in the configuration of the
162             policy.
163              
164             B<NB> this policy does currently not warn about missing shebang lines, it only
165             checks shebang lines encountered.
166              
167             =head1 CONFIGURATION AND ENVIRONMENT
168              
169             This policy allow you to configure the contents of the shebang lines you
170             want to allow using L</formats>.
171              
172             =head2 formats
173              
174             [logicLAB::RequireSheBang]
175             formats = #!/usr/local/bin/perl || #!/usr/bin/perl || #!perl || #!env perl
176              
177             Since the default shebang line enforced by the policy is:
178              
179             #!/usr/local/bin/perl
180              
181             Please note that if you however what to extend the pattern, you also have
182             to specify was is normally the default pattern since configuration
183             overwrites the default even for extensions.
184              
185             This mean that if you want to allow:
186              
187             #!/usr/local/bin/perl
188              
189             #!/usr/local/bin/perl -w
190              
191             #!/usr/local/bin/perl -wT
192              
193             Your format should look like the following:
194              
195             [logicLAB::RequireSheBang]
196             formats = #!/usr/local/bin/perl || #!/usr/local/bin/perl -w || #!/usr/local/bin/perl -wT
197              
198             =head2 exempt_modules
199              
200             You can specify if you want to check modules also. The default is to exempt from checking
201             shebang lines in modules.
202              
203             [logicLAB::RequireSheBang]
204             exempt_modules = 0
205              
206             =head2 debug
207              
208             Optionally and for development purposes I have added a debug flag. This can be set in
209             your L<Perl::Critic> configuration file as follows:
210              
211             [logicLAB::RequireSheBang]
212             debug = 1
213              
214             This enables more explicit output on what is going on during the actual processing of
215             the policy.
216              
217             =head1 DEPENDENCIES AND REQUIREMENTS
218              
219             =over
220              
221             =item * L<Perl::Critic>
222              
223             =item * L<Perl::Critic::Utils>
224              
225             =item * L<Readonly>
226              
227             =item * L<Test::More>
228              
229             =item * L<Test::Perl::Critic>
230              
231             =item * L<List::MoreUtils>
232              
233             =back
234              
235             =head1 INCOMPATIBILITIES
236              
237             This distribution has no known incompatibilities.
238              
239             =head1 BUGS AND LIMITATIONS
240              
241             The distribution has now known bugs or limitations. It locates shebang lines
242             through out the source code, not limiting itself to the first line. This might
243             however change in the future, but will propably be made configurable if possible.
244              
245             =head1 BUG REPORTING
246              
247             Please use Request Tracker for bug reporting:
248              
249             =over
250              
251             =item * L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Perl-Critic-logicLAB-RequireSheBang>
252              
253             =back
254              
255             =head1 TEST AND QUALITY
256              
257             The following policies have been disabled for this distribution
258              
259             =over
260              
261             =item * L<Perl::Critic::Policy::ValuesAndExpressions::ProhibitConstantPragma>
262              
263             Constants are good, - see the link below.
264              
265             =over
266              
267             =item * L<https://logiclab.jira.com/wiki/display/OPEN/Perl-Critic-Policy-ValuesAndExpressions-ProhibitConstantPragma>
268              
269             =back
270              
271             =item * L<Perl::Critic::Policy::NamingConventions::Capitalization>
272              
273             =item * L<Data::Dumper>
274              
275             =back
276              
277             See also F<t/perlcriticrc>
278              
279             =head2 TEST COVERAGE
280              
281             Coverage test executed the following way, the coverage report is based on the
282             version described in this documentation (see L</VERSION>).
283              
284             ./Build testcover
285              
286             ---------------------------- ------ ------ ------ ------ ------ ------ ------
287             File stmt bran cond sub pod time total
288             ---------------------------- ------ ------ ------ ------ ------ ------ ------
289             ...ogicLAB/RequireSheBang.pm 70.4 64.3 44.4 100.0 100.0 100.0 72.1
290             Total 70.4 64.3 44.4 100.0 100.0 100.0 72.1
291             ---------------------------- ------ ------ ------ ------ ------ ------ ------
292              
293             =head1 SEE ALSO
294              
295             =over
296              
297             =item * L<Perl::Critic>
298              
299             =item * L<http://perldoc.perl.org/perlrun.html>
300              
301             =item * L<http://logiclab.jira.com/wiki/display/OPEN/Development#Development-MakeyourComponentsEnvironmentAgnostic>
302              
303             =item * L<http://logiclab.jira.com/wiki/display/PCPLRSB/Home>
304              
305             =item * L<http://logiclab.jira.com/wiki/display/PCLL/Home>
306              
307             =back
308              
309             =head1 AUTHOR
310              
311             =over
312              
313             =item * Jonas B. Nielsen, jonasbn C<< <jonasbn@cpan.org> >>
314              
315             =back
316              
317             =head1 ACKNOWLEDGEMENT
318              
319             =over
320              
321             =item * Erik Johansen (uniejo), feedback to version 0.01
322              
323             =back
324              
325             =head1 LICENSE AND COPYRIGHT
326              
327             Copyright (c) 2011-2015 Jonas B. Nielsen, jonasbn. All rights reserved.
328              
329             Perl::Critic::Policy::logicLAB::RequireSheBang is released under
330             the Artistic License 2.0
331              
332             The distribution is licensed under the Artistic License 2.0, as specified by
333             the license file included in this distribution.
334              
335             =cut