File Coverage

blib/lib/Text/Amuse/Compile/FileName.pm
Criterion Covered Total %
statement 46 46 100.0
branch 11 12 91.6
condition n/a
subroutine 14 14 100.0
pod 11 11 100.0
total 82 83 98.8


line stmt bran cond sub pod time code
1             package Text::Amuse::Compile::FileName;
2              
3 59     59   1732 use strict;
  59         167  
  59         1767  
4 59     59   324 use warnings;
  59         161  
  59         1450  
5 59     59   348 use File::Basename ();
  59         146  
  59         37127  
6              
7             =head1 NAME
8              
9             Text::Amuse::Compile::FileName - Parser for filenames passed to the compiler.
10              
11             =head1 METHODS
12              
13             =head2 new($filename)
14              
15             The constructor only accept a filename. It can have the form:
16              
17             my-filename:0,2,3
18             my-filename
19             /path/to/filename.muse
20             ../path/to/filename.muse
21             ../path/to/filename.muse:1,4,5
22              
23             I.e., relative or absolute paths with extensions, or bare filenames
24             without extension, with an optional range of fragments (for partial
25             output).
26              
27             =head1 METHODS
28              
29             =head2 path
30              
31             =head2 name
32              
33             =head2 suffix
34              
35             =head2 filename
36              
37             =head2 full_path
38              
39             =head2 fragments
40              
41             =head2 fragments_specification
42              
43             =head2 name_with_ext_and_fragments
44              
45             =head2 name_with_fragments
46              
47             =head2 text_amuse_constructor
48              
49             =cut
50              
51             sub new {
52 430     430 1 6280 my ($class, $filename) = @_;
53 430 50       1560 die "Missing filename" unless defined $filename;
54 430         2416 my $fragment_definition = qr/(?: [0-9] | [1-9][0-9]+ | pre | post )/x;
55 430         5670 my $fragment = qr/\: $fragment_definition
56             (?: , $fragment_definition )*
57             /x;
58 430         1706 my $ext = qr{\.muse};
59 430         1010 my @fragments;
60 430 100       4750 if ($filename =~ m/($ext)?($fragment)\z/) {
61 18         71 my $fragment_path = $2;
62 18         252 $filename =~ s/$fragment\z//;
63 18         87 $fragment_path =~ s/\A\://;
64 18         288 @fragments = split(/,/, $fragment_path);
65             }
66 430         17218 my ($name, $path, $suffix) = File::Basename::fileparse($filename, $ext);
67 430 100       3544 my $self = {
68             name => $name,
69             path => $path,
70             suffix => '.muse',
71             fragments => (scalar(@fragments) ? \@fragments : undef),
72             };
73 430         2723 bless $self, $class;
74             }
75              
76 1293     1293 1 4949 sub name { shift->{name} };
77 671     671 1 2995 sub path { shift->{path} };
78 1264     1264 1 11859 sub suffix { shift->{suffix} };
79 358 100   358 1 813 sub fragments { return @{ shift->{fragments} || [] } }
  358         2931  
80              
81             sub fragments_specification {
82 20     20 1 38 my $self = shift;
83 20         43 my $out = '';
84 20 100       38 if (my @fragments = $self->fragments) {
85 8         27 $out = ':' . join(',', @fragments);
86             }
87 20         93 return $out;
88             }
89              
90             sub name_with_fragments {
91 10     10 1 23 my $self = shift;
92 10         20 return $self->name . $self->fragments_specification;
93             }
94              
95             sub name_with_ext_and_fragments {
96 10     10 1 19 my $self = shift;
97 10         25 return $self->name . $self->suffix . $self->fragments_specification;
98             }
99              
100             sub filename {
101 960     960 1 1882 my $self = shift;
102 960         2497 return $self->name . $self->suffix;
103             }
104              
105             sub full_path {
106 338     338 1 958 my $self = shift;
107 338         1294 return $self->path . $self->filename;
108             }
109              
110             sub text_amuse_constructor {
111 338     338 1 842 my $self = shift;
112 338         1091 my %constructor = (file => $self->filename);
113 338 100       1424 if (my @fragments = $self->fragments) {
114 18         71 $constructor{partial} = \@fragments;
115             }
116 338         1941 return %constructor;
117             }
118              
119             1;