File Coverage

blib/lib/Docker/Client.pm
Criterion Covered Total %
statement 44 44 100.0
branch 1 2 50.0
condition n/a
subroutine 225 225 100.0
pod 0 1 0.0
total 270 272 99.2


line stmt bran cond sub pod time code
1             package Docker::Client;
2              
3 5     5   525699 use Moose;
  5         2230365  
  5         31  
4 5     5   31325 use Moose::Util::TypeConstraints;
  5         10  
  5         42  
5              
6 5     5   9252 use Carp;
  5         9  
  5         340  
7              
8 5     5   2615 use Array::Utils qw( array_minus );
  5         2000  
  5         276  
9 5     5   2174 use Class::Inspector;
  5         15257  
  5         149  
10 5     5   2075 use OpenAPI::Client;
  5         2145149  
  5         46  
11              
12 5     5   2984 use File::ShareDir qw( dist_dir );
  5         76162  
  5         582  
13              
14 5     5   37 use Mojo::File;
  5         12  
  5         163  
15 5     5   24 use Mojo::URL;
  5         7  
  5         38  
16              
17             our $VERSION = '0.1.0';
18              
19             class_type 'Mojo::URL';
20             coerce 'Mojo::URL', from 'Str', via { Mojo::URL->new(shift) };
21              
22             has 'endpoint' => (
23             is => 'ro',
24             isa => 'Mojo::URL',
25             default => sub {
26             return Mojo::URL->new('http+unix://%2Fvar%2Frun%2Fdocker.sock');
27             },
28             coerce => 1,
29             );
30              
31             has 'version' => (
32             is => 'ro',
33             isa => enum(
34             [
35             'v1.40', 'v1.39', 'v1.38', 'v1.37', 'v1.36', 'v1.35',
36             'v1.34', 'v1.33', 'v1.32', 'v1.31', 'v1.30', 'v1.29',
37             , 'v1.28', 'v1.27', 'v1.26', 'v1.25',
38             ]
39             ),
40             default => 'v1.40',
41             );
42              
43             has 'ua' => (
44             is => 'ro',
45             isa => 'Mojo::UserAgent',
46             lazy => 1,
47             default => sub {
48             return shift->api()->ua();
49             },
50             );
51              
52             has 'api' => (
53             is => 'ro',
54             isa => 'OpenAPI::Client',
55             lazy => 1,
56             default => sub {
57             my $self = shift;
58              
59             ## Making sure we use the correct version path
60             my $base_url =
61             $self->endpoint()->clone()->path( sprintf '/%s', $self->version() );
62              
63             ## Loading correct version specification from disk.
64             my $spec =
65             Mojo::File->new( dist_dir('Docker-Client') )->child('specs')
66             ->child( sprintf '%s.yaml', $self->version() );
67              
68             ## Creating the OpenAPI Client instance using the defined parameters.
69             my $api =
70             OpenAPI::Client->new( $spec->to_string(),
71             base_url => $self->endpoint() );
72              
73             ## If the protocol is local we need to replace the "Host" header on each request
74             if ( $self->endpoint()->protocol() eq 'http+unix' ) {
75             $api->ua()->on(
76             start => sub {
77             my ( $ua, $tx ) = @_;
78              
79             $tx->req()->headers()->header( 'Host' => 'localhost' );
80             }
81             );
82             }
83              
84             return $api;
85             },
86             );
87              
88             sub BUILD {
89 6     6 0 9971 my $self = shift;
90              
91             ## Making sure we extract only the methods corresponding to the OpenAPI definition.
92 6         191 my $api_methods = Class::Inspector->methods( ref $self->api(), 'public' );
93 6         15042 my $base_methods = Class::Inspector->methods( 'OpenAPI::Client', 'public' );
94              
95 6         2699 my @methods = array_minus( @{$api_methods}, @{$base_methods} );
  6         19  
  6         37  
96 6 50       667 croak 'No methods found!'
97             unless ( scalar @methods );
98              
99             ## Creating corresponding methods names in the current instance.
100 6         20 foreach my $name (@methods) {
101             $self->meta()->add_method(
102             $name,
103             sub {
104 4     4   232 return shift->api()->$name(@_);
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
        4      
105             }
106 1272         61371 );
107             }
108              
109 6         655 return;
110             }
111              
112 5     5   2142 no Moose;
  5         8  
  5         39  
113 5     5   1201 no Moose::Util::TypeConstraints;
  5         8  
  5         43  
114              
115             1;
116              
117             __END__
118