forked from openkylin/libconfig-tiny-perl
Import Upstream version 2.28
This commit is contained in:
commit
ef5c33623c
|
@ -0,0 +1,12 @@
|
||||||
|
language: perl
|
||||||
|
perl:
|
||||||
|
- "5.26"
|
||||||
|
- "5.24"
|
||||||
|
- "5.22"
|
||||||
|
- "5.20"
|
||||||
|
- "5.18"
|
||||||
|
- "5.16"
|
||||||
|
- "5.14"
|
||||||
|
- "5.12"
|
||||||
|
- "5.10"
|
||||||
|
- "5.8"
|
|
@ -0,0 +1,328 @@
|
||||||
|
[Module]
|
||||||
|
Name=Config-Tiny:
|
||||||
|
Changelog.Creator=Module::Metadata::Changes V 2.12
|
||||||
|
Changelog.Parser=Config::IniFiles V 3.000003
|
||||||
|
|
||||||
|
[V 2.28]
|
||||||
|
Date=2022-01-04T15:47:58
|
||||||
|
Comments= <<EOT
|
||||||
|
- Accept pull request from Todd Rinaldo to replace both uses of bareword filehandles
|
||||||
|
with my variables. With thanx.
|
||||||
|
- Accept 2019 pull request to Makefile.PL, for the purpose of modernization, and with
|
||||||
|
some slight modifications, from Grinnz.
|
||||||
|
- Make corresponding patches where appropriate to Tiny.pm and t/02.main.t.
|
||||||
|
- Thanx to Grinnz aka Dan Book for the prompting.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.27]
|
||||||
|
Date=2021-09-21T15:48:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Add the option of passing a hashref to the constructor, where it is turned into an
|
||||||
|
object of the class. See POD under new([$config]) for details.
|
||||||
|
This patch to the code and POD includes the new test t/08.constructor.t.
|
||||||
|
The patch was provided by D Hauke, with thanx.
|
||||||
|
- Move test.conf back into t/, where it was years ago, before someone tried to remove
|
||||||
|
all uses of File::Spec. But since File::Spec is used often now, there is no point
|
||||||
|
in keeping test.conf in the root directory of the distro.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.26]
|
||||||
|
Date=2021-02-01T17:11:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Update POD to change RT to github.
|
||||||
|
- Reformat Makefile.PL.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.25]
|
||||||
|
Date=2021-01-31T20:29:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Merge in clean-up patches from Karen Etheridge, with thanx.
|
||||||
|
- Add back file t/0. Who deleted it? It is required for t/05.zero.t.
|
||||||
|
- Update Makefile.PL to switch issue tracker from rt.cpan.org to github.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.24]
|
||||||
|
Date=2019-06-11T15:30:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Delete from caveats in documentation where it used to say:
|
||||||
|
'Config::Tiny will only recognize the first time an option is set in a config file.'
|
||||||
|
'Any further attempts to set the same option later in the config file are ignored.'
|
||||||
|
In reality the code uses the 2nd and subsequent values to overwrite earlier values.
|
||||||
|
- Make this topic a new FAQ.
|
||||||
|
- Add corresponding test t/06.repeat.key.t.
|
||||||
|
- Update POD to clarify trailing comment options.
|
||||||
|
- Add corresponding test t/07.trailing.comment.t.
|
||||||
|
- Romanize Gregory Kidrenko's name so Config::IniFiles does not get 'Wide char in print'.
|
||||||
|
- Move xt/pod.t to xt/author/pod.t.
|
||||||
|
- Adopt new repo structure. See
|
||||||
|
http://savage.net.au/Ron/html/My.Workflow.for.Building.Distros.html.
|
||||||
|
- Move require 5.008001 from Tiny.pm into Makefile.PL.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.23]
|
||||||
|
Date=2015-10-14T09:11:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Add the utf8 BOM to this file. Let's hope the CPAN toolchain can cope. If it can't, another
|
||||||
|
version of the code will have to be released.
|
||||||
|
- Fix read() and write() so they work on files called '0' (zero). See RT#107754.
|
||||||
|
Many thanx to Gregory Kidrenko for the report and patch.
|
||||||
|
- Add t/05.zero.t and t/0 to test the new code.
|
||||||
|
- Reformat the source slightly.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.22]
|
||||||
|
Date=2015-02-17T08:32:00
|
||||||
|
Comments=- Fix licence info in Makefile.PL to say Perl.
|
||||||
|
|
||||||
|
[V 2.21]
|
||||||
|
Date=2015-02-16T08:59:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Patch Makefile.PL to refer to the current repo, which is on github, and not the original one,
|
||||||
|
which is on Adam's web site. See RT#102125.
|
||||||
|
- Remove Build.PL because Karen Etheridge tells me Module::Build is no longer in core.
|
||||||
|
See RT#102126.
|
||||||
|
- Edit line lengths in this file to a max of 100 chars.
|
||||||
|
- Edit line lengths in the docs the same way.
|
||||||
|
- Expand the See Also section of the docs.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.20]
|
||||||
|
Date=2013-11-24T10:52:00
|
||||||
|
Comments=- Relax pre-req version requirements
|
||||||
|
|
||||||
|
[V 2.19]
|
||||||
|
Date=2013-09-15T09:16:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Change VERSION => $VERSION in Makefile.PL to VERSION_FROM => 'lib/Config/Tiny.pm'.
|
||||||
|
Reported by Jean-Louis Morel. See RT#88670.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.18]
|
||||||
|
Date=2013-09-14T10:03:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Remove obsolete and wrong version # from Makefile.PL.
|
||||||
|
Reported by Jean-Louis Morel. See RT#88658.
|
||||||
|
- Implement Kevin Ryde's suggestion to test if read() will return undef.
|
||||||
|
If so, set an error message and (still) return undef.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.17]
|
||||||
|
Date=2013-09-13T12:41:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Remove the file tests -efr during calls to read(). The open() tests for any error.
|
||||||
|
Also, the -f test was reporting /dev/null as a directory, not a file.
|
||||||
|
Thanx to Kevin Ryde for pushing me to implement this. See RT#36974.
|
||||||
|
- Clean up some error messages slightly.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.16]
|
||||||
|
Date=2013-09-06T11:54:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Replace Path::Tiny with File::Spec, because the former's list of dependencies is so long :-(.
|
||||||
|
Changed files: t/02.main.t, t/04.utf8.t, Build.PL and Makefile.PL.
|
||||||
|
See: RT#88435 (for Tree::DAG_Node) for an explanation.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.15]
|
||||||
|
Date=2013-08-04T14:59:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Clean up the shambolic dates in this file.
|
||||||
|
- Add a note under Caveats about setting options more that once. Only the first case is
|
||||||
|
respected. Thanx to Kimmel K. See RT#69795.
|
||||||
|
- Add a $encoding parameter to read_file() and write_file(). See docs for details.
|
||||||
|
Add t/04.utf8.t and t/04.utf8.txt.
|
||||||
|
Thanx to Mark Lawrence and Wolfgang Husmann. See RT#71029 and RT#85571.
|
||||||
|
- For BSD-based systems, when writing a file during tests, use:
|
||||||
|
my($temp_dir) = File::Temp -> newdir('temp.XXXX', CLEANUP => 1, EXLOCK => 0, TMPDIR => 1);
|
||||||
|
- Rename t/*.t files. I use '.' rather than '_' in file names because the latter is a shift
|
||||||
|
char.
|
||||||
|
- Add MANIFEST.SKIP, Changelog.ini, Build.PL, META.json.
|
||||||
|
- Add an FAQ to the docs.
|
||||||
|
- Clean up the docs.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.14]
|
||||||
|
Date=2011-03-24T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Resolved #63080: module can write multiline values but not read them
|
||||||
|
- Removed -w from tests to allow tests with tainting on
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.13]
|
||||||
|
Date=2010-09-03T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Resolved #60703: Display glitch in Config::Tiny 2.12 POD
|
||||||
|
- Resolved #40585: member 'set;' doesn't exist
|
||||||
|
- Resolved #30479: does not warn or die when writing data it
|
||||||
|
cannot later.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.12]
|
||||||
|
Date=2007-11-01T12:00:00
|
||||||
|
Comments=- Converting build script from Module::Install to tinier EU:MM
|
||||||
|
|
||||||
|
[V 2.10]
|
||||||
|
Date=2006-09-20T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- Did a little housekeeping on Makefile.PL and the unit tests
|
||||||
|
- Upgrading to Module::Install 0.64
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.09]
|
||||||
|
Date=2006-07-15T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- Added a dependency on ExtUtils::MakeMaker 6.11
|
||||||
|
Module::Install may have an issue with older EU:MM installs
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.08]
|
||||||
|
Date=2012-07-15T00:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- Upgraded to Module::Install 0.63
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.07]
|
||||||
|
Date=2006-05-10T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- AutoInstall is only needed for options, so remove auto_install
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.06]
|
||||||
|
Date=2006-04-23T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- No functional changes.
|
||||||
|
- Moved test.conf to the root dir, removing last use of File::Spec
|
||||||
|
- It also means we don't need FindBin, so removed that too
|
||||||
|
- Upgrading to Module::Install 0.62
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.05]
|
||||||
|
Date=2006-02-23T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- No functional changes.
|
||||||
|
- Moved over from the old CVS repository to the new SVN one
|
||||||
|
- Updated tests for the new release system
|
||||||
|
- Upgrading to a newer Module::Install
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.04]
|
||||||
|
Date=2005-12-31T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- No functional changes.
|
||||||
|
- Upgrading to a newer Module::Install to address Cygwin problem
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.03]
|
||||||
|
Date=2005-12-30T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- No functional changes.
|
||||||
|
- POD Change: CPAN #15143 Clear things up about $! after
|
||||||
|
unsuccessful read()? (flatworm)
|
||||||
|
- Upgraded Makefile.PL to use Module::Install
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.02]
|
||||||
|
Date=2005-06-19T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Add trimming of whitespace from the section names so that we can
|
||||||
|
use section tags like [ section ] and have it Do What You Mean.
|
||||||
|
- Cleaned up the POD a little more.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.01]
|
||||||
|
Date=2005-03-24T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Lars Thegler noted in CSS::Tiny that 3-argument open is not
|
||||||
|
supported by 5.005. Added a small fix to change it to 2-argument
|
||||||
|
open.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 2.00]
|
||||||
|
Date=2004-07-16T12:00:00
|
||||||
|
Comments=- Final tweaks to round out complete 5.004 and Win32 compatibility
|
||||||
|
|
||||||
|
[V 1.9]
|
||||||
|
Date=2004-07-07T12:00:00
|
||||||
|
Comments=- Applied some small optimisations from Japheth Cleaver
|
||||||
|
|
||||||
|
[V 1.8]
|
||||||
|
Date=2004-06-30T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Fixed a bug whereby trying to load an empty file returned an error,
|
||||||
|
when it should be valid (if an empty object)
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 1.7]
|
||||||
|
Date=2004-06-22T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Added a little more flexibility in the 'read' and 'read_string' methods
|
||||||
|
to handle being called in unexpected, but recoverable, ways.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 1.6]
|
||||||
|
Date=2004-03-01T12:00:00
|
||||||
|
Comments=- Bug fix: Sections without keys didn't appear at all in the parsed struct
|
||||||
|
|
||||||
|
[V 1.5]
|
||||||
|
Date=2004-01-07T12:00:00
|
||||||
|
Comments=- Updating documentation to provide a correct location to send bug reports
|
||||||
|
|
||||||
|
[V 1.4]
|
||||||
|
Date=2003-12-24T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Caught a warning when trying to parse an undefined string.
|
||||||
|
Returns undef in that case.
|
||||||
|
- Merry Christmas and a productive New Year to you all!
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 1.3]
|
||||||
|
Date=2003-11-07T12:00:00
|
||||||
|
Comments= <<EOT
|
||||||
|
- Slightly altered a regex so that trailing whitespace in properties
|
||||||
|
is dropped.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 1.2]
|
||||||
|
Date=2003-08-12T15:51:12
|
||||||
|
Comments= <<EOT
|
||||||
|
- Applied a variety of small changed designed to reduce the number of
|
||||||
|
opcodes generated, without changing the functionality.
|
||||||
|
This should save a few K in load overhead.
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 1.1]
|
||||||
|
Date=2003-04-23T22:56:21
|
||||||
|
Comments= <<EOT
|
||||||
|
- When reporting a bad line, put single quotes around the
|
||||||
|
lines contents in the error message.
|
||||||
|
- Small updates to the pod documentation
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 1.0]
|
||||||
|
Date=2002-12-21T11:53:51
|
||||||
|
Comments= <<EOT
|
||||||
|
- Removed file locking, since we read/write virtually atomically now
|
||||||
|
- Removed mode support from ->write() it was erroneous
|
||||||
|
- Removed dependency on Fcntl
|
||||||
|
- Added the read_string() method
|
||||||
|
- Other minor tweaks to shrink the code
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 0.3]
|
||||||
|
Date=2002-12-09T00:44:21
|
||||||
|
Comments= <<EOT
|
||||||
|
- Upgraded tests to Test::More, to deep test the structs
|
||||||
|
- Added Fcntl to the required modules
|
||||||
|
EOT
|
||||||
|
|
||||||
|
[V 0.2]
|
||||||
|
Date=2002-11-26T21:51:34
|
||||||
|
Comments=- Don't import Fcntl symbols
|
||||||
|
|
||||||
|
[V 0.1]
|
||||||
|
Date=2002-11-13T16:50:23
|
||||||
|
Comments=- original version
|
|
@ -0,0 +1,220 @@
|
||||||
|
Revision history for Perl extension Config-Tiny:
|
||||||
|
|
||||||
|
2.28 2022-01-04T15:47:58
|
||||||
|
- Accept pull request from Todd Rinaldo to replace both uses of bareword filehandles
|
||||||
|
with my variables. With thanx.
|
||||||
|
- Accept 2019 pull request to Makefile.PL, for the purpose of modernization, and with
|
||||||
|
some slight modifications, from Grinnz.
|
||||||
|
- Make corresponding patches where appropriate to Tiny.pm and t/02.main.t.
|
||||||
|
- Thanx to Grinnz aka Dan Book for the prompting.
|
||||||
|
|
||||||
|
2.27 2021-09-21T15:48:00
|
||||||
|
- Add the option of passing a hashref to the constructor, where it is turned into an
|
||||||
|
object of the class. See POD under new([$config]) for details.
|
||||||
|
This patch to the code and POD includes the new test t/08.constructor.t.
|
||||||
|
The patch was provided by D Hauke, with thanx.
|
||||||
|
- Move test.conf back into t/, where it was years ago, before someone tried to remove
|
||||||
|
all uses of File::Spec. But since File::Spec is used often now, there is no point
|
||||||
|
in keeping test.conf in the root directory of the distro.
|
||||||
|
|
||||||
|
2.26 2021-02-01T17:11:00
|
||||||
|
- Update POD to change RT to github.
|
||||||
|
- Reformat Makefile.PL.
|
||||||
|
|
||||||
|
2.25 2021-01-31T20:29:00
|
||||||
|
- Merge in clean-up patches from Karen Etheridge, with thanx.
|
||||||
|
- Add back file t/0. Who deleted it? It is required for t/05.zero.t.
|
||||||
|
- Update Makefile.PL to switch issue tracker from rt.cpan.org to github.
|
||||||
|
|
||||||
|
2.24 2019-06-11T15:30:00
|
||||||
|
- Delete from caveats in documentation where it used to say:
|
||||||
|
'Config::Tiny will only recognize the first time an option is set in a config file.'
|
||||||
|
'Any further attempts to set the same option later in the config file are ignored.'
|
||||||
|
In reality the code uses the 2nd and subsequent values to overwrite earlier values.
|
||||||
|
- Make this topic a new FAQ.
|
||||||
|
- Add corresponding test t/06.repeat.key.t.
|
||||||
|
- Update POD to clarify trailing comment options.
|
||||||
|
- Add corresponding test t/07.trailing.comment.t.
|
||||||
|
- Romanize Gregory Kidrenko's name so Config::IniFiles does not get 'Wide char in print'.
|
||||||
|
- Move xt/pod.t to xt/author/pod.t.
|
||||||
|
- Adopt new repo structure. See
|
||||||
|
http://savage.net.au/Ron/html/My.Workflow.for.Building.Distros.html.
|
||||||
|
- Move require 5.008001 from Tiny.pm into Makefile.PL.
|
||||||
|
|
||||||
|
2.23 2015-10-14T09:11:00
|
||||||
|
- Add the utf8 BOM to this file. Let's hope the CPAN toolchain can cope. If it can't, another
|
||||||
|
version of the code will have to be released.
|
||||||
|
- Fix read() and write() so they work on files called '0' (zero). See RT#107754.
|
||||||
|
Many thanx to Gregory Kidrenko for the report and patch.
|
||||||
|
- Add t/05.zero.t and t/0 to test the new code.
|
||||||
|
- Reformat the source slightly.
|
||||||
|
|
||||||
|
2.22 2015-02-17T08:32:00
|
||||||
|
- Fix licence info in Makefile.PL to say Perl.
|
||||||
|
|
||||||
|
2.21 2015-02-16T08:59:00
|
||||||
|
- Patch Makefile.PL to refer to the current repo, which is on github, and not the original one,
|
||||||
|
which is on Adam's web site. See RT#102125.
|
||||||
|
- Remove Build.PL because Karen Etheridge tells me Module::Build is no longer in core.
|
||||||
|
See RT#102126.
|
||||||
|
- Edit line lengths in this file to a max of 100 chars.
|
||||||
|
- Edit line lengths in the docs the same way.
|
||||||
|
- Expand the See Also section of the docs.
|
||||||
|
|
||||||
|
2.20 2013-11-24T10:52:00
|
||||||
|
- Relax pre-req version requirements
|
||||||
|
|
||||||
|
2.19 2013-09-15T09:16:00
|
||||||
|
- Change VERSION => $VERSION in Makefile.PL to VERSION_FROM => 'lib/Config/Tiny.pm'.
|
||||||
|
Reported by Jean-Louis Morel. See RT#88670.
|
||||||
|
|
||||||
|
2.18 2013-09-14T10:03:00
|
||||||
|
- Remove obsolete and wrong version # from Makefile.PL.
|
||||||
|
Reported by Jean-Louis Morel. See RT#88658.
|
||||||
|
- Implement Kevin Ryde's suggestion to test if read() will return undef.
|
||||||
|
If so, set an error message and (still) return undef.
|
||||||
|
|
||||||
|
2.17 2013-09-13T12:41:00
|
||||||
|
- Remove the file tests -efr during calls to read(). The open() tests for any error.
|
||||||
|
Also, the -f test was reporting /dev/null as a directory, not a file.
|
||||||
|
Thanx to Kevin Ryde for pushing me to implement this. See RT#36974.
|
||||||
|
- Clean up some error messages slightly.
|
||||||
|
|
||||||
|
2.16 2013-09-06T11:54:00
|
||||||
|
- Replace Path::Tiny with File::Spec, because the former's list of dependencies is so long :-(.
|
||||||
|
Changed files: t/02.main.t, t/04.utf8.t, Build.PL and Makefile.PL.
|
||||||
|
See: RT#88435 (for Tree::DAG_Node) for an explanation.
|
||||||
|
|
||||||
|
2.15 2013-08-04T14:59:00
|
||||||
|
- Clean up the shambolic dates in this file.
|
||||||
|
- Add a note under Caveats about setting options more that once. Only the first case is
|
||||||
|
respected. Thanx to Kimmel K. See RT#69795.
|
||||||
|
- Add a $encoding parameter to read_file() and write_file(). See docs for details.
|
||||||
|
Add t/04.utf8.t and t/04.utf8.txt.
|
||||||
|
Thanx to Mark Lawrence and Wolfgang Husmann. See RT#71029 and RT#85571.
|
||||||
|
- For BSD-based systems, when writing a file during tests, use:
|
||||||
|
my($temp_dir) = File::Temp -> newdir('temp.XXXX', CLEANUP => 1, EXLOCK => 0, TMPDIR => 1);
|
||||||
|
- Rename t/*.t files. I use '.' rather than '_' in file names because the latter is a shift
|
||||||
|
char.
|
||||||
|
- Add MANIFEST.SKIP, Changelog.ini, Build.PL, META.json.
|
||||||
|
- Add an FAQ to the docs.
|
||||||
|
- Clean up the docs.
|
||||||
|
|
||||||
|
2.14 Thu Mar 24 12:00:00 2011
|
||||||
|
- Resolved #63080: module can write multiline values but not read them
|
||||||
|
- Removed -w from tests to allow tests with tainting on
|
||||||
|
|
||||||
|
2.13 Fri Sep 3 12:00:00 2010
|
||||||
|
- Resolved #60703: Display glitch in Config::Tiny 2.12 POD
|
||||||
|
- Resolved #40585: member 'set;' doesn't exist
|
||||||
|
- Resolved #30479: does not warn or die when writing data it
|
||||||
|
cannot later.
|
||||||
|
|
||||||
|
2.12 Thu Nov 1 12:00:00 2007
|
||||||
|
- Converting build script from Module::Install to tinier EU:MM
|
||||||
|
|
||||||
|
2.10 Sat Sep 20 12:00:00 2006
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- Did a little housekeeping on Makefile.PL and the unit tests
|
||||||
|
- Upgrading to Module::Install 0.64
|
||||||
|
|
||||||
|
2.09 Sat Jul 15 12:00:00 2006
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- Added a dependency on ExtUtils::MakeMaker 6.11
|
||||||
|
Module::Install may have an issue with older EU:MM installs
|
||||||
|
|
||||||
|
2.08 Sat 15 Jul 12:00:00 2006
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- Upgraded to Module::Install 0.63
|
||||||
|
|
||||||
|
2.07 Wed May 10 12:00:00 2006
|
||||||
|
- This release contains only build-time changes
|
||||||
|
- AutoInstall is only needed for options, so remove auto_install
|
||||||
|
|
||||||
|
2.06 Sun Apr 23 12:00:00 2006
|
||||||
|
- No functional changes.
|
||||||
|
- Moved test.conf to the root dir, removing last use of File::Spec
|
||||||
|
- It also means we don't need FindBin, so removed that too
|
||||||
|
- Upgrading to Module::Install 0.62
|
||||||
|
|
||||||
|
2.05 Thu Feb 23 12:00:00 2006
|
||||||
|
- No functional changes.
|
||||||
|
- Moved over from the old CVS repository to the new SVN one
|
||||||
|
- Updated tests for the new release system
|
||||||
|
- Upgrading to a newer Module::Install
|
||||||
|
|
||||||
|
2.04 Sat Dec 31 12:00:00 2005
|
||||||
|
- No functional changes.
|
||||||
|
- Upgrading to a newer Module::Install to address Cygwin problem
|
||||||
|
|
||||||
|
2.03 Fri Dec 30 12:00:00 2005
|
||||||
|
- No functional changes.
|
||||||
|
- POD Change: CPAN #15143 Clear things up about $! after
|
||||||
|
unsuccessful read()? (flatworm)
|
||||||
|
- Upgraded Makefile.PL to use Module::Install
|
||||||
|
|
||||||
|
2.02 Sun Jun 19 12:00:00 2005
|
||||||
|
- Add trimming of whitespace from the section names so that we can
|
||||||
|
use section tags like [ section ] and have it Do What You Mean.
|
||||||
|
- Cleaned up the POD a little more.
|
||||||
|
|
||||||
|
2.01 Thu Mar 24 12:00:00 2005
|
||||||
|
- Lars Thegler noted in CSS::Tiny that 3-argument open is not
|
||||||
|
supported by 5.005. Added a small fix to change it to 2-argument
|
||||||
|
open.
|
||||||
|
|
||||||
|
2.00 Fri Jul 16 12:00:00 2004
|
||||||
|
- Final tweaks to round out complete 5.004 and Win32 compatibility
|
||||||
|
|
||||||
|
1.9 Wed Jul 7 12:00:00 2004
|
||||||
|
- Applied some small optimisations from Japheth Cleaver
|
||||||
|
|
||||||
|
1.8 Wed Jun 30 12:00:00 2004
|
||||||
|
- Fixed a bug whereby trying to load an empty file returned an error,
|
||||||
|
when it should be valid (if an empty object)
|
||||||
|
|
||||||
|
1.7 Tue Jun 22 12:00:00 2004
|
||||||
|
- Added a little more flexibility in the 'read' and 'read_string' methods
|
||||||
|
to handle being called in unexpected, but recoverable, ways.
|
||||||
|
|
||||||
|
1.6 Mon Mar 1 12:00:00 2004
|
||||||
|
- Bug fix: Sections without keys didn't appear at all in the parsed struct
|
||||||
|
|
||||||
|
1.5 Wed Jan 7 12:00:00 2004
|
||||||
|
- Updating documentation to provide a correct location to send bug reports
|
||||||
|
|
||||||
|
1.4 Wed Dec 24 12:00:00 2003
|
||||||
|
- Caught a warning when trying to parse an undefined string.
|
||||||
|
Returns undef in that case.
|
||||||
|
- Merry Christmas and a productive New Year to you all!
|
||||||
|
|
||||||
|
1.3 Fri Nov 7 12:00:00 2003
|
||||||
|
- Slightly altered a regex so that trailing whitespace in properties
|
||||||
|
is dropped.
|
||||||
|
|
||||||
|
1.2 Wed Aug 12 15:51:12 2003
|
||||||
|
- Applied a variety of small changed designed to reduce the number of
|
||||||
|
opcodes generated, without changing the functionality.
|
||||||
|
This should save a few K in load overhead.
|
||||||
|
|
||||||
|
1.1 Wed Apr 23 22:56:21 2003
|
||||||
|
- When reporting a bad line, put single quotes around the
|
||||||
|
lines contents in the error message.
|
||||||
|
- Small updates to the pod documentation
|
||||||
|
|
||||||
|
1.0 Sat Dec 21 11:53:51 2002
|
||||||
|
- Removed file locking, since we read/write virtually atomically now
|
||||||
|
- Removed mode support from ->write() it was erroneous
|
||||||
|
- Removed dependency on Fcntl
|
||||||
|
- Added the read_string() method
|
||||||
|
- Other minor tweaks to shrink the code
|
||||||
|
|
||||||
|
0.3 Mon Dec 09 00:44:21 2002
|
||||||
|
- Upgraded tests to Test::More, to deep test the structs
|
||||||
|
- Added Fcntl to the required modules
|
||||||
|
|
||||||
|
0.2 Tue Nov 26 21:51:34 2002
|
||||||
|
- Don't import Fcntl symbols
|
||||||
|
|
||||||
|
0.1 Wed Nov 13 16:50:23 2002
|
||||||
|
- original version
|
|
@ -0,0 +1,378 @@
|
||||||
|
Terms of Perl 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 General Public License (GPL)
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, 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 licenses for most software are designed to take away your freedom to share
|
||||||
|
and change it. By contrast, the GNU 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. This General Public License applies to most of
|
||||||
|
the Free Software Foundation's software and to any other program whose
|
||||||
|
authors commit to using it. (Some other Free Software Foundation software is
|
||||||
|
covered by the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not price. Our
|
||||||
|
General Public Licenses are designed to make sure that you have the freedom
|
||||||
|
to distribute copies of free software (and charge for this service if you wish), 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 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 show
|
||||||
|
them these terms so they know 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.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software patents. We wish
|
||||||
|
to avoid the danger that redistributors of a free program will individually obtain
|
||||||
|
patent licenses, in effect making the program proprietary. To prevent this, we
|
||||||
|
have made it clear that any patent must be licensed for everyone's free use or
|
||||||
|
not licensed at all.
|
||||||
|
|
||||||
|
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 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
|
||||||
|
derivative work under copyright law: that is to say, a work containing the
|
||||||
|
Program or a portion of it, either verbatim or with modifications and/or translated
|
||||||
|
into another language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not covered by
|
||||||
|
this License; they are outside its scope. The act of running the Program is not
|
||||||
|
restricted, and the output from the Program is covered only if its contents
|
||||||
|
constitute a work based on the Program (independent of having been made by
|
||||||
|
running the Program). Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
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 License and to the absence of any
|
||||||
|
warranty; and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion of it, thus
|
||||||
|
forming a work based on the Program, and copy and distribute such
|
||||||
|
modifications or work under the terms of Section 1 above, provided that you also
|
||||||
|
meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices stating that you
|
||||||
|
changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in whole or in
|
||||||
|
part contains or is derived from the Program or any part thereof, to be licensed
|
||||||
|
as a whole at no charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively when run, you
|
||||||
|
must cause it, when started running for such interactive use in the most ordinary
|
||||||
|
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 License. (Exception: if the
|
||||||
|
Program itself is interactive but does not normally print such an announcement,
|
||||||
|
your work based on the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If identifiable
|
||||||
|
sections of that work are not derived from the Program, and can be reasonably
|
||||||
|
considered independent and separate works in themselves, then this License,
|
||||||
|
and its terms, do not apply to those sections when you distribute them as
|
||||||
|
separate works. But when you distribute the same sections as part of a whole
|
||||||
|
which is a work based on the Program, the distribution of the whole must be on
|
||||||
|
the terms of this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest your rights to
|
||||||
|
work written entirely by you; rather, the intent is to exercise the right to control
|
||||||
|
the distribution of derivative or collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program with the
|
||||||
|
Program (or with a work based on the Program) on a volume of a storage or
|
||||||
|
distribution medium does not bring the other work under the scope of this
|
||||||
|
License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it, under
|
||||||
|
Section 2) in object code or executable form under the terms of Sections 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 Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three years, to give any
|
||||||
|
third party, for a charge no more than your cost of physically performing source
|
||||||
|
distribution, a complete machine-readable copy of the corresponding source
|
||||||
|
code, to be distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer to distribute
|
||||||
|
corresponding source code. (This alternative is allowed only for noncommercial
|
||||||
|
distribution and only if you received the program in object code or executable
|
||||||
|
form with such an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for making
|
||||||
|
modifications to it. For an executable work, complete source code means all the
|
||||||
|
source code for all modules it contains, plus any associated interface definition
|
||||||
|
files, plus the scripts used to control compilation and installation of the
|
||||||
|
executable. However, as a special exception, the source code distributed need
|
||||||
|
not include anything that is normally distributed (in either source or binary form)
|
||||||
|
with the major components (compiler, kernel, and so on) of the operating system
|
||||||
|
on which the executable runs, unless that component itself accompanies the
|
||||||
|
executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the source
|
||||||
|
code from the same place counts as distribution of the source code, even though
|
||||||
|
third parties are not compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program except as
|
||||||
|
expressly provided under this License. Any attempt otherwise to copy, modify,
|
||||||
|
sublicense or distribute the Program is void, and will automatically terminate
|
||||||
|
your rights under this License. However, parties who have received copies, or
|
||||||
|
rights, from you under this License will not have their licenses terminated so long
|
||||||
|
as such parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not signed it.
|
||||||
|
However, nothing else grants you permission to modify or distribute the Program
|
||||||
|
or its derivative works. These actions are prohibited by law if you do not accept
|
||||||
|
this License. Therefore, by modifying or distributing 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 for copying, distributing or modifying the
|
||||||
|
Program or works based on it.
|
||||||
|
|
||||||
|
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. You are not responsible for enforcing compliance by third parties
|
||||||
|
to this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent infringement
|
||||||
|
or for any other reason (not limited to patent issues), conditions are imposed on
|
||||||
|
you (whether by court order, agreement or otherwise) that contradict the
|
||||||
|
conditions of this License, they do not excuse you from the conditions of this
|
||||||
|
License. If you cannot distribute so as to satisfy simultaneously your obligations
|
||||||
|
under this License and any other pertinent obligations, then as a consequence
|
||||||
|
you may not distribute the Program at all. For example, if a patent license would
|
||||||
|
not permit royalty-free redistribution of the Program by all those who receive
|
||||||
|
copies directly or indirectly through you, then the only way you could satisfy
|
||||||
|
both it and this License would be to refrain entirely from distribution of the
|
||||||
|
Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any particular
|
||||||
|
circumstance, the balance of the section is intended to apply and the section as
|
||||||
|
a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any patents or other
|
||||||
|
property right claims or to contest validity of any such claims; this section has
|
||||||
|
the sole purpose of protecting the integrity of the free software distribution
|
||||||
|
system, which is implemented by public license practices. Many people have
|
||||||
|
made generous contributions to the wide range of software distributed through
|
||||||
|
that system in reliance on consistent application of that system; it is up to the
|
||||||
|
author/donor to decide if he or she is willing to distribute software through any
|
||||||
|
other system and a licensee cannot impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to be a
|
||||||
|
consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in certain countries
|
||||||
|
either by patents or by copyrighted interfaces, the original copyright holder who
|
||||||
|
places the Program under this License may add an explicit geographical
|
||||||
|
distribution limitation excluding those countries, so that distribution is permitted
|
||||||
|
only in or among countries not thus excluded. In such case, this License
|
||||||
|
incorporates the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. 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 this 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 this License, you may choose any version ever
|
||||||
|
published by the Free Software Foundation.
|
||||||
|
|
||||||
|
10. 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
|
||||||
|
|
||||||
|
11. 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.
|
||||||
|
|
||||||
|
12. 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
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
.travis.yml
|
||||||
|
Changelog.ini
|
||||||
|
Changes
|
||||||
|
lib/Config/Tiny.pm
|
||||||
|
LICENSE
|
||||||
|
Makefile.PL
|
||||||
|
MANIFEST This list of files
|
||||||
|
MANIFEST.SKIP
|
||||||
|
README
|
||||||
|
t/0
|
||||||
|
t/00.versions.t
|
||||||
|
t/00.versions.tx
|
||||||
|
t/01.compile.t
|
||||||
|
t/02.main.t
|
||||||
|
t/03.read.string.t
|
||||||
|
t/04.utf8.t
|
||||||
|
t/04.utf8.txt
|
||||||
|
t/05.zero.t
|
||||||
|
t/06.repeat.key.t
|
||||||
|
t/07.trailing.comment.t
|
||||||
|
t/08.constructor.t
|
||||||
|
t/test.conf
|
||||||
|
xt/author/pod.t
|
||||||
|
xt/meta.t
|
||||||
|
xt/pmv.t
|
||||||
|
META.yml Module YAML meta-data (added by MakeMaker)
|
||||||
|
META.json Module JSON meta-data (added by MakeMaker)
|
|
@ -0,0 +1,47 @@
|
||||||
|
# Avoid version control files.
|
||||||
|
,v$
|
||||||
|
\B\.cvsignore$
|
||||||
|
\B\.git\b
|
||||||
|
\B\.gitignore\b
|
||||||
|
\B\.svn\b
|
||||||
|
\bCVS\b
|
||||||
|
\bRCS\b
|
||||||
|
|
||||||
|
# Avoid Makemaker generated and utility files.
|
||||||
|
\bblib
|
||||||
|
\bblibdirs$
|
||||||
|
\bpm_to_blib$
|
||||||
|
\bMakefile$
|
||||||
|
\bMakeMaker-\d
|
||||||
|
|
||||||
|
# Avoid Module::Build generated and utility files.
|
||||||
|
\b_build
|
||||||
|
\bBuild$
|
||||||
|
\bBuild.bat$
|
||||||
|
|
||||||
|
# Avoid Devel::Cover generated files
|
||||||
|
\bcover_db
|
||||||
|
|
||||||
|
# Avoid temp and backup files.
|
||||||
|
~$
|
||||||
|
\#$
|
||||||
|
\.#
|
||||||
|
\.bak$
|
||||||
|
\.old$
|
||||||
|
\.rej$
|
||||||
|
\.tmp$
|
||||||
|
|
||||||
|
# Avoid OS-specific files/dirs
|
||||||
|
# Mac OSX metadata
|
||||||
|
\B\.DS_Store
|
||||||
|
# Mac OSX SMB mount metadata files
|
||||||
|
\B\._
|
||||||
|
|
||||||
|
# Avoid UltraEdit files.
|
||||||
|
\.prj$
|
||||||
|
\.pui$
|
||||||
|
|
||||||
|
^MYMETA.yml$
|
||||||
|
^MYMETA\.json$
|
||||||
|
|
||||||
|
^Config-Tiny-.*
|
|
@ -0,0 +1,65 @@
|
||||||
|
{
|
||||||
|
"abstract" : "Read/Write .ini style files with as little code as possible",
|
||||||
|
"author" : [
|
||||||
|
"Adam Kennedy <adamk@cpan.org>"
|
||||||
|
],
|
||||||
|
"dynamic_config" : 1,
|
||||||
|
"generated_by" : "ExtUtils::MakeMaker version 7.62, CPAN::Meta::Converter version 2.150010",
|
||||||
|
"license" : [
|
||||||
|
"perl_5"
|
||||||
|
],
|
||||||
|
"meta-spec" : {
|
||||||
|
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
|
||||||
|
"version" : 2
|
||||||
|
},
|
||||||
|
"name" : "Config-Tiny",
|
||||||
|
"no_index" : {
|
||||||
|
"directory" : [
|
||||||
|
"t",
|
||||||
|
"inc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"prereqs" : {
|
||||||
|
"build" : {
|
||||||
|
"requires" : {
|
||||||
|
"Test::More" : "0.47"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"configure" : {
|
||||||
|
"requires" : {
|
||||||
|
"ExtUtils::MakeMaker" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime" : {
|
||||||
|
"requires" : {
|
||||||
|
"File::Spec" : "3.30",
|
||||||
|
"File::Temp" : "0.22",
|
||||||
|
"perl" : "5.008001",
|
||||||
|
"strict" : "0",
|
||||||
|
"utf8" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test" : {
|
||||||
|
"requires" : {
|
||||||
|
"Test::More" : "1.001002",
|
||||||
|
"Test::Pod" : "1.51"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"release_status" : "stable",
|
||||||
|
"resources" : {
|
||||||
|
"bugtracker" : {
|
||||||
|
"web" : "https://github.com/ronsavage/Config-Tiny/issues"
|
||||||
|
},
|
||||||
|
"license" : [
|
||||||
|
"http://opensource.org/licenses/Perl"
|
||||||
|
],
|
||||||
|
"repository" : {
|
||||||
|
"type" : "git",
|
||||||
|
"url" : "https://github.com/ronsavage/Config-Tiny.git",
|
||||||
|
"web" : "https://github.com/ronsavage/Config-Tiny"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version" : "2.28",
|
||||||
|
"x_serialization_backend" : "JSON::PP version 4.06"
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
abstract: 'Read/Write .ini style files with as little code as possible'
|
||||||
|
author:
|
||||||
|
- 'Adam Kennedy <adamk@cpan.org>'
|
||||||
|
build_requires:
|
||||||
|
Test::More: '1.001002'
|
||||||
|
Test::Pod: '1.51'
|
||||||
|
configure_requires:
|
||||||
|
ExtUtils::MakeMaker: '0'
|
||||||
|
dynamic_config: 1
|
||||||
|
generated_by: 'ExtUtils::MakeMaker version 7.62, 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: Config-Tiny
|
||||||
|
no_index:
|
||||||
|
directory:
|
||||||
|
- t
|
||||||
|
- inc
|
||||||
|
requires:
|
||||||
|
File::Spec: '3.30'
|
||||||
|
File::Temp: '0.22'
|
||||||
|
perl: '5.008001'
|
||||||
|
strict: '0'
|
||||||
|
utf8: '0'
|
||||||
|
resources:
|
||||||
|
bugtracker: https://github.com/ronsavage/Config-Tiny/issues
|
||||||
|
license: http://opensource.org/licenses/Perl
|
||||||
|
repository: https://github.com/ronsavage/Config-Tiny.git
|
||||||
|
version: '2.28'
|
||||||
|
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
|
|
@ -0,0 +1,83 @@
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use ExtUtils::MakeMaker;
|
||||||
|
|
||||||
|
# ----------------------
|
||||||
|
|
||||||
|
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
|
||||||
|
# the contents of the Makefile that is written.
|
||||||
|
|
||||||
|
my(%params) =
|
||||||
|
(
|
||||||
|
("$]" >= '5.005') ?
|
||||||
|
(
|
||||||
|
AUTHOR => 'Adam Kennedy <adamk@cpan.org>',
|
||||||
|
ABSTRACT => 'Read/Write .ini style files with as little code as possible',
|
||||||
|
) : (),
|
||||||
|
clean =>
|
||||||
|
{
|
||||||
|
FILES => 'blib/* Makefile MANIFEST Config-Tiny-*',
|
||||||
|
},
|
||||||
|
dist =>
|
||||||
|
{
|
||||||
|
COMPRESS => 'gzip',
|
||||||
|
SUFFIX => 'gz',
|
||||||
|
},
|
||||||
|
BUILD_REQUIRES =>
|
||||||
|
{
|
||||||
|
# Skip on Windows to avoid breaking ActivePerl PPMs
|
||||||
|
# 0.47 means 5.6.2 or newer, which everyone on Win32 has.
|
||||||
|
($^O eq 'MSWin32' ? () : ('Test::More' => '0.47') ),
|
||||||
|
},
|
||||||
|
DISTNAME => 'Config-Tiny',
|
||||||
|
EXE_FILES => [],
|
||||||
|
MIN_PERL_VERSION => '5.008001',
|
||||||
|
NAME => 'Config::Tiny',
|
||||||
|
PL_FILES => {},
|
||||||
|
PREREQ_PM =>
|
||||||
|
{
|
||||||
|
'File::Spec' => '3.30',
|
||||||
|
'File::Temp' => '0.22',
|
||||||
|
'strict' => '0',
|
||||||
|
'utf8' => '0',
|
||||||
|
},
|
||||||
|
TEST_REQUIRES =>
|
||||||
|
{
|
||||||
|
'Test::More' => '1.001002',
|
||||||
|
'Test::Pod' => '1.51',
|
||||||
|
},
|
||||||
|
VERSION_FROM => 'lib/Config/Tiny.pm',
|
||||||
|
);
|
||||||
|
|
||||||
|
if (eval{ExtUtils::MakeMaker->VERSION('6.30')})
|
||||||
|
{
|
||||||
|
$params{LICENSE} = 'perl';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eval{ExtUtils::MakeMaker->VERSION('6.46')})
|
||||||
|
{
|
||||||
|
$params{META_MERGE} =
|
||||||
|
{
|
||||||
|
'meta-spec' =>
|
||||||
|
{
|
||||||
|
version => 2,
|
||||||
|
},
|
||||||
|
resources =>
|
||||||
|
{
|
||||||
|
bugtracker =>
|
||||||
|
{
|
||||||
|
web => 'https://github.com/ronsavage/Config-Tiny/issues',
|
||||||
|
},
|
||||||
|
license => 'http://opensource.org/licenses/Perl',
|
||||||
|
repository =>
|
||||||
|
{
|
||||||
|
type => 'git',
|
||||||
|
url => 'https://github.com/ronsavage/Config-Tiny.git',
|
||||||
|
web => 'https://github.com/ronsavage/Config-Tiny',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteMakefile(%params);
|
|
@ -0,0 +1,49 @@
|
||||||
|
README file for Config::Tiny.
|
||||||
|
|
||||||
|
See also: Changes and Changelog.ini.
|
||||||
|
|
||||||
|
Warning: WinZip 8.1 and 9.0 both contain an 'accidental' bug which stops
|
||||||
|
them recognizing POSIX-style directory structures in valid tar files.
|
||||||
|
You are better off using a reliable tool such as InfoZip:
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/
|
||||||
|
|
||||||
|
1 Installing from a Unix-like distro
|
||||||
|
------------------------------------
|
||||||
|
shell>gunzip Config-Tiny-2.20.tgz
|
||||||
|
shell>tar xvf Config-Tiny-2.20.tar
|
||||||
|
|
||||||
|
On Unix-like systems, assuming you have installed Module::Build V 0.25+:
|
||||||
|
|
||||||
|
shell>perl Build.PL
|
||||||
|
shell>./Build
|
||||||
|
shell>./Build test
|
||||||
|
shell>./Build install
|
||||||
|
|
||||||
|
On MS Windows-like systems, assuming you have installed Module::Build V 0.25+:
|
||||||
|
|
||||||
|
shell>perl Build.PL
|
||||||
|
shell>perl Build
|
||||||
|
shell>perl Build test
|
||||||
|
shell>perl Build install
|
||||||
|
|
||||||
|
Alternately, without Module::Build, you do this:
|
||||||
|
|
||||||
|
Note: 'make' on MS Windows-like systems may be called 'nmake' or 'dmake'.
|
||||||
|
|
||||||
|
shell>perl Makefile.PL
|
||||||
|
shell>make
|
||||||
|
shell>make test
|
||||||
|
shell>su (for Unix-like systems)
|
||||||
|
shell>make install
|
||||||
|
shell>exit (for Unix-like systems)
|
||||||
|
|
||||||
|
On all systems:
|
||||||
|
|
||||||
|
Run Tiny.pm through your favourite pod2html translator.
|
||||||
|
|
||||||
|
2 Installing from an ActiveState distro
|
||||||
|
---------------------------------------
|
||||||
|
shell>unzip Config-Tiny-2.20.zip
|
||||||
|
shell>ppm install --location=. Config-Tiny
|
||||||
|
shell>del Config-Tiny-2.20.ppd
|
||||||
|
shell>del PPM-Config-Tiny-2.20.tar.gz
|
|
@ -0,0 +1,491 @@
|
||||||
|
package Config::Tiny;
|
||||||
|
|
||||||
|
# If you thought Config::Simple was small...
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use 5.008001; # For the utf8 stuff.
|
||||||
|
|
||||||
|
# Warning: There is another version line, in t/02.main.t.
|
||||||
|
|
||||||
|
our $VERSION = '2.28';
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
$Config::Tiny::errstr = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create an object.
|
||||||
|
|
||||||
|
sub new { return bless defined $_[1] ? $_[1] : {}, $_[0] }
|
||||||
|
|
||||||
|
# Create an object from a file.
|
||||||
|
|
||||||
|
sub read
|
||||||
|
{
|
||||||
|
my($class) = ref $_[0] ? ref shift : shift;
|
||||||
|
my($file, $encoding) = @_;
|
||||||
|
|
||||||
|
return $class -> _error('No file name provided') if (! defined $file || ($file eq '') );
|
||||||
|
|
||||||
|
# Slurp in the file.
|
||||||
|
|
||||||
|
$encoding = $encoding ? "<:$encoding" : '<';
|
||||||
|
local $/ = undef;
|
||||||
|
|
||||||
|
open(my $CFG, $encoding, $file) or return $class -> _error( "Failed to open file '$file' for reading: $!" );
|
||||||
|
my $contents = <$CFG>;
|
||||||
|
close($CFG );
|
||||||
|
|
||||||
|
return $class -> _error("Reading from '$file' returned undef") if (! defined $contents);
|
||||||
|
|
||||||
|
return $class -> read_string( $contents );
|
||||||
|
|
||||||
|
} # End of read.
|
||||||
|
|
||||||
|
# Create an object from a string.
|
||||||
|
|
||||||
|
sub read_string
|
||||||
|
{
|
||||||
|
my($class) = ref $_[0] ? ref shift : shift;
|
||||||
|
my($self) = bless {}, $class;
|
||||||
|
|
||||||
|
return undef unless defined $_[0];
|
||||||
|
|
||||||
|
# Parse the file.
|
||||||
|
|
||||||
|
my $ns = '_';
|
||||||
|
my $counter = 0;
|
||||||
|
|
||||||
|
foreach ( split /(?:\015{1,2}\012|\015|\012)/, shift )
|
||||||
|
{
|
||||||
|
$counter++;
|
||||||
|
|
||||||
|
# Skip comments and empty lines.
|
||||||
|
|
||||||
|
next if /^\s*(?:\#|\;|$)/;
|
||||||
|
|
||||||
|
# Remove inline comments.
|
||||||
|
|
||||||
|
s/\s\;\s.+$//g;
|
||||||
|
|
||||||
|
# Handle section headers.
|
||||||
|
|
||||||
|
if ( /^\s*\[\s*(.+?)\s*\]\s*$/ )
|
||||||
|
{
|
||||||
|
# Create the sub-hash if it doesn't exist.
|
||||||
|
# Without this sections without keys will not
|
||||||
|
# appear at all in the completed struct.
|
||||||
|
|
||||||
|
$self->{$ns = $1} ||= {};
|
||||||
|
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle properties.
|
||||||
|
|
||||||
|
if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ )
|
||||||
|
{
|
||||||
|
$self->{$ns}->{$1} = $2;
|
||||||
|
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $self -> _error( "Syntax error at line $counter: '$_'" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Save an object to a file.
|
||||||
|
|
||||||
|
sub write
|
||||||
|
{
|
||||||
|
my($self) = shift;
|
||||||
|
my($file, $encoding) = @_;
|
||||||
|
|
||||||
|
return $self -> _error('No file name provided') if (! defined $file or ($file eq '') );
|
||||||
|
|
||||||
|
$encoding = $encoding ? ">:$encoding" : '>';
|
||||||
|
|
||||||
|
# Write it to the file.
|
||||||
|
|
||||||
|
my($string) = $self->write_string;
|
||||||
|
|
||||||
|
return undef unless defined $string;
|
||||||
|
|
||||||
|
open(my $CFG, $encoding, $file) or return $self->_error("Failed to open file '$file' for writing: $!");
|
||||||
|
print $CFG $string;
|
||||||
|
close($CFG);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
} # End of write.
|
||||||
|
|
||||||
|
# Save an object to a string.
|
||||||
|
|
||||||
|
sub write_string
|
||||||
|
{
|
||||||
|
my($self) = shift;
|
||||||
|
my($contents) = '';
|
||||||
|
|
||||||
|
for my $section ( sort { (($b eq '_') <=> ($a eq '_')) || ($a cmp $b) } keys %$self )
|
||||||
|
{
|
||||||
|
# Check for several known-bad situations with the section
|
||||||
|
# 1. Leading whitespace
|
||||||
|
# 2. Trailing whitespace
|
||||||
|
# 3. Newlines in section name.
|
||||||
|
|
||||||
|
return $self->_error("Illegal whitespace in section name '$section'") if $section =~ /(?:^\s|\n|\s$)/s;
|
||||||
|
|
||||||
|
my $block = $self->{$section};
|
||||||
|
$contents .= "\n" if length $contents;
|
||||||
|
$contents .= "[$section]\n" unless $section eq '_';
|
||||||
|
|
||||||
|
for my $property ( sort keys %$block )
|
||||||
|
{
|
||||||
|
return $self->_error("Illegal newlines in property '$section.$property'") if $block->{$property} =~ /(?:\012|\015)/s;
|
||||||
|
|
||||||
|
$contents .= "$property=$block->{$property}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $contents;
|
||||||
|
|
||||||
|
} # End of write_string.
|
||||||
|
|
||||||
|
# Error handling.
|
||||||
|
|
||||||
|
sub errstr { $Config::Tiny::errstr }
|
||||||
|
sub _error { $Config::Tiny::errstr = $_[1]; undef }
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Config::Tiny - Read/Write .ini style files with as little code as possible
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# In your configuration file
|
||||||
|
rootproperty=blah
|
||||||
|
|
||||||
|
[section]
|
||||||
|
one=twp
|
||||||
|
three= four
|
||||||
|
Foo =Bar
|
||||||
|
empty=
|
||||||
|
|
||||||
|
# In your program
|
||||||
|
use Config::Tiny;
|
||||||
|
|
||||||
|
# Create an empty config
|
||||||
|
my $Config = Config::Tiny->new;
|
||||||
|
|
||||||
|
# Create a config with data
|
||||||
|
my $config = Config::Tiny->new({
|
||||||
|
_ => { rootproperty => "Bar" },
|
||||||
|
section => { one => "value", Foo => 42 } });
|
||||||
|
|
||||||
|
# Open the config
|
||||||
|
$Config = Config::Tiny->read( 'file.conf' );
|
||||||
|
$Config = Config::Tiny->read( 'file.conf', 'utf8' ); # Neither ':' nor '<:' prefix!
|
||||||
|
$Config = Config::Tiny->read( 'file.conf', 'encoding(iso-8859-1)');
|
||||||
|
|
||||||
|
# Reading properties
|
||||||
|
my $rootproperty = $Config->{_}->{rootproperty};
|
||||||
|
my $one = $Config->{section}->{one};
|
||||||
|
my $Foo = $Config->{section}->{Foo};
|
||||||
|
|
||||||
|
# Changing data
|
||||||
|
$Config->{newsection} = { this => 'that' }; # Add a section
|
||||||
|
$Config->{section}->{Foo} = 'Not Bar!'; # Change a value
|
||||||
|
delete $Config->{_}; # Delete a value or section
|
||||||
|
|
||||||
|
# Save a config
|
||||||
|
$Config->write( 'file.conf' );
|
||||||
|
$Config->write( 'file.conf', 'utf8' ); # Neither ':' nor '>:' prefix!
|
||||||
|
|
||||||
|
# Shortcuts
|
||||||
|
my($rootproperty) = $$Config{_}{rootproperty};
|
||||||
|
|
||||||
|
my($config) = Config::Tiny -> read_string('alpha=bet');
|
||||||
|
my($value) = $$config{_}{alpha}; # $value is 'bet'.
|
||||||
|
|
||||||
|
my($config) = Config::Tiny -> read_string("[init]\nalpha=bet");
|
||||||
|
my($value) = $$config{init}{alpha}; # $value is 'bet'.
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
C<Config::Tiny> is a Perl class to read and write .ini style configuration
|
||||||
|
files with as little code as possible, reducing load time and memory overhead.
|
||||||
|
|
||||||
|
Most of the time it is accepted that Perl applications use a lot of memory and modules.
|
||||||
|
|
||||||
|
The C<*::Tiny> family of modules is specifically intended to provide an ultralight alternative
|
||||||
|
to the standard modules.
|
||||||
|
|
||||||
|
This module is primarily for reading human written files, and anything we write shouldn't need to
|
||||||
|
have documentation/comments. If you need something with more power move up to L<Config::Simple>,
|
||||||
|
L<Config::General> or one of the many other C<Config::*> modules.
|
||||||
|
|
||||||
|
Lastly, L<Config::Tiny> does B<not> preserve your comments, whitespace, or the order of your config
|
||||||
|
file.
|
||||||
|
|
||||||
|
See L<Config::Tiny::Ordered> (and possibly others) for the preservation of the order of the entries
|
||||||
|
in the file.
|
||||||
|
|
||||||
|
=head1 CONFIGURATION FILE SYNTAX
|
||||||
|
|
||||||
|
Files are the same format as for MS Windows C<*.ini> files. For example:
|
||||||
|
|
||||||
|
[section]
|
||||||
|
var1=value1
|
||||||
|
var2=value2
|
||||||
|
|
||||||
|
If a property is outside of a section at the beginning of a file, it will
|
||||||
|
be assigned to the C<"root section">, available at C<$Config-E<gt>{_}>.
|
||||||
|
|
||||||
|
Lines starting with C<'#'> or C<';'> are considered comments and ignored,
|
||||||
|
as are blank lines.
|
||||||
|
|
||||||
|
When writing back to the config file, all comments, custom whitespace,
|
||||||
|
and the ordering of your config file elements are discarded. If you need
|
||||||
|
to keep the human elements of a config when writing back, upgrade to
|
||||||
|
something better, this module is not for you.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 errstr()
|
||||||
|
|
||||||
|
Returns a string representing the most recent error, or the empty string.
|
||||||
|
|
||||||
|
You can also retrieve the error message from the C<$Config::Tiny::errstr> variable.
|
||||||
|
|
||||||
|
=head2 new([$config])
|
||||||
|
|
||||||
|
Here, the [] indicate an optional parameter.
|
||||||
|
|
||||||
|
The constructor C<new> creates and returns a C<Config::Tiny> object.
|
||||||
|
|
||||||
|
This will normally be a new, empty configuration, but you may also pass a
|
||||||
|
hashref here which will be turned into an object of this class. This hashref
|
||||||
|
should have a structure suitable for a configuration file, that is, a hash of
|
||||||
|
hashes where the key C<_> is treated specially as the root section.
|
||||||
|
|
||||||
|
=head2 read($filename, [$encoding])
|
||||||
|
|
||||||
|
Here, the [] indicate an optional parameter.
|
||||||
|
|
||||||
|
The C<read> constructor reads a config file, $filename, and returns a new
|
||||||
|
C<Config::Tiny> object containing the properties in the file.
|
||||||
|
|
||||||
|
$encoding may be used to indicate the encoding of the file, e.g. 'utf8' or 'encoding(iso-8859-1)'.
|
||||||
|
|
||||||
|
Do not add a prefix to $encoding, such as '<' or '<:'.
|
||||||
|
|
||||||
|
Returns the object on success, or C<undef> on error.
|
||||||
|
|
||||||
|
When C<read> fails, C<Config::Tiny> sets an error message internally
|
||||||
|
you can recover via C<Config::Tiny-E<gt>errstr>. Although in B<some>
|
||||||
|
cases a failed C<read> will also set the operating system error
|
||||||
|
variable C<$!>, not all errors do and you should not rely on using
|
||||||
|
the C<$!> variable.
|
||||||
|
|
||||||
|
See t/04.utf8.t and t/04.utf8.txt.
|
||||||
|
|
||||||
|
=head2 read_string($string)
|
||||||
|
|
||||||
|
The C<read_string> method takes as argument the contents of a config file
|
||||||
|
as a string and returns the C<Config::Tiny> object for it.
|
||||||
|
|
||||||
|
=head2 write($filename, [$encoding])
|
||||||
|
|
||||||
|
Here, the [] indicate an optional parameter.
|
||||||
|
|
||||||
|
The C<write> method generates the file content for the properties, and
|
||||||
|
writes it to disk to the filename specified.
|
||||||
|
|
||||||
|
$encoding may be used to indicate the encoding of the file, e.g. 'utf8' or 'encoding(iso-8859-1)'.
|
||||||
|
|
||||||
|
Do not add a prefix to $encoding, such as '>' or '>:'.
|
||||||
|
|
||||||
|
Returns true on success or C<undef> on error.
|
||||||
|
|
||||||
|
See t/04.utf8.t and t/04.utf8.txt.
|
||||||
|
|
||||||
|
=head2 write_string()
|
||||||
|
|
||||||
|
Generates the file content for the object and returns it as a string.
|
||||||
|
|
||||||
|
=head1 FAQ
|
||||||
|
|
||||||
|
=head2 What happens if a key is repeated?
|
||||||
|
|
||||||
|
The last value is retained, overwriting any previous values.
|
||||||
|
|
||||||
|
See t/06.repeat.key.t.
|
||||||
|
|
||||||
|
=head2 Why can't I put comments at the ends of lines?
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item o The # char is only introduces a comment when it's at the start of a line.
|
||||||
|
|
||||||
|
So a line like:
|
||||||
|
|
||||||
|
key=value # A comment
|
||||||
|
|
||||||
|
Sets key to 'value # A comment', which, presumably, you did not intend.
|
||||||
|
|
||||||
|
This conforms to the syntax discussed in L</CONFIGURATION FILE SYNTAX>.
|
||||||
|
|
||||||
|
=item o Comments matching /\s\;\s.+$//g; are ignored.
|
||||||
|
|
||||||
|
This means you can't preserve the suffix using:
|
||||||
|
|
||||||
|
key = Prefix ; Suffix
|
||||||
|
|
||||||
|
Result: key is now 'Prefix'.
|
||||||
|
|
||||||
|
But you can do this:
|
||||||
|
|
||||||
|
key = Prefix;Suffix
|
||||||
|
|
||||||
|
Result: key is now 'Prefix;Suffix'.
|
||||||
|
|
||||||
|
Or this:
|
||||||
|
|
||||||
|
key = Prefix; Suffix
|
||||||
|
|
||||||
|
Result: key is now 'Prefix; Suffix'.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
See t/07.trailing.comment.t.
|
||||||
|
|
||||||
|
=head2 Why can't I omit the '=' signs?
|
||||||
|
|
||||||
|
E.g.:
|
||||||
|
|
||||||
|
[Things]
|
||||||
|
my =
|
||||||
|
list =
|
||||||
|
of =
|
||||||
|
things =
|
||||||
|
|
||||||
|
Instead of:
|
||||||
|
|
||||||
|
[Things]
|
||||||
|
my
|
||||||
|
list
|
||||||
|
of
|
||||||
|
things
|
||||||
|
|
||||||
|
Because the use of '=' signs is a type of mandatory documentation. It indicates that that section
|
||||||
|
contains 4 items, and not 1 odd item split over 4 lines.
|
||||||
|
|
||||||
|
=head2 Why do I have to assign the result of a method call to a variable?
|
||||||
|
|
||||||
|
This question comes from RT#85386.
|
||||||
|
|
||||||
|
Yes, the syntax may seem odd, but you don't have to call both new() and read_string().
|
||||||
|
|
||||||
|
Try:
|
||||||
|
|
||||||
|
perl -MData::Dumper -MConfig::Tiny -E 'my $c=Config::Tiny->read_string("one=s"); say Dumper $c'
|
||||||
|
|
||||||
|
Or:
|
||||||
|
|
||||||
|
my($config) = Config::Tiny -> read_string('alpha=bet');
|
||||||
|
my($value) = $$config{_}{alpha}; # $value is 'bet'.
|
||||||
|
|
||||||
|
Or even, a bit ridiculously:
|
||||||
|
|
||||||
|
my($value) = ${Config::Tiny -> read_string('alpha=bet')}{_}{alpha}; # $value is 'bet'.
|
||||||
|
|
||||||
|
=head2 Can I use a file called '0' (zero)?
|
||||||
|
|
||||||
|
Yes. See t/05.zero.t (test code) and t/0 (test data).
|
||||||
|
|
||||||
|
=head1 CAVEATS
|
||||||
|
|
||||||
|
Some edge cases in section headers are not supported, and additionally may not
|
||||||
|
be detected when writing the config file.
|
||||||
|
|
||||||
|
Specifically, section headers with leading whitespace, trailing whitespace,
|
||||||
|
or newlines anywhere in the section header, will not be written correctly
|
||||||
|
to the file and may cause file corruption.
|
||||||
|
|
||||||
|
=head1 Repository
|
||||||
|
|
||||||
|
L<https://github.com/ronsavage/Config-Tiny.git>
|
||||||
|
|
||||||
|
=head1 SUPPORT
|
||||||
|
|
||||||
|
Bugs should be reported via the CPAN bug tracker at
|
||||||
|
|
||||||
|
L<https://github.com/ronsavage/Config-Tiny/issues>
|
||||||
|
|
||||||
|
For other issues, or commercial enhancement or support, contact the author.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Adam Kennedy E<lt>adamk@cpan.orgE<gt>
|
||||||
|
|
||||||
|
Maintanence from V 2.15: Ron Savage L<http://savage.net.au/>.
|
||||||
|
|
||||||
|
=head1 ACKNOWLEGEMENTS
|
||||||
|
|
||||||
|
Thanks to Sherzod Ruzmetov E<lt>sherzodr@cpan.orgE<gt> for
|
||||||
|
L<Config::Simple>, which inspired this module by being not quite
|
||||||
|
"simple" enough for me :).
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
See, amongst many: L<Config::Simple> and L<Config::General>.
|
||||||
|
|
||||||
|
See L<Config::Tiny::Ordered> (and possibly others) for the preservation of the order of the entries
|
||||||
|
in the file.
|
||||||
|
|
||||||
|
L<IOD>. Ini On Drugs.
|
||||||
|
|
||||||
|
L<IOD::Examples>
|
||||||
|
|
||||||
|
L<App::IODUtils>
|
||||||
|
|
||||||
|
L<Config::IOD::Reader>
|
||||||
|
|
||||||
|
L<Config::Perl::V>. Config data from Perl itself.
|
||||||
|
|
||||||
|
L<Config::Onion>
|
||||||
|
|
||||||
|
L<Config::IniFiles>
|
||||||
|
|
||||||
|
L<Config::INIPlus>
|
||||||
|
|
||||||
|
L<Config::Hash>. Allows nested data.
|
||||||
|
|
||||||
|
L<Config::MVP>. Author: RJBS. Uses Moose. Extremely complex.
|
||||||
|
|
||||||
|
L<Config::TOML>. See next few lines:
|
||||||
|
|
||||||
|
L<https://github.com/dlc/toml>
|
||||||
|
|
||||||
|
L<https://github.com/alexkalderimis/config-toml.pl>. 1 Star rating.
|
||||||
|
|
||||||
|
L<https://github.com/toml-lang/toml>
|
||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2002 - 2011 Adam Kennedy.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute
|
||||||
|
it and/or modify it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
The full text of the license can be found in the
|
||||||
|
LICENSE file included with this module.
|
||||||
|
|
||||||
|
=cut
|
|
@ -0,0 +1,40 @@
|
||||||
|
#/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
# I tried 'require'-ing modules but that did not work.
|
||||||
|
|
||||||
|
use Config::Tiny; # For the version #.
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
|
||||||
|
use File::Spec;
|
||||||
|
use File::Temp;
|
||||||
|
use strict;
|
||||||
|
use utf8;
|
||||||
|
|
||||||
|
# ----------------------
|
||||||
|
|
||||||
|
pass('All external modules loaded');
|
||||||
|
|
||||||
|
my(@modules) = qw
|
||||||
|
/
|
||||||
|
File::Spec
|
||||||
|
File::Temp
|
||||||
|
strict
|
||||||
|
utf8
|
||||||
|
/;
|
||||||
|
|
||||||
|
diag "Testing Config::Tiny V $Config::Tiny::VERSION";
|
||||||
|
|
||||||
|
for my $module (@modules)
|
||||||
|
{
|
||||||
|
no strict 'refs';
|
||||||
|
|
||||||
|
my($ver) = ${$module . '::VERSION'} || 'N/A';
|
||||||
|
|
||||||
|
diag "Using $module V $ver";
|
||||||
|
}
|
||||||
|
|
||||||
|
done_testing;
|
|
@ -0,0 +1,34 @@
|
||||||
|
#/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
# I tried 'require'-ing modules but that did not work.
|
||||||
|
|
||||||
|
use <: $module_name :>; # For the version #.
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
|
||||||
|
<: $module_list_1 :>
|
||||||
|
|
||||||
|
# ----------------------
|
||||||
|
|
||||||
|
pass('All external modules loaded');
|
||||||
|
|
||||||
|
my(@modules) = qw
|
||||||
|
/
|
||||||
|
<: $module_list_2 :>
|
||||||
|
/;
|
||||||
|
|
||||||
|
diag "Testing <: $module_name :> V $<: $module_name :>::VERSION";
|
||||||
|
|
||||||
|
for my $module (@modules)
|
||||||
|
{
|
||||||
|
no strict 'refs';
|
||||||
|
|
||||||
|
my($ver) = ${$module . '::VERSION'} || 'N/A';
|
||||||
|
|
||||||
|
diag "Using $module V $ver";
|
||||||
|
}
|
||||||
|
|
||||||
|
done_testing;
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Compile testing for Config::Tiny
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
$^W = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
use Test::More tests => 1;
|
||||||
|
|
||||||
|
use_ok('Config::Tiny');
|
|
@ -0,0 +1,177 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Main testing script for Config::Tiny
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
$^W = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
use Config::Tiny ();
|
||||||
|
|
||||||
|
use File::Spec;
|
||||||
|
use File::Temp;
|
||||||
|
|
||||||
|
use Test::More tests => 33;
|
||||||
|
|
||||||
|
# Warning: There is another version line, in lib/Config/Tiny.pm.
|
||||||
|
|
||||||
|
our $VERSION = '2.28';
|
||||||
|
|
||||||
|
# --------------------
|
||||||
|
|
||||||
|
# Check their perl version
|
||||||
|
is( $Config::Tiny::VERSION, $VERSION, 'Loaded correct version of Config::Tiny' );
|
||||||
|
|
||||||
|
# Test trivial creation
|
||||||
|
my $Trivial = Config::Tiny->new;
|
||||||
|
ok( $Trivial, 'new() returns true' );
|
||||||
|
ok( ref $Trivial, 'new() returns a reference' );
|
||||||
|
# Legitimate use of UNIVERSAL::isa
|
||||||
|
ok( UNIVERSAL::isa( $Trivial, 'HASH' ), 'new() returns a hash reference' );
|
||||||
|
isa_ok( $Trivial, 'Config::Tiny' );
|
||||||
|
ok( scalar keys %$Trivial == 0, 'new() returns an empty object' );
|
||||||
|
|
||||||
|
# Try to read in a config
|
||||||
|
my $Config = Config::Tiny->read(File::Spec -> catfile('t', 'test.conf') );
|
||||||
|
ok( $Config, 'read() returns true' );
|
||||||
|
ok( ref $Config, 'read() returns a reference' );
|
||||||
|
# Legitimate use of UNIVERSAL::isa
|
||||||
|
ok( UNIVERSAL::isa( $Config, 'HASH' ), 'read() returns a hash reference' );
|
||||||
|
isa_ok( $Config, 'Config::Tiny' );
|
||||||
|
|
||||||
|
# Check the structure of the config
|
||||||
|
my $expected = {
|
||||||
|
'_' => {
|
||||||
|
root => 'something',
|
||||||
|
},
|
||||||
|
section => {
|
||||||
|
one => 'two',
|
||||||
|
Foo => 'Bar',
|
||||||
|
this => 'Your Mother!',
|
||||||
|
blank => '',
|
||||||
|
},
|
||||||
|
'Section Two' => {
|
||||||
|
'something else' => 'blah',
|
||||||
|
'remove' => 'whitespace',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
bless $expected, 'Config::Tiny';
|
||||||
|
is_deeply( $Config, $expected, 'Config structure matches expected' );
|
||||||
|
|
||||||
|
# Add some stuff to the trivial config and check write_string() for it
|
||||||
|
$Trivial->{_} = {
|
||||||
|
root1 => 'root2',
|
||||||
|
};
|
||||||
|
$Trivial->{section} = {
|
||||||
|
foo => 'bar',
|
||||||
|
this => 'that',
|
||||||
|
blank => '',
|
||||||
|
};
|
||||||
|
$Trivial->{section2} = {
|
||||||
|
'this little piggy' => 'went to market'
|
||||||
|
};
|
||||||
|
my $string = <<END;
|
||||||
|
root1=root2
|
||||||
|
|
||||||
|
[section]
|
||||||
|
blank=
|
||||||
|
foo=bar
|
||||||
|
this=that
|
||||||
|
|
||||||
|
[section2]
|
||||||
|
this little piggy=went to market
|
||||||
|
END
|
||||||
|
|
||||||
|
# Test read_string
|
||||||
|
my $Read = Config::Tiny->read_string( $string );
|
||||||
|
ok( $Read, 'read_string() returns true' );
|
||||||
|
is_deeply( $Read, $Trivial, 'read_string() returns expected value' );
|
||||||
|
|
||||||
|
my $generated = $Trivial->write_string();
|
||||||
|
ok( length $generated, 'write_string() returns something' );
|
||||||
|
ok( $generated eq $string, 'write_string() returns the correct file contents' );
|
||||||
|
|
||||||
|
# The EXLOCK option is for BSD-based systems.
|
||||||
|
|
||||||
|
my($temp_dir) = File::Temp -> newdir('temp.XXXX', CLEANUP => 1, EXLOCK => 0, TMPDIR => 1);
|
||||||
|
my($temp_file) = File::Spec -> catfile($temp_dir, 'write.test.conf');
|
||||||
|
|
||||||
|
# Try to write a file
|
||||||
|
my $rv = $Trivial->write($temp_file);
|
||||||
|
ok( $rv, 'write() returned true' );
|
||||||
|
ok( -e $temp_file, 'write() actually created a file' );
|
||||||
|
|
||||||
|
# Try to read the config back in
|
||||||
|
$Read = Config::Tiny->read( $temp_file );
|
||||||
|
ok( $Read, 'read() of what we wrote returns true' );
|
||||||
|
ok( ref $Read, 'read() of what we wrote returns a reference' );
|
||||||
|
# Legitimate use of UNIVERSAL::isa
|
||||||
|
ok( UNIVERSAL::isa( $Read, 'HASH' ), 'read() of what we wrote returns a hash reference' );
|
||||||
|
isa_ok( $Read, 'Config::Tiny' );
|
||||||
|
|
||||||
|
# Check the structure of what we read back in
|
||||||
|
is_deeply( $Read, $Trivial, 'What we read matches what we wrote out' );
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Bugs that happened we don't want to happen again
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
# Reading in an empty file, or a defined but zero length string, should yield
|
||||||
|
# a valid, but empty, object.
|
||||||
|
my $Empty = Config::Tiny->read_string('');
|
||||||
|
isa_ok( $Empty, 'Config::Tiny' );
|
||||||
|
is( scalar(keys %$Empty), 0, 'Config::Tiny object from empty string, is empty' );
|
||||||
|
}
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
# A Section header like [ section ] doesn't end up at ->{' section '}.
|
||||||
|
# Trim off whitespace from the section header.
|
||||||
|
my $string = <<'END_CONFIG';
|
||||||
|
# The need to trim off whitespace makes a lot more sense
|
||||||
|
# when you are trying to maximise readability.
|
||||||
|
[ /path/to/file.txt ]
|
||||||
|
this=that
|
||||||
|
|
||||||
|
[ section2]
|
||||||
|
this=that
|
||||||
|
|
||||||
|
[section3 ]
|
||||||
|
this=that
|
||||||
|
|
||||||
|
END_CONFIG
|
||||||
|
|
||||||
|
my $Trim = Config::Tiny->read_string($string);
|
||||||
|
isa_ok( $Trim, 'Config::Tiny' );
|
||||||
|
ok( exists $Trim->{'/path/to/file.txt'}, 'First section created' );
|
||||||
|
is( $Trim->{'/path/to/file.txt'}->{this}, 'that', 'First section created properly' );
|
||||||
|
ok( exists $Trim->{section2}, 'Second section created' );
|
||||||
|
is( $Trim->{section2}->{this}, 'that', 'Second section created properly' );
|
||||||
|
ok( exists $Trim->{section3}, 'Third section created' );
|
||||||
|
is( $Trim->{section3}->{this}, 'that', 'Third section created properly' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Refuse to write config files with newlines in them
|
||||||
|
|
||||||
|
SCOPE: {
|
||||||
|
my $newline = Config::Tiny->new;
|
||||||
|
$newline->{_}->{string} = "foo\nbar";
|
||||||
|
local $@;
|
||||||
|
my $output = undef;
|
||||||
|
eval {
|
||||||
|
$output = $newline->write_string;
|
||||||
|
};
|
||||||
|
is( $output, undef, 'write_string() returns undef on newlines' );
|
||||||
|
is(
|
||||||
|
Config::Tiny->errstr,
|
||||||
|
"Illegal newlines in property '_.string'",
|
||||||
|
'errstr() returns expected error',
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Config::Tiny;
|
||||||
|
|
||||||
|
use Test::More tests => 2;
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
my($string) = <<'EOS';
|
||||||
|
param1=One
|
||||||
|
param2=Two
|
||||||
|
EOS
|
||||||
|
|
||||||
|
my($config) = Config::Tiny -> read_string($string);
|
||||||
|
|
||||||
|
isa_ok($config, 'Config::Tiny', 'read_string() returns an object');
|
||||||
|
ok($$config{_}{param1} eq 'One', 'Access to hashref returns correct value');
|
|
@ -0,0 +1,39 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Config::Tiny;
|
||||||
|
|
||||||
|
use File::Spec;
|
||||||
|
use File::Temp;
|
||||||
|
|
||||||
|
use Test::More tests => 7;
|
||||||
|
|
||||||
|
use utf8;
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
my($config) = Config::Tiny -> read('t/04.utf8.txt', 'utf8');
|
||||||
|
|
||||||
|
ok($$config{utf8_data}{Name} eq 'Δ Lady', 'Hashref after read() returns correct value');
|
||||||
|
ok($$config{utf8_data}{Class} eq 'Reichwaldstraße', 'Hashref after read() returns correct value');
|
||||||
|
ok($$config{utf8_data}{Type} eq 'Πηληϊάδεω Ἀχιλῆος', 'Hashref after read() returns correct value');
|
||||||
|
|
||||||
|
# The EXLOCK option is for BSD-based systems.
|
||||||
|
|
||||||
|
my($temp_dir) = File::Temp -> newdir('temp.XXXX', CLEANUP => 1, EXLOCK => 0, TMPDIR => 1);
|
||||||
|
my($temp_file) = File::Spec -> catfile($temp_dir, 'write.utf8.conf');
|
||||||
|
my($string) =<<EOS;
|
||||||
|
[init]
|
||||||
|
weird_text = Reichwaldstraße
|
||||||
|
EOS
|
||||||
|
my($conf1) = Config::Tiny -> read_string($string);
|
||||||
|
|
||||||
|
ok($conf1, 'read_string() returns true');
|
||||||
|
|
||||||
|
is_deeply($conf1, {init => {weird_text => 'Reichwaldstraße'} }, 'read_string() returns expected value');
|
||||||
|
|
||||||
|
$conf1 -> write($temp_file, 'utf8');
|
||||||
|
|
||||||
|
my($conf2) = Config::Tiny -> read($temp_file, 'encoding(utf8)');
|
||||||
|
|
||||||
|
is_deeply($conf1, $conf1, 'write() followed by read() works');
|
||||||
|
is_deeply($conf2, {init => {weird_text => 'Reichwaldstraße'} }, 'write() + read() returns expected value');
|
|
@ -0,0 +1,4 @@
|
||||||
|
[utf8_data]
|
||||||
|
Name = Δ Lady
|
||||||
|
Class = Reichwaldstraße
|
||||||
|
Type = Πηληϊάδεω Ἀχιλῆος
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Config::Tiny;
|
||||||
|
|
||||||
|
use File::Spec;
|
||||||
|
use File::Temp;
|
||||||
|
|
||||||
|
use Test::More tests => 6;
|
||||||
|
|
||||||
|
use utf8;
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
my($conf0) = Config::Tiny -> read('t/0');
|
||||||
|
|
||||||
|
ok($$conf0{init}{a} eq 'b', 'Hashref after read() returns correct value');
|
||||||
|
|
||||||
|
# The EXLOCK option is for BSD-based systems.
|
||||||
|
|
||||||
|
my($temp_dir) = File::Temp -> newdir('temp.XXXX', CLEANUP => 1, EXLOCK => 0, TMPDIR => 1);
|
||||||
|
my($temp_file) = File::Spec -> catfile($temp_dir, '0');
|
||||||
|
my($string) =<<EOS;
|
||||||
|
[init]
|
||||||
|
a = b
|
||||||
|
EOS
|
||||||
|
my($conf1) = Config::Tiny -> read_string($string);
|
||||||
|
|
||||||
|
ok($conf1, 'read_string() returns true');
|
||||||
|
|
||||||
|
is_deeply($conf1, {init => {a => 'b'} }, 'read_string() returns expected value');
|
||||||
|
|
||||||
|
$conf1 -> write($temp_file);
|
||||||
|
|
||||||
|
my($conf2) = Config::Tiny -> read($temp_file);
|
||||||
|
|
||||||
|
is_deeply($conf1, $conf1, 'write() followed by read() works');
|
||||||
|
is_deeply($conf2, {init => {a => 'b'} }, 'write() + read() returns expected value');
|
||||||
|
is_deeply($conf0, {init => {a => 'b'} }, 'write() + read() returns expected value');
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Config::Tiny;
|
||||||
|
|
||||||
|
use Test::More tests => 3;
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
my($string) = <<'EOS';
|
||||||
|
key1=One
|
||||||
|
key2=Infix
|
||||||
|
key1=Two
|
||||||
|
EOS
|
||||||
|
|
||||||
|
my($config) = Config::Tiny -> read_string($string);
|
||||||
|
|
||||||
|
isa_ok($config, 'Config::Tiny', 'read_string() returns an object');
|
||||||
|
ok($$config{_}{key1} eq 'Two', 'Access to hashref returns correct value');
|
||||||
|
ok($$config{_}{key2} eq 'Infix', 'Access to hashref returns correct value');
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Config::Tiny;
|
||||||
|
|
||||||
|
use Test::More tests => 4;
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
my($source1) = 'One ; Two';
|
||||||
|
my($source2) = 'One;Two';
|
||||||
|
my($source3) = 'One; Two';
|
||||||
|
|
||||||
|
my($string) = <<EOS;
|
||||||
|
key1 = $source1
|
||||||
|
key2 = $source2
|
||||||
|
key3 = $source3
|
||||||
|
EOS
|
||||||
|
|
||||||
|
my($config) = Config::Tiny -> read_string($string);
|
||||||
|
|
||||||
|
isa_ok($config, 'Config::Tiny', 'read_string() returns an object');
|
||||||
|
ok($$config{_}{key1} eq 'One', "Source '$source1' read correctly as '$$config{_}{key1}'");
|
||||||
|
ok($$config{_}{key2} eq 'One;Two', "Source '$source2' read correctly as '$$config{_}{key2}'");
|
||||||
|
ok($$config{_}{key3} eq 'One; Two', "Source '$source3' read correctly as '$$config{_}{key3}'");
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Config::Tiny;
|
||||||
|
|
||||||
|
use Test::More tests => 4;
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
my($conf1) = Config::Tiny -> new( { _=>{foo=>"bar"} } );
|
||||||
|
my($str1) = $conf1->write_string;
|
||||||
|
is $str1, "foo=bar\n";
|
||||||
|
|
||||||
|
my($conf2) = Config::Tiny -> new( { _=>{hello=>"world"}, Cool=>{Beans=>"Dude",someval=>123} } );
|
||||||
|
my($str2) = $conf2->write_string;
|
||||||
|
is $str2, <<'EOF';
|
||||||
|
hello=world
|
||||||
|
|
||||||
|
[Cool]
|
||||||
|
Beans=Dude
|
||||||
|
someval=123
|
||||||
|
EOF
|
||||||
|
|
||||||
|
my($conf3) = Config::Tiny -> new( { one => { alpha=>"aaa", beta=>"bbb" },
|
||||||
|
two => { abc => 123, def => 456, ghi => 789 } } );
|
||||||
|
my($str3) = $conf3->write_string;
|
||||||
|
is $str3, <<'EOF';
|
||||||
|
[one]
|
||||||
|
alpha=aaa
|
||||||
|
beta=bbb
|
||||||
|
|
||||||
|
[two]
|
||||||
|
abc=123
|
||||||
|
def=456
|
||||||
|
ghi=789
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# from synopsis:
|
||||||
|
my $config = Config::Tiny->new({
|
||||||
|
_ => { rootproperty => "Bar" },
|
||||||
|
section => { one => "value", Foo => 42 } });
|
||||||
|
is $config->write_string, <<'EOF';
|
||||||
|
rootproperty=Bar
|
||||||
|
|
||||||
|
[section]
|
||||||
|
Foo=42
|
||||||
|
one=value
|
||||||
|
EOF
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
root=something
|
||||||
|
|
||||||
|
[section]
|
||||||
|
one=two
|
||||||
|
Foo=Bar
|
||||||
|
this=Your Mother!
|
||||||
|
blank=
|
||||||
|
|
||||||
|
[Section Two]
|
||||||
|
something else=blah
|
||||||
|
remove = whitespace
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Test that the syntax of our POD documentation is valid
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
$^W = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @MODULES = (
|
||||||
|
'Pod::Simple 3.14',
|
||||||
|
'Test::Pod 1.44',
|
||||||
|
);
|
||||||
|
|
||||||
|
# Don't run tests for installs
|
||||||
|
use Test::More;
|
||||||
|
unless ( $ENV{AUTOMATED_TESTING} or $ENV{RELEASE_TESTING} ) {
|
||||||
|
plan( skip_all => "Author tests not required for installation" );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the testing modules
|
||||||
|
foreach my $MODULE ( @MODULES ) {
|
||||||
|
eval "use $MODULE";
|
||||||
|
if ( $@ ) {
|
||||||
|
$ENV{RELEASE_TESTING}
|
||||||
|
? die( "Failed to load required release-testing module $MODULE" )
|
||||||
|
: plan( skip_all => "$MODULE not available for testing" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
all_pod_files_ok();
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Test that our META.yml file matches the current specification.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
$^W = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $MODULE = 'Test::CPAN::Meta 0.17';
|
||||||
|
|
||||||
|
# Don't run tests for installs
|
||||||
|
use Test::More;
|
||||||
|
unless ( $ENV{AUTOMATED_TESTING} or $ENV{RELEASE_TESTING} ) {
|
||||||
|
plan( skip_all => "Author tests not required for installation" );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the testing module
|
||||||
|
eval "use $MODULE";
|
||||||
|
if ( $@ ) {
|
||||||
|
$ENV{RELEASE_TESTING}
|
||||||
|
? die( "Failed to load required release-testing module $MODULE" )
|
||||||
|
: plan( skip_all => "$MODULE not available for testing" );
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_yaml_ok();
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Test that our declared minimum Perl version matches our syntax
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
$^W = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @MODULES = (
|
||||||
|
'Perl::MinimumVersion 1.27',
|
||||||
|
'Test::MinimumVersion 0.101080',
|
||||||
|
);
|
||||||
|
|
||||||
|
# Don't run tests for installs
|
||||||
|
use Test::More;
|
||||||
|
unless ( $ENV{AUTOMATED_TESTING} or $ENV{RELEASE_TESTING} ) {
|
||||||
|
plan( skip_all => "Author tests not required for installation" );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the testing modules
|
||||||
|
foreach my $MODULE ( @MODULES ) {
|
||||||
|
eval "use $MODULE";
|
||||||
|
if ( $@ ) {
|
||||||
|
$ENV{RELEASE_TESTING}
|
||||||
|
? die( "Failed to load required release-testing module $MODULE" )
|
||||||
|
: plan( skip_all => "$MODULE not available for testing" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
all_minimum_version_from_metayml_ok();
|
Loading…
Reference in New Issue