File Coverage

blib/lib/FFI/Build/File/Base.pm
Criterion Covered Total %
statement 68 82 82.9
branch 13 22 59.0
condition 3 5 60.0
subroutine 21 26 80.7
pod 16 16 100.0
total 121 151 80.1


line stmt bran cond sub pod time code
1             package FFI::Build::File::Base;
2              
3 10     10   97605 use strict;
  10         28  
  10         274  
4 10     10   45 use warnings;
  10         19  
  10         208  
5 10     10   146 use 5.008001;
  10         33  
6 10     10   53 use Carp ();
  10         19  
  10         136  
7 10     10   5800 use File::Temp ();
  10         162229  
  10         249  
8 10     10   129 use File::Basename ();
  10         17  
  10         177  
9 10     10   3485 use FFI::Build::Platform;
  10         27  
  10         585  
10 10     10   69 use overload '""' => sub { $_[0]->path };
  10     84   21  
  10         85  
  84         127143  
11              
12             # ABSTRACT: Base class for File::Build files
13             our $VERSION = '0.10'; # VERSION
14              
15              
16             sub new
17             {
18 75     75 1 140479 my($class, $content, %config) = @_;
19              
20 75   50     507 my $base = $config{base} || 'ffi_build_';
21 75         194 my $dir = $config{dir};
22 75         182 my $build = $config{build};
23 75   66     473 my $platform = $config{platform} || FFI::Build::Platform->new;
24              
25 75         313 my $self = bless {
26             platform => $platform,
27             build => $build,
28             }, $class;
29            
30 75 100       402 if(!defined $content)
    100          
    100          
    50          
31             {
32 1         164 Carp::croak("content is required");
33             }
34             elsif(ref($content) eq 'ARRAY')
35             {
36 37         1152 $self->{path} = File::Spec->catfile(@$content);
37             }
38             elsif(ref($content) eq 'SCALAR')
39             {
40 7         13 my @args;
41 7         26 push @args, "${base}XXXXXX";
42 7 50       24 push @args, DIR => $dir if $dir;
43 7         59 push @args, SUFFIX => $self->default_suffix;
44            
45 7         48 my($fh, $filename) = File::Temp::tempfile(@args);
46            
47 7         4606 binmode( $fh, $self->default_encoding );
48 7         103 print $fh $$content;
49 7         350 close $fh;
50            
51 7         112 $self->{path} = $filename;
52 7         45 $self->{temp} = 1;
53             }
54             elsif(ref($content) eq '')
55             {
56 30         169 $self->{path} = $content;
57             }
58            
59 74 50       303 if($self->platform->osname eq 'MSWin32')
60             {
61 0         0 $self->{native} = File::Spec->catfile($self->{path});
62 0         0 $self->{path} =~ s{\\}{/}g;
63             }
64            
65 74         387 $self;
66             }
67              
68              
69 0     0 1 0 sub default_suffix { die "must define a default extension in subclass" }
70 0     0 1 0 sub default_encoding { die "must define an encoding" }
71 0     0 1 0 sub accept_suffix { () }
72              
73              
74 205     205 1 5090 sub path { shift->{path} }
75 20     20 1 2842 sub basename { File::Basename::basename shift->{path} }
76 51     51 1 5693 sub dirname { File::Basename::dirname shift->{path} }
77 3     3 1 14 sub is_temp { shift->{temp} }
78 174     174 1 884 sub platform { shift->{platform} }
79 90     90 1 924 sub build { shift->{build} }
80              
81              
82             sub native {
83 2     2 1 665 my($self) = @_;
84             $self->platform->osname eq 'MSWin32'
85             ? $self->{native}
86 2 50       6 : $self->{path};
87             }
88              
89              
90             sub slurp
91             {
92 4     4 1 923 my($self) = @_;
93 4         7 my $fh;
94 4 50       19 open($fh, '<', $self->path) || Carp::croak "Error opening @{[ $self->path ]} for read $!";
  0         0  
95 4         34 binmode($fh, $self->default_encoding);
96 4         8 my $content = do { local $/; <$fh> };
  4         13  
  4         116  
97 4         38 close $fh;
98 4         32 $content;
99             }
100              
101              
102             sub keep
103             {
104 1     1 1 11 delete shift->{temp};
105             }
106              
107              
108             sub build_item
109             {
110 0     0 1 0 Carp::croak("Not implemented!");
111             }
112              
113              
114             sub needs_rebuild
115             {
116 0     0 1 0 my($self, @source) = @_;
117             # if the target doesn't exist, then we definitely
118             # need a rebuild.
119 0 0       0 return 1 unless -f $self->path;
120 0         0 my $target_time = [stat $self->path]->[9];
121 0         0 foreach my $source (@source)
122             {
123 0         0 my $source_time = [stat "$source"]->[9];
124 0 0       0 return 1 if $source_time > $target_time;
125             }
126 0         0 return 0;
127             }
128              
129              
130             sub ld
131             {
132 22     22 1 108 return undef;
133             }
134              
135             sub DESTROY
136             {
137 37     37   14542 my($self) = @_;
138            
139 37 100       826 if($self->{temp})
140             {
141 6         92 unlink($self->path);
142             }
143             }
144              
145             1;
146              
147             __END__