/[Frey]/trunk/lib/Frey/PPI.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Frey/PPI.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1097 - (hide annotations)
Sun Jun 28 20:34:40 2009 UTC (14 years, 10 months ago) by dpavlin
File size: 2974 byte(s)
scan tests in subdirectories
1 dpavlin 331 package Frey::PPI;
2     use Moose;
3    
4 dpavlin 797 extends 'Frey::Class::Loader';
5 dpavlin 331
6     use PPI;
7     use Data::Dump qw/dump/;
8 dpavlin 1097 use File::Find;
9 dpavlin 331
10     has 'class' => (
11     is => 'rw',
12     isa => 'Str',
13     required => 1,
14     documentation => 'Name of class to parse',
15     );
16    
17 dpavlin 364 has 'doc' => (
18     is => 'ro',
19     isa => 'PPI::Document',
20     lazy => 1,
21     default => sub {
22     my ( $self ) = @_;
23 dpavlin 487 my $path = $self->class;
24     $path = $self->class_path( $path ) unless $path =~ m{/};
25     warn "# doc from ", $self->class, " at ", $path if $self->debug;
26     my $doc = PPI::Document->new( $path );
27 dpavlin 364 $doc->prune('PPI::Token::Whitespace');
28     return $doc;
29     },
30     );
31 dpavlin 362
32 dpavlin 364 sub find {
33     my ( $self, $coderef ) = @_;
34 dpavlin 362
35 dpavlin 364 my $doc = $self->doc;
36     $doc->find(sub {
37     my ( $doc,$el ) = @_;
38     eval { $coderef->( $doc, $el ) };
39     warn "ERROR: $@" if $@;
40     });
41 dpavlin 362 }
42    
43 dpavlin 331 sub attribute_order {
44     my ( $self ) = @_;
45    
46 dpavlin 369 my @attribute_order;
47 dpavlin 364 $self->find(sub {
48     my ($doc,$el) = @_;
49 dpavlin 487 return unless
50     $el->isa('PPI::Statement') &&
51     $el->{children}->[0]->isa('PPI::Token::Word') &&
52     $el->{children}->[0]->literal eq 'has';
53 dpavlin 331
54 dpavlin 364 warn "## has ",$el->{children}->[1]->literal if $self->debug;
55 dpavlin 369 push @attribute_order, $el->{children}->[1]->literal;
56 dpavlin 331 });
57    
58 dpavlin 369 warn "# ", $self->class, " attribute_order ", dump( @attribute_order ) if $self->debug;
59 dpavlin 331
60 dpavlin 369 return @attribute_order if wantarray;
61     return \@attribute_order;
62 dpavlin 331 }
63    
64 dpavlin 364 sub includes {
65 dpavlin 331 my $self = shift;
66 dpavlin 364
67 dpavlin 362 my $include;
68 dpavlin 364 $self->find(sub {
69 dpavlin 362 my ($doc,$el) = @_;
70 dpavlin 364 return unless $el->isa('PPI::Statement::Include');
71    
72     warn "## include ",dump( $el->module, $el->type, $el->pragma ) if $self->debug;
73 dpavlin 943 push @{ $include->{ $el->type } }, $el->module
74     unless $el->module eq 'lib'; # skip use lib 'lib';
75 dpavlin 362 });
76 dpavlin 364 warn "# ", $self->class, " include ", dump( $include ) if $self->debug;
77     return $include;
78     }
79 dpavlin 362
80 dpavlin 487 our $class_has_tests;
81    
82     sub parse_tests {
83     my ( $self ) = @_;
84    
85 dpavlin 1097 finddepth({ no_chdir => 1, wanted => sub {
86     return unless m{\.t$};
87    
88 dpavlin 487 warn "## ppi test $_" if $self->debug;
89    
90     my $doc = Frey::PPI->new( class => $_ );
91     my @tests;
92    
93     # warn "## ",dump( $doc );
94    
95     $doc->find(sub {
96     my ($doc,$el) = @_;
97     return unless
98     $el->isa('PPI::Statement') &&
99     $el->{children}->[0]->isa('PPI::Token::Word') &&
100     $el->{children}->[0]->literal eq 'use_ok';
101    
102     # warn "## ",dump( $el );
103     my $class = $el->child(1)->child(0)->child(0)->literal;
104     $class_has_tests->{$class}->{$_}++;
105     });
106 dpavlin 1097 } }, 't/');
107 dpavlin 487 warn "# collected class tests ",dump( $class_has_tests ) if $self->debug;
108    
109     return $class_has_tests;
110     }
111    
112     =head2 has_tests
113    
114     my @tests = $self->has_tests;
115    
116     =cut
117    
118     sub has_tests {
119     my ($self) = shift;
120    
121 dpavlin 489 $self->parse_tests unless $class_has_tests;
122 dpavlin 487
123     my $class = $self->class;
124    
125     if ( my $tests = $class_has_tests->{ $class } ) {
126 dpavlin 489 my @tests = keys %$tests;
127     warn "# has_tests $class ",dump( @tests );
128 dpavlin 491 return @tests if wantarray;
129     return \@tests;
130 dpavlin 487 }
131     }
132    
133     =head2 as_data
134    
135     Debugging output
136    
137     =cut
138    
139 dpavlin 455 sub as_data {
140 dpavlin 364 my $self = shift;
141 dpavlin 362 return {
142 dpavlin 364 includes => $self->includes,
143 dpavlin 487 attribute_order => [ $self->attribute_order ],
144 dpavlin 364 doc => $self->doc,
145 dpavlin 362 };
146 dpavlin 331 }
147    
148     1;

  ViewVC Help
Powered by ViewVC 1.1.26