class LicenseAuto::NpmRegistry
Attributes
registry[R]
Public Class Methods
new(package, registry='http://registry.npmjs.org/')
click to toggle source
Calls superclass method
Website::new
# File lib/license_auto/website/npm_registry.rb, line 11 def initialize(package, registry='http://registry.npmjs.org/') super(package) @registry = registry @pack_meta = nil end
Public Instance Methods
chose_latest_available_version(sem_version_range)
click to toggle source
# File lib/license_auto/website/npm_registry.rb, line 68 def chose_latest_available_version(sem_version_range) available_versions = get_available_versions(sem_version_range) chosen = available_versions.keys.last LicenseAuto.logger.debug("chosen version: #{chosen} for #{@package.name}") chosen end
get_available_versions(sem_version_range)
click to toggle source
DOC: www.npmjs.com/package/semver DOC: github.com/npm/node-semver sem_version_range: '~1.2.3'
# File lib/license_auto/website/npm_registry.rb, line 49 def get_available_versions(sem_version_range) # LicenseAuto.logger.debug("sem_version_range: #{sem_version_range}") package_meta = get_package_meta all_versions = package_meta.versions all_versions.select {|version, meta| # Example: node -e "var semver = require('semver'); var result = semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3'); console.log(result);" cmd = "node -e \"var semver = require('semver'); var available = semver.satisfies('#{version}', '#{sem_version_range}'); console.log(available);\"" stdout_str, _stderr_str, _status = Open3.capture3(cmd) if stdout_str == "true\n" # LicenseAuto.logger.debug("available version: #{version}") true else # LicenseAuto.logger.debug("version: #{version}, semver: #{sem_version_range}, #{stdout_str}, #{stderr_str}") false end } end
get_license_info()
click to toggle source
# File lib/license_auto/website/npm_registry.rb, line 75 def get_license_info() if @package.version.nil? begin @package.version = chose_latest_available_version('*') rescue Exception => e LicenseAuto.logger.error(e) return nil end end npm_info = get_package_meta # LicenseAuto.logger.debug(npm_info) raise LicenseAuto::PackageNotFound if npm_info.nil? license_info = LicenseAuto::LicenseInfoWrapper.new source_url = if npm_info.repository npm_info.repository.url || npm_info.homepage_uri end if source_url source_code_matcher = LicenseAuto::Matcher::SourceURL.new(source_url) 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 npm_info.homepage_uri # 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("call myself recursively") # else # license_wrapper = homepage_spider.get_license_page # LicenseAuto.logger.warn("omepageSpider") # end elsif not npm_info.licenses.empty? # TODO: LicenseAuto.logger.error(npm_info.licenses) license_files = npm_info.licenses.map {|license| LicenseAuto::LicenseWrapper.new( name: license.type, sim_ratio: 1.0, html_url: nil, download_url: license.url, text: nil ) } license_info[:licenses] = license_files # LicenseAuto.logger.debug(license_info) elsif not npm_info.license.empty? # TODO: [SPDX license expression syntax version 2.0 string](https://www.npmjs.com/package/spdx) # Example: # { "license": "ISC" } # { "license": "(MIT OR Apache-2.0)" } # No license: # { "license": "UNLICENSED"} # DOC: https://docs.npmjs.com/files/package.json#license # Eg. ["LGPL-2.1", "MIT"] licenses = npm_info.license.gsub(/^\(/, '').gsub(/\)$/, '').gsub(/\b(AND|OR)\b/, ' ').split(' ') license_files = licenses.map {|license_name| LicenseAuto::LicenseWrapper.new( name: license_name, sim_ratio: 1.0, html_url: npm_info.homepage, download_url: npm_info.homepage, text: nil ) } license_info[:licenses] = license_files LicenseAuto.logger.debug(license_info) end source_url = uniform_repository_url(npm_info.repository.url) pack_wrapper = LicenseAuto::PackWrapper.new( project_url: npm_info.project_uri, homepage: npm_info.homepage, source_url: source_url ) license_info[:pack] = pack_wrapper return license_info else raise LicenseAuto::SourceURLNotFound end end
get_package_info_by_version()
click to toggle source
RESTful API: registry.npmjs.org/grunt/?version=0.1.0
# File lib/license_auto/website/npm_registry.rb, line 33 def get_package_info_by_version api_url = "#{@registry}#{@package.name}/?version=#{@package.version}" LicenseAuto.logger.debug(api_url) response = HTTParty.get(api_url) case response.code when 200 JSON.parse(response.licenses) else LicenseAuto.logger.error(response) nil end end
get_package_meta()
click to toggle source
RESTful API: registry.npmjs.org/:pack_name TEST: registry.npmjs.org/grunt
# File lib/license_auto/website/npm_registry.rb, line 19 def get_package_meta api_url = "#{@registry}#{@package.name}" LicenseAuto.logger.debug(api_url) response = HTTParty.get(api_url) if response.code == 200 Hashie::Mash.new(JSON.parse(response.body)) else LicenseAuto.logger.error("Npm registry API response: #{response}") nil end end
uniform_repository_url(repo_url)
click to toggle source
# File lib/license_auto/website/npm_registry.rb, line 166 def uniform_repository_url(repo_url) git = /^git:\/\// git_http = /^git\+http/ if repo_url =~ git repo_url.gsub(git, 'http://') elsif repo_url =~ git_http repo_url.gsub(git_http, 'http') else repo_url end end