File Coverage

blib/lib/WWW/UsePerl/Journal/Entry.pm
Criterion Covered Total %
statement 74 77 96.1
branch 14 22 63.6
condition 4 9 44.4
subroutine 18 19 94.7
pod 5 5 100.0
total 115 132 87.1


line stmt bran cond sub pod time code
1             package WWW::UsePerl::Journal::Entry;
2              
3 12     12   54 use strict;
  12         19  
  12         531  
4 12     12   54 use warnings;
  12         17  
  12         526  
5              
6 12     12   52 use vars qw($VERSION);
  12         12  
  12         723  
7             $VERSION = '0.26';
8              
9             #----------------------------------------------------------------------------
10              
11             =head1 NAME
12              
13             WWW::UsePerl::Journal::Entry - use.perl.org journal entry
14              
15             =head1 DESCRIPTION
16              
17             Do not use directly. See L for details of usage.
18              
19             =cut
20              
21             # -------------------------------------
22             # Library Modules
23              
24 12     12   68 use base qw(Class::Accessor::Fast);
  12         15  
  12         6971  
25              
26 12     12   32927 use HTTP::Cookies;
  12         21  
  12         276  
27 12     12   59 use HTTP::Request::Common;
  12         18  
  12         935  
28 12     12   58 use LWP::UserAgent;
  12         19  
  12         242  
29 12     12   47 use Time::Piece;
  12         16  
  12         82  
30 12     12   796 use Time::Seconds;
  12         20  
  12         880  
31              
32 12     12   67 use WWW::UsePerl::Journal;
  12         15  
  12         922  
33              
34             #----------------------------------------------------------------------------
35             # Accessors
36              
37             =head2 The Accessors
38              
39             The following accessor methods are available:
40              
41             date
42             subject
43             author
44             uid
45             content
46              
47             All functions can be called to return the current value of the associated
48             object variable.
49              
50             =cut
51              
52             __PACKAGE__->mk_accessors($_) for qw(date subject author eid);
53              
54             # -------------------------------------
55             # Constants & Variables
56              
57             my $UP_URL = 'http://use.perl.org/use.perl.org';
58 12     12   58 use overload q{""} => sub { $_[0]->stringify() };
  12     2   14  
  12         107  
  2         659  
59              
60             my $UID = '
61            
\s+
62            

\s+ (.*?) \s+ \((\d+)\) \s+

\s+
63             ';
64              
65             my %mons = (
66             1 => 'January',
67             2 => 'February',
68             3 => 'March',
69             4 => 'April',
70             5 => 'May',
71             6 => 'June',
72             7 => 'July',
73             8 => 'August',
74             9 => 'September',
75             10 => 'October',
76             11 => 'November',
77             12 => 'December',
78             );
79              
80             # -------------------------------------
81             # The Public Interface
82              
83             =head1 INTERFACE
84              
85             =head2 Constructor
86              
87             =over 4
88              
89             =item * new
90              
91             use WWW::UsePerl::Journal::Entry;
92             my $j = WWW::UsePerl::Journal::Entry->new(%hash);
93              
94             Creates an instance for a specific entry. The hash must contain values for
95             the keys 'j' (journal object), 'author' (entry author) and 'eid' (entry id).
96              
97             =back
98              
99             =cut
100              
101             sub new {
102 295     295 1 2460 my $class = shift;
103 295         1213 my %opts = (@_);
104              
105 295         479 for(qw/j author eid/) {
106 882 100       2210 return unless($opts{$_});
107             }
108              
109 293 100       1178 die "No parent object"
110             unless $opts{j}->isa('WWW::UsePerl::Journal');
111              
112             #use Data::Dumper;
113             #print STDERR "\n#self->new: ".Dumper(\%opts);
114              
115 292         1627 my $self = bless {%opts}, $class;
116 292         4563 return $self;
117             }
118              
119 0     0   0 sub DESTROY {}
120              
121             =head2 Methods
122              
123             =over 4
124              
125             =item * stringify
126              
127             use WWW::UsePerl::Journal::Entry;
128             my $j = WWW::UsePerl::Journal::Entry->new(%hash);
129             print "$j";
130              
131             Returns the content of the journal entry when the object is directly referenced
132             in a string.
133              
134             =cut
135              
136             sub stringify {
137 2     2 1 3 my $self = shift;
138 2         8 $self->content();
139             }
140              
141             =item * eid
142              
143             Returns the entry id for the current journal entry.
144              
145             =cut
146              
147             sub eid {
148 3     3 1 1150 my $self = shift;
149 3         14 return $self->{eid};
150             }
151              
152             =item * content
153              
154             Return the content of an journal entry.
155              
156             =cut
157              
158             sub content {
159 6     6 1 1304 my $self = shift;
160 6   66     47 $self->{content} ||= do { $self->_get_content };
  5         17  
161             }
162              
163             =item * raw
164              
165             For debugging purposes.
166              
167             =back
168              
169             =cut
170              
171             sub raw {
172 1     1 1 2 my $self = shift;
173 1         98 my $eid = $self->{eid};
174 1         4 my $author = $self->{author};
175             #print STDERR "\n#raw: URL=[". $UP_URL . "/_$author/journal/$eid.html]";
176 1         13 return $self->{j}->{ua}->request(GET $UP_URL . "/_$author/journal/$eid.html")->content;
177             }
178              
179             # -------------------------------------
180             # The Private Subs
181              
182             # name: _get_content
183             # args: self .... the current object
184             # retv: content text
185             # desc: Given a uid and journal entry id, will retrieve a specific journal
186             # entry and disassemble into component parts. returns the content text
187              
188             sub _get_content {
189 6     6   18 my $self = shift;
190 6         88 my $eid = $self->{eid};
191 6         13 my $author = $self->{author};
192 6         8 my $content;
193              
194 6         14 eval {
195 6         57 $content = $self->{j}->{ua}->request(GET $UP_URL . "/_$author/journal/$eid.html")->content;
196             };
197              
198             #print STDERR "\n#eval=[$@]\n";
199              
200 6 50       1495410 return $self->{j}->error("error getting entry") if($@);
201              
202             #print STDERR "\n#e->_get_content: URL=[". $UP_URL . "/_$author/journal/$eid.html]";
203             #print STDERR "\n#content=[$content]\n";
204              
205 6 50       38 return $self->{j}->error("error getting entry") unless $content;
206 6 100       85 return $self->{j}->error("error getting entry") if($content =~ m!Error type:\s+\d+!);
207              
208 5 50       430 return $self->{j}->error("$eid does not exist")
209             if $content =~
210             m#Sorry, there are no journal entries
211             found for this user.

#is; 212 5 50       456 return $self->{j}->error("$eid does not exist") 213             if $content =~ m!Sorry, the requested journal entries were not found.!is; 214               215 5         411 ($author,$self->{uid}) = $content =~ m!$UID!six; 216             #print STDERR "\n#e->_get_content: UID=[". ($self->{uid}) ."]"; 217               218 5         303 ($self->{subject}) = $content =~ m! 219            

.*? 220            
\s+ 221            

\s* (.*?) \s*

222             !six; 223               224             # date/time fields 225 5         264 my ($month, $day, $year, $hr, $mi, $amp) = $content =~ m! 226            
\w+ \s+ (\w+) \s+ (\d+), \s+ (\d+)
.*? 227            
(\d+):(\d+) \s+ ([AP]M)
228             !six; 229               230 5 50       75 unless($day) { 231 0         0 (undef,$mi,$hr,$day,$month,$year) = localtime(time()); 232 0         0 $month = $mons{$month}; 233             } 234               235             # just in case we can't get the time 236 5 50       20 if($amp) { 237 5 50 33     26 $hr += 12 if($hr > 12 && $amp eq 'PM'); 238 5 50 33     37 $hr = 0 if($hr == 12 && $amp eq 'AM'); 239             } 240               241             # sometimes Time::Piece can't parse the date :( 242 5         10 eval { 243 5         75 $self->{date} = Time::Piece->strptime( 244             "$month $day $year ${hr}:$mi", 245             '%B %d %Y %H:%M' 246             ); 247             }; 248               249             #$self->{date} += 4*ONE_HOUR; # correct TZ? 250               251 5         502 $content =~ m!
\s*(.*?)\s*
!six; 252 5         77 return $1; 253             } 254               255             1; 256               257             __END__