File Coverage

blib/lib/UR/Object/Command/Copy.pm
Criterion Covered Total %
statement 23 26 88.4
branch 13 16 81.2
condition 9 12 75.0
subroutine 3 4 75.0
pod 0 1 0.0
total 48 59 81.3


line stmt bran cond sub pod time code
1             package UR::Object::Command::Copy;
2              
3 11     11   2538 use strict;
  11         28  
  11         376  
4 11     11   67 use warnings FATAL => 'all';
  11         24  
  11         3827  
5              
6             class UR::Object::Command::Copy {
7             is => 'Command::V2',
8             is_abstract => 1,
9             has => {
10             changes => {
11             is => 'Text',
12             is_many => 1,
13             doc => 'A name/value comma-separated list of changes',
14             },
15             },
16             };
17              
18             sub help_detail {
19 0     0 0 0 <
20             Any non-delegated, non-ID properties may be specified with an operator and a value.
21              
22             Valid operators are '=', '+=', '-=', and '.='; function is same as in Perl.
23             Example:
24             --changes "name.=-RT101912,foo=bar"
25              
26             A value of 'undef' may be used to pass a Perl undef as the value. Either `foo=` [safer] or `foo=''` can be used to set the value to an empty string.
27             HELP
28             }
29              
30             sub execute {
31 4     4   171309 my $self = shift;
32              
33 4         23 my $tx = UR::Context::Transaction->begin;
34              
35 4         27587 my $copy = $self->source->copy();
36              
37 4         18529 my $failure;
38 4         23 for my $change ($self->changes) {
39 7         15481 my ($key, $op, $value) = $change =~ /^(.+?)(=|\+=|\-=|\.=)(.*)$/;
40 7 100 50     57 $failure = "Invalid change: $change" and last
      66        
41             unless $key and defined $op;
42 6 100 50     35 $failure = sprintf('Invalid property %s for %s', $key, $copy->__display_name__) and last
43             if !$copy->can($key);
44              
45 5 100       64 $value = undef if $value eq '';
46              
47 5 100       28 if ($op eq '=') {
    50          
    50          
    50          
48 3         15 $copy->$key($value);
49             }
50             elsif ($op eq '+=') {
51 0         0 $copy->$key($copy->$key + $value);
52             }
53             elsif ($op eq '-=') {
54 0         0 $copy->$key($copy->$key - $value);
55             }
56             elsif ($op eq '.=') {
57 2         13 $copy->$key($copy->$key . $value);
58             }
59             }
60              
61 4 100 100     1656 if ($failure or !$tx->commit ) {
62 3         5830 $tx->rollback;
63 3   100     8296 $self->fatal_message($failure || 'Failed to commit software transaction!');
64             }
65              
66 1         4868 $self->status_message("NEW\t%s\t%s", $copy->class, $copy->__display_name__);
67 1         1853 1;
68             }
69              
70             1;