diff options
author | Kenichi Ishigaki <ishigaki@cpan.org> | 2023-04-27 20:52:05 +0900 |
---|---|---|
committer | Kenichi Ishigaki <ishigaki@cpan.org> | 2023-04-27 20:52:05 +0900 |
commit | 5d22622b97e90a7b1bc9bd770288d55cd0033d23 (patch) | |
tree | ec3dfd60e138936f3b55fb483d9028b8e06d483d | |
parent | 8958750d5ae9da5e152bea00557eb86efedddf1a (diff) |
Support class NAME VERSION and role NAME VERSION (for the latest perl/Object::Pad)
-rw-r--r-- | MANIFEST | 3 | ||||
-rw-r--r-- | lib/Parse/PMFile.pm | 2 | ||||
-rw-r--r-- | t/42_class_versions.t | 61 | ||||
-rw-r--r-- | t/43_role_versions.t | 61 |
4 files changed, 126 insertions, 1 deletions
@@ -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; + |