File Coverage

blib/lib/Plack/Middleware/Throttle/Lite/Backend/Abstract.pm
Criterion Covered Total %
statement 50 50 100.0
branch 8 8 100.0
condition 2 3 66.6
subroutine 15 15 100.0
pod 8 9 88.8
total 83 85 97.6


line stmt bran cond sub pod time code
1             package Plack::Middleware::Throttle::Lite::Backend::Abstract;
2              
3             # ABSTRACT: Base class for Throttle::Lite backends
4              
5 8     8   49943 use strict;
  8         18  
  8         345  
6 8     8   45 use warnings;
  8         13  
  8         196  
7 8     8   43 use Carp ();
  8         15  
  8         154  
8 8     8   8526 use POSIX qw/strftime/;
  8         82884  
  8         60  
9              
10             our $VERSION = '0.05'; # VERSION
11             our $AUTHORITY = 'cpan:CHIM'; # AUTHORITY
12              
13             sub new {
14 47     47 0 1391 my ($class) = shift;
15 47 100 66     413 my $args = defined $_[0] && UNIVERSAL::isa($_[0], 'HASH') ? shift : { @_ };
16 47         81 my $self = $args;
17 47         144 bless $self, $class;
18 47         244 $self->init($args);
19 47         191 return $self;
20             }
21              
22 47     47 1 69 sub init { 1 }
23              
24             sub mk_attrs {
25 8     8 1 38 my ($class, @attributes) = @_;
26              
27 8         20 foreach my $attr (@attributes) {
28             my $code = sub {
29 1826     1826   4271 my ($self, $value) = @_;
30 1826 100       3295 if (@_ == 1) {
31 1651         59882 return $self->{$attr};
32             }
33             else {
34 175         738 return $self->{$attr} = $value;
35             }
36 24         102 };
37              
38 24         49 my $method = "${class}::${attr}";
39 8     8   11823 { no strict 'refs'; *$method = $code; }
  8         19  
  8         3327  
  24         31  
  24         165  
40             }
41             }
42              
43 1     1 1 557 sub reqs_done { Carp::confess 'method \'reqs_done\' is not implemented' }
44 1     1 1 1466 sub increment { Carp::confess 'method \'increment\' is not implemented' }
45              
46             __PACKAGE__->mk_attrs(qw(reqs_max requester_id units));
47              
48             sub settings {
49 778     778 1 793 my ($self) = @_;
50              
51 778         5156 my $settings = {
52             'req/day' => {
53             'interval' => 86400,
54             'format' => '%Y%j',
55             },
56             'req/hour' => {
57             'interval' => 3600,
58             'format' => '%Y%j%H',
59             },
60             'req/min' => {
61             'format' => '%Y%j%H%M',
62             'interval' => 60,
63             },
64             };
65              
66 778         1759 $settings->{$self->units};
67             }
68              
69             sub expire_in {
70 59     59 1 370 my ($self) = @_;
71              
72 59         1018 my ($sec, $min, $hour) = localtime(time);
73 59         224 my $interval = $self->settings->{'interval'};
74              
75 59         112 my $already_passed;
76              
77 59 100       184 if ($interval == 86400) { # req/day
    100          
78 12         36 $already_passed = 3600 * $hour + 60 * $min + $sec;
79             }
80             elsif ($interval == 3600) { # req/hour
81 33         81 $already_passed = 60 * $min + $sec;
82             }
83             else { # req/min
84 14         21 $already_passed = $sec;
85             }
86              
87 59         357 $interval - $already_passed;
88             }
89              
90             sub ymdh {
91 719     719 1 900 my ($self) = @_;
92              
93 719         1321 strftime($self->settings->{'format'} => localtime(time));
94             }
95              
96             sub cache_key {
97 719     719 1 903 my ($self) = @_;
98              
99 719         1196 $self->requester_id . ':' . $self->ymdh
100             }
101              
102             1; # End of Plack::Middleware::Throttle::Lite::Backend::Abstract
103              
104             __END__