File Coverage

blib/lib/Business/SiteCatalyst/Report.pm
Criterion Covered Total %
statement 25 65 38.4
branch 6 34 17.6
condition 1 15 6.6
subroutine 6 12 50.0
pod 7 7 100.0
total 45 133 33.8


line stmt bran cond sub pod time code
1             package Business::SiteCatalyst::Report;
2              
3 18     18   52780 use strict;
  18         37  
  18         844  
4 18     18   99 use warnings;
  18         36  
  18         459  
5              
6 18     18   136 use Carp;
  18         38  
  18         1057  
7 18     18   1125 use Data::Dumper;
  18         10551  
  18         1049  
8 18     18   1820 use Data::Validate::Type;
  18         17121  
  18         18729  
9              
10              
11             =head1 NAME
12              
13             Business::SiteCatalyst::Report - Interface to Adobe Omniture SiteCatalyst's REST API 'Report' module.
14              
15              
16             =head1 VERSION
17              
18             Version 1.2.2
19              
20             =cut
21              
22             our $VERSION = '1.2.2';
23              
24              
25             =head1 SYNOPSIS
26              
27             This module allows you to interact with Adobe (formerly Omniture) SiteCatalyst,
28             a web analytics service. It encapsulates all the communications with the API
29             provided by Adobe SiteCatalyst to offer a Perl interface for managing reports,
30             pulling company-specific SiteCatalyst data (ex: token usage), uploading SAINT
31             data (feature not implemented yet), etc.
32              
33             Please note that you will need to have purchased the Adobe SiteCatalyst product,
34             and have web services enabled within your account first in order to obtain a web
35             services shared secret, as well as agree with the Terms and Conditions for using
36             the API.
37              
38             use Business::SiteCatalyst;
39            
40             # Create an object to communicate with Adobe SiteCatalyst
41             my $site_catalyst = Business::SiteCatalyst->new(
42             username => 'dummyusername',
43             shared_secret => 'dummysecret',
44             api_subdomain => 'api|api2', #optional; default value='api'
45             );
46            
47             my $report = $site_catalyst->instantiate_report(
48             type => 'report type',
49             report_suite_id => 'report suite id',
50             );
51            
52             # See SiteCatalyst API Explorer at
53             # https://developer.omniture.com/en_US/get-started/api-explorer
54             # for Report.Queue[Trended|Ranked|Overtime] documentation
55            
56             $report->queue(
57             %report_arguments, #report-dependant
58             );
59            
60             my $results;
61             for ( my $tries = 0; $tries < 20; tries++ )
62             {
63             if ( $report->is_ready() )
64             {
65             $results = $report->retrieve();
66             last;
67             }
68             else
69             {
70             sleep 5;
71             }
72             }
73            
74             unless ( defined $results )
75             {
76             $cancel_success = $report->cancel();
77             }
78              
79             =head1 METHODS
80              
81             =head2 new()
82              
83             Create a new Business::SiteCatalyst::Report object, which
84             will allow retrieval of SiteCatalyst reports.
85              
86             NOTE: This should not be called directly. Instead, use Cinstantiate_report()>.
87              
88             my $report = Business::SiteCatalyst::Report->new(
89             $site_catalyst,
90             type => 'report type',
91             report_suite_id => 'report suite id',
92             );
93              
94             Parameters:
95              
96             =over 4
97              
98             =item * type
99              
100             The type of the report to instantiate. Acceptable values are 'Overtime', 'Ranked', and 'Trended'.
101              
102             =item * report_suite_id
103              
104             The Report Suite ID you want to pull data from.
105              
106             =back
107              
108             =cut
109              
110             sub new
111             {
112 1     1 1 4 my ( $class, $site_catalyst, %args ) = @_;
113            
114             # Check for mandatory parameters
115 1 50       8 Data::Validate::Type::is_instance( $site_catalyst, class => 'Business::SiteCatalyst')
116             || croak "First argument must be a Business::SiteCatalyst object";
117              
118 1 50       32 my $mode = defined $args{'report_id'} ? "existing" : "new";
119            
120 1         5 my %required_arguments = (
121             'report_id' => 'existing',
122             'report_suite_id' => 'new',
123             'type' => 'new',
124             );
125            
126 1         4 foreach my $arg ( keys %required_arguments )
127             {
128 3 100       8 if ( $required_arguments{ $arg } eq $mode )
129             {
130 2 50 33     14 croak "Argument '$arg' is needed to create the Business::SiteCatalyst::Report object"
131             if !defined( $args{$arg} ) || ( $args{$arg} eq '' );
132             }
133             else
134             {
135 1 50       5 croak "Argument '$arg' is not valid when loading '$mode' report"
136             if defined( $args{$arg} );
137             }
138             }
139              
140             # Create the object
141 1         7 my $self = bless(
142             {
143             site_catalyst => $site_catalyst,
144             type => $args{'type'},
145             report_suite_id => $args{'report_suite_id'},
146             id => $args{'report_id'},
147             },
148             $class,
149             );
150            
151 1         7 return $self;
152             }
153              
154              
155             =head2 queue()
156              
157             Queue a Business::SiteCatalyst report.
158              
159             $report->queue( %report_arguments );
160              
161             # Example: Top 5 referrers report
162             $report->queue(
163             dateFrom => "2012-04-01",
164             dateTo => "2012-04-15",
165             metrics => [{"id" => "instances"}],
166             elements => [{"id" => "referrer","top" => "5"}]
167             );
168              
169             =cut
170              
171             sub queue
172             {
173 0     0 1   my ( $self, %args ) = @_;
174            
175 0           my $site_catalyst = $self->get_site_catalyst();
176 0           my $verbose = $site_catalyst->verbose();
177              
178 0           my $response = $site_catalyst->send_request(
179             method => 'Report.Queue' . $self->{'type'},
180             data =>
181             {
182             reportDescription =>
183             {
184             reportSuiteID => $self->{'report_suite_id'},
185             %args,
186             }
187             }
188             );
189            
190 0 0         if ( !defined($response) )
    0          
191             {
192 0           croak "Fatal error. No response.";
193             }
194             elsif ( !defined($response->{'reportID'}) )
195             {
196 0 0         carp "Full response: " . Dumper($response) if $verbose;
197 0           croak "Fatal error. Missing reportID in response.";
198             }
199              
200             # Store report id; we'll need it to check the status
201 0           $self->{'id'} = $response->{'reportID'};
202            
203 0           return $response;
204             }
205              
206              
207             =head2 is_ready()
208              
209             Check if a queued report is completed yet.
210              
211             my $boolean = $report->is_ready();
212              
213             =cut
214              
215             sub is_ready
216             {
217 0     0 1   my ( $self, %args ) = @_;
218            
219 0           my $site_catalyst = $self->get_site_catalyst();
220 0           my $verbose = $site_catalyst->verbose();
221            
222 0           my $response = $site_catalyst->send_request(
223             method => 'Report.GetStatus',
224             data =>
225             {
226             reportID => $self->get_id(),
227             }
228             );
229            
230 0 0 0       if ( !defined($response) || !defined($response->{'status'}) )
    0 0        
231             {
232 0           croak "Fatal error. No response or missing status in response";
233             }
234             elsif ( $response->{'status'} eq 'error' || $response->{'status'} eq 'failed' )
235             {
236 0 0         carp "Full response: " . Dumper($response) if $verbose;
237 0           croak "Something went wrong with this report!";
238             }
239            
240 0 0         return $response->{'status'} eq 'done' ? 1 : 0;
241             }
242              
243              
244             =head2 retrieve()
245              
246             Retrieve report results from Adobe SiteCatalyst.
247              
248             my $results = $report->retrieve();
249              
250             =cut
251              
252             sub retrieve
253             {
254 0     0 1   my ( $self, %args ) = @_;
255            
256 0           my $site_catalyst = $self->get_site_catalyst();
257 0           my $verbose = $site_catalyst->verbose();
258            
259 0           my $response = $site_catalyst->send_request(
260             method => 'Report.GetReport',
261             data =>
262             {
263             reportID => $self->get_id(),
264             }
265             );
266            
267 0 0 0       if ( !defined($response) || !defined($response->{'status'}) )
    0 0        
    0          
268             {
269 0           croak "Fatal error. No response or missing status in response";
270             }
271             elsif ( $response->{'status'} eq 'error' || $response->{'status'} eq 'failed' )
272             {
273 0 0         carp "Full response: " . Dumper($response) if $verbose;
274 0           croak "Something went wrong with this report!";
275             }
276             elsif ( $response->{'status'} ne 'done' )
277             {
278 0           croak "Please call is_ready() before attempting retrieval. Report is not done.";
279             }
280              
281 0           return $response->{'report'};
282             }
283              
284              
285             =head2 cancel()
286              
287             Cancel previously submitted report request, and removes it from processing queue.
288             Returns 1 if successful, otherwise 0.
289              
290             my $cancel_success = $report->cancel();
291              
292             =cut
293              
294             sub cancel
295             {
296 0     0 1   my ( $self, %args ) = @_;
297            
298 0           my $site_catalyst = $self->get_site_catalyst();
299 0           my $verbose = $site_catalyst->verbose();
300            
301 0           my $response = $site_catalyst->send_request(
302             method => 'Report.CancelReport',
303             data =>
304             {
305             reportID => $self->get_id(),
306             }
307             );
308            
309 0 0         if ( !defined($response) )
310             {
311 0           croak "Fatal error. No response.";
312             }
313            
314 0           return $response;
315             }
316              
317              
318             =head2 get_site_catalyst()
319              
320             Get Business::SiteCatalyst object used when creating the current object.
321              
322             my $site_catalyst = $report->get_site_catalyst();
323              
324             =cut
325              
326             sub get_site_catalyst
327             {
328 0     0 1   my ( $self ) = @_;
329            
330 0           return $self->{'site_catalyst'};
331             }
332              
333              
334             =head2 get_id()
335              
336             Get the report ID returned by Adobe SiteCatalyst when we queued the report.
337              
338             my $report_id = $report->get_id();
339              
340             =cut
341              
342             sub get_id
343             {
344 0     0 1   my ( $self ) = @_;
345            
346 0           return $self->{'id'};
347             }
348              
349              
350             =head1 AUTHOR
351              
352             Jennifer Pinkham, C<< >>.
353              
354              
355             =head1 BUGS
356              
357             Please report any bugs or feature requests to C,
358             or through the web interface at L.
359             I will be notified, and then you'll automatically be notified of progress on
360             your bug as I make changes.
361              
362              
363             =head1 SUPPORT
364              
365             You can find documentation for this module with the perldoc command.
366              
367             perldoc Business::SiteCatalyst::Report
368              
369              
370             You can also look for information at:
371              
372             =over 4
373              
374             =item * RT: CPAN's request tracker
375              
376             L
377              
378             =item * AnnoCPAN: Annotated CPAN documentation
379              
380             L
381              
382             =item * CPAN Ratings
383              
384             L
385              
386             =item * Search CPAN
387              
388             L
389              
390             =back
391              
392              
393             =head1 ACKNOWLEDGEMENTS
394              
395             Thanks to ThinkGeek (L) and its corporate overlords
396             at Geeknet (L), for footing the bill while I write code for them!
397             Special thanks for technical help from fellow ThinkGeek CPAN author Guillaume Aubert L
398              
399              
400             =head1 COPYRIGHT & LICENSE
401              
402             Copyright 2013 Jennifer Pinkham.
403              
404             This program is free software; you can redistribute it and/or modify it
405             under the terms of the Artistic License.
406              
407             See http://dev.perl.org/licenses/ for more information.
408              
409             =cut
410              
411             1;