Group
Extension

WebService-SonarQube/lib/WebService/SonarQube.pm

package WebService::SonarQube;

# Created on: 2015-05-02 20:12:53
# Create by:  Ivan Wills
# $Id$
# $Revision$, $HeadURL$, $Date$
# $Revision$, $Source$, $Date$

use Moo;
use strict;
use warnings;
use Carp;
use namespace::clean;
use English qw/ -no_match_vars /;
use WWW::Mechanize;
use Type::Tiny;
use Types::Standard -types;
use URI;
use WWW::Mechanize;
use JSON;
use Try::Tiny;

our $VERSION = '0.10';

has url => (
    is       => 'rw',
    required => 1,
    isa      => Str,
);
has [qw/username password version/] => (
    is  => 'rw',
    isa => Str,
);
has mech => (
    is      => 'rw',
    default => sub { WWW::Mechanize->new(); },
);
has commands => (
    is => 'rw',
);

sub BUILD {
    my ($self) = @_;

    $self->mech->add_header(accept => 'application/json');

    if ($self->url =~ m{/$}) {
        my $url = $self->url;
        $url =~ s{/$}{};
        $self->url($url);
    }

    $self->_get_commands();

    my $server = $self->_get('server/index');
    $self->version($server->{version});
}

sub _get_commands {
    my ($self) = @_;

    my $list = $self->_get('webservices/list',  include_internals => 'true');

    my %commands;
    for my $ws (@{ $list->{webServices}}) {
        my $name = $ws->{path};
        $name =~ s{^api/}{};

        for my $action (@{ $ws->{actions} }) {
            $commands{$name . '/' . $action->{key}} = {
                name     => $name . '_' . $action->{key},
                url      => $name . '/' . $action->{key},
                internal => !!$action->{internal},
                post     => !!$action->{post},
                description => $action->{description},
            };
        }
    }

    $self->commands(\%commands);
}

our $AUTOLOAD;
sub AUTOLOAD {
    my ($self, %params) = @_;

    my $api =  $AUTOLOAD;
    $api =~ s{.*::}{};
    $api =~ s{_}{/}g;

    return if $api eq 'DESTROY';

    if (!$self->commands->{$api}) {
        confess "Unknown command $api for SonarQube " . $self->version . '!';
    }

    my $url = $self->url;
    $url =~ s{//(?:[^@]+[@])}{//};

    if ($self->username && $self->password) {
        $self->mech->credentials(_url_encode($self->username), _url_encode($self->password));
        my ($user, $pass) = map {_url_encode($_)} ($self->username, $self->password);
        $url =~ s{//}{//$user\:$pass\@};
    }
    $self->url($url);

    my $result;
    try {
        $result = $self->commands->{$api}{post} ? $self->_post($api, %params) : $self->_get($api, %params);
    }
    catch {
        local $Data::Dumper::Indent = 0;
        require Data::Dumper;
        my $args = Data::Dumper::Dumper( \%params );
        $args = s/^\$VAR\d\s+=\s+//;
        confess "Errored trying $AUTOLOAD($args)\n$_\n";
    };

    return $result;
}

sub _get {
    my ($self, $api, %params) = @_;

    my $mech = $self->mech;
    my $uri = URI->new($self->url . '/api/' . $api);
    $uri->query_form(%params);

    $mech->get($uri);

    return decode_json($mech->content || '{}');
}

sub _post {
    my ($self, $api, %params) = @_;

    my $mech = $self->mech;
    my $uri = URI->new($self->url . '/api/' . $api);

    $mech->post($uri, \%params);

    return decode_json($mech->content || '{}');
}

sub _url_encode {
    my ($str) = @_;
    $str =~ s/(\W)/sprintf('%%%x',ord($1))/eg;
    return $str;
};

1;

__END__

=head1 NAME

WebService::SonarQube - API for talking to SonarQube

=head1 VERSION

This documentation refers to WebService::SonarQube version 0.10

=head1 SYNOPSIS

   use WebService::SonarQube;

   # create a new object
   my $sonar = WebService::SonarQube->new(
       url => 'http://example.com/sonar',
   );

   # call a sonar api
   my $server_details = $sonar->server_index();

=head1 DESCRIPTION

Simple interface to accessing SonarQube's web API.

=head1 SUBROUTINES/METHODS

=head2 C<BUILD>

Internal method which constructs some internal properties

=head2 C<commands ()>

Returns the list of API commands that the server supports

=head2 C<mech ()>

Returns the internal L<WWW::Mechanize> object

=head2 API COMMANDS

    POST api/action_plans/close
    POST api/action_plans/create
    POST api/action_plans/delete
    POST api/action_plans/open
     GET api/action_plans/search
    POST api/action_plans/update
     GET api/authentication/validate
     GET api/coverage/show
     GET api/duplications/show
     GET api/events/index
     GET api/favorites/index
     GET api/issue_filters/favorites
     GET api/issue_filters/show
    POST api/issues/add_comment
    POST api/issues/assign
     GET api/issues/authors
    POST api/issues/bulk_change
     GET api/issues/changelog
    POST api/issues/create
    POST api/issues/delete_comment
    POST api/issues/do_action
    POST api/issues/do_transition
    POST api/issues/edit_comment
    POST api/issues/plan
     GET api/issues/search
    POST api/issues/set_severity
     GET api/languages/list
     GET api/manual_measures/index
     GET api/metrics/index
    POST api/permissions/add
    POST api/permissions/remove
    POST api/profiles/backup
    POST api/profiles/destroy
     GET api/profiles/index
     GET api/profiles/list
    POST api/profiles/restore
    POST api/profiles/set_as_default
    POST api/projects/create
    POST api/projects/destroy
     GET api/projects/index
     GET api/properties/index
    POST api/qualitygates/copy
    POST api/qualitygates/create
    POST api/qualitygates/create_condition
    POST api/qualitygates/delete_condition
    POST api/qualitygates/deselect
    POST api/qualitygates/destroy
     GET api/qualitygates/list
    POST api/qualitygates/rename
     GET api/qualitygates/search
    POST api/qualitygates/select
    POST api/qualitygates/set_as_default
     GET api/qualitygates/show
    POST api/qualitygates/unset_default
    POST api/qualitygates/update_condition
    POST api/qualityprofiles/activate_rule
    POST api/qualityprofiles/activate_rules
    POST api/qualityprofiles/deactivate_rule
    POST api/qualityprofiles/deactivate_rules
    POST api/qualityprofiles/restore_built_in
     GET api/resources/index
    POST api/rules/create
    POST api/rules/delete
     GET api/rules/repositories
     GET api/rules/search
     GET api/rules/show
     GET api/rules/tags
    POST api/rules/update
     GET api/server/index
    POST api/server/setup
     GET api/sources/raw
     GET api/sources/scm
     GET api/sources/show
     GET api/system/info
    POST api/system/restart
     GET api/tests/covered_files
     GET api/tests/show
     GET api/tests/test_cases
     GET api/timemachine/index
     GET api/updatecenter/installed_plugins
     GET api/user_properties/index
    POST api/users/create
    POST api/users/deactivate
     GET api/users/search
    POST api/users/update
    POST api/views/add_local_view
    POST api/views/add_project
    POST api/views/add_remote_view
    POST api/views/add_sub_view
    POST api/views/create
     GET api/views/define
    POST api/views/delete
     GET api/views/list
     GET api/views/local_views
    POST api/views/manual_measure
    POST api/views/mode
    POST api/views/move
     GET api/views/move_options
     GET api/views/projects
    POST api/views/regexp
     GET api/views/remote_views
    POST api/views/remove_project
     GET api/views/show
    POST api/views/update
     GET api/webservices/list
     GET api/webservices/response_example

=head1 DIAGNOSTICS

=head1 CONFIGURATION AND ENVIRONMENT

=head1 DEPENDENCIES

=head1 INCOMPATIBILITIES

=head1 BUGS AND LIMITATIONS

There are no known bugs in this module.

Please report problems to Ivan Wills (ivan.wills@gmail.com).

Patches are welcome.

=head1 AUTHOR

Ivan Wills - (ivan.wills@gmail.com)

=head1 LICENSE AND COPYRIGHT

Copyright (c) 2015 Ivan Wills (14 Mullion Close, Hornsby Heights, NSW Australia 2077).
All rights reserved.

This module is free software; you can redistribute it and/or modify it under
the same terms as Perl itself. See L<perlartistic>.  This program is
distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

=cut


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.