File Coverage

blib/lib/Test/Class/Filter/Tags.pm
Criterion Covered Total %
statement 33 33 100.0
branch 4 4 100.0
condition n/a
subroutine 9 9 100.0
pod 1 1 100.0
total 47 47 100.0


line stmt bran cond sub pod time code
1             package Test::Class::Filter::Tags;
2              
3 6     6   5212 use strict;
  6         12  
  6         184  
4 6     6   31 use warnings;
  6         10  
  6         355  
5              
6 6     6   8466 use Attribute::Method::Tags;
  6         82193  
  6         45  
7 6     6   269 use Attribute::Method::Tags::Registry;
  6         14  
  6         116  
8 6     6   5990 use MRO::Compat;
  6         21290  
  6         248  
9 6     6   8181 use Test::Class;
  6         174997  
  6         218  
10              
11 6     6   74 use base qw( Exporter );
  6         14  
  6         3577  
12              
13             our $VERSION = '0.11';
14              
15             # import the 'Tags' attribute into the caller
16             our @EXPORT = qw( Tags );
17              
18             my $filter = sub {
19             my ( $test_class, $test_method ) = @_;
20              
21             # don't filter if our relevant env vars not set`
22             return 1 unless defined $ENV{ TEST_TAGS }
23             or defined $ENV{ TEST_TAGS_SKIP };
24              
25             my $suppressed = grep {
26             Attribute::Method::Tags::Registry->method_has_tag(
27             $test_class,
28             $test_method,
29             $_
30             )
31             } __expand_filter_vars( $ENV{ TEST_TAGS_SKIP } );
32              
33             return 0 if $suppressed;
34              
35             # don't filter on set tags, if there are no set tags
36             return 1 unless defined $ENV{ TEST_TAGS };
37              
38             my $matched = grep {
39             Attribute::Method::Tags::Registry->method_has_tag(
40             $test_class,
41             $test_method,
42             $_
43             );
44             } __expand_filter_vars( $ENV{ TEST_TAGS } );
45              
46             return 1 if $matched;
47             };
48              
49             # as test_class permits changing of the TEST_METHOD definitions,
50             # support doing similar for our controlling ENV vars
51             sub __expand_filter_vars {
52 375     375   498 my $val = shift;
53              
54 375 100       702 return if not defined $val;
55              
56 246         470 $val =~ s/^\s+//;
57 246         311 $val =~ s/\s+$//;
58              
59 246         653 my @tags = split /[\s,]/, $val;
60              
61 246         540 return @tags;
62             }
63              
64             # and finally, add our filter callback.
65             Test::Class->add_filter( $filter );
66              
67             # supporting method, to determine if any instances of method have tag defined
68             # in current class, and all subclasses.
69             sub method_has_tag {
70 5     5 1 88 my ( $self, $class, $method, $tag ) = @_;
71              
72 5         24 my $isa = mro::get_linear_isa( $class );
73 5         8 foreach my $c ( @{ $isa } ) {
  5         13  
74 15 100       144 return 1 if Attribute::Method::Tags::Registry->method_has_tag(
75             $c, $method, $tag
76             );
77             }
78              
79 2         30 return 0;
80             }
81              
82             1;
83              
84             __END__