From e14390ff032312e2eb34b9919ddc12923686e953 Mon Sep 17 00:00:00 2001 From: Guillaume Winter Date: Fri, 11 Sep 2020 16:09:10 +0200 Subject: [PATCH 1/4] add methods --- .gitignore | 1 + lib/packagecloud.rb | 8 +- lib/packagecloud/client.rb | 206 ++++++++++++++++++++---------------- lib/packagecloud/version.rb | 2 +- packagecloud-ruby.gemspec | 49 +++++---- 5 files changed, 147 insertions(+), 119 deletions(-) diff --git a/.gitignore b/.gitignore index 39cbf8e..2e0a69e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ Gemfile.lock doc/ pkg/ vendor/cache/*.gem +coverage/ diff --git a/lib/packagecloud.rb b/lib/packagecloud.rb index af2288c..ff37e66 100644 --- a/lib/packagecloud.rb +++ b/lib/packagecloud.rb @@ -1,4 +1,4 @@ -require 'packagecloud/version' -require 'packagecloud/client' -require 'packagecloud/package' -require 'packagecloud/credentials' \ No newline at end of file +require "packagecloud/version" +require "packagecloud/client" +require "packagecloud/package" +require "packagecloud/credentials" diff --git a/lib/packagecloud/client.rb b/lib/packagecloud/client.rb index 5143871..8f93980 100644 --- a/lib/packagecloud/client.rb +++ b/lib/packagecloud/client.rb @@ -1,9 +1,9 @@ -require 'multi_json' -require 'mime' -require 'excon' -require 'packagecloud/result' -require 'packagecloud/connection' -require 'packagecloud/version' +require "multi_json" +require "mime" +require "excon" +require "packagecloud/result" +require "packagecloud/connection" +require "packagecloud/version" module Packagecloud SUPPORTED_EXTENSIONS = ["deb", "dsc", "gem", "rpm", "whl", "zip", "egg", "egg-info", "tar", "bz2", "Z", "gz", "tgz"] @@ -44,7 +44,7 @@ class Client attr_reader :connection attr_reader :credentials - def initialize(credentials, user_agent="packagecloud-ruby #{Packagecloud::VERSION}", connection=Connection.new) + def initialize(credentials, user_agent = "packagecloud-ruby #{Packagecloud::VERSION}", connection = Connection.new) @credentials = credentials @connection = connection @user_agent = user_agent @@ -54,7 +54,7 @@ def initialize(credentials, user_agent="packagecloud-ruby #{Packagecloud::VERSIO port = self.connection.port token = self.credentials.token - @excon = Excon.new("#{scheme}://#{token}@#{host}:#{port}", :connect_timeout => @connection.connect_timeout) + @excon = Excon.new("#{scheme}://#{token}@#{host}:#{port}", connect_timeout: @connection.connect_timeout) assert_valid_credentials end @@ -79,15 +79,15 @@ def gem_version parsed_json_result(response) end - def create_repository(repo, private=false) + def create_repository(repo, private = false) assert_valid_repo_name(repo) privacy = private ? 1 : 0 - body = { "repository" => { "name" => repo, "private" => privacy.to_s } } + body = {"repository" => {"name" => repo, "private" => privacy.to_s}} response = post("/api/v1/repos.json", body.to_json) parsed_json_result(response) end - def package_contents(repo, package, distro_version_id=nil) + def package_contents(repo, package, distro_version_id = nil) assert_valid_repo_name(repo) if distro_version_id.nil? raise "No distribution supplied for package_contents!" @@ -99,7 +99,7 @@ def package_contents(repo, package, distro_version_id=nil) package.file.rewind pkg_data = MIME::Application.new(package.file.read) - pkg_data.headers.set('Content-Transfer-Encoding', 'binary') + pkg_data.headers.set("Content-Transfer-Encoding", "binary") mixed_msg.add(pkg_data, "package[package_file]", package.filename) if distro_version_id.is_a? String @@ -121,6 +121,30 @@ def list_packages(repo) parsed_json_result(response) end + def gem_versions(repo, package_name) + assert_valid_repo_name(repo) + response = get("/api/v1/repos/#{username}/#{repo}/package/gem/#{package_name}/versions.json") + parsed_json_result(response) + end + + def gem_show(repo, package_name, version) + assert_valid_repo_name(repo) + response = get("/api/v1/repos/#{username}/#{repo}/package/gem/#{package_name}/#{version}.json") + parsed_json_result(response) + end + + def node_versions(repo, package_name) + assert_valid_repo_name(repo) + response = get("/api/v1/repos/#{username}/#{repo}/package/node/#{package_name}/versions.json") + parsed_json_result(response) + end + + def node_show(repo, package_name, version) + assert_valid_repo_name(repo) + response = get("/api/v1/repos/#{username}/#{repo}/package/node/#{package_name}/#{version}.json") + parsed_json_result(response) + end + def delete_package(repo, distro, distro_release, package_filename) assert_valid_repo_name(repo) url = "/api/v1/repos/#{username}/#{repo}/#{distro}/#{distro_release}/#{package_filename}" @@ -128,14 +152,20 @@ def delete_package(repo, distro, distro_release, package_filename) parsed_json_result(response) end - def put_package(repo, package, distro_version_id=nil) + def all_packages(repo) + assert_valid_repo_name(repo) + response = get("/api/v1/repos/#{username}/#{repo}/packages.json") + parsed_json_result(response) + end + + def put_package(repo, package, distro_version_id = nil) assert_valid_repo_name(repo) url = "/api/v1/repos/#{username}/#{repo}/packages.json" mixed_msg = MIME::Multipart::FormData.new - if distro_version_id != nil + unless distro_version_id.nil? if distro_version_id.is_a? String distro_version = find_distribution_id(distro_version_id) raise "Cannot find distribution: #{distro_version_id}" if distro_version.nil? @@ -147,13 +177,13 @@ def put_package(repo, package, distro_version_id=nil) package.file.rewind pkg_data = MIME::Application.new(package.file.read) - pkg_data.headers.set('Content-Transfer-Encoding', 'binary') + pkg_data.headers.set("Content-Transfer-Encoding", "binary") mixed_msg.add(pkg_data, "package[package_file]", package.filename) package.source_files.each do |filename, io| io.rewind src_pkg_data = MIME::Application.new(io.read) - src_pkg_data.headers.set('Content-Transfer-Encoding', 'binary') + src_pkg_data.headers.set("Content-Transfer-Encoding", "binary") mixed_msg.add(src_pkg_data, "package[source_files][]", filename) end @@ -172,12 +202,10 @@ def find_distribution_id(distro_query) all_distros = deb_distros.merge(rpm_distros).merge(py_distros).merge(node_distros) result = all_distros.select { |distro, id| distro.include?(distro_query) } if result.size > 1 - keys = result.map { |x| x.first }.join(' ') + keys = result.map { |x| x.first }.join(" ") raise ArgumentError, "'#{distro_query}' is ambiguous, did you mean: #{keys}?" elsif result.size == 1 result.first[1] # [["ubuntu/breezy", 1]] - else - nil end end end @@ -205,92 +233,92 @@ def list_read_tokens(repo, master_token_id) end private - def assert_valid_repo_name(repo) - if repo.include?("/") - raise InvalidRepoNameException.new("The repo name: #{repo} is " \ - "invalid. It looks like you are " \ - "using the fully qualified name " \ - "(fqname) instead of just the " \ - "repo name. Please try again.") - end - end - def assert_valid_credentials - result = distributions - if result.succeeded == false && result.response.downcase.include?('unauthenticated') - raise UnauthenticatedException - end + def assert_valid_repo_name(repo) + if repo.include?("/") + raise InvalidRepoNameException.new("The repo name: #{repo} is " \ + "invalid. It looks like you are " \ + "using the fully qualified name " \ + "(fqname) instead of just the " \ + "repo name. Please try again.") end + end - def distro_map(distros) - result = {} - distros.each do |distro| - name = distro["index_name"] - distro["versions"].each do |version| - version_name = version["index_name"] - key = "#{name}/#{version_name}" - result[key] = version["id"] - end - end - result + def assert_valid_credentials + result = distributions + if result.succeeded == false && result.response.downcase.include?("unauthenticated") + raise UnauthenticatedException end + end - def user_agent - "packagecloud-ruby #{VERSION}/#{@user_agent}" + def distro_map(distros) + result = {} + distros.each do |distro| + name = distro["index_name"] + distro["versions"].each do |version| + version_name = version["index_name"] + key = "#{name}/#{version_name}" + result[key] = version["id"] + end end + result + end - def multipart_post(url, mixed_msg) - boundary = mixed_msg.boundary - content_type = "multipart/form-data; boundary=#{boundary}" - body = mixed_msg.to_s - post(url, body, content_type) - end + def user_agent + "packagecloud-ruby #{VERSION}/#{@user_agent}" + end - def post(url, body, content_type="application/json") - request(url, :post, body, content_type) - end + def multipart_post(url, mixed_msg) + boundary = mixed_msg.boundary + content_type = "multipart/form-data; boundary=#{boundary}" + body = mixed_msg.to_s + post(url, body, content_type) + end - def get(url) - request(url, :get) - end + def post(url, body, content_type = "application/json") + request(url, :post, body, content_type) + end - def delete(url) - request(url, 'DELETE') - end + def get(url) + request(url, :get) + end - def username - self.credentials.username - end + def delete(url) + request(url, "DELETE") + end - def request(url, method=:get, body=nil, content_type=nil) - headers = { "User-Agent" => user_agent } - if content_type != nil - headers.merge!({ "Content-Type" => content_type }) - end - request_params = { :method => method, :path => url, :headers => headers } - if body != nil - request_params.merge!({ :body => body }) - end + def username + credentials.username + end - @excon.request(request_params.merge({:read_timeout => connection.read_timeout, :write_timeout => connection.write_timeout })) + def request(url, method=:get, body=nil, content_type=nil) + headers = {"User-Agent" => user_agent} + unless content_type.nil? + headers["Content-Type"] = content_type end - - # returns the parsed body of a successful result - def parsed_json_result(response) - prepare_result(response) { |result| result.response = MultiJson.load(response.data[:body]) } + request_params = {method: method, path: url, headers: headers} + unless body.nil? + request_params[:body] = body end - def prepare_result(response) - result = Result.new - if response.status == 201 || response.status == 200 - result.succeeded = true - yield result - else - result.response = response.data[:body] - result.succeeded = false - end - result - end + @excon.request(request_params.merge({read_timeout: connection.read_timeout, write_timeout: connection.write_timeout})) + end + + # returns the parsed body of a successful result + def parsed_json_result(response) + prepare_result(response) { |result| result.response = MultiJson.load(response.data[:body]) } + end + def prepare_result(response) + result = Result.new + if response.status == 201 || response.status == 200 + result.succeeded = true + yield result + else + result.response = response.data[:body] + result.succeeded = false + end + result + end end end diff --git a/lib/packagecloud/version.rb b/lib/packagecloud/version.rb index 92e1945..2242a66 100644 --- a/lib/packagecloud/version.rb +++ b/lib/packagecloud/version.rb @@ -1,7 +1,7 @@ module Packagecloud MAJOR_VERSION = "1" MINOR_VERSION = "0" - PATCH_VERSION = "8" + PATCH_VERSION = "9" VERSION = [MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION].join(".") end diff --git a/packagecloud-ruby.gemspec b/packagecloud-ruby.gemspec index c3f2b45..9c9c257 100644 --- a/packagecloud-ruby.gemspec +++ b/packagecloud-ruby.gemspec @@ -1,31 +1,30 @@ -# -*- encoding: utf-8 -*- - -require File.expand_path('../lib/packagecloud/version', __FILE__) +require File.expand_path("../lib/packagecloud/version", __FILE__) Gem::Specification.new do |gem| - gem.name = "packagecloud-ruby" - gem.version = Packagecloud::VERSION - gem.summary = "library for interacting with packagecloud.io" - gem.description = gem.summary - gem.license = "APL 2.0" - gem.authors = ["Joe Damato"] - gem.email = "joe@packagecloud.io" - gem.homepage = "https://rubygems.org/gems/packagecloud-ruby" + gem.name = "packagecloud-ruby" + gem.version = Packagecloud::VERSION + gem.summary = "library for interacting with packagecloud.io" + gem.description = gem.summary + gem.license = "APL 2.0" + gem.authors = ["Joe Damato"] + gem.email = "joe@packagecloud.io" + gem.homepage = "https://rubygems.org/gems/packagecloud-ruby" - gem.files = `git ls-files`.split($/) - gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } - gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) - gem.require_paths = ['lib'] + gem.files = `git ls-files`.split($/) + gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) } + gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) + gem.require_paths = ["lib"] - gem.add_runtime_dependency 'excon', '~> 0.40' - gem.add_runtime_dependency 'json_pure', '~> 1' - gem.add_runtime_dependency 'multi_json', '~> 1.0' - gem.add_runtime_dependency 'mime', '~> 0.4' + gem.add_runtime_dependency "excon", "~> 0.76" + gem.add_runtime_dependency "json_pure", "~> 2.3" + gem.add_runtime_dependency "multi_json", "~> 1.1" + gem.add_runtime_dependency "mime", "~>0.4" - gem.add_development_dependency 'bundler', '~> 1.0' - gem.add_development_dependency 'rake', '~> 0.8' - gem.add_development_dependency 'rspec', '~> 2.4' - gem.add_development_dependency 'simplecov', '~> 0.9' - gem.add_development_dependency 'rubygems-tasks', '~> 0.2' - gem.add_development_dependency 'yard', '~> 0.9.11' + gem.add_development_dependency "bundler", "~> 2" + gem.add_development_dependency "rake", "~> 13" + gem.add_development_dependency "rspec", "~>3.9" + gem.add_development_dependency "simplecov", "~>0.19" + gem.add_development_dependency "rubygems-tasks", "~>0.2.5" + gem.add_development_dependency "yard", "~> 0.9.25" + gem.add_development_dependency "standardrb", "~> 1" end From 877e6e7dd4a3fb49e2a5f1d2e28d09e34700fd84 Mon Sep 17 00:00:00 2001 From: Guillaume Winter Date: Fri, 11 Sep 2020 16:23:14 +0200 Subject: [PATCH 2/4] remove unsupported ruby versions, and add new ones remove unsupported ruby versions, and add newer ones --- .travis.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 92cf96a..f5b0da5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ sudo: false language: ruby rvm: - - 1.8.7 - - 1.9.3 - - 2.1.0 - 2.4.3 - - 2.5.0 + - 2.5.8 + - 2.6.6 + - 2.7.1 From a4d329a76229119934ef2b1616520e080c7a2978 Mon Sep 17 00:00:00 2001 From: Guillaume Winter Date: Fri, 11 Sep 2020 16:30:08 +0200 Subject: [PATCH 3/4] install bundler 2 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index f5b0da5..643416f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ sudo: false language: ruby +before_install: + - gem install bundler rvm: - 2.4.3 - 2.5.8 From 8ea9a0f4069e3a623f82170c8536d8bf3cb97362 Mon Sep 17 00:00:00 2001 From: Guillaume Winter Date: Fri, 11 Sep 2020 16:34:48 +0200 Subject: [PATCH 4/4] remove ruby 2.4 and bump minor version --- .travis.yml | 1 - lib/packagecloud/version.rb | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 643416f..b86d7ed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ language: ruby before_install: - gem install bundler rvm: - - 2.4.3 - 2.5.8 - 2.6.6 - 2.7.1 diff --git a/lib/packagecloud/version.rb b/lib/packagecloud/version.rb index 2242a66..80b0642 100644 --- a/lib/packagecloud/version.rb +++ b/lib/packagecloud/version.rb @@ -1,7 +1,7 @@ module Packagecloud MAJOR_VERSION = "1" - MINOR_VERSION = "0" - PATCH_VERSION = "9" + MINOR_VERSION = "1" + PATCH_VERSION = "0" VERSION = [MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION].join(".") end