平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

Perl6 で特定のモジュールがどのリポジトリから提供されているか調べる

そうです Perl6 です。

Perl6 のモジュールは githubperl6/ecosystem というリポジトリで管理されており、新しいモジュールを登録するには、そのモジュールのメタ情報の URL を perl6/ecosystem にコミットするとよい、ということになっている。
この辺に列挙されている様子が見える。すごい。

ecosystem/META.list at master · perl6/ecosystem · GitHub

Perl6 を書いていると、「このモジュールはどこから提供されているものだろう」と調べたくなることがあるのだけど、そういう時はこのデータを元に生成されている json を取ってきて jq でごちゃごちゃやると得られるようだった。
たとえばMonitor::Monitを提供してるリポジトリが知りたいときはこういう感じで投げると調べられる。実際は curl した結果はどこかに保存しておくとよさそう。というか Perl6 が内部で持ってたりするのかな。。。

$ curl -s http://ecosystem-api.p6c.org/projects.json | jq '.[] | select( .provides | has("Monitor::Monit"))'
{
  "resources": [],
  "support": {
    "source": "git://github.com/jonathanstowe/Monitor-Monit.git"
  },
  "tags": [
    "monitor",
    "api",
    "system"
  ],
  "version": "0.0.1",
  "test-depends": [
    "Test",
    "CheckSocket"
  ],
  "auth": "github:jonathanstowe",
  "license": "perl",
  "perl": "6.c",
  "meta6": "0",
  "name": "Monitor::Monit",
  "build-depends": [],
  "authors": [
    "Jonathan Stowe <jns+gh@gellyfish.co.uk>"
  ],
  "description": "Provide an interface to the monit monitoring daemon",
  "depends": [
    "HTTP::UserAgent",
    "URI::Template",
    "XML::Class"
  ],
  "source-url": "git://github.com/jonathanstowe/Monitor-Monit.git",
  "provides": {
    "Monitor::Monit": "lib/Monitor/Monit.pm"
  }
}

今回探していたのは HTTP::Response なのだけど、探したところ2つのリポジトリから違う物が提供されていることが分かってニッコリ。実際は片方は Role で片方が実装ということのようなのだけど(よくわかってない)、何か難しい世界に来たような気がしますね。

$ curl -s http://ecosystem-api.p6c.org/projects.json | jq '.[] | select( .provides | has("HTTP::Response"))'
{
  "version": "1.1.23",
  "perl": "6.c",
  "description": "Web user agent",
  "author": "github:sergot",
  "name": "HTTP::UserAgent",
  "test-depends": [
    "IO::Capture::Simple"
  ],
  "depends": [
    "HTTP::Status",
    "File::Temp",
    "DateTime::Parse",
    "Encode",
    "MIME::Base64",
    "URI"
  ],
  "source-url": "git://github.com/sergot/http-useragent.git",
  "provides": {
    "HTTP::MediaType": "lib/HTTP/MediaType.pm6",
    "HTTP::UserAgent": "lib/HTTP/UserAgent.pm6",
    "HTTP::Cookie": "lib/HTTP/Cookie.pm6",
    "HTTP::Header::Field": "lib/HTTP/Header/Field.pm6",
    "HTTP::Cookies": "lib/HTTP/Cookies.pm6",
    "HTTP::Request::Common": "lib/HTTP/Request/Common.pm6",
    "HTTP::Request": "lib/HTTP/Request.pm6",
    "HTTP::Response": "lib/HTTP/Response.pm6",
    "HTTP::Message": "lib/HTTP/Message.pm6",
    "HTTP::UserAgent::Common": "lib/HTTP/UserAgent/Common.pm6",
    "HTTP::Header": "lib/HTTP/Header.pm6"
  }
}
{
  "version": "0.1",
  "description": "role for HTTP::Server so we can have start building out some servers with interchangeable backends",
  "perl": "6.*",
  "source-url": "git://github.com/tony-o/perl6-http-server.git",
  "depends": [],
  "provides": {
    "HTTP::Response": "lib/HTTP/Response.pm6",
    "HTTP::Request": "lib/HTTP/Request.pm6",
    "HTTP::Server": "lib/HTTP/Server.pm6"
  },
  "author": "github:tony-o",
  "name": "HTTP::Server"
}

こちらからは以上です。頑張っていきましょう。

追記

こういうようにすると、特定のモジュールに依存しているパッケージを探すことも出来る。

$ curl -s http://ecosystem-api.p6c.org/projects.json | jq '.[] | select( .depends | .[]? == "HTTP::UserAgent" )'