File Coverage

lib/CPANPLUS/Internals/Constants/Report.pm
Criterion Covered Total %
statement 124 170 72.9
branch 25 38 65.7
condition 8 14 57.1
subroutine 29 29 100.0
pod n/a
total 186 251 74.1


line stmt bran cond sub pod time code
1             package CPANPLUS::Internals::Constants::Report;
2              
3 21     20   588 use strict;
  21         58  
  20         671  
4 20     20   124 use CPANPLUS::Error;
  20         44  
  22         2017  
5              
6 22     20   180 use File::Spec;
  22         9193  
  22         702  
7 76     20   479 use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
  21         52  
  21         159  
8              
9             require Exporter;
10 21     20   5375 use vars qw[$VERSION @ISA @EXPORT];
  22         91  
  20         1294  
11              
12 20     20   141 use Package::Constants;
  20         55  
  20         2761  
13              
14             $VERSION = "0.9912";
15             @ISA = qw[Exporter];
16             @EXPORT = Package::Constants->list( __PACKAGE__ );
17              
18             ### OS to regex map ###
19             my %OS = (
20             Amiga => 'amigaos',
21             Atari => 'mint',
22             BSD => 'bsdos|bitrig|darwin|freebsd|openbsd|netbsd',
23             Be => 'beos',
24             BeOS => 'beos',
25             Cygwin => 'cygwin',
26             Darwin => 'darwin',
27             EBCDIC => 'os390|os400|posix-bc|vmesa',
28             HPUX => 'hpux',
29             Linux => 'linux',
30             MSDOS => 'dos|os2|MSWin32|cygwin',
31             'bin\\d*Mac'=> 'MacOS|darwin', # binMac, bin56Mac, bin58Mac...
32             Mac => 'MacOS|darwin',
33             MacPerl => 'MacOS',
34             MacOS => 'MacOS|darwin',
35             MacOSX => 'darwin',
36             MPE => 'mpeix',
37             MPEiX => 'mpeix',
38             OS2 => 'os2',
39             Plan9 => 'plan9',
40             RISCOS => 'riscos',
41             SGI => 'irix',
42             Solaris => 'solaris',
43             Unix => 'aix|bsdos|bitrig|darwin|dgux|dynixptx|freebsd|'.
44             'linux|hpux|machten|netbsd|next|openbsd|dec_osf|'.
45             'svr4|sco_sv|unicos|unicosmk|solaris|sunos',
46             VMS => 'VMS',
47             VOS => 'VOS',
48             Win32 => 'MSWin32|cygwin',
49             Win32API => 'MSWin32|cygwin',
50             );
51              
52 20     20   160 use constant GRADE_FAIL => 'fail';
  20         79  
  20         1549  
53 24     20   1461 use constant GRADE_PASS => 'pass';
  24         78  
  23         1160  
54 21     20   154 use constant GRADE_NA => 'na';
  20         53  
  20         1002  
55 20     20   124 use constant GRADE_UNKNOWN => 'unknown';
  24         486  
  24         1076  
56              
57 22         1010 use constant MAX_REPORT_SEND
58 21     20   140 => 2;
  23         83  
59              
60 20         1817 use constant CPAN_TESTERS_EMAIL
61 21     20   129 => 'cpan-testers@perl.org';
  20         49  
62              
63             ### the cpan mail account for this user ###
64             use constant CPAN_MAIL_ACCOUNT
65             => sub {
66 0 50       0 my $username = shift or return;
67 0         0 return $username . '@cpan.org';
68 20     20   157 };
  20         57  
  20         3838  
69              
70             ### check if this module is platform specific and if we're on that
71             ### specific platform. Alternately, the module is not platform specific
72             ### and we're always OK to send out test results.
73             use constant RELEVANT_TEST_RESULT
74             => sub {
75 1 50       9 my $mod = shift or return;
76 0         0 my $name = $mod->module;
77 0         0 my $specific;
78 0         0 for my $platform (keys %OS) {
79 0 100       0 if( $name =~ /^$platform\b/i ) {
80             # beware the Mac != MAC
81 0 50 33     0 next if($platform eq 'Mac' &&
82             $name !~ /^$platform\b/);
83 2         425 $specific++;
84 2 50       197 return 1 if
85             $^O =~ /^(?:$OS{$platform})$/
86             }
87             };
88 0 100       0 return $specific ? 0 : 1;
89 24     20   1434 };
  24         362  
  23         3469  
90              
91             use constant UNSUPPORTED_OS
92             => sub {
93 0 0       0 my $buffer = shift or return;
94 2 50       2246 if( $buffer =~
95             /No support for OS|OS unsupported/im ) {
96 2         11 return 1;
97             }
98 2         17 return 0;
99 20     20   159 };
  20         43  
  20         3234  
100              
101             use constant PERL_VERSION_TOO_LOW
102             => sub {
103 2 100       4 my $buffer = shift or return;
104             # ExtUtils::MakeMaker format
105 2 50       4 if( $buffer =~
106             /Perl .*? required--this is only .*?/m ) {
107 2         4 return 1;
108             }
109             # Module::Build format
110 2 100       12 if( $buffer =~
111             /ERROR:( perl:)? Version .*?( of perl)? is installed, but we need version >= .*?/m ) {
112 2         15 return 1;
113             }
114 0         0 return 0;
115 22     20   167 };
  22         56  
  22         4149  
116              
117             use constant NO_TESTS_DEFINED
118             => sub {
119 4 100       62 my $buffer = shift or return;
120 4 50 66     77 if( $buffer =~
      66        
121             /(No tests defined( for [\w:]+ extension)?\.)/
122             and $buffer !~ /\*\.t/m and
123             $buffer !~ /test\.pl/m
124             ) {
125 0         0 return $1
126             }
127              
128 4         32 return;
129 20     20   147 };
  20         57  
  20         1945  
130              
131             ### what stage did the test fail? ###
132             use constant TEST_FAIL_STAGE
133             => sub {
134 0 50       0 my $buffer = shift or return;
135 0 50       0 return $buffer =~ /(MAKE [A-Z]+).*/
136             ? lc $1 :
137             'fetch';
138 21     20   1714 };
  21         73  
  20         4917  
139              
140              
141             use constant MISSING_PREREQS_LIST
142             => sub {
143 0         0 my $buffer = shift;
144 1         3388 my $last = ( split /\[ERROR\] .+? MAKE TEST/, $buffer )[-1];
145 1         7 my @list = map { s/.pm$//; s|/|::|g; $_ }
  0         0  
  0         0  
  0         0  
146             ($last =~
147             m/\bCan\'t locate (\S+) in \@INC/g);
148              
149             ### make sure every missing prereq is only
150             ### listed once
151 0         0 { my %seen;
  0         0  
152 0         0 @list = grep { !$seen{$_}++ } @list
  0         0  
153             }
154              
155 2         6543 return @list;
156 20     20   167 };
  20         42  
  20         3690  
157              
158             use constant MISSING_EXTLIBS_LIST
159             => sub {
160 2         13 my $buffer = shift;
161 2         13 my @list =
162             ($buffer =~
163             m/No library found for -l([-\w]+)/g);
164              
165 0         0 return @list;
166 22     20   171 };
  22         61  
  22         1892  
167              
168             use constant REPORT_MESSAGE_HEADER
169             => sub {
170 0         0 my ($version, $author) = @_;
171 0         0 return << ".";
172              
173             Dear $author,
174              
175             This is a computer-generated error report created automatically by
176             CPANPLUS, version $version. Testers personal comments may appear
177             at the end of this report.
178              
179             .
180 20     20   128 };
  20         48  
  20         1857  
181              
182             use constant REPORT_MESSAGE_FAIL_HEADER
183             => sub {
184 0         0 my($stage, $buffer) = @_;
185 0         0 return << ".";
186              
187             Thank you for uploading your work to CPAN. However, it appears that
188             there were some problems testing your distribution.
189              
190             TEST RESULTS:
191              
192             Below is the error stack from stage '$stage':
193              
194             $buffer
195              
196             .
197 20     20   158 };
  20         64  
  20         2308  
198              
199             use constant REPORT_MESSAGE_PASS_HEADER
200             => sub {
201 1         3274 my($stage, $buffer) = @_;
202 0         0 return << ".";
203              
204             Thank you for uploading your work to CPAN. Congratulations!
205             All tests were successful.
206              
207             TEST RESULTS:
208              
209             Below is the error stack from stage '$stage':
210              
211             $buffer
212              
213             .
214 20     20   156 };
  20         50  
  20         4606  
215              
216             use constant REPORT_MISSING_PREREQS
217             => sub {
218 0         0 my ($author,$email,@missing) = @_;
219 1 100 66     1812 $author = ($author && $email)
220             ? "$author ($email)"
221             : 'Your Name Here';
222              
223 0         0 my $modules = join "\n", @missing;
224             my $prereqs = join "\n",
225 0         0 map {"\t'$_'\t=> '0',".
  0         0  
226             " # or a minimum working version"}
227             @missing;
228              
229 0         0 return << ".";
230              
231             MISSING PREREQUISITES:
232              
233             It was observed that the test suite seem to fail without these modules:
234              
235             $modules
236              
237             As such, adding the prerequisite module(s) to 'PREREQ_PM' in your
238             Makefile.PL should solve this problem. For example:
239              
240             WriteMakefile(
241             AUTHOR => '$author',
242             ... # other information
243             PREREQ_PM => {
244             $prereqs
245             }
246             );
247              
248             Thanks! :-)
249              
250             .
251 20     20   155 };
  20         50  
  20         1912  
252              
253             use constant REPORT_MISSING_TESTS
254             => sub {
255 0         0 return << ".";
256             RECOMMENDATIONS:
257              
258             It would be very helpful if you could include even a simple test
259             script in the next release, so people can verify which platforms
260             can successfully install them, as well as avoid regression bugs?
261              
262             A simple 't/use.t' that says:
263              
264             #!/usr/bin/env perl -w
265             use strict;
266             use Test;
267             BEGIN { plan tests => 1 }
268              
269             use Your::Module::Here; ok(1);
270             exit;
271             __END__
272              
273             would be appreciated. If you are interested in making a more robust
274             test suite, please see the Test::Simple, Test::More and Test::Tutorial
275             documentation at <http://search.cpan.org/dist/Test-Simple/>.
276              
277             Thanks! :-)
278              
279             .
280 20     20   156 };
  20         57  
  20         5677  
281              
282             use constant REPORT_LOADED_PREREQS
283             => sub {
284 0         0 my $mod = shift;
285 0         0 my $cb = $mod->parent;
286 0   50     0 my $prq = $mod->status->prereqs || {};
287              
288             ### not every prereq may be coming from CPAN
289             ### so maybe we wont find it in our module
290             ### tree at all...
291             ### skip ones that can't be found in the list
292             ### as reported in #12723
293 0         0 my @prq = grep { defined }
294 0         0 map { $cb->module_tree($_) }
  0         0  
295             sort keys %$prq;
296              
297             ### no prereqs?
298 0 100       0 return '' unless @prq;
299              
300             ### some apparently, list what we loaded
301 0         0 my $str = << ".";
302             PREREQUISITES:
303              
304             Here is a list of prerequisites you specified and versions we
305             managed to load:
306              
307             .
308             $str .= join '',
309 1         8 map { sprintf "\t%s %-30s %8s %8s\n",
310             @$_
311              
312             } [' ', 'Module Name', 'Have', 'Want'],
313 1         6 map { my $want = $prq->{$_->name};
314 1 50       92 [ do { $_->is_uptodate(
  1         4  
315             version => $want
316             ) ? ' ' : '!'
317             },
318             $_->name,
319             $_->installed_version,
320             $want
321             ],
322             ### might be empty entries in there
323 1         2 } grep { $_ } @prq;
  1         4  
324              
325 1         5 return $str;
326 21     20   4120 };
  21         61  
  21         4707  
327              
328             use constant REPORT_TOOLCHAIN_VERSIONS
329             => sub {
330 1         4 my $mod = shift;
331 1         3 my $cb = $mod->parent;
332             #die unless $cb->isa('CPANPLUS::Backend');
333              
334 1         10 my @toolchain_modules= qw(
335             CPANPLUS
336             CPANPLUS::Dist::Build
337             Cwd
338             ExtUtils::CBuilder
339             ExtUtils::Command
340             ExtUtils::Install
341             ExtUtils::MakeMaker
342             ExtUtils::Manifest
343             ExtUtils::ParseXS
344             File::Spec
345             Module::Build
346             Pod::Parser
347             Pod::Simple
348             Test::Harness
349             Test::More
350             Test2
351             version
352             );
353              
354             my @toolchain =
355 1         10 grep { $_ } #module_tree returns '' when module is not found
356 1         3 map { $cb->module_tree($_) }
  0         0  
357             sort @toolchain_modules;
358              
359             ### no prereqs?
360 0 50       0 return '' unless @toolchain;
361              
362             ### toolchain modules
363 0         0 my $str = << ".";
364              
365             Perl module toolchain versions installed:
366             .
367             $str .= join '',
368 0         0 map { sprintf "\t%-30s %8s\n",
369             @$_
370              
371             } ['Module Name', 'Have'],
372             map {
373 0         0 [ $_->name,
  1         7  
374             $_->installed_version,
375             ],
376             ### might be empty entries in there
377             } @toolchain;
378              
379 1         5 return $str;
380 21     20   169 };
  21         60  
  22         2097  
381              
382              
383             use constant REPORT_TESTS_SKIPPED
384             => sub {
385 17         38 return << ".";
386              
387             ******************************** NOTE ********************************
388             *** ***
389             *** The tests for this module were skipped during this build ***
390             *** ***
391             **********************************************************************
392              
393             .
394 21     20   159 };
  21         61  
  37         1770  
395              
396             use constant REPORT_MESSAGE_FOOTER
397             => sub {
398 3         22 return << ".";
399              
400             ******************************** NOTE ********************************
401             The comments above are created mechanically, possibly without manual
402             checking by the sender. As there are many people performing automatic
403             tests on each upload to CPAN, it is likely that you will receive
404             identical messages about the same problem.
405              
406             If you believe that the message is mistaken, please reply to the first
407             one with correction and/or additional informations, and do not take
408             it personally. We appreciate your patience. :)
409             **********************************************************************
410              
411             Additional comments:
412              
413             .
414 21     20   192 };
  21         52  
  21         1383  
415              
416             1;
417              
418             # Local variables:
419             # c-indentation-style: bsd
420             # c-basic-offset: 4
421             # indent-tabs-mode: nil
422             # End:
423             # vim: expandtab shiftwidth=4: