JSAN::Mini - Creates a minimal local mirror of JSAN for offline installation


JSAN-Mini documentation Contained in the JSAN-Mini distribution.

Index


Code Index:

NAME

Top

JSAN::Mini - Creates a minimal local mirror of JSAN for offline installation

SYNOPSIS

Top

  # Update your local minijsan using default settings
  JSAN::Mini->update_mirror;

  # ... and for now that's about it :)

DESCRIPTION

Top

minijsan is an application which scans the JSAN index and ensures that the release tarballs for all of the libraries in the index are stored in the local mirror provided by JSAN::Transport.

This allows for the installation of JSAN packages without the need to connect to the internet. For example, it can be very useful for installing packaging while on international flights for example :)

JSAN::Mini provides the primary API for implementing the functionality for minijsan, and also provides something that you can sub-class, and thus add your own additional functionality.

If you're a normal user, or you are ot going to do anything weird, you might want to look at minijsan instead.

METHODS

Top

update_mirror

The update_mirror static method creates and executes a new JSAN::Mini object using the default params, normally pretty much Doing What You Mean.

new value => 'param'

The new constructor creates a new minijsan process.

It takes as argument a set of key/value pairs controlling it.

verbose

The verbose flag controls the level of debugging output that the object will produce.

When set to true, it causes process information to be printed to STDOUT. When set to false (the default) it prints nothing.

Returns a JSAN::Mini object.

added

Once the JSAN::Mini object has been run, the added method returns the number of new releases that were added to the local mirror.

run

The run method initiates the minicpan process to syncronize the files in the local mirror with those on the remote mirror.

Returns the number of new files added to the minijsan mirror.

add_release $release

The add_release method is called when a release is to be added to the local mirror.

The method is passed a JSAN::Index::Release object and, by default, mirrors it from the remote repository.

This is the method that you would typically subclass to add additional functionality to the module (where such functionality does not on information contained) in other releases in the repository.

process_release $release

The optional process_release method can be defined by a JSAN::Mini sub-class, and can be used as a place to implement extended functionality, where this functionality requires that all new releases by downloaded before processing starts.

The method is passed a JSAN::Index::Release object and simply shortcuts by default.

SUPPORT

Top

Bugs should be reported via the CPAN bug tracker at

http://rt.cpan.org/NoAuth/ReportBug.html?Queue=JSAN-Mini

For other issues, contact the author.

AUTHOR

Top

Adam Kennedy <adamk@cpan.org>, http://ali.as/

COPYRIGHT

Top


JSAN-Mini documentation Contained in the JSAN-Mini distribution.
package JSAN::Mini;

use 5.006;
use strict;
use Params::Util '_INSTANCE';
use JSAN::Transport;
use JSAN::Index;

our $VERSION = '1.04';





#####################################################################
# Static Methods

sub update_mirror {
	my $class = shift;
	my $self  = $class->new(@_);
	$self->run;
}





#####################################################################
# Constructor and Accessors

sub new {
	my $class = ref $_[0] ? ref shift : shift;
	
	# Create the basic object
	my $self = bless {
		added => 0,
		}, $class;

	$self;
}

sub added { $_[0]->{added} }





#####################################################################
# JSAN::Mini Methods

sub run {
	my $self = shift;
	$self->{added} = 0;
	$self->_verbose("JSAN::Mini starting...");

	# Add each of the releases
	my @releases = $self->_releases;
	foreach my $release ( @releases ) {
		next if $release->file_mirrored;
		$self->_verbose('Adding ' . $release->source . ' to minijsan');
		$self->add_release( $release );
	}

	# If there is a dist processing step, do that.
	# We use a seperate loop in case there are processing
	# operations that need to run across several files.
	foreach my $release ( @releases ) {
		$self->process_release( $release );
	}

	$self->_verbose('JSAN::Mini run completed.');
	$self->{added};
}

# Find the list of releases
sub _releases {
	my $self = shift;

	$self->_verbose("Generating JSAN::Index::Release list...");
	my @libs     = JSAN::Index::Library->select;
	my @releases = map { $_->release } @libs;
	my %seen     = ();
	@releases    = sort { $a->source cmp $b->source }
	               grep { $seen{$_->id}++ } @releases;
	$self->_verbose('Found ' . scalar(@releases) . ' releases to check');

	@releases;
}

sub add_release {
	my $self    = shift;
	my $release = _INSTANCE($_[0], 'JSAN::Index::Release') ? shift
		: Carp::croak("JSAN::Mini::add_release was not passed a JSAN::Index::Release object");
	$release->mirror;
	1;
}

sub process_release {
	1;
}

# When in verbose mode (which is all the time for now) print a message
# to STDOUT
sub _verbose {
	my $self = shift;
	if ( $self->{verbose} ) {
		my $msg  = shift;
		$msg =~ s/\n?$/\n/s;
		print $msg;
	}
	1;
}

1;