Prepare Module::CoreList for 5.21.5, expected on 2014-10-20
[perl.git] / dist / Module-CoreList / lib / Module / CoreList / Utils.pm
1 package Module::CoreList::Utils;
2
3 use strict;
4 use warnings;
5 use vars qw[$VERSION %utilities];
6 use Module::CoreList;
7 use Module::CoreList::TieHashDelta;
8
9 $VERSION = '5.20141020';
10
11 sub utilities {
12     my $perl = shift;
13     $perl = shift if eval { $perl->isa(__PACKAGE__) };
14     return unless $perl or exists $utilities{$perl};
15     return sort keys %{ $utilities{$perl} };
16 }
17
18 sub first_release_raw {
19     my $util = shift;
20     $util = shift if eval { $util->isa(__PACKAGE__) };
21       #and scalar @_ and $_[0] =~ m#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z#;
22     my $version = shift;
23
24     my @perls = $version
25         ? grep { exists $utilities{$_}{ $util } &&
26                         $utilities{$_}{ $util } ge $version } keys %utilities
27         : grep { exists $utilities{$_}{ $util }             } keys %utilities;
28
29     return grep { exists $Module::CoreList::released{$_} } @perls;
30 }
31
32 sub first_release_by_date {
33     my @perls = &first_release_raw;
34     return unless @perls;
35     return (sort { $Module::CoreList::released{$a} cmp $Module::CoreList::released{$b} } @perls)[0];
36 }
37
38 sub first_release {
39     my @perls = &first_release_raw;
40     return unless @perls;
41     return (sort { $a cmp $b } @perls)[0];
42 }
43
44 sub removed_from {
45   my @perls = &removed_raw;
46   return shift @perls;
47 }
48
49 sub removed_from_by_date {
50   my @perls = sort { $Module::CoreList::released{$a} cmp $Module::CoreList::released{$b} } &removed_raw;
51   return shift @perls;
52 }
53
54 sub removed_raw {
55   my $util = shift;
56   $util = shift if eval { $util->isa(__PACKAGE__) };
57   return unless my @perls = sort { $a cmp $b } first_release_raw($util);
58   @perls = grep { exists $Module::CoreList::released{$_} } @perls;
59   my $last = pop @perls;
60   my @removed = grep { $_ > $last } sort { $a cmp $b } keys %utilities;
61   return @removed;
62 }
63
64 my %delta = (
65     5 => {
66         changed => {
67             'a2p'                   => '1',
68             'c2ph'                  => '1',
69             'cppstdin'              => '1',
70             'find2perl'             => '1',
71             'pstruct'               => '1',
72             's2p'                   => '1',
73         },
74         removed => {
75         }
76     },
77
78     5.001 => {
79         delta_from => 5,
80         changed => {
81             'h2xs'                  => '1',
82         },
83         removed => {
84         }
85     },
86
87     5.002 => {
88         delta_from => 5.001,
89         changed => {
90             'h2ph'                  => '1',
91             'perlbug'               => '1',
92             'perldoc'               => '1',
93             'pod2html'              => '1',
94             'pod2latex'             => '1',
95             'pod2man'               => '1',
96             'pod2text'              => '1',
97         },
98         removed => {
99         }
100     },
101
102     5.00307 => {
103         delta_from => 5.002,
104         changed => {
105             'pl2pm'                 => '1',
106         },
107         removed => {
108            'cppstdin'              => 1,
109            'pstruct'               => 1,
110         }
111     },
112
113     5.004 => {
114         delta_from => 5.00307,
115         changed => {
116             'splain'                => '1',
117         },
118         removed => {
119         }
120     },
121
122     5.005 => {
123         delta_from => 5.00405,
124         changed => {
125             'perlcc'                => '1',
126         },
127         removed => {
128         }
129     },
130
131     5.00503 => {
132         delta_from => 5.005,
133         changed => {
134         },
135         removed => {
136         }
137     },
138
139     5.00405 => {
140         delta_from => 5.004,
141         changed => {
142         },
143         removed => {
144         }
145     },
146
147     5.006 => {
148         delta_from => 5.00504,
149         changed => {
150             'dprofpp'               => '1',
151             'pod2usage'             => '1',
152             'podchecker'            => '1',
153             'podselect'             => '1',
154             'pstruct'               => '1',
155         },
156         removed => {
157         }
158     },
159
160     5.006001 => {
161         delta_from => 5.006,
162         changed => {
163         },
164         removed => {
165         }
166     },
167
168     5.007003 => {
169         delta_from => 5.006002,
170         changed => {
171             'libnetcfg'             => '1',
172             'perlivp'               => '1',
173             'psed'                  => '1',
174             'xsubpp'                => '1',
175         },
176         removed => {
177         }
178     },
179
180     5.008 => {
181         delta_from => 5.007003,
182         changed => {
183             'enc2xs'                => '1',
184             'piconv'                => '1',
185         },
186         removed => {
187         }
188     },
189
190     5.008001 => {
191         delta_from => 5.008,
192         changed => {
193             'cpan'                  => '1',
194         },
195         removed => {
196         }
197     },
198
199     5.009 => {
200         delta_from => 5.008009,
201         changed => {
202         },
203         removed => {
204            'corelist'              => 1,
205            'instmodsh'             => 1,
206            'prove'                 => 1,
207         }
208     },
209
210     5.008002 => {
211         delta_from => 5.008001,
212         changed => {
213         },
214         removed => {
215         }
216     },
217
218     5.006002 => {
219         delta_from => 5.006001,
220         changed => {
221         },
222         removed => {
223         }
224     },
225
226     5.008003 => {
227         delta_from => 5.008002,
228         changed => {
229             'instmodsh'             => '1',
230             'prove'                 => '1',
231         },
232         removed => {
233         }
234     },
235
236     5.00504 => {
237         delta_from => 5.00503,
238         changed => {
239         },
240         removed => {
241         }
242     },
243
244     5.009001 => {
245         delta_from => 5.009,
246         changed => {
247             'instmodsh'             => '1',
248             'prove'                 => '1',
249         },
250         removed => {
251         }
252     },
253
254     5.008004 => {
255         delta_from => 5.008003,
256         changed => {
257         },
258         removed => {
259         }
260     },
261
262     5.008005 => {
263         delta_from => 5.008004,
264         changed => {
265         },
266         removed => {
267         }
268     },
269
270     5.008006 => {
271         delta_from => 5.008005,
272         changed => {
273         },
274         removed => {
275         }
276     },
277
278     5.009002 => {
279         delta_from => 5.009001,
280         changed => {
281             'corelist'              => '1',
282         },
283         removed => {
284         }
285     },
286
287     5.008007 => {
288         delta_from => 5.008006,
289         changed => {
290         },
291         removed => {
292         }
293     },
294
295     5.009003 => {
296         delta_from => 5.009002,
297         changed => {
298             'ptar'                  => '1',
299             'ptardiff'              => '1',
300             'shasum'                => '1',
301         },
302         removed => {
303         }
304     },
305
306     5.008008 => {
307         delta_from => 5.008007,
308         changed => {
309         },
310         removed => {
311         }
312     },
313
314     5.009004 => {
315         delta_from => 5.009003,
316         changed => {
317             'config_data'           => '1',
318         },
319         removed => {
320         }
321     },
322
323     5.009005 => {
324         delta_from => 5.009004,
325         changed => {
326             'cpan2dist'             => '1',
327             'cpanp'                 => '1',
328             'cpanp-run-perl'        => '1',
329         },
330         removed => {
331            'perlcc'                => 1,
332         }
333     },
334
335     5.010000 => {
336         delta_from => 5.009005,
337         changed => {
338         },
339         removed => {
340         }
341     },
342
343     5.008009 => {
344         delta_from => 5.008008,
345         changed => {
346             'corelist'              => '1',
347         },
348         removed => {
349         }
350     },
351
352     5.010001 => {
353         delta_from => 5.010000,
354         changed => {
355         },
356         removed => {
357         }
358     },
359
360     5.011 => {
361         delta_from => 5.010001,
362         changed => {
363         },
364         removed => {
365         }
366     },
367
368     5.011001 => {
369         delta_from => 5.011,
370         changed => {
371         },
372         removed => {
373         }
374     },
375
376     5.011002 => {
377         delta_from => 5.011001,
378         changed => {
379             'perlthanks'            => '1',
380         },
381         removed => {
382         }
383     },
384
385     5.011003 => {
386         delta_from => 5.011002,
387         changed => {
388         },
389         removed => {
390         }
391     },
392
393     5.011004 => {
394         delta_from => 5.011003,
395         changed => {
396         },
397         removed => {
398         }
399     },
400
401     5.011005 => {
402         delta_from => 5.011004,
403         changed => {
404         },
405         removed => {
406         }
407     },
408
409     5.012 => {
410         delta_from => 5.011005,
411         changed => {
412         },
413         removed => {
414         }
415     },
416
417     5.013 => {
418         delta_from => 5.012005,
419         changed => {
420         },
421         removed => {
422         }
423     },
424
425     5.012001 => {
426         delta_from => 5.012,
427         changed => {
428         },
429         removed => {
430         }
431     },
432
433     5.013001 => {
434         delta_from => 5.013,
435         changed => {
436         },
437         removed => {
438         }
439     },
440
441     5.013002 => {
442         delta_from => 5.013001,
443         changed => {
444         },
445         removed => {
446         }
447     },
448
449     5.013003 => {
450         delta_from => 5.013002,
451         changed => {
452         },
453         removed => {
454         }
455     },
456
457     5.013004 => {
458         delta_from => 5.013003,
459         changed => {
460         },
461         removed => {
462         }
463     },
464
465     5.012002 => {
466         delta_from => 5.012001,
467         changed => {
468         },
469         removed => {
470         }
471     },
472
473     5.013005 => {
474         delta_from => 5.013004,
475         changed => {
476         },
477         removed => {
478         }
479     },
480
481     5.013006 => {
482         delta_from => 5.013005,
483         changed => {
484         },
485         removed => {
486         }
487     },
488
489     5.013007 => {
490         delta_from => 5.013006,
491         changed => {
492             'ptargrep'              => '1',
493         },
494         removed => {
495         }
496     },
497
498     5.013008 => {
499         delta_from => 5.013007,
500         changed => {
501         },
502         removed => {
503         }
504     },
505
506     5.013009 => {
507         delta_from => 5.013008,
508         changed => {
509             'json_pp'               => '1',
510         },
511         removed => {
512         }
513     },
514
515     5.012003 => {
516         delta_from => 5.012002,
517         changed => {
518         },
519         removed => {
520         }
521     },
522
523     5.013010 => {
524         delta_from => 5.013009,
525         changed => {
526         },
527         removed => {
528         }
529     },
530
531     5.013011 => {
532         delta_from => 5.013010,
533         changed => {
534         },
535         removed => {
536         }
537     },
538
539     5.014 => {
540         delta_from => 5.013011,
541         changed => {
542         },
543         removed => {
544         }
545     },
546
547     5.014001 => {
548         delta_from => 5.014,
549         changed => {
550         },
551         removed => {
552         }
553     },
554
555     5.015 => {
556         delta_from => 5.014004,
557         changed => {
558         },
559         removed => {
560            'dprofpp'               => 1,
561         }
562     },
563
564     5.012004 => {
565         delta_from => 5.012003,
566         changed => {
567         },
568         removed => {
569         }
570     },
571
572     5.015001 => {
573         delta_from => 5.015,
574         changed => {
575         },
576         removed => {
577         }
578     },
579
580     5.015002 => {
581         delta_from => 5.015001,
582         changed => {
583         },
584         removed => {
585         }
586     },
587
588     5.015003 => {
589         delta_from => 5.015002,
590         changed => {
591         },
592         removed => {
593         }
594     },
595
596     5.014002 => {
597         delta_from => 5.014001,
598         changed => {
599         },
600         removed => {
601         }
602     },
603
604     5.015004 => {
605         delta_from => 5.015003,
606         changed => {
607         },
608         removed => {
609         }
610     },
611
612     5.015005 => {
613         delta_from => 5.015004,
614         changed => {
615         },
616         removed => {
617         }
618     },
619
620     5.015006 => {
621         delta_from => 5.015005,
622         changed => {
623             'zipdetails'            => '1',
624         },
625         removed => {
626         }
627     },
628
629     5.015007 => {
630         delta_from => 5.015006,
631         changed => {
632         },
633         removed => {
634         }
635     },
636
637     5.015008 => {
638         delta_from => 5.015007,
639         changed => {
640         },
641         removed => {
642         }
643     },
644
645     5.015009 => {
646         delta_from => 5.015008,
647         changed => {
648         },
649         removed => {
650         }
651     },
652
653     5.016 => {
654         delta_from => 5.015009,
655         changed => {
656         },
657         removed => {
658         }
659     },
660
661     5.017 => {
662         delta_from => 5.016003,
663         changed => {
664         },
665         removed => {
666         }
667     },
668
669     5.017001 => {
670         delta_from => 5.017,
671         changed => {
672         },
673         removed => {
674         }
675     },
676
677     5.017002 => {
678         delta_from => 5.017001,
679         changed => {
680         },
681         removed => {
682         }
683     },
684
685     5.016001 => {
686         delta_from => 5.016,
687         changed => {
688         },
689         removed => {
690         }
691     },
692
693     5.017003 => {
694         delta_from => 5.017002,
695         changed => {
696         },
697         removed => {
698         }
699     },
700
701     5.017004 => {
702         delta_from => 5.017003,
703         changed => {
704         },
705         removed => {
706         }
707     },
708
709     5.014003 => {
710         delta_from => 5.014002,
711         changed => {
712         },
713         removed => {
714         }
715     },
716
717     5.017005 => {
718         delta_from => 5.017004,
719         changed => {
720         },
721         removed => {
722         }
723     },
724
725     5.016002 => {
726         delta_from => 5.016001,
727         changed => {
728         },
729         removed => {
730         }
731     },
732
733     5.012005 => {
734         delta_from => 5.012004,
735         changed => {
736         },
737         removed => {
738         }
739     },
740
741     5.017006 => {
742         delta_from => 5.017005,
743         changed => {
744         },
745         removed => {
746         }
747     },
748
749     5.017007 => {
750         delta_from => 5.017006,
751         changed => {
752         },
753         removed => {
754         }
755     },
756
757     5.017008 => {
758         delta_from => 5.017007,
759         changed => {
760         },
761         removed => {
762         }
763     },
764
765     5.017009 => {
766         delta_from => 5.017008,
767         changed => {
768         },
769         removed => {
770         }
771     },
772
773     5.014004 => {
774         delta_from => 5.014003,
775         changed => {
776         },
777         removed => {
778         }
779     },
780
781     5.016003 => {
782         delta_from => 5.016002,
783         changed => {
784         },
785         removed => {
786         }
787     },
788
789     5.017010 => {
790         delta_from => 5.017009,
791         changed => {
792         },
793         removed => {
794         }
795     },
796
797     5.017011 => {
798         delta_from => 5.017010,
799         changed => {
800         },
801         removed => {
802         }
803     },
804     5.018000 => {
805         delta_from => 5.017011,
806         changed => {
807         },
808         removed => {
809         }
810     },
811     5.018001 => {
812         delta_from => 5.018000,
813         changed => {
814         },
815         removed => {
816         }
817     },
818     5.018002 => {
819         delta_from => 5.018001,
820         changed => {
821         },
822         removed => {
823         }
824     },
825     5.019000 => {
826         delta_from => 5.018000,
827         changed => {
828         },
829         removed => {
830             'cpan2dist'             => '1',
831             'cpanp'                 => '1',
832             'cpanp-run-perl'        => '1',
833             'pod2latex'             => '1',
834         }
835     },
836     5.019001 => {
837         delta_from => 5.019000,
838         changed => {
839         },
840         removed => {
841         }
842     },
843     5.019002 => {
844         delta_from => 5.019001,
845         changed => {
846         },
847         removed => {
848         }
849     },
850     5.019003 => {
851         delta_from => 5.019002,
852         changed => {
853         },
854         removed => {
855         }
856     },
857     5.019004 => {
858         delta_from => 5.019003,
859         changed => {
860         },
861         removed => {
862         }
863     },
864     5.019005 => {
865         delta_from => 5.019004,
866         changed => {
867         },
868         removed => {
869         }
870     },
871     5.019006 => {
872         delta_from => 5.019005,
873         changed => {
874         },
875         removed => {
876         }
877     },
878     5.019007 => {
879         delta_from => 5.019006,
880         changed => {
881         },
882         removed => {
883         }
884     },
885     5.019008 => {
886         delta_from => 5.019007,
887         changed => {
888         },
889         removed => {
890         }
891     },
892     5.019009 => {
893         delta_from => 5.019008,
894         changed => {
895         },
896         removed => {
897         }
898     },
899     5.019010 => {
900         delta_from => 5.019009,
901         changed => {
902         },
903         removed => {
904         }
905     },
906     5.019011 => {
907         delta_from => 5.019010,
908         changed => {
909         },
910         removed => {
911         }
912     },
913     5.020000 => {
914         delta_from => 5.019011,
915         changed => {
916         },
917         removed => {
918         }
919     },
920     5.021000 => {
921         delta_from => 5.020000,
922         changed => {
923         },
924         removed => {
925         }
926     },
927     5.021001 => {
928         delta_from => 5.021000,
929         changed => {
930         },
931         removed => {
932             'a2p'                   => 1,
933             'config_data'           => 1,
934             'find2perl'             => 1,
935             'psed'                  => 1,
936             's2p'                   => 1,
937         }
938     },
939     5.021002 => {
940         delta_from => 5.021001,
941         changed => {
942         },
943         removed => {
944         }
945     },
946     5.021003 => {
947         delta_from => 5.021002,
948         changed => {
949         },
950         removed => {
951         }
952     },
953     5.020001 => {
954         delta_from => 5.02,
955         changed => {
956         },
957         removed => {
958         }
959     },
960     5.021004 => {
961         delta_from => 5.021003,
962         changed => {
963         },
964         removed => {
965         }
966     },
967     5.021005 => {
968         delta_from => 5.021004,
969         changed => {
970         },
971         removed => {
972         }
973     },
974 );
975
976 for my $version (sort { $a <=> $b } keys %delta) {
977     my $data = $delta{$version};
978
979     tie %{$utilities{$version}}, 'Module::CoreList::TieHashDelta',
980         $data->{changed}, $data->{removed},
981         $data->{delta_from} ? $utilities{$data->{delta_from}} : undef;
982 }
983
984 # Create aliases with trailing zeros for $] use
985
986 $utilities{'5.000'} = $utilities{5};
987
988 _create_aliases(\%utilities);
989
990 sub _create_aliases {
991     my ($hash) = @_;
992
993     for my $version (keys %$hash) {
994         next unless $version >= 5.010;
995
996         my $padded = sprintf "%0.6f", $version;
997
998         # If the version in string form isn't the same as the numeric version,
999         # alias it.
1000         if ($padded ne $version && $version == $padded) {
1001             $hash->{$padded} = $hash->{$version};
1002         }
1003     }
1004 }
1005
1006 'foo';
1007
1008 =pod
1009
1010 =head1 NAME
1011
1012 Module::CoreList::Utils - what utilities shipped with versions of perl
1013
1014 =head1 SYNOPSIS
1015
1016  use Module::CoreList::Utils;
1017
1018  print $Module::CoreList::Utils::utilities{5.009003}{ptar}; # prints 1
1019
1020  print Module::CoreList::Utils->first_release('corelist');           # prints 5.008009
1021  print Module::CoreList::Utils->first_release_by_date('corelist');   # prints 5.009002
1022
1023 =head1 DESCRIPTION
1024
1025 Module::CoreList::Utils provides information on which core and dual-life utilities shipped
1026 with each version of L<perl>.
1027
1028 It provides a number of mechanisms for querying this information.
1029
1030 There is a functional programming API available for programmers to query
1031 information.
1032
1033 Programmers may also query the contained hash structure to find relevant
1034 information.
1035
1036 =head1 FUNCTIONS API
1037
1038 These are the functions that are available, they may either be called as functions or class methods:
1039
1040   Module::CoreList::Utils::first_release('corelist'); # as a function
1041
1042   Module::CoreList::Utils->first_release('corelist'); # class method
1043
1044 =over
1045
1046 =item C<utilities>
1047
1048 Requires a perl version as an argument, returns a list of utilities that shipped with
1049 that version of perl, or undef/empty list if that perl doesn't exist.
1050
1051 =item C<first_release( UTILITY )>
1052
1053 Requires a UTILITY name as an argument, returns the perl version when that utility first
1054 appeared in core as ordered by perl version number or undef ( in scalar context )
1055 or an empty list ( in list context ) if that utility is not in core.
1056
1057 =item C<first_release_by_date( UTILITY )>
1058
1059 Requires a UTILITY name as an argument, returns the perl version when that utility first
1060 appeared in core as ordered by release date or undef ( in scalar context )
1061 or an empty list ( in list context ) if that utility is not in core.
1062
1063 =item C<removed_from( UTILITY )>
1064
1065 Takes a UTILITY name as an argument, returns the first perl version where that utility
1066 was removed from core. Returns undef if the given utility was never in core or remains
1067 in core.
1068
1069 =item C<removed_from_by_date( UTILITY )>
1070
1071 Takes a UTILITY name as an argument, returns the first perl version by release date where that
1072 utility was removed from core. Returns undef if the given utility was never in core or remains
1073 in core.
1074
1075 =back
1076
1077 =head1 DATA STRUCTURES
1078
1079 These are the hash data structures that are available:
1080
1081 =over
1082
1083 =item C<%Module::CoreList::Utils::utilities>
1084
1085 A hash of hashes that is keyed on perl version as indicated
1086 in $].  The second level hash is utility / defined pairs.
1087
1088 =back
1089
1090 =head1 AUTHOR
1091
1092 Chris C<BinGOs> Williams <chris@bingosnet.co.uk>
1093
1094 Currently maintained by the perl 5 porters E<lt>perl5-porters@perl.orgE<gt>.
1095
1096 This module is the result of archaeology undertaken during QA Hackathon
1097 in Lancaster, April 2013.
1098
1099 =head1 LICENSE
1100
1101 Copyright (C) 2013 Chris Williams.  All Rights Reserved.
1102
1103 This module is free software; you can redistribute it and/or modify it
1104 under the same terms as Perl itself.
1105
1106 =head1 SEE ALSO
1107
1108 L<corelist>, L<Module::CoreList>, L<perl>, L<http://perlpunks.de/corelist>
1109
1110 =cut