Writing a Dist::Zilla test plugin
Published: 2022-12-05 12:39:24

---
title: Writing a Dist::Zilla test plugin
published: true
date: 2022-11-02 00:00:00 UTC
tags: 
canonical_url: http://perl.kiwi/tales/2022/11/02/writing-a-dist-zilla-test-plugin/
---

Recently I wrote a small Dist::Zilla plugin to help with the problem of dependencies being old in modules I author.

I use [update-cpanfile](https://metacpan.org/pod/update-cpanfile) to check dependencies in projects I write using a cpanfile (and carton); I wanted a tool to do the same thing with libraries I write.

It was pretty simple to do over a couple of evenings; and worked really well; a trial version is on Cpan now at [Dist::Zilla::Plugin::Test::Prereqs::Latest](https://metacpan.org/release/LANCEW/Dist-Zilla-Plugin-Test-Prereqs-Latest-0.001-TRIAL).

Using it is really simple you just add `[Test::Prereqs::Latest]` in your dist.ini and then when you run `dzil test` it will add and run a test file (`xt/author/prereqs-latest.t`) which checks the version of each module in the `[Prereqs]` secion of the dist.ini and fail if the version you have specified is lower than the latest CPAN.

The code is pretty simple, using existing work by [HITODE](https://metacpan.org/author/HITODE) whose [update-cpanfile](https://metacpan.org/dist/App-UpdateCPANfile/view/script/update-cpanfile) I use regularly to help keep dependencies up to date in projects I have that use cpanfile and carton.

```

use strict;
use warnings;

use App::UpdateCPANfile::PackageDetails;
use Dist::Zilla::Util::ParsePrereqsFromDistIni qw(parse_prereqs_from_dist_ini);
use Test::More;

my $prereqs = parse_prereqs_from_dist_ini(path => 'dist.ini');
my $checker = App::UpdateCPANfile::PackageDetails->new;

for my $key (sort keys %$prereqs) {
    for my $req (sort keys %{$prereqs->{$key}->{requires}}) {
        my $current_version = $prereqs->{$key}->{requires}->{$req};
        $current_version =~ s/v//g;
        my $latest_version = $checker->latest_version_for_package($req) || '0';
        my $out_of_date = ($latest_version <= $current_version);

        ok( $out_of_date,"$req: Current:$current_version, Latest:$latest_version");
    }
}

```

It's simplistic, but works well. If the version in the dist.ini is lower than the version on CPAN it fails the test and tells you as much.

Once written, I was easily able to test it against a couple of modules I maintain by installing the package with `dzil install` then in the other module I add `[Test::Prereqs::Latest]` to the dist.ini and ran `dzil test` and it worked.

Once I had done basic testing locally; was able to create a trial release and upload to CPAN with `dizil release --trial` which built and uploaded the distribution.

Of course CPAN is amazing, so shortly afterwards the cpan testers started discovering the module and testing that it built on a variety of versions of Perl and a variety of platforms. People love GitHub actions but cpan testeers was first and I did literally nothing to get all this amazing testing without any configuration work, nothing... it just happens. It's amazing, seriously amazing.

The module is not ready for a proper release, but it's been nice to "scratch my own itch" so to speak.

Tags: [perl](http://perl.kiwi/tales/tag/perl/)[cpam](http://perl.kiwi/tales/tag/cpam/)[distzilla](http://perl.kiwi/tales/tag/distzilla/)