EPFL-Sciper-List

 view release on metacpan or  search on metacpan

lib/EPFL/Sciper/List.pm  view on Meta::CPAN

=head1 NAME

EPFL::Sciper::List - Retrieve a list of all public active sciper from EPFL.

=head1 VERSION

Version 1.02

=cut

our $VERSION = '1.02';

=head1 SYNOPSIS

Retrieve sciper from EPFL

    use EPFL::Sciper::List qw/retrieveSciper toJson toTsv/;

    my @listPersons = retrieveSciper();
    print toJson(@listPersons);
    print toTsv(@listPersons);

Via the command line epfl-sciper-list

=head1 DESCRIPTION

A simple module to retrieve a list of all public active sciper from EPFL.

=cut

use base 'Exporter';
our @EXPORT_OK =
  qw/p_createUserAgent p_getUrl p_buildUrl retrieveSciper toJson toTsv/;

Readonly::Scalar my $TIMEOUT => 1200;

Readonly::Scalar my $MAXREDIRECT => 10;

Readonly::Scalar my $AUTOCOMPLETE_URL =>
  'https://search.epfl.ch/json/autocompletename.action?maxRows=99999999&term=';

=head1 SUBROUTINES/METHODS

=head2 retrieveSciper( )

Return a list of persons from EPFL with information like:

(sciper => 999999, firstname => 'Taylor', name => 'Swift');

=cut

sub retrieveSciper {
  my @listPersons = ();
  my @alphabet    = ( 'a' .. 'z' );

  my $ua = p_createUserAgent();
  foreach my $letter (@alphabet) {
    my $response = p_getUrl( $ua, p_buildUrl($letter) );

    if ( $response->is_success ) {
      my $struct = from_json( $response->decoded_content );
      push @listPersons, @{ $struct->{result} };
    }
  }

  my %hash = ();
  foreach my $per (@listPersons) {
    $hash{ $per->{sciper} } = $per;
  }

  @listPersons = ();
  foreach my $sciper ( sort { $a <=> $b } keys %hash ) {
    push @listPersons, $hash{$sciper};
  }

  return @listPersons;
}

=head2 toJson

Return sciper list in JSON

=cut

sub toJson {
  my @list = @_;

  my $json = JSON->new->allow_nonref;
  return $json->pretty->encode( \@list );
}

=head2 toTsv

Return sciper list in TSV

=cut

sub toTsv {
  my @list = @_;

  my $output = q{};
  foreach my $per (@list) {
    $output .=
      $per->{sciper} . "\t" . $per->{firstname} . "\t" . $per->{name} . "\n";
  }
  return $output;
}

=head1 PRIVATE SUBROUTINES/METHODS

=head2 p_createUserAgent

Return a LWP::UserAgent.
LWP::UserAgent objects can be used to dispatch web requests.

=cut

sub p_createUserAgent {
  my $ua = LWP::UserAgent->new;

  $ua->timeout($TIMEOUT);



( run in 1.050 second using v1.01-cache-2.11-cpan-c221a9de4ec )