Not using that any more…

This is a very old article. It has been imported from older blogging software, and the formatting, images, etc may have been lost. Some links may be broken. Some of the information may no longer be correct. Opinions expressed in this article may no longer be held.

OK,
so sometimes you decide you’re going to stop using some module X,
maybe because something better has come along.
Let’s say I want to track down all my CPAN modules that use Any::Moose because my goal is to port each of them to either Moose or Moo.

MetaCPAN has all the dependency information,
but I don’t want to click through each of my distributions.
Enter the MetaCPAN API…

 1:    #!/usr/bin/env perl
 2:    
 3:    use v5.10;
 4:    use strict;
 5:    use warnings;
 6:    
 7:    use HTTP::Tiny;
 8:    use JSON;
 9:    
10:    my @fields = qw< distribution version date >;
11:    
12:    my ($module, $author) = @ARGV;
13:    $module or die "usage: $0 MODULE [AUTHOR]\n";
14:    
15:    my $query = {
16:       size   => 5000,
17:       fields => \@fields,
18:       query  => { match_all => {} },
19:       filter => {
20:          and => [
21:             { term => { "release.dependency.module" => $module } },
22:             { term => { "release.status" => "latest"} },
23:          ]
24:       }
25:    };
26:    
27:    push @{$query->{filter}{and}}, { term => { "release.author" => $author } }
28:       if $author;
29:    
30:    my $response = "HTTP::Tiny"->new->post(
31:       "http://api.metacpan.org/v0/release/_search" => {
32:          content => to_json($query),
33:          headers => {
34:             "Content-Type" => "application/json",
35:          },
36:       },
37:    );
38:    
39:    my $result = from_json($response->{content});
40:    
41:    for my $dist (@{ $result->{hits}{hits} }) {
42:       printf("%s\t%s\t%s\n", map $dist->{fields}{$_}, @fields);
43:    }