cvsuser 05/05/20 12:27:14
Modified: App-Options CHANGES META.yml TODO
App-Options/lib/App Options.pm
App-Options/t app.conf main.t old.t test1.conf
Added: App-Options/t file.txt
Log:
here docs, file vars, line continuations
Revision Changes Path
1.12 +6 -0 p5ee/App-Options/CHANGES
Index: CHANGES
===================================================================
RCS file: /cvs/public/p5ee/App-Options/CHANGES,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- CHANGES 14 May 2005 14:14:01 -0000 1.11
+++ CHANGES 20 May 2005 19:27:13 -0000 1.12
@@ -2,8 +2,14 @@
# CHANGE LOG
#############################################################################
+VERSION 0.97
+ x enable "here documents", var = <<EOF
+ x enable file/cmd variables, var = < filename (or "cmd|")
+ x allow line continuation chars, i.e. var = hello \\nworld
+
VERSION 0.96
x cleaned up some of the --debug_options output
+ x tests run clean on Win32
x used File::Spec to make file/directory manipulation platform-independent
(i.e. Win32)
NOTE: I used a mix of platform-independent File::Spec functions and
explicit
conversion from "\" paths to POSIX-compliant "/" paths. This is because
the
1.4 +5 -5 p5ee/App-Options/META.yml
Index: META.yml
===================================================================
RCS file: /cvs/public/p5ee/App-Options/META.yml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- META.yml 14 May 2005 14:14:01 -0000 1.3
+++ META.yml 20 May 2005 19:27:13 -0000 1.4
@@ -1,9 +1,9 @@
---
name: App-Options
-version: 0.95
+version: 0.97
author:
- - stephen.adkins.com
-abstract: combine command line options, environment vars, and option file
values
+ - [EMAIL PROTECTED]
+abstract: 'combine command line options, environment vars, and option file
values'
license: perl
requires:
Carp: 0
@@ -15,5 +15,5 @@
provides:
App::Options:
file: lib/App/Options.pm
- version: 0.95
-generated_by: Module::Build version 0.2608
+ version: 0.97
+generated_by: Module::Build version 0.261
1.11 +1 -4 p5ee/App-Options/TODO
Index: TODO
===================================================================
RCS file: /cvs/public/p5ee/App-Options/TODO,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- TODO 14 May 2005 14:14:01 -0000 1.10
+++ TODO 20 May 2005 19:27:13 -0000 1.11
@@ -18,9 +18,6 @@
4 = [1+2+3] + file options not defined by program cause errors
o allow for subclassing (App::Options::YAML, etc.) (split up the init()
method)
o save the init(@args) for later print_usage or later reparsing
- o file/cmd variables, var = <FILE>filename (or "cmd|")
- o here documents, var = <<EOF
- o line continuation chars, i.e. var = hello \\nworld
o setenv arg to set environment variables
o make lots more tests (starting with the examples in the documentation)
o make example scripts (starting with the examples in the documentation)
1.17 +41 -5 p5ee/App-Options/lib/App/Options.pm
Index: Options.pm
===================================================================
RCS file: /cvs/public/p5ee/App-Options/lib/App/Options.pm,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- Options.pm 14 May 2005 14:14:01 -0000 1.16
+++ Options.pm 20 May 2005 19:27:13 -0000 1.17
@@ -14,7 +14,7 @@
use File::Spec;
use Config;
-$VERSION = "0.96";
+$VERSION = "0.97";
=head1 NAME
@@ -537,7 +537,7 @@
local(*App::Options::FILE);
my ($option_file, $exclude_section);
- my ($cond, @cond, $exclude);
+ my ($cond, @cond, $exclude, $heredoc_end);
while ($#option_file > -1) {
$option_file = shift(@option_file);
if ($option_file =~ m!\$\{prefix\}!) {
@@ -610,7 +610,43 @@
if (/^([a-zA-Z0-9_.-]+) *= *(.*)/) { # untainting also
happens
$var = $1;
$value = $2;
- $value =~ s/^"(.*)"$/$1/; # quoting, var = " hello
world " (enables leading/trailing spaces)
+
+ # "here documents": var = <<EOF ... EOF
+ if ($value =~ /^<<(.*)/) {
+ $heredoc_end = $1;
+ $value = "";
+ while (<App::Options::FILE>) {
+ last if ($_ =~ /^$heredoc_end\s*$/);
+ $value .= $_;
+ }
+ $heredoc_end = "";
+ }
+ # get value from a file
+ elsif ($value =~ /^<\s*(.+)/ || $value =~
/^(.+)\s*\|$/) {
+ $value =~ s/\$\{([a-zA-Z0-9_\.-]+)\}/(defined
$values->{$1} ? $values->{$1} : "")/eg;
+ if (open(App::Options::FILE2, $value)) {
+ $value = join("", <App::Options::FILE2>);
+ close(App::Options::FILE2);
+ }
+ else {
+ $value = "Can't read file [$value] for
variable [$var]: $!";
+ }
+ }
+ # get additional line(s) due to continuation chars
+ elsif ($value =~ s/\s*\\\s*$/\n/) {
+ while (<App::Options::FILE>) {
+ if ($_ =~ s/\s*\\\s*$/\n/) {
+ $value .= $_;
+ }
+ else {
+ $value .= $_;
+ last;
+ }
+ }
+ }
+ else {
+ $value =~ s/^"(.*)"$/$1/; # quoting, var = "
hello world " (enables leading/trailing spaces)
+ }
print STDERR " Var Found in File : var=[$var]
value=[$value]\n" if ($debug_options >= 6);
1.7 +14 -0 p5ee/App-Options/t/app.conf
Index: app.conf
===================================================================
RCS file: /cvs/public/p5ee/App-Options/t/app.conf,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- app.conf 14 May 2005 14:04:22 -0000 1.6
+++ app.conf 20 May 2005 19:27:14 -0000 1.7
@@ -1,3 +1,4 @@
+testdir = t
var = value
#prefix = /usr/local
envtest = xy$ENV{ZZ}y
@@ -35,3 +36,16 @@
[/ol/]
var7 = value7
[host=xyzzy3] hosttest = you really named a host xyzzy3?
+[ALL]
+var21 = < ${testdir}/file.txt
+var22 = <${testdir}/file.txt
+var23 = cat ${testdir}/file.txt |
+var24 = <<EOF
+This is text
+and more text
+EOF
+var25 = This is text \
+and more text
+var26 = normal
+
+flush_imports = 1
1.8 +25 -2 p5ee/App-Options/t/main.t
Index: main.t
===================================================================
RCS file: /cvs/public/p5ee/App-Options/t/main.t,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- main.t 14 May 2005 14:04:22 -0000 1.7
+++ main.t 20 May 2005 19:27:14 -0000 1.8
@@ -21,6 +21,10 @@
$dir = ".";
$dir = "t" if (! -f "app.conf");
+BEGIN {
+ $App::options{testdir} = (-f "app.conf") ? "." : "t";
+}
+
use App::Options (
option => {
var10 => { env => "VAR10a;VAR10", },
@@ -54,10 +58,27 @@
is($App::options{var12}, "value12", "specified env var works");
is($App::options{var10}, "value10", "specified secondary env var works");
+open(FILE2, "< $dir/file.txt");
+$file_txt = join("", <FILE2>);
+close(FILE2);
+
+is($App::options{var21}, $file_txt, "value from file");
+is($App::options{var22}, $file_txt, "value from file (2)");
+ok($App::options{var23} eq $file_txt || $App::options{var23} =~ /open/,
"value from command");
+
+$var24 = <<EOF;
+This is text
+and more text
+EOF
+is($App::options{var24}, $var24, "value from here doc");
+is($App::options{var25}, $var24, "value from line continuations");
+is($App::options{var26}, "normal", "back to normal");
+
%App::options = (
- config_file => "$dir/app.conf",
+ config_file => "app.conf",
prefix => "/usr/local",
- perlinc => "/usr/mycompany/2.1.7/lib/perl5"
+ perlinc => "/usr/mycompany/2.1.7/lib/perl5",
+ testdir => (-f "app.conf") ? "." : "t",
);
App::Options->init();
@@ -70,6 +91,7 @@
is($App::options{var2}, "old pattern match", "old pattern match");
is($INC[0], "/usr/mycompany/2.1.7/lib/perl5", "[EMAIL PROTECTED] affected by
perlinc");
+$App::otherconf{testdir} = (-f "app.conf") ? "." : "t";
App::Options->init(\%App::otherconf);
#print "CONF:\n ", join("\n ",%App::otherconf), "\n";
ok(%App::otherconf, "put something in %App::otherconf");
@@ -79,6 +101,7 @@
is($App::otherconf{var1}, "pattern match", "pattern match");
is($App::otherconf{var2}, "old pattern match", "old pattern match");
+$App::options3{testdir} = (-f "app.conf") ? "." : "t";
App::Options->init(values => \%App::options3);
#print "CONF:\n ", join("\n ",%App::options3), "\n";
ok(%App::options3, "put something in %App::options3");
1.3 +8 -2 p5ee/App-Options/t/old.t
Index: old.t
===================================================================
RCS file: /cvs/public/p5ee/App-Options/t/old.t,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- old.t 14 May 2005 14:04:22 -0000 1.2
+++ old.t 20 May 2005 19:27:14 -0000 1.3
@@ -19,6 +19,9 @@
$ENV{APP_VAR11} = "value11";
$ENV{VAR12} = "value12";
+BEGIN {
+ $App::options{testdir} = (-f "app.conf") ? "." : "t";
+}
App::Options->init(
option => {
var10 => { env => "VAR10a;VAR10", },
@@ -32,7 +35,7 @@
#print "CONF:\n ", join("\n ",%App::options), "\n";
ok(%App::options, "put something in %App::options");
-is($App::options{prefix}, $prefix, "prefix = $prefix");
+#is($App::options{prefix}, $prefix, "prefix = $prefix");
is($App::options{app}, "old", "app = old");
is($App::options{var}, "value", "var = value");
is($App::options{var1}, "pattern match", "pattern match");
@@ -55,7 +58,8 @@
%App::options = (
config_file => "$dir/app.conf",
prefix => "/usr/local",
- perlinc => "/usr/mycompany/2.1.7/lib/perl5"
+ perlinc => "/usr/mycompany/2.1.7/lib/perl5",
+ testdir => (-f "app.conf") ? "." : "t",
);
App::Options->init();
@@ -68,6 +72,7 @@
is($App::options{var2}, "old pattern match", "old pattern match");
is($INC[0], "/usr/mycompany/2.1.7/lib/perl5", "[EMAIL PROTECTED] affected by
perlinc");
+$App::otherconf{testdir} = (-f "app.conf") ? "." : "t";
App::Options->init(\%App::otherconf);
#print "CONF:\n ", join("\n ",%App::otherconf), "\n";
ok(%App::otherconf, "put something in %App::otherconf");
@@ -77,6 +82,7 @@
is($App::otherconf{var1}, "pattern match", "pattern match");
is($App::otherconf{var2}, "old pattern match", "old pattern match");
+$App::options3{testdir} = (-f "app.conf") ? "." : "t";
App::Options->init(values => \%App::options3);
#print "CONF:\n ", join("\n ",%App::options3), "\n";
ok(%App::options3, "put something in %App::options3");
1.2 +1 -1 p5ee/App-Options/t/test1.conf
Index: test1.conf
===================================================================
RCS file: /cvs/public/p5ee/App-Options/t/test1.conf,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- test1.conf 16 Nov 2003 21:21:22 -0000 1.1
+++ test1.conf 20 May 2005 19:27:14 -0000 1.2
@@ -1,4 +1,4 @@
-perlinc = /usr/rubicon/devel/src/p5ee/App-BEGIN/lib
+perlinc = /usr/rubicon/devel/src/p5ee/App-Options/lib
flush_imports = 1
1.1 p5ee/App-Options/t/file.txt
Index: file.txt
===================================================================
The quick brown
fox
jumps over the lazy
dog .