~ Make $record (and $marcflavour) optional, allowing you to use just ISBN,
~ Fallback to Amazon "Books" index,
~ This prevents warnings on undef concatenation later in the block,
~ Added test cases to t/Amazon.t,
~ Remove unused variables and double-declared my variables,
---
 C4/Amazon.pm |  110 ++++++++++++++++++++++++++++++++++-----------------------
 t/Amazon.t   |   13 ++++++-
 2 files changed, 77 insertions(+), 46 deletions(-)

diff --git a/C4/Amazon.pm b/C4/Amazon.pm
index a9cb339..c4bd230 100644
--- a/C4/Amazon.pm
+++ b/C4/Amazon.pm
@@ -22,6 +22,9 @@ use LWP::Simple;
 use LWP::UserAgent;
 use HTTP::Request::Common;
 
+use C4::Debug;
+our ($debug);
+
 use strict;
 use warnings;
 
@@ -29,7 +32,7 @@ use vars qw($VERSION @ISA @EXPORT);
 
 BEGIN {
     require Exporter;
-    $VERSION = 0.03;
+    $VERSION = 0.04;
     @ISA = qw(Exporter);
     @EXPORT = qw(
         &get_amazon_details
@@ -37,6 +40,14 @@ BEGIN {
     );
 }
 
+our $override = {};
+# To allow testing w/o DB access, populate this hashref in your script as 
follows:
+# $C4::Amazon::override = {
+#   AmazonAssocTag => 'MyTag',
+#   AWSAccessKeyID => 'MyKeyID',
+#   AmazonLocale   => 'FR',
+# };
+
 =head1 NAME
 
 C4::Amazon - Functions for retrieving Amazon.com content in Koha
@@ -49,12 +60,22 @@ This module provides facilities for retrieving Amazon.com 
content in Koha
 
 =over 4
 
-my $amazon_details = &get_amazon_details( $xisbn, $record, $marcflavour );
+my $amazon_details = &get_amazon_details( $isbn, [$record, $marcflavour] );
 
 =back
 
 Get editorial reviews, customer reviews, and similar products using Amazon Web 
Services.
 
+=over 4
+
+B<$isbn> is the 10 or 13-digit ISBN of the item to retrieve.
+
+B<$record> is optionally the MARC::Record object so we can do better matching 
based on type.
+
+B<$marcflavour> is MARC21 or UNIMARC.  Defaults to UNIMARC.
+
+=back
+
 =cut
 
 sub get_amazon_details {
@@ -63,39 +84,44 @@ sub get_amazon_details {
     #normalize the ISBN
     $isbn = _normalize_match_point ($isbn);
 
-    my $upc = _get_amazon_upc($record,$marcflavour);
-    my $ean = _get_amazon_ean($record,$marcflavour);
-
-    # warn "ISBN: $isbn | UPC: $upc | EAN: $ean";
+    my ($upc, $ean);
+    if ($record) {
+        $upc = _get_amazon_upc($record,$marcflavour);
+        $ean = _get_amazon_ean($record,$marcflavour);
+    }
+    $debug and warn sprintf "ISBN: %s | UPC: %s | EAN: %s", ($isbn||'UNDEF'), 
($upc||'UNDEF'), ($ean||'UNDEF');
 
     my ( $id_type, $item_id);
-    if (length($isbn) eq 13) { # if the isbn is 13-digit, search Amazon using 
EAN
-       $id_type = 'EAN';
-       $item_id = $isbn;
+    if (length($isbn) == 13) { # if the isbn is 13-digit, search Amazon using 
EAN
+        $id_type = 'EAN';
+        $item_id = $isbn;
     }
     elsif ($isbn) {
-       $id_type = 'ASIN';
-       $item_id = $isbn;
+        $id_type = 'ASIN';
+        $item_id = $isbn;
     }
     elsif ($upc) {
-       $id_type = 'UPC';
-       $item_id = $upc;
+        $id_type = 'UPC';
+        $item_id = $upc;
     }
     elsif ($ean) {
-       $id_type = 'EAN';
-       $item_id = $upc;
+        $id_type = 'EAN';
+        $item_id = $upc;
     }
     else { # if no ISBN, UPC, or EAN exists, do not even attempt to query 
Amazon
-       return undef;
+        return;
     }
 
-    my $format = substr $record->leader(), 6, 1; # grab the item format to 
determine Amazon search index
-    my $formats;
-    $formats->{'a'} = 'Books';
-    $formats->{'g'} = 'Video';
-    $formats->{'j'} = 'Music';
-
-    my $search_index = $formats->{$format};
+    my $search_index = 'Books';  # default to Books if no record or $format 
unrecognized
+    if ($record) {
+        my $format = substr $record->leader(), 6, 1; # grab the item format to 
determine Amazon search index
+        my %formats = (
+            a => 'Books',
+            g => 'Video',
+            j => 'Music',
+        );
+        ($formats{$format}) and $search_index = $formats{$format};
+    }
 
     # Determine which content to grab in the request
 
@@ -109,27 +135,26 @@ sub get_amazon_details {
         US => '.com',
     };
 
-    my $amazon_locale_syspref = C4::Context->preference('AmazonLocale');
-    my $tld = $locale_hashref->{$amazon_locale_syspref} || '.com'; # default 
top level domain is .com
-
-    # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
-    my $aws_access_key_id = C4::Context->preference('AWSAccessKeyID');
+    # Check for override values first.  See note above about how to use them.
+    my $amazon_locale_syspref = $override->{AmazonLocale}   || 
C4::Context->preference('AmazonLocale'  );   # mine is 'US'
+    my $aws_access_key_id     = $override->{AWSAccessKeyID} || 
C4::Context->preference('AWSAccessKeyID');   # mine is '0V5RRRRJZ3HR2RQFNHR2'
+    my $af_tag                = $override->{AmazonAssocTag} || 
C4::Context->preference('AmazonAssocTag');   # mine is 'kadabox-20'
 
-    #grab the associates tag: mine is 'kadabox-20'
-    my $af_tag=C4::Context->preference('AmazonAssocTag');
+    my $tld = $locale_hashref->{$amazon_locale_syspref} || '.com'; # default 
top level domain is .com
     my $response_group = 
"Similarities,EditorialReview,Reviews,ItemAttributes,Images";
     my $url = 
"http://ecs.amazonaws$tld/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=$aws_access_key_id&Operation=ItemLookup&AssociateTag=$af_tag&Version=2007-01-15&ItemId=$item_id&IdType=$id_type&ResponseGroup=$response_group";;
-    if ($id_type ne 'ASIN') {
-       $url .= "&SearchIndex=$search_index";
-    }
-    # warn $url;
+    ($id_type ne 'ASIN') and $url .= "&SearchIndex=$search_index";
+    $debug and warn "Getting url: $url";
     my $content = get($url);
-    warn "could not retrieve $url" unless $content;
+    unless ($content) {
+        warn "could not retrieve $url";
+        return;
+    }
     my $xmlsimple = XML::Simple->new();
     my $response = $xmlsimple->XMLin(
         $content,
         forcearray => [ qw(SimilarProduct EditorialReview Review) ],
-    ) unless !$content;
+    );
     return $response;
 }
 
@@ -157,10 +182,8 @@ sub check_search_inside {
 
 sub _get_amazon_upc {
        my ($record,$marcflavour) = @_;
-       my (@fields,$upc);
-
        if ($marcflavour eq 'MARC21') {
-               @fields = $record->field('024');
+               my @fields = $record->field('024');
                foreach my $field (@fields) {
                        my $indicator = $field->indicator(1);
                        my $upc = _normalize_match_point($field->subfield('a'));
@@ -170,7 +193,7 @@ sub _get_amazon_upc {
                }
        }
        else { # assume unimarc if not marc21
-               @fields = $record->field('072');
+               my @fields = $record->field('072');
                foreach my $field (@fields) {
                        my $upc = _normalize_match_point($field->subfield('a'));
                        if ($upc ne '') {
@@ -182,10 +205,9 @@ sub _get_amazon_upc {
 
 sub _get_amazon_ean {
        my ($record,$marcflavour) = @_;
-       my (@fields,$ean);
 
        if ($marcflavour eq 'MARC21') {
-               @fields = $record->field('024');
+               my @fields = $record->field('024');
                foreach my $field (@fields) {
                        my $indicator = $field->indicator(1);
                        my $upc = _normalize_match_point($field->subfield('a'));
@@ -195,7 +217,7 @@ sub _get_amazon_ean {
                }
        }
        else { # assume unimarc if not marc21
-               @fields = $record->field('073');
+               my @fields = $record->field('073');
                foreach my $field (@fields) {
                        my $upc = _normalize_match_point($field->subfield('a'));
                        if ($upc ne '') {
@@ -207,7 +229,7 @@ sub _get_amazon_ean {
 
 sub _normalize_match_point {
        my $match_point = shift;
-       (my $normalized_match_point) = $match_point =~ /([\d-]*[X]*)/;
+       (my $normalized_match_point) = $match_point =~ /([\d-]+[X]*)/;
        $normalized_match_point =~ s/-//g;
 
        return $normalized_match_point;
diff --git a/t/Amazon.t b/t/Amazon.t
index 2d085a7..4e4fb58 100755
--- a/t/Amazon.t
+++ b/t/Amazon.t
@@ -6,9 +6,18 @@
 use strict;
 use warnings;
 
-use Test::More tests => 1;
+use Test::More tests => 4;
 
 BEGIN {
-        use_ok('C4::Amazon');
+    use_ok('C4::Amazon');
 }
 
+$C4::Amazon::override = {
+    AWSAccessKeyID => "0V5RRRRJZ3HR2RQFNHR2",
+    AmazonAssocTag => "kadabox-20",
+    AmazonLocale   => "US",
+};
+ok(get_amazon_details("0553380958"    ), "get_amazon_details: 10-digit"       
);  # Snow Crash
+ok(get_amazon_details("055308853X"    ), "get_amazon_details: 10-digit (w/ 
X)");  # Snow Crash
+ok(get_amazon_details("978-0553380958"), "get_amazon_details: 13-digit"       
);  # Snow Crash
+
-- 
1.5.5.GIT

_______________________________________________
Koha-patches mailing list
[email protected]
http://lists.koha.org/mailman/listinfo/koha-patches

Reply via email to