-
Notifications
You must be signed in to change notification settings - Fork 196
/
write_config_json
92 lines (82 loc) · 2.13 KB
/
write_config_json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/perl
# PODNAME: write_config_json
#
# takes the root directory of an extracted distribution and outputs a JSON file
# suitable for CPAN::Faker to STDOUT
use strictures 1;
use JSON;
use YAML;
use IO::All;
use Email::Address;
use File::Find;
use File::Spec;
use Path::Class;
my ($dir) = @ARGV;
my $meta_data;
if(-e "$dir/META.yml") {
$meta_data = YAML::LoadFile("$dir/META.yml");
} elsif(-e "$dir/META.json") {
$meta_data = JSON::decode_json(io("$dir/META.json")->all);
} else {
die "no meta file";
}
my $authors = $meta_data->{author};
my @authors = map { my ($addr) = Email::Address->parse($_); $addr->name } @$authors;
my $files;
File::Find::find(
{
no_chdir => 1,
wanted => sub {
return unless -f;
push @$files, {
file => File::Spec->abs2rel($File::Find::name, dir($dir)),
content => io($_)->all,
}
},
},
$dir
);
my $output = {
name => $meta_data->{name},
version => $meta_data->{version},
abstract => $meta_data->{abstract},
X_Module_Faker => {
cpan_author => [ @authors ],
append => [
$files
]
},
};
print JSON->new->pretty->encode($output);
__DATA__
{
"name": "MetaFile-Both",
"abstract": "A dist with META.yml and META.json",
"version": 1.1,
"X_Module_Faker": {
"cpan_author": "LOCAL",
"append": [ {
"file": "lib/MetaFile/Both.pm",
"content": "package MetaFile::Both;\n\n=head1 NAME\n\nMetaFile::Both - abstract"
},
{
"file": "META.json",
"content": "{\"meta-spec\":{\"version\":2,\"url\":\"http://search.cpan.org/perldoc?CPAN::Meta::Spec\"},\"generated_by\":\"hand\",\"version\":1.1,\"name\":\"MetaFile-Both\",\"dynamic_config\":0,\"author\":\"LOCAL\",\"license\":\"unknown\",\"abstract\":\"A dist with META.yml and META.json\",\"release_status\":\"stable\",\"x_meta_file\":\"json\"}"
},
{
"file": "t/foo.t",
"content": "use Test::More;"
} ]
}
}
---
name: SignedModule
version: 1.1
abstract: A signed dist
author:
- LOCAL <LOCAL@cpan.local>
generated_by: Module::Faker version
license: unknown
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.3.html
version: 1.3