Class: Gem::Commands::PushCommand

Inherits:
Gem::Command show all
Includes:
GemcutterUtilities, LocalRemoteOptions
Defined in:
lib/rubygems/commands/push_command.rb

Constant Summary

Constants included from GemcutterUtilities

GemcutterUtilities::API_SCOPES, GemcutterUtilities::ERROR_CODE, GemcutterUtilities::EXCLUSIVELY_API_SCOPES

Instance Attribute Summary

Attributes included from GemcutterUtilities

#host, #scope

Attributes inherited from Gem::Command

#command, #defaults, #options, #program_name, #summary

Instance Method Summary collapse

Methods included from GemcutterUtilities

#add_key_option, #add_otp_option, #api_key, #mfa_unauthorized?, #otp, #rubygems_api_request, #set_api_key, #sign_in, #update_scope, #verify_api_key, #webauthn_enabled?, #with_response

Methods included from Text

#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text

Methods included from LocalRemoteOptions

#accept_uri_http, #add_bulk_threshold_option, #add_clear_sources_option, #add_local_remote_options, #add_proxy_option, #add_source_option, #add_update_sources_option, #both?, #local?, #remote?

Methods inherited from Gem::Command

add_common_option, #add_extra_args, #add_option, add_specific_extra_args, #begins?, build_args, build_args=, #check_deprecated_options, common_options, #defaults_str, #deprecate_option, #deprecated?, extra_args, extra_args=, #extract_gem_name_and_version, #get_all_gem_names, #get_all_gem_names_and_versions, #get_one_gem_name, #get_one_optional_argument, #handle_options, #handles?, #invoke, #invoke_with_build_args, #merge_options, #remove_option, #show_help, #show_lookup_failure, specific_extra_args, specific_extra_args_hash, #when_invoked

Methods included from UserInteraction

#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction, #verbose

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Constructor Details

#initializePushCommand

Returns a new instance of PushCommand.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rubygems/commands/push_command.rb', line 32

def initialize
  super "push", "Push a gem up to the gem server", host: host, attestations: []

  @user_defined_host = false

  add_proxy_option
  add_key_option
  add_otp_option

  add_option("--host HOST",
             "Push to another gemcutter-compatible host",
             "  (e.g. https://rubygems.org)") do |value, options|
    options[:host] = value
    @user_defined_host = true
  end

  add_option("--attestation FILE",
              "Push with sigstore attestations") do |value, options|
    options[:attestations] << value
  end

  @host = nil
end

Instance Method Details

#argumentsObject

:nodoc:



24
25
26
# File 'lib/rubygems/commands/push_command.rb', line 24

def arguments # :nodoc:
  "GEM       built gem to push up"
end

#descriptionObject

:nodoc:



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/rubygems/commands/push_command.rb', line 12

def description # :nodoc:
  <<-EOF
The push command uploads a gem to the push server (the default is
https://rubygems.org) and adds it to the index.

The gem can be removed from the index and deleted from the server using the yank
command.  For further discussion see the help for the yank command.

The push command will use ~/.gem/credentials to authenticate to a server, but you can use the RubyGems environment variable GEM_HOST_API_KEY to set the api key to authenticate.
  EOF
end

#executeObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rubygems/commands/push_command.rb', line 56

def execute
  gem_name = get_one_gem_name
  default_gem_server, push_host = get_hosts_for(gem_name)

  @host = if @user_defined_host
    options[:host]
  elsif default_gem_server
    default_gem_server
  elsif push_host
    push_host
  else
    options[:host]
  end

   @host, scope: get_push_scope

  send_gem(gem_name)
end

#send_gem(name) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/rubygems/commands/push_command.rb', line 75

def send_gem(name)
  args = [:post, "api/v1/gems"]

  _, push_host = get_hosts_for(name)

  @host ||= push_host

  # Always include @host, even if it's nil
  args += [@host, push_host]

  say "Pushing gem to #{@host || Gem.host}..."

  response = send_push_request(name, args)

  with_response response
end

#usageObject

:nodoc:



28
29
30
# File 'lib/rubygems/commands/push_command.rb', line 28

def usage # :nodoc:
  "#{program_name} GEM"
end