class Wire::InitCommand

Init Command opens an interactive console dialog for initializing a model structure params:

Public Instance Methods

export_element_file(element_sym, element_data, target_dir) click to toggle source

exports an element part of the model to a single file in target_dir, as yaml.

# File lib/wire/commands/init_command.rb, line 82
def export_element_file(element_sym, element_data, target_dir)
  filename = File.join(target_dir, "#{element_sym}.yaml")
  open(filename, 'w') do |out_file|
    out_file.puts(element_data.to_yaml)
  end
end
export_model_file(model_data, target_dir) click to toggle source

Given a model structure and a target dir, this method ensures that targetdir exists and structure contents are written to individual files

# File lib/wire/commands/init_command.rb, line 53
def export_model_file(model_data, target_dir)
  puts "Target dir is #{target_dir}"

  # ensure target_dir exists
  if File.exist?(target_dir)
    if File.directory?(target_dir)
      $stdout.puts "Writing output to #{target_dir}"
    else
      $stderr.puts "ERROR: Target dir #{target_dir} exists, " \
                   'but is not a directory.'
      exit Wire.cli_exitcode(:init_dir_error)
    end
  else
    begin
      FileUtils.mkdir_p(target_dir)
    rescue => excpt
      $stderr.puts "ERROR: Unable to create #{target_dir}: #{excpt}"
      exit Wire.cli_exitcode(:init_dir_error)
    end
  end

  [:zones, :networks].each do |element_sym|
    element = model_data[element_sym]
    export_element_file element_sym, element, target_dir
  end
end
run(params = {}) click to toggle source
# File lib/wire/commands/init_command.rb, line 14
def run(params = {})
  puts "Initializing model in #{params[:target_dir]}"

  model_data = {}
  zone_data = {}
  network_data = {}
  model_data.store :zones, zone_data
  model_data.store :networks, network_data

  zone_names = InitInteractive.ask_for_zone_names
  if zone_names.size == 0
    $stderr.puts 'ERROR: must at least have one zone'
    exit Wire.cli_exitcode(:init_bad_input)
  end
  zone_names.each do |zone_name|

    zone_detail = {
      :desc => 'Enter a short description here',
      :long_desc => 'Enter a longer description here'
    }

    zone_data.store zone_name, zone_detail

    networks = InitInteractive.ask_for_network_in_zone zone_name
    networks.each do |network_name|

      network_details = InitInteractive.ask_detail_data_for_network network_name
      network_details.merge!({ :zone => zone_name })
      network_data.store network_name, network_details
    end
  end

  # write resulting model to file
  export_model_file(model_data, params[:target_dir])
end