Module: PDK::CLI::Set::Config

Defined in:
lib/pdk/cli/set/config.rb

Constant Summary collapse

ALLOWED_TYPE_NAMES =
['array', 'boolean', 'number', 'string'].freeze

Class Method Summary collapse

Class Method Details

.pretty_allowed_namesObject

:nocov:



8
9
10
# File 'lib/pdk/cli/set/config.rb', line 8

def self.pretty_allowed_names
  ALLOWED_TYPE_NAMES.map { |name| "'#{name}'" }.join(', ')
end

.run(opts, args) ⇒ Object

Raises:



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/pdk/cli/set/config.rb', line 66

def self.run(opts, args)
  item_name = args.count.positive? ? args[0] : nil
  item_value = args.count > 1 ? args[1] : nil

  opts[:type] = opts[:as] if opts[:type].nil? && !opts[:as].nil?
  force = opts[:force] || false

  # Transform the value if we need to
  item_value = PDK::CLI::Set::Config.transform_value(opts[:type], item_value) unless opts[:type].nil?

  raise PDK::CLI::ExitWithError, 'Configuration name is required' if item_name.nil?
  raise PDK::CLI::ExitWithError, 'Configuration value is required. If you wish to remove a value use \'pdk remove config\'' if item_value.nil?

  current_value = PDK.config.get(item_name)
  raise PDK::CLI::ExitWithError, format("The configuration item '%{name}' can not have a value set.", name: item_name) if current_value.is_a?(PDK::Config::Namespace)

  # If we're forcing the value, don't do any munging
  # Check if the setting already exists
  if !force && (current_value.is_a?(Array) && current_value.include?(item_value))
    PDK.logger.info(format("No changes made to '%{name}' as it already contains value '%{to}'", name: item_name, to: item_value))
    return 0
  end

  new_value = PDK.config.set(item_name, item_value, force: opts[:force])
  if current_value.nil? || force
    PDK.logger.info(format("Set initial value of '%{name}' to '%{to}'", name: item_name, to: new_value))
  elsif current_value.is_a?(Array)
    # Arrays have a special output format
    PDK.logger.info(format("Added new value '%{to}' to '%{name}'", name: item_name, to: item_value))
  else
    PDK.logger.info(format("Changed existing value of '%{name}' from '%{from}' to '%{to}'", name: item_name, from: current_value, to: new_value))
  end

  # Same output as `get config`
  $stdout.puts format('%{name}=%{value}', name: item_name, value: PDK.config.get(item_name))
  0
end

.transform_value(type_name, value) ⇒ Object

:nocov:



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/pdk/cli/set/config.rb', line 13

def self.transform_value(type_name, value)
  normalized_name = type_name.downcase.strip
  unless ALLOWED_TYPE_NAMES.include?(normalized_name)
    raise PDK::CLI::ExitWithError, format('Unknown type %{type_name}. Expected one of %{allowed}', type_name: type_name, allowed: pretty_allowed_names)
  end

  # Short circuit string conversions as it's trivial
  if normalized_name == 'string'
    raise PDK::CLI::ExitWithError, format('An error occured converting \'%{value}\' into a %{type_name}', value: value.nil? ? 'nil' : value, type_name: type_name) unless value.is_a?(String)

    return value
  end

  begin
    case normalized_name
    when 'array'
      convert_to_array(value)
    when 'boolean'
      convert_to_boolean(value)
    when 'number'
      convert_to_number(value)
    else
      value
    end
  rescue ArgumentError, TypeError
    raise PDK::CLI::ExitWithError, format('An error occured converting \'%{value}\' into a %{type_name}', value: value.nil? ? 'nil' : value, type_name: type_name)
  end
end