Skip to content

Commit

Permalink
Added Command/Batchedit.pm and updated the README for me as a contrib…
Browse files Browse the repository at this point in the history
…utor.

1) The Batchedit command is for directly editing from a shell script / batch file.
   You use it like:
         wgd batchedit \
             --pattern=http...yui.yahooapis.com.build.css.carousel.css \
             --string=https://ajax.googleapis.com/build/libs/yui/carousel.css \
             mO1yJ1zG5tJ0
   where '--pattern' is the Perl regex pattern to match (the modifiers 'xms' are
   always applied), '--string' is the replacement string, and the last arguments
   are a mix of URLs and assetIds.

2) I've added myself as a contributor to wgdev.
  • Loading branch information
--global committed May 21, 2012
1 parent 78c79bd commit 55ada55
Show file tree
Hide file tree
Showing 2 changed files with 219 additions and 0 deletions.
1 change: 1 addition & 0 deletions README
Expand Up @@ -53,6 +53,7 @@ CONTRIBUTORS
Graham Knop <haarg@haarg.org>
Patrick Donelan <pat@patspam.com>
Doug Bell <doug@plainblack.com>
Mark Leighton Fisher <markleightonfisher@gmail.com>
Colin Kuskie <colink@perldreamer.com>

LICENSE INFORMATION
Expand Down
218 changes: 218 additions & 0 deletions lib/WGDev/Command/Batchedit.pm
@@ -0,0 +1,218 @@
package WGDev::Command::Batchedit;
# ABSTRACT: Edits assets by URL or asset ID with a pattern and a string
# so it can be used in a shell script / batch file
use strict;
use warnings;
use 5.008008;

use parent qw(WGDev::Command::Base);

use WGDev ();

sub config_options {
return qw(
command=s
tree=s@
class=s@
pattern=s
string=s
);
}

sub process {
my $self = shift;
my $wgd = $self->wgd;

my @assets_to_edit = $self->get_assets_data;

if ( !@assets_to_edit ) {
WGDev::X->throw('No assets to edit!');
}

# get pattern to match
my $pattern = $self->{options}->{pattern};

# get replacement string
my $string = $self->{options}->{string};

my $output_format = "%-8s: %-30s (%22s) %s\n";

my $version_tag;
for my $asset_to_edit (@assets_to_edit) {
my $asset_text = $asset_to_edit->{text};
my $old_asset_text = $asset_text;
$asset_text =~ s/$pattern/$string/xmsg;
if ( $asset_text eq $old_asset_text ) {
printf $output_format,
'Skipping', ( $asset_to_edit->{url} || $asset_to_edit->{title} ),
( $asset_to_edit->{asset_id} || q{} ), $asset_to_edit->{title};
next;
}
$version_tag ||= do {
require WebGUI::VersionTag;
my $vt = WebGUI::VersionTag->getWorking( $wgd->session );
$vt->set( { name => 'WGDev Asset Editor' } );
$vt;
};
my $asset_data = $wgd->asset->deserialize($asset_text);
my $asset;
my $parent;
if ( $asset_data->{parent} ) {
$parent = eval { $wgd->asset->find( $asset_data->{parent} ) };
}
if ( $asset_to_edit->{asset_id} ) {
$asset = $wgd->asset->by_id( $asset_to_edit->{asset_id}, undef,
$asset_to_edit->{revision} );
$asset = $asset->addRevision(
$asset_data,
undef,
{
skipAutoCommitWorkflows => 1,
skipNotification => 1,
} );
if ($parent) {
$asset->setParent($parent);
}
}
else {
$parent ||= $wgd->asset->import_node;
my $asset_id = $asset_data->{assetId};
$asset = $parent->addChild(
$asset_data,
$asset_id,
undef,
{
skipAutoCommitWorkflows => 1,
skipNotification => 1,
} );
}
printf $output_format, ( $asset_to_edit->{asset_id} ? 'Updating' : 'Adding' ),
$asset->get('url'), $asset->getId, $asset->get('title');
}

if ($version_tag) {
$version_tag->commit;
}
return 1;
}

sub get_assets_data {
my $self = shift;
my $wgd = $self->wgd;
my @assets_data;
for my $asset_spec ( $self->arguments ) {
my $asset_data = eval { $self->get_asset_data($asset_spec) };
if ( !$asset_data ) {
warn $@;
next;
}
push @assets_data, $asset_data;
}
if ( !$self->option('tree') ) {
return @assets_data;
}
for my $parent_spec ( @{ $self->option('tree') } ) {
my $parent = $wgd->asset->find($parent_spec) || do {
warn "$parent_spec is not a valid asset!\n";
next;
};
my $options = {};
if ( $self->option('class') ) {
my @classes = @{ $self->option('class') };
for (@classes) {
s/^(?:(?:WebGUI::Asset)?::)?/WebGUI::Asset::/msx;
}
$options->{includeOnlyClasses} = \@classes;
}
my $assets
= $parent->getLineage( [qw(self descendants)], $options );
for my $asset_id ( @{$assets} ) {
my $asset_data = $self->get_asset_data($asset_id);
if ( !$asset_data ) {
next;
}
push @assets_data, $asset_data;
}
}
return @assets_data;
}

sub get_asset_data {
my $self = shift;
my $asset = shift;

my $wgd_asset = $self->wgd->asset;
if ( !ref $asset ) {
$asset = eval { $wgd_asset->find($asset) };
if ( !$asset ) {
die $@;
}
}

my $asset_text = $self->wgd->asset->serialize($asset);
my $short_class = ref $asset || $asset;
$short_class =~ s/^WebGUI::Asset:://msx;

return {
text => $asset_text,
class => ref $asset || $asset,
asset_id => $asset->getId,
url => $asset->get('url'),
title => $asset->get('title'),
};
}

1;

=head1 SYNOPSIS
wgd batchedit --pattern=<pattern> --string=<string> <asset> [<asset> ...]
wgd batchedit --tree=<asset> --pattern=<pattern> --string=<string> [--tree=<asset> ...] [--class=<class> ...]
=head1 DESCRIPTION
Edits assets in-place by replacing all matching 'pattern's with 'string'.
If modifications are made, the assets are updated.
=head1 OPTIONS
=over 8
=item C<--pattern=>
Pattern to match against for replacing.
=item C<--string=>
Replacement string for the matched pattern.
=item C<< <asset> >>
Either an asset URL or ID. As many as desired can be specified.
Prepending with a slash will force it to be interpreted as a URL.
=item C<--tree=>
Will open specified asset and all descendants in editor. Can be specified
multiple times.
=item C<--class=>
Only used with --tree option. Limits exported assets to specified classes.
Can be specified as a full (C<WebGUI::Asset::Template>) or abbreviated
(C<Template>) class name.
=back
=method C<get_assets_data>
Creates and returns an array of hash references with information about
the assets and exported files. Also follows the C<--tree> option.
=method C<get_asset_data ( $asset_or_class )>
Accepts an asset, returning a hash reference of information about the
asset.
=cut

0 comments on commit 55ada55

Please sign in to comment.