summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenichi Ishigaki <ishigaki@cpan.org>2023-04-27 20:52:05 +0900
committerKenichi Ishigaki <ishigaki@cpan.org>2023-04-27 20:52:05 +0900
commit5d22622b97e90a7b1bc9bd770288d55cd0033d23 (patch)
treeec3dfd60e138936f3b55fb483d9028b8e06d483d
parent8958750d5ae9da5e152bea00557eb86efedddf1a (diff)
Support class NAME VERSION and role NAME VERSION (for the latest perl/Object::Pad)
-rw-r--r--MANIFEST3
-rw-r--r--lib/Parse/PMFile.pm2
-rw-r--r--t/42_class_versions.t61
-rw-r--r--t/43_role_versions.t61
4 files changed, 126 insertions, 1 deletions
diff --git a/MANIFEST b/MANIFEST
index 41fb567..cc7e8c7 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -14,6 +14,9 @@ t/34_math_version.t
t/35_scoped_our_version.t
t/36_long_version.t
t/40_package_versions.t
+t/41_multiple_packages.t
+t/42_class_versions.t
+t/43_role_versions.t
t/50_no_index.t
t/60_permissions.t
t/70_vpp.t
diff --git a/lib/Parse/PMFile.pm b/lib/Parse/PMFile.pm
index cb4cb58..c7571ff 100644
--- a/lib/Parse/PMFile.pm
+++ b/lib/Parse/PMFile.pm
@@ -382,7 +382,7 @@ sub _packages_per_pmfile {
# (.*) # takes too much time if $pline is long
#(?<![*\$\\@%&]) # no sigils
^[\s\{;]*
- \bpackage\s+
+ \b(?:package|class|role)\s+
([\w\:\']+)
\s*
(?: $ | [\}\;] | \{ | \s+($version::STRICT) )
diff --git a/t/42_class_versions.t b/t/42_class_versions.t
new file mode 100644
index 0000000..22dee87
--- /dev/null
+++ b/t/42_class_versions.t
@@ -0,0 +1,61 @@
+use strict;
+use warnings;
+use Test::More;
+use Parse::PMFile;
+use File::Temp;
+
+my $tmpdir = File::Temp->newdir(CLEANUP => 1);
+plan skip_all => "tmpdir is not ready" unless -e $tmpdir && -w $tmpdir;
+
+test('class '.'Parse::PMFile::Test', <<'TEST');
+{
+ $Parse::PMFile::Test::VERSION = "0.01";
+}
+TEST
+
+test('class '.'Parse::PMFile::Test', <<'TEST');
+{
+ $VERSION = "0.01";
+}
+TEST
+
+test('class '.'Parse::PMFile::Test {', <<'TEST');
+ $Parse::PMFile::Test::VERSION = "0.01";
+};
+TEST
+
+test('class '.'Parse::PMFile::Test {', <<'TEST');
+ $VERSION = "0.01";
+};
+TEST
+
+test('class '.'Parse::PMFile::Test 0.01 {', <<'TEST');
+};
+TEST
+
+test('class '.'Parse::PMFile::Test 0.01 :isa(Foo) :does(Bar) {', <<'TEST');
+};
+TEST
+
+sub test {
+ my @lines = @_;
+
+ my $pmfile = "$tmpdir/Test.pm";
+
+ open my $fh, '>', $pmfile or plan skip_all => "Failed to create a pmfile";
+ print $fh join "\n", @lines, "";
+ close $fh;
+
+ for (0..1) {
+ no warnings 'once';
+ local $Parse::PMFile::FORK = $_;
+ my $parser = Parse::PMFile->new;
+ my $info = $parser->parse($pmfile);
+
+ is $info->{'Parse::PMFile::Test'}{version} => '0.01';
+ # note explain $info;
+ }
+}
+
+done_testing;
+
diff --git a/t/43_role_versions.t b/t/43_role_versions.t
new file mode 100644
index 0000000..6149992
--- /dev/null
+++ b/t/43_role_versions.t
@@ -0,0 +1,61 @@
+use strict;
+use warnings;
+use Test::More;
+use Parse::PMFile;
+use File::Temp;
+
+my $tmpdir = File::Temp->newdir(CLEANUP => 1);
+plan skip_all => "tmpdir is not ready" unless -e $tmpdir && -w $tmpdir;
+
+test('role '.'Parse::PMFile::Test', <<'TEST');
+{
+ $Parse::PMFile::Test::VERSION = "0.01";
+}
+TEST
+
+test('role '.'Parse::PMFile::Test', <<'TEST');
+{
+ $VERSION = "0.01";
+}
+TEST
+
+test('role '.'Parse::PMFile::Test {', <<'TEST');
+ $Parse::PMFile::Test::VERSION = "0.01";
+};
+TEST
+
+test('role '.'Parse::PMFile::Test {', <<'TEST');
+ $VERSION = "0.01";
+};
+TEST
+
+test('role '.'Parse::PMFile::Test 0.01 {', <<'TEST');
+};
+TEST
+
+test('role '.'Parse::PMFile::Test 0.01 :does(Bar) {', <<'TEST');
+};
+TEST
+
+sub test {
+ my @lines = @_;
+
+ my $pmfile = "$tmpdir/Test.pm";
+
+ open my $fh, '>', $pmfile or plan skip_all => "Failed to create a pmfile";
+ print $fh join "\n", @lines, "";
+ close $fh;
+
+ for (0..1) {
+ no warnings 'once';
+ local $Parse::PMFile::FORK = $_;
+ my $parser = Parse::PMFile->new;
+ my $info = $parser->parse($pmfile);
+
+ is $info->{'Parse::PMFile::Test'}{version} => '0.01';
+ # note explain $info;
+ }
+}
+
+done_testing;
+