From abb9c51aa8e822f7d40be12facda43408db6ffbd Mon Sep 17 00:00:00 2001 From: dakkar Date: Tue, 27 Sep 2011 23:40:08 +0100 Subject: fix: Role/PPI is broken, inject same code in multiple files --- dist.ini | 3 ++ lib/Dist/Zilla/Plugin/Boilerplate.pm | 73 +++++++++++++++++++----------------- t/lib/TestModule2.pm | 4 ++ 3 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 t/lib/TestModule2.pm diff --git a/dist.ini b/dist.ini index 7db1a0d..8ecc53f 100644 --- a/dist.ini +++ b/dist.ini @@ -8,6 +8,9 @@ version = 0.001 [@Basic] +[PruneFiles] +matches = ~$ + [Boilerplate / foo] code_line = our $foo = 1; code_line = our $bar = 2; diff --git a/lib/Dist/Zilla/Plugin/Boilerplate.pm b/lib/Dist/Zilla/Plugin/Boilerplate.pm index 13b087e..cf80b9a 100644 --- a/lib/Dist/Zilla/Plugin/Boilerplate.pm +++ b/lib/Dist/Zilla/Plugin/Boilerplate.pm @@ -31,7 +31,7 @@ has code_line => ( required => 1, ); -sub code { shift->code_line->join("\n") } +sub code { shift->code_line->join("\n")."\n" } has _parsed_code => ( is => 'ro', @@ -98,52 +98,57 @@ sub munge_files { sub munge_file { my ($self, $file) = @_; - my $doc = $self->ppi_document_for_file($file); - my $my_uses = $doc->find( - sub{ - my $element = $_[1]; - $element->isa('PPI::Statement::Include') && - $element->type eq 'use' && - $element->module eq __PACKAGE__ - } - ); + my ($doc,$my_uses) = $self->_find_uses($file); return unless $my_uses; + for my $use ($my_uses->flatten) { my $tags = $self->_find_tags_from_ppi($use->arguments); - if ($tags->first(sub{$_ eq $self->plugin_name})) { + if ($tags->grep(sub{$_ eq $self->plugin_name})->length) { for my $elem ($self->_parsed_code->children) { - $use->insert_before($elem) + $use->insert_before($elem->clone) or $self->log_fatal("Couldn't insert $elem before $use\n"); } - $use->delete; } } - $self->save_ppi_document_to_file($doc,$file); + $file->content($doc->serialize); +} + +sub _find_uses { + my ($self,$file) = @_; + + my $content = $file->content; + my $doc = PPI::Document->new(\$content); + return $doc,$doc->find( + sub{ + my $element = $_[1]; + $element->isa('PPI::Statement::Include') && + $element->type eq 'use' && + $element->module eq __PACKAGE__ + } + ); } sub _find_tags_from_ppi { - my ($self,$node) = @_; + my ($self,@nodes) = @_; - if ($node->isa('PPI::Token::Quote')) { - return [$node->string]; - } - elsif ($node->isa('PPI::Token::QuoteLike::Words')) { - return [$node->literal]; - } - elsif ($node->isa('PPI::Token')) { - return [ $node->content ]; # probably wrong - } - elsif ($node->can('find')) { - return [ - ($node->find('PPI::Token::Quote') || []) - ->map(sub{$_->string})->flatten(), - ($node->find('PPI::Token::QuoteLike::Words') || []) - ->map(sub{$_->literal})->flatten, - ]; - } - else { - return [] + my @ret; + for my $node (@nodes) { + if ($node->isa('PPI::Token::Quote')) { + push @ret, $node->string; + } + elsif ($node->isa('PPI::Token::QuoteLike::Words')) { + push @ret, $node->literal; + } + elsif ($node->can('find')) { + push @ret, ( + ($node->find('PPI::Token::Quote') || []) + ->map(sub{$_->string})->flatten(), + ($node->find('PPI::Token::QuoteLike::Words') || []) + ->map(sub{$_->literal})->flatten, + ); + } } + return \@ret; } } package Dist::Zilla::Plugin::Boilerplate::Chrome;{ diff --git a/t/lib/TestModule2.pm b/t/lib/TestModule2.pm new file mode 100644 index 0000000..15d7e21 --- /dev/null +++ b/t/lib/TestModule2.pm @@ -0,0 +1,4 @@ +package TestModule2; +use Dist::Zilla::Plugin::Boilerplate 'bar'; + +1; -- cgit v1.2.3