File Coverage

blib/lib/Sys/Info/Base.pm
Criterion Covered Total %
statement 84 101 83.1
branch 9 22 40.9
condition 7 22 31.8
subroutine 14 16 87.5
pod 7 7 100.0
total 121 168 72.0


line stmt bran cond sub pod time code
1             package Sys::Info::Base;
2 1     1   416 use strict;
  1         2  
  1         30  
3 1     1   4 use warnings;
  1         1  
  1         22  
4 1     1   3 use vars qw( $VERSION );
  1         1  
  1         37  
5 1     1   449 use IO::File;
  1         7309  
  1         102  
6 1     1   6 use Carp qw( croak );
  1         1  
  1         33  
7 1     1   5 use File::Spec;
  1         1  
  1         16  
8 1     1   4 use Sys::Info::Constants qw( :date OSID );
  1         1  
  1         140  
9 1         55 use constant DRIVER_FAIL_MSG => q{Operating system identified as: '%s'. }
10             . q{Native driver can not be loaded: %s. }
11 1     1   20 . q{Falling back to compatibility mode};
  1         1  
12 1     1   4 use constant YEAR_DIFF => 1900;
  1         2  
  1         809  
13              
14             $VERSION = '0.7804';
15              
16             my %LOAD_MODULE; # cache
17             my %UNAME; # cache
18              
19             sub load_subclass { # hybrid: static+dynamic
20 0     0 1 0 my $self = shift;
21 0   0     0 my $template = shift || croak 'Template missing for load_subclass()';
22 0         0 my $class;
23              
24 0         0 my $eok = eval { $class = $self->load_module( sprintf $template, OSID ); };
  0         0  
25              
26 0 0 0     0 if ( $@ || ! $eok ) {
27 0         0 my $msg = sprintf DRIVER_FAIL_MSG, OSID, $@;
28 0         0 warn "$msg\n";
29 0         0 $class = $self->load_module( sprintf $template, 'Unknown' );
30             }
31              
32 0         0 return $class;
33             }
34              
35             sub load_module {
36 1     1 1 2 my $self = shift;
37 1   33     4 my $class = shift || croak 'No class name specified for load_module()';
38 1 50       3 return $class if $LOAD_MODULE{ $class };
39 1 50       3 croak "Invalid class name: $class" if ref $class;
40 1         3 (my $check = $class) =~ tr/a-zA-Z0-9_://d;
41 1 50       4 croak "Invalid class name: $class" if $check;
42 1         6 my @raw_file = split /::/xms, $class;
43 1         4 my $inc_file = join( q{/}, @raw_file) . '.pm';
44 1 50       4 return $class if exists $INC{ $inc_file };
45 1         15 my $file = File::Spec->catfile( @raw_file ) . '.pm';
46 1         2 my $eok = eval { require $file; };
  1         313  
47 1 50 33     107 croak "Error loading $class: $@" if $@ || ! $eok;
48 1         4 $LOAD_MODULE{ $class } = 1;
49 1         3 $INC{ $inc_file } = $file;
50 1         6 return $class;
51             }
52              
53             sub trim {
54 1     1 1 2 my($self, $str) = @_;
55 1 50       5 return $str if ! $str;
56 1         4 $str =~ s{ \A \s+ }{}xms;
57 1         4 $str =~ s{ \s+ \z }{}xms;
58 1         4 return $str;
59             }
60              
61             sub slurp { # fetches all data inside a flat file
62 1     1 1 9 my $self = shift;
63 1         2 my $file = shift;
64 1   50     6 my $msgerr = shift || 'I can not open file %s for reading: ';
65 1         7 my $FH = IO::File->new;
66 1 50       47 $FH->open( $file ) or croak sprintf($msgerr, $file) . $!;
67 1         58 my $slurped = do {
68 1         5 local $/;
69 1         19 my $rv = <$FH>;
70 1         4 $rv;
71             };
72 1         8 $FH->close;
73 1         16 return $slurped;
74             }
75              
76             sub read_file {
77 1     1 1 3 my $self = shift;
78 1         1 my $file = shift;
79 1   50     6 my $msgerr = shift || 'I can not open file %s for reading: ';
80 1         5 my $FH = IO::File->new;
81 1 50       22 $FH->open( $file ) or croak sprintf( $msgerr, $file ) . $!;
82 1         51 my @flat = <$FH>;
83 1         4 $FH->close;
84 1         14 return @flat;
85             }
86              
87             sub date2time { # date stamp to unix time stamp conversion
88 1     1 1 2 my $self = shift;
89 1   33     4 my $stamp = shift || croak 'No date input specified';
90 1         2 my($i, $j) = (0,0); # index counters
91 1         3 my %wdays = map { $_ => $i++ } DATE_WEEKDAYS;
  7         16  
92 1         4 my %months = map { $_ => $j++ } DATE_MONTHS;
  12         20  
93 1         6 my @junk = split /\s+/xms, $stamp;
94 1         4 my $reg = join q{|}, keys %wdays;
95              
96             # remove until ve get a day name
97 1   66     51 while ( @junk && $junk[0] !~ m{ \A $reg \z }xmsi ) {
98 1         14 shift @junk;
99             }
100 1 50       3 return q{} if ! @junk;
101              
102 1         3 my($wday, $month, $mday, $time, $zone, $year) = @junk;
103 1         4 my($hour, $min, $sec) = split /:/xms, $time;
104              
105 1         560 require POSIX;
106 1         5289 my $unix = POSIX::mktime(
107             $sec,
108             $min,
109             $hour,
110             $mday,
111             $months{$month},
112             $year - YEAR_DIFF,
113             $wdays{$wday},
114             DATE_MKTIME_YDAY,
115             DATE_MKTIME_ISDST,
116             );
117              
118 1         15 return $unix;
119             }
120              
121             sub uname {
122 0     0 1   my $self = shift;
123 0 0         %UNAME = do {
124 0           require POSIX;
125 0           my %u;
126 0           @u{ qw( sysname nodename release version machine ) } = POSIX::uname();
127 0           %u;
128             } if ! %UNAME;
129 0           return { %UNAME };
130             }
131              
132             1;
133              
134             __END__