File Coverage

blib/lib/AnyPAN/Merger.pm
Criterion Covered Total %
statement 49 49 100.0
branch n/a
condition 1 3 33.3
subroutine 18 18 100.0
pod 0 3 0.0
total 68 73 93.1


line stmt bran cond sub pod time code
1             package AnyPAN::Merger;
2 2     2   648 use strict;
  2         5  
  2         60  
3 2     2   11 use warnings;
  2         5  
  2         99  
4              
5 2     2   11 use Class::Accessor::Lite ro => [qw/sources/];
  2         4  
  2         18  
6              
7 2     2   178 use File::Spec;
  2         3  
  2         45  
8 2     2   9 use Path::Tiny ();
  2         3  
  2         43  
9              
10 2     2   457 use AnyPAN;
  2         4  
  2         41  
11 2     2   401 use AnyPAN::Agent;
  2         6  
  2         63  
12 2     2   840 use AnyPAN::Source;
  2         7  
  2         61  
13 2     2   898 use AnyPAN::SourceCache;
  2         8  
  2         67  
14 2     2   957 use AnyPAN::RetryPolicy::ExponentialBackoff;
  2         6  
  2         60  
15 2     2   13 use AnyPAN::Logger::Null;
  2         4  
  2         58  
16 2     2   961 use AnyPAN::Merger::Algorithm::PreferLatestVersion;
  2         6  
  2         699  
17              
18             our $DEFAULT_LOGGER = AnyPAN::Logger::Null->instance();
19             our $DEFAULT_RETRY_POLICY = AnyPAN::RetryPolicy::ExponentialBackoff->new(
20             max_retries => 5,
21             interval => 1,
22             jitter_factor => 0.05,
23             );
24             our $DEFAULT_REQUEST_TIMEOUT = 30;
25             our $DEFAULT_SOURCE_CACHE_DIR = File::Spec->catdir(File::Spec->tmpdir(), 'AnyPAN-Merger');
26             our $DEFAULT_SOURCE_INDEX_CACHE_TIMEOUT = 300;
27              
28             sub new {
29 1     1 0 10590 my ($class, %args) = @_;
30 1         5 bless {
31             sources => [],
32             } => $class;
33             }
34              
35             sub add_source {
36 3     3 0 163 my ($self, $source_url) = @_;
37 3         15 my $source = AnyPAN::Source->new($source_url);
38 3         6 push @{ $self->{sources} } => $source;
  3         14  
39             }
40              
41             sub merge {
42 1     1 0 480 my ($self, $algorithm) = @_;
43 1   33     8 $algorithm ||= _get_default_algorithm();
44              
45 1         2 return $algorithm->merge(@{ $self->sources });
  1         6  
46             }
47              
48             sub _get_default_algorithm {
49 1     1   5 return AnyPAN::Merger::Algorithm::PreferLatestVersion->new(
50             source_cache => _get_default_source_cache(),
51             logger => $DEFAULT_LOGGER,
52             );
53             }
54              
55             sub _get_default_source_cache {
56 1     1   4 return AnyPAN::SourceCache->new(
57             cache_dir => $DEFAULT_SOURCE_CACHE_DIR,
58             index_cache_timeout => $DEFAULT_SOURCE_INDEX_CACHE_TIMEOUT,
59             agent => _get_default_agent(),
60             logger => $DEFAULT_LOGGER,
61             );
62             }
63              
64             sub _get_default_agent {
65 1     1   12 return AnyPAN::Agent->new(
66             agent => __PACKAGE__."/$AnyPAN::VERSION",
67             timeout => $DEFAULT_REQUEST_TIMEOUT,
68             logger => $DEFAULT_LOGGER,
69             retry_policy => $DEFAULT_RETRY_POLICY,
70             );
71             }
72              
73             1;
74             __END__