Как мы можем определить все модули, принадлежащие к данному дистрибутиву - PullRequest
3 голосов
/ 14 марта 2012

Как мы можем определить все модули, принадлежащие данному дистрибутиву.

например, дистрибутив XML :: LibXML предоставляет набор следующих модулей https://metacpan.org/release/XML-LibXML

Как мы можем получить этот списоклибо через cpan / ppm, либо через любой стандарт для пакетов.

На самом деле мы пишем инфраструктуру модульного теста для нашего кода, написанного на Perl.Чтобы проверить модуль, нам нужен способ найти имя дистрибутива для данного имени модуля.

1 Ответ

6 голосов
/ 14 марта 2012

MetaCPAN API обеспечивает решение этой проблемы с помощью веб-службы JSON (http://api.metacpan.org).

Легко попробовать разные запросы, используя curl в командной строке или через веб-форму на http://explorer.metacpan.org/

Если вы знаете название нужного вам релиза, Вы можете сделать запрос, подобный этому, чтобы получить список имен модулей:

/module/_search
{
  "query" : { "match_all" : {} },
  "size" : 1000,
  "fields" : [ "module.name" ],
  "filter" : {
    "and": [
      { "term" : { "module.authorized" : true } },
      { "term" : { "module.indexed" : true } },
      { "term" : { "release" : "XML-LibXML-1.95" } },
      { "term" : { "status" : "latest" } }
    ]
  }
}

Вы также можете заменить "release": "XML-LibXML-1.95" на "distribution": "XML-LibXML".

Если вы начинаете с имени модуля и вам необходимо сначала определить имя выпуска, попробуйте следующее:

/module/_search
{
  "query" : { "match_all" : {} },
  "size" : 1000,
  "fields" : [ "release", "distribution" ],
  "filter" : {
    "and": [
      { "term" : { "module.name" : "XML::LibXML" } },
      { "term" : { "status" : "latest" } }
    ]
  }
}

Синтаксис этого запроса - ElasticSearch DSL, поскольку API использует ElasticSearch для индексации данных.

Для выполнения запроса из Perl существует MetaCPAN :: API модуль, хотя я не использовал его сам.

Поскольку это всего лишь веб-запрос, вы можете использовать LWP или любой другой HTTP-модуль.

Возможно, вы захотите проверить ElasticSearch и ElasticSearch :: SearchBuilder модули, обеспечивающие более полный Perl-интерфейс для запросов к базе данных ElasticSearch.

Вот полный пример использования Perl с использованием LWP:

use JSON qw( encode_json decode_json );
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->post("http://api.metacpan.org/module/_search",
  Content => encode_json({
    query  => { match_all => {} },
    size   => 1000,
    # limit reponse text to just the module names since that's all we want
    fields => ['module.name'],
    filter => {
      and  => [
        { term => { "module.authorized" => 1 } },
        { term => { "module.indexed"    => 1 } },
        { term => { "distribution" => "XML-LibXML" } },
        { term => { "status" => "latest" } }
      ]
    }
  })
);
my @modules =
  # this can be an array (ref) of module names for multiple packages in one file
  map { ref $_ ? @$_ : $_ }
  # the pieces we want
  map { $_->{fields}{'module.name'} }
  # search results
  @{ decode_json($res->decoded_content)->{hits}{hits} };
print join "\n", sort @modules;

Для получения дополнительной помощи посетите #metacpan на irc.perl.org, или посмотрите вики на https://github.com/CPAN-API/cpan-api/wiki.

Если вы немного больше объясните, что вы делаете и / или пытаетесь достичь, вы можете найти другие способы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...