bump version to 1.999_002
[p5sagit/strictures.git] / lib / strictures.pm
1 package strictures;
2
3 use strict;
4 use warnings FATAL => 'all';
5
6 BEGIN {
7   *_PERL_LT_5_8_4 = ($] < 5.008004) ? sub(){1} : sub(){0};
8   *_CAN_GOTO_VERSION = ($] >= 5.008000) ? sub(){1} : sub(){0};
9 }
10
11 our $VERSION = '1.999_002';
12 $VERSION = eval $VERSION;
13 $VERSION = 2; # a bit of a cheat, but requesting v2 needs to be possible
14
15 our @WARNING_CATEGORIES = grep { exists $warnings::Offsets{$_} } qw(
16   closure
17   chmod
18   deprecated
19   exiting
20   experimental
21     experimental::autoderef
22     experimental::const_attr
23     experimental::lexical_subs
24     experimental::lexical_topic
25     experimental::postderef
26     experimental::re_strict
27     experimental::refaliasing
28     experimental::regex_sets
29     experimental::signatures
30     experimental::smartmatch
31     experimental::win32_perlio
32   glob
33   imprecision
34   io
35     closed
36     exec
37     layer
38     newline
39     pipe
40     syscalls
41     unopened
42   locale
43   misc
44   missing
45   numeric
46   once
47   overflow
48   pack
49   portable
50   recursion
51   redefine
52   redundant
53   regexp
54   severe
55     debugging
56     inplace
57     internal
58     malloc
59   signal
60   substr
61   syntax
62     ambiguous
63     bareword
64     digit
65     illegalproto
66     parenthesis
67     precedence
68     printf
69     prototype
70     qw
71     reserved
72     semicolon
73   taint
74   threads
75   uninitialized
76   umask
77   unpack
78   untie
79   utf8
80     non_unicode
81     nonchar
82     surrogate
83   void
84   void_unusual
85   y2k
86 );
87
88 sub VERSION {
89   {
90     no warnings;
91     local $@;
92     if (defined $_[1] && eval { &UNIVERSAL::VERSION; 1}) {
93       $^H |= 0x20000
94         unless _PERL_LT_5_8_4;
95       $^H{strictures_enable} = int $_[1];
96     }
97   }
98   _CAN_GOTO_VERSION ? goto &UNIVERSAL::VERSION : &UNIVERSAL::VERSION;
99 }
100
101 our %extra_load_states;
102
103 our $Smells_Like_VCS;
104
105 sub import {
106   my $class = shift;
107   my %opts = ref $_[0] ? %{$_[0]} : @_;
108   if (!exists $opts{version}) {
109     $opts{version}
110       = exists $^H{strictures_enable} ? delete $^H{strictures_enable}
111       : int $VERSION;
112   }
113   $opts{file} = (caller)[1];
114   $class->_enable(\%opts);
115 }
116
117 sub _enable {
118   my ($class, $opts) = @_;
119   my $version = $opts->{version};
120   $version = 'undef'
121     if !defined $version;
122   my $method = "_enable_$version";
123   if (!$class->can($method)) {
124     require Carp;
125     Carp::croak("Major version specified as $version - not supported!");
126   }
127   $class->$method($opts);
128 }
129
130 sub _enable_1 {
131   my ($class, $opts) = @_;
132   strict->import;
133   warnings->import(FATAL => 'all');
134
135   if (_want_extra($opts->{file})) {
136     _load_extras(qw(indirect multidimensional bareword::filehandles));
137     indirect->unimport(':fatal')
138       if $extra_load_states{indirect};
139     multidimensional->unimport
140       if $extra_load_states{multidimensional};
141     bareword::filehandles->unimport
142       if $extra_load_states{'bareword::filehandles'};
143   }
144 }
145
146 our @V2_NONFATAL = grep { exists $warnings::Offsets{$_} } (
147   'exec',         # not safe to catch
148   'recursion',    # will be caught by other mechanisms
149   'internal',     # not safe to catch
150   'malloc',       # not safe to catch
151   'newline',      # stat on nonexistent file with a newline in it
152   'experimental', # no reason for these to be fatal
153   'deprecated',   # unfortunately can't make these fatal
154   'portable',     # everything worked fine here, just may not elsewhere
155 );
156 our @V2_DISABLE = grep { exists $warnings::Offsets{$_} } (
157   'once'          # triggers inconsistently, can't be fatalized
158 );
159
160 sub _enable_2 {
161   my ($class, $opts) = @_;
162   strict->import;
163   warnings->import;
164   warnings->import(FATAL => @WARNING_CATEGORIES);
165   warnings->unimport(FATAL => @V2_NONFATAL);
166   warnings->import(@V2_NONFATAL);
167   warnings->unimport(@V2_DISABLE);
168
169   if (_want_extra($opts->{file})) {
170     _load_extras(qw(indirect multidimensional bareword::filehandles));
171     indirect->unimport(':fatal')
172       if $extra_load_states{indirect};
173     multidimensional->unimport
174       if $extra_load_states{multidimensional};
175     bareword::filehandles->unimport
176       if $extra_load_states{'bareword::filehandles'};
177   }
178 }
179
180 sub _want_extra_env {
181   if (exists $ENV{PERL_STRICTURES_EXTRA}) {
182     if (_PERL_LT_5_8_4 and $ENV{PERL_STRICTURES_EXTRA}) {
183       die 'PERL_STRICTURES_EXTRA checks are not available on perls older'
184         . "than 5.8.4: please unset \$ENV{PERL_STRICTURES_EXTRA}\n";
185     }
186     return $ENV{PERL_STRICTURES_EXTRA} ? 1 : 0;
187   }
188   return undef;
189 }
190
191 sub _want_extra {
192   my $file = shift;
193   my $want_env = _want_extra_env();
194   return $want_env
195     if defined $want_env;
196   return (
197     !_PERL_LT_5_8_4
198     and $file =~ /^(?:t|xt|lib|blib)[\\\/]/
199     and defined $Smells_Like_VCS ? $Smells_Like_VCS
200       : ( $Smells_Like_VCS = !!(
201         -e '.git' || -e '.svn' || -e '.hg'
202         || (-e '../../dist.ini'
203           && (-e '../../.git' || -e '../../.svn' || -e '../../.hg' ))
204       ))
205   );
206 }
207
208 sub _load_extras {
209   my @extras = @_;
210   my @failed;
211   foreach my $mod (@extras) {
212     next
213       if exists $extra_load_states{$mod};
214
215     $extra_load_states{$mod} = eval "require $mod; 1;" or do {
216       push @failed, $mod;
217
218       #work around 5.8 require bug
219       (my $file = $mod) =~ s|::|/|g;
220       delete $INC{"${file}.pm"};
221     };
222   }
223
224   if (@failed) {
225     my $failed = join ' ', @failed;
226     my $extras = join ' ', @extras;
227     print STDERR <<EOE;
228 strictures.pm extra testing active but couldn't load all modules. Missing were:
229
230   $failed
231
232 Extra testing is auto-enabled in checkouts only, so if you're the author
233 of a strictures-using module you need to run:
234
235   cpan $extras
236
237 but these modules are not required by your users.
238 EOE
239   }
240 }
241
242 1;
243
244 __END__
245 =head1 NAME
246
247 strictures - turn on strict and make all warnings fatal
248
249 =head1 SYNOPSIS
250
251   use strictures 2;
252
253 is equivalent to
254
255   use strict;
256   use warnings FATAL => 'all';
257   use warnings NONFATAL => qw(
258     exec
259     recursion
260     internal
261     malloc
262     newline
263     experimental
264     deprecated
265     portable
266   );
267   no warnings 'once';
268
269 except when called from a file which matches:
270
271   (caller)[1] =~ /^(?:t|xt|lib|blib)[\\\/]/
272
273 and when either C<.git>, C<.svn>, or C<.hg> is present in the current directory
274 (with the intention of only forcing extra tests on the author side) -- or when
275 C<.git>, C<.svn>, or C<.hg> is present two directories up along with
276 C<dist.ini> (which would indicate we are in a C<dzil test> operation, via
277 L<Dist::Zilla>) -- or when the C<PERL_STRICTURES_EXTRA> environment variable is
278 set, in which case it also does the equivalent of
279
280   no indirect 'fatal';
281   no multidimensional;
282   no bareword::filehandles;
283
284 Note that C<PERL_STRICTURES_EXTRA> may at some point add even more tests, with
285 only a minor version increase, but any changes to the effect of C<use
286 strictures> in normal mode will involve a major version bump.
287
288 If any of the extra testing modules are not present, L<strictures> will
289 complain loudly, once, via C<warn()>, and then shut up. But you really
290 should consider installing them, they're all great anti-footgun tools.
291
292 =head1 DESCRIPTION
293
294 I've been writing the equivalent of this module at the top of my code for
295 about a year now. I figured it was time to make it shorter.
296
297 Things like the importer in C<use Moose> don't help me because they turn
298 warnings on but don't make them fatal -- which from my point of view is
299 useless because I want an exception to tell me my code isn't warnings-clean.
300
301 Any time I see a warning from my code, that indicates a mistake.
302
303 Any time my code encounters a mistake, I want a crash -- not spew to STDERR
304 and then unknown (and probably undesired) subsequent behaviour.
305
306 I also want to ensure that obvious coding mistakes, like indirect object
307 syntax (and not so obvious mistakes that cause things to accidentally compile
308 as such) get caught, but not at the cost of an XS dependency and not at the
309 cost of blowing things up on another machine.
310
311 Therefore, L<strictures> turns on additional checking, but only when it thinks
312 it's running in a test file in a VCS checkout -- although if this causes
313 undesired behaviour this can be overridden by setting the
314 C<PERL_STRICTURES_EXTRA> environment variable.
315
316 If additional useful author side checks come to mind, I'll add them to the
317 C<PERL_STRICTURES_EXTRA> code path only -- this will result in a minor version
318 increase (e.g. 1.000000 to 1.001000 (1.1.0) or similar). Any fixes only to the
319 mechanism of this code will result in a sub-version increase (e.g. 1.000000 to
320 1.000001 (1.0.1)).
321
322 =head1 CATEGORY SELECTIONS
323
324 strictures does not enable fatal warnings for all categories.
325
326 =over 4
327
328 =item exec
329
330 Includes a warning that can cause your program to continue running
331 unintentionally after an internal fork.  Not safe to fatalize.
332
333 =item recursion
334
335 Infinite recursion will end up overflowing the stack eventually anyway.
336
337 =item internal
338
339 Triggers deep within perl, in places that are not safe to trap.
340
341 =item malloc
342
343 Triggers deep within perl, in places that are not safe to trap.
344
345 =item newline
346
347 Includes a warning for using stat on a valid but suspect filename, ending in a
348 newline.
349
350 =item experimental
351
352 Experimental features are used intentionally.
353
354 =item deprecated
355
356 Deprecations will inherently be added to in the future in unexpected ways,
357 so making them fatal won't be reliable.
358
359 =item portable
360
361 Doesn't indicate an actual problem with the program, only that it may not
362 behave properly if run on a different machine.
363
364 =item once
365
366 Can't be fatalized.  Also triggers very inconsistently, so we just disable it.
367
368 =back
369
370 =head1 VERSIONS
371
372 Depending on the version of strictures requested, different warnings will be
373 enabled.  If no specific version is requested, the current version's behavior
374 will be used.  Versions can be requested using perl's standard mechanism:
375
376   use strictures 2;
377
378 Or, by passing in a C<version> option:
379
380   use strictures version => 2;
381
382 =head2 VERSION 2
383
384 Equivalent to:
385
386   use strict;
387   use warnings FATAL => 'all';
388   use warnings NONFATAL => qw(
389     exec
390     recursion
391     internal
392     malloc
393     newline
394     experimental
395     deprecated
396     portable
397   );
398   no warnings 'once';
399
400   # and if in dev mode:
401   no indirect 'fatal';
402   no multidimensional;
403   no bareword::filehandles;
404
405 Additionally, any warnings created by modules using L<warnings::register> or
406 C<warnings::register_categories()> will not be fatalized.
407
408 =head2 VERSION 1
409
410 Equivalent to:
411
412   use strict;
413   use warnings FATAL => 'all';
414   # and if in dev mode:
415   no indirect 'fatal';
416   no multidimensional;
417   no bareword::filehandles;
418
419 =head1 METHODS
420
421 =head2 import
422
423 This method does the setup work described above in L</DESCRIPTION>.  Optionally
424 accepts a C<version> option to request a specific version's behavior.
425
426 =head2 VERSION
427
428 This method traps the C<< strictures->VERSION(1) >> call produced by a use line
429 with a version number on it and does the version check.
430
431 =head1 EXTRA TESTING RATIONALE
432
433 Every so often, somebody complains that they're deploying via C<git pull>
434 and that they don't want L<strictures> to enable itself in this case -- and that
435 setting C<PERL_STRICTURES_EXTRA> to 0 isn't acceptable (additional ways to
436 disable extra testing would be welcome but the discussion never seems to get
437 that far).
438
439 In order to allow us to skip a couple of stages and get straight to a
440 productive conversation, here's my current rationale for turning the
441 extra testing on via a heuristic:
442
443 The extra testing is all stuff that only ever blows up at compile time;
444 this is intentional. So the oft-raised concern that it's different code being
445 tested is only sort of the case -- none of the modules involved affect the
446 final optree to my knowledge, so the author gets some additional compile
447 time crashes which he/she then fixes, and the rest of the testing is
448 completely valid for all environments.
449
450 The point of the extra testing -- especially C<no indirect> -- is to catch
451 mistakes that newbie users won't even realise are mistakes without
452 help. For example,
453
454   foo { ... };
455
456 where foo is an & prototyped sub that you forgot to import -- this is
457 pernicious to track down since all I<seems> fine until it gets called
458 and you get a crash. Worse still, you can fail to have imported it due
459 to a circular require, at which point you have a load order dependent
460 bug which I've seen before now I<only> show up in production due to tiny
461 differences between the production and the development environment. I wrote
462 L<http://shadow.cat/blog/matt-s-trout/indirect-but-still-fatal/> to explain
463 this particular problem before L<strictures> itself existed.
464
465 As such, in my experience so far L<strictures>' extra testing has
466 I<avoided> production versus development differences, not caused them.
467
468 Additionally, L<strictures>' policy is very much "try and provide as much
469 protection as possible for newbies -- who won't think about whether there's
470 an option to turn on or not" -- so having only the environment variable
471 is not sufficient to achieve that (I get to explain that you need to add
472 C<use strict> at least once a week on freenode #perl -- newbies sometimes
473 completely skip steps because they don't understand that that step
474 is important).
475
476 I make no claims that the heuristic is perfect -- it's already been evolved
477 significantly over time, especially for 1.004 where we changed things to
478 ensure it only fires on files in your checkout (rather than L<strictures>-using
479 modules you happened to have installed, which was just silly). However, I
480 hope the above clarifies why a heuristic approach is not only necessary but
481 desirable from a point of view of providing new users with as much safety as
482 possible, and will allow any future discussion on the subject to focus on "how
483 do we minimise annoyance to people deploying from checkouts intentionally".
484
485 =head1 SEE ALSO
486
487 =over 4
488
489 =item *
490
491 L<indirect>
492
493 =item *
494
495 L<multidimensional>
496
497 =item *
498
499 L<bareword::filehandles>
500
501 =back
502
503 =head1 COMMUNITY AND SUPPORT
504
505 =head2 IRC channel
506
507 irc.perl.org #toolchain
508
509 (or bug 'mst' in query on there or freenode)
510
511 =head2 Git repository
512
513 Gitweb is on http://git.shadowcat.co.uk/ and the clone URL is:
514
515   git clone git://git.shadowcat.co.uk/p5sagit/strictures.git
516
517 The web interface to the repository is at:
518
519   http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/strictures.git
520
521 =head1 AUTHOR
522
523 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
524
525 =head1 CONTRIBUTORS
526
527 Karen Etheridge (cpan:ETHER) <ether@cpan.org>
528
529 Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@gmail.com>
530
531 haarg - Graham Knop (cpan:HAARG) <haarg@haarg.org>
532
533 =head1 COPYRIGHT
534
535 Copyright (c) 2010 the strictures L</AUTHOR> and L</CONTRIBUTORS>
536 as listed above.
537
538 =head1 LICENSE
539
540 This library is free software and may be distributed under the same terms
541 as perl itself.
542
543 =cut