NAME
Test::ModuleVersion - Module Version Test Generator (EXPERIMENTAL)
SYNOPSIS
use Test::ModuleVersion;
# Manually
my $tm = Test::ModuleVersion->new;
$tm->modules([
['DBIx::Custom' => '0.2108'],
['Validator::Custom' => '0.1426']
]);
print $tm->test_script;
# Automatically
my $tm = Test::ModuleVersion->new;
$tm->ignore([qw/Devel::NYTProf MySQL::Diff/]);
$tm->detect;
print $tm->test_script;
DESCRIPTION
It is very difficult to install same modules in development environment and production environment.
cpan is single versioning system, so you can't install specified version module well.
Installation is very hard work if therer many modules. Test::ModuleVersion help you.
Create version checking test in development environment.
At first, you create test script in development environment.
Test::ModuleVersion create version checking test manually or automatically
This is manually eamples.
my $tm = Test::ModuleVersion->new;
$tm->modules([
['DBIx::Custom' => '0.2108'],
['Validator::Custom' => '0.1426']
]);
print $tm->test_script;
You set modules attribute which is list of module name and version number. You can get module test script by test_script method.
run this script(name is mvt.pl) to create test.
$ perl mvt.pl > t/module.t
the following-like test is created.
require_ok('DBIx::Custom');
module_version_is('DBIx::Custom', ExtUtils::Installed->version('DBIx::Custom'), '0.2108');
require_ok('Validator::Custom');
module_version_is('Validator::Custom', ExtUtils::Installed->version('Validator::Custom'), '0.1426');
Or you can create module test automatically.
my $tm = Test::ModuleVersion->new;
$tm->ignore([qw/Devel::NYTProf MySQL::Diff/]);
$tm->detect;
print $tm->test_script;
ignore attribute is set to modules you want to ignore. detect method detect all installed module and modules attribute is set properly.
Run test in production environment.
Second, the test script is moved to production environment, and run the test.
perl t/module.t
If the version in production environment is different from development one, test will fail.
ok 1 - require DBIx::Custom;
not ok 2 - DBIx::Custom version: 0.2108
# Failed test 'DBIx::Custom version: 0.2108'
# at module.t.pl line 13.
# got: '0.2106'
# expected: '0.2108'
ok 2 - require Validator::Custom;
ok 3 - Validator::Custom version: 0.1426
It is very useful because you can know the module differnce.
Get module URLs
If test fail, you usually install the module manually, it is very hard work. you can get module URLs by list command.
$ perl module.t list
URLs of all module in test sciprt is printed.
http://cpan.metacpan.org/authors/id/K/KI/KIMOTO/DBIx-Custom-0.2108.tar.gz
...
Internally, metaCPAN api is used to get module URL. if you have proxy server, you can set $ENV{http_proxy}.
You can also get test failed module URL by --fail option.
$ perl module.t list --fail
Module installation using cpanm is very easy if cpanm is in current directory.
$ perl t/module.t list --fail | perl cpanm -L extlib
Modules is installed into extlib directory.
If LWP::UserAgent is available and version is 5.802+, test script use LWP::UserAgent for HTTP request. If LWP::UserAgent is not available, test script use HTTP::Tiny.
If you don't use LWP::UserAgent, use --no-lwp option.
$ perl module.t list --no-lwp
If you force LWP::UserAgetn, use --lwp option.
Have a fun to use Test::ModuleVersion.
ATTRIBUTES
before
my $code = $self->before;
$tm = $tm->before($code);
You can add some code before test script.
$tm->before(<<'EOS');
use 5.008007;
=pod
You can create this script(t/module.t) by the following command.
perl mvt.pl
=cut
EOS
distnames
my $distnames = $self->distnames;
$tm = $tm->distnames({
'LWP' => 'libwww-perl',
'IO::Compress::Base' => 'IO-Compress',
'Cwd' => 'PathTools',
'File::Spec' => 'PathTools',
'List::Util' => 'Scalar-List-Utils',
'Scalar::Util' => 'Scalar-List-Utils'
...
});
Module distribution name corresponding to module name. Some module is not same distribution name as module name, like LWP module.
LWP is module name, but distribution name is libwww-perl. If right distribution name is unknown, Test::ModuleVersion can't get module URL, so you must set distnames attribute when distribution name is not same as module name.
lib
my $lib = $self->lib;
$tm = $tm->lib('extlib/lib/perl5');
$tm = $tm->lib(['extlib/lib/perl5', ...]);
Module including pass from script directory. The following code is added to test script.
use lib "$FindBin::Bin/extlib/lib/perl5";
If the module is installed in this directory, module version test is success.
ignore
my $ignored_modules = $tm->ignore;
$tm = $tm->ignore([qw/Devel::NYTProf MySQL::Diff/]);
ignored modules you don't want to contain in test script.
default_ignore
my $ignored_modules = $tm->ignore;
$tm = $tm->ignore(['Perl', 'Test::ModuleVersion']);
Default ignored modules you don't want to contain in test script, default to ['Perl'].
Don't use exculde_default attribute usually. use ignore attribute instead.
modules
my $modules = $tm->modules;
$tm = $tm->modules($modules);
List of Module name and version.
$tm->modules([
['DBIx::Custom' => '0.2108'],
['Validator::Custom' => '0.1426']
]);
Version number must be string like '0.1426', not 0.1426.
If detect method is executed, modules attribute is set automatically.
privates
my $privates = $tm->privates;
$tm = $tm->privates({
'Some::Module' => 'http://localhost/~kimoto/%M.tar.gz'
});
Private repogitory URL. If you use privates attribute, you don't need upload module to CPAN. You upload module to some place you can access by http protocal.
%M is replaces module name and version number, like Some-Module-0.01. You also use this attribute with distnames attribute.
METHODS
detect
$tm->detect;
Detect all installed module and modules attribute is set.
get_module_url
my $url = $tm->get_module_url($module, $version);
my $url = $tm->get_module_url($module, $version, $option);
Get module URL by module name and version number.
# http://cpan.metacpan.org/authors/id/K/KI/KIMOTO/DBIx-Custom-0.2108.tar.gz
my $url = $tm->get_module_url('DBIx::Custom', '0.2108');
You must specify version number as string, not number. for example, 0.2110 is wrong, '0.2110' is right.
Option
You can set options
$tm->get_module_url($module, $version, {distnames => ..., ... => ...});
* distnames
distnames => {LWP => 'wwwlib-perl}
* privates
privates => {'Some::Module' => 'http://localhost/~kimoto/%M.tar.gz'}
* error
error => \$error
You can get error message.
* lwp
lwp => 'use'
lwp => 'no'
lwp => 'auto'
use LWP::UserAgent or not or automatically use
test_script
print $tm->test_script;
Test script which contains module version tests. modules attirubtes is used to create test script.
AUTHOR
Yuki Kimoto, <kimoto.yuki at gmail.com>
LICENSE AND COPYRIGHT
Copyright 2012 Yuki Kimoto.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 3074:
You can't have =items (as at line 3082) unless the first thing after the =over is an =item