File Coverage

lib/APISchema/Schema.pm
Criterion Covered Total %
statement 53 53 100.0
branch 2 2 100.0
condition 7 9 77.7
subroutine 15 15 100.0
pod 0 8 0.0
total 77 87 88.5


line stmt bran cond sub pod time code
1             package APISchema::Schema;
2 10     10   2877 use strict;
  10         20  
  10         293  
3 10     10   53 use warnings;
  10         16  
  10         227  
4 10     10   199 use 5.014;
  10         37  
5              
6 10     10   3432 use APISchema::Route;
  10         27  
  10         304  
7 10     10   73 use APISchema::Resource;
  10         20  
  10         255  
8              
9             use Class::Accessor::Lite (
10 10         45 rw => [qw(title description)],
11 10     10   49 );
  10         18  
12              
13             sub new {
14 81     81 0 49450 my ($class) = @_;
15              
16 81         410 bless {
17             resources => {},
18             routes => [],
19             }, $class;
20             }
21              
22             sub register_resource {
23 129     129 0 299 my ($self, $title, $definition) = @_;
24              
25 129         494 my $resource = APISchema::Resource->new(
26             title => $title,
27             definition => $definition,
28             );
29 129         1005 $self->{resources}->{$title} = $resource;
30              
31 129         1441 return $resource;
32             }
33              
34             sub get_resources {
35 15     15 0 2242 my ($self) = @_;
36              
37 15         27 [ sort { $a->title cmp $b->title } values %{$self->{resources}} ];
  17         91  
  15         90  
38             }
39              
40             sub get_resource_by_name {
41 14     14 0 28202 my ($self, $name) = @_;
42              
43 14   50     103 $self->{resources}->{$name || ''};
44             }
45              
46             sub get_resource_root {
47 82     82 0 179 my ($self) = @_;
48             return +{
49             resource => +{ map {
50 194         750 $_ => $self->{resources}->{$_}->definition;
51 82         153 } keys %{$self->{resources}} },
  82         266  
52             properties => {},
53             };
54             }
55              
56             sub _next_title_candidate {
57 9     9   17 my ($self, $base_title) = @_;
58 9 100       34 if ($base_title =~ /\(([0-9]+)\)$/) {
59 3         9 my $index = $1 + 1;
60 3         25 return $base_title =~ s/\([0-9]+\)$/($index)/r;
61             } else {
62 6         20 return $base_title . '(1)';
63             }
64             }
65              
66             sub register_route {
67 122     122 0 6779 my ($self, %values) = @_;
68              
69             # make fresh title
70 122   100     526 my $title = $values{title} // $values{route} // 'empty_route';
      100        
71 122         298 while ($self->get_route_by_name($title)) {
72 9         13 $title = $self->_next_title_candidate($title);
73             }
74              
75 122         626 my $route = APISchema::Route->new(
76             %values,
77             title => $title,
78             );
79 122         1164 push @{$self->{routes}}, $route;
  122         326  
80 122         1279 return $route;
81             }
82              
83             sub get_routes {
84 249     249 0 8456 my ($self) = @_;
85              
86 249         667 $self->{routes};
87             }
88              
89             sub get_route_by_name {
90 204     204 0 422 my ($self, $name) = @_;
91 204   50     265 my ($route) = grep { ($_->title||'') eq $name } @{$self->get_routes};
  351         1424  
  204         363  
92 204         1223 return $route;
93             }
94              
95             1;