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 9     9   2217 use strict;
  9         17  
  9         225  
3 9     9   41 use warnings;
  9         14  
  9         182  
4 9     9   191 use 5.014;
  9         31  
5              
6 9     9   2031 use APISchema::Route;
  9         24  
  9         270  
7 9     9   64 use APISchema::Resource;
  9         15  
  9         222  
8              
9             use Class::Accessor::Lite (
10 9         36 rw => [qw(title description)],
11 9     9   45 );
  9         15  
12              
13             sub new {
14 75     75 0 41301 my ($class) = @_;
15              
16 75         440 bless {
17             resources => {},
18             routes => [],
19             }, $class;
20             }
21              
22             sub register_resource {
23 118     118 0 280 my ($self, $title, $definition) = @_;
24              
25 118         480 my $resource = APISchema::Resource->new(
26             title => $title,
27             definition => $definition,
28             );
29 118         963 $self->{resources}->{$title} = $resource;
30              
31 118         1439 return $resource;
32             }
33              
34             sub get_resources {
35 14     14 0 3015 my ($self) = @_;
36              
37 14         31 [ sort { $a->title cmp $b->title } values %{$self->{resources}} ];
  16         120  
  14         128  
38             }
39              
40             sub get_resource_by_name {
41 15     15 0 24502 my ($self, $name) = @_;
42              
43 15   50     100 $self->{resources}->{$name || ''};
44             }
45              
46             sub get_resource_root {
47 76     76 0 194 my ($self) = @_;
48             return +{
49             resource => +{ map {
50 183         765 $_ => $self->{resources}->{$_}->definition;
51 76         149 } keys %{$self->{resources}} },
  76         287  
52             properties => {},
53             };
54             }
55              
56             sub _next_title_candidate {
57 9     9   14 my ($self, $base_title) = @_;
58 9 100       32 if ($base_title =~ /\(([0-9]+)\)$/) {
59 3         12 my $index = $1 + 1;
60 3         27 return $base_title =~ s/\([0-9]+\)$/($index)/r;
61             } else {
62 6         59 return $base_title . '(1)';
63             }
64             }
65              
66             sub register_route {
67 113     113 0 5562 my ($self, %values) = @_;
68              
69             # make fresh title
70 113   100     542 my $title = $values{title} // $values{route} // 'empty_route';
      100        
71 113         293 while ($self->get_route_by_name($title)) {
72 9         14 $title = $self->_next_title_candidate($title);
73             }
74              
75 113         589 my $route = APISchema::Route->new(
76             %values,
77             title => $title,
78             );
79 113         987 push @{$self->{routes}}, $route;
  113         262  
80 113         1182 return $route;
81             }
82              
83             sub get_routes {
84 229     229 0 9673 my ($self) = @_;
85              
86 229         554 $self->{routes};
87             }
88              
89             sub get_route_by_name {
90 190     190 0 361 my ($self, $name) = @_;
91 190   50     242 my ($route) = grep { ($_->title||'') eq $name } @{$self->get_routes};
  338         1331  
  190         349  
92 190         1096 return $route;
93             }
94              
95             1;