[Bps-public-commit] rt-extension-formtools branch dynamic-forms-from-config created. 0.53-10-g6e8a44f

BPS Git Server git at git.bestpractical.com
Fri Sep 8 19:12:18 UTC 2023


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rt-extension-formtools".

The branch, dynamic-forms-from-config has been created
        at  6e8a44fe07c82304f36b080197c6c7be67a1ddb9 (commit)

- Log -----------------------------------------------------------------
commit 6e8a44fe07c82304f36b080197c6c7be67a1ddb9
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Sep 8 14:47:25 2023 -0400

    Create tickets when create_ticket is passed
    
    The final result of any form wizard is to eventually
    create a ticket. Provide a standard way of doing
    that, passing in all accumulated arguments for
    values on that new ticket.

diff --git a/html/FormTools/Form b/html/FormTools/Form
index b5839eb..58418b6 100644
--- a/html/FormTools/Form
+++ b/html/FormTools/Form
@@ -12,6 +12,7 @@ $form_id             => undef
 $form_name           => undef
 $form_classes        => undef
 $self_service        => 0
+$results_ref         => []
 </%args>
 <%init>
 use RT::Extension::FormTools;
@@ -81,6 +82,10 @@ foreach my $key (keys %request_args) {
    delete $request_args{$key} if ($core_fields{$key});
 }
 
+# Add in any @results passed in. These should not be errors,
+# so they will be shown on the next page.
+push @results, @{$results_ref};
+
 $next_for_validation ||= $m->caller(1)->path;
 
 </%init>
diff --git a/html/Forms/dhandler b/html/Forms/dhandler
index eb2a0eb..242c143 100644
--- a/html/Forms/dhandler
+++ b/html/Forms/dhandler
@@ -1,6 +1,7 @@
 <&|/FormTools/Form, next => '/Forms/' . $form_name . '/' . $form_config->{$page}{'next'},
     validation => $form_config->{$page}{'validation'},
     next_for_validation => '/Forms/' . $form_name . '/' . $page,
+    results_ref => \@results,
 &>
 
 <%perl>
@@ -82,7 +83,23 @@ unless ( $ok ) {
 $m->notes( queue => $queue_obj );
 $m->notes( page_title => $form_config->{$page}{'name'} );
 
+# Try to create a ticket if we're on the last page and
+# "create_ticket" is submitted as an arg from the second-to-last
+# page.
+
+my ($ticket_obj, @results);
+if ( $create_ticket ) {
+    ($ticket_obj, @results) = CreateTicket(
+        Subject => 'Ticket created from FormTools form ' . $form_name,
+        Queue   => $queue_obj->Id,
+        Status => 'new',
+        Requestors => $session{'CurrentUser'}->EmailAddress,
+        %ARGS,
+    );
+}
+
 </%init>
 <%args>
 $_form_tools_next => undef
+$create_ticket => undef
 </%args>

commit f48884ee2b567433d3c288b7e021e67af5ecd8d6
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Sep 8 14:41:31 2023 -0400

    Align validation hint handling with RT updates
    
    RT now allows custom messages as validation hints.

diff --git a/html/FormTools/Field b/html/FormTools/Field
index bc74274..ca20a17 100644
--- a/html/FormTools/Field
+++ b/html/FormTools/Field
@@ -192,9 +192,13 @@ $default = '' unless defined $default;
             QueueObj => $queue,
             ($default ? (Default => $default) : ())
             &>
-% if ($show_validation && $cf->FriendlyPattern) {
-    <span class="cfhints"><% loc("Input must match [_1]", $cf->FriendlyPattern) %></span>
-%}
+%      if (my $msg = $m->notes('InvalidField-' . $cf->Id)) {
+            <span class="cfinvalidfield my-1 d-inline-block"><% $msg %></span>
+%      } elsif ($show_validation and $cf->FriendlyPattern) {
+            <span class="cfhints my-1 d-inline-block">
+              <% $cf->FriendlyPattern %>
+            </span>
+%      }
 % } elsif ($render_as =~  /^boolean/i)  {
 %       my $value = 'Yes';
 <div class="custom-control custom-checkbox" style="margin-top: 5px">

commit 9ef88c4a6d6da87bc35d052b4a911f500433369d
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Sep 8 14:38:42 2023 -0400

    Replace custom validation with standard RT version

diff --git a/html/FormTools/Form b/html/FormTools/Form
index 665df7b..b5839eb 100644
--- a/html/FormTools/Form
+++ b/html/FormTools/Form
@@ -53,18 +53,15 @@ if ($validation && $real_next) {
         }
     }
 
-    # cf validation based on record pattern
-    foreach my $key (keys %request_args) {
-        next if $key =~ /Values-Magic$/;
-        next unless ($key =~ /CustomField-(\d+)/ );
-        my $id = $1;
-        my $cf = RT::CustomField->new($session{'CurrentUser'});
-        $cf->Load($id);
-        next unless exists $request_args{"Object-RT::Ticket--CustomField-@{[ $cf->Id ]}-Values-Magic"};
-        my ($ok, @res) = RT::Extension::FormTools::validate_cf($cf, \%request_args);
-        push @results, @res unless $ok;
-
+    my ($status, @msg) = $m->comp(
+        '/Elements/ValidateCustomFields',
+        CustomFields    => $queue->TicketCustomFields,
+        ARGSRef         => \%request_args,
+    );
+    unless ($status) {
+        push @results, @msg;
     }
+
     unless (@results) {
         $real_next = $m->caller(1)->dir_path . '/' . $real_next
             unless $real_next =~ m'^/';

commit fa89e10fe2e4cc2555d239f838a6a967c1b27185
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Sep 8 14:50:34 2023 -0400

    Update support files for new utility

diff --git a/.gitignore b/.gitignore
index cff0b80..cc52a86 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@ pod2htm*.tmp
 /MYMETA.*
 /t/tmp
 /xt/tmp
+/bin/rt-insert-formtools-config
diff --git a/inc/Module/Install/Substitute.pm b/inc/Module/Install/Substitute.pm
new file mode 100644
index 0000000..56af7fe
--- /dev/null
+++ b/inc/Module/Install/Substitute.pm
@@ -0,0 +1,131 @@
+#line 1
+package Module::Install::Substitute;
+
+use strict;
+use warnings;
+use 5.008; # I don't care much about earlier versions
+
+use Module::Install::Base;
+our @ISA = qw(Module::Install::Base);
+
+our $VERSION = '0.03';
+
+require File::Temp;
+require File::Spec;
+require Cwd;
+
+#line 89
+
+sub substitute
+{
+	my $self = shift;
+	$self->{__subst} = shift;
+	$self->{__option} = {};
+	if( UNIVERSAL::isa( $_[0], 'HASH' ) ) {
+		my $opts = shift;
+		while( my ($k,$v) = each( %$opts ) ) {
+			$self->{__option}->{ lc( $k ) } = $v || '';
+		}
+	}
+	$self->_parse_options;
+
+	my @file = @_;
+	foreach my $f (@file) {
+		$self->_rewrite_file( $f );
+	}
+
+	return;
+}
+
+sub _parse_options
+{
+	my $self = shift;
+	my $cwd = Cwd::getcwd();
+	foreach my $t ( qw(from to) ) {
+        $self->{__option}->{$t} = $cwd unless $self->{__option}->{$t};
+		my $d = $self->{__option}->{$t};
+		die "Couldn't read directory '$d'" unless -d $d && -r _;
+	}
+}
+
+sub _rewrite_file
+{
+	my ($self, $file) = @_;
+	my $source = File::Spec->catfile( $self->{__option}{from}, $file );
+	$source .= $self->{__option}{sufix} if $self->{__option}{sufix};
+	unless( -f $source && -r _ ) {
+		print STDERR "Couldn't find file '$source'\n";
+		return;
+	}
+	my $dest = File::Spec->catfile( $self->{__option}{to}, $file );
+	return $self->__rewrite_file( $source, $dest );
+}
+
+sub __rewrite_file
+{
+	my ($self, $source, $dest) = @_;
+
+	my $mode = (stat($source))[2];
+
+	open my $sfh, "<$source" or die "Couldn't open '$source' for read";
+	print "Open input '$source' file for substitution\n";
+
+	my ($tmpfh, $tmpfname) = File::Temp::tempfile('mi-subst-XXXX', UNLINK => 1);
+	$self->__process_streams( $sfh, $tmpfh, ($source eq $dest)? 1: 0 );
+	close $sfh;
+
+	seek $tmpfh, 0, 0 or die "Couldn't seek in tmp file";
+
+	open my $dfh, ">$dest" or die "Couldn't open '$dest' for write";
+	print "Open output '$dest' file for substitution\n";
+
+	while( <$tmpfh> ) {
+		print $dfh $_;
+	}
+	close $dfh;
+	chmod $mode, $dest or "Couldn't change mode on '$dest'";
+}
+
+sub __process_streams
+{
+	my ($self, $in, $out, $replace) = @_;
+	
+	my @queue = ();
+	my $subst = $self->{'__subst'};
+	my $re_subst = join('|', map {"\Q$_"} keys %{ $subst } );
+
+	while( my $str = <$in> ) {
+		if( $str =~ /^###\s*(before|replace|after)\:\s?(.*)$/s ) {
+			my ($action, $nstr) = ($1,$2);
+			$nstr =~ s/\@($re_subst)\@/$subst->{$1}/ge;
+
+			die "Replace action is bad idea for situations when dest is equal to source"
+                if $replace && $action eq 'replace';
+			if( $action eq 'before' ) {
+				die "no line before 'before' action" unless @queue;
+				# overwrite prev line;
+				pop @queue;
+				push @queue, $nstr;
+				push @queue, $str;
+			} elsif( $action eq 'replace' ) {
+				push @queue, $nstr;
+			} elsif( $action eq 'after' ) {
+				push @queue, $str;
+				push @queue, $nstr;
+				# skip one line;
+				<$in>;
+			}
+		} else {
+			push @queue, $str;
+		}
+		while( @queue > 3 ) {
+			print $out shift(@queue);
+		}
+	}
+	while( scalar @queue ) {
+		print $out shift(@queue);
+	}
+}
+
+1;
+

commit 413f78b5e974ee18813fc830e5e1ac07d35a0a08
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Sep 8 13:46:28 2023 -0400

    Add utility to insert a FormTools config from JSON
    
    Mostly for testing, but could be useful for automatically
    inserting pre-configured forms in new extensions.

diff --git a/META.yml b/META.yml
index 7cbfb2b..470eb1d 100644
--- a/META.yml
+++ b/META.yml
@@ -16,6 +16,7 @@ meta-spec:
 name: RT-Extension-FormTools
 no_index:
   directory:
+    - etc
     - html
     - inc
 requires:
diff --git a/Makefile.PL b/Makefile.PL
index 4d0e2ec..ed71e84 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -4,6 +4,30 @@ requires_rt('5.0.0');
 
 repository('https://github.com/bestpractical/rt-extension-formtools');
 
+my ($lp) = ($INC{'RT.pm'} =~ /^(.*)[\\\/]/);
+my $lib_path = join( ' ', "$RT::LocalPath/lib", $lp );
+my $bin_path = $RT::BinPath || "$RT::BasePath/bin" || "/opt/rt5/bin";
+
+# Straight from perldoc perlvar
+use Config;
+my $secure_perl_path = $Config{perlpath};
+if ($^O ne 'VMS') {
+    $secure_perl_path .= $Config{_exe}
+        unless $secure_perl_path =~ m/$Config{_exe}$/i;
+}
+
+substitute(
+           {
+        RT_LIB_PATH  => $lib_path,
+        RT_BIN_PATH  => $bin_path,
+        PERL         => $ENV{PERL} || $secure_perl_path,
+    },
+           {
+        sufix => '.in'
+    },
+           qw(bin/rt-insert-formtools-config),
+);
+
 sign();
 WriteAll();
 
diff --git a/bin/rt-insert-formtools-config.in b/bin/rt-insert-formtools-config.in
new file mode 100644
index 0000000..6cf3573
--- /dev/null
+++ b/bin/rt-insert-formtools-config.in
@@ -0,0 +1,84 @@
+#!/usr/bin/env perl
+### before: #!@PERL@
+
+use strict;
+use warnings;
+
+### after:     use lib qw(@RT_LIB_PATH@);
+use lib '/opt/rt5/local/lib /opt/rt5/lib';
+
+use RT::Interface::CLI  qw(Init);
+
+use JSON;
+use Getopt::Long;
+
+my %OPT = (
+    'form-name' => 1,
+);
+
+Init(
+    \%OPT,
+    "help|h",
+    "form-name=s",
+);
+
+Pod::Usage::pod2usage({verbose => 1}) if $OPT{help};
+Pod::Usage::pod2usage() unless @ARGV == 1;
+
+unless ( $OPT{'form-name'} ) {
+    die "form-name is required to name the new form";
+}
+
+my ($filename) = @ARGV;
+die "Not a file: $filename\n" unless -f $filename;
+die "Cannot read file: $filename\n" unless -r $filename;
+
+open(my $fh, "<", $filename)
+    or die "Can't read $filename: $!";
+
+my $json_input = do {local $/; <$fh>} if $fh;
+my $formtools_hash = decode_json($json_input);
+
+my $form = RT::Attribute->new( RT->SystemUser );
+my ( $ok, $msg ) = $form->Create(
+    Name    => 'FormTools Form',
+    Description => $OPT{'form-name'},
+    Object => RT->System,
+    Content => $formtools_hash,
+);
+
+if ( $ok ) {
+    print "Form \"" . $OPT{'form-name'} . "\" created.\n";
+}
+else {
+    print "Error: $msg\n";
+}
+
+__END__
+
+=head1 NAME
+
+rt-insert-formtools-config - Process a JSON FormTools configuration
+file and insert it into the RT database.
+
+=head1 SYNOPSIS
+
+    rt-insert-formtools-config --form-name="Form One" formtools-config.json
+
+=head1 DESCRIPTION
+
+This script accepts a file containing a JSON structure to define
+a set of FormTools forms. It will insert this configuration into
+the RT database.
+
+=head1 OPTIONS
+
+=over
+
+=item C<--form-name>
+
+The name of the form to be created.
+
+=back
+
+=cut
diff --git a/etc/sample_form.json b/etc/sample_form.json
new file mode 100644
index 0000000..e716882
--- /dev/null
+++ b/etc/sample_form.json
@@ -0,0 +1,108 @@
+{
+   "submit" : {
+      "content" : [
+         {
+            "html" : "<h1>Account Request</h1>",
+            "type" : "raw_html"
+         },
+         {
+            "type" : "raw_html",
+            "html" : "<h2>Request Submitted</h2>"
+         },
+         {
+            "type" : "raw_html",
+            "html" : "<p>Your request has been submitted.</p>"
+         }
+      ],
+      "name" : "Submit Request",
+      "next" : ""
+   },
+   "queue" : 1,
+   "page2" : {
+      "validation" : 1,
+      "name" : "Page Two",
+      "content" : [
+         {
+            "html" : "<h1>Account Request</h1>",
+            "type" : "raw_html"
+         },
+         {
+            "comp_name" : "Field",
+            "arguments" : {
+               "name" : "Requestors",
+               "label" : "Requested by",
+               "default" : "root at localhost"
+            },
+            "type" : "component"
+         },
+         {
+            "arguments" : {
+               "name" : "Systems"
+            },
+            "type" : "component",
+            "comp_name" : "Field"
+         }
+      ],
+      "next" : "page3"
+   },
+   "formtools-start-page" : "page1",
+   "page3" : {
+      "content" : [
+         {
+            "type" : "raw_html",
+            "html" : "<h1>Account Request</h1>"
+         },
+         {
+            "type" : "raw_html",
+            "html" : "<h2>Confirm Selections</h2>"
+         },
+         {
+            "type" : "component",
+            "comp_name" : "ShowChoices"
+         },
+         {
+            "type" : "raw_html",
+            "html" : "<hr/>\n<i><b>\n<p>What else should we know as we act on your request?</p>\n<p> Do you have special time constraints?</p>\n</b></i>"
+         },
+         {
+            "comp_name" : "Field",
+            "arguments" : {
+               "name" : "Content"
+            },
+            "type" : "component"
+         },
+         {
+            "input-value" : "create_ticket",
+            "type" : "hidden",
+            "input-name" : "create_ticket"
+         }
+      ],
+      "name" : "Review Selections",
+      "validation" : 1,
+      "next" : "submit"
+   },
+   "page1" : {
+      "validation" : 1,
+      "name" : "Page One",
+      "content" : [
+         {
+            "html" : "<h1>Account Request</h1>",
+            "type" : "raw_html"
+         },
+         {
+            "type" : "raw_html",
+            "html" : "<h2>Enter your preferred username</h2>"
+         },
+         {
+            "comp_name" : "Field",
+            "type" : "component",
+            "arguments" : {
+               "default" : "preferred username",
+               "show_validation" : 1,
+               "name" : "Username"
+            }
+         }
+      ],
+      "next" : "page2"
+   }
+}

commit e9989c1119285a42bdf62d74b7e1b16641567c21
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Sep 1 16:57:22 2023 -0400

    Create new page to dynamically generate forms from config

diff --git a/html/Forms/dhandler b/html/Forms/dhandler
new file mode 100644
index 0000000..eb2a0eb
--- /dev/null
+++ b/html/Forms/dhandler
@@ -0,0 +1,88 @@
+<&|/FormTools/Form, next => '/Forms/' . $form_name . '/' . $form_config->{$page}{'next'},
+    validation => $form_config->{$page}{'validation'},
+    next_for_validation => '/Forms/' . $form_name . '/' . $page,
+&>
+
+<%perl>
+# Build the current page here dyamically from config
+
+foreach my $element ( @{$form_config->{$page}{'content'}} ) {
+    if ( $element->{type} eq 'raw_html' ) {
+        $m->out( $element->{html} );
+    }
+    elsif ( $element->{type} eq 'hidden' ) {
+        $m->out('<input type="hidden" class="hidden" name="' . $element->{'input-name'}
+            . '" value="' . $element->{'input-value'} . '"  />');
+    }
+    elsif ( $element->{type} eq 'component' ) {
+        $m->comp('/FormTools/' . $element->{comp_name}, %{$element->{arguments}});
+    }
+}
+</%perl>
+
+<& /FormTools/Next &>
+</&>
+<%init>
+
+my $path = $m->dhandler_arg;
+my ($form_name, $page_name);
+
+if ( $path =~ /^([\w|\s]+)\/(\w+)$/ ) {
+    $form_name = $1;
+    $page_name = $2;
+}
+else {
+    $form_name = $path;
+}
+
+# Limit to names to letters, numbers, underscore, spaces
+unless ( $form_name =~ /^[\w|\s]+$/ ) {
+    RT->Logger->error("FormTools called with invalid form name: $form_name");
+    Abort('Invalid form name');
+}
+
+if ( $page_name ) {
+    unless ( $page_name =~ /^\w+$/ ) {
+        RT->Logger->error("FormTools called with invalid page name: $page_name");
+        Abort('Invalid page name');
+    }
+}
+
+# Load FormTools configration and look for a configured
+# form with the provided name.
+my $form_attribute = RT::Attribute->new( RT->SystemUser );
+$form_attribute->LoadByCols( Name => 'FormTools Form', Description => $form_name );
+my $form_config;
+
+if ( $form_attribute->Id ) {
+    $form_config = $form_attribute->Content;
+}
+else {
+    # We didn't find a form, so show a not found page
+    Abort('Form not found');
+}
+
+my $page;
+
+if ( $page_name ) {
+    $page = $page_name;
+}
+else {
+    $page = $form_config->{'formtools-start-page'};
+}
+
+my $queue_obj = RT::Queue->new( RT->SystemUser );
+my ($ok, $msg) = $queue_obj->Load( $form_config->{'queue'} );
+
+unless ( $ok ) {
+    RT->Logger->error('FormTools unable to load queue: ' . $form_config->{'queue'});
+    Abort('Unable to load form, invalid queue');
+}
+
+$m->notes( queue => $queue_obj );
+$m->notes( page_title => $form_config->{$page}{'name'} );
+
+</%init>
+<%args>
+$_form_tools_next => undef
+</%args>

commit 6e5109aff433e0b96aa7abcf8dba7d44d42693ef
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Wed Sep 6 08:59:42 2023 -0400

    Remove unused variable
    
    $next_comp is created, but not used anywhere after
    it is set.

diff --git a/html/FormTools/Form b/html/FormTools/Form
index 7b6ba7d..665df7b 100644
--- a/html/FormTools/Form
+++ b/html/FormTools/Form
@@ -66,7 +66,6 @@ if ($validation && $real_next) {
 
     }
     unless (@results) {
-        my $next_comp = $real_next;
         $real_next = $m->caller(1)->dir_path . '/' . $real_next
             unless $real_next =~ m'^/';
         $m->subexec("$real_next", %ARGS, %request_args);

commit 51d16014358ce63a6afa790f64a311c7e6c41e7e
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Wed Sep 6 09:01:19 2023 -0400

    Update Module::Install

diff --git a/META.yml b/META.yml
index 7ab87ec..7cbfb2b 100644
--- a/META.yml
+++ b/META.yml
@@ -8,7 +8,7 @@ configure_requires:
   ExtUtils::MakeMaker: 6.59
 distribution_type: module
 dynamic_config: 1
-generated_by: 'Module::Install version 1.19'
+generated_by: 'Module::Install version 1.21'
 license: gpl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
diff --git a/inc/Module/Install.pm b/inc/Module/Install.pm
index 7ba98c2..3dd721b 100644
--- a/inc/Module/Install.pm
+++ b/inc/Module/Install.pm
@@ -31,7 +31,7 @@ BEGIN {
 	# This is not enforced yet, but will be some time in the next few
 	# releases once we can make sure it won't clash with custom
 	# Module::Install extensions.
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 
 	# Storage for the pseudo-singleton
 	$MAIN    = undef;
diff --git a/inc/Module/Install/Base.pm b/inc/Module/Install/Base.pm
index 9fa42c2..67ce900 100644
--- a/inc/Module/Install/Base.pm
+++ b/inc/Module/Install/Base.pm
@@ -4,7 +4,7 @@ package Module::Install::Base;
 use strict 'vars';
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 }
 
 # Suspend handler for "redefined" warnings
diff --git a/inc/Module/Install/Can.pm b/inc/Module/Install/Can.pm
index d65c753..93fc4f9 100644
--- a/inc/Module/Install/Can.pm
+++ b/inc/Module/Install/Can.pm
@@ -8,7 +8,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Fetch.pm b/inc/Module/Install/Fetch.pm
index 3072b08..3c9390a 100644
--- a/inc/Module/Install/Fetch.pm
+++ b/inc/Module/Install/Fetch.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Include.pm b/inc/Module/Install/Include.pm
index 13fdcd0..b9b926f 100644
--- a/inc/Module/Install/Include.pm
+++ b/inc/Module/Install/Include.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Makefile.pm b/inc/Module/Install/Makefile.pm
index 13a4464..1e214a0 100644
--- a/inc/Module/Install/Makefile.pm
+++ b/inc/Module/Install/Makefile.pm
@@ -8,7 +8,7 @@ use Fcntl qw/:flock :seek/;
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Metadata.pm b/inc/Module/Install/Metadata.pm
index 11bf971..2ae8036 100644
--- a/inc/Module/Install/Metadata.pm
+++ b/inc/Module/Install/Metadata.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
@@ -455,12 +455,8 @@ sub author_from {
 my %license_urls = (
     perl         => 'http://dev.perl.org/licenses/',
     apache       => 'http://apache.org/licenses/LICENSE-2.0',
-    apache_1_1   => 'http://apache.org/licenses/LICENSE-1.1',
     artistic     => 'http://opensource.org/licenses/artistic-license.php',
-    artistic_2   => 'http://opensource.org/licenses/artistic-license-2.0.php',
     lgpl         => 'http://opensource.org/licenses/lgpl-license.php',
-    lgpl2        => 'http://opensource.org/licenses/lgpl-2.1.php',
-    lgpl3        => 'http://opensource.org/licenses/lgpl-3.0.html',
     bsd          => 'http://opensource.org/licenses/bsd-license.php',
     gpl          => 'http://opensource.org/licenses/gpl-license.php',
     gpl2         => 'http://opensource.org/licenses/gpl-2.0.php',
@@ -471,6 +467,12 @@ my %license_urls = (
     unrestricted => undef,
     restrictive  => undef,
     unknown      => undef,
+
+    # these are not actually allowed in meta-spec v1.4 but are left here for compatibility:
+    apache_1_1   => 'http://apache.org/licenses/LICENSE-1.1',
+    artistic_2   => 'http://opensource.org/licenses/artistic-license-2.0.php',
+    lgpl2        => 'http://opensource.org/licenses/lgpl-2.1.php',
+    lgpl3        => 'http://opensource.org/licenses/lgpl-3.0.html',
 );
 
 sub license {
diff --git a/inc/Module/Install/Win32.pm b/inc/Module/Install/Win32.pm
index f7aa615..b6c1d37 100644
--- a/inc/Module/Install/Win32.pm
+++ b/inc/Module/Install/Win32.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/WriteAll.pm b/inc/Module/Install/WriteAll.pm
index 2db861a..d87eb9a 100644
--- a/inc/Module/Install/WriteAll.pm
+++ b/inc/Module/Install/WriteAll.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = qw{Module::Install::Base};
 	$ISCORE  = 1;
 }
diff --git a/inc/YAML/Tiny.pm b/inc/YAML/Tiny.pm
index fb157a6..db3ae5c 100644
--- a/inc/YAML/Tiny.pm
+++ b/inc/YAML/Tiny.pm
@@ -2,12 +2,12 @@
 use 5.008001; # sane UTF-8 support
 use strict;
 use warnings;
-package YAML::Tiny; # git description: v1.72-7-g8682f63
+package YAML::Tiny; # git description: v1.73-12-ge02f827
 # XXX-INGY is 5.8.1 too old/broken for utf8?
 # XXX-XDG Lancaster consensus was that it was sufficient until
 # proven otherwise
 
-our $VERSION = '1.73';
+our $VERSION = '1.74';
 
 #####################################################################
 # The YAML::Tiny API.

-----------------------------------------------------------------------


hooks/post-receive
-- 
rt-extension-formtools


More information about the Bps-public-commit mailing list