Path::Resolver::Resolver::Archive::Tar - find content inside a tar archive


Path-Resolver documentation Contained in the Path-Resolver distribution.

Index


Code Index:

NAME

Top

Path::Resolver::Resolver::Archive::Tar - find content inside a tar archive

VERSION

Top

version 3.100451

SYNOPSIS

Top

  my $resolver = Path::Resolver::Resolver::Archive::Tar->new({
    archive => 'archive-file.tar.gz',
  });

  my $simple_entity = $resolver->entity_at('foo/bar.txt');

This resolver looks for files inside a tar archive or a compressed tar archive. It uses Archive::Tar, and can read any archive understood by that library.

The native type of this resolver is a class type of Path::Resolver::SimpleEntity and it has no default converter.

ATTRIBUTES

Top

archive

This attribute stores the Archive::Tar object in which content will be resolved. A simple string may be passed to the constructor to be used as an archive filename.

root

If given, this attribute specifies a root inside the archive under which to look. This is useful when dealing with an archive in which all content is under a common directory.

AUTHOR

Top

Ricardo Signes <rjbs@cpan.org>

COPYRIGHT AND LICENSE

Top


Path-Resolver documentation Contained in the Path-Resolver distribution.

package Path::Resolver::Resolver::Archive::Tar;
BEGIN {
  $Path::Resolver::Resolver::Archive::Tar::VERSION = '3.100451';
}
# ABSTRACT: find content inside a tar archive
use Moose;
use Moose::Util::TypeConstraints;
with 'Path::Resolver::Role::Resolver';

use namespace::autoclean;

use Archive::Tar;
use File::Spec::Unix;
use Path::Resolver::SimpleEntity;


sub native_type { class_type('Path::Resolver::SimpleEntity') }


has archive => (
  is  => 'ro',
  required    => 1,
  initializer => sub {
    my ($self, $value, $set) = @_;

    my $archive = ref $value ? $value : Archive::Tar->new($value);

    confess("$value is not a valid archive value")
      unless class_type('Archive::Tar')->check($archive);
    
    $set->($archive);
  },
);


has root => (
  is => 'ro',
  required => 0,
);

sub entity_at {
  my ($self, $path) = @_;
  my $root = $self->root;
  my @root = (length $root) ? $root : ();

  my $filename = File::Spec::Unix->catfile(@root, @$path);
  return unless $self->archive->contains_file($filename);
  my $content = $self->archive->get_content($filename);

  Path::Resolver::SimpleEntity->new({ content_ref => \$content });
}

1;

__END__