Skip to content

Commit

Permalink
Merge commit 'franckcuny/redmine'
Browse files Browse the repository at this point in the history
* commit 'franckcuny/redmine':
  -fixme
  update tests
  integrate comment and update
  push new ticket
  • Loading branch information
obra committed Sep 15, 2009
2 parents 93b1d22 + fa39770 commit 0a6b522
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 6 deletions.
6 changes: 6 additions & 0 deletions lib/App/SD/Replica/redmine.pm
@@ -1,5 +1,9 @@
package App::SD::Replica::redmine;
use Any::Moose;

# XXX
use YAML::Syck;

extends 'App::SD::ForeignReplica';

use constant scheme => 'redmine';
Expand Down Expand Up @@ -45,6 +49,8 @@ sub BUILD {

}

sub record_pushed_transactions {}

sub uuid {
my $self = shift;
Carp::cluck "- can't make a uuid for this" unless ($self->remote_url);
Expand Down
146 changes: 146 additions & 0 deletions lib/App/SD/Replica/redmine/PushEncoder.pm
@@ -1,3 +1,149 @@
package App::SD::Replica::redmine::PushEncoder;

use Any::Moose;
use Params::Validate;
use YAML::Syck;

has sync_source => (
isa => 'App::SD::Replica::redmine',
is => 'rw',
required => 1
);

sub integrate_change {
my $self = shift;
my ( $change, $changeset ) = validate_pos(
@_,
{ isa => 'Prophet::Change' },
{ isa => 'Prophet::ChangeSet' }
);
my ( $id, $record );

return
if $self->sync_source->app_handle->handle->last_changeset_from_source(
$changeset->original_source_uuid ) >= $changeset->original_sequence_no;

my $before_integration = time();

eval {
if ( $change->record_type eq 'ticket'
and $change->change_type eq 'add_file' )
{
$id = $self->integrate_ticket_create( $change, $changeset );
$self->sync_source->record_remote_id_for_pushed_record(
uuid => $change->record_uuid,
remote_id => $id,
);
}
elsif ( $change->record_type eq 'comment'
and $change->change_type eq 'add_file' )
{
$id = $self->integrate_comment( $change, $changeset );
}
elsif ( $change->record_type eq 'ticket' ) {
$id = $self->integrate_ticket_update( $change, $changeset );
}
else {
$self->sync_source->log(
'I have no idea what I am doing for ' . $change->record_uuid );
return;
}

$self->sync_source->record_pushed_transactions(
start_time => $before_integration,
ticket => $id,
changeset => $changeset,
);
};

if ( my $err = $@ ) {
$self->sync_source->log( "Push error: " . $err );
}

return $id;
}

sub integrate_ticket_update {
my $self = shift;
my ( $change, $changeset ) = validate_pos(
@_,
{ isa => 'Prophet::Change' },
{ isa => 'Prophet::ChangeSet' }
);
my $remote_ticket_id
= $self->sync_source->remote_id_for_uuid( $change->record_uuid );
my $attr = $self->_recode_props_for_integrate($change);

my $ticket = Net::Redmine::Ticket->load(
connection => $self->sync_source->redmine->connection,
id => $remote_ticket_id
);
for (qw/subject description /) {
$ticket->$_( $attr->{$_} ) if $attr->{$_};
}
if ( $attr->{state} ) {
$ticket->status("Open") if $attr->{state} eq 'open';
$ticket->status("Closed") if $attr->{state} eq 'closed';
}
$ticket->save;
return $remote_ticket_id;
}

sub integrate_ticket_create {
my $self = shift;
my ( $change, $changeset ) = validate_pos(
@_,
{ isa => 'Prophet::Change' },
{ isa => 'Prophet::ChangeSet' }
);
my $attr = $self->_recode_props_for_integrate($change);
my $ticket = $self->sync_source->redmine->create(ticket => $attr);
# TODO error
return $ticket->{id};
}

sub integrate_comment {
my $self = shift;
my ( $change, $changeset ) = validate_pos(
@_,
{ isa => 'Prophet::Change' },
{ isa => 'Prophet::ChangeSet' }
);

my %props = map { $_->name => $_->new_value } $change->prop_changes;
my $ticket_id
= $self->sync_source->remote_id_for_uuid( $props{'ticket'} );
my $ticket = Net::Redmine::Ticket->load(
connection => $self->sync_source->redmine->connection,
id => $ticket_id
);
$ticket->description( $props{'content'} );
$ticket->save;
return $ticket_id;
}

sub _recode_props_for_integrate {
my $self = shift;
my ($change) = validate_pos( @_, { isa => 'Prophet::Change' } );

my %props = map { $_->name => $_->new_value } $change->prop_changes;
my %attr;

for my $key ( keys %props ) {
if ( $key eq 'summary' ) {
$attr{subject} = $props{$key};
}
elsif ( $key eq 'body' ) {
$attr{description} = $props{$key};
}
elsif ( $key eq 'status' ) {
$attr{state} = $props{$key} =~ /new|open/ ? 'open' : 'closed';
}
}
return \%attr;
}

__PACKAGE__->meta->make_immutable;
no Any::Moose;

1;
8 changes: 2 additions & 6 deletions t/sd-redmine/basic.t
Expand Up @@ -20,7 +20,7 @@ require 't/sd-redmine/net_redmine_test.pl';

my $r = new_redmine();

plan tests => 1;
plan tests => 2;

note "create 5 new tickets in redmine.";
my @tickets = new_tickets($r, 5);
Expand Down Expand Up @@ -53,11 +53,7 @@ diag($err);
note "verify the update with Net::Redmine";
my $ticket = $r->lookup(ticket => { id => $tickets[0]->id });

TODO: {
local $TODO = 'write support is not yet implemented';

is($ticket->status, "Closed");
};
is($ticket->status, "Closed");

##
sub count_tickets_in_sd {
Expand Down

0 comments on commit 0a6b522

Please sign in to comment.