File: Autopkgtest.pm

package info (click to toggle)
libconfig-model-dpkg-perl 3.017
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,048 kB
  • sloc: perl: 8,530; python: 242; makefile: 77; javascript: 16; sh: 1
file content (153 lines) | stat: -rw-r--r-- 4,087 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package Config::Model::Backend::Dpkg::Autopkgtest;

use strict;
use warnings;
use Mouse;

extends 'Config::Model::Backend::Any';

with 'Config::Model::Backend::DpkgSyntax';
with 'Config::Model::Backend::DpkgStoreRole';

use 5.20.1;

use feature qw/postderef signatures/;
no warnings qw/experimental::postderef experimental::signatures/;

use Carp;
use Config::Model::Exception;
use Log::Log4perl qw(get_logger :levels);
use IO::File;

my $logger = get_logger("Backend::Dpkg::Autopkgtest");
my $user_logger = get_logger('User');

sub read ($self, %args) { ## no critic (ProhibitBuiltinHomonyms)
    # args is:
    # object     => $obj,         # Config::Model::Node object
    # root       => './my_test',  # fake root directory, userd for tests
    # config_dir => /etc/foo',    # absolute path
    # file       => 'foo.conf',   # file name
    # file_path  => './my_test/etc/foo/foo.conf'
    # check      => yes|no|skip

    my $fp = $args{file_path};

    return 0 unless defined $fp and $fp->is_file ;

    $self->parse_control_file($fp, $args{object}, $args{check});

    return 1;
}

sub parse_control_file ($self, $control_file, $node, $check) {
    $logger->info("Parsing $control_file");
    # load autopkgtest control file
    my $c = $self -> parse_dpkg_file ($control_file, $check, 1 ) ;

    my $test_list = $node->fetch_element('control');
    my $test_nb = 0;

    while (@$c ) {
        my ($section_line,$section) = splice @$c,0,2 ;
        my $test_obj = $test_list->fetch_with_id($test_nb++);

        foreach ( my $i = 0 ; $i < $#$section ; $i += 2 ) {
            my $key = $section->[$i];
            my $section_data = $section->[ $i + 1 ];
            if ( my $elt = $test_obj->find_element( $key, case => 'any' ) ) {
                my $elt_obj = $test_obj->fetch_element($elt);
                if ($test_obj->element_type($elt) eq 'list') {
                    $self->store_section_list_element ( $logger, $elt_obj, $check, $section_data);
                }
                else {
                    $self->store_section_leaf_element ( $logger, $elt_obj, $check, $section_data);
                }
            }
            else {
                $user_logger->warn("Unknown parameter found in $control_file: $key");
            }
        }
    }
    return;
}

sub write ($self, %args) { ## no critic (ProhibitBuiltinHomonyms)
    # args is:
    # object     => $obj,         # Config::Model::Node object
    # root       => './my_test',  # fake root directory, userd for tests
    # config_dir => /etc/foo',    # absolute path
    # file       => 'foo.conf',   # file name
    # file_path  => './my_test/etc/foo/foo.conf'

    $self->write_control_file($args{object}, $args{file_path});

    return 1;
}

sub write_control_file ($self, $node, $control_file) {
    my @sections;

    my $test_list = $node->fetch_element('control');
    foreach my $test_nb ( $test_list -> fetch_all_indexes ) {
        push @sections, [ $self->node_to_section($test_list->fetch_with_id($test_nb)) ];
    }

    my $res = $self->write_dpkg_file(\@sections,", " ) ;

    $control_file->spew_utf8($res);

    return;
}

1;

__END__

=head1 NAME

Config::Model::Backend::Dpkg::Autopkgtest - Read and write Debian Dpkg Autopkgtest information

=head1 SYNOPSIS

No synopsis. This class is dedicated to configuration class C<Dpkg::Autopkgtest>

=head1 DESCRIPTION

This module is used directly by L<Config::Model> to read or write the
content of Debian C<Autopkgtest> file.

All C<Autopkgtest> files keyword are read in a case-insensitive manner.

=head1 CONSTRUCTOR

=head2 new

Parameters: C<< node => $node_obj, name => 'Dpkg::Autopkgtest' >>

Inherited from L<Config::Model::Backend::Any>. The constructor will be
called by L<Config::Model::AutoRead>.

=head2 read

Read data from Autopkgtest files.

When a file is read, C<read()> returns 1.

=head2 write

Write data to Autopkgtest files.

C<write()> returns 1.

=head1 AUTHOR

Dominique Dumont, (ddumont at cpan dot org)

=head1 SEE ALSO

L<Config::Model>, 
L<Config::Model::AutoRead>, 
L<Config::Model::Backend::Any>, 

=cut