From 63b51ecf09f8ac77bac55bf5c4d63925489eedfb Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Wed, 19 Jun 2024 16:27:05 +0200 Subject: [PATCH] use GraphQL API to get issue counts from GitHub GitHub's GraphQL API can return the number of issues directly, rather than needing to retrieve and count them. Net::GitHub::V4 provides access to the GitHub GraphQL API. Switch to using it rather than Pithub. --- cpanfile | 2 +- cpanfile.snapshot | 206 ++++++++------------------------- lib/MetaCPAN/Script/Tickets.pm | 75 +++++++----- 3 files changed, 97 insertions(+), 186 deletions(-) diff --git a/cpanfile b/cpanfile index ce92962b3..88473ce24 100644 --- a/cpanfile +++ b/cpanfile @@ -117,12 +117,12 @@ requires 'MooseX::Types::Moose'; requires 'Mozilla::CA', '20211001'; requires 'namespace::autoclean'; requires 'Net::Fastly', '1.12'; +requires 'Net::GitHub::V4'; requires 'Parse::CPAN::Packages::Fast', '0.09'; requires 'Parse::PMFile', '0.43'; requires 'Path::Iterator::Rule', '>=1.011'; requires 'PAUSE::Permissions', '0.17'; requires 'PerlIO::gzip'; -requires 'Pithub', '0.01036'; requires 'Plack', '1.0048'; requires 'Plack::App::Directory'; requires 'Plack::Middleware::Header'; diff --git a/cpanfile.snapshot b/cpanfile.snapshot index ad14f15cc..6a7bdec30 100644 --- a/cpanfile.snapshot +++ b/cpanfile.snapshot @@ -241,47 +241,6 @@ DISTRIBUTIONS Storable 0 Test::Deep 0 Test::More 0 - CHI-0.61 - pathname: A/AS/ASB/CHI-0.61.tar.gz - provides: - CHI 0.61 - CHI::CacheObject 0.61 - CHI::Driver 0.61 - CHI::Driver::Base::CacheContainer 0.61 - CHI::Driver::CacheCache 0.61 - CHI::Driver::FastMmap 0.61 - CHI::Driver::File 0.61 - CHI::Driver::Memory 0.61 - CHI::Driver::Metacache 0.61 - CHI::Driver::Null 0.61 - CHI::Driver::RawMemory 0.61 - CHI::Driver::Role::HasSubcaches 0.61 - CHI::Driver::Role::IsSizeAware 0.61 - CHI::Driver::Role::IsSubcache 0.61 - CHI::Stats 0.61 - requirements: - Carp::Assert 0.20 - Class::Load 0 - Data::UUID 0 - Digest::JHash 0 - Digest::MD5 0 - ExtUtils::MakeMaker 0 - File::Spec 0.80 - Hash::MoreUtils 0 - JSON::MaybeXS 1.003003 - List::MoreUtils 0.13 - Log::Any 0.08 - Moo 1.003 - MooX::Types::MooseLike 0.23 - MooX::Types::MooseLike::Base 0 - MooX::Types::MooseLike::Numeric 0 - Storable 0 - String::RewritePrefix 0 - Task::Weaken 0 - Time::Duration 1.06 - Time::Duration::Parse 0.03 - Time::HiRes 1.30 - Try::Tiny 0.05 CLASS-v1.1.8 pathname: J/JD/JDEGUEST/CLASS-v1.1.8.tar.gz provides: @@ -384,6 +343,15 @@ DISTRIBUTIONS perl 5.006 strict 0 warnings 0 + Cache-LRU-0.04 + pathname: K/KA/KAZUHO/Cache-LRU-0.04.tar.gz + provides: + Cache::LRU 0.04 + requirements: + ExtUtils::MakeMaker 6.42 + Test::More 0.88 + Test::Requires 0 + perl 5.008001 Canary-Stability-2013 pathname: M/ML/MLEHMANN/Canary-Stability-2013.tar.gz provides: @@ -414,18 +382,6 @@ DISTRIBUTIONS perl 5.006 strict 0 warnings 0 - Carp-Assert-0.22 - pathname: Y/YV/YVES/Carp-Assert-0.22.tar.gz - provides: - Carp::Assert 0.22 - requirements: - Carp 0 - Exporter 0 - ExtUtils::MakeMaker 0 - perl 5.006 - strict 0 - vars 0 - warnings 0 Carp-Assert-More-2.4.0 pathname: P/PE/PETDANCE/Carp-Assert-More-2.4.0.tar.gz provides: @@ -1518,13 +1474,6 @@ DISTRIBUTIONS perl 5.012 strict 0 warnings 0 - Data-UUID-1.227 - pathname: G/GT/GTERMARS/Data-UUID-1.227.tar.gz - provides: - Data::UUID 1.227 - requirements: - Digest::MD5 0 - ExtUtils::MakeMaker 0 Data-Visitor-0.32 pathname: E/ET/ETHER/Data-Visitor-0.32.tar.gz provides: @@ -2169,18 +2118,6 @@ DISTRIBUTIONS Digest::SHA 1 ExtUtils::MakeMaker 0 perl 5.004 - Digest-JHash-0.10 - pathname: S/SH/SHLOMIF/Digest-JHash-0.10.tar.gz - provides: - Digest::JHash 0.10 - requirements: - DynaLoader 0 - Exporter 0 - ExtUtils::MakeMaker 0 - perl 5.008 - strict 0 - vars 0 - warnings 0 Digest-SHA1-2.13 pathname: G/GA/GAAS/Digest-SHA1-2.13.tar.gz provides: @@ -3128,13 +3065,6 @@ DISTRIBUTIONS ExtUtils::MakeMaker 6.31 Storable 0 Test::Most 0 - Hash-MoreUtils-0.06 - pathname: R/RE/REHSACK/Hash-MoreUtils-0.06.tar.gz - provides: - Hash::MoreUtils 0.06 - requirements: - ExtUtils::MakeMaker 0 - perl 5.008001 Hash-MultiValue-0.16 pathname: A/AR/ARISTOTLE/Hash-MultiValue-0.16.tar.gz provides: @@ -4410,16 +4340,6 @@ DISTRIBUTIONS requirements: ExtUtils::MakeMaker 0 Module::Runtime 0.014 - MooX-Types-MooseLike-Numeric-1.03 - pathname: M/MA/MATEU/MooX-Types-MooseLike-Numeric-1.03.tar.gz - provides: - MooX::Types::MooseLike::Numeric 1.03 - requirements: - ExtUtils::MakeMaker 0 - Moo 1.004002 - MooX::Types::MooseLike 0.23 - Test::Fatal 0.003 - Test::More 0.96 Moose-2.2207 pathname: E/ET/ETHER/Moose-2.2207.tar.gz provides: @@ -5386,6 +5306,38 @@ DISTRIBUTIONS URI 0 URI::Escape 0 YAML 0 + Net-GitHub-1.05 + pathname: F/FA/FAYLAND/Net-GitHub-1.05.tar.gz + provides: + Net::GitHub 1.05 + Net::GitHub::V3 1.05 + Net::GitHub::V3::Actions 1.05 + Net::GitHub::V3::Events 1.05 + Net::GitHub::V3::Gists 1.05 + Net::GitHub::V3::GitData 1.05 + Net::GitHub::V3::Gitignore 1.05 + Net::GitHub::V3::Issues 1.05 + Net::GitHub::V3::OAuth 1.05 + Net::GitHub::V3::Orgs 0.60 + Net::GitHub::V3::PullRequests 1.05 + Net::GitHub::V3::Query 1.05 + Net::GitHub::V3::Repos 1.05 + Net::GitHub::V3::ResultSet 1.05 + Net::GitHub::V3::Search 0.68 + Net::GitHub::V3::Users 1.05 + Net::GitHub::V4 1.05 + requirements: + Cache::LRU 0 + ExtUtils::MakeMaker 0 + HTTP::Request 0 + JSON::MaybeXS 0 + LWP::Protocol::https 0 + LWP::UserAgent 0 + MIME::Base64 0 + Moo 0 + Types::Standard 0 + URI 0 + URI::Escape 0 Net-HTTP-6.23 pathname: O/OA/OALDERS/Net-HTTP-6.23.tar.gz provides: @@ -6338,73 +6290,6 @@ DISTRIBUTIONS perl 5.008 strict 0 warnings 0 - Pithub-0.01041 - pathname: O/OA/OALDERS/Pithub-0.01041.tar.gz - provides: - Pithub 0.01041 - Pithub::Base 0.01041 - Pithub::Events 0.01041 - Pithub::Gists 0.01041 - Pithub::Gists::Comments 0.01041 - Pithub::GitData 0.01041 - Pithub::GitData::Blobs 0.01041 - Pithub::GitData::Commits 0.01041 - Pithub::GitData::References 0.01041 - Pithub::GitData::Tags 0.01041 - Pithub::GitData::Trees 0.01041 - Pithub::Issues 0.01041 - Pithub::Issues::Assignees 0.01041 - Pithub::Issues::Comments 0.01041 - Pithub::Issues::Events 0.01041 - Pithub::Issues::Labels 0.01041 - Pithub::Issues::Milestones 0.01041 - Pithub::Markdown 0.01041 - Pithub::Orgs 0.01041 - Pithub::Orgs::Members 0.01041 - Pithub::Orgs::Teams 0.01041 - Pithub::PullRequests 0.01041 - Pithub::PullRequests::Comments 0.01041 - Pithub::PullRequests::Reviewers 0.01041 - Pithub::Repos 0.01041 - Pithub::Repos::Actions 0.01041 - Pithub::Repos::Actions::Workflows 0.01041 - Pithub::Repos::Collaborators 0.01041 - Pithub::Repos::Commits 0.01041 - Pithub::Repos::Contents 0.01041 - Pithub::Repos::Downloads 0.01041 - Pithub::Repos::Forks 0.01041 - Pithub::Repos::Hooks 0.01041 - Pithub::Repos::Keys 0.01041 - Pithub::Repos::Releases 0.01041 - Pithub::Repos::Releases::Assets 0.01041 - Pithub::Repos::Starring 0.01041 - Pithub::Repos::Stats 0.01041 - Pithub::Repos::Statuses 0.01041 - Pithub::Repos::Watching 0.01041 - Pithub::Result 0.01041 - Pithub::Result::SharedCache 0.01041 - Pithub::ResultSet 0.01041 - Pithub::Search 0.01041 - Pithub::SearchV3 0.01041 - Pithub::Users 0.01041 - Pithub::Users::Emails 0.01041 - Pithub::Users::Followers 0.01041 - Pithub::Users::Keys 0.01041 - requirements: - CHI 0 - Carp 0 - ExtUtils::MakeMaker 0 - HTTP::Headers 0 - HTTP::Request 0 - HTTP::Request::Common 0 - JSON::MaybeXS 0 - LWP::UserAgent 0 - Moo 0 - Moo::Role 0 - URI 0 - perl 5.010 - strict 0 - warnings 0 Plack-1.0051 pathname: M/MI/MIYAGAWA/Plack-1.0051.tar.gz provides: @@ -7440,6 +7325,15 @@ DISTRIBUTIONS Test::More 0 strict 0 warnings 0 + Test-Requires-0.11 + pathname: T/TO/TOKUHIROM/Test-Requires-0.11.tar.gz + provides: + Test::Requires 0.11 + requirements: + ExtUtils::MakeMaker 6.64 + Test::Builder::Module 0 + Test::More 0.47 + perl 5.006 Test-RequiresInternet-0.05 pathname: M/MA/MALLEN/Test-RequiresInternet-0.05.tar.gz provides: diff --git a/lib/MetaCPAN/Script/Tickets.pm b/lib/MetaCPAN/Script/Tickets.pm index a578235e6..634aece2c 100644 --- a/lib/MetaCPAN/Script/Tickets.pm +++ b/lib/MetaCPAN/Script/Tickets.pm @@ -10,7 +10,7 @@ use HTTP::Request::Common qw( GET ); use Log::Contextual qw( :log :dlog ); use MetaCPAN::Types::TypeTiny (); use Text::CSV_XS (); -use Pithub (); +use Net::GitHub::V4 (); use Ref::Util qw( is_hashref is_ref ); use URI::Escape qw( uri_escape ); @@ -34,11 +34,10 @@ has github_token => ( builder => '_build_github_token', ); -has pithub => ( +has github_graphql => ( is => 'ro', - isa => 'Pithub', lazy => 1, - builder => '_build_pithub', + builder => '_build_github_graphql', ); has _bulk => ( @@ -57,17 +56,15 @@ sub _build_bulk { sub _build_github_token { my $self = shift; - exists $self->config->{github_token} - ? $self->config->{github_token} - : undef; + $self->config->{github_token}; } -sub _build_pithub { +sub _build_github_graphql { my $self = shift; - return Pithub->new( - per_page => 100, - auto_pagination => 1, - ( $self->github_token ? ( token => $self->github_token ) : () ) + return Net::GitHub::V4->new( + ( + $self->github_token ? ( access_token => $self->github_token ) : () + ) ); } @@ -121,29 +118,49 @@ sub index_github_bugs { my %summary; + my $json = JSON::MaybeXS->new( allow_nonref => 1 ); + while ( my $release = $scroll->next ) { my $resources = $release->resources; my ( $user, $repo, $source ) = $self->github_user_repo_from_resources($resources); next unless $user; log_debug {"Retrieving issues from $user/$repo"}; - my $open = $self->pithub->issues->list( - user => $user, - repo => $repo, - params => { state => 'open' } - ); - next unless ( $open->success ); - my $closed = $self->pithub->issues->list( - user => $user, - repo => $repo, - params => { state => 'closed' } - ); - next unless ( $closed->success ); - - my $rec = { open => 0, closed => 0, source => $source }; - $rec->{open}++ while ( $open->next ); - $rec->{closed}++ while ( $closed->next ); - $rec->{active} = $rec->{open}; + + my $data = $gh->query( + sprintf <<'END_QUERY', map $json->encode($_), $user, $repo ); + query { + repository(owner: %s, name: %s) { + openIssues: issues(states: OPEN) { + totalCount + } + closedIssues: issues(states: CLOSED) { + totalCount + } + openPullRequests: pullRequests(states: OPEN) { + totalCount + } + closedPullRequests: pullRequests(states: [CLOSED, MERGED]) { + totalCount + } + } + } +END_QUERY + + my $open + = $data->{data}{repository}{openIssues}{totalCount} + + $data->{data}{repository}{openPullRequests}{totalCount}; + my $closed + = $data->{data}{repository}{closedIssues}{totalCount} + + $data->{data}{repository}{closedPullRequests}{totalCount}; + + my $rec = { + active => $open, + open => $open, + closed => $closed, + source => $source, + }; + $summary{ $release->{'distribution'} }{'bugs'}{'github'} = $rec; }