File Coverage

blib/lib/OS/Package/Factory.pm
Criterion Covered Total %
statement 48 97 49.4
branch 0 26 0.0
condition n/a
subroutine 16 17 94.1
pod 1 1 100.0
total 65 141 46.1


line stmt bran cond sub pod time code
1 3     3   32 use v5.14.0;
  3         8  
  3         108  
2 3     3   12 use warnings;
  3         5  
  3         148  
3              
4             package OS::Package::Factory;
5              
6             # ABSTRACT: Initialize an OS::Package object.
7             our $VERSION = '0.2.7'; # VERSION
8              
9 3     3   11 use Config;
  3         3  
  3         100  
10 3     3   10 use Env qw( $HOME );
  3         5  
  3         21  
11 3     3   654 use File::Basename;
  3         5  
  3         202  
12 3     3   933 use Module::Load;
  3         1601  
  3         23  
13 3     3   879 use OS::Package;
  3         15  
  3         105  
14 3     3   19 use OS::Package::Application;
  3         5  
  3         65  
15 3     3   807 use OS::Package::Artifact;
  3         8  
  3         102  
16 3     3   14 use OS::Package::Config qw( $OSPKG_CONFIG );
  3         6  
  3         245  
17 3     3   14 use OS::Package::Log qw( $LOGGER );
  3         6  
  3         217  
18 3     3   1081 use OS::Package::Maintainer;
  3         9  
  3         115  
19 3     3   22 use OS::Package::System;
  3         6  
  3         74  
20 3     3   14 use Path::Tiny;
  3         3  
  3         175  
21 3     3   16 use YAML::Any qw( LoadFile );
  3         5  
  3         27  
22              
23 3     3   2458 use base qw(Exporter);
  3         4  
  3         2277  
24              
25             our @EXPORT = qw( vivify );
26              
27             local $YAML::UseCode = 0 if !defined $YAML::UseCode;
28             local $YAML::LoadCode = 0 if !defined $YAML::LoadCode;
29              
30             sub vivify {
31 0     0 1   my ($arg_ref) = @_;
32 0           my $name = $arg_ref->{name};
33 0           my $build_id = $arg_ref->{build_id};
34              
35 0           my $cfg_file = sprintf '%s/%s.yml', path( $OSPKG_CONFIG->dir->configs ),
36             lc($name);
37              
38 0 0         if ( !-f $cfg_file ) {
39 0           $LOGGER->logcroak( sprintf 'cannot find configuration file %s for %s',
40             $cfg_file, $name );
41             }
42              
43 0           my $config = LoadFile($cfg_file);
44              
45 0           my $system = OS::Package::System->new;
46              
47 0           my $pkg;
48              
49 0 0         if ( defined $OSPKG_CONFIG->{plugin}{ $system->os }{ $system->version } )
50             {
51 0           my $plugin =
52             $OSPKG_CONFIG->{plugin}{ $system->os }{ $system->version };
53              
54 0           load $plugin;
55              
56 0           my $app = OS::Package::Application->new(
57             name => $config->{name},
58             version => $config->{version}
59             );
60              
61 0           my $maintainer =
62             OS::Package::Maintainer->new(
63             author => $config->{maintainer}{author} );
64              
65 0           foreach my $method (qw( nickname email phone company )) {
66 0 0         if ( defined $config->{maintainer}{$method} ) {
67 0           $maintainer->$method( $config->{maintainer}{$method} );
68             }
69             }
70              
71 0           my $pkg_config = {
72             name => $config->{pkgname},
73             version => $config->{version},
74             prefix => $config->{prefix},
75             description => $config->{description},
76             maintainer => $maintainer,
77             application => $app,
78             };
79              
80 0 0         if ( defined $build_id ) {
81 0           $pkg_config->{build_id} = $build_id;
82             }
83              
84 0           $pkg = $plugin->new($pkg_config);
85              
86             }
87             else {
88 0           $LOGGER->logcroak(
89             sprintf 'cannot find plugin for %s %s',
90             ucfirst( $system->os ),
91             $system->version
92             );
93 0           return;
94             }
95              
96 0 0         if ( defined $config->{build} ) {
97 0           $pkg->install( $config->{build} );
98             }
99              
100 0 0         if ( defined $config->{prune}{directories} ) {
101 0           $pkg->prune_dirs( $config->{prune}{directories} );
102             }
103              
104 0 0         if ( defined $config->{prune}{files} ) {
105 0           $pkg->prune_files( $config->{prune}{files} );
106             }
107              
108 0           my $artifact = OS::Package::Artifact->new;
109              
110 0 0         if ( defined $config->{url} ) {
    0          
111              
112 0           $artifact->distfile( basename( $config->{url} ) );
113 0           $artifact->url( $config->{url} );
114 0           $artifact->repository( path( $OSPKG_CONFIG->dir->repository ) );
115              
116 0 0         if ( defined $config->{md5} ) {
117 0           $artifact->md5( $config->{md5} );
118             }
119              
120 0 0         if ( defined $config->{sha1} ) {
121 0           $artifact->sha1( $config->{sha1} );
122             }
123              
124 0           my $savefile = sprintf( '%s/%s',
125             path( $OSPKG_CONFIG->dir->repository ),
126             basename( $config->{url} ) );
127              
128 0           $artifact->savefile($savefile);
129              
130             }
131             elsif ( defined $config->{os}{ $pkg->system->os }{ $pkg->system->type } )
132             {
133              
134 0           my $artifact_cfg =
135             $config->{os}{ $pkg->system->os }{ $pkg->system->type };
136              
137 0           $artifact = OS::Package::Artifact->new(
138             distfile => basename( $artifact_cfg->{url} ),
139             url => $artifact_cfg->{url},
140             repository => path( $OSPKG_CONFIG->dir->repository )
141             );
142              
143 0 0         if ( defined $artifact_cfg->{md5} ) {
144 0           $artifact->md5( $artifact_cfg->{md5} );
145             }
146              
147 0 0         if ( defined $artifact_cfg->{sha1} ) {
148 0           $artifact->sha1( $artifact_cfg->{sha1} );
149             }
150              
151             $artifact->savefile(
152 0           sprintf( '%s/%s',
153             path( $OSPKG_CONFIG->dir->repository ),
154             basename( $artifact_cfg->{url} ) )
155             );
156              
157             }
158              
159 0           $pkg->artifact($artifact);
160              
161 0           return $pkg;
162             }
163              
164             1;
165              
166             __END__