Sha256: 7af575844d6eb3692934589e6e5a269d2d1b83a6335a7d2e84fc26a5a73d32f4

Contents?: true

Size: 1.89 KB

Versions: 6

Compression:

Stored size: 1.89 KB

Contents

require 'xmlsimple'
require 'yaml'
require 'fileutils'

default_output_file = 'output.yml'

# Create file if not present. If present but different give warning
def create_file(options)
  filename = options[:filename]
  raise 'Need to pass filename' unless filename
  content = options[:content]
  raise 'Need to pass contents to insert into file' unless content
  if File.exist? filename
    old_content = File.read(filename)
    if old_content != content
      warn "!! #{filename} already exists and differs from template"
    end
  else
    File.open(filename, 'w') do |f|
      f.puts content
    end
    puts 'Created: ' + filename
  end
end

# Convert key in camelcase to underscore separated (snakecase)
def underscore_key(key)
  key.to_s.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
    .gsub(/([a-z\d])([A-Z])/,'\1_\2')
    .tr('-', '_')
    .gsub(/\s/, '_')
    .gsub(/__+/, '_')
    .downcase
end

# For all keys in a Hash, convert Camelcase to underscore separated
def convert_hash_keys(value)
  case value
    when Array
      value.map { |v| convert_hash_keys(v) }
    when Hash
      Hash[value.map { |k, v| [underscore_key(k), convert_hash_keys(v)] }]
    else
      value
  end
end

# Remove arrays created as another string
def clean_up_yaml(yaml_string)
  yaml_string = yaml_string.gsub(/\R+(\s*)-/, '').gsub(/{}/, "''") # Remove arrays, {} -> ''
  # Insert new line where there are 2 ':' on 1 line. Issue from first gsub
  yaml_string.gsub(/:(\s)(\w*):/){|s| s.insert(1, "\n")}
end

if ARGV[0]
  warn "Using '#{default_output_file}' as default output file since no 2nd argument passed" unless ARGV[1]
  hash = XmlSimple.xml_in(ARGV[0])
  converted = convert_hash_keys hash
  yaml_file = clean_up_yaml(converted.to_yaml)
  create_file(filename: ARGV[1] || default_output_file, content: yaml_file)
else
  puts 'usage: xml_to_yaml_file [input.xml] [output.yml] '
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
soaspec-0.0.19 exe/xml_to_yaml_file
soaspec-0.0.18 exe/xml_to_yaml_file
soaspec-0.0.17 exe/xml_to_yaml_file
soaspec-0.0.16 exe/xml_to_yaml_file
soaspec-0.0.15 exe/xml_to_yaml_file
soaspec-0.0.14 exe/xml_to_yaml_file