rspec_stats/merge_request.rb (59 lines of code) (raw):

# frozen_string_literal: true # fetches list of merged MRs which have rspec profiling label require 'json' require 'net/http' require 'time' class MergeRequest URL = URI('https://gitlab.com/api/graphql') HEADER = { 'Content-Type' => 'application/json' }.freeze MAX_PAGE = 50 QUERY_TPL = <<QUERY { project(fullPath: "gitlab-org/gitlab") { mergeRequests(labels: "rspec profiling", state: merged, sort: MERGED_AT_DESC, after: "%s") { pageInfo { hasNextPage endCursor } nodes { iid mergedAt webUrl title author { username } } } } } QUERY def self.fetch(since: nil) mrs = fetch_merge_requests.map do |hash| new(hash) end if since since_time = Time.parse(since) mrs.reject! { |mr| Time.parse(mr.day) < since_time } end mrs end def self.fetch_merge_requests cursor = '' MAX_PAGE.times.each_with_object([]) do |_, mrs| puts "fetching rspec profiling MRs, cursor: #{cursor}" template = QUERY_TPL % cursor request_data = { query: template }.to_json response = Net::HTTP.post(URL, request_data, HEADER) json = JSON.parse(response.body) # response = File.read('/tmp/mrs.json') # json = JSON.parse(response) mrs.concat(json.dig('data', 'project', 'mergeRequests', 'nodes')) page_info = json.dig('data', 'project', 'mergeRequests', 'pageInfo') break mrs unless page_info['hasNextPage'] cursor = page_info['endCursor'] end end def initialize(params) @params = params end def day @day ||= @params['mergedAt'].sub(/T.*/, '') end end