]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/Version.pm
58a643c183a8c3f47e62286a1905aaa80d701bd2
[debbugs.git] / Debbugs / Version.pm
1 # This module is part of debbugs, and
2 # is released under the terms of the GPL version 2, or any later
3 # version (at your option). See the file README and COPYING for more
4 # information.
5 # Copyright 2018 by Don Armstrong <don@donarmstrong.com>.
6
7 package Debbugs::Version;
8
9 =head1 NAME
10
11 Debbugs::Version -- OO interface to Version
12
13 =head1 SYNOPSIS
14
15    use Debbugs::Version;
16    Debbugs::Version->new(schema => $s,binaries => [qw(foo)],sources => [qw(bar)]);
17
18 =head1 DESCRIPTION
19
20
21
22 =cut
23
24 use Mouse;
25 use strictures 2;
26 use namespace::autoclean;
27
28 use Debbugs::Collection::Package;
29 use Debbugs::OOTypes;
30
31 extends 'Debbugs::OOBase';
32
33 state $strong_severities =
34    {map {($_,1)} @{$config{strong_severities}}};
35
36 has version => (is => 'ro', isa => 'Str',
37                 required => 1,
38                 builder => '_build_version',
39                 predicate => '_has_version',
40                );
41
42 has source_version => (is => 'ro',
43                        isa => 'Str',
44                        builder => '_build_source_version',
45                        predicate => '_has_source_version',
46                        clearer => '_clear_source_version',
47                       );
48
49 has source => (is => 'ro',
50                isa => 'Debbugs::Package',
51                lazy => 1,
52                writer => 'set_source',
53                builder => '_build_source',
54                predicate => '_has_source',
55                clearer => '_clear_source',
56               );
57
58 has packages => (is => 'rw',
59                  isa => 'Debbugs::Collection::Package',
60                  writer => 'set_package',
61                  builder => '_build_package',
62                  predicate => '_has_package',
63                  clearer => '_clear_package',
64                 );
65
66 has 'package_collection' => (is => 'ro',
67                              isa => 'Debbugs::Collection::Package',
68                              builder => '_build_package_collection',
69                              lazy => 1,
70                             );
71
72 sub _build_package_collection {
73     return Debbugs::Collection::Package->new();
74 }
75
76 # one of source_version or version must be provided
77
78 sub BUILD {
79     my $self = shift;
80     my $args = shift;
81     if (not $self->_has_version and
82         not $self->_has_source_version) {
83         confess("Version objects must have at least a source version or a version");
84     }
85     if ($self->_has_source and
86         $self->source->is_source
87        ) {
88         confess("You have provided a source package which is not a source package");
89     }
90 }
91
92 sub _build_version {
93     my $self = shift;
94     my $srcver = $self->source_version;
95     $srcver =~ s{.+/}{};
96     return $srcver;
97 }
98
99 sub _build_source_version {
100     my $self = shift;
101     # should we verify that $self->source is a valid package?
102     my $src = $self->source;
103     if ($src->is_valid) {
104         return $self->source->name.'/'.$self->version;
105     }
106     # do we want invalid sources to be in parenthesis?
107     return $self->version;
108 }
109
110 sub _build_source {
111     my $self = shift;
112     if ($self->_has_binaries) {
113         # this should be the standard case
114         if ($self->binaries->sources->count == 1) {
115             return $self->binaries->sources->first(sub {1});
116         }
117         # might need to figure out how to speed up limit_by_version
118         return $self->binaries->limit_by_version($self->version)->
119             sources;
120     }
121     confess("No binary package, cannot know what source package this version is for");
122 }
123
124 sub _build_packages {
125     my $self = shift;
126     if ($self->_has_source) {
127         return $self->package_collection->
128             get_or_create($self->source->binaries,$self->source);
129     }
130     confess("No source package, cannot know what binary packages this version is for");
131 }
132
133 __PACKAGE__->meta->make_immutable;
134 no Mouse;
135 1;
136
137
138 __END__
139 # Local Variables:
140 # indent-tabs-mode: nil
141 # cperl-indent-level: 4
142 # End: