mineworks/license_auto

View on GitHub
lib/license_auto/package_manager/bundler.rb

Summary

Maintainability
A
3 hrs
Test Coverage
require 'bundler'
require 'license_auto/package_manager'
require 'license_auto/website/ruby_gems_org'
# require 'license_auto/package_manager/gemfury'

module LicenseAuto
  class Bundler < LicenseAuto::PackageManager

    LANGUAGE = 'Ruby'

    def initialize(path)
      super(path)
    end

    def dependency_file_pattern
      /#{@path}\/[0-9a-zA-Z_.]*gem.*\.lock$/i
    end

    def gemfile_pattern
      /#{@path}\/[0-9a-zA-Z_.]*gemfile$/i
    end

    def parse_dependencies
      # gemfiles = dependency_file_path_names(pattern=gemfile_pattern)
      # definition = ::Bundler::Definition.build(gemfiles.first, nil, nil)

      # definition.dependencies.each {|dep|
      #   LicenseAuto.logger.debug(dep.name + ' ' + dep.source.remotes.to_s)
      # }

      lock_files = dependency_file_path_names
      if lock_files.empty?
        LicenseAuto.logger.info("#{LANGUAGE}: #{dependency_file_pattern} file not exist")
        gem_files = dependency_file_path_names(pattern=gemfile_pattern)
        # TODO: parse gem_files
        unless gem_files.empty?
          LicenseAuto.logger.warn("#{LANGUAGE}: Gemfile exisit: #{gem_files}")
        end
        return []
      else
        lock_files.map {|dep_file|
          LicenseAuto.logger.debug(dep_file)
          lockfile_parser = ::Bundler::LockfileParser.new(::Bundler.read_file(dep_file))
          {
              dep_file: dep_file,
              deps: lockfile_parser.specs.map {|spec|
                      remote =
                          case
                            when spec.source.class == ::Bundler::Source::Git
                              spec.source.uri
                            when spec.source.class == ::Bundler::Source::Rubygems
                              if spec.source.remotes.size == 1
                                spec.source.remotes.first.to_s
                              elsif spec.source.remotes.size >= 1
                                # remotes =
                                #     if Gems.info(spec.name) == RubyGemsOrg::GEM_NOT_FOUND
                                #       spec.source.remotes.reject {|uri|
                                #         uri.to_s == RubyGemsOrg::URI
                                #       }
                                #     else
                                #       spec.source.remotes
                                #     end
                                # TODO: support http://www.gemfury.com, aka multi `source` DSL; requre 'rubygems'?
                                spec.source.remotes.map {|r|
                                  r.to_s
                                }.join(',')
                              end
                            when spec.source.class == ::Bundler::Source::Path::Installer
                              # Untested
                              spec.full_gem_path
                            else
                              raise('Yo, this error should ever not occur!')
                          end
                      {
                          name: spec.name,
                          version: spec.version.to_s,
                          remote: remote
                      }
                }
          }
        }
      end
      # LicenseAuto.logger.debug(JSON.pretty_generate(dep_files))
    end

    def self.check_cli
      # TODO check bundle
      true
    end
  end
end