File Coverage

blib/lib/Web/API/Mock/Parser.pm
Criterion Covered Total %
statement 72 73 98.6
branch 10 12 83.3
condition 14 21 66.6
subroutine 17 19 89.4
pod 0 1 0.0
total 113 126 89.6


line stmt bran cond sub pod time code
1             package Web::API::Mock::Parser;
2 5     5   1535142 use 5.008005;
  5         23  
3 5     5   35 use strict;
  5         10  
  5         197  
4 5     5   35 use warnings;
  5         10  
  5         540  
5              
6             our $VERSION = "0.11";
7              
8 5     5   2877 use utf8;
  5         1850  
  5         36  
9 5     5   254 use B qw(perlstring);
  5         11  
  5         772  
10 5     5   3165 use Text::Markdown::Hoedown;
  5         7041  
  5         875  
11 5     5   3194 use Web::API::Mock::Map;
  5         21  
  5         439  
12             use Class::Accessor::Lite (
13 5         36 new => 1,
14             rw => [ qw/map md cb _resource_name _paragraph _url _method _status _content_type _header _body api/ ],
15 5     5   39 );
  5         11  
16              
17             sub create_map {
18 4     4 0 9217 my $self =shift;
19              
20 4         23 $self->_callback();
21              
22 4         40 my $md = Text::Markdown::Hoedown::Markdown->new(HOEDOWN_EXT_AUTOLINK, 16, $self->cb);
23              
24 4         141 eval {
25 4         18 $md->render($self->md);
26             };
27 4 50       163 if ( $@ ) {
28 0         0 die "cannot parse markdown. $@";
29             }
30              
31 4         33 my $map = Web::API::Mock::Map->new();
32 4         48 $map->init();
33 4         27 for my $name ( keys %{$self->api} ) {
  4         14  
34             $map->add_resource( $self->api->{$name}->{url}, {
35             status => $self->api->{$name}->{status},
36             content_type => $self->api->{$name}->{content_type},
37             method => $self->api->{$name}->{method},
38             header => $self->api->{$name}->{header},
39             body => $self->api->{$name}->{body}
40 16         189 });
41             }
42              
43 4         164 return $map;
44             }
45              
46             sub _callback {
47 4     4   18 my $self = shift;
48              
49 4         20 $self->api({});
50              
51 4         86 my $cb = Text::Markdown::Hoedown::Renderer::Callback->new();
52              
53             $cb->blockcode( sub {
54 25 50   25   205 return unless $self->_resource_name;
55              
56 25 100       169 if ( $self->_paragraph =~ /^body/i ) {
    100          
57 15         138 $self->_body($_[0]);
58             }
59             elsif ( $self->_paragraph =~ /^header/i ) {
60 9         125 my @line = split("\n", $_[0]);
61 9         27 for (@line) {
62 11         44 my ($key, $value) = split(':',$_);
63 11         32 chomp $value;
64 11         53 $value =~ s/^ +//g;
65 11         48 $self->_header->{$key} = $value;
66             }
67             }
68             else {
69 1         12 $self->_body($_[0]);
70             }
71              
72 4         41 } );
73              
74             # TODO
75 4     0   77 $cb->blockquote( sub {} );
76              
77             # TODO
78 4     0   29 $cb->blockhtml( sub {} );
79              
80             $cb->header( sub {
81 21     21   283 $self->_add_api();
82              
83 21         687 my ($method, $url) = split(' ', $_[0]);
84 21         79 $self->_header({});
85 21         151 $self->_body('');
86 21         130 $self->_url($url);
87 21         166 $self->_method($method);
88 21         144 $self->_resource_name($_[0]);
89 4         78 } );
90              
91             $cb->paragraph( sub {
92 60     60   655 $self->_paragraph($_[0]);
93 4         48 } );
94              
95             # TODO
96 4     38   36 $cb->list(sub{});
97              
98             $cb->listitem(sub{
99 58 100   58   612 if ( $_[0] =~ /^response +(\d+) +\((.+?)\)/i ) {
100 17         69 $self->_status($1);
101 17         165 $self->_content_type($2);
102             }
103 4         22 });
104              
105             $cb->doc_footer(sub{
106 4     4   18 $self->_add_api();
107 4         31 });
108              
109 4         26 $self->cb($cb);
110             }
111              
112             sub _add_api {
113 25     25   62 my $self = shift;
114             # APIドキュメント上でコメント等に利用するため
115             # GET,POST,PUT,DELETE以外のメソッドは無視する
116 25 100 100     117 if ( $self->_resource_name && $self->_url && $self->_method &&
      66        
      100        
117             $self->_method =~ /^(GET|POST|PUT|DELETE)$/ ) {
118 16   50     390 $self->api->{$self->_resource_name} = {
      50        
      50        
      50        
      50        
      50        
119             content_type => $self->_content_type // '',
120             status => $self->_status // '',
121             url => $self->_url // '',
122             method => $self->_method // '',
123             header => $self->_header // {},
124             body => $self->_body // '',
125             };
126             }
127             }
128              
129             1;