/[vz-tools]/trunk/inc/Module/Install/Metadata.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

Contents of /trunk/inc/Module/Install/Metadata.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 34 - (show annotations)
Thu Nov 8 11:35:15 2007 UTC (16 years, 5 months ago) by dpavlin
File size: 9047 byte(s)
added inc/ to enable installation from checkout
1 #line 1
2 package Module::Install::Metadata;
3
4 use strict 'vars';
5 use Module::Install::Base;
6
7 use vars qw{$VERSION $ISCORE @ISA};
8 BEGIN {
9 $VERSION = '0.67';
10 $ISCORE = 1;
11 @ISA = qw{Module::Install::Base};
12 }
13
14 my @scalar_keys = qw{
15 name module_name abstract author version license
16 distribution_type perl_version tests installdirs
17 };
18
19 my @tuple_keys = qw{
20 build_requires requires recommends bundles
21 };
22
23 sub Meta { shift }
24 sub Meta_ScalarKeys { @scalar_keys }
25 sub Meta_TupleKeys { @tuple_keys }
26
27 foreach my $key (@scalar_keys) {
28 *$key = sub {
29 my $self = shift;
30 return $self->{values}{$key} if defined wantarray and !@_;
31 $self->{values}{$key} = shift;
32 return $self;
33 };
34 }
35
36 foreach my $key (@tuple_keys) {
37 *$key = sub {
38 my $self = shift;
39 return $self->{values}{$key} unless @_;
40
41 my @rv;
42 while (@_) {
43 my $module = shift or last;
44 my $version = shift || 0;
45 if ( $module eq 'perl' ) {
46 $version =~ s{^(\d+)\.(\d+)\.(\d+)}
47 {$1 + $2/1_000 + $3/1_000_000}e;
48 $self->perl_version($version);
49 next;
50 }
51 my $rv = [ $module, $version ];
52 push @rv, $rv;
53 }
54 push @{ $self->{values}{$key} }, @rv;
55 @rv;
56 };
57 }
58
59 # configure_requires is currently a null-op
60 sub configure_requires { 1 }
61
62 # Aliases for build_requires that will have alternative
63 # meanings in some future version of META.yml.
64 sub test_requires { shift->build_requires(@_) }
65 sub install_requires { shift->build_requires(@_) }
66
67 # Aliases for installdirs options
68 sub install_as_core { $_[0]->installdirs('perl') }
69 sub install_as_cpan { $_[0]->installdirs('site') }
70 sub install_as_site { $_[0]->installdirs('site') }
71 sub install_as_vendor { $_[0]->installdirs('vendor') }
72
73 sub sign {
74 my $self = shift;
75 return $self->{'values'}{'sign'} if defined wantarray and ! @_;
76 $self->{'values'}{'sign'} = ( @_ ? $_[0] : 1 );
77 return $self;
78 }
79
80 sub dynamic_config {
81 my $self = shift;
82 unless ( @_ ) {
83 warn "You MUST provide an explicit true/false value to dynamic_config, skipping\n";
84 return $self;
85 }
86 $self->{'values'}{'dynamic_config'} = $_[0] ? 1 : 0;
87 return $self;
88 }
89
90 sub all_from {
91 my ( $self, $file ) = @_;
92
93 unless ( defined($file) ) {
94 my $name = $self->name
95 or die "all_from called with no args without setting name() first";
96 $file = join('/', 'lib', split(/-/, $name)) . '.pm';
97 $file =~ s{.*/}{} unless -e $file;
98 die "all_from: cannot find $file from $name" unless -e $file;
99 }
100
101 $self->version_from($file) unless $self->version;
102 $self->perl_version_from($file) unless $self->perl_version;
103
104 # The remaining probes read from POD sections; if the file
105 # has an accompanying .pod, use that instead
106 my $pod = $file;
107 if ( $pod =~ s/\.pm$/.pod/i and -e $pod ) {
108 $file = $pod;
109 }
110
111 $self->author_from($file) unless $self->author;
112 $self->license_from($file) unless $self->license;
113 $self->abstract_from($file) unless $self->abstract;
114 }
115
116 sub provides {
117 my $self = shift;
118 my $provides = ( $self->{values}{provides} ||= {} );
119 %$provides = (%$provides, @_) if @_;
120 return $provides;
121 }
122
123 sub auto_provides {
124 my $self = shift;
125 return $self unless $self->is_admin;
126
127 unless (-e 'MANIFEST') {
128 warn "Cannot deduce auto_provides without a MANIFEST, skipping\n";
129 return $self;
130 }
131
132 # Avoid spurious warnings as we are not checking manifest here.
133
134 local $SIG{__WARN__} = sub {1};
135 require ExtUtils::Manifest;
136 local *ExtUtils::Manifest::manicheck = sub { return };
137
138 require Module::Build;
139 my $build = Module::Build->new(
140 dist_name => $self->name,
141 dist_version => $self->version,
142 license => $self->license,
143 );
144 $self->provides(%{ $build->find_dist_packages || {} });
145 }
146
147 sub feature {
148 my $self = shift;
149 my $name = shift;
150 my $features = ( $self->{values}{features} ||= [] );
151
152 my $mods;
153
154 if ( @_ == 1 and ref( $_[0] ) ) {
155 # The user used ->feature like ->features by passing in the second
156 # argument as a reference. Accomodate for that.
157 $mods = $_[0];
158 } else {
159 $mods = \@_;
160 }
161
162 my $count = 0;
163 push @$features, (
164 $name => [
165 map {
166 ref($_) ? ( ref($_) eq 'HASH' ) ? %$_
167 : @$_
168 : $_
169 } @$mods
170 ]
171 );
172
173 return @$features;
174 }
175
176 sub features {
177 my $self = shift;
178 while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) {
179 $self->feature( $name, @$mods );
180 }
181 return $self->{values}->{features}
182 ? @{ $self->{values}->{features} }
183 : ();
184 }
185
186 sub no_index {
187 my $self = shift;
188 my $type = shift;
189 push @{ $self->{values}{no_index}{$type} }, @_ if $type;
190 return $self->{values}{no_index};
191 }
192
193 sub read {
194 my $self = shift;
195 $self->include_deps( 'YAML', 0 );
196
197 require YAML;
198 my $data = YAML::LoadFile('META.yml');
199
200 # Call methods explicitly in case user has already set some values.
201 while ( my ( $key, $value ) = each %$data ) {
202 next unless $self->can($key);
203 if ( ref $value eq 'HASH' ) {
204 while ( my ( $module, $version ) = each %$value ) {
205 $self->can($key)->($self, $module => $version );
206 }
207 }
208 else {
209 $self->can($key)->($self, $value);
210 }
211 }
212 return $self;
213 }
214
215 sub write {
216 my $self = shift;
217 return $self unless $self->is_admin;
218 $self->admin->write_meta;
219 return $self;
220 }
221
222 sub version_from {
223 my ( $self, $file ) = @_;
224 require ExtUtils::MM_Unix;
225 $self->version( ExtUtils::MM_Unix->parse_version($file) );
226 }
227
228 sub abstract_from {
229 my ( $self, $file ) = @_;
230 require ExtUtils::MM_Unix;
231 $self->abstract(
232 bless(
233 { DISTNAME => $self->name },
234 'ExtUtils::MM_Unix'
235 )->parse_abstract($file)
236 );
237 }
238
239 sub _slurp {
240 my ( $self, $file ) = @_;
241
242 local *FH;
243 open FH, "< $file" or die "Cannot open $file.pod: $!";
244 do { local $/; <FH> };
245 }
246
247 sub perl_version_from {
248 my ( $self, $file ) = @_;
249
250 if (
251 $self->_slurp($file) =~ m/
252 ^
253 use \s*
254 v?
255 ([\d_\.]+)
256 \s* ;
257 /ixms
258 )
259 {
260 my $v = $1;
261 $v =~ s{_}{}g;
262 $self->perl_version($1);
263 }
264 else {
265 warn "Cannot determine perl version info from $file\n";
266 return;
267 }
268 }
269
270 sub author_from {
271 my ( $self, $file ) = @_;
272 my $content = $self->_slurp($file);
273 if ($content =~ m/
274 =head \d \s+ (?:authors?)\b \s*
275 ([^\n]*)
276 |
277 =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s*
278 .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s*
279 ([^\n]*)
280 /ixms) {
281 my $author = $1 || $2;
282 $author =~ s{E<lt>}{<}g;
283 $author =~ s{E<gt>}{>}g;
284 $self->author($author);
285 }
286 else {
287 warn "Cannot determine author info from $file\n";
288 }
289 }
290
291 sub license_from {
292 my ( $self, $file ) = @_;
293
294 if (
295 $self->_slurp($file) =~ m/
296 (
297 =head \d \s+
298 (?:licen[cs]e|licensing|copyright|legal)\b
299 .*?
300 )
301 (=head\\d.*|=cut.*|)
302 \z
303 /ixms
304 )
305 {
306 my $license_text = $1;
307 my @phrases = (
308 'under the same (?:terms|license) as perl itself' => 'perl', 1,
309 'GNU public license' => 'gpl', 1,
310 'GNU lesser public license' => 'gpl', 1,
311 'BSD license' => 'bsd', 1,
312 'Artistic license' => 'artistic', 1,
313 'GPL' => 'gpl', 1,
314 'LGPL' => 'lgpl', 1,
315 'BSD' => 'bsd', 1,
316 'Artistic' => 'artistic', 1,
317 'MIT' => 'mit', 1,
318 'proprietary' => 'proprietary', 0,
319 );
320 while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) {
321 $pattern =~ s{\s+}{\\s+}g;
322 if ( $license_text =~ /\b$pattern\b/i ) {
323 if ( $osi and $license_text =~ /All rights reserved/i ) {
324 warn "LEGAL WARNING: 'All rights reserved' may invalidate Open Source licenses. Consider removing it.";
325 }
326 $self->license($license);
327 return 1;
328 }
329 }
330 }
331
332 warn "Cannot determine license info from $file\n";
333 return 'unknown';
334 }
335
336 1;

  ViewVC Help
Powered by ViewVC 1.1.26