@@ -1,3 +1,8 @@
+0.24 2014-08-28
+ - A string with a null byte (\0) would be considered valid if the internal
+ implementation used inet_pton() to validate IP addresses. Fixed by Greg
+ Oschwald. GitHub PR #4.
+
0.23 Sun Mar 09 2014
- Fixed is_ipv6 to correctly fail for a string like ":abcd" on platforms
where inet_pton() isn't usable. Reported by Brian Bickerton. RT #93622.
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.013.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.020.
Changes
INSTALL
LICENSE
@@ -6,20 +6,27 @@ MANIFEST
META.json
META.yml
Makefile.PL
-README
+README.md
bench/foo
bench/socket-vs-perl
dist.ini
lib/Data/Validate/IP.pm
perltidyrc
+t/00-compile.t
+t/00-report-prereqs.dd
+t/00-report-prereqs.t
t/Data-Validate-IP-slow.t
t/Data-Validate-IP.t
t/Untaint.t
+t/author-no-tabs.t
+t/author-pod-spell.t
t/lib/Test/Data/Validate/IP.pm
t/release-cpan-changes.t
t/release-eol.t
-t/release-no-tabs.t
+t/release-pod-coverage.t
t/release-pod-linkcheck.t
t/release-pod-no404s.t
t/release-pod-spell.t
t/release-pod-syntax.t
+t/release-portability.t
+t/release-synopsis.t
@@ -5,7 +5,7 @@
"Dave Rolsky <autarch@urth.org>"
],
"dynamic_config" : 0,
- "generated_by" : "Dist::Zilla version 5.013, CPAN::Meta::Converter version 2.131560",
+ "generated_by" : "Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060",
"license" : [
"perl_5"
],
@@ -17,15 +17,19 @@
"prereqs" : {
"configure" : {
"requires" : {
- "ExtUtils::MakeMaker" : "6.30"
+ "ExtUtils::MakeMaker" : "0"
}
},
"develop" : {
"requires" : {
+ "Pod::Coverage::TrustPod" : "0",
"Test::CPAN::Changes" : "0.19",
- "Test::More" : "0",
+ "Test::More" : "0.88",
"Test::NoTabs" : "0",
- "Test::Pod" : "1.41"
+ "Test::Pod" : "1.41",
+ "Test::Pod::Coverage" : "1.08",
+ "Test::Spelling" : "0.12",
+ "Test::Synopsis" : "0"
}
},
"runtime" : {
@@ -39,26 +43,585 @@
}
},
"test" : {
+ "recommends" : {
+ "CPAN::Meta" : "2.120900"
+ },
"requires" : {
+ "ExtUtils::MakeMaker" : "0",
+ "File::Spec" : "0",
+ "IO::Handle" : "0",
+ "IPC::Open3" : "0",
"Test::More" : "0.88",
"Test::Requires" : "0",
"lib" : "0"
}
}
},
+ "provides" : {
+ "Data::Validate::IP" : {
+ "file" : "lib/Data/Validate/IP.pm",
+ "version" : "0.24"
+ }
+ },
"release_status" : "stable",
"resources" : {
"bugtracker" : {
"mailto" : "bug-data-validate-ip@rt.cpan.org",
- "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Data-Validate-IP"
+ "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=Data-Validate-IP"
},
+ "homepage" : "http://metacpan.org/release/Data-Validate-IP",
"repository" : {
"type" : "git",
- "url" : "https://github.com/neilneely/Data-Validate-IP.git",
- "web" : "https://github.com/neilneely/Data-Validate-IP.git"
+ "url" : "git://github.com/neilneely/Data-Validate-IP.git",
+ "web" : "https://github.com/neilneely/Data-Validate-IP"
+ }
+ },
+ "version" : "0.24",
+ "x_Dist_Zilla" : {
+ "perl" : {
+ "version" : "5.016003"
+ },
+ "plugins" : [
+ {
+ "class" : "Dist::Zilla::Plugin::MakeMaker",
+ "config" : {
+ "Dist::Zilla::Role::TestRunner" : {
+ "default_jobs" : 1
+ }
+ },
+ "name" : "@DROLSKY/MakeMaker",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Authority",
+ "name" : "@DROLSKY/Authority",
+ "version" : "1.006"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::AutoPrereqs",
+ "name" : "@DROLSKY/AutoPrereqs",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::GatherDir",
+ "name" : "@DROLSKY/GatherDir",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::GitHub::Meta",
+ "name" : "@DROLSKY/GitHub::Meta",
+ "version" : "0.38"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::GitHub::Update",
+ "name" : "@DROLSKY/GitHub::Update",
+ "version" : "0.38"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::MetaResources",
+ "name" : "@DROLSKY/MetaResources",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::MetaProvides::Package",
+ "config" : {
+ "Dist::Zilla::Plugin::MetaProvides::Package" : {
+ "finder_objects" : [
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : "@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM",
+ "version" : "5.020"
+ }
+ ]
+ },
+ "Dist::Zilla::Role::MetaProvider::Provider" : {
+ "inherit_missing" : "1",
+ "inherit_version" : "1",
+ "meta_noindex" : "1"
+ }
+ },
+ "name" : "@DROLSKY/MetaProvides::Package",
+ "version" : "2.001000"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::NextRelease",
+ "name" : "@DROLSKY/NextRelease",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable",
+ "name" : "@DROLSKY/Test::Pod::Coverage::Configurable",
+ "version" : "0.01"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::PodSpelling",
+ "name" : "@DROLSKY/Test::PodSpelling",
+ "version" : "2.006008"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs",
+ "name" : "@DROLSKY/Test::ReportPrereqs",
+ "version" : "0.019"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Prereqs",
+ "config" : {
+ "Dist::Zilla::Plugin::Prereqs" : {
+ "phase" : "test",
+ "type" : "requires"
+ }
+ },
+ "name" : "@DROLSKY/TestMoreDoneTesting",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::PromptIfStale",
+ "config" : {
+ "Dist::Zilla::Plugin::PromptIfStale" : {
+ "check_all_plugins" : "1",
+ "check_all_prereqs" : "1",
+ "modules" : [],
+ "phase" : "release",
+ "skip" : []
+ }
+ },
+ "name" : "@DROLSKY/stale modules, release",
+ "version" : "0.024"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod",
+ "name" : "@DROLSKY/ReadmeMarkdownInBuild",
+ "version" : "0.142250"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod",
+ "name" : "@DROLSKY/ReadmeMarkdownInRoot",
+ "version" : "0.142250"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::PruneCruft",
+ "name" : "@DROLSKY/PruneCruft",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ManifestSkip",
+ "name" : "@DROLSKY/ManifestSkip",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::MetaYAML",
+ "name" : "@DROLSKY/MetaYAML",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::License",
+ "name" : "@DROLSKY/License",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ExtraTests",
+ "name" : "@DROLSKY/ExtraTests",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ExecDir",
+ "name" : "@DROLSKY/ExecDir",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ShareDir",
+ "name" : "@DROLSKY/ShareDir",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Manifest",
+ "name" : "@DROLSKY/Manifest",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::TestRelease",
+ "name" : "@DROLSKY/TestRelease",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ConfirmRelease",
+ "name" : "@DROLSKY/ConfirmRelease",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::UploadToCPAN",
+ "name" : "@DROLSKY/UploadToCPAN",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed",
+ "name" : "@DROLSKY/CheckPrereqsIndexed",
+ "version" : "0.012"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::ContributorsFromGit",
+ "name" : "@DROLSKY/ContributorsFromGit",
+ "version" : "0.014"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::CopyReadmeFromBuild",
+ "name" : "@DROLSKY/CopyReadmeFromBuild",
+ "version" : "0.0019"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch",
+ "config" : {
+ "Dist::Zilla::Role::Git::Repo" : {
+ "repo_root" : "."
+ }
+ },
+ "name" : "@DROLSKY/Git::CheckFor::CorrectBranch",
+ "version" : "0.011"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts",
+ "config" : {
+ "Dist::Zilla::Role::Git::Repo" : {
+ "repo_root" : "."
+ }
+ },
+ "name" : "@DROLSKY/Git::CheckFor::MergeConflicts",
+ "version" : "0.011"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Git::Describe",
+ "name" : "@DROLSKY/Git::Describe",
+ "version" : "0.003"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::InstallGuide",
+ "name" : "@DROLSKY/InstallGuide",
+ "version" : "1.200003"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Meta::Contributors",
+ "name" : "@DROLSKY/Meta::Contributors",
+ "version" : "0.001"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::MetaConfig",
+ "name" : "@DROLSKY/MetaConfig",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::MetaJSON",
+ "name" : "@DROLSKY/MetaJSON",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::PkgVersion",
+ "name" : "@DROLSKY/PkgVersion",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::SurgicalPodWeaver",
+ "config" : {
+ "Dist::Zilla::Plugin::PodWeaver" : {
+ "finder" : [
+ ":InstallModules",
+ ":ExecFiles"
+ ],
+ "plugins" : [
+ {
+ "class" : "Pod::Weaver::Plugin::EnsurePod5",
+ "name" : "@CorePrep/EnsurePod5",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Plugin::H1Nester",
+ "name" : "@CorePrep/H1Nester",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Plugin::SingleEncoding",
+ "name" : "@Default/SingleEncoding",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Name",
+ "name" : "@Default/Name",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Version",
+ "name" : "@Default/Version",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Region",
+ "name" : "@Default/prelude",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Generic",
+ "name" : "SYNOPSIS",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Generic",
+ "name" : "DESCRIPTION",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Generic",
+ "name" : "OVERVIEW",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Collect",
+ "name" : "ATTRIBUTES",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Collect",
+ "name" : "METHODS",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Collect",
+ "name" : "FUNCTIONS",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Leftovers",
+ "name" : "@Default/Leftovers",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Region",
+ "name" : "@Default/postlude",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Authors",
+ "name" : "@Default/Authors",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Legal",
+ "name" : "@Default/Legal",
+ "version" : "4.006"
+ }
+ ]
+ }
+ },
+ "name" : "@DROLSKY/SurgicalPodWeaver",
+ "version" : "0.0021"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::EOLTests",
+ "name" : "@DROLSKY/EOLTests",
+ "version" : "0.02"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::PodSyntaxTests",
+ "name" : "@DROLSKY/PodSyntaxTests",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes",
+ "name" : "@DROLSKY/Test::CPAN::Changes",
+ "version" : "0.008"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::Compile",
+ "config" : {
+ "Dist::Zilla::Plugin::Test::Compile" : {
+ "bail_out_on_fail" : "0",
+ "fail_on_warning" : "author",
+ "fake_home" : "0",
+ "filename" : "t/00-compile.t",
+ "module_finder" : [
+ ":InstallModules"
+ ],
+ "needs_display" : "0",
+ "phase" : "test",
+ "script_finder" : [
+ ":ExecFiles"
+ ],
+ "skips" : []
+ }
+ },
+ "name" : "@DROLSKY/Test::Compile",
+ "version" : "2.046"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::NoTabs",
+ "config" : {
+ "Dist::Zilla::Plugin::Test::NoTabs" : {
+ "filename" : "xt/author/no-tabs.t",
+ "finder" : [
+ ":InstallModules",
+ ":ExecFiles",
+ ":TestFiles"
+ ]
+ }
+ },
+ "name" : "@DROLSKY/Test::NoTabs",
+ "version" : "0.09"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::Pod::LinkCheck",
+ "name" : "@DROLSKY/Test::Pod::LinkCheck",
+ "version" : "1.001"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::Pod::No404s",
+ "name" : "@DROLSKY/Test::Pod::No404s",
+ "version" : "1.001"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::Portability",
+ "name" : "@DROLSKY/Test::Portability",
+ "version" : "2.000005"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Test::Synopsis",
+ "name" : "@DROLSKY/Test::Synopsis",
+ "version" : "2.000005"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Git::Check",
+ "config" : {
+ "Dist::Zilla::Plugin::Git::Check" : {
+ "untracked_files" : "die"
+ },
+ "Dist::Zilla::Role::Git::DirtyFiles" : {
+ "allow_dirty" : [
+ "Changes",
+ "CONTRIBUTING.md",
+ "README.md"
+ ],
+ "allow_dirty_match" : [],
+ "changelog" : "Changes"
+ },
+ "Dist::Zilla::Role::Git::Repo" : {
+ "repo_root" : "."
+ }
+ },
+ "name" : "@DROLSKY/Git::Check",
+ "version" : "2.023"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Git::Commit",
+ "config" : {
+ "Dist::Zilla::Plugin::Git::Commit" : {
+ "add_files_in" : [],
+ "commit_msg" : "v%v%n%n%c",
+ "time_zone" : "local"
+ },
+ "Dist::Zilla::Role::Git::DirtyFiles" : {
+ "allow_dirty" : [
+ "Changes",
+ "CONTRIBUTING.md",
+ "README.md"
+ ],
+ "allow_dirty_match" : [],
+ "changelog" : "Changes"
+ },
+ "Dist::Zilla::Role::Git::Repo" : {
+ "repo_root" : "."
+ }
+ },
+ "name" : "@DROLSKY/Git::Commit",
+ "version" : "2.023"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Git::Tag",
+ "config" : {
+ "Dist::Zilla::Plugin::Git::Tag" : {
+ "branch" : null,
+ "signed" : 0,
+ "tag" : "v0.24",
+ "tag_format" : "v%v",
+ "tag_message" : "v%v",
+ "time_zone" : "local"
+ },
+ "Dist::Zilla::Role::Git::Repo" : {
+ "repo_root" : "."
+ }
+ },
+ "name" : "@DROLSKY/Git::Tag",
+ "version" : "2.023"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::Git::Push",
+ "config" : {
+ "Dist::Zilla::Plugin::Git::Push" : {
+ "push_to" : [
+ "origin"
+ ],
+ "remotes_must_exist" : 1
+ },
+ "Dist::Zilla::Role::Git::Repo" : {
+ "repo_root" : "."
+ }
+ },
+ "name" : "@DROLSKY/Git::Push",
+ "version" : "2.023"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":InstallModules",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":IncModules",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":TestFiles",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":ExecFiles",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":ShareFiles",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":MainModule",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":AllFiles",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":NoFiles",
+ "version" : "5.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : "@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM",
+ "version" : "5.020"
+ }
+ ],
+ "zilla" : {
+ "class" : "Dist::Zilla::Dist::Builder",
+ "config" : {
+ "is_trial" : "0"
+ },
+ "version" : "5.020"
}
},
- "version" : "0.23",
- "x_authority" : "cpan:NEELY"
+ "x_authority" : "cpan:NEELY",
+ "x_contributors" : [
+ "Gregory Oschwald <goschwald@maxmind.com>"
+ ]
}
@@ -4,27 +4,455 @@ author:
- 'Neil Neely <neil@neely.cx>'
- 'Dave Rolsky <autarch@urth.org>'
build_requires:
- Test::More: 0.88
- Test::Requires: 0
- lib: 0
+ ExtUtils::MakeMaker: '0'
+ File::Spec: '0'
+ IO::Handle: '0'
+ IPC::Open3: '0'
+ Test::More: '0.88'
+ Test::Requires: '0'
+ lib: '0'
configure_requires:
- ExtUtils::MakeMaker: 6.30
+ ExtUtils::MakeMaker: '0'
dynamic_config: 0
-generated_by: 'Dist::Zilla version 5.013, CPAN::Meta::Converter version 2.131560'
+generated_by: 'Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
- version: 1.4
+ version: '1.4'
name: Data-Validate-IP
+provides:
+ Data::Validate::IP:
+ file: lib/Data/Validate/IP.pm
+ version: '0.24'
requires:
- Exporter: 0
- NetAddr::IP: 4
- Scalar::Util: 0
- perl: 5.008
- strict: 0
- warnings: 0
+ Exporter: '0'
+ NetAddr::IP: '4'
+ Scalar::Util: '0'
+ perl: '5.008'
+ strict: '0'
+ warnings: '0'
resources:
- bugtracker: http://rt.cpan.org/NoAuth/Bugs.html?Dist=Data-Validate-IP
- repository: https://github.com/neilneely/Data-Validate-IP.git
-version: 0.23
+ bugtracker: http://rt.cpan.org/Public/Dist/Display.html?Name=Data-Validate-IP
+ homepage: http://metacpan.org/release/Data-Validate-IP
+ repository: git://github.com/neilneely/Data-Validate-IP.git
+version: '0.24'
+x_Dist_Zilla:
+ perl:
+ version: '5.016003'
+ plugins:
+ -
+ class: Dist::Zilla::Plugin::MakeMaker
+ config:
+ Dist::Zilla::Role::TestRunner:
+ default_jobs: 1
+ name: '@DROLSKY/MakeMaker'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::Authority
+ name: '@DROLSKY/Authority'
+ version: '1.006'
+ -
+ class: Dist::Zilla::Plugin::AutoPrereqs
+ name: '@DROLSKY/AutoPrereqs'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::GatherDir
+ name: '@DROLSKY/GatherDir'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::GitHub::Meta
+ name: '@DROLSKY/GitHub::Meta'
+ version: '0.38'
+ -
+ class: Dist::Zilla::Plugin::GitHub::Update
+ name: '@DROLSKY/GitHub::Update'
+ version: '0.38'
+ -
+ class: Dist::Zilla::Plugin::MetaResources
+ name: '@DROLSKY/MetaResources'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::MetaProvides::Package
+ config:
+ Dist::Zilla::Plugin::MetaProvides::Package:
+ finder_objects:
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: '@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM'
+ version: '5.020'
+ Dist::Zilla::Role::MetaProvider::Provider:
+ inherit_missing: '1'
+ inherit_version: '1'
+ meta_noindex: '1'
+ name: '@DROLSKY/MetaProvides::Package'
+ version: '2.001000'
+ -
+ class: Dist::Zilla::Plugin::NextRelease
+ name: '@DROLSKY/NextRelease'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable
+ name: '@DROLSKY/Test::Pod::Coverage::Configurable'
+ version: '0.01'
+ -
+ class: Dist::Zilla::Plugin::Test::PodSpelling
+ name: '@DROLSKY/Test::PodSpelling'
+ version: '2.006008'
+ -
+ class: Dist::Zilla::Plugin::Test::ReportPrereqs
+ name: '@DROLSKY/Test::ReportPrereqs'
+ version: '0.019'
+ -
+ class: Dist::Zilla::Plugin::Prereqs
+ config:
+ Dist::Zilla::Plugin::Prereqs:
+ phase: test
+ type: requires
+ name: '@DROLSKY/TestMoreDoneTesting'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::PromptIfStale
+ config:
+ Dist::Zilla::Plugin::PromptIfStale:
+ check_all_plugins: '1'
+ check_all_prereqs: '1'
+ modules: []
+ phase: release
+ skip: []
+ name: '@DROLSKY/stale modules, release'
+ version: '0.024'
+ -
+ class: Dist::Zilla::Plugin::ReadmeAnyFromPod
+ name: '@DROLSKY/ReadmeMarkdownInBuild'
+ version: '0.142250'
+ -
+ class: Dist::Zilla::Plugin::ReadmeAnyFromPod
+ name: '@DROLSKY/ReadmeMarkdownInRoot'
+ version: '0.142250'
+ -
+ class: Dist::Zilla::Plugin::PruneCruft
+ name: '@DROLSKY/PruneCruft'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::ManifestSkip
+ name: '@DROLSKY/ManifestSkip'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::MetaYAML
+ name: '@DROLSKY/MetaYAML'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::License
+ name: '@DROLSKY/License'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::ExtraTests
+ name: '@DROLSKY/ExtraTests'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::ExecDir
+ name: '@DROLSKY/ExecDir'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::ShareDir
+ name: '@DROLSKY/ShareDir'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::Manifest
+ name: '@DROLSKY/Manifest'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::TestRelease
+ name: '@DROLSKY/TestRelease'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::ConfirmRelease
+ name: '@DROLSKY/ConfirmRelease'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::UploadToCPAN
+ name: '@DROLSKY/UploadToCPAN'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::CheckPrereqsIndexed
+ name: '@DROLSKY/CheckPrereqsIndexed'
+ version: '0.012'
+ -
+ class: Dist::Zilla::Plugin::ContributorsFromGit
+ name: '@DROLSKY/ContributorsFromGit'
+ version: '0.014'
+ -
+ class: Dist::Zilla::Plugin::CopyReadmeFromBuild
+ name: '@DROLSKY/CopyReadmeFromBuild'
+ version: '0.0019'
+ -
+ class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch
+ config:
+ Dist::Zilla::Role::Git::Repo:
+ repo_root: .
+ name: '@DROLSKY/Git::CheckFor::CorrectBranch'
+ version: '0.011'
+ -
+ class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts
+ config:
+ Dist::Zilla::Role::Git::Repo:
+ repo_root: .
+ name: '@DROLSKY/Git::CheckFor::MergeConflicts'
+ version: '0.011'
+ -
+ class: Dist::Zilla::Plugin::Git::Describe
+ name: '@DROLSKY/Git::Describe'
+ version: '0.003'
+ -
+ class: Dist::Zilla::Plugin::InstallGuide
+ name: '@DROLSKY/InstallGuide'
+ version: '1.200003'
+ -
+ class: Dist::Zilla::Plugin::Meta::Contributors
+ name: '@DROLSKY/Meta::Contributors'
+ version: '0.001'
+ -
+ class: Dist::Zilla::Plugin::MetaConfig
+ name: '@DROLSKY/MetaConfig'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::MetaJSON
+ name: '@DROLSKY/MetaJSON'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::PkgVersion
+ name: '@DROLSKY/PkgVersion'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::SurgicalPodWeaver
+ config:
+ Dist::Zilla::Plugin::PodWeaver:
+ finder:
+ - ':InstallModules'
+ - ':ExecFiles'
+ plugins:
+ -
+ class: Pod::Weaver::Plugin::EnsurePod5
+ name: '@CorePrep/EnsurePod5'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Plugin::H1Nester
+ name: '@CorePrep/H1Nester'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Plugin::SingleEncoding
+ name: '@Default/SingleEncoding'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Name
+ name: '@Default/Name'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Version
+ name: '@Default/Version'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Region
+ name: '@Default/prelude'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Generic
+ name: SYNOPSIS
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Generic
+ name: DESCRIPTION
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Generic
+ name: OVERVIEW
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Collect
+ name: ATTRIBUTES
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Collect
+ name: METHODS
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Collect
+ name: FUNCTIONS
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Leftovers
+ name: '@Default/Leftovers'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Region
+ name: '@Default/postlude'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Authors
+ name: '@Default/Authors'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Legal
+ name: '@Default/Legal'
+ version: '4.006'
+ name: '@DROLSKY/SurgicalPodWeaver'
+ version: '0.0021'
+ -
+ class: Dist::Zilla::Plugin::EOLTests
+ name: '@DROLSKY/EOLTests'
+ version: '0.02'
+ -
+ class: Dist::Zilla::Plugin::PodSyntaxTests
+ name: '@DROLSKY/PodSyntaxTests'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::Test::CPAN::Changes
+ name: '@DROLSKY/Test::CPAN::Changes'
+ version: '0.008'
+ -
+ class: Dist::Zilla::Plugin::Test::Compile
+ config:
+ Dist::Zilla::Plugin::Test::Compile:
+ bail_out_on_fail: '0'
+ fail_on_warning: author
+ fake_home: '0'
+ filename: t/00-compile.t
+ module_finder:
+ - ':InstallModules'
+ needs_display: '0'
+ phase: test
+ script_finder:
+ - ':ExecFiles'
+ skips: []
+ name: '@DROLSKY/Test::Compile'
+ version: '2.046'
+ -
+ class: Dist::Zilla::Plugin::Test::NoTabs
+ config:
+ Dist::Zilla::Plugin::Test::NoTabs:
+ filename: xt/author/no-tabs.t
+ finder:
+ - ':InstallModules'
+ - ':ExecFiles'
+ - ':TestFiles'
+ name: '@DROLSKY/Test::NoTabs'
+ version: '0.09'
+ -
+ class: Dist::Zilla::Plugin::Test::Pod::LinkCheck
+ name: '@DROLSKY/Test::Pod::LinkCheck'
+ version: '1.001'
+ -
+ class: Dist::Zilla::Plugin::Test::Pod::No404s
+ name: '@DROLSKY/Test::Pod::No404s'
+ version: '1.001'
+ -
+ class: Dist::Zilla::Plugin::Test::Portability
+ name: '@DROLSKY/Test::Portability'
+ version: '2.000005'
+ -
+ class: Dist::Zilla::Plugin::Test::Synopsis
+ name: '@DROLSKY/Test::Synopsis'
+ version: '2.000005'
+ -
+ class: Dist::Zilla::Plugin::Git::Check
+ config:
+ Dist::Zilla::Plugin::Git::Check:
+ untracked_files: die
+ Dist::Zilla::Role::Git::DirtyFiles:
+ allow_dirty:
+ - Changes
+ - CONTRIBUTING.md
+ - README.md
+ allow_dirty_match: []
+ changelog: Changes
+ Dist::Zilla::Role::Git::Repo:
+ repo_root: .
+ name: '@DROLSKY/Git::Check'
+ version: '2.023'
+ -
+ class: Dist::Zilla::Plugin::Git::Commit
+ config:
+ Dist::Zilla::Plugin::Git::Commit:
+ add_files_in: []
+ commit_msg: v%v%n%n%c
+ time_zone: local
+ Dist::Zilla::Role::Git::DirtyFiles:
+ allow_dirty:
+ - Changes
+ - CONTRIBUTING.md
+ - README.md
+ allow_dirty_match: []
+ changelog: Changes
+ Dist::Zilla::Role::Git::Repo:
+ repo_root: .
+ name: '@DROLSKY/Git::Commit'
+ version: '2.023'
+ -
+ class: Dist::Zilla::Plugin::Git::Tag
+ config:
+ Dist::Zilla::Plugin::Git::Tag:
+ branch: ~
+ signed: 0
+ tag: v0.24
+ tag_format: v%v
+ tag_message: v%v
+ time_zone: local
+ Dist::Zilla::Role::Git::Repo:
+ repo_root: .
+ name: '@DROLSKY/Git::Tag'
+ version: '2.023'
+ -
+ class: Dist::Zilla::Plugin::Git::Push
+ config:
+ Dist::Zilla::Plugin::Git::Push:
+ push_to:
+ - origin
+ remotes_must_exist: 1
+ Dist::Zilla::Role::Git::Repo:
+ repo_root: .
+ name: '@DROLSKY/Git::Push'
+ version: '2.023'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':InstallModules'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':IncModules'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':TestFiles'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':ExecFiles'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':ShareFiles'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':MainModule'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':AllFiles'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':NoFiles'
+ version: '5.020'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: '@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM'
+ version: '5.020'
+ zilla:
+ class: Dist::Zilla::Dist::Builder
+ config:
+ is_trial: '0'
+ version: '5.020'
x_authority: cpan:NEELY
+x_contributors:
+ - 'Gregory Oschwald <goschwald@maxmind.com>'
@@ -1,20 +1,19 @@
-# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.013.
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.020.
use strict;
use warnings;
use 5.008;
-use ExtUtils::MakeMaker 6.30;
+use ExtUtils::MakeMaker ;
my %WriteMakefileArgs = (
"ABSTRACT" => "IPv4 and IPv6 validation methods",
"AUTHOR" => "Neil Neely <neil\@neely.cx>, Dave Rolsky <autarch\@urth.org>",
- "BUILD_REQUIRES" => {},
"CONFIGURE_REQUIRES" => {
- "ExtUtils::MakeMaker" => "6.30"
+ "ExtUtils::MakeMaker" => 0
},
"DISTNAME" => "Data-Validate-IP",
"EXE_FILES" => [],
@@ -28,11 +27,15 @@ my %WriteMakefileArgs = (
"warnings" => 0
},
"TEST_REQUIRES" => {
+ "ExtUtils::MakeMaker" => 0,
+ "File::Spec" => 0,
+ "IO::Handle" => 0,
+ "IPC::Open3" => 0,
"Test::More" => "0.88",
"Test::Requires" => 0,
"lib" => 0
},
- "VERSION" => "0.23",
+ "VERSION" => "0.24",
"test" => {
"TESTS" => "t/*.t"
}
@@ -41,6 +44,10 @@ my %WriteMakefileArgs = (
my %FallbackPrereqs = (
"Exporter" => 0,
+ "ExtUtils::MakeMaker" => 0,
+ "File::Spec" => 0,
+ "IO::Handle" => 0,
+ "IPC::Open3" => 0,
"NetAddr::IP" => 4,
"Scalar::Util" => 0,
"Test::More" => "0.88",
@@ -1,15 +0,0 @@
-
-
-This archive contains the distribution Data-Validate-IP,
-version 0.23:
-
- IPv4 and IPv6 validation methods
-
-This software is copyright (c) 2014 by Neil Neely.
-
-This is free software; you can redistribute it and/or modify it under
-the same terms as the Perl 5 programming language system itself.
-
-
-This README file was generated by Dist::Zilla::Plugin::Readme v5.013.
-
@@ -0,0 +1,224 @@
+# NAME
+
+Data::Validate::IP - IPv4 and IPv6 validation methods
+
+# VERSION
+
+version 0.24
+
+# SYNOPSIS
+
+ use Data::Validate::IP qw(is_ipv4 is_ipv6);
+
+ my $suspect = '1.2.3.4';
+ if (is_ipv4($suspect)) {
+ print "Looks like an IPv4 address";
+ }
+ else {
+ print "Not an IPv4 address\n";
+ }
+
+ $suspect = '::1234';
+ if (is_ipv6($suspect)) {
+ print "Looks like an IPv6 address";
+ }
+ else {
+ print "Not an IPv6 address\n";
+ }
+
+# DESCRIPTION
+
+This module provides a number IP address validation subs that both validate
+and untaint their input. This includes both basic validation (`is_ipv4()` and
+`is_ipv6()`) and special cases like checking whether an address belongs to a
+specific network or whether an address is public or private (reserved).
+
+# FUNCTIONS
+
+All of the functions below are exported by default.
+
+All functions return an untainted value if the test passes and undef if it
+fails. In theory, this means that you should always check for a defined status
+explicitly but in practice there are no valid IP addresses where the string
+form evaluates to false in Perl.
+
+Note that none of these functions actually attempt to test whether the given
+IP address is routable from your device; they are purely semantic checks.
+
+## is\_ipv4($ip) and is\_ipv6($ip)
+
+These functions simply check whether the address is a valid IPv4 or IPv6 address.
+
+## is\_innet\_ipv4($ip, $network)
+
+This subroutine checks whether the address belongs to the given IPv4
+network. The `$network` argument can either be a string in CIDR notation like
+"15.0.15.0/24" or a [NetAddr::IP](https://metacpan.org/pod/NetAddr::IP) object.
+
+This subroutine used to accept many more forms of network specifications
+(anything [Net::Netmask](https://metacpan.org/pod/Net::Netmask) accepts) but this has been deprecated.
+
+## is\_unroutable\_ipv4($ip)
+
+This subroutine checks whether the address belongs to any of several special
+use IPv4 networks - `0.0.0.0/8`, `100.64.0.0/10`, `192.0.0.0/29`,
+`198.18.0.0/15`, `240.0.0.0/4` - as defined by [RFC
+5735](http://tools.ietf.org/html/rfc5735), [RFC
+6333](http://tools.ietf.org/html/rfc6333), and [RFC
+6958](http://tools.ietf.org/html/rfc6598).
+
+Arguably, these should be broken down further but this subroutine will always
+exist for backwards compatibility.
+
+## is\_private\_ipv4($ip)
+
+This subroutine checks whether the address belongs to any of the private IPv4
+networks - `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` - as defined by
+[RFC 5735](http://tools.ietf.org/html/rfc5735).
+
+## is\_loopback\_ipv4($ip)
+
+This subroutine checks whether the address belongs to the IPv4 loopback
+network - `127.0.0.0/8` - as defined by [RFC
+5735](http://tools.ietf.org/html/rfc5735).
+
+## is\_linklocal\_ipv4($ip)
+
+This subroutine checks whether the address belongs to the IPv4 link local
+network - `169.254.0.0/16` - as defined by [RFC
+5735](http://tools.ietf.org/html/rfc5735).
+
+## is\_testnet\_ipv4($ip)
+
+This subroutine checks whether the address belongs to any of the IPv4 TEST-NET
+networks for use in documentation and example code - `192.0.2.0/24`,
+`198.51.100.0/24`, and `203.0.113.0/24` - as defined by [RFC
+5735](http://tools.ietf.org/html/rfc5735).
+
+## is\_anycast\_ipv4($ip)
+
+This subroutine checks whether the address belongs to the 6to4 relay anycast
+network - `192.88.99.0/24` - as defined by [RFC
+5735](http://tools.ietf.org/html/rfc5735).
+
+## is\_multicast\_ipv4($ip)
+
+This subroutine checks whether the address belongs to the IPv4 multicast
+network - `224.0.0.0/4` - as defined by [RFC
+5735](http://tools.ietf.org/html/rfc5735).
+
+## is\_loopback\_ipv6($ip)
+
+This subroutine checks whether the address is the IPv6 loopback address -
+`::1/128` - as defined by [RFC 4291](http://tools.ietf.org/html/rfc4291).
+
+## is\_ipv4\_mapped\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 IPv4-mapped
+address network - `::ffff:0:0/96` - as defined by [RFC
+4291](http://tools.ietf.org/html/rfc4291).
+
+## is\_discard\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 discard prefix
+network - `100::/64` - as defined by [RFC
+6666](http://tools.ietf.org/html/rfc6666).
+
+## is\_special\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 special network
+\- `2001::/23` - as defined by [RFC 2928](http://tools.ietf.org/html/rfc2928).
+
+## is\_teredo\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 TEREDO network
+\- `2001::/32` - as defined by [RFC 4380](http://tools.ietf.org/html/rfc4380).
+
+Note that this network is a subnet of the larger special network at
+`2001::/23`.
+
+## is\_orchid\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 ORCHID network
+\- `2001::/32` - as defined by [RFC 4380](http://tools.ietf.org/html/rfc4380).
+
+Note that this network is a subnet of the larger special network at
+`2001::/23`.
+
+This network is currently scheduled to be returned to the special pool in
+March of 2014 unless the IETF extends its use. If that happens this subroutine
+will continue to exist but will always return false.
+
+## is\_documentation\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 documentation
+network - `2001:DB8::/32` - as defined by [RFC
+3849](http://tools.ietf.org/html/rfc3849).
+
+## is\_private\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 private network
+\- `FC00::/7` - as defined by [RFC 4193](http://tools.ietf.org/html/rfc4193).
+
+## is\_linklocal\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 link-local
+unicast network - `FE80::/10` - as defined by [RFC
+4291](http://tools.ietf.org/html/rfc4291).
+
+## is\_multicast\_ipv6($ip)
+
+This subroutine checks whether the address belongs to the IPv6 multicast
+network - `FF00::/8` - as defined by [RFC
+4291](http://tools.ietf.org/html/rfc4291).
+
+## is\_public\_ipv4($ip) and is\_public\_ipv6($ip)
+
+These subroutines check whether the given IP address belongs to any of the
+special case networks defined previously. Note that this is **not** simply the
+opposite of checking `is_private_ipv4()` or `is_private_ipv6()`. The private
+networks are a subset of all the special case networks.
+
+# OBJECT-ORIENTED INTERFACE
+
+This module can also be used as a class. You can call `Data::Validate::IP->new()` to get an object and then call any of the
+validation subroutines as methods on that object. This is somewhat pointless
+since the object will never contain any state but this interface is kept for
+backwards compatibility.
+
+# SEE ALSO
+
+IPv4
+
+**\[RFC 5735\] \[RFC 1918\]**
+
+IPv6
+
+**\[RFC 2460\] \[RFC 4193\] \[RFC 4291\] \[RFC 6434\]**
+
+# BUGS
+
+Please report any bugs or feature requests to
+`bug-data-validate-ip@rt.cpan.org`, or through the web interface at
+[http://rt.cpan.org](http://rt.cpan.org). I will be notified, and then you'll automatically be
+notified of progress on your bug as I make changes.
+
+# ACKNOWLEDGEMENTS
+
+Thanks to Richard Sonnen <`sonnen@richardsonnen.com`> for writing the
+Data::Validate module.
+
+Thanks to Matt Dainty <`matt@bodgit-n-scarper.com`> for adding the
+`is_multicast_ipv4()` and `is_linklocal_ipv4()` code.
+
+# AUTHORS
+
+- Neil Neely <neil@neely.cx>
+- Dave Rolsky <autarch@urth.org>
+
+# COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2014 by Neil Neely.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
@@ -4,40 +4,21 @@ author = Dave Rolsky <autarch@urth.org>
license = Perl_5
copyright_holder = Neil Neely
-version = 0.23
-
-[NextRelease]
-format = %-5v %{EEE MMM dd yyyy}d
-
-[@Basic]
-
-[Authority]
-authority = cpan:NEELY
-
-[InstallGuide]
-[MetaJSON]
-
-[MetaResources]
-bugtracker.web = http://rt.cpan.org/NoAuth/Bugs.html?Dist=Data-Validate-IP
-bugtracker.mailto = bug-data-validate-ip@rt.cpan.org
-repository.url = https://github.com/neilneely/Data-Validate-IP.git
-repository.web = https://github.com/neilneely/Data-Validate-IP.git
-repository.type = git
-
-[SurgicalPodWeaver]
-
-[PkgVersion]
-
-[EOLTests]
-[NoTabsTests]
-[PodSyntaxTests]
-[Test::CPAN::Changes]
-[Test::Pod::LinkCheck]
-[Test::Pod::No404s]
-
-[AutoPrereqs]
-skip = Socket
-
-[CheckPrereqsIndexed]
-
-[@Git]
+version = 0.24
+
+[@DROLSKY]
+dist = Data-Validate-IP
+next_release_width = 5
+authority = NEELY
+prereqs_skip = Socket
+stopwords = CIDR
+stopwords = IETF
+stopwords = IPv
+stopwords = Sonnen
+stopwords = TEREDO
+stopwords = anycast
+stopwords = loopback
+stopwords = multicast
+stopwords = routable
+stopwords = subnet
+stopwords = unicast
@@ -1,8 +1,6 @@
package Data::Validate::IP;
-$Data::Validate::IP::VERSION = '0.23';
-BEGIN {
- $Data::Validate::IP::AUTHORITY = 'cpan:NEELY';
-}
+# git description: v0.23-7-g6ffbf1f
+$Data::Validate::IP::VERSION = '0.24';
use strict;
use warnings;
@@ -60,7 +58,9 @@ sub _fast_is_ipv4 {
my $value = shift;
return
- unless defined $value && defined inet_pton(Socket::AF_INET(), $value);
+ unless defined $value
+ && $value !~ /\0/
+ && defined inet_pton(Socket::AF_INET(), $value);
$value =~ /(.+)/;
return $1;
@@ -88,7 +88,8 @@ sub _fast_is_ipv6 {
my $value = shift;
return
- unless defined $value
+ unless defined $value
+ && $value !~ /\0/
&& defined inet_pton(Socket::AF_INET6(), $value);
$value =~ /(.+)/;
@@ -444,18 +445,21 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Data::Validate::IP - IPv4 and IPv6 validation methods
=head1 VERSION
-version 0.23
+version 0.24
=head1 SYNOPSIS
use Data::Validate::IP qw(is_ipv4 is_ipv6);
+ my $suspect = '1.2.3.4';
if (is_ipv4($suspect)) {
print "Looks like an IPv4 address";
}
@@ -463,6 +467,7 @@ version 0.23
print "Not an IPv4 address\n";
}
+ $suspect = '::1234';
if (is_ipv6($suspect)) {
print "Looks like an IPv6 address";
}
@@ -470,13 +475,6 @@ version 0.23
print "Not an IPv6 address\n";
}
- # or as an object
- my $v = Data::Validate::IP->new();
-
- die "not an IPv4 ip" unless ($v->is_ipv4('domain.com'));
-
- die "not an IPv6 ip" unless ($v->is_ipv6('domain.com'));
-
=head1 DESCRIPTION
This module provides a number IP address validation subs that both validate
@@ -630,6 +628,8 @@ special case networks defined previously. Note that this is B<not> simply the
opposite of checking C<is_private_ipv4()> or C<is_private_ipv6()>. The private
networks are a subset of all the special case networks.
+=for Pod::Coverage new
+
=head1 OBJECT-ORIENTED INTERFACE
This module can also be used as a class. You can call C<<
@@ -0,0 +1,50 @@
+use 5.006;
+use strict;
+use warnings;
+
+# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.046
+
+use Test::More tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0);
+
+
+
+my @module_files = (
+ 'Data/Validate/IP.pm'
+);
+
+
+
+# no fake home requested
+
+my $inc_switch = -d 'blib' ? '-Mblib' : '-Ilib';
+
+use File::Spec;
+use IPC::Open3;
+use IO::Handle;
+
+open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!";
+
+my @warnings;
+for my $lib (@module_files)
+{
+ # see L<perlfaq8/How can I capture STDERR from an external command?>
+ my $stderr = IO::Handle->new;
+
+ my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]");
+ binmode $stderr, ':crlf' if $^O eq 'MSWin32';
+ my @_warnings = <$stderr>;
+ waitpid($pid, 0);
+ is($?, 0, "$lib loaded ok");
+
+ if (@_warnings)
+ {
+ warn @_warnings;
+ push @warnings, @_warnings;
+ }
+}
+
+
+
+is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', explain \@warnings if $ENV{AUTHOR_TESTING};
+
+
@@ -0,0 +1,45 @@
+do { my $x = {
+ 'configure' => {
+ 'requires' => {
+ 'ExtUtils::MakeMaker' => '0'
+ }
+ },
+ 'develop' => {
+ 'requires' => {
+ 'Pod::Coverage::TrustPod' => '0',
+ 'Test::CPAN::Changes' => '0.19',
+ 'Test::More' => '0.88',
+ 'Test::NoTabs' => '0',
+ 'Test::Pod' => '1.41',
+ 'Test::Pod::Coverage' => '1.08',
+ 'Test::Spelling' => '0.12',
+ 'Test::Synopsis' => '0'
+ }
+ },
+ 'runtime' => {
+ 'requires' => {
+ 'Exporter' => '0',
+ 'NetAddr::IP' => '4',
+ 'Scalar::Util' => '0',
+ 'perl' => '5.008',
+ 'strict' => '0',
+ 'warnings' => '0'
+ }
+ },
+ 'test' => {
+ 'recommends' => {
+ 'CPAN::Meta' => '2.120900'
+ },
+ 'requires' => {
+ 'ExtUtils::MakeMaker' => '0',
+ 'File::Spec' => '0',
+ 'IO::Handle' => '0',
+ 'IPC::Open3' => '0',
+ 'Test::More' => '0.88',
+ 'Test::Requires' => '0',
+ 'lib' => '0'
+ }
+ }
+ };
+ $x;
+ }
\ No newline at end of file
@@ -0,0 +1,176 @@
+#!perl
+
+use strict;
+use warnings;
+
+# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019
+
+use Test::More tests => 1;
+
+use ExtUtils::MakeMaker;
+use File::Spec;
+
+# from $version::LAX
+my $lax_version_re =
+ qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )?
+ |
+ (?:\.[0-9]+) (?:_[0-9]+)?
+ ) | (?:
+ v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )?
+ |
+ (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)?
+ )
+ )/x;
+
+# hide optional CPAN::Meta modules from prereq scanner
+# and check if they are available
+my $cpan_meta = "CPAN::Meta";
+my $cpan_meta_pre = "CPAN::Meta::Prereqs";
+my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic
+
+# Verify requirements?
+my $DO_VERIFY_PREREQS = 1;
+
+sub _max {
+ my $max = shift;
+ $max = ( $_ > $max ) ? $_ : $max for @_;
+ return $max;
+}
+
+sub _merge_prereqs {
+ my ($collector, $prereqs) = @_;
+
+ # CPAN::Meta::Prereqs object
+ if (ref $collector eq $cpan_meta_pre) {
+ return $collector->with_merged_prereqs(
+ CPAN::Meta::Prereqs->new( $prereqs )
+ );
+ }
+
+ # Raw hashrefs
+ for my $phase ( keys %$prereqs ) {
+ for my $type ( keys %{ $prereqs->{$phase} } ) {
+ for my $module ( keys %{ $prereqs->{$phase}{$type} } ) {
+ $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module};
+ }
+ }
+ }
+
+ return $collector;
+}
+
+my @include = qw(
+
+);
+
+my @exclude = qw(
+
+);
+
+# Add static prereqs to the included modules list
+my $static_prereqs = do 't/00-report-prereqs.dd';
+
+# Merge all prereqs (either with ::Prereqs or a hashref)
+my $full_prereqs = _merge_prereqs(
+ ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ),
+ $static_prereqs
+);
+
+# Add dynamic prereqs to the included modules list (if we can)
+my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml';
+if ( $source && $HAS_CPAN_META ) {
+ if ( my $meta = eval { CPAN::Meta->load_file($source) } ) {
+ $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs);
+ }
+}
+else {
+ $source = 'static metadata';
+}
+
+my @full_reports;
+my @dep_errors;
+my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs;
+
+# Add static includes into a fake section
+for my $mod (@include) {
+ $req_hash->{other}{modules}{$mod} = 0;
+}
+
+for my $phase ( qw(configure build test runtime develop other) ) {
+ next unless $req_hash->{$phase};
+ next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING});
+
+ for my $type ( qw(requires recommends suggests conflicts modules) ) {
+ next unless $req_hash->{$phase}{$type};
+
+ my $title = ucfirst($phase).' '.ucfirst($type);
+ my @reports = [qw/Module Want Have/];
+
+ for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) {
+ next if $mod eq 'perl';
+ next if grep { $_ eq $mod } @exclude;
+
+ my $file = $mod;
+ $file =~ s{::}{/}g;
+ $file .= ".pm";
+ my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC;
+
+ my $want = $req_hash->{$phase}{$type}{$mod};
+ $want = "undef" unless defined $want;
+ $want = "any" if !$want && $want == 0;
+
+ my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required";
+
+ if ($prefix) {
+ my $have = MM->parse_version( File::Spec->catfile($prefix, $file) );
+ $have = "undef" unless defined $have;
+ push @reports, [$mod, $want, $have];
+
+ if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) {
+ if ( $have !~ /\A$lax_version_re\z/ ) {
+ push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)";
+ }
+ elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) {
+ push @dep_errors, "$mod version '$have' is not in required range '$want'";
+ }
+ }
+ }
+ else {
+ push @reports, [$mod, $want, "missing"];
+
+ if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) {
+ push @dep_errors, "$mod is not installed ($req_string)";
+ }
+ }
+ }
+
+ if ( @reports ) {
+ push @full_reports, "=== $title ===\n\n";
+
+ my $ml = _max( map { length $_->[0] } @reports );
+ my $wl = _max( map { length $_->[1] } @reports );
+ my $hl = _max( map { length $_->[2] } @reports );
+ splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl];
+
+ push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports;
+ push @full_reports, "\n";
+ }
+ }
+}
+
+if ( @full_reports ) {
+ diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports;
+}
+
+if ( @dep_errors ) {
+ diag join("\n",
+ "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n",
+ "The following REQUIRED prerequisites were not satisfied:\n",
+ @dep_errors,
+ "\n"
+ );
+}
+
+pass;
+
+# vim: ts=4 sts=4 sw=4 et:
@@ -0,0 +1,40 @@
+
+BEGIN {
+ unless ($ENV{AUTHOR_TESTING}) {
+ require Test::More;
+ Test::More::plan(skip_all => 'these tests are for testing by the author');
+ }
+}
+
+use strict;
+use warnings;
+
+# this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.09
+
+use Test::More 0.88;
+use Test::NoTabs;
+
+my @files = (
+ 'lib/Data/Validate/IP.pm',
+ 't/00-compile.t',
+ 't/00-report-prereqs.dd',
+ 't/00-report-prereqs.t',
+ 't/Data-Validate-IP-slow.t',
+ 't/Data-Validate-IP.t',
+ 't/Untaint.t',
+ 't/author-no-tabs.t',
+ 't/author-pod-spell.t',
+ 't/lib/Test/Data/Validate/IP.pm',
+ 't/release-cpan-changes.t',
+ 't/release-eol.t',
+ 't/release-pod-coverage.t',
+ 't/release-pod-linkcheck.t',
+ 't/release-pod-no404s.t',
+ 't/release-pod-spell.t',
+ 't/release-pod-syntax.t',
+ 't/release-portability.t',
+ 't/release-synopsis.t'
+);
+
+notabs_ok($_) foreach @files;
+done_testing;
@@ -0,0 +1,47 @@
+
+BEGIN {
+ unless ($ENV{AUTHOR_TESTING}) {
+ require Test::More;
+ Test::More::plan(skip_all => 'these tests are for testing by the author');
+ }
+}
+
+use strict;
+use warnings;
+use Test::More;
+
+# generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006008
+use Test::Spelling 0.12;
+use Pod::Wordlist;
+
+
+add_stopwords(<DATA>);
+all_pod_files_spelling_ok( qw( bin lib ) );
+__DATA__
+DROLSKY
+DROLSKY's
+Rolsky
+Rolsky's
+CIDR
+IETF
+IPv
+Sonnen
+TEREDO
+anycast
+loopback
+multicast
+routable
+subnet
+unicast
+Neil
+Neely
+neil
+Dave
+autarch
+Gregory
+Oschwald
+goschwald
+lib
+Data
+Validate
+IP
@@ -135,15 +135,18 @@ sub _ipv4_basic_tests {
is($object->is_ipv4($ip), $ip, "->is_ipv4($ip) returns $ip");
}
- my @invalid_ipv4 = qw(
- www.neely.cx
- 216.17.184.G
- 216.17.184.1.
- 216.17.184
- 216.17.184.
- 256.17.184.1
- 216.017.184.1
- 016.17.184.1
+ my @invalid_ipv4 = (
+ qw(
+ www.neely.cx
+ 216.17.184.G
+ 216.17.184.1.
+ 216.17.184
+ 216.17.184.
+ 256.17.184.1
+ 216.017.184.1
+ 016.17.184.1
+ ),
+ "1.1.1.1\0 exploit goes here",
);
for my $ip (@invalid_ipv4) {
@@ -244,22 +247,35 @@ sub _ipv6_basic_tests {
is($object->is_ipv6($ip), $ip, "->is_ipv6($ip) returns $ip");
}
- my @invalid = qw(
- 2067:fa88
- 2067:FA88
- 2067:::
- 2067:::1
- 2067::1:
- 216.17.184.1
- bbb.bbb.bbb
- :::
- g123::1234
- :abcd
+ my @invalid = (
+ qw(
+ 2067:fa88
+ 2067:FA88
+ 2067:::
+ 2067:::1
+ 2067::1:
+ 216.17.184.1
+ bbb.bbb.bbb
+ :::
+ g123::1234
+ :abcd
+ ),
+ "::1\0 invalid"
);
for my $ip (@invalid) {
is(is_ipv6($ip), undef, "is_ipv6($ip) returns undef");
is($object->is_ipv6($ip), undef, "->is_ipv6($ip) returns undef");
+
+ for my $type (sort keys %ipv6_types) {
+ my ($is_sub_name, $is_sub) = _sub_for_type($type, 6);
+
+ is($is_sub->($ip), undef, "$is_sub_name($ip) returns undef");
+ is(
+ $object->$is_sub_name($ip), undef,
+ "->$is_sub_name($ip) returns undef"
+ );
+ }
}
}
@@ -1,22 +0,0 @@
-
-BEGIN {
- unless ($ENV{RELEASE_TESTING}) {
- require Test::More;
- Test::More::plan(skip_all => 'these tests are for release candidate testing');
- }
-}
-
-use strict;
-use warnings;
-
-# this test was generated with Dist::Zilla::Plugin::NoTabsTests 0.06
-
-use Test::More 0.88;
-use Test::NoTabs;
-
-my @files = (
- 'lib/Data/Validate/IP.pm'
-);
-
-notabs_ok($_) foreach @files;
-done_testing;
@@ -0,0 +1,43 @@
+#!perl
+
+BEGIN {
+ unless ($ENV{RELEASE_TESTING}) {
+ require Test::More;
+ Test::More::plan(skip_all => 'these tests are for release candidate testing');
+ }
+}
+
+# This file was automatically generated by Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable.
+
+use Test::Pod::Coverage 1.08;
+use Test::More 0.88;
+use Pod::Coverage::TrustPod;
+
+my %skip = map { $_ => 1 } qw( );
+
+my @modules;
+for my $module ( all_modules() ) {
+ next if $skip{$module};
+
+ push @modules, $module;
+}
+
+plan skip_all => 'All the modules we found were excluded from POD coverage test.'
+ unless @modules;
+
+plan tests => scalar @modules;
+
+my %trustme = ();
+
+for my $module ( sort @modules ) {
+ pod_coverage_ok(
+ $module,
+ {
+ coverage_class => 'Pod::Coverage::TrustPod',
+ trustme => $trustme{$module} || [],
+ },
+ "pod coverage for $module"
+ );
+}
+
+done_testing();
@@ -0,0 +1,19 @@
+#!perl
+
+BEGIN {
+ unless ($ENV{RELEASE_TESTING}) {
+ require Test::More;
+ Test::More::plan(skip_all => 'these tests are for release candidate testing');
+ }
+}
+
+
+use strict;
+use warnings;
+
+use Test::More;
+
+eval 'use Test::Portability::Files';
+plan skip_all => 'Test::Portability::Files required for testing portability'
+ if $@;
+run_tests();
@@ -0,0 +1,13 @@
+#!perl
+
+BEGIN {
+ unless ($ENV{RELEASE_TESTING}) {
+ require Test::More;
+ Test::More::plan(skip_all => 'these tests are for release candidate testing');
+ }
+}
+
+
+use Test::Synopsis;
+
+all_synopsis_ok();