line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# |
2
|
|
|
|
|
|
|
# This file is part of TBX-Checker |
3
|
|
|
|
|
|
|
# |
4
|
|
|
|
|
|
|
# This software is copyright (c) 2013 by Alan K. Melby. |
5
|
|
|
|
|
|
|
# |
6
|
|
|
|
|
|
|
# This is free software; you can redistribute it and/or modify it under |
7
|
|
|
|
|
|
|
# the same terms as the Perl 5 programming language system itself. |
8
|
|
|
|
|
|
|
# |
9
|
|
|
|
|
|
|
package TBX::Checker; |
10
|
2
|
|
|
2
|
|
38739
|
use strict; |
|
2
|
|
|
|
|
5
|
|
|
2
|
|
|
|
|
87
|
|
11
|
2
|
|
|
2
|
|
10
|
use warnings; |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
149
|
|
12
|
2
|
|
|
2
|
|
2426
|
use autodie; |
|
2
|
|
|
|
|
217887
|
|
|
2
|
|
|
|
|
12
|
|
13
|
2
|
|
|
2
|
|
49504
|
use File::ShareDir 'dist_dir'; |
|
2
|
|
|
|
|
52424
|
|
|
2
|
|
|
|
|
224
|
|
14
|
|
|
|
|
|
|
use Exporter::Easy ( |
15
|
2
|
|
|
|
|
31
|
OK => [ qw(check) ], |
16
|
2
|
|
|
2
|
|
8424
|
); |
|
2
|
|
|
|
|
8800
|
|
17
|
2
|
|
|
2
|
|
17433
|
use Path::Tiny; |
|
2
|
|
|
|
|
45338
|
|
|
2
|
|
|
|
|
156
|
|
18
|
2
|
|
|
2
|
|
26
|
use Carp; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
163
|
|
19
|
2
|
|
|
2
|
|
14
|
use feature 'state'; |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
258
|
|
20
|
2
|
|
|
2
|
|
8816
|
use Capture::Tiny 'capture_merged'; |
|
2
|
|
|
|
|
101400
|
|
|
2
|
|
|
|
|
3327
|
|
21
|
|
|
|
|
|
|
our $VERSION = '0.03'; # VERSION |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
my $TBXCHECKER = path( dist_dir('TBX-Checker'),'tbxcheck-1_2_9.jar' ); |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
# ABSTRACT: Check TBX validity using TBXChecker |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
#When run as a script instead of used as a module: check the input file and print the results |
28
|
|
|
|
|
|
|
_run(@ARGV) unless caller; |
29
|
|
|
|
|
|
|
sub _run { |
30
|
0
|
|
|
0
|
|
0
|
my ($tbx) = @_; |
31
|
0
|
|
|
|
|
0
|
my ($passed, $messages) = check($tbx); |
32
|
0
|
0
|
0
|
|
|
0
|
($passed && print 'ok!') |
33
|
|
|
|
|
|
|
or print join (qq{\n}, @$messages); |
34
|
0
|
|
|
|
|
0
|
return; |
35
|
|
|
|
|
|
|
} |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
sub check { |
39
|
6
|
|
|
6
|
1
|
23998
|
my ($data, @args) = @_; |
40
|
|
|
|
|
|
|
|
41
|
6
|
50
|
|
|
|
43
|
croak 'missing data argument. Usage: TBX::Checker::check($data, %args)' |
42
|
|
|
|
|
|
|
unless $data; |
43
|
|
|
|
|
|
|
|
44
|
6
|
|
|
|
|
35
|
my $file = _get_file($data); |
45
|
|
|
|
|
|
|
#due to TBXChecker bug, file must be relative to cwd |
46
|
6
|
|
|
|
|
76
|
my $rel_file = $file->relative; |
47
|
6
|
|
|
|
|
1789
|
my $arg_string = _get_arg_string(@args); |
48
|
|
|
|
|
|
|
|
49
|
6
|
|
|
|
|
57
|
my $command = qq{java -cp ".;$TBXCHECKER" org.ttt.salt.Main } . |
50
|
|
|
|
|
|
|
qq{$arg_string "$rel_file"}; |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
# capture STDOUT and STDERR from jar call into $output |
53
|
6
|
|
|
6
|
|
536
|
my $output = capture_merged {system($command)}; |
|
6
|
|
|
|
|
52050
|
|
54
|
6
|
|
|
|
|
11590
|
my @messages = split /\v+/, $output; |
55
|
6
|
|
|
|
|
79
|
my $valid = _is_valid(\@messages); |
56
|
6
|
|
|
|
|
185
|
return ($valid, \@messages); |
57
|
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
# get a Path::Tiny object for the file to give to the TBXChecker |
60
|
|
|
|
|
|
|
sub _get_file { |
61
|
6
|
|
|
6
|
|
13
|
my ($data) = @_; |
62
|
6
|
|
|
|
|
14
|
my $file; |
63
|
|
|
|
|
|
|
#pointers are string data |
64
|
6
|
100
|
|
|
|
53
|
if(ref $data eq 'SCALAR'){ |
65
|
3
|
|
|
|
|
54
|
$file = Path::Tiny->tempfile; |
66
|
|
|
|
|
|
|
#TODO: will this get encodings right? |
67
|
3
|
|
|
|
|
5841
|
$file->append_raw($$data); |
68
|
|
|
|
|
|
|
#everything else should be string paths |
69
|
|
|
|
|
|
|
}else{ |
70
|
3
|
|
|
|
|
276
|
$file = path($data); |
71
|
3
|
50
|
|
|
|
90
|
croak "$file doesn't exist!" |
72
|
|
|
|
|
|
|
unless $file->exists; |
73
|
|
|
|
|
|
|
} |
74
|
6
|
|
|
|
|
1050
|
return $file; |
75
|
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
# process arguments and return the command to be run and the file |
78
|
|
|
|
|
|
|
# being processed (so temp files aren't destroyed by leaving scope) |
79
|
|
|
|
|
|
|
sub _get_arg_string { |
80
|
6
|
|
|
6
|
|
48
|
my (%args) = @_; |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
# check the parameters. |
83
|
|
|
|
|
|
|
# TODO: use a module or something for param checking |
84
|
6
|
|
|
|
|
17
|
state $allowed_params = [ qw( |
85
|
|
|
|
|
|
|
loglevel lang country variant system version environment) ]; |
86
|
6
|
|
|
|
|
17
|
state $allowed_levels = [ qw( |
87
|
|
|
|
|
|
|
OFF SEVERE WARNING INFO CONFIG FINE FINER FINEST ALL) ]; |
88
|
6
|
|
|
|
|
40
|
foreach my $param (keys %args){ |
89
|
14
|
|
|
|
|
49
|
croak "unknown paramter: $param" |
90
|
2
|
50
|
|
|
|
10
|
unless grep { $_ eq $param } @$allowed_params; |
91
|
|
|
|
|
|
|
} |
92
|
6
|
100
|
|
|
|
37
|
if(exists $args{loglevel}){ |
93
|
2
|
50
|
|
|
|
10
|
grep { $_ eq $args{loglevel} } @$allowed_levels |
|
18
|
|
|
|
|
55
|
|
94
|
|
|
|
|
|
|
or croak "Loglevel doesn't exist: $args{loglevel}"; |
95
|
|
|
|
|
|
|
} |
96
|
6
|
|
100
|
|
|
61
|
$args{loglevel} ||= q{OFF}; |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
#combine the options into a string that TBXChecker will understand |
99
|
6
|
|
|
|
|
19
|
return join q{ }, map {"--$_=$args{$_}"} keys %args; |
|
6
|
|
|
|
|
48
|
|
100
|
|
|
|
|
|
|
} |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
#return a boolean indicating the validity of the file, given the messages |
103
|
|
|
|
|
|
|
#remove the message indicating that the file is valid (if it exists) |
104
|
|
|
|
|
|
|
sub _is_valid { |
105
|
6
|
|
|
6
|
|
40
|
my ($messages) = @_; |
106
|
|
|
|
|
|
|
#locate index of "Valid file:" message |
107
|
6
|
|
|
|
|
34
|
my $index = 0; |
108
|
6
|
|
|
|
|
71
|
while($index < @$messages){ |
109
|
6
|
50
|
|
|
|
132
|
last if $$messages[$index] =~ /^Valid file: /; |
110
|
6
|
|
|
|
|
21
|
$index++; |
111
|
|
|
|
|
|
|
} |
112
|
|
|
|
|
|
|
#if message not found, file was invalid |
113
|
6
|
50
|
|
|
|
36
|
if($index > $#$messages){ |
114
|
6
|
|
|
|
|
30
|
return 0; |
115
|
|
|
|
|
|
|
} |
116
|
|
|
|
|
|
|
#remove message and return true |
117
|
0
|
|
|
|
|
|
splice(@$messages, $index, 1); |
118
|
0
|
|
|
|
|
|
return 1; |
119
|
|
|
|
|
|
|
} |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
1; |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
__END__ |