Sha256: 6c2a4ff6ca435c8d29fec091cd84a7eb4e929db6ab60dc17619df6b954866031

Contents?: true

Size: 1.18 KB

Versions: 2

Compression:

Stored size: 1.18 KB

Contents

require "json"
require "httpclient"
require "net/http"

class CompareLinker
  class GithubLinkFinder
    attr_reader :octokit, :repo_owner, :repo_name, :homepage_uri

    def initialize(octokit)
      @octokit = octokit
    end

    def find(gem_name)
      gem_info = JSON.parse(
        HTTPClient.get("https://rubygems.org/api/v1/gems/#{gem_name}.json").body
      )

      github_url = [
        gem_info["homepage_uri"],
        gem_info["source_code_uri"]
      ].find { |uri| uri.to_s.match(/github\.com\//) }

      if github_url.nil?
        @homepage_uri = gem_info["homepage_uri"]
      else
        github_url = redirect_url(github_url)
        _, @repo_owner, @repo_name = github_url.match(%r!github\.com/([^/]+)/([^/]+)!).to_a
      end
    end

    def repo_full_name
      "#{@repo_owner}/#{repo_name}"
    end

    private

    def redirect_url(url, limit = 5)
      raise ArgumentError, 'HTTP redirect too deep' if limit <= 0
      response = Net::HTTP.get_response(URI.parse(url))
      case response
      when Net::HTTPSuccess
        url
      when Net::HTTPRedirection
        redirect_url(response['location'], limit - 1)
      else
        raise ItemNotFound
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
compare_linker-1.1.3 lib/compare_linker/github_link_finder.rb
compare_linker-1.1.2 lib/compare_linker/github_link_finder.rb