diff options
author | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-16 18:49:26 +0900 |
---|---|---|
committer | Jari Vetoniemi <jari.vetoniemi@indooratlas.com> | 2020-03-30 00:39:06 +0900 |
commit | fcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch) | |
tree | 64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/lib/rubygems/gemcutter_utilities.rb |
Fresh start
Diffstat (limited to 'jni/ruby/lib/rubygems/gemcutter_utilities.rb')
-rw-r--r-- | jni/ruby/lib/rubygems/gemcutter_utilities.rb | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/jni/ruby/lib/rubygems/gemcutter_utilities.rb b/jni/ruby/lib/rubygems/gemcutter_utilities.rb new file mode 100644 index 0000000..4ecf737 --- /dev/null +++ b/jni/ruby/lib/rubygems/gemcutter_utilities.rb @@ -0,0 +1,154 @@ +require 'rubygems/remote_fetcher' + +## +# Utility methods for using the RubyGems API. + +module Gem::GemcutterUtilities + + # TODO: move to Gem::Command + OptionParser.accept Symbol do |value| + value.to_sym + end + + attr_writer :host + + ## + # Add the --key option + + def add_key_option + add_option('-k', '--key KEYNAME', Symbol, + 'Use the given API key', + 'from ~/.gem/credentials') do |value,options| + options[:key] = value + end + end + + ## + # The API key from the command options or from the user's configuration. + + def api_key + if options[:key] then + verify_api_key options[:key] + elsif Gem.configuration.api_keys.key?(host) + Gem.configuration.api_keys[host] + else + Gem.configuration.rubygems_api_key + end + end + + ## + # The host to connect to either from the RUBYGEMS_HOST environment variable + # or from the user's configuration + + def host + configured_host = Gem.host unless + Gem.configuration.disable_default_gem_server + + @host ||= + begin + env_rubygems_host = ENV['RUBYGEMS_HOST'] + env_rubygems_host = nil if + env_rubygems_host and env_rubygems_host.empty? + + env_rubygems_host|| configured_host + end + end + + ## + # Creates an RubyGems API to +host+ and +path+ with the given HTTP +method+. + # + # If +allowed_push_host+ metadata is present, then it will only allow that host. + + def rubygems_api_request(method, path, host = nil, allowed_push_host = nil, &block) + require 'net/http' + + self.host = host if host + unless self.host + alert_error "You must specify a gem server" + terminate_interaction 1 # TODO: question this + end + + if allowed_push_host and self.host != allowed_push_host + alert_error "#{self.host.inspect} is not allowed by the gemspec, which only allows #{allowed_push_host.inspect}" + terminate_interaction 1 + end + + uri = URI.parse "#{self.host}/#{path}" + + request_method = Net::HTTP.const_get method.to_s.capitalize + + Gem::RemoteFetcher.fetcher.request(uri, request_method, &block) + end + + ## + # Signs in with the RubyGems API at +sign_in_host+ and sets the rubygems API + # key. + + def sign_in sign_in_host = nil + sign_in_host ||= self.host + return if api_key + + pretty_host = if Gem::DEFAULT_HOST == sign_in_host then + 'RubyGems.org' + else + sign_in_host + end + + say "Enter your #{pretty_host} credentials." + say "Don't have an account yet? " + + "Create one at #{sign_in_host}/sign_up" + + email = ask " Email: " + password = ask_for_password "Password: " + say "\n" + + response = rubygems_api_request(:get, "api/v1/api_key", + sign_in_host) do |request| + request.basic_auth email, password + end + + with_response response do |resp| + say "Signed in." + Gem.configuration.rubygems_api_key = resp.body + end + end + + ## + # Retrieves the pre-configured API key +key+ or terminates interaction with + # an error. + + def verify_api_key(key) + if Gem.configuration.api_keys.key? key then + Gem.configuration.api_keys[key] + else + alert_error "No such API key. Please add it to your configuration (done automatically on initial `gem push`)." + terminate_interaction 1 # TODO: question this + end + end + + ## + # If +response+ is an HTTP Success (2XX) response, yields the response if a + # block was given or shows the response body to the user. + # + # If the response was not successful, shows an error to the user including + # the +error_prefix+ and the response body. + + def with_response response, error_prefix = nil + case response + when Net::HTTPSuccess then + if block_given? then + yield response + else + say response.body + end + else + message = response.body + message = "#{error_prefix}: #{message}" if error_prefix + + say message + terminate_interaction 1 # TODO: question this + end + end + +end + |