Skip to content

Commit

Permalink
Added history component
Browse files Browse the repository at this point in the history
Fleshed-out announcement flow
  • Loading branch information
robertkrimen committed Apr 4, 2009
1 parent dee610d commit 4fe621a
Show file tree
Hide file tree
Showing 17 changed files with 455 additions and 20 deletions.
13 changes: 13 additions & 0 deletions Changes
@@ -0,0 +1,13 @@
TODO:
- Implement dry-run
- Image fetching/uploading
- Abort unless have meetup_uri
- Change greymatter121c => sfpm
- Datetime as "* ago"
- Config checker

Friday April 03 18:25:32 PDT 2009:

2009-04-02:
- Initial release

9 changes: 6 additions & 3 deletions MANIFEST
Expand Up @@ -24,11 +24,14 @@ lib/App/PM/Announce/Feed/.meetup.pm.swp
lib/App/PM/Announce/Feed/greymatter121c.pm
lib/App/PM/Announce/Feed/linkedin.pm
lib/App/PM/Announce/Feed/meetup.pm
lib/App/PM/Announce/History.pm
META.yml
script/pm-announce
t/00-load.t
t/01-basic.t
t/02-config.t
t/000-load.t
t/001-basic.t
t/002-config.t
t/003-parse.t
t/004-history.t
t/assets/home/config
t/prototype/.02-linkedin.t.swp
t/prototype/01-greymatter121c.t
Expand Down
4 changes: 4 additions & 0 deletions Makefile.PL
Expand Up @@ -28,7 +28,11 @@ _END_
map { my ($pk, $vr) = split m/\s/; requires $pk => $vr || 0 } grep { ! /^\s*#/ } split m/\n/, <<_END_;
Config::General
Config::JFDI
DBD::SQLite
DBI
DBIx::Simple
DateTime
Document::Stembolt
File::HomeDir
Getopt::Chain
HTML::TreeBuilder
Expand Down
2 changes: 1 addition & 1 deletion README
Expand Up @@ -6,7 +6,7 @@ VERSION

SYNOPSIS
# From the command-line
./pm-announce test
pm-announce test

DESCRIPTION
App::PM::Announce is a tool for creating and advertising PM meetings.
Expand Down
101 changes: 90 additions & 11 deletions lib/App/PM/Announce.pm
Expand Up @@ -23,7 +23,11 @@ use Path::Class;
use Config::JFDI;
use Config::General;
use String::Util qw/trim/;
use Data::UUID;
use Document::Stembolt;
use DateTimeX::Easy;

use App::PM::Announce::History;
use App::PM::Announce::Feed::meetup;
use App::PM::Announce::Feed::linkedin;
use App::PM::Announce::Feed::greymatter121c;
Expand Down Expand Up @@ -114,6 +118,12 @@ sub _build_linkedin_feed {
);
}

has history => qw/is ro isa App::PM::Announce::History lazy_build 1/;
sub _build_history {
my $self = shift;
return App::PM::Announce::History->new( app => $self );
}

sub startup {
my $self = shift;

Expand All @@ -140,35 +150,104 @@ _END_

sub announce {
my $self = shift;
my %event = @_;
my %event;
if (ref $_[0]) {
my $document = $self->parse( @_ );
%event = %{ $document->header };
$event{description} = $document->body;
}
else {
%event = @_;
}

{ # Validate, parse, and filter.

$event{$_} = trim $event{$_} for qw/title venue/;

die "Wasn't given a title for the event" unless $event{title};
die "Wasn't given a UUID for the event\n" unless $event{uuid};

die "Wasn't given a title for the event\n" unless $event{title};

die "Wasn't given a venue for the event" unless $event{venue};
die "Wasn't given a venue for the event\n" unless $event{venue};

die "Wasn't given a date & time for the event" unless $event{datetime};
die "The date & time isn't a DateTime object" unless $event{datetime}->isa( 'DateTime' );
die "Wasn't given a date & time for the event\n" unless $event{datetime};
die "The date & time isn't a DateTime object\n" unless $event{datetime}->isa( 'DateTime' );
}

my $result;
my ($event, $result);
my $uuid = $event{uuid};
$event = $self->history->find_or_insert( $uuid )->{data};
$self->history->update( $uuid => %event );

$result = $self->feed->{meetup}->announce( %event );
if ($event->{did_meetup}) {
$self->logger->debug( "Already posted to meetup, skipping" );
$self->logger->debug( "meetup_uri is " . $event->{meetup_uri} );
}
else {
$result = $self->feed->{meetup}->announce( %event );
my $meetup_uri = $event->{meetup_uri} = $result->{meetup_uri};
$self->logger->debug( "meetup_uri is " . $meetup_uri );
$self->history->update( $uuid => did_meetup => 1, meetup_uri => "$meetup_uri" );
}

$event{description} = [ $event{description}, $result->{meetup_uri} ];
$event{description} = [ $event{description}, $event->{meetup_uri} ];

$result = $self->feed->{linkedin}->announce( %event );
if ($event->{did_linkedin}) {
$self->logger->debug( "Already posted to linkedin, skipping" );
}
else {
$result = $self->feed->{linkedin}->announce( %event );
$self->history->update( $uuid => did_linkedin => 1 );
}

$result = $self->feed->{greymatter121c}->announce( %event );
if ($event->{did_greymatter121c}) {
$self->logger->debug( "Already posted to sfpm, skipping" );
}
else {
$result = $self->feed->{greymatter121c}->announce( %event );
$self->history->update( $uuid => did_greymatter121c => 1 );
}
}

sub parse {
my $self = shift;

die "Couldn't parse" unless my $document = Document::Stembolt::Content->read(shift);

my $datetime = $document->header->{datetime};
die "You didn't give a datetime" unless $datetime;
die "Unable to parse ", $document->header->{datetime} unless $datetime = DateTimeX::Easy->parse( $datetime );
$document->header->{datetime} = $datetime;

return $document;
}

sub template {
my $self = shift;

my $uuid = Data::UUID->new->create_str;
my $datetime = DateTimeX::Easy->parse( '4th tuesday' );
my $venue = $self->config->{venue} || '';
$datetime = DateTimeX::Easy->parse( '3rd tuesday' ) unless $datetime;
$datetime->set(hour => 19, minute => 0, second => 0);

return <<_END_;
# App-PM-Announce
---
title: The title of the event
venue: $venue
datetime: $datetime
uuid: $uuid
---
Put your multi-line description for the event here.
Everything below the '---' is considered the description.
_END_
}

=head1 SYNOPSIS
# From the command-line
./pm-announce test
pm-announce test
=head1 DESCRIPTION
Expand Down
37 changes: 37 additions & 0 deletions lib/App/PM/Announce/App.pm
Expand Up @@ -6,6 +6,7 @@ use strict;
use Getopt::Chain;
use App::PM::Announce;
use DateTime;
use Text::Table;

my $app;
sub app {
Expand Down Expand Up @@ -64,6 +65,42 @@ _END_
datetime => DateTime->now->add(days => 10),
);
},
template => sub {
my ($context, @arguments) = @_;
print STDOUT app->template;
},
announce => sub {
my ($context, @arguments) = @_;
app->announce( \*STDIN );
},
history => sub {
my ($context, @arguments) = @_;
my $query = shift @arguments;
if ($query) {
my $event = app->history->find( $query );
my $data = $event->{data};
{
no warnings 'uninitialized';
print <<_END_;
$event->{uuid}
$data->{title}
$data->{meetup_uri}
_END_
}
}
else {
my @all = app->history->all;
my @table = map {
my $data = $_->{data};
my $did;
$did += $data->{"did_$_"} ? 1 : 0 for qw/meetup linkedin greymatter121c/;
[ join ' | ', $_->{uuid}, $data->{title}, $_->{insert_datetime}, "$did/3" ];
} app->history->all;
print "\n", Text::Table->new->load( @table ), "\n";
}
},
},
);
}
Expand Down
1 change: 1 addition & 0 deletions lib/App/PM/Announce/Feed.pm
Expand Up @@ -12,6 +12,7 @@ use HTML::TreeBuilder;
has app => qw/is ro isa App::PM::Announce required 1/, handles => [qw/ logger /];
has username => qw/is ro isa Str required 1/;
has password => qw/is ro isa Str required 1/;
has uri => qw/is ro required 1/;

has agent => qw/is ro lazy_build 1/, handles => [qw/ submit_form /];
sub _build_agent {
Expand Down
2 changes: 0 additions & 2 deletions lib/App/PM/Announce/Feed/greymatter121c.pm
Expand Up @@ -6,8 +6,6 @@ use strict;
use Moose;
extends 'App::PM::Announce::Feed';

has uri => qw/is ro required 1/;

sub announce {
my $self = shift;
my %event = @_;
Expand Down
2 changes: 0 additions & 2 deletions lib/App/PM/Announce/Feed/linkedin.pm
Expand Up @@ -6,8 +6,6 @@ use strict;
use Moose;
extends 'App::PM::Announce::Feed';

has uri => qw/is ro required 1/;

sub announce {
my $self = shift;
my %event = @_;
Expand Down
1 change: 0 additions & 1 deletion lib/App/PM/Announce/Feed/meetup.pm
Expand Up @@ -6,7 +6,6 @@ use strict;
use Moose;
extends 'App::PM::Announce::Feed';

has uri => qw/is ro required 1/;
has venue => qw/is ro/;

sub announce {
Expand Down

0 comments on commit 4fe621a

Please sign in to comment.