File Coverage

blib/lib/WWW/Gitea/API/Releases.pm
Criterion Covered Total %
statement 27 93 29.0
branch 10 88 11.3
condition 5 8 62.5
subroutine 8 19 42.1
pod 11 11 100.0
total 61 219 27.8


line stmt bran cond sub pod time code
1             package WWW::Gitea::API::Releases;
2              
3             # ABSTRACT: Gitea repository releases API
4              
5 5     5   37 use Moo;
  5         11  
  5         36  
6 5     5   2022 use Carp qw(croak);
  5         13  
  5         416  
7 5     5   2799 use WWW::Gitea::Release;
  5         17  
  5         251  
8 5     5   33 use WWW::Gitea::Attachment;
  5         10  
  5         128  
9 5     5   23 use namespace::clean;
  5         7  
  5         21  
10              
11              
12             has client => (
13             is => 'ro',
14             required => 1,
15             weak_ref => 1,
16             );
17              
18              
19             has openapi_operations => (
20             is => 'lazy',
21             builder => sub {
22             return {
23 3     3   126 'releases.list' => { method => 'GET', path => '/repos/{owner}/{repo}/releases' },
24             'releases.create' => { method => 'POST', path => '/repos/{owner}/{repo}/releases' },
25             'releases.get' => { method => 'GET', path => '/repos/{owner}/{repo}/releases/{id}' },
26             'releases.get_by_tag' => { method => 'GET', path => '/repos/{owner}/{repo}/releases/tags/{tag}' },
27             'releases.edit' => { method => 'PATCH', path => '/repos/{owner}/{repo}/releases/{id}' },
28             'releases.delete' => { method => 'DELETE', path => '/repos/{owner}/{repo}/releases/{id}' },
29             'releases.list_assets' => { method => 'GET', path => '/repos/{owner}/{repo}/releases/{id}/assets' },
30             'releases.create_asset' => { method => 'POST', path => '/repos/{owner}/{repo}/releases/{id}/assets' },
31             'releases.get_asset' => { method => 'GET', path => '/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}' },
32             'releases.edit_asset' => { method => 'PATCH', path => '/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}' },
33             'releases.delete_asset' => { method => 'DELETE', path => '/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}' },
34             };
35             },
36             );
37              
38              
39             with 'WWW::Gitea::Role::OpenAPI';
40              
41             sub _wrap {
42 0     0   0 my ($self, $data, $owner, $repo) = @_;
43 0 0       0 return WWW::Gitea::Release->new(
    0          
44             client => $self->client,
45             data => $data,
46             (defined $owner ? (owner => $owner) : ()),
47             (defined $repo ? (repo => $repo) : ()),
48             );
49             }
50              
51             sub list {
52 0     0 1 0 my ($self, $owner, $repo, %query) = @_;
53 0 0       0 croak 'owner required' unless defined $owner;
54 0 0       0 croak 'repo required' unless defined $repo;
55 0         0 my $data = $self->call_operation('releases.list',
56             path => { owner => $owner, repo => $repo }, query => \%query);
57 0 0       0 return [ map { $self->_wrap($_, $owner, $repo) } @{ $data || [] } ];
  0         0  
  0         0  
58             }
59              
60              
61             sub create {
62 0     0 1 0 my ($self, $owner, $repo, %args) = @_;
63 0 0       0 croak 'owner required' unless defined $owner;
64 0 0       0 croak 'repo required' unless defined $repo;
65 0 0       0 croak 'tag_name required' unless defined $args{tag_name};
66 0         0 my $data = $self->call_operation('releases.create',
67             path => { owner => $owner, repo => $repo }, body => \%args);
68 0         0 return $self->_wrap($data, $owner, $repo);
69             }
70              
71              
72             sub get {
73 0     0 1 0 my ($self, $owner, $repo, $id) = @_;
74 0 0       0 croak 'owner required' unless defined $owner;
75 0 0       0 croak 'repo required' unless defined $repo;
76 0 0       0 croak 'id required' unless defined $id;
77 0         0 my $data = $self->call_operation('releases.get',
78             path => { owner => $owner, repo => $repo, id => $id });
79 0         0 return $self->_wrap($data, $owner, $repo);
80             }
81              
82              
83             sub get_by_tag {
84 0     0 1 0 my ($self, $owner, $repo, $tag) = @_;
85 0 0       0 croak 'owner required' unless defined $owner;
86 0 0       0 croak 'repo required' unless defined $repo;
87 0 0       0 croak 'tag required' unless defined $tag;
88 0         0 my $data = $self->call_operation('releases.get_by_tag',
89             path => { owner => $owner, repo => $repo, tag => $tag });
90 0         0 return $self->_wrap($data, $owner, $repo);
91             }
92              
93              
94             sub edit {
95 0     0 1 0 my ($self, $owner, $repo, $id, %args) = @_;
96 0 0       0 croak 'owner required' unless defined $owner;
97 0 0       0 croak 'repo required' unless defined $repo;
98 0 0       0 croak 'id required' unless defined $id;
99 0         0 my $data = $self->call_operation('releases.edit',
100             path => { owner => $owner, repo => $repo, id => $id }, body => \%args);
101 0         0 return $self->_wrap($data, $owner, $repo);
102             }
103              
104              
105             sub delete {
106 0     0 1 0 my ($self, $owner, $repo, $id) = @_;
107 0 0       0 croak 'owner required' unless defined $owner;
108 0 0       0 croak 'repo required' unless defined $repo;
109 0 0       0 croak 'id required' unless defined $id;
110 0         0 return $self->call_operation('releases.delete',
111             path => { owner => $owner, repo => $repo, id => $id });
112             }
113              
114              
115             sub _wrap_asset {
116 2     2   7 my ($self, $data) = @_;
117 2         58 return WWW::Gitea::Attachment->new(client => $self->client, data => $data);
118             }
119              
120             sub assets {
121 0     0 1 0 my ($self, $owner, $repo, $id, %query) = @_;
122 0 0       0 croak 'owner required' unless defined $owner;
123 0 0       0 croak 'repo required' unless defined $repo;
124 0 0       0 croak 'id required' unless defined $id;
125 0         0 my $data = $self->call_operation('releases.list_assets',
126             path => { owner => $owner, repo => $repo, id => $id }, query => \%query);
127 0 0       0 return [ map { $self->_wrap_asset($_) } @{ $data || [] } ];
  0         0  
  0         0  
128             }
129              
130              
131             sub create_asset {
132 3     3 1 4749 my ($self, $owner, $repo, $id, %args) = @_;
133 3 50       17 croak 'owner required' unless defined $owner;
134 3 50       10 croak 'repo required' unless defined $repo;
135 3 50       10 croak 'id required' unless defined $id;
136             croak 'file or content required'
137 3 100 100     277 unless defined $args{file} || defined $args{content};
138 2 50       12 my %query = defined $args{name} ? (name => $args{name}) : ();
139             my %upload = defined $args{file}
140             ? (field => 'attachment', file => $args{file},
141             (defined $args{filename} ? (filename => $args{filename}) : ()))
142             : (field => 'attachment', content => $args{content},
143 2 50 33     19 filename => ($args{filename} // $args{name} // 'attachment'));
    100 50        
144 2 50       27 my $data = $self->call_operation('releases.create_asset',
145             path => { owner => $owner, repo => $repo, id => $id },
146             (%query ? (query => \%query) : ()),
147             upload => \%upload);
148 2         17 return $self->_wrap_asset($data);
149             }
150              
151              
152             sub get_asset {
153 0     0 1   my ($self, $owner, $repo, $id, $attachment_id) = @_;
154 0 0         croak 'owner required' unless defined $owner;
155 0 0         croak 'repo required' unless defined $repo;
156 0 0         croak 'id required' unless defined $id;
157 0 0         croak 'attachment_id required' unless defined $attachment_id;
158 0           my $data = $self->call_operation('releases.get_asset',
159             path => { owner => $owner, repo => $repo, id => $id,
160             attachment_id => $attachment_id });
161 0           return $self->_wrap_asset($data);
162             }
163              
164              
165             sub edit_asset {
166 0     0 1   my ($self, $owner, $repo, $id, $attachment_id, %args) = @_;
167 0 0         croak 'owner required' unless defined $owner;
168 0 0         croak 'repo required' unless defined $repo;
169 0 0         croak 'id required' unless defined $id;
170 0 0         croak 'attachment_id required' unless defined $attachment_id;
171 0           my $data = $self->call_operation('releases.edit_asset',
172             path => { owner => $owner, repo => $repo, id => $id,
173             attachment_id => $attachment_id },
174             body => \%args);
175 0           return $self->_wrap_asset($data);
176             }
177              
178              
179             sub delete_asset {
180 0     0 1   my ($self, $owner, $repo, $id, $attachment_id) = @_;
181 0 0         croak 'owner required' unless defined $owner;
182 0 0         croak 'repo required' unless defined $repo;
183 0 0         croak 'id required' unless defined $id;
184 0 0         croak 'attachment_id required' unless defined $attachment_id;
185 0           return $self->call_operation('releases.delete_asset',
186             path => { owner => $owner, repo => $repo, id => $id,
187             attachment_id => $attachment_id });
188             }
189              
190              
191              
192             1;
193              
194             __END__