File Coverage

lib/APISchema/Generator/Markdown.pm
Criterion Covered Total %
statement 53 53 100.0
branch 8 8 100.0
condition 9 9 100.0
subroutine 9 9 100.0
pod 0 3 0.0
total 79 82 96.3


line stmt bran cond sub pod time code
1             package APISchema::Generator::Markdown;
2 2     2   2143 use strict;
  2         5  
  2         66  
3 2     2   11 use warnings;
  2         6  
  2         62  
4              
5             # lib
6 2     2   475 use APISchema::Generator::Markdown::Formatter;
  2         6  
  2         193  
7 2     2   572 use APISchema::Generator::Markdown::ExampleFormatter;
  2         6  
  2         85  
8 2     2   488 use APISchema::Generator::Markdown::ResourceResolver;
  2         8  
  2         79  
9              
10             # cpan
11 2     2   279 use Text::MicroTemplate::DataSection qw();
  2         15409  
  2         1206  
12              
13             sub new {
14 11     11 0 6307 my ($class) = @_;
15              
16 11         89 my $renderer = Text::MicroTemplate::DataSection->new(
17             escape_func => undef
18             );
19             bless {
20             renderer => $renderer,
21             map {
22 11         1069 ( $_ => $renderer->build_file($_) );
  88         160499  
23             } qw(index toc route resource request response
24             request_example response_example),
25             }, $class;
26             }
27              
28             sub resolve_encoding ($) {
29 19     19 0 76 my ($resources) = @_;
30 19 100       76 $resources = { body => $resources } unless ref $resources;
31 19   100     101 my $encoding = $resources->{encoding} // { '' => 'auto' };
32 19 100       54 $encoding = { '' => $encoding } unless ref $encoding;
33 19         95 return { %$resources, encoding => $encoding };
34             }
35              
36             sub format_schema {
37 10     10 0 9375 my ($self, $schema) = @_;
38              
39 10         42 my $renderer = $self->{renderer};
40 10         62 my $routes = $schema->get_routes;
41 10         46 my $resources = $schema->get_resources;
42              
43 10         98 my $root = $schema->get_resource_root;
44 10         174 my $resolver = APISchema::Generator::Markdown::ResourceResolver->new(
45             schema => $root,
46             );
47             return $self->{index}->(
48             $renderer,
49             $schema,
50             $self->{toc}->(
51             $renderer,
52             $routes,
53             $resources,
54             ),
55             join('', map {
56 9         943 my $route = $_;
57 9         35 my $req = resolve_encoding($route->request_resource);
58 9         43 my $request_resource = $route->canonical_request_resource($root);
59              
60 9         116 my $codes = do {
61 9         41 my $res = $route->response_resource;
62 9 100 100     96 $res = {} unless $res && ref $res;
63 9         45 [ sort grep { $_ =~ qr!\A[0-9]+\z! } keys %$res ];
  2         25  
64             };
65 9   100     53 my $default_code = $codes->[0] // 200;
66 9         41 my $response_resource = $route->canonical_response_resource($root, [
67             $default_code
68             ]);
69              
70 9         107 my $res = $_->response_resource;
71             $res = scalar @$codes
72 9 100       62 ? { map { $_ => resolve_encoding($res->{$_}) } @$codes }
  2         6  
73             : { '' => resolve_encoding($res) };
74              
75             $self->{route}->(
76             $renderer,
77             $route,
78             {
79             req => $self->{request_example}->(
80             $renderer,
81             $route,
82             APISchema::Generator::Markdown::ExampleFormatter->new(
83             resolver => $resolver,
84             spec => $request_resource,
85             ),
86             ),
87             res => $self->{response_example}->(
88             $renderer,
89             $route,
90             $default_code,
91             APISchema::Generator::Markdown::ExampleFormatter->new(
92             resolver => $resolver,
93             spec => $response_resource,
94             ),
95             ),
96             },
97             {
98             req => $self->{request}->($renderer, $route, $req),
99             res => join("\n", map {
100 9         69 $self->{response}->($renderer, $route, $_, $res->{$_});
  10         471  
101             } sort keys %$res),
102             },
103             );
104             } @$routes),
105             join('', map {
106 18         401 my $properties = $resolver->properties($_->definition);
107 18         94 $self->{resource}->($renderer, $resolver, $_, [ map { +{
108             path => $_,
109 39         527 definition => $properties->{$_},
110             } } sort keys %$properties ]);
111             } grep {
112 10   100     348 ( $_->definition->{type} // '' ) ne 'hidden';
  18         1457  
113             } @$resources),
114             );
115             }
116              
117             1;
118             __DATA__