Regexp-Pattern-0.2.12/0000775000175000017500000000000013617303671012106 5ustar u1u1Regexp-Pattern-0.2.12/Makefile.PL0000644000175000017500000000243213617303671014057 0ustar u1u1# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.012. use strict; use warnings; use 5.010001; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Convention/framework for modules that contain collection of regexes", "AUTHOR" => "perlancar ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Regexp-Pattern", "LICENSE" => "perl", "MIN_PERL_VERSION" => "5.010001", "NAME" => "Regexp::Pattern", "PREREQ_PM" => { "strict" => 0 }, "TEST_REQUIRES" => { "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Test::Exception" => 0, "Test::More" => "0.98", "warnings" => 0 }, "VERSION" => "0.2.12", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Test::Exception" => 0, "Test::More" => "0.98", "strict" => 0, "warnings" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); Regexp-Pattern-0.2.12/META.yml0000644000175000017500000003404313617303671013361 0ustar u1u1--- abstract: 'Convention/framework for modules that contain collection of regexes' author: - 'perlancar ' build_requires: File::Spec: '0' IO::Handle: '0' IPC::Open3: '0' Test::Exception: '0' Test::More: '0.98' warnings: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.012, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Regexp-Pattern requires: perl: '5.010001' strict: '0' resources: bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=Regexp-Pattern homepage: https://metacpan.org/release/Regexp-Pattern repository: git://github.com/perlancar/perl-Regexp-Pattern.git version: 0.2.12 x_Dist_Zilla: perl: version: '5.030000' plugins: - class: Dist::Zilla::Plugin::Regexp::Pattern name: Regexp::Pattern version: '0.005' - class: Dist::Zilla::Plugin::InsertBlock name: InsertBlock version: '0.100' - class: Dist::Zilla::Plugin::GatherDir config: Dist::Zilla::Plugin::GatherDir: exclude_filename: [] exclude_match: [] follow_symlinks: 0 include_dotfiles: 0 prefix: '' prune_directory: [] root: . name: '@Author::PERLANCAR/@Filter/GatherDir' version: '6.012' - class: Dist::Zilla::Plugin::PruneCruft name: '@Author::PERLANCAR/@Filter/PruneCruft' version: '6.012' - class: Dist::Zilla::Plugin::ManifestSkip name: '@Author::PERLANCAR/@Filter/ManifestSkip' version: '6.012' - class: Dist::Zilla::Plugin::MetaYAML name: '@Author::PERLANCAR/@Filter/MetaYAML' version: '6.012' - class: Dist::Zilla::Plugin::License name: '@Author::PERLANCAR/@Filter/License' version: '6.012' - class: Dist::Zilla::Plugin::PodCoverageTests name: '@Author::PERLANCAR/@Filter/PodCoverageTests' version: '6.012' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@Author::PERLANCAR/@Filter/PodSyntaxTests' version: '6.012' - class: Dist::Zilla::Plugin::ExtraTests name: '@Author::PERLANCAR/@Filter/ExtraTests' version: '6.012' - class: Dist::Zilla::Plugin::ExecDir name: '@Author::PERLANCAR/@Filter/ExecDir' version: '6.012' - class: Dist::Zilla::Plugin::ShareDir name: '@Author::PERLANCAR/@Filter/ShareDir' version: '6.012' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: 1 name: '@Author::PERLANCAR/@Filter/MakeMaker' version: '6.012' - class: Dist::Zilla::Plugin::Manifest name: '@Author::PERLANCAR/@Filter/Manifest' version: '6.012' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@Author::PERLANCAR/@Filter/ConfirmRelease' version: '6.012' - class: Dist::Zilla::Plugin::FileFinder::ByName name: '@Author::PERLANCAR/FileFinder::ByName PERLANCAR' version: '6.012' - class: Dist::Zilla::Plugin::ExecDir name: '@Author::PERLANCAR/ExecDir script' version: '6.012' - class: Dist::Zilla::Plugin::PERLANCAR::BeforeBuild name: '@Author::PERLANCAR/PERLANCAR::BeforeBuild' version: '0.599' - class: Dist::Zilla::Plugin::Rinci::AbstractFromMeta name: '@Author::PERLANCAR/Rinci::AbstractFromMeta' version: '0.10' - class: Dist::Zilla::Plugin::PodnameFromFilename name: '@Author::PERLANCAR/PodnameFromFilename' version: '0.02' - class: Dist::Zilla::Plugin::PERLANCAR::EnsurePrereqToSpec name: '@Author::PERLANCAR/PERLANCAR::EnsurePrereqToSpec' version: '0.060' - class: Dist::Zilla::Plugin::PERLANCAR::MetaResources name: '@Author::PERLANCAR/PERLANCAR::MetaResources' version: '0.040' - class: Dist::Zilla::Plugin::CheckChangeLog name: '@Author::PERLANCAR/CheckChangeLog' version: '0.05' - class: Dist::Zilla::Plugin::CheckMetaResources name: '@Author::PERLANCAR/CheckMetaResources' version: '0.001' - class: Dist::Zilla::Plugin::CheckSelfDependency config: Dist::Zilla::Plugin::CheckSelfDependency: finder: - ':InstallModules' Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000036' version: '0.006' name: '@Author::PERLANCAR/CheckSelfDependency' version: '0.011' - class: Dist::Zilla::Plugin::CopyrightYearFromGit name: '@Author::PERLANCAR/CopyrightYearFromGit' version: '0.006' - class: Dist::Zilla::Plugin::IfBuilt name: '@Author::PERLANCAR/IfBuilt' version: '0.02' - class: Dist::Zilla::Plugin::MetaJSON name: '@Author::PERLANCAR/MetaJSON' version: '6.012' - class: Dist::Zilla::Plugin::MetaConfig name: '@Author::PERLANCAR/MetaConfig' version: '6.012' - class: Dist::Zilla::Plugin::Authority name: '@Author::PERLANCAR/Authority' version: '1.009' - class: Dist::Zilla::Plugin::OurDate name: '@Author::PERLANCAR/OurDate' version: '0.03' - class: Dist::Zilla::Plugin::OurDist name: '@Author::PERLANCAR/OurDist' version: '0.02' - class: Dist::Zilla::Plugin::OurPkgVersion name: '@Author::PERLANCAR/OurPkgVersion' version: '0.21' - class: Dist::Zilla::Plugin::PodWeaver config: Dist::Zilla::Plugin::PodWeaver: finder: - ':InstallModules' - ':ExecFiles' plugins: - class: Pod::Weaver::Plugin::EnsurePod5 name: '@CorePrep/EnsurePod5' version: '4.015' - class: Pod::Weaver::Plugin::H1Nester name: '@CorePrep/H1Nester' version: '4.015' - class: Pod::Weaver::Section::Name name: '@Author::PERLANCAR/Name' version: '4.015' - class: Pod::Weaver::Section::Version name: '@Author::PERLANCAR/Version' version: '4.015' - class: Pod::Weaver::Section::Region name: '@Author::PERLANCAR/prelude' version: '4.015' - class: Pod::Weaver::Section::Generic name: SYNOPSIS version: '4.015' - class: Pod::Weaver::Section::Generic name: DESCRIPTION version: '4.015' - class: Pod::Weaver::Section::Generic name: OVERVIEW version: '4.015' - class: Pod::Weaver::Section::Collect name: ATTRIBUTES version: '4.015' - class: Pod::Weaver::Section::Collect name: METHODS version: '4.015' - class: Pod::Weaver::Section::Collect name: FUNCTIONS version: '4.015' - class: Pod::Weaver::Section::Leftovers name: '@Author::PERLANCAR/Leftovers' version: '4.015' - class: Pod::Weaver::Section::Region name: '@Author::PERLANCAR/postlude' version: '4.015' - class: Pod::Weaver::Section::Completion::GetoptLongComplete name: '@Author::PERLANCAR/Completion::GetoptLongComplete' version: '0.08' - class: Pod::Weaver::Section::Completion::GetoptLongSubcommand name: '@Author::PERLANCAR/Completion::GetoptLongSubcommand' version: '0.04' - class: Pod::Weaver::Section::Completion::GetoptLongMore name: '@Author::PERLANCAR/Completion::GetoptLongMore' version: '0.001' - class: Pod::Weaver::Section::Homepage::DefaultCPAN name: '@Author::PERLANCAR/Homepage::DefaultCPAN' version: '0.05' - class: Pod::Weaver::Section::Source::DefaultGitHub name: '@Author::PERLANCAR/Source::DefaultGitHub' version: '0.07' - class: Pod::Weaver::Section::Bugs::DefaultRT name: '@Author::PERLANCAR/Bugs::DefaultRT' version: '0.06' - class: Pod::Weaver::Section::Authors name: '@Author::PERLANCAR/Authors' version: '4.015' - class: Pod::Weaver::Section::Legal name: '@Author::PERLANCAR/Legal' version: '4.015' - class: Pod::Weaver::Plugin::Rinci name: '@Author::PERLANCAR/Rinci' version: '0.780' - class: Pod::Weaver::Plugin::AppendPrepend name: '@Author::PERLANCAR/AppendPrepend' version: '0.01' - class: Pod::Weaver::Plugin::EnsureUniqueSections name: '@Author::PERLANCAR/EnsureUniqueSections' version: '0.163250' - class: Pod::Weaver::Plugin::SingleEncoding name: '@Author::PERLANCAR/SingleEncoding' version: '4.015' - class: Pod::Weaver::Plugin::PERLANCAR::SortSections name: '@Author::PERLANCAR/PERLANCAR::SortSections' version: '0.07' - class: Pod::Weaver::Plugin::Regexp::Pattern name: -Regexp::Pattern version: '0.004' name: '@Author::PERLANCAR/PodWeaver' version: '4.008' - class: Dist::Zilla::Plugin::PruneFiles name: '@Author::PERLANCAR/PruneFiles' version: '6.012' - class: Dist::Zilla::Plugin::Pod2Readme name: '@Author::PERLANCAR/Pod2Readme' version: '0.004' - class: Dist::Zilla::Plugin::Rinci::AddPrereqs name: '@Author::PERLANCAR/Rinci::AddPrereqs' version: '0.144' - class: Dist::Zilla::Plugin::Rinci::AddToDb name: '@Author::PERLANCAR/Rinci::AddToDb' version: '0.020' - class: Dist::Zilla::Plugin::Rinci::EmbedValidator name: '@Author::PERLANCAR/Rinci::EmbedValidator' version: '0.250' - class: Dist::Zilla::Plugin::SetScriptShebang name: '@Author::PERLANCAR/SetScriptShebang' version: '0.01' - 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: - ':PerlExecFiles' skips: [] switch: [] name: '@Author::PERLANCAR/Test::Compile' version: '2.058' - class: Dist::Zilla::Plugin::Test::Perl::Critic::Subset config: Dist::Zilla::Plugin::Test::Perl::Critic::Subset: finder: - '@Author::PERLANCAR/FileFinder::ByName PERLANCAR' name: '@Author::PERLANCAR/Test::Perl::Critic::Subset' version: 3.001.003 - class: Dist::Zilla::Plugin::Test::Rinci name: '@Author::PERLANCAR/Test::Rinci' version: '0.040' - class: Dist::Zilla::Plugin::StaticInstall config: Dist::Zilla::Plugin::StaticInstall: dry_run: 0 mode: on name: '@Author::PERLANCAR/StaticInstall' version: '0.012' - class: Dist::Zilla::Plugin::EnsureSQLSchemaVersionedTest name: '@Author::PERLANCAR/EnsureSQLSchemaVersionedTest' version: '0.03' - class: Dist::Zilla::Plugin::Acme::CPANModules::Blacklist name: '@Author::PERLANCAR/Acme::CPANModules::Blacklist' version: '0.001' - class: Dist::Zilla::Plugin::Prereqs::EnsureVersion name: '@Author::PERLANCAR/Prereqs::EnsureVersion' version: '0.050' - class: Dist::Zilla::Plugin::Prereqs::CheckCircular name: '@Author::PERLANCAR/Prereqs::CheckCircular' version: '0.006' - class: Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple name: '@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple' version: '0.04' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: Prereqs version: '6.012' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: test type: requires name: TestRequires version: '6.012' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: x_spec name: DevelopX_spec version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':ExtraTestFiles' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':PerlExecFiles' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '6.012' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '6.012' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '6.012' x_authority: cpan:PERLANCAR x_generated_by_perl: v5.30.0 x_serialization_backend: 'YAML::Tiny version 1.73' x_static_install: 1 Regexp-Pattern-0.2.12/weaver.ini0000644000175000017500000000005013617303671014071 0ustar u1u1[@Author::PERLANCAR] [-Regexp::Pattern] Regexp-Pattern-0.2.12/dist.ini0000644000175000017500000000044213617303671013550 0ustar u1u1version=0.2.12 name=Regexp-Pattern [Regexp::Pattern] [InsertBlock] [@Author::PERLANCAR] :version=0.594 [Prereqs] perl=5.010001 strict=0 [Prereqs / TestRequires] warnings=0 Test::Exception=0 Test::More=0.98 [Prereqs / DevelopX_spec] -phase=develop -relationship=x_spec DefHash=1.0.11 Regexp-Pattern-0.2.12/META.json0000644000175000017500000005226413617303671013536 0ustar u1u1{ "abstract" : "Convention/framework for modules that contain collection of regexes", "author" : [ "perlancar " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.012, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Regexp-Pattern", "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "develop" : { "requires" : { "Pod::Coverage::TrustPod" : "0", "Test::Perl::Critic" : "0", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.08", "Test::Regexp::Pattern" : "0.005" }, "x_spec" : { "DefHash" : "v1.0.11" } }, "runtime" : { "requires" : { "perl" : "5.010001", "strict" : "0" } }, "test" : { "requires" : { "File::Spec" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Test::Exception" : "0", "Test::More" : "0.98", "warnings" : "0" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://rt.cpan.org/Public/Dist/Display.html?Name=Regexp-Pattern" }, "homepage" : "https://metacpan.org/release/Regexp-Pattern", "repository" : { "type" : "git", "url" : "git://github.com/perlancar/perl-Regexp-Pattern.git", "web" : "https://github.com/perlancar/perl-Regexp-Pattern" } }, "version" : "0.2.12", "x_Dist_Zilla" : { "perl" : { "version" : "5.030000" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::Regexp::Pattern", "name" : "Regexp::Pattern", "version" : "0.005" }, { "class" : "Dist::Zilla::Plugin::InsertBlock", "name" : "InsertBlock", "version" : "0.100" }, { "class" : "Dist::Zilla::Plugin::GatherDir", "config" : { "Dist::Zilla::Plugin::GatherDir" : { "exclude_filename" : [], "exclude_match" : [], "follow_symlinks" : 0, "include_dotfiles" : 0, "prefix" : "", "prune_directory" : [], "root" : "." } }, "name" : "@Author::PERLANCAR/@Filter/GatherDir", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::PruneCruft", "name" : "@Author::PERLANCAR/@Filter/PruneCruft", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::ManifestSkip", "name" : "@Author::PERLANCAR/@Filter/ManifestSkip", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@Author::PERLANCAR/@Filter/MetaYAML", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@Author::PERLANCAR/@Filter/License", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::PodCoverageTests", "name" : "@Author::PERLANCAR/@Filter/PodCoverageTests", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@Author::PERLANCAR/@Filter/PodSyntaxTests", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::ExtraTests", "name" : "@Author::PERLANCAR/@Filter/ExtraTests", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::ExecDir", "name" : "@Author::PERLANCAR/@Filter/ExecDir", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::ShareDir", "name" : "@Author::PERLANCAR/@Filter/ShareDir", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 1 } }, "name" : "@Author::PERLANCAR/@Filter/MakeMaker", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@Author::PERLANCAR/@Filter/Manifest", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@Author::PERLANCAR/@Filter/ConfirmRelease", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FileFinder::ByName", "name" : "@Author::PERLANCAR/FileFinder::ByName PERLANCAR", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::ExecDir", "name" : "@Author::PERLANCAR/ExecDir script", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::PERLANCAR::BeforeBuild", "name" : "@Author::PERLANCAR/PERLANCAR::BeforeBuild", "version" : "0.599" }, { "class" : "Dist::Zilla::Plugin::Rinci::AbstractFromMeta", "name" : "@Author::PERLANCAR/Rinci::AbstractFromMeta", "version" : "0.10" }, { "class" : "Dist::Zilla::Plugin::PodnameFromFilename", "name" : "@Author::PERLANCAR/PodnameFromFilename", "version" : "0.02" }, { "class" : "Dist::Zilla::Plugin::PERLANCAR::EnsurePrereqToSpec", "name" : "@Author::PERLANCAR/PERLANCAR::EnsurePrereqToSpec", "version" : "0.060" }, { "class" : "Dist::Zilla::Plugin::PERLANCAR::MetaResources", "name" : "@Author::PERLANCAR/PERLANCAR::MetaResources", "version" : "0.040" }, { "class" : "Dist::Zilla::Plugin::CheckChangeLog", "name" : "@Author::PERLANCAR/CheckChangeLog", "version" : "0.05" }, { "class" : "Dist::Zilla::Plugin::CheckMetaResources", "name" : "@Author::PERLANCAR/CheckMetaResources", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::CheckSelfDependency", "config" : { "Dist::Zilla::Plugin::CheckSelfDependency" : { "finder" : [ ":InstallModules" ] }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000036", "version" : "0.006" } }, "name" : "@Author::PERLANCAR/CheckSelfDependency", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::CopyrightYearFromGit", "name" : "@Author::PERLANCAR/CopyrightYearFromGit", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::IfBuilt", "name" : "@Author::PERLANCAR/IfBuilt", "version" : "0.02" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@Author::PERLANCAR/MetaJSON", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@Author::PERLANCAR/MetaConfig", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::Authority", "name" : "@Author::PERLANCAR/Authority", "version" : "1.009" }, { "class" : "Dist::Zilla::Plugin::OurDate", "name" : "@Author::PERLANCAR/OurDate", "version" : "0.03" }, { "class" : "Dist::Zilla::Plugin::OurDist", "name" : "@Author::PERLANCAR/OurDist", "version" : "0.02" }, { "class" : "Dist::Zilla::Plugin::OurPkgVersion", "name" : "@Author::PERLANCAR/OurPkgVersion", "version" : "0.21" }, { "class" : "Dist::Zilla::Plugin::PodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "finder" : [ ":InstallModules", ":ExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@CorePrep/EnsurePod5", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@CorePrep/H1Nester", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Name", "name" : "@Author::PERLANCAR/Name", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Version", "name" : "@Author::PERLANCAR/Version", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::PERLANCAR/prelude", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "SYNOPSIS", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "DESCRIPTION", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "OVERVIEW", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "ATTRIBUTES", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "METHODS", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "FUNCTIONS", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "@Author::PERLANCAR/Leftovers", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::PERLANCAR/postlude", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Completion::GetoptLongComplete", "name" : "@Author::PERLANCAR/Completion::GetoptLongComplete", "version" : "0.08" }, { "class" : "Pod::Weaver::Section::Completion::GetoptLongSubcommand", "name" : "@Author::PERLANCAR/Completion::GetoptLongSubcommand", "version" : "0.04" }, { "class" : "Pod::Weaver::Section::Completion::GetoptLongMore", "name" : "@Author::PERLANCAR/Completion::GetoptLongMore", "version" : "0.001" }, { "class" : "Pod::Weaver::Section::Homepage::DefaultCPAN", "name" : "@Author::PERLANCAR/Homepage::DefaultCPAN", "version" : "0.05" }, { "class" : "Pod::Weaver::Section::Source::DefaultGitHub", "name" : "@Author::PERLANCAR/Source::DefaultGitHub", "version" : "0.07" }, { "class" : "Pod::Weaver::Section::Bugs::DefaultRT", "name" : "@Author::PERLANCAR/Bugs::DefaultRT", "version" : "0.06" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "@Author::PERLANCAR/Authors", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "@Author::PERLANCAR/Legal", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::Rinci", "name" : "@Author::PERLANCAR/Rinci", "version" : "0.780" }, { "class" : "Pod::Weaver::Plugin::AppendPrepend", "name" : "@Author::PERLANCAR/AppendPrepend", "version" : "0.01" }, { "class" : "Pod::Weaver::Plugin::EnsureUniqueSections", "name" : "@Author::PERLANCAR/EnsureUniqueSections", "version" : "0.163250" }, { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "@Author::PERLANCAR/SingleEncoding", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::PERLANCAR::SortSections", "name" : "@Author::PERLANCAR/PERLANCAR::SortSections", "version" : "0.07" }, { "class" : "Pod::Weaver::Plugin::Regexp::Pattern", "name" : "-Regexp::Pattern", "version" : "0.004" } ] } }, "name" : "@Author::PERLANCAR/PodWeaver", "version" : "4.008" }, { "class" : "Dist::Zilla::Plugin::PruneFiles", "name" : "@Author::PERLANCAR/PruneFiles", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::Pod2Readme", "name" : "@Author::PERLANCAR/Pod2Readme", "version" : "0.004" }, { "class" : "Dist::Zilla::Plugin::Rinci::AddPrereqs", "name" : "@Author::PERLANCAR/Rinci::AddPrereqs", "version" : "0.144" }, { "class" : "Dist::Zilla::Plugin::Rinci::AddToDb", "name" : "@Author::PERLANCAR/Rinci::AddToDb", "version" : "0.020" }, { "class" : "Dist::Zilla::Plugin::Rinci::EmbedValidator", "name" : "@Author::PERLANCAR/Rinci::EmbedValidator", "version" : "0.250" }, { "class" : "Dist::Zilla::Plugin::SetScriptShebang", "name" : "@Author::PERLANCAR/SetScriptShebang", "version" : "0.01" }, { "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" : [ ":PerlExecFiles" ], "skips" : [], "switch" : [] } }, "name" : "@Author::PERLANCAR/Test::Compile", "version" : "2.058" }, { "class" : "Dist::Zilla::Plugin::Test::Perl::Critic::Subset", "config" : { "Dist::Zilla::Plugin::Test::Perl::Critic::Subset" : { "finder" : [ "@Author::PERLANCAR/FileFinder::ByName PERLANCAR" ] } }, "name" : "@Author::PERLANCAR/Test::Perl::Critic::Subset", "version" : "3.001.003" }, { "class" : "Dist::Zilla::Plugin::Test::Rinci", "name" : "@Author::PERLANCAR/Test::Rinci", "version" : "0.040" }, { "class" : "Dist::Zilla::Plugin::StaticInstall", "config" : { "Dist::Zilla::Plugin::StaticInstall" : { "dry_run" : 0, "mode" : "on" } }, "name" : "@Author::PERLANCAR/StaticInstall", "version" : "0.012" }, { "class" : "Dist::Zilla::Plugin::EnsureSQLSchemaVersionedTest", "name" : "@Author::PERLANCAR/EnsureSQLSchemaVersionedTest", "version" : "0.03" }, { "class" : "Dist::Zilla::Plugin::Acme::CPANModules::Blacklist", "name" : "@Author::PERLANCAR/Acme::CPANModules::Blacklist", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::Prereqs::EnsureVersion", "name" : "@Author::PERLANCAR/Prereqs::EnsureVersion", "version" : "0.050" }, { "class" : "Dist::Zilla::Plugin::Prereqs::CheckCircular", "name" : "@Author::PERLANCAR/Prereqs::CheckCircular", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN::WWWPAUSESimple", "name" : "@Author::PERLANCAR/UploadToCPAN::WWWPAUSESimple", "version" : "0.04" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "Prereqs", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "test", "type" : "requires" } }, "name" : "TestRequires", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "x_spec" } }, "name" : "DevelopX_spec", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExtraTestFiles", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":PerlExecFiles", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "6.012" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "6.012" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : 0 }, "version" : "6.012" } }, "x_authority" : "cpan:PERLANCAR", "x_generated_by_perl" : "v5.30.0", "x_serialization_backend" : "Cpanel::JSON::XS version 4.12", "x_static_install" : 1 } Regexp-Pattern-0.2.12/t/0000775000175000017500000000000013617303671012351 5ustar u1u1Regexp-Pattern-0.2.12/t/author-pod-syntax.t0000644000175000017500000000045413617303671016145 0ustar u1u1#!perl BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use strict; use warnings; use Test::More; use Test::Pod 1.41; all_pod_files_ok(); Regexp-Pattern-0.2.12/t/01-basic.t0000644000175000017500000001055413617303671014040 0ustar u1u1#!perl use strict; use warnings; use Test::Exception; use Test::More 0.98; use Regexp::Pattern 're', 'Example::re1'; subtest "sub interface" => sub { dies_ok { re("Example::foo") } "get unknown -> dies"; subtest "static" => sub { my $re1 = re("Example::re1"); ok $re1; ok('123-456' =~ $re1); ok(' 123-456' =~ $re1); ok(!('foo' =~ $re1)); }; subtest "dynamic" => sub { my $re3a = re("Example::re3", variant => 'A'); ok $re3a; ok('123-456' =~ $re3a); ok(!('foo' =~ $re3a)); my $re3b = re("Example::re3", variant => 'B'); ok $re3b; ok('123-45-67890' =~ $re3b); ok(!('123-456' =~ $re3b)); }; subtest "-anchor option" => sub { my $re1 = re("Example::re1", -anchor=>1); ok $re1; ok('123-456' =~ $re1); ok(!(' 123-456' =~ $re1)); }; }; subtest "hash interface" => sub { dies_ok { Regexp::Pattern->import("foo") } "invalid import 1"; subtest "basic" => sub { %RE = (); Regexp::Pattern->import('Example::re1'); is_deeply([sort keys %RE], [qw/re1/]); dies_ok { Regexp::Pattern->import('Example::foo bar') } "invalid import 2"; # subsequent imports do not remove prior regexps Regexp::Pattern->import('Example::re2'); is_deeply([sort keys %RE], [qw/re1 re2/]); Regexp::Pattern->import('Example::re3'); ok('123-456' =~ $RE{re3}); ok(!('foo' =~ $RE{re3})); Regexp::Pattern->import('Example::re3' => (variant=>"B")); is_deeply([sort keys %RE], [qw/re1 re2 re3/]); ok('123-45-67890' =~ $RE{re3}); ok(!('123-456' =~ $RE{re3})); }; subtest "wildcard" => sub { %RE = (); Regexp::Pattern->import('Example::*'); is_deeply([sort keys %RE], [qw/re1 re2 re3 re4 re5/]); }; subtest "-as" => sub { %RE = (); Regexp::Pattern->import('Example::re1' => (-as=>"foo")); is_deeply([sort keys %RE], [qw/foo/]); dies_ok { Regexp::Pattern->import('Example::*' => (-as=>"foo")) } "-as cannot be used on a wildcard import"; dies_ok { Regexp::Pattern->import('Example::re1' => (-as=>"re one")) } "-as has to be simple identifier"; }; subtest "-prefix and -suffix" => sub { %RE = (); Regexp::Pattern->import('Example::*' => (-prefix=>"p_")); is_deeply([sort keys %RE], [qw/p_re1 p_re2 p_re3 p_re4 p_re5/]); # can also be applied to a single pattern %RE = (); Regexp::Pattern->import('Example::re2' => (-prefix=>"q_")); is_deeply([sort keys %RE], [qw/q_re2/]); %RE = (); Regexp::Pattern->import('Example::*' => (-suffix=>"_b")); is_deeply([sort keys %RE], [qw/re1_b re2_b re3_b re4_b re5_b/]); # combo of prefix & suffix %RE = (); Regexp::Pattern->import('Example::*' => (-prefix=>"a_", -suffix=>"_b")); is_deeply([sort keys %RE], [qw/a_re1_b a_re2_b a_re3_b a_re4_b a_re5_b/]); }; subtest "-has_tag, -lacks_tag, -has_tag_matching, -lacks_tag_matching" => sub { %RE = (); Regexp::Pattern->import('Example::*' => (-has_tag=>"A")); is_deeply([sort keys %RE], [qw/re2/]); %RE = (); Regexp::Pattern->import('Example::*' => (-has_tag=>"B")); is_deeply([sort keys %RE], [qw/re2 re3/]); %RE = (); Regexp::Pattern->import('Example::*' => (-has_tag=>"D")); is_deeply([sort keys %RE], [qw//]); %RE = (); Regexp::Pattern->import('Example::*' => (-lacks_tag=>"A")); is_deeply([sort keys %RE], [qw/re1 re3 re4 re5/]); %RE = (); Regexp::Pattern->import('Example::*' => (-has_tag=>"B", -lacks_tag=>"A")); is_deeply([sort keys %RE], [qw/re3/]); %RE = (); Regexp::Pattern->import('Example::*' => (-has_tag_matching=>qr/[AB]/)); is_deeply([sort keys %RE], [qw/re2 re3/]); %RE = (); Regexp::Pattern->import('Example::*' => (-lacks_tag_matching=>qr/[AB]/)); is_deeply([sort keys %RE], [qw/re1 re4 re5/]); %RE = (); Regexp::Pattern->import('Example::*' => (-has_tag_matching=>'A|B', -lacks_tag_matching=>'[XA]')); is_deeply([sort keys %RE], [qw/re3/]); }; dies_ok { Regexp::Pattern->import("Example::re1" => (-foo=>1)) } "unknown options"; }; done_testing; Regexp-Pattern-0.2.12/t/author-pod-coverage.t0000644000175000017500000000053613617303671016413 0ustar u1u1#!perl BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } # This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests. use Test::Pod::Coverage 1.08; use Pod::Coverage::TrustPod; all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); Regexp-Pattern-0.2.12/t/00-compile.t0000644000175000017500000000270013617303671014400 0ustar u1u1use 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.058 use Test::More; plan tests => 2 + ($ENV{AUTHOR_TESTING} ? 1 : 0); my @module_files = ( 'Regexp/Pattern.pm', 'Regexp/Pattern/Example.pm' ); # no fake home requested my @switches = ( -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 my $stderr = IO::Handle->new; diag('Running: ', join(', ', map { my $str = $_; $str =~ s/'/\\'/g; q{'} . $str . q{'} } $^X, @switches, '-e', "require q[$lib]")) if $ENV{PERL_COMPILE_TEST_DEBUG}; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, @switches, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); shift @_warnings if @_warnings and $_warnings[0] =~ /^Using .*\bblib/ and not eval { +require blib; blib->VERSION('1.01') }; if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', ( Test::More->can('explain') ? Test::More::explain(\@warnings) : join("\n", '', @warnings) ) if $ENV{AUTHOR_TESTING}; Regexp-Pattern-0.2.12/t/release-regexp-pattern.t0000644000175000017500000000063613617303671017124 0ustar u1u1#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } # This file was automatically generated by Dist::Zilla::Plugin::Regexp::Pattern. use Test::More; eval "use Test::Regexp::Pattern 0.001"; plan skip_all => "Test::Regexp::Pattern 0.001+ required for testing regexp patterns" if $@; regexp_patterns_in_all_modules_ok(); Regexp-Pattern-0.2.12/t/author-critic.t0000644000175000017500000000076313617303671015317 0ustar u1u1#!perl BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Perl::Critic::Subset 3.001.003 use Test::Perl::Critic (-profile => "") x!! -e ""; my $filenames = ['lib/Regexp/Pattern.pm','lib/Regexp/Pattern/Example.pm']; unless ($filenames && @$filenames) { $filenames = -d "blib" ? ["blib"] : ["lib"]; } all_critic_ok(@$filenames); Regexp-Pattern-0.2.12/LICENSE0000644000175000017500000004376513617303671013130 0ustar u1u1This software is copyright (c) 2020, 2019, 2018, 2016 by perlancar@cpan.org. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2020, 2019, 2018, 2016 by perlancar@cpan.org. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright (c) 2020, 2019, 2018, 2016 by perlancar@cpan.org. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Regexp-Pattern-0.2.12/lib/0000775000175000017500000000000013617303671012654 5ustar u1u1Regexp-Pattern-0.2.12/lib/Regexp/0000775000175000017500000000000013617303671014106 5ustar u1u1Regexp-Pattern-0.2.12/lib/Regexp/Pattern/0000775000175000017500000000000013617303671015523 5ustar u1u1Regexp-Pattern-0.2.12/lib/Regexp/Pattern/Example.pm0000644000175000017500000001404613617303671017457 0ustar u1u1package Regexp::Pattern::Example; our $DATE = '2020-02-07'; # DATE our $VERSION = '0.2.12'; # VERSION use 5.010001; # BEGIN_BLOCK: def our %RE = ( # the minimum spec re1 => { pat => qr/\d{3}-\d{3}/ }, # more complete spec re2 => { summary => 'This is regexp for blah', # plaintext description => <<'_', A longer description in *Markdown* format. _ pat => qr/\d{3}-\d{3}(?:-\d{5})?/, tags => ['A','B'], examples => [ # examples can be tested using 'test-regexp-pattern' script # (distributed in Test-Regexp-Pattern distribution). examples can # also be rendered in your POD using # Pod::Weaver::Plugin::Regexp::Pattern. { str => '123-456', matches => 1, }, { summary => 'Another example that matches', str => '123-456-78901', matches => 1, }, { summary => 'An example that does not match', str => '123456', matches => 0, }, { summary => 'An example that does not get tested', str => '123456', }, { summary => 'Another example that does not get tested nor rendered to POD', str => '234567', matches => 0, test => 0, doc => 0, }, ], }, # dynamic (regexp generator) re3 => { summary => 'This is a regexp for blah blah', description => <<'_', ... _ gen => sub { my %args = @_; my $variant = $args{variant} || 'A'; if ($variant eq 'A') { return qr/\d{3}-\d{3}/; } else { # B return qr/\d{3}-\d{2}-\d{5}/; } }, gen_args => { variant => { summary => 'Choose variant', schema => ['str*', in=>['A','B']], default => 'A', req => 1, }, }, tags => ['B','C'], examples => [ { summary => 'An example that matches', gen_args => {variant=>'A'}, str => '123-456', matches => 1, }, { summary => "An example that doesn't match", gen_args => {variant=>'B'}, str => '123-456', matches => 0, }, ], }, re4 => { summary => 'This is a regexp that does capturing', # it is recommended that your pattern does not capture, unless # necessary. capturing pattern should tag with 'capturing' to let # users/tools know. tags => ['capturing'], pat => qr/(\d{3})-(\d{3})/, examples => [ {str=>'123-456', matches=>[123, 456]}, {str=>'foo-bar', matches=>[]}, ], }, re5 => { summary => 'This is another regexp that is anchored and does (named) capturing', # it is recommended that your pattern is not anchored for more # reusability, unless necessary. anchored pattern should tag with # 'anchored' to let users/tools know. tags => ['capturing', 'anchored'], pat => qr/^(?\d{3})-(?\d{3})/, examples => [ {str=>'123-456', matches=>{cap1=>123, cap2=>456}}, {str=>'something 123-456', matches=>{}}, ], }, ); # END_BLOCK: def 1; # ABSTRACT: An example Regexp::Pattern::* module __END__ =pod =encoding UTF-8 =head1 NAME Regexp::Pattern::Example - An example Regexp::Pattern::* module =head1 VERSION This document describes version 0.2.12 of Regexp::Pattern::Example (from Perl distribution Regexp-Pattern), released on 2020-02-07. =head1 SYNOPSIS use Regexp::Pattern; # exports re() my $re = re("Example::re1"); =head1 DESCRIPTION L is a convention for organizing reusable regex patterns. =head1 PATTERNS =over =item * re1 =item * re2 This is regexp for blah. A longer description in I format. Examples: "123-456" =~ re("Example::re2"); # matches Another example that matches. "123-456-78901" =~ re("Example::re2"); # matches An example that does not match. 123456 =~ re("Example::re2"); # doesn't match An example that does not get tested. 123456 =~ re("Example::re2"); # doesn't match =item * re3 This is a regexp for blah blah. ... This is a dynamic pattern which will be generated on-demand. The following arguments are available to customize the generated pattern: =over =item * variant Choose variant. =back Examples: An example that matches. "123-456" =~ re("Example::re3", {variant=>"A"}); # matches An example that doesn't match. "123-456" =~ re("Example::re3", {variant=>"B"}); # doesn't match =item * re4 This is a regexp that does capturing. Examples: "123-456" =~ re("Example::re4"); # matches, $1=123, $2=456 "foo-bar" =~ re("Example::re4"); # doesn't match =item * re5 This is another regexp that is anchored and does (named) capturing. Examples: "123-456" =~ re("Example::re5"); # matches, $+{"cap1"}=123, $+{"cap2"}=456 "something 123-456" =~ re("Example::re5"); # doesn't match =back =head1 HOMEPAGE Please visit the project's homepage at L. =head1 SOURCE Source repository is at L. =head1 BUGS Please report any bugs or feature requests on the bugtracker website L When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. =head1 AUTHOR perlancar =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2020, 2019, 2018, 2016 by perlancar@cpan.org. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Regexp-Pattern-0.2.12/lib/Regexp/Pattern.pm0000644000175000017500000004445213617303671016070 0ustar u1u1package Regexp::Pattern; our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY our $DATE = '2020-02-07'; # DATE our $DIST = 'Regexp-Pattern'; # DIST our $VERSION = '0.2.12'; # VERSION use strict 'subs', 'vars'; #use warnings; sub re { my $name = shift; my %args = ref($_[0]) eq 'HASH' ? %{$_[0]} : @_; my ($mod, $patname) = $name =~ /(.+)::(.+)/ or die "Invalid pattern name '$name', should be 'MODNAME::PATNAME'"; $mod = "Regexp::Pattern::$mod"; (my $mod_pm = "$mod.pm") =~ s!::!/!g; require $mod_pm; my $var = \%{"$mod\::RE"}; exists($var->{$patname}) or die "No regexp pattern named '$patname' in package '$mod'"; my $pat; if ($var->{$patname}{pat}) { $pat = $var->{$patname}{pat}; } elsif ($var->{$patname}{gen}) { $pat = $var->{$patname}{gen}->(%args); } else { die "Bug in module '$mod': pattern '$patname': no pat/gen declared"; } if ($args{-anchor}) { $pat = qr/\A(?:$pat)\z/; } return $pat; } sub import { my $package = shift; my $caller = caller(); my @args = @_; @args = ('re') unless @args; while (@args) { my $arg = shift @args; my ($mod, $name0, $as, $prefix, $suffix, $has_tag, $lacks_tag, $has_tag_matching, $lacks_tag_matching, $gen_args); if ($arg eq 're') { *{"$caller\::re"} = \&re; next; } elsif ($arg =~ /\A(\w+(?:::\w+)*)::(\w+|\*)\z/) { ($mod, $name0) = ($1, $2); ($as, $prefix, $suffix, $has_tag, $lacks_tag, $has_tag_matching, $lacks_tag_matching) = (undef, undef, undef, undef, undef); $gen_args = {}; while (@args >= 2 && $args[0] =~ /\A-?\w+\z/) { my ($k, $v) = splice @args, 0, 2; if ($k eq '-as') { die "Cannot use -as on a wildcard import '$arg'" if $name0 eq '*'; die "Please use a simple identifier for value of -as" unless $v =~ /\A\w+\z/; $as = $v; } elsif ($k eq '-prefix') { $prefix = $v; } elsif ($k eq '-suffix') { $suffix = $v; } elsif ($k eq '-has_tag') { $has_tag = $v; } elsif ($k eq '-lacks_tag') { $lacks_tag = $v; } elsif ($k eq '-has_tag_matching') { $has_tag_matching = ref $v eq 'Regexp' ? $v : qr/$v/; } elsif ($k eq '-lacks_tag_matching') { $lacks_tag_matching = ref $v eq 'Regexp' ? $v : qr/$v/; } elsif ($k !~ /\A-/) { $gen_args->{$k} = $v; } else { die "Unknown import option '$k'"; } } } else { die "Invalid import '$arg', either specify 're' or a qualified ". "pattern name e.g. 'Foo::bar', which can be followed by ". "name-value pairs"; } *{"$caller\::RE"} = \%{"$caller\::RE"}; my @names; if ($name0 eq '*') { my $mod = "Regexp::Pattern::$mod"; (my $mod_pm = "$mod.pm") =~ s!::!/!g; require $mod_pm; my $var = \%{"$mod\::RE"}; for my $n (sort keys %$var) { my $tags = $var->{$n}{tags} || []; if (defined $has_tag) { next unless grep { $_ eq $has_tag } @$tags; } if (defined $lacks_tag) { next if grep { $_ eq $lacks_tag } @$tags; } if (defined $has_tag_matching) { next unless grep { $_ =~ $has_tag_matching } @$tags; } if (defined $lacks_tag_matching) { next if grep { $_ =~ $lacks_tag_matching } @$tags; } push @names, $n; } unless (@names) { warn "No patterns imported in wildcard import '$mod\::*'"; } } else { @names = ($name0); } for my $n (@names) { my $name = defined($as) ? $as : (defined $prefix ? $prefix : "") . $n . (defined $suffix ? $suffix : ""); if (exists ${"$caller\::RE"}{$name}) { warn "Overwriting pattern '$name' by importing '$mod\::$n'"; } ${"$caller\::RE"}{$name} = re("$mod\::$n", $gen_args); } } } 1; # ABSTRACT: Convention/framework for modules that contain collection of regexes __END__ =pod =encoding UTF-8 =head1 NAME Regexp::Pattern - Convention/framework for modules that contain collection of regexes =head1 SPECIFICATION VERSION 0.2 =head1 VERSION This document describes version 0.2.12 of Regexp::Pattern (from Perl distribution Regexp-Pattern), released on 2020-02-07. =head1 SYNOPSIS Subroutine interface: use Regexp::Pattern; # exports re() my $re = re('YouTube::video_id'); say "ID does not look like a YouTube video ID" unless $id =~ /\A$re\z/; # a dynamic pattern (generated on-demand) with generator arguments my $re2 = re('Example::re3', {variant=>"B"}); Hash interface (a la L but simpler with regular/non-magical hash that is only 1-level deep): use Regexp::Pattern 'YouTube::video_id'; say "ID does not look like a YouTube video ID" unless $id =~ /\A$RE{video_id}\z/; # more complex example use Regexp::Pattern ( 're', # we still want the re() function 'Foo::bar' => (-as => 'qux'), # the pattern will be in your $RE{qux} 'YouTube::*', # wildcard import 'Example::re3' => (variant => 'B'), # supply generator arguments 'JSON::*' => (-prefix => 'json_'), # add prefix 'License::*' => ( # filtering options -has_tag => 'family:cc', # only select patterns that has this tag -lacks_tag => 'type:unversioned', # only select patterns that does not have this tag -has_tag_matching => qr/^type:/, # only select patterns that has a tag matching this regex -lacks_tag_matching => qr/^type:/, # only select patterns that does not have any tags matching this regex # other options -prefix => 'pat_', # add prefix -suffix => '_license', # add suffix ), ); =head1 DESCRIPTION Regexp::Pattern is a convention for organizing reusable regexp patterns in modules, as well as framework to provide convenience in using those patterns in your program. =head2 Structure of an example Regexp::Pattern::* module package Regexp::Pattern::Example; our %RE = ( # the minimum spec re1 => { pat => qr/\d{3}-\d{3}/ }, # more complete spec re2 => { summary => 'This is regexp for blah', # plaintext description => <<'_', A longer description in *Markdown* format. _ pat => qr/\d{3}-\d{3}(?:-\d{5})?/, tags => ['A','B'], examples => [ # examples can be tested using 'test-regexp-pattern' script # (distributed in Test-Regexp-Pattern distribution). examples can # also be rendered in your POD using # Pod::Weaver::Plugin::Regexp::Pattern. { str => '123-456', matches => 1, }, { summary => 'Another example that matches', str => '123-456-78901', matches => 1, }, { summary => 'An example that does not match', str => '123456', matches => 0, }, { summary => 'An example that does not get tested', str => '123456', }, { summary => 'Another example that does not get tested nor rendered to POD', str => '234567', matches => 0, test => 0, doc => 0, }, ], }, # dynamic (regexp generator) re3 => { summary => 'This is a regexp for blah blah', description => <<'_', ... _ gen => sub { my %args = @_; my $variant = $args{variant} || 'A'; if ($variant eq 'A') { return qr/\d{3}-\d{3}/; } else { # B return qr/\d{3}-\d{2}-\d{5}/; } }, gen_args => { variant => { summary => 'Choose variant', schema => ['str*', in=>['A','B']], default => 'A', req => 1, }, }, tags => ['B','C'], examples => [ { summary => 'An example that matches', gen_args => {variant=>'A'}, str => '123-456', matches => 1, }, { summary => "An example that doesn't match", gen_args => {variant=>'B'}, str => '123-456', matches => 0, }, ], }, re4 => { summary => 'This is a regexp that does capturing', # it is recommended that your pattern does not capture, unless # necessary. capturing pattern should tag with 'capturing' to let # users/tools know. tags => ['capturing'], pat => qr/(\d{3})-(\d{3})/, examples => [ {str=>'123-456', matches=>[123, 456]}, {str=>'foo-bar', matches=>[]}, ], }, re5 => { summary => 'This is another regexp that is anchored and does (named) capturing', # it is recommended that your pattern is not anchored for more # reusability, unless necessary. anchored pattern should tag with # 'anchored' to let users/tools know. tags => ['capturing', 'anchored'], pat => qr/^(?\d{3})-(?\d{3})/, examples => [ {str=>'123-456', matches=>{cap1=>123, cap2=>456}}, {str=>'something 123-456', matches=>{}}, ], }, ); A Regexp::Pattern::* module must declare a package global hash variable named C<%RE>. Hash keys are pattern names, hash values are pattern definitions in the form of defhashes (see L). Pattern name should be a simple identifier that matches this regexp: C<< /\A[A-Za-z_][A-Za-z_0-9]*\z/ >>. The definition for the qualified pattern name C can then be located in C<%Regexp::Pattern::Foo::Bar::RE> under the hash key C. Pattern definition hash should at the minimum be: { pat => qr/.../ } You can add more stuffs from the defhash specification, e.g. summary, description, tags, and so on, for example (taken from L): { summary => 'PAUSE author ID, or PAUSE ID for short', pat => qr/[A-Z][A-Z0-9]{1,8}/, description => <<~HERE, I'm not sure whether PAUSE allows digit for the first letter. For safety I'm assuming no. HERE examples => [ {str=>'PERLANCAR', matches=>1}, {str=>'BAD ID', anchor=>1, matches=>0}, ], } B. Your regexp specification can include an C property (see above for example). The value of the C property is an array, each of which should be a defhash. For each example, at the minimum you should specify C (string to be matched by the regexp), C (hash, arguments to use when generating dynamic regexp pattern), and C (a boolean value that specifies whether the regexp should match the string or not, or an array/hash that specifies the captures). You can of course specify other defhash properties (e.g. C, C, etc). Other example properties might be introduced in the future. If you use L to build your distribution, you can use the plugin L<[Regexp::Pattern]|Dist::Zilla::Plugin::Regexp::Pattern> to test the examples during building, and the L plugin L<[-Regexp::Pattern]|Pod::Weaver::Plugin::Regexp::Pattern> to render the examples in your POD. =head2 Using a Regexp::Pattern::* module =head3 Standalone A Regexp::Pattern::* module can be used in a standalone way (i.e. no need to use via the Regexp::Pattern framework), as it simply contains data that can be grabbed using a normal means, e.g.: use Regexp::Pattern::Example; say "Input does not match blah" unless $input =~ /\A$Regexp::Pattern::Example::RE{re1}{pat}\z/; =head3 Via Regexp::Pattern, sub interface Regexp::Pattern (this module) also provides C function to help retrieve the regexp pattern. See L for more details. =head3 Via Regexp::Pattern, hash interface Additionally, Regexp::Pattern (since v0.2.0) lets you import regexp patterns into your C<%RE> package hash variable, a la L (but simpler because the hash is just a regular hash, only 1-level deep, and not magical). To import, you specify qualified pattern names as the import arguments: use Regexp::Pattern 'Q::pat1', 'Q::pat2', ...; Each qualified pattern name can optionally be followed by a list of name-value pairs. A pair name can be an option name (which is dash followed by a word, e.g. C<-as>, C<-prefix>) or a generator argument name for dynamic pattern. B Instead of a qualified pattern name, you can use 'Module::SubModule::*' wildcard syntax to import all patterns from a pattern module. B You can add the import option C<-as> to import into a different name, for example: use Regexp::Pattern 'YouTube::video_id' => (-as => 'yt_id'); B You can also add a prefix and/or suffix to the imported name: use Regexp::Pattern 'Example::*' => (-prefix => 'example_'); use Regexp::Pattern 'Example::*' => (-suffix => '_sample'); B When wildcard-importing, you can select the patterns you want using a combination of these options: C<-has_tag> (only select patterns that have a specified tag), C<-lacks_tag> (only select patterns that do not have a specified tag), C<-has_tag_matching> (only select patterns that has at least one tag matching specified regex pattern), C<-lacks_tag_matching> (only select patterns that does not have any tags matching specified regex pattern). =head2 Recommendations for writing the regex patterns =over =item * Regexp pattern should be written as a C literal Using a string literal is less desirable. That is: pat => qr/foo[abc]+/, is preferred over: pat => 'foo[abc]+', =item * Regexp pattern should not be anchored (unless really necessary) That is: pat => qr/foo/, is preferred over: pat => qr/^foo/, # or qr/foo$/, or qr/\Afoo\z/ Adding anchors limits the reusability of the pattern. When composing pattern, user can add anchors herself if needed. When you define an anchored pattern, adding tag C is recommended: tags => ['anchored'], =item * Regexp pattern should not contain capture groups (unless really necessary) Adding capture groups limits the reusability of the pattern because it can affect the groups of the composed pattern. When composing pattern, user can add captures herself if needed. When you define a capturing pattern, adding tag C is recommended: tags => ['capturing'], =back =head1 FUNCTIONS =head2 re Exported by default. Get a regexp pattern by name from a C module. Usage: re($name[, \%args ]) => $re C<$name> is I where I is name of a C module without the C prefix and I is a key to the C<%RE> package global hash in the module. A dynamic pattern can accept arguments for its generator, and you can pass it as hashref in the second argument of C. B You can also put C<< -anchor => 1 >> in C<%args>. This will conveniently wraps the regex inside C<< qr/\A(?:...)\z/ >>. Die when pattern by name C<$name> cannot be found (either the module cannot be loaded or the pattern with that name is not found in the module). =head1 FAQ =head2 My pattern is not anchored, but what if I want to test the anchored version? You can add C<< anchor=>1 >> or C<< gen_args=>{-anchor=>1} >> in the example, for example: { summary => 'PAUSE author ID, or PAUSE ID for short', pat => qr/[A-Z][A-Z0-9]{1,8}/, description => <<~HERE, I'm not sure whether PAUSE allows digit for the first letter. For safety I'm assuming no. HERE examples => [ {str=>'PERLANCAR', matches=>1}, {str=>'BAD ID', anchor=>1, matches=>0, summary=>"Contains whitespace"}, {str=>'NAMETOOLONG', gen_args=>{-anchor=>1}, matches=>0, summary=>"Too long"}, ], } =head1 HOMEPAGE Please visit the project's homepage at L. =head1 SOURCE Source repository is at L. =head1 BUGS Please report any bugs or feature requests on the bugtracker website L When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. =head1 SEE ALSO L. Regexp::Pattern is an alternative to Regexp::Common. Regexp::Pattern offers simplicity and lower startup overhead. Instead of a magic hash, you retrieve available regexes from normal data structure or via the provided C function. Regexp::Pattern also provides a hash interface, albeit the hash is not magic. L, a bridge module to use patterns in C modules via Regexp::Common. L, a bridge module to use patterns in C modules via Regexp::Pattern. L If you use L: L, L, L, L. L and L. =head1 AUTHOR perlancar =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2020, 2019, 2018, 2016 by perlancar@cpan.org. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Regexp-Pattern-0.2.12/README0000644000175000017500000003502613617303671012772 0ustar u1u1NAME Regexp::Pattern - Convention/framework for modules that contain collection of regexes SPECIFICATION VERSION 0.2 VERSION This document describes version 0.2.12 of Regexp::Pattern (from Perl distribution Regexp-Pattern), released on 2020-02-07. SYNOPSIS Subroutine interface: use Regexp::Pattern; # exports re() my $re = re('YouTube::video_id'); say "ID does not look like a YouTube video ID" unless $id =~ /\A$re\z/; # a dynamic pattern (generated on-demand) with generator arguments my $re2 = re('Example::re3', {variant=>"B"}); Hash interface (a la Regexp::Common but simpler with regular/non-magical hash that is only 1-level deep): use Regexp::Pattern 'YouTube::video_id'; say "ID does not look like a YouTube video ID" unless $id =~ /\A$RE{video_id}\z/; # more complex example use Regexp::Pattern ( 're', # we still want the re() function 'Foo::bar' => (-as => 'qux'), # the pattern will be in your $RE{qux} 'YouTube::*', # wildcard import 'Example::re3' => (variant => 'B'), # supply generator arguments 'JSON::*' => (-prefix => 'json_'), # add prefix 'License::*' => ( # filtering options -has_tag => 'family:cc', # only select patterns that has this tag -lacks_tag => 'type:unversioned', # only select patterns that does not have this tag -has_tag_matching => qr/^type:/, # only select patterns that has a tag matching this regex -lacks_tag_matching => qr/^type:/, # only select patterns that does not have any tags matching this regex # other options -prefix => 'pat_', # add prefix -suffix => '_license', # add suffix ), ); DESCRIPTION Regexp::Pattern is a convention for organizing reusable regexp patterns in modules, as well as framework to provide convenience in using those patterns in your program. Structure of an example Regexp::Pattern::* module package Regexp::Pattern::Example; our %RE = ( # the minimum spec re1 => { pat => qr/\d{3}-\d{3}/ }, # more complete spec re2 => { summary => 'This is regexp for blah', # plaintext description => <<'_', A longer description in *Markdown* format. _ pat => qr/\d{3}-\d{3}(?:-\d{5})?/, tags => ['A','B'], examples => [ # examples can be tested using 'test-regexp-pattern' script # (distributed in Test-Regexp-Pattern distribution). examples can # also be rendered in your POD using # Pod::Weaver::Plugin::Regexp::Pattern. { str => '123-456', matches => 1, }, { summary => 'Another example that matches', str => '123-456-78901', matches => 1, }, { summary => 'An example that does not match', str => '123456', matches => 0, }, { summary => 'An example that does not get tested', str => '123456', }, { summary => 'Another example that does not get tested nor rendered to POD', str => '234567', matches => 0, test => 0, doc => 0, }, ], }, # dynamic (regexp generator) re3 => { summary => 'This is a regexp for blah blah', description => <<'_', ... _ gen => sub { my %args = @_; my $variant = $args{variant} || 'A'; if ($variant eq 'A') { return qr/\d{3}-\d{3}/; } else { # B return qr/\d{3}-\d{2}-\d{5}/; } }, gen_args => { variant => { summary => 'Choose variant', schema => ['str*', in=>['A','B']], default => 'A', req => 1, }, }, tags => ['B','C'], examples => [ { summary => 'An example that matches', gen_args => {variant=>'A'}, str => '123-456', matches => 1, }, { summary => "An example that doesn't match", gen_args => {variant=>'B'}, str => '123-456', matches => 0, }, ], }, re4 => { summary => 'This is a regexp that does capturing', # it is recommended that your pattern does not capture, unless # necessary. capturing pattern should tag with 'capturing' to let # users/tools know. tags => ['capturing'], pat => qr/(\d{3})-(\d{3})/, examples => [ {str=>'123-456', matches=>[123, 456]}, {str=>'foo-bar', matches=>[]}, ], }, re5 => { summary => 'This is another regexp that is anchored and does (named) capturing', # it is recommended that your pattern is not anchored for more # reusability, unless necessary. anchored pattern should tag with # 'anchored' to let users/tools know. tags => ['capturing', 'anchored'], pat => qr/^(?\d{3})-(?\d{3})/, examples => [ {str=>'123-456', matches=>{cap1=>123, cap2=>456}}, {str=>'something 123-456', matches=>{}}, ], }, ); A Regexp::Pattern::* module must declare a package global hash variable named %RE. Hash keys are pattern names, hash values are pattern definitions in the form of defhashes (see DefHash). Pattern name should be a simple identifier that matches this regexp: "/\A[A-Za-z_][A-Za-z_0-9]*\z/". The definition for the qualified pattern name "Foo::Bar::baz" can then be located in %Regexp::Pattern::Foo::Bar::RE under the hash key "baz". Pattern definition hash should at the minimum be: { pat => qr/.../ } You can add more stuffs from the defhash specification, e.g. summary, description, tags, and so on, for example (taken from Regexp::Pattern::CPAN): { summary => 'PAUSE author ID, or PAUSE ID for short', pat => qr/[A-Z][A-Z0-9]{1,8}/, description => <<~HERE, I'm not sure whether PAUSE allows digit for the first letter. For safety I'm assuming no. HERE examples => [ {str=>'PERLANCAR', matches=>1}, {str=>'BAD ID', anchor=>1, matches=>0}, ], } Examples. Your regexp specification can include an "examples" property (see above for example). The value of the "examples" property is an array, each of which should be a defhash. For each example, at the minimum you should specify "str" (string to be matched by the regexp), "gen_args" (hash, arguments to use when generating dynamic regexp pattern), and "matches" (a boolean value that specifies whether the regexp should match the string or not, or an array/hash that specifies the captures). You can of course specify other defhash properties (e.g. "summary", "description", etc). Other example properties might be introduced in the future. If you use Dist::Zilla to build your distribution, you can use the plugin [Regexp::Pattern] to test the examples during building, and the Pod::Weaver plugin [-Regexp::Pattern] to render the examples in your POD. Using a Regexp::Pattern::* module Standalone A Regexp::Pattern::* module can be used in a standalone way (i.e. no need to use via the Regexp::Pattern framework), as it simply contains data that can be grabbed using a normal means, e.g.: use Regexp::Pattern::Example; say "Input does not match blah" unless $input =~ /\A$Regexp::Pattern::Example::RE{re1}{pat}\z/; Via Regexp::Pattern, sub interface Regexp::Pattern (this module) also provides "re()" function to help retrieve the regexp pattern. See "re" for more details. Via Regexp::Pattern, hash interface Additionally, Regexp::Pattern (since v0.2.0) lets you import regexp patterns into your %RE package hash variable, a la Regexp::Common (but simpler because the hash is just a regular hash, only 1-level deep, and not magical). To import, you specify qualified pattern names as the import arguments: use Regexp::Pattern 'Q::pat1', 'Q::pat2', ...; Each qualified pattern name can optionally be followed by a list of name-value pairs. A pair name can be an option name (which is dash followed by a word, e.g. "-as", "-prefix") or a generator argument name for dynamic pattern. Wildcard import. Instead of a qualified pattern name, you can use 'Module::SubModule::*' wildcard syntax to import all patterns from a pattern module. Importing into a different name. You can add the import option "-as" to import into a different name, for example: use Regexp::Pattern 'YouTube::video_id' => (-as => 'yt_id'); Prefix and suffix. You can also add a prefix and/or suffix to the imported name: use Regexp::Pattern 'Example::*' => (-prefix => 'example_'); use Regexp::Pattern 'Example::*' => (-suffix => '_sample'); Filtering. When wildcard-importing, you can select the patterns you want using a combination of these options: "-has_tag" (only select patterns that have a specified tag), "-lacks_tag" (only select patterns that do not have a specified tag), "-has_tag_matching" (only select patterns that has at least one tag matching specified regex pattern), "-lacks_tag_matching" (only select patterns that does not have any tags matching specified regex pattern). Recommendations for writing the regex patterns * Regexp pattern should be written as a "qr//" literal Using a string literal is less desirable. That is: pat => qr/foo[abc]+/, is preferred over: pat => 'foo[abc]+', * Regexp pattern should not be anchored (unless really necessary) That is: pat => qr/foo/, is preferred over: pat => qr/^foo/, # or qr/foo$/, or qr/\Afoo\z/ Adding anchors limits the reusability of the pattern. When composing pattern, user can add anchors herself if needed. When you define an anchored pattern, adding tag "anchored" is recommended: tags => ['anchored'], * Regexp pattern should not contain capture groups (unless really necessary) Adding capture groups limits the reusability of the pattern because it can affect the groups of the composed pattern. When composing pattern, user can add captures herself if needed. When you define a capturing pattern, adding tag "capturing" is recommended: tags => ['capturing'], FUNCTIONS re Exported by default. Get a regexp pattern by name from a "Regexp::Pattern::*" module. Usage: re($name[, \%args ]) => $re $name is *MODULE_NAME::PATTERN_NAME* where *MODULE_NAME* is name of a "Regexp::Pattern::*" module without the "Regexp::Pattern::" prefix and *PATTERN_NAME* is a key to the %RE package global hash in the module. A dynamic pattern can accept arguments for its generator, and you can pass it as hashref in the second argument of "re()". Anchoring. You can also put "-anchor => 1" in %args. This will conveniently wraps the regex inside "qr/\A(?:...)\z/". Die when pattern by name $name cannot be found (either the module cannot be loaded or the pattern with that name is not found in the module). FAQ My pattern is not anchored, but what if I want to test the anchored version? You can add "anchor=>1" or "gen_args=>{-anchor=>1}" in the example, for example: { summary => 'PAUSE author ID, or PAUSE ID for short', pat => qr/[A-Z][A-Z0-9]{1,8}/, description => <<~HERE, I'm not sure whether PAUSE allows digit for the first letter. For safety I'm assuming no. HERE examples => [ {str=>'PERLANCAR', matches=>1}, {str=>'BAD ID', anchor=>1, matches=>0, summary=>"Contains whitespace"}, {str=>'NAMETOOLONG', gen_args=>{-anchor=>1}, matches=>0, summary=>"Too long"}, ], } HOMEPAGE Please visit the project's homepage at . SOURCE Source repository is at . BUGS Please report any bugs or feature requests on the bugtracker website When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. SEE ALSO Regexp::Common. Regexp::Pattern is an alternative to Regexp::Common. Regexp::Pattern offers simplicity and lower startup overhead. Instead of a magic hash, you retrieve available regexes from normal data structure or via the provided "re()" function. Regexp::Pattern also provides a hash interface, albeit the hash is not magic. Regexp::Common::RegexpPattern, a bridge module to use patterns in "Regexp::Pattern::*" modules via Regexp::Common. Regexp::Pattern::RegexpCommon, a bridge module to use patterns in "Regexp::Common::*" modules via Regexp::Pattern. App::RegexpPatternUtils If you use Dist::Zilla: Dist::Zilla::Plugin::Regexp::Pattern, Pod::Weaver::Plugin::Regexp::Pattern, Dist::Zilla::Plugin::AddModule::RegexpCommon::FromRegexpPattern, Dist::Zilla::Plugin::AddModule::RegexpPattern::FromRegexpCommon. Test::Regexp::Pattern and test-regexp-pattern. AUTHOR perlancar COPYRIGHT AND LICENSE This software is copyright (c) 2020, 2019, 2018, 2016 by perlancar@cpan.org. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Regexp-Pattern-0.2.12/Changes0000644000175000017500000000614213617303671013402 0ustar u1u10.2.12 2020-02-07 Released-By: PERLANCAR; Urgency: medium - Add import option -has_tag_matching & -lacks_tag_matching [GH#3]. 0.2.11 2020-01-03 Released-By: PERLANCAR; Urgency: low - No spec changes. - [doc] Add more comments to example. 0.2.10 2020-01-02 Released-By: PERLANCAR; Urgency: low - No spec changes. - [doc] Add FAQ section. 0.2.9 2019-06-09 Released-By: PERLANCAR - No spec changes. - No functional changes. - [doc] Fix typo. 0.2.8 2018-09-12 Released-By: PERLANCAR - No spec changes. - No functional changes. - Require perl 5.010001 (named capture is a Perl 5.10 feature) [CT]. 0.2.7 2018-09-10 Released-By: PERLANCAR - No spec changes. - Enable re() to return regex wrapped inside qr/\A(?:...)\z/ with -anchor=>1 argument. 0.2.6 2018-09-10 Released-By: PERLANCAR - No spec changes. - No functional changes. - [build] Rebuild to fix POD that didn't show gen_args in examples for dynamic pattern (PWP:Regexp::Pattern 0.002-). 0.2.5 2018-09-10 Released-By: PERLANCAR - No spec changes. - Mention about gen_args in example specification. - [doc] Express specification version as 0.2 instead of 0.2.0. - [doc] Mention Test::Regexp::Pattern and test-regexp-pattern. - Regexp::Pattern::Example: Add sample regexes that do capturing and anchoring, add matching examples. - [build] Rebuild to create test file release-regexp-pattern.t and render matching example PODs. 0.2.4 2018-09-10 Released-By: PERLANCAR - Specify regexp examples. 0.2.3 2018-04-03 Released-By: PERLANCAR - No spec changes. - Remove recommendation to avoid regex modifier. - Add recommendation to add 'capturing' tag if pattern has capture groups. - Tweak Abstract and fix grammar in Description. - Some fixes. 0.2.2 2018-03-24 Released-By: PERLANCAR - No spec changes. - [doc] Re-add pattern style guide which was accidentally removed in 0.2.0. 0.2.1 2018-03-24 Released-By: PERLANCAR - No spec changes. - [doc] Some wording/grammar fixes. 0.2.0 2018-03-24 Released-By: PERLANCAR - Add hash interface. - [doc] Some revision with added examples to be clearer, some grammar/wording fixes. - [doc] Mention related Dist::Zilla plugins. 0.1.4 2016-12-31 Released-By: PERLANCAR - No spec changes. - [doc] Mention Regexp::Pattern::RegexpCommon. 0.1.3 2016-12-31 Released-By: PERLANCAR - No spec changes. - Explain & give example about generator arguments. - Allow specifying generator arguments as hashref in addition to hash. 0.1.2 2016-09-14 Released-By: PERLANCAR - No spec changes. - Avoid use of defined-or (perl5.10-ism) [CT]. 0.1.1 2016-09-13 Released-By: PERLANCAR - [Removed] To simplify interface, remove all helper functions except re(). The removed functionalities can now be found in App-RegexpPatternUtils. - [optimize] Skip 'use warnings' to lower startup overhead. 0.1.0 2016-09-12 Released-By: PERLANCAR - First early release. Regexp-Pattern-0.2.12/MANIFEST0000644000175000017500000000051713617303671013240 0ustar u1u1# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.012. Changes LICENSE MANIFEST META.json META.yml Makefile.PL README dist.ini lib/Regexp/Pattern.pm lib/Regexp/Pattern/Example.pm t/00-compile.t t/01-basic.t t/author-critic.t t/author-pod-coverage.t t/author-pod-syntax.t t/release-regexp-pattern.t weaver.ini