class Supermarket::API
def self.exist?(profile, supermarket_url = SUPERMARKET_URL)
def self.exist?(profile, supermarket_url = SUPERMARKET_URL) !find(profile, supermarket_url).nil? end
def self.find(profile, supermarket_url)
def self.find(profile, supermarket_url) profiles = Supermarket::API.profiles(supermarket_url=SUPERMARKET_URL) if !profiles.empty? index = profiles.index { |t| same?(profile, t, supermarket_url) } # return profile or nil profiles[index] if !index.nil? && index >= 0 end end
def self.get(url, params)
def self.get(url, params) uri = URI.parse(url) uri.query = URI.encode_www_form(params) req = Net::HTTP::Get.new(uri) send_request(uri, req) end
def self.info(profile, supermarket_url = SUPERMARKET_URL)
def self.info(profile, supermarket_url = SUPERMARKET_URL) _tool_owner, tool_name = profile_name("supermarket://#{profile}") return if tool_name.nil? || tool_name.empty? url = "#{supermarket_url}/api/v1/tools/#{tool_name}" _success, data = get(url, {}) JSON.parse(data) if !data.nil? rescue JSON::ParserError nil end
def self.profile_name(profile)
def self.profile_name(profile) uri = URI(profile) [uri.host, uri.path[1..-1]] rescue URI::Error => _e nil end
def self.profiles(supermarket_url = SUPERMARKET_URL)
def self.profiles(supermarket_url = SUPERMARKET_URL) url = "#{supermarket_url}/api/v1/tools-search" _success, data = get(url, { type: 'compliance_profile', items: 100, order: 'recently_added' }) if !data.nil? profiles = JSON.parse(data) profiles['items'].map { |x| m = %r{^#{supermarket_url}/api/v1/tools/(?<slug>[\w-]+)(/)?$}.match(x['tool']) x['slug'] = m[:slug] x } else [] end end
def self.same?(profile, supermarket_tool, supermarket_url = SUPERMARKET_URL)
def self.same?(profile, supermarket_tool, supermarket_url = SUPERMARKET_URL) tool_owner, tool_name = profile_name(profile) tool = "#{supermarket_url}/api/v1/tools/#{tool_name}" supermarket_tool['tool_owner'] == tool_owner && supermarket_tool['tool'] == tool end
def self.send_request(uri, req)
def self.send_request(uri, req) # send request res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') {|http| http.request(req) } [res.is_a?(Net::HTTPSuccess), res.body] end