Skip to content

Instantly share code, notes, and snippets.

@jmolivas
Created April 29, 2014 15:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmolivas/11403587 to your computer and use it in GitHub Desktop.
Save jmolivas/11403587 to your computer and use it in GitHub Desktop.
Adding customizable configuration to Vagrantfile
require "yaml"
parameter_file = "./parameters.yml"
parameters = Array.new(0)
if File.exists?(parameter_file)
parameters = YAML::load_file(parameter_file)
end
# Apply configuration values if available
config.vm.network "private_network", ip: (parameters.include?'network_ip') ? parameters['network_ip'] : "192.168.9.10"
config.vm.synced_folder "./www", "/var/www", id: "webroot", type: (parameters.include?'synced_folder_type') ? parameters['synced_folder_type'] : "nfs"
virtualbox.customize ["modifyvm", :id, "--memory", (parameters.include?'memory') ? parameters['memory'] : "512"]
@favrik
Copy link

favrik commented Apr 29, 2014

Estillo PHP? xD

require "yaml"

parameters = {}
default_parameters = {
  'network_ip' => "192.168.9.10",
  'synced_folder_type' => "nfs",
  'memory' => "512" 
}
parameter_file = "./parameters.yml"

if File.exists?(parameter_file)
  parameters = YAML::load_file(parameter_file)
end

parameters = default_parameters.merge(parameters)

@jmolivas
Copy link
Author

NIce refactor sr aplicando en 3, 2 ,1

@antillas21
Copy link

Esto es lo que haría yo:

require 'yaml'

file_name = 'parameters.yml'
params = {}

params = YAML.load_file(file_name)

config.vm.network "private_network", ip: params.fetch('network_ip', "192.168.9.10")
config.vm.synced_folder "./www", "/var/www", id: "webroot", type: params.fetch('synced_folder_type', "nfs")
virtualbox.customize ["modifyvm", :id, "--memory", params.fetch('memory', "512")]

Explicación:

  • No necesito que params se por default un Array, sino que podría se un Hash
  • La clase Hash, tiene un método muy bonito que se llama fetch
  • fetch funciona así, le puedo pasar hasta dos argumentos:
    • el primer argumento es la llave del Hash que puede apuntar a un valor
    • el segundo argumento, funciona como fallback, si la llave no existe o apunta a nil, entonces proporciona un default value. Exemplo: params.fetch('network_ip', "192.168.9.10"), significa del hash params, trae el valor de la llave network_ip, si no hay nada, entonces que sea 192.168.9.10.

Usando fetch me ahorro todos esos ternary checks ;)

@favrik
Copy link

favrik commented Apr 29, 2014

Nice!, con fetch ya no importa si load_file regreso una cadena o un hash. :) Yo agregaria el File.exists check al codigo de @antillas21 y listo (IMHO).

@jmolivas
Copy link
Author

Muchas gracias señores si exacto agrego el File.exists por que el repo se distribuye con un parameters.yml.dist y el usuario tiene que hacer un $cp parameters.yml.dist parameters.yml para hacer override la config

@jmolivas
Copy link
Author

Al final ha quedó así:

require "yaml"

params_file = "parameters.yml"
params = {}

if File.exists?(params_file)
  params = YAML::load_file(params_file)
end

config.vm.network "private_network", ip: params.fetch('network_ip', "192.168.9.10")
config.vm.synced_folder "./www", "/var/www", id: "webroot", type: params.fetch('synced_folder_type', "nfs")
virtualbox.customize ["modifyvm", :id, "--memory", params.fetch('memory', "512")]

@antillas21
Copy link

En un ejercicio extra, puedes reducir esto así:

require "yaml"

params_file = "parameters.yml"
params = File.exists?(params_file) ? YAML::load_file(params_file) : {}

config.vm.network "private_network", ip: params.fetch('network_ip', "192.168.9.10")
config.vm.synced_folder "./www", "/var/www", id: "webroot", type: params.fetch('synced_folder_type', "nfs")
virtualbox.customize ["modifyvm", :id, "--memory", params.fetch('memory', "512")]

De nuevo, la explicación:

  • no hay por qué checar si params_file está definido, porque tú controlas el flow y lo acabas de declarar :P
  • no hay por qué inicializar params = { } antes de hacer algo con él.
  • cuando declaras params, puedes darle un fallback value con ||, traduciéndose como params es lo que resulte de abrir via YAML este archivo, o un Hash vacío

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment