Show
Ignore:
Timestamp:
04/18/08 19:00:39 (8 months ago)
Author:
daisuke
Message:

lang/perl/WebService-Simple; Add caching

Location:
lang/perl/WebService-Simple/branch/lwp-base
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/WebService-Simple/branch/lwp-base/Makefile.PL

    r9691 r9694  
    77requires( 'Class::Data::ConfigHash' ); 
    88requires( 'Data::Dumper' ); 
     9requires( 'Digest::MD5' ); 
    910requires( 'LWP::UserAgent' ); 
    10 requires( 'Storable' ); 
    1111requires( 'UNIVERSAL::require' ); 
    1212requires( 'XML::Simple' ); 
  • lang/perl/WebService-Simple/branch/lwp-base/lib/WebService/Simple.pm

    r9688 r9694  
    55use warnings; 
    66use base qw(LWP::UserAgent Class::Data::ConfigHash); 
     7use Data::Dumper (); 
     8use Digest::MD5 (); 
    79use WebService::Simple::Response; 
    810use UNIVERSAL::require; 
     
    1214__PACKAGE__->config( 
    1315    base_url => '', 
     16    cache => { 
     17        module => "Cache::FileCache", 
     18        args   => { 
     19        } 
     20    }, 
    1421    response_parser => { 
    1522        module => "XML::Simple" 
     
    2431        $class->config->{base_url} || 
    2532        Carp::croak("base_url is required"); 
    26     my $basic_params = delete $args{params} || {}; 
     33    my $basic_params = delete $args{params} || delete $args{param} || {}; 
    2734    my $response_parser = delete $args{response_parser}; 
    2835    if (! $response_parser) { 
     
    3845        $response_parser = $module->new( %{ $config->{args} || {} } ); 
    3946    }; 
    40     die if $@; 
     47 
     48    my $cache = delete $args{cache}; 
     49    if (! $cache || ref $cache eq 'HASH') { 
     50        my $config = ref $cache eq 'HASH' ? $cache : $class->config->{cache}; 
     51        if ($config) { 
     52            if (! ref $config) { 
     53                $config = { module => $config }; 
     54            } 
     55 
     56            my $module = $config->{module}; 
     57            $module->require or die; 
     58            $cache = $module->new( $config->{hashref_args} ? $config->{args} : %{ $config->{args} } ); 
     59        } 
     60    } 
    4161 
    4262    my $self = $class->SUPER::new(%args); 
     
    4464    $self->{basic_params} = $basic_params; 
    4565    $self->{response_parser} = $response_parser; 
     66    $self->{cache} = $cache; 
    4667    return $self; 
    4768} 
     
    5071sub basic_params { $_[0]->{basic_params} } 
    5172sub response_parser { $_[0]->{response_parser} } 
     73sub cache { $_[0]->{cache} } 
     74 
     75sub __cache_get 
     76{ 
     77    my $self  = shift; 
     78    my $cache = $self->cache; 
     79    return unless $cache; 
     80 
     81    my $key   = $self->__cache_key( shift ); 
     82    return $cache->get( $key, @_ ); 
     83} 
     84 
     85sub __cache_set 
     86{ 
     87    my $self  = shift; 
     88    my $cache = $self->cache; 
     89    return unless $cache; 
     90 
     91    my $key   = $self->__cache_key( shift ); 
     92    return $cache->set( $key, @_ ); 
     93} 
     94 
     95sub __cache_remove 
     96{ 
     97    my $self  = shift; 
     98    my $cache = $self->cache; 
     99    return unless $cache; 
     100 
     101    my $key   = $self->__cache_key( shift ); 
     102    return $cache->remove( $key, @_ ); 
     103} 
     104 
     105sub __cache_key 
     106{ 
     107    my $self  = shift; 
     108    local $Data::Dumper::Indent   = 1; 
     109    local $Data::Dumper::Terse    = 1; 
     110    local $Data::Dumper::Sortkeys = 1; 
     111    return Digest::MD5::md5_hex( Data::Dumper::Dumper( $_[0] ) ); 
     112} 
    52113 
    53114sub get 
     
    72133 
    73134    $uri->query_form( %{$self->basic_params}, %extra ); 
    74     my $response = $self->SUPER::get($uri, @headers); 
     135 
     136    my $response; 
     137 
     138    $response = $self->__cache_get([$uri, @headers]); 
     139    if ($response) { 
     140        return $response; 
     141    } 
     142 
     143    $response = $self->SUPER::get($uri, @headers); 
    75144    if (! $response->is_success) { 
    76145        Carp::croak("request to $url failed"); 
    77146    } 
    78147 
    79     return WebService::Simple::Response->new_from_response( 
     148    $response = WebService::Simple::Response->new_from_response( 
    80149        response => $response, 
    81150        parser   => $self->response_parser 
    82151    ); 
     152    $self->__cache_set([$uri, @headers], $response); 
     153    return $response; 
     154 
    83155} 
    84156 
  • lang/perl/WebService-Simple/branch/lwp-base/t/01_basic.t

    r9687 r9694  
    11use strict; 
    22use Test::More; 
     3use Test::MockObject; 
    34 
    45my ($flickr_api_key); 
     
    910        plan( skip_all => "Please set FLICKR_API_KEY to enable this test" ); 
    1011    } else { 
    11         plan( tests => 10 ); 
     12        plan( tests => 13 ); 
    1213    } 
    1314 
     
    3839 
    3940    is( $h->{name}, 'value' ); 
     41 
     42    # Make sure the response is NOT cached by default 
     43    { 
     44        my $tmp = $simple->get( { method => "flickr.test.echo", name => "value" } ); 
     45        isnt( $tmp, $response, "response is NOT cached ($response <=> $tmp)" ); 
     46    } 
    4047} 
     48 
     49SKIP: { 
     50    eval { require Cache::Memory }; 
     51    if ($@) { 
     52        skip(2, "Cache::Memory not installed"); 
     53    } 
     54 
     55    my $called = 0; 
     56    my $simple = WebService::Simple->new( 
     57        base_url => "http://api.flickr.com/services/rest/", 
     58        params   => { 
     59            api_key => $flickr_api_key 
     60        }, 
     61        cache => { 
     62            module => 'Cache::Memory', 
     63        } 
     64    ); 
     65 
     66    my $response; 
     67    for (1..3) { 
     68        my $tmp = $simple->get( { method => "flickr.test.echo", name => "value" } ); 
     69        if ($response) { 
     70            is( $tmp, $response, "got cached $response" ); 
     71        } else { 
     72            $response = $tmp; 
     73        } 
     74    } 
     75}