commit 4eb1fbe3f8b6d92f71b864e48720740909d7ccb5 Author: denghao Date: Thu Sep 29 13:29:06 2022 +0300 Import Upstream version 0.003 diff --git a/CONTRIBUTING b/CONTRIBUTING new file mode 100644 index 0000000..f50a30d --- /dev/null +++ b/CONTRIBUTING @@ -0,0 +1,100 @@ +## HOW TO CONTRIBUTE + +Thank you for considering contributing to this distribution. This file +contains instructions that will help you work with the source code. + +The distribution is managed with Dist::Zilla. This means than many of the +usual files you might expect are not in the repository, but are generated at +release time (e.g. Makefile.PL). + +Generally, **you do not need Dist::Zilla to contribute patches**. You do need +Dist::Zilla to create a tarball and/or install from the repository. See below +for guidance. + +### Getting dependencies + +See the included `cpanfile` file for a list of dependencies. If you have +App::cpanminus 1.6 or later installed, you can use `cpanm` to satisfy +dependencies like this: + + $ cpanm --installdeps . + +Otherwise, you can install Module::CPANfile 1.0002 or later and then satisfy +dependencies with the regular `cpan` client and `cpanfile-dump`: + + $ cpan `cpanfile-dump` + +### Running tests + +You can run tests directly using the `prove` tool: + + $ prove -l + $ prove -lv t/some_test_file.t + +For most of my distributions, `prove` is entirely sufficient for you to test any +patches you have. I use `prove` for 99% of my testing during development. + +### Code style and tidying + +Please try to match any existing coding style. If there is a `.perltidyrc` +file, please install Perl::Tidy and use perltidy before submitting patches. + +If there is a `tidyall.ini` file, you can also install Code::TidyAll and run +`tidyall` on a file or `tidyall -a` to tidy all files. + +### Patching documentation + +Much of the documentation Pod is generated at release time. Depending on the +distribution, some of my documentation may be written in a Pod dialect called +WikiDoc. (See Pod::WikiDoc on CPAN.) + +If you would like to submit a documentation edit, please limit yourself to the +documentation you see. + +If you see typos or documentation issues in the generated docs, please +email or open a bug ticket instead of patching. + +### Installing from the repository + +If you want to install directly from the repository, you need to have +Dist::Zilla installed (see below). If this is a burden to you, I welcome +patches against a CPAN tarball instead of the repository. + +### Installing and using Dist::Zilla + +Dist::Zilla is a very powerful authoring tool, optimized for maintaining a +large number of distributions with a high degree of automation, but it has a +large dependency chain, a bit of a learning curve and requires a number of +author-specific plugins. + +To install it from CPAN, I recommend one of the following approaches for +the quickest installation: + + # using CPAN.pm, but bypassing non-functional pod tests + $ cpan TAP::Harness::Restricted + $ PERL_MM_USE_DEFAULT=1 HARNESS_CLASS=TAP::Harness::Restricted cpan Dist::Zilla + + # using cpanm, bypassing *all* tests + $ cpanm -n Dist::Zilla + +In either case, it's probably going to take about 10 minutes. Go for a walk, +go get a cup of your favorite beverage, take a bathroom break, or whatever. +When you get back, Dist::Zilla should be ready for you. + +Then you need to install any plugins specific to this distribution: + + $ cpan `dzil authordeps` + $ dzil authordeps | cpanm + +Once installed, here are some dzil commands you might try: + + $ dzil build + $ dzil test + $ dzil xtest + +To install from the repository, use: + + $ dzil install + +You can learn more about Dist::Zilla at http://dzil.org/ + diff --git a/Changes b/Changes new file mode 100644 index 0000000..f76a83a --- /dev/null +++ b/Changes @@ -0,0 +1,18 @@ +Revision history for MooseX-Types-Stringable + +0.003 2014-04-17 07:06:08-04:00 America/New_York + + [Added] + + - new ArrayRefOfStringlike, ArrayRefOfStringable types to facilitate + coercion of lists + +0.002 2013-11-02 21:42:57 America/New_York + + [Documentation] + + - Fixed missing =encoding command + +0.001 2012-03-26 22:55:10 EST5EDT + - initial release + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..eaea7db --- /dev/null +++ b/LICENSE @@ -0,0 +1,207 @@ +This software is Copyright (c) 2012 by David Golden. + +This is free software, licensed under: + + The Apache License, Version 2.0, January 2004 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..0c22e79 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,26 @@ +# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.015. +CONTRIBUTING +Changes +LICENSE +MANIFEST +META.json +META.yml +Makefile.PL +README +cpanfile +dist.ini +lib/MooseX/Types/Stringlike.pm +perlcritic.rc +t/00-report-prereqs.t +t/arrayrefs.t +t/stringable.t +tidyall.ini +xt/author/00-compile.t +xt/author/critic.t +xt/author/pod-spell.t +xt/release/distmeta.t +xt/release/minimum-version.t +xt/release/pod-coverage.t +xt/release/pod-syntax.t +xt/release/portability.t +xt/release/test-version.t diff --git a/META.json b/META.json new file mode 100644 index 0000000..1a812ec --- /dev/null +++ b/META.json @@ -0,0 +1,97 @@ +{ + "abstract" : "Moose type constraints for strings or string-like objects", + "author" : [ + "David Golden " + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 5.015, CPAN::Meta::Converter version 2.140640", + "license" : [ + "apache_2_0" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-Types-Stringlike", + "no_index" : { + "directory" : [ + "t", + "xt", + "examples", + "corpus" + ], + "package" : [ + "DB" + ] + }, + "prereqs" : { + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.17" + } + }, + "develop" : { + "requires" : { + "Dist::Zilla" : "5.015", + "Dist::Zilla::PluginBundle::DAGOLDEN" : "0.060", + "File::Spec" : "0", + "File::Temp" : "0", + "IO::Handle" : "0", + "IPC::Open3" : "0", + "Pod::Coverage::TrustPod" : "0", + "Test::CPAN::Meta" : "0", + "Test::More" : "0", + "Test::Pod" : "1.41", + "Test::Pod::Coverage" : "1.08" + } + }, + "runtime" : { + "requires" : { + "MooseX::Types" : "0", + "MooseX::Types::Moose" : "0", + "overload" : "0", + "perl" : "5.008001", + "strict" : "0", + "warnings" : "0" + } + }, + "test" : { + "recommends" : { + "CPAN::Meta" : "0", + "CPAN::Meta::Requirements" : "2.120900" + }, + "requires" : { + "ExtUtils::MakeMaker" : "0", + "File::Spec::Functions" : "0", + "List::Util" : "0", + "Moose" : "0", + "Test::More" : "0.96", + "version" : "0" + } + } + }, + "provides" : { + "MooseX::Types::Stringlike" : { + "file" : "lib/MooseX/Types/Stringlike.pm", + "version" : "0.003" + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "https://github.com/dagolden/MooseX-Types-Stringlike/issues" + }, + "homepage" : "https://github.com/dagolden/MooseX-Types-Stringlike", + "repository" : { + "type" : "git", + "url" : "https://github.com/dagolden/MooseX-Types-Stringlike.git", + "web" : "https://github.com/dagolden/MooseX-Types-Stringlike" + } + }, + "version" : "0.003", + "x_authority" : "cpan:DAGOLDEN", + "x_contributors" : [ + "Karen Etheridge " + ] +} + diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..0d4576f --- /dev/null +++ b/META.yml @@ -0,0 +1,47 @@ +--- +abstract: 'Moose type constraints for strings or string-like objects' +author: + - 'David Golden ' +build_requires: + ExtUtils::MakeMaker: '0' + File::Spec::Functions: '0' + List::Util: '0' + Moose: '0' + Test::More: '0.96' + version: '0' +configure_requires: + ExtUtils::MakeMaker: '6.17' +dynamic_config: 0 +generated_by: 'Dist::Zilla version 5.015, CPAN::Meta::Converter version 2.140640' +license: apache +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: MooseX-Types-Stringlike +no_index: + directory: + - t + - xt + - examples + - corpus + package: + - DB +provides: + MooseX::Types::Stringlike: + file: lib/MooseX/Types/Stringlike.pm + version: '0.003' +requires: + MooseX::Types: '0' + MooseX::Types::Moose: '0' + overload: '0' + perl: '5.008001' + strict: '0' + warnings: '0' +resources: + bugtracker: https://github.com/dagolden/MooseX-Types-Stringlike/issues + homepage: https://github.com/dagolden/MooseX-Types-Stringlike + repository: https://github.com/dagolden/MooseX-Types-Stringlike.git +version: '0.003' +x_authority: cpan:DAGOLDEN +x_contributors: + - 'Karen Etheridge ' diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..75b5a88 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,72 @@ + +# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.015. +use strict; +use warnings; + +use 5.008001; + +use ExtUtils::MakeMaker 6.17; + + + +my %WriteMakefileArgs = ( + "ABSTRACT" => "Moose type constraints for strings or string-like objects", + "AUTHOR" => "David Golden ", + "BUILD_REQUIRES" => {}, + "CONFIGURE_REQUIRES" => { + "ExtUtils::MakeMaker" => "6.17" + }, + "DISTNAME" => "MooseX-Types-Stringlike", + "EXE_FILES" => [], + "LICENSE" => "apache", + "NAME" => "MooseX::Types::Stringlike", + "PREREQ_PM" => { + "MooseX::Types" => 0, + "MooseX::Types::Moose" => 0, + "overload" => 0, + "strict" => 0, + "warnings" => 0 + }, + "TEST_REQUIRES" => { + "ExtUtils::MakeMaker" => 0, + "File::Spec::Functions" => 0, + "List::Util" => 0, + "Moose" => 0, + "Test::More" => "0.96", + "version" => 0 + }, + "VERSION" => "0.003", + "test" => { + "TESTS" => "t/*.t" + } +); + + +my %FallbackPrereqs = ( + "ExtUtils::MakeMaker" => 0, + "File::Spec::Functions" => 0, + "List::Util" => 0, + "Moose" => 0, + "MooseX::Types" => 0, + "MooseX::Types::Moose" => 0, + "Test::More" => "0.96", + "overload" => 0, + "strict" => 0, + "version" => 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); + + + diff --git a/README b/README new file mode 100644 index 0000000..42b31bd --- /dev/null +++ b/README @@ -0,0 +1,96 @@ +NAME + MooseX::Types::Stringlike - Moose type constraints for strings or + string-like objects + +VERSION + version 0.003 + +SYNOPSIS + package Foo; + use Moose; + use MooseX::Types::Stringlike qw/Stringlike Stringable ArrayRefOfStringlike ArrayRefOfStringable/; + + has path => ( + is => 'ro', + isa => Stringlike, + coerce => 1 + ); + + has stringable_object => ( + is => 'ro', + isa => Stringable, + ); + + has paths => ( + is => 'ro', + isa => ArrayRefOfStringlike, + coerce => 1 + ); + + has stringable_objects => ( + is => 'ro', + isa => ArrayRefOfStringable, + ); + +DESCRIPTION + This module provides a more general version of the "Str" type. If + coercions are enabled, it will accepts objects that overload + stringification and coerces them into strings. + +SUBTYPES + This module uses MooseX::Types to define the following subtypes. + + Stringlike + "Stringlike" is a subtype of "Str". It can coerce "Stringable" objects + into a string. + + Stringable + "Stringable" is a subtype of "Object" where the object has overloaded + stringification. + + ArrayRefOfStringlike + "ArrayRefStringlike" is a subtype of "ArrayRef[Str]". It can coerce + "ArrayRefOfStringable" objects into an arrayref of strings. + + ArrayRefOfStringable + "ArrayRefOfStringable" is a subtype of "ArrayRef[Object]" where the + objects have overloaded stringification. + +SEE ALSO + * Moose::Manual::Types + + * MooseX::Types + + * MooseX::Types::Moose + +ACKNOWLEDGMENTS + Thank you to Dagfinn Ilmari Mannsåker for the idea on IRC that led to + this module. + +SUPPORT + Bugs / Feature Requests + Please report any bugs or feature requests through the issue tracker at + . You will + be notified automatically of any progress on your issue. + + Source Code + This is open source software. The code repository is available for + public review and contribution under the terms of the license. + + + + git clone https://github.com/dagolden/MooseX-Types-Stringlike.git + +AUTHOR + David Golden + +CONTRIBUTOR + Karen Etheridge + +COPYRIGHT AND LICENSE + This software is Copyright (c) 2012 by David Golden. + + This is free software, licensed under: + + The Apache License, Version 2.0, January 2004 + diff --git a/cpanfile b/cpanfile new file mode 100644 index 0000000..dd02be9 --- /dev/null +++ b/cpanfile @@ -0,0 +1,38 @@ +requires "MooseX::Types" => "0"; +requires "MooseX::Types::Moose" => "0"; +requires "overload" => "0"; +requires "perl" => "5.008001"; +requires "strict" => "0"; +requires "warnings" => "0"; + +on 'test' => sub { + requires "ExtUtils::MakeMaker" => "0"; + requires "File::Spec::Functions" => "0"; + requires "List::Util" => "0"; + requires "Moose" => "0"; + requires "Test::More" => "0.96"; + requires "version" => "0"; +}; + +on 'test' => sub { + recommends "CPAN::Meta" => "0"; + recommends "CPAN::Meta::Requirements" => "2.120900"; +}; + +on 'configure' => sub { + requires "ExtUtils::MakeMaker" => "6.17"; +}; + +on 'develop' => sub { + requires "Dist::Zilla" => "5.015"; + requires "Dist::Zilla::PluginBundle::DAGOLDEN" => "0.060"; + requires "File::Spec" => "0"; + requires "File::Temp" => "0"; + requires "IO::Handle" => "0"; + requires "IPC::Open3" => "0"; + requires "Pod::Coverage::TrustPod" => "0"; + requires "Test::CPAN::Meta" => "0"; + requires "Test::More" => "0"; + requires "Test::Pod" => "1.41"; + requires "Test::Pod::Coverage" => "1.08"; +}; diff --git a/dist.ini b/dist.ini new file mode 100644 index 0000000..5e56f0c --- /dev/null +++ b/dist.ini @@ -0,0 +1,15 @@ +name = MooseX-Types-Stringlike +author = David Golden +license = Apache_2_0 +copyright_holder = David Golden +copyright_year = 2012 + +[@DAGOLDEN] +:version = 0.060 +stopwords = Stringable +stopwords = ArrayRefOfStringable +stopwords = ArrayRefOfStringlike +stopwords = Dagfinn +stopwords = Ilmari +stopwords = Mannsåker + diff --git a/lib/MooseX/Types/Stringlike.pm b/lib/MooseX/Types/Stringlike.pm new file mode 100644 index 0000000..c61e282 --- /dev/null +++ b/lib/MooseX/Types/Stringlike.pm @@ -0,0 +1,170 @@ +use 5.008001; +use strict; +use warnings; + +package MooseX::Types::Stringlike; +# ABSTRACT: Moose type constraints for strings or string-like objects +our $VERSION = '0.003'; # VERSION + +use MooseX::Types -declare => [ qw/Stringable Stringlike ArrayRefOfStringable ArrayRefOfStringlike / ]; +use MooseX::Types::Moose qw/Str Object ArrayRef/; +use overload (); + +# Thanks ilmari for suggesting something like this +subtype Stringable, + as Object, + where { overload::Method($_, '""') }; + +subtype Stringlike, + as Str; + +coerce Stringlike, + from Stringable, + via { "$_" }; + + +subtype ArrayRefOfStringable, + as ArrayRef[Stringable]; + +subtype ArrayRefOfStringlike, + as ArrayRef[Stringlike]; + +coerce ArrayRefOfStringlike, + from ArrayRefOfStringable, + via { [ map { "$_" } @$_ ] }; + +1; + + +# vim: ts=2 sts=2 sw=2 et: + +__END__ + +=pod + +=encoding UTF-8 + +=head1 NAME + +MooseX::Types::Stringlike - Moose type constraints for strings or string-like objects + +=head1 VERSION + +version 0.003 + +=head1 SYNOPSIS + + package Foo; + use Moose; + use MooseX::Types::Stringlike qw/Stringlike Stringable ArrayRefOfStringlike ArrayRefOfStringable/; + + has path => ( + is => 'ro', + isa => Stringlike, + coerce => 1 + ); + + has stringable_object => ( + is => 'ro', + isa => Stringable, + ); + + has paths => ( + is => 'ro', + isa => ArrayRefOfStringlike, + coerce => 1 + ); + + has stringable_objects => ( + is => 'ro', + isa => ArrayRefOfStringable, + ); + +=head1 DESCRIPTION + +This module provides a more general version of the C type. If coercions +are enabled, it will accepts objects that overload stringification and coerces +them into strings. + +=for Pod::Coverage method_names_here + +=head1 SUBTYPES + +This module uses L to define the following subtypes. + +=head2 Stringlike + +C is a subtype of C. It can coerce C objects into +a string. + +=head2 Stringable + +C is a subtype of C where the object has overloaded stringification. + +=head2 ArrayRefOfStringlike + +C is a subtype of C. It can coerce C objects into +an arrayref of strings. + +=head2 ArrayRefOfStringable + +C is a subtype of C where the objects have overloaded stringification. + +=head1 SEE ALSO + +=over 4 + +=item * + +L + +=item * + +L + +=item * + +L + +=back + +=head1 ACKNOWLEDGMENTS + +Thank you to Dagfinn Ilmari Mannsåker for the idea on IRC that led to this module. + +=for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan + +=head1 SUPPORT + +=head2 Bugs / Feature Requests + +Please report any bugs or feature requests through the issue tracker +at L. +You will be notified automatically of any progress on your issue. + +=head2 Source Code + +This is open source software. The code repository is available for +public review and contribution under the terms of the license. + +L + + git clone https://github.com/dagolden/MooseX-Types-Stringlike.git + +=head1 AUTHOR + +David Golden + +=head1 CONTRIBUTOR + +Karen Etheridge + +=head1 COPYRIGHT AND LICENSE + +This software is Copyright (c) 2012 by David Golden. + +This is free software, licensed under: + + The Apache License, Version 2.0, January 2004 + +=cut diff --git a/perlcritic.rc b/perlcritic.rc new file mode 100644 index 0000000..bcbbb45 --- /dev/null +++ b/perlcritic.rc @@ -0,0 +1,26 @@ +severity = 5 +verbose = 8 + +[Variables::ProhibitPunctuationVars] +allow = $@ $! + +[TestingAndDebugging::ProhibitNoStrict] +allow = refs + +[Variables::ProhibitEvilVariables] +variables = $DB::single + +# Turn these off +[-BuiltinFunctions::ProhibitStringyEval] +[-ControlStructures::ProhibitPostfixControls] +[-ControlStructures::ProhibitUnlessBlocks] +[-Documentation::RequirePodSections] +[-InputOutput::ProhibitInteractiveTest] +[-References::ProhibitDoubleSigils] +[-RegularExpressions::RequireExtendedFormatting] +[-InputOutput::ProhibitTwoArgOpen] +[-Modules::ProhibitEvilModules] + +# Turn this on +[Lax::ProhibitStringyEval::ExceptForRequire] + diff --git a/t/00-report-prereqs.t b/t/00-report-prereqs.t new file mode 100644 index 0000000..9ca3dbf --- /dev/null +++ b/t/00-report-prereqs.t @@ -0,0 +1,182 @@ +#!perl + +use strict; +use warnings; + +# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.013 + +use Test::More tests => 1; + +use ExtUtils::MakeMaker; +use File::Spec::Functions; +use List::Util qw/max/; +use version; + +# hide optional CPAN::Meta modules from prereq scanner +# and check if they are available +my $cpan_meta = "CPAN::Meta"; +my $cpan_meta_req = "CPAN::Meta::Requirements"; +my $HAS_CPAN_META = eval "require $cpan_meta"; ## no critic +my $HAS_CPAN_META_REQ = eval "require $cpan_meta_req; $cpan_meta_req->VERSION('2.120900')"; + +# Verify requirements? +my $DO_VERIFY_PREREQS = 1; + +sub _merge_requires { + my ($collector, $prereqs) = @_; + for my $phase ( qw/configure build test runtime develop/ ) { + next unless exists $prereqs->{$phase}; + if ( my $req = $prereqs->{$phase}{'requires'} ) { + my $cmr = CPAN::Meta::Requirements->from_string_hash( $req ); + $collector->add_requirements( $cmr ); + } + } +} + +my %include = map {; $_ => 1 } qw( + +); + +my %exclude = map {; $_ => 1 } qw( + +); + +# Add static prereqs to the included modules list +my $static_prereqs = do { my $x = { + 'configure' => { + 'requires' => { + 'ExtUtils::MakeMaker' => '6.17' + } + }, + 'develop' => { + 'requires' => { + 'Dist::Zilla' => '5.015', + 'Dist::Zilla::PluginBundle::DAGOLDEN' => '0.060', + 'File::Spec' => '0', + 'File::Temp' => '0', + 'IO::Handle' => '0', + 'IPC::Open3' => '0', + 'Pod::Coverage::TrustPod' => '0', + 'Test::CPAN::Meta' => '0', + 'Test::More' => '0', + 'Test::Pod' => '1.41', + 'Test::Pod::Coverage' => '1.08' + } + }, + 'runtime' => { + 'requires' => { + 'MooseX::Types' => '0', + 'MooseX::Types::Moose' => '0', + 'overload' => '0', + 'perl' => '5.008001', + 'strict' => '0', + 'warnings' => '0' + } + }, + 'test' => { + 'recommends' => { + 'CPAN::Meta' => '0', + 'CPAN::Meta::Requirements' => '2.120900' + }, + 'requires' => { + 'ExtUtils::MakeMaker' => '0', + 'File::Spec::Functions' => '0', + 'List::Util' => '0', + 'Moose' => '0', + 'Test::More' => '0.96', + 'version' => '0' + } + } + }; + $x; + }; + +delete $static_prereqs->{develop} if not $ENV{AUTHOR_TESTING}; +$include{$_} = 1 for map { keys %$_ } map { values %$_ } values %$static_prereqs; + +# Merge requirements for major phases (if we can) +my $all_requires; +if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META_REQ ) { + $all_requires = $cpan_meta_req->new; + _merge_requires($all_requires, $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) } ) { + my $dynamic_prereqs = $meta->prereqs; + delete $dynamic_prereqs->{develop} if not $ENV{AUTHOR_TESTING}; + $include{$_} = 1 for map { keys %$_ } map { values %$_ } values %$dynamic_prereqs; + + if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META_REQ ) { + _merge_requires($all_requires, $dynamic_prereqs); + } + } +} +else { + $source = 'static metadata'; +} + +my @modules = sort grep { ! $exclude{$_} } keys %include; +my @reports = [qw/Version Module/]; +my @dep_errors; +my $req_hash = defined($all_requires) ? $all_requires->as_string_hash : {}; + +for my $mod ( @modules ) { + next if $mod eq 'perl'; + my $file = $mod; + $file =~ s{::}{/}g; + $file .= ".pm"; + my ($prefix) = grep { -e catfile($_, $file) } @INC; + if ( $prefix ) { + my $ver = MM->parse_version( catfile($prefix, $file) ); + $ver = "undef" unless defined $ver; # Newer MM should do this anyway + push @reports, [$ver, $mod]; + + if ( $DO_VERIFY_PREREQS && $all_requires ) { + my $req = $req_hash->{$mod}; + if ( defined $req && length $req ) { + if ( ! defined eval { version->parse($ver) } ) { + push @dep_errors, "$mod version '$ver' cannot be parsed (version '$req' required)"; + } + elsif ( ! $all_requires->accepts_module( $mod => $ver ) ) { + push @dep_errors, "$mod version '$ver' is not in required range '$req'"; + } + } + } + + } + else { + push @reports, ["missing", $mod]; + + if ( $DO_VERIFY_PREREQS && $all_requires ) { + my $req = $req_hash->{$mod}; + if ( defined $req && length $req ) { + push @dep_errors, "$mod is not installed (version '$req' required)"; + } + } + } +} + +if ( @reports ) { + my $vl = max map { length $_->[0] } @reports; + my $ml = max map { length $_->[1] } @reports; + splice @reports, 1, 0, ["-" x $vl, "-" x $ml]; + diag "\nVersions for all modules listed in $source (including optional ones):\n", + map {sprintf(" %*s %*s\n",$vl,$_->[0],-$ml,$_->[1])} @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: diff --git a/t/arrayrefs.t b/t/arrayrefs.t new file mode 100644 index 0000000..010b2a5 --- /dev/null +++ b/t/arrayrefs.t @@ -0,0 +1,22 @@ +use 5.006; +use strict; +use warnings; +use Test::More 0.96; + +use MooseX::Types::Stringlike qw/Stringable Stringlike ArrayRefOfStringable ArrayRefOfStringlike/; + +{ + package BlessedPath; + use overload q{""} => sub { "${$_[0]}" }; + sub new { my ($class, $path) = @_; return bless \$path, $class; } +} + +my $stringable = [ map { BlessedPath->new($_) } ('./t', './xt') ]; + +ok(is_ArrayRefOfStringable($stringable), 'arrayref of stringable things is a ArrayRefOfStringable'); + +my $stringlike = to_ArrayRefOfStringlike($stringable); +ok(is_ArrayRefOfStringlike($stringlike), 'can coerce ArrayRefOfStringable to ArrayRefOfStringlike'); +is_deeply($stringlike, [ './t', './xt' ], 'ArrayRefOfStringable properly coerced to ArrayRefOfStringlike'); + +done_testing; diff --git a/t/stringable.t b/t/stringable.t new file mode 100644 index 0000000..a07a247 --- /dev/null +++ b/t/stringable.t @@ -0,0 +1,43 @@ +use 5.006; +use strict; +use warnings; +use Test::More 0.96; + +{ + package BlessedPath; + use overload q{""} => sub { "${$_[0]}" }; + sub new { my ($class, $path) = @_; return bless \$path, $class; } +} + +{ + package Foo; + use Moose; + use MooseX::Types::Stringlike qw/Stringable Stringlike/; + + has path => ( is => 'ro', isa => Stringlike, coerce => 1 ); + has path_obj => (is => 'ro', isa => Stringable ); +} + + +my $obj = eval { + Foo->new( + path => BlessedPath->new("./t"), + path_obj => BlessedPath->new("./lib"), + ) +}; + +is( $@, '', "object created without exception" ); + +is( ref($obj->path), '', "path attribute has been coerced to string" ); +is( ref($obj->path_obj), 'BlessedPath', "path_obj is still an object" ); + +done_testing; +# +# This file is part of MooseX-Types-Stringlike +# +# This software is Copyright (c) 2012 by David Golden. +# +# This is free software, licensed under: +# +# The Apache License, Version 2.0, January 2004 +# diff --git a/tidyall.ini b/tidyall.ini new file mode 100644 index 0000000..91aa246 --- /dev/null +++ b/tidyall.ini @@ -0,0 +1,5 @@ +; Install Code::TidyAll +; run "tidyall -a" to tidy all files +; run "tidyall -g" to tidy only files modified from git +[PerlTidy] +select = {lib,t}/**/*.{pl,pm,t} diff --git a/xt/author/00-compile.t b/xt/author/00-compile.t new file mode 100644 index 0000000..a585ef9 --- /dev/null +++ b/xt/author/00-compile.t @@ -0,0 +1,53 @@ +use 5.006; +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.040 + +use Test::More tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0); + + + +my @module_files = ( + 'MooseX/Types/Stringlike.pm' +); + + + +# fake home for cpan-testers +use File::Temp; +local $ENV{HOME} = File::Temp::tempdir( CLEANUP => 1 ); + + +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 + 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') if $ENV{AUTHOR_TESTING}; + + diff --git a/xt/author/critic.t b/xt/author/critic.t new file mode 100644 index 0000000..d5b4c96 --- /dev/null +++ b/xt/author/critic.t @@ -0,0 +1,12 @@ +#!perl + +use strict; +use warnings; + +use Test::More; +use English qw(-no_match_vars); + +eval "use Test::Perl::Critic"; +plan skip_all => 'Test::Perl::Critic required to criticise code' if $@; +Test::Perl::Critic->import( -profile => "perlcritic.rc" ) if -e "perlcritic.rc"; +all_critic_ok(); diff --git a/xt/author/pod-spell.t b/xt/author/pod-spell.t new file mode 100644 index 0000000..f2ec9a5 --- /dev/null +++ b/xt/author/pod-spell.t @@ -0,0 +1,28 @@ +use strict; +use warnings; +use Test::More; + +# generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006007 +use Test::Spelling 0.12; +use Pod::Wordlist; + + +add_stopwords(); +all_pod_files_spelling_ok( qw( bin lib ) ); +__DATA__ +Stringable +ArrayRefOfStringable +ArrayRefOfStringlike +Dagfinn +Ilmari +Mannsåker +David +Golden +dagolden +Karen +Etheridge +ether +lib +MooseX +Types +Stringlike diff --git a/xt/release/distmeta.t b/xt/release/distmeta.t new file mode 100644 index 0000000..c2280dc --- /dev/null +++ b/xt/release/distmeta.t @@ -0,0 +1,6 @@ +#!perl +# This file was automatically generated by Dist::Zilla::Plugin::MetaTests. + +use Test::CPAN::Meta; + +meta_yaml_ok(); diff --git a/xt/release/minimum-version.t b/xt/release/minimum-version.t new file mode 100644 index 0000000..708ba15 --- /dev/null +++ b/xt/release/minimum-version.t @@ -0,0 +1,8 @@ +#!perl + +use Test::More; + +eval "use Test::MinimumVersion"; +plan skip_all => "Test::MinimumVersion required for testing minimum versions" + if $@; +all_minimum_version_ok( qq{5.010} ); diff --git a/xt/release/pod-coverage.t b/xt/release/pod-coverage.t new file mode 100644 index 0000000..66b3b64 --- /dev/null +++ b/xt/release/pod-coverage.t @@ -0,0 +1,7 @@ +#!perl +# 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' }); diff --git a/xt/release/pod-syntax.t b/xt/release/pod-syntax.t new file mode 100644 index 0000000..f0468f1 --- /dev/null +++ b/xt/release/pod-syntax.t @@ -0,0 +1,6 @@ +#!perl +# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. +use Test::More; +use Test::Pod 1.41; + +all_pod_files_ok(); diff --git a/xt/release/portability.t b/xt/release/portability.t new file mode 100644 index 0000000..58dbc20 --- /dev/null +++ b/xt/release/portability.t @@ -0,0 +1,12 @@ +#!perl + +use strict; +use warnings; + +use Test::More; + +eval 'use Test::Portability::Files'; +plan skip_all => 'Test::Portability::Files required for testing portability' + if $@; +options(test_one_dot => 0); +run_tests(); diff --git a/xt/release/test-version.t b/xt/release/test-version.t new file mode 100644 index 0000000..b7a0f17 --- /dev/null +++ b/xt/release/test-version.t @@ -0,0 +1,22 @@ +use strict; +use warnings; +use Test::More; + +# generated by Dist::Zilla::Plugin::Test::Version 0.002004 +BEGIN { eval "use Test::Version; 1;" or die $@; } + +my @imports = ( 'version_all_ok' ); + +my $params = { + is_strict => 0, + has_version => 1, +}; + +push @imports, $params + if version->parse( $Test::Version::VERSION ) >= version->parse('1.002'); + + +Test::Version->import(@imports); + +version_all_ok; +done_testing;