File Coverage

blib/lib/R/Setup/Install.pm
Criterion Covered Total %
statement 8 57 14.0
branch 0 12 0.0
condition 0 9 0.0
subroutine 3 11 27.2
pod 0 8 0.0
total 11 97 11.3


line stmt bran cond sub pod time code
1             # perl program
2             # R package installation routine
3             # it requires
4             # inputs: list of all package tars
5             # source: directory where package_version.tar.gz are, default=$PWD
6             #
7             # Copyright (C) 2015, Snehasis Sinha
8             #
9              
10             package R::Setup::Install;
11              
12 2     2   21511 use 5.010001;
  2         8  
13 2     2   10 use strict;
  2         5  
  2         43  
14 2     2   16 use warnings;
  2         5  
  2         1559  
15              
16             our @ISA = qw();
17             our $VERSION = '0.01';
18              
19              
20             # package methods
21              
22             sub new {
23 0     0 0   my $class = shift;
24 0           my %params = (@_);
25             my $self = {
26             _install => 'R CMD INSTALL', # R install command, R should be in $PATH
27             _rbin => 'R -q --no-save', # R query command
28             _file => $params{'file'} || undef, # filename containing package list in order
29             _list => $params{'list'} || undef, # listref containing package list in order
30             _has => undef, # listref of already installed packages
31 0   0       _verbose => $params{'verbose'} || 1, # default: yes
      0        
      0        
32             };
33 0           bless $self, $class;
34 0           return $self;
35             }
36              
37             # extract from package list (persistency)
38             sub p_read_from_file {
39 0     0 0   my ($self) = (@_);
40 0 0 0       return unless (defined $self->{'file'} && -f $self->{'file'} );
41            
42 0 0         open FILE, "<".$self->{'file'} or die $!;
43 0           my @list = ;
44 0           close FILE;
45 0           chomp @list;
46              
47 0           $self->{'_list'} = \@list;
48             }
49              
50             # gets package id
51             sub p_get_package_id {
52 0     0 0   my ($self, $pkgname) = (@_);
53 0           $pkgname =~ s/\_.*//;
54 0           return $pkgname;
55             }
56              
57             # gets installed packages
58             sub p_installed_packages {
59 0     0 0   my ($self) = (@_);
60 0           my $rcmd = 'installed.packages\(.Library\)';
61              
62 0           my @out = qx(echo $rcmd | $self->{'_rbin'});
63 0           chomp @out;
64 0           @out = grep(/^[a-zA-Z]+/, @out);
65              
66 0           my %pkgs;
67 0           foreach (@out) {
68 0           s/\s+.*//g;
69 0           $pkgs{$_}=1;
70             }
71              
72 0           $self->{'_has'} = \%pkgs;
73             }
74              
75             # actually install a package
76             sub p_install {
77 0     0 0   my ($self, %args) = (@_);
78 0           my $ret;
79 0           my $cmd = $self->{'_install'}.' '.$args{'package'}.' 2>&1';
80              
81 0 0         print "executing ".$cmd."\n" if defined $self->{'_verbose'};
82 0           $ret = qx($cmd);
83             }
84              
85             sub pr {
86 0     0 0   my ($self, %args) = (@_);
87 0 0         print sprintf "%-40s _%s_\n", $args{'package'}, $args{'state'} if $self->{'_verbose'};
88             }
89              
90             sub install {
91 0     0 0   my ($self) = (@_);
92              
93             # read from file, if any
94 0           $self->p_read_from_file;
95              
96             # populate hash of installed packages
97 0           $self->p_installed_packages;
98              
99             # actually install
100 0           $self->p_install_packages;
101             }
102              
103             # install packages from the given list
104             sub p_install_packages {
105 0     0 0   my ($self) = (@_);
106 0           my $p;
107              
108 0           foreach my $pkg ( @{$self->{'_list'}} ) {
  0            
109             # get the package id
110 0           $p = $self->p_get_package_id ( $pkg );
111              
112             # check if already installed
113 0 0         if (defined $self->{'_has'}->{$p}) {
114 0           $self->pr (package=>$p, state=>'skipped');
115 0           next;
116             }
117              
118             # check if the tarball is available
119 0 0         unless ( -f $pkg ) {
120 0           $self->pr (package=>$p, state=>'missing');
121 0           next;
122             }
123              
124             # now install
125 0           $self->p_install (package=>$pkg);
126 0           $self->pr (package=>$p, state=>'done');
127             }
128             }
129              
130             1;
131              
132             __END__