File Coverage

blib/lib/Google/AJAX/Library.pm
Criterion Covered Total %
statement 8 10 80.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 12 14 85.7


line stmt bran cond sub pod time code
1             package Google::AJAX::Library;
2             BEGIN {
3 3     3   127080 $Google::AJAX::Library::VERSION = '0.022';
4             }
5             # ABSTRACT: Access the Google AJAX Libaries API in Perl
6              
7 3     3   33 use warnings;
  3         5  
  3         100  
8 3     3   17 use strict;
  3         7  
  3         108  
9              
10              
11 3     3   17269 use Moose;
  0            
  0            
12             use Google::AJAX::Library::Carp;
13              
14             use URI;
15             use LWP::UserAgent;
16             use Path::Class;
17             use HTML::Declare qw/SCRIPT/;
18              
19             use constant BASE => 'http://ajax.googleapis.com/ajax/libs';
20             use constant LATEST_VERSION => {qw/
21             jquery 1
22             prototype 1
23             scriptaculous 1
24             mootools 1
25             dojo 1
26             /};
27              
28             $Google::AJAX::Library::VERSION ||= 0;
29              
30             has uri => qw/is ro/;
31             has version => qw/is ro/;
32             has file => qw/is ro/;
33             has name => qw/is ro/;
34             has ua => qw/is ro required 1 lazy 1 isa LWP::UserAgent/, default => sub {
35             my $ua = LWP::UserAgent->new;
36             $ua->agent("Google::AJAX::Library/$Google::AJAX::Library::VERSION (" . $ua->agent . ")");
37             return $ua;
38             };
39              
40             sub _christen;
41              
42              
43             sub jquery {
44             return _christen jquery => @_;
45             }
46              
47             sub jQuery {
48             return _christen jquery => @_;
49             }
50              
51              
52             sub prototype {
53             return _christen prototype => @_;
54             }
55              
56              
57             sub scriptaculous {
58             return _christen scriptaculous => @_;
59             }
60              
61              
62             sub mootools {
63             return _christen mootools => @_;
64             }
65              
66             sub MooTools {
67             return _christen mootools => @_;
68             }
69              
70              
71             sub dojo {
72             return _christen dojo => @_;
73             }
74              
75              
76             sub html {
77             my $self = shift;
78              
79             return SCRIPT({ type => "text/javascript", src => $self->uri, _ => "", @_ });
80             }
81              
82             sub BUILD {
83             my $self = shift;
84             my $given = shift;
85            
86             my $uri;
87             if ($uri = $given->{uri}) {
88             }
89             else {
90             my $name = $given->{name} or croak "Wasn't given a library name (e.g. jquery, mootools, etc.)";
91             my $file = $given->{file};
92             ($name, $file) = $self->_name_file($name, $given) unless $file;
93              
94             my $base = $given->{base} || BASE;
95             my $version = $given->{version} || LATEST_VERSION->{$name} or croak "Wasn't given a library version for $name";
96              
97             $uri = join "/", $base, $name, $version, $file;
98              
99             $self->{version} = $version;
100             $self->{file} = $file;
101             $self->{name} = $name;
102             }
103              
104             $self->{uri} = URI->new($uri);
105             }
106              
107             sub _name_file {
108             my $self = shift;
109             my $name = shift;
110             my $extra = shift;
111              
112             croak "Wasn't given a library name (e.g. jquery, mootools, etc.)" unless $name;
113              
114             my $uncompressed = $extra->{uncompressed} || 0;
115             $uncompressed = $uncompressed =~ m/^\s*(?:f(?:alse)?|(?:no?))\s*$/ ? 0 : $uncompressed;
116             $uncompressed = $uncompressed ? 1 : 0;
117             my $compact = $uncompressed ? 0 : 1;
118              
119             $name =~ s/\.js\s*$//i; # Just in case
120              
121             my $file;
122             if ($name =~ m/^\s*jquery\s*$/i) {
123             $name = "jquery";
124             $file = $compact ? "$name.min.js" : "$name.js";
125             }
126             elsif ($name =~ m/^\s*script\.?aculo\.?us\s*$/i) {
127             $name = "scriptaculous";
128             $file = "$name.js";
129             }
130             elsif ($name =~ m/^\s*prototype\s*$/i) {
131             $name = "prototype";
132             $file = "$name.js";
133             }
134             elsif ($name =~ m/^\s*mootools\s*$/i) {
135             $name = "mootools";
136             $file = $compact ? "$name-yui-compressed.js" : "$name.js";
137             }
138             elsif ($name =~ m/^\s*dojo\s*$/i) {
139             $name = "dojo";
140             $file = $compact ? "$name/$name.xd.js" : "$name/$name.xd.js.uncompressed.js";
141             }
142             else {
143             croak "Don't understand library name ($name)";
144             }
145              
146             return ($name, $file);
147             }
148              
149              
150             sub exists {
151             my $self = shift;
152             return $self->ua->head( $self->uri )->is_success ? 1 : 0;
153             }
154              
155              
156             sub request {
157             my $self = shift;
158              
159             return $self->ua->get($self->uri);
160             }
161              
162              
163             sub fetch {
164             my $self = shift;
165              
166             my $response = $self->request;
167              
168             croak "Fetching ", $self->uri, "failed: ", $response->status_line unless $response->is_success;
169              
170             return $response->decoded_content unless @_;
171              
172             my $to = shift;
173              
174             if (ref $to eq "SCALAR") { $$to = $response->decoded_content }
175             elsif (ref $to eq "GLOB") { print $to $response->decoded_content }
176             elsif ($to) { Path::Class::File->new($to)->openw->print($response->decoded_content) }
177             else { croak "Don't know what you want to fetch into" }
178              
179             return 1;
180             }
181              
182              
183             sub write {
184             my $self = shift;
185              
186             return $self->fetch(@_);
187             }
188              
189             sub _christen {
190             my $name = shift;
191              
192             my $class;
193             if (blessed $_[0]) { $class = ref shift }
194             elsif ($_[0] =~ m/::/) { $class = shift }
195             else { $class = __PACKAGE__ }
196              
197             my @new;
198             push @new, name => $name;
199             push @new, version => shift if @_ && @_ % 2 && ! ref $_[0];
200             push @new, @_ if @_ && ! ref $_[0];
201             push @new, %{ shift() } if @_ && ref $_[0] eq "HASH";
202            
203             return $class->new(@new);
204             }
205              
206             __PACKAGE__->meta->make_immutable;
207              
208              
209             1;
210              
211             __END__
212             =pod
213              
214             =head1 NAME
215              
216             Google::AJAX::Library - Access the Google AJAX Libaries API in Perl
217              
218             =head1 VERSION
219              
220             version 0.022
221              
222             =head1 SYNOPSIS
223              
224             use Google::AJAX::Library;
225              
226             my $library = Google::AJAX::Library->jquery;
227              
228             $library->uri
229             # http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
230              
231             $library->html
232             # <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" type="text/javascript"></script>
233              
234             You can also fetch or write-out the library content:
235              
236             my $library = Google::AJAX::Library->new(name => "mootools", version => "1.8.1");
237              
238             my $content = $library->fetch;
239              
240             # Into a scalar:
241             my $content;
242             $library->fetch(\$content)
243              
244             # To a filehandle:
245             $library->write(\*STDOUT)
246              
247             # To a file:
248             $library->write("/path/to/library.js")
249              
250             # Check if a library exists at http://ajax.googleapis.com
251             # This will just do a HEAD request
252             $library->exists
253              
254             =head1 DESCRIPTION
255              
256             Google::AJAX::Library is a module for accessing the Google AJAX Libaries API via Perl
257              
258             You can find out more about the API here: http://code.google.com/apis/ajaxlibs/
259              
260             =head1 METHODS
261              
262             =head2 Google::AJAX::Library->jquery([ <version>, <extra> ])
263              
264             =head2 Google::AJAX::Library->jQuery([ <version>, <extra> ])
265              
266             Returns a jQuery library object of the given version
267              
268             If no version is given or the given version is 0, then the latest version (1) will be used
269              
270             You can pass through "uncompressed = 1" to get the non-compacted .js
271              
272             For example:
273              
274             my $library = Google::AJAX::Library->jQuery(1.2, uncompressed => 1)
275              
276             =head2 Google::AJAX::Library->prototype([ <version> ])
277              
278             Returns a prototype library object of the given version
279              
280             If no version is given or the given version is 0, then the latest version (1) will be used
281              
282             A compressed .js is not offered at this time
283              
284             =head2 Google::AJAX::Library->scriptaculous([ <version> ])
285              
286             Returns a script.aculo.us library object of the given version
287              
288             If no version is given or the given version is 0, then the latest version (1) will be used
289              
290             A compressed .js is not offered at this time
291              
292             =head2 Google::AJAX::Library->mootools([ <version>, <extra> ])
293              
294             =head2 Google::AJAX::Library->MooTools([ <version>, <extra> ])
295              
296             Returns a MooTools library object of the given version
297              
298             If no version is given or the given version is 0, then the latest version (1) will be used
299              
300             You can pass through "uncompressed = 1" to get the non-compacted .js
301              
302             =head2 Google::AJAX::Library->dojo([ <version>, <extra> ])
303              
304             Returns a Dojo library object of the given version
305              
306             If no version is given or the given version is 0, then the latest version (1) will be used
307              
308             You can pass through "uncompressed = 1" to get the non-compacted .js
309              
310             =head2 $library->uri
311              
312             Returns the L<URI> for $library
313              
314             =head2 $library->version
315              
316             Returns the version of $library
317              
318             =head2 $library->name
319              
320             Returns the name of $library (e.g. jquery, scriptaculous, etc.)
321              
322             =head2 $library->file
323              
324             Returns the filename of $library (e.g. jquery.min.js, dojo/dojo.xd.js, etc.)
325              
326             =head2 $library->html
327              
328             Returns a properly formatted HTML <script></script> entry for $library
329              
330             =head2 $library->exists
331              
332             Returns 1 if the $library (at the URI, including the specified version) exists at http://ajax.googleapis.com/
333              
334             Returns 0 otherwise
335              
336             This method uses a HEAD request to do the checking
337              
338             =head2 $library->request
339              
340             Returns the L<HTTP::Response> of the GET request for $library
341              
342             =head2 $library->fetch([ <to> ])
343              
344             Attempts to GET $library
345              
346             Returns the L<HTTP::Response> decoded content If <to> is not given
347              
348             If <to> is a SCALAR reference then the content will be put into <to>
349              
350             This method is synonymous/interchangeable with C<write>
351              
352             =head2 $library->write( <to> )
353              
354             Attempts to GET $library
355              
356             If <to> is a GLOB reference then the content will be printed to <to>
357              
358             If <to> is a filename (or Path::Class::File object) then the content will be printed to the filename specified
359              
360             This method will croak if $library couldn't be gotten from Google (e.g. 404)
361              
362             This method is synonymous/interchangeable with C<fetch>
363              
364             =head1 SEE ALSO
365              
366             L<http://code.google.com/apis/ajaxlibs/>
367              
368             L<JS::jQuery::Loader>
369              
370             L<JS::YUI::Loader>
371              
372             =head1 AUTHOR
373              
374             Robert Krimen <robertkrimen@gmail.com>
375              
376             =head1 COPYRIGHT AND LICENSE
377              
378             This software is copyright (c) 2010 by Robert Krimen.
379              
380             This is free software; you can redistribute it and/or modify it under
381             the same terms as the Perl 5 programming language system itself.
382              
383             =cut
384