mineworks/license_auto

View on GitHub
lib/license_auto/website/ruby_gems_org.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'gems'
require 'hashie'

require 'license_auto/website/github_com'
require 'license_auto/exceptions'


class RubyGemsOrg < Website

  URI = 'https://rubygems.org/'
  HOST = 'rubygems.org'
  LANGUAGE = 'Ruby'

  GEM_NOT_FOUND = "This rubygem could not be found."

  def initialize(package)
    super(package)
  end

  # (Defaults to the latest version if no version is specified.)

  def get_license_info()
    if @package.version.nil?
      begin
        @package.version = get_latest_version['number']
      rescue Exception => e
        LicenseAuto.logger.error(e)
        return nil
      end
    end

    gem_info = get_gem_info

    raise LicenseAuto::PackageNotFound if gem_info.nil?

    license_info = LicenseAuto::LicenseInfoWrapper.new

    source_code_matcher = LicenseAuto::Matcher::SourceURL.new(gem_info.source_code_uri || gem_info.homepage_uri)
    github_matched = source_code_matcher.match_github_resource
    bitbucket_matched = source_code_matcher.match_bitbucket_resource

    if github_matched
      license_info = GithubCom.new(@package, github_matched[:owner], github_matched[:repo]).get_license_info
    elsif bitbucket_matched
      # TODO bitbucket_matched
    elsif gem_info.homepage_uri
      # TODO: HomepageSpider
      # LicenseAuto.logger.warn("TODO: HomepageSpider")
      # homepage_spider = HomepageSpider.new(gem_info.homepage_uri, @package.name)
      # source_code_uri = homepage_spider.get_source_code_uri
      # if source_code_uri
      #   LicenseAuto.logger.warn("TODO: call myself recursively")
      # else
      #   license_wrapper = homepage_spider.get_license_page
      #   LicenseAuto.logger.warn("TODO: HomepageSpider")
      # end

    elsif not gem_info.licenses.empty?
      license_files = gem_info.licenses.map {|license_name|
        LicenseAuto::LicenseWrapper.new(
            name: license_name,
            sim_ratio: 1.0,
            html_url: gem_info.project_uri,
            download_url: gem_info.project_uri,
            text: nil
        )
      }

      license_info[:licenses] = license_files
      LicenseAuto.logger.debug(license_info)
    end

    # TODO:
    pack_wrapper = LicenseAuto::PackWrapper.new(
        project_url: gem_info.project_uri,
        homepage: gem_info.homepage_uri,
        source_url: gem_info.source_code_uri || source_code_matcher.url
    )

    license_info[:pack] = pack_wrapper
    license_info
  end

  # @return eg. Hashie::Mash (19 elements)
  #     {
  #         "name":"diff-lcs",
  #         "downloads":42036753,
  #         "version":"1.2.5",
  #         "version_downloads":25578122,
  #         "platform":"ruby",
  #         "authors":"Austin Ziegler",
  #         "info":"Diff::LCS computes the difference between two Enumerable sequences using the\nMcIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities\nto create a simple HTML diff output format and a standard diff-like tool.\n\nThis is release 1.2.4, fixing a bug introduced after diff-lcs 1.1.3 that did\nnot properly prune common sequences at the beginning of a comparison set.\nThanks to Paul Kunysch for fixing this issue.\n\nCoincident with the release of diff-lcs 1.2.3, we reported an issue with\nRubinius in 1.9 mode\n({rubinius/rubinius#2268}[https://github.com/rubinius/rubinius/issues/2268]).\nWe are happy to report that this issue has been resolved.",
  #         "licenses":[
  #             "MIT",
  #             "Perl Artistic v2",
  #             "GNU GPL v2"
  #         ],
  #         "metadata":{
  #
  #         },
  #         "sha":"a1d3dde665292317a883d319066792e3f0e6a24cade4bc4cc47605d27664c9ed",
  #         "project_uri":"https://rubygems.org/gems/diff-lcs",
  #         "gem_uri":"https://rubygems.org/gems/diff-lcs-1.2.5.gem",
  #         "homepage_uri":"http://diff-lcs.rubyforge.org/",
  #         "wiki_uri":null,
  #         "documentation_uri":"http://www.rubydoc.info/gems/diff-lcs/1.2.5",
  #         "mailing_list_uri":null,
  #         "source_code_uri":null,
  #         "bug_tracker_uri":null,
  #         "dependencies":{
  #             "development":[
  #                 {
  #                     "name":"hoe",
  #                     "requirements":"~> 3.7"
  #                 },
  #                 {
  #                     "name":"hoe-bundler",
  #                     "requirements":"~> 1.2"
  #                 },
  #                 {
  #                     "name":"hoe-doofus",
  #                     "requirements":"~> 1.0"
  #                 },
  #                 {
  #                     "name":"hoe-gemspec2",
  #                     "requirements":"~> 1.1"
  #                 },
  #                 {
  #                     "name":"hoe-git",
  #                     "requirements":"~> 1.5"
  #                 },
  #                 {
  #                     "name":"hoe-rubygems",
  #                     "requirements":"~> 1.0"
  #                 },
  #                 {
  #                     "name":"hoe-travis",
  #                     "requirements":"~> 1.2"
  #                 },
  #                 {
  #                     "name":"rake",
  #                     "requirements":"~> 10.0"
  #                 },
  #                 {
  #                     "name":"rdoc",
  #                     "requirements":"~> 4.0"
  #                 },
  #                 {
  #                     "name":"rspec",
  #                     "requirements":"~> 2.0"
  #                 },
  #                 {
  #                     "name":"rubyforge",
  #                     "requirements":">= 2.0.4"
  #                 }
  #             ],
  #             "runtime":[
  #
  #             ]
  #         }
  #     }
  def get_gem_info()
    # TODO: Gems.info(@package.name, @package.version)
    gem_info = Gems.info(@package.name)
    gem_info =
        if gem_info == GEM_NOT_FOUND
          nil
        else
          Hashie::Mash.new(gem_info)
        end
  end

  # TODO: switch to https://github.com/rubygems/gems/issues/32#issuecomment-195180422
  # @return {
  #     "authors" => "David Heinemeier Hansson",
  #     "built_at" => "2016-03-07T00:00:00.000Z",
  #     "created_at" => "2016-03-07T22:33:22.563Z",
  #     "description" => "Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration.",
  #     "downloads_count" => 28113,
  #     "metadata" => {},
  #     "number" => "4.2.6",
  #     "summary" => "Full-stack web application framework.",
  #     "platform" => "ruby",
  #     "ruby_version" => ">= 1.9.3",
  #     "prerelease" => false,
  #     "licenses" => [
  #         [0] "MIT"
  #     ],
  #     "requirements" => [],
  #     "sha" => "a199258c0d2bae09993a6932c49df254fd66428899d1823b8c5285de02e5bc33"
  # }
  def get_latest_version()
    latest_version = Gems.latest_version(@package.name)
    # todo:
    if latest_version == GEM_NOT_FOUND
      raise(GEM_NOT_FOUND)
    end
  end

  def download_gem()
  end
end