mineworks/license_auto

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

Summary

Maintainability
B
4 hrs
Test Coverage
require 'open3'
require 'bundler'
require 'license_auto/package_manager'
require 'license_auto/website/npm_registry'

module LicenseAuto
  class Npm < LicenseAuto::PackageManager

    LANGUAGE = 'NodeJS'

    def initialize(path)
      super(path)
    end

    def dependency_file_pattern
      /#{@path}\/(src\/|source\/)?package\.json$/
    end

    def parse_dependencies

      package_json_files = dependency_file_path_names
      if package_json_files.empty?
        LicenseAuto.logger.info("#{LANGUAGE}: #{dependency_file_pattern} file not exist")
        return []
      else
        package_json_files.map {|dep_file|
          LicenseAuto.logger.debug(dep_file)
          npm_definition = Hashie::Mash.new(JSON.parse(File.read(dep_file)))

          {
            dep_file: dep_file,
            deps: [npm_definition.dependencies, npm_definition.devDependencies].compact.map {|hash|
                hash.map {|pack_name, semver|
                  available_version, remote =
                      if semver =~ /^file:/
                        # DOC: https://docs.npmjs.com/files/package.json#local-paths
                        ['local-path', semver]
                      elsif LicenseAuto::Npm.is_valid_semver?(semver)
                        pack = Hashie::Mash.new(
                            "language": "NodeJS",
                            "name": pack_name,
                            "group": "",
                            "version": semver,
                            "server": "registry.npmjs.org"
                        )
                        npm_registry = LicenseAuto::NpmRegistry.new(pack)
                        version = npm_registry.chose_latest_available_version(semver)
                        [version, npm_registry.registry]
                      else
                        # DOC: https://docs.npmjs.com/files/package.json#git-urls-as-dependencies
                        git_url = semver.gsub(/^git\+/, '')
                        matcher = LicenseAuto::Matcher::SourceURL.new(git_url)
                        github_matched = matcher.match_github_resource
                        if github_matched
                          # TODO: ref=github_matched[:ref]
                          github = GithubCom.new({}, github_matched[:owner], github_matched[:repo])
                          version = github.list_tags.first.name
                          LicenseAuto.logger.debug(version)
                          [version, git_url]
                        end
                      end
                  {
                      name: pack_name,
                      version: available_version,
                      remote: remote
                  }
                }
            }.flatten
          }
        }
      end
      # LicenseAuto.logger.debug(JSON.pretty_generate(dep_files))
    end

    # semver: {String}
    def self.is_valid_semver?(semver)
      node_cmd = "node -e \"var semver = require('semver'); var valid = semver.validRange('#{semver}'); console.log(valid)\""
      # LicenseAuto.logger.debug(node_cmd)
      stdout_str, _stderr_str, _status = Open3.capture3(node_cmd)
      is_invalid = stdout_str.gsub(/\n/, '') == 'null'
      # if is_invalid
      #   LicenseAuto.logger.error("semver: #{semver} is not a valid sem-version")
      # else
      #   LicenseAuto.logger.debug("semver: #{semver} is valid")
      # end
      not is_invalid
    end

    # TODO: move
    def self.check_cli
      bash_cmd = "node -v"
      LicenseAuto.logger.debug(bash_cmd)
      stdout_str, stderr_str, status = Open3.capture3(bash_cmd)
      node_version = /v[456]\.\d+\.\d+/
      if not stderr_str.empty?
        LicenseAuto.logger.error(stderr_str)
        return false
      elsif not stdout_str =~ node_version
        error = "NodeJS version: #{stdout_str} not satisfied: #{node_version}"
        LicenseAuto.logger.error(error)
        return false
      end

      bash_cmd = "node -e \"const semver = require('semver');\" -r semver"
      LicenseAuto.logger.debug(bash_cmd)
      stdout_str, stderr_str, status = Open3.capture3(bash_cmd)
      unless stderr_str.empty?
        LicenseAuto.logger.error(stderr_str)
        LicenseAuto.logger.info(
            "\nInstall npm packages first using:\n
              $ npm install\n")
        return false
      end

      return true
    end
  end
end