La fusión de los hashes de los archivos de conf YAML

31 de julio 2009 por prashant
Filed under: la tecnología

YAML es muy útil para escribir archivos de configuración. Principal ventaja es que, se lee como archivo de texto. Esto funciona muy bien si su fichero de configuración es plana (sin jerarquía) y no tiene repeticiones.
Si su archivo de configuración tiene repeticiones, entonces tiene sentido para separar los elementos y volver a usarlos. Lo que quiero decir es esto - digamos que su archivo de configuración es la siguiente:

  el desarrollo:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret
 producción:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret 

Suponiendo que el código anterior en / tmp / test.yml aquí es cómo se puede leer en Python y Ruby
$cat readyml.py

 #! / Usr / bin / python env
 pprint de importación pprint como pp
 # Debian en el que instalar python-YAML
 de la carga de importación YAML, load_all, volcado
 hash = carga (open ('/ tmp / test.yml'))
 pp (hash ['desarrollo']) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 require 'pp'
 hash = YAML :: load (File.open ('/ tmp / test.yml'). leer)
 pp hash ['desarrollo'] 

aquí hay una mano un trazador de líneas de la versión de Ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' o puedes intentar lo mismo en el IRB o la consola de python.

Tenga en cuenta que en el fragmento de código anterior, todo es distinto de ubicación de salida es la misma en el desarrollo y la parte de producción. Aquí es donde identificador de nodo yml viene a rescatar. La idea es sencilla tiene un conjunto de valores predeterminados y reemplazar ellos en lugar diferente.
Usted podría separarla de la siguiente manera:

  por defecto y por defecto:
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: emisor
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret
 el desarrollo:
   <<: * Los valores por defecto
 producción:
   <<: * Los valores por defecto
   output_location: prod_location 


$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Grande, que funciona (tm)!.
Podría decirse que negocian un poco de claridad a un poco de magia. Aquí hay una pequeña explicación: &, * y <<: y que es etiqueta de anclaje puede ser entendido como identificador de nodo, * es la referencia de nodo y <<: es sinónimo de fusión de hash.

Para más detalles vea bien las especificaciones YAML o wikipedia
Hasta aquí todo bien, pero hay un problema aquí, estas fusiones hash no son recursivos. Lo que significa es lo siguiente: digamos que usted desea tener el nombre del remitente para el correo diferentes en dos ambientes, usted puede estar tentado a hacer lo siguiente:

  por defecto y por defecto:
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: emisor
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret
 el desarrollo:
   <<: * Los valores por defecto
   mail:
     sender_name: sender_dev
 producción:
   <<: * Los valores por defecto
   output_location: prod_location
   mail:
     sender_name: sender_prod 

Permite comprobar

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$

Vaya, algo salió mal, el problema como se mencionó anteriormente es que la combinación hash no es recurrente y si bien la fusión de lo reemplazó de correo electrónico de forma predeterminada por correo de la producción que tiene una sola llave. Solución / es trabajo en torno a desenrollar un nivel más:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  sender_name: emisor
   smtp_server: su_servidor
   de inicio de sesión: your_login
   contraseña: top_secret

 por defecto y por defecto:
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 el desarrollo:
   <<: * Los valores por defecto
 producción:
   <<: * Los valores por defecto
   mail:
     <<: * Mail_defaults
     sender_name: sender_prod

Vamos a comprobar de nuevo

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

¿Sabía usted que usted tiene un nivel de más de anidación, así que definitivamente se puede desenrollar un nivel más, pero entonces se convierte en un desastre. Por lo tanto, si usted no está tratando de escribir la solución a las torres de Hanoi en un archivo de conf, es mejor restucture conf a cavar en YAML o alguna otra cosa. Pero eso es la llamada de todos modos.

Comentarios

  • El total de 453 páginas del documento también se enumeran las posibles áreas de
    consolidación, incluyendo la privatización de la recolección de basura, la fusión de la ciudad y
    Wayne del Condado de los departamentos de salud y la colaboración con escuelas públicas de Detroit en la
    recreación. La propuesta no incluye ninguna ...

  • Una persona familiarizada con la operación dijo que las dos partes todavía están a hilvanar un nombre para una empresa fusionada. Pero esta persona dijo una idea que se considera es la selección de un nombre que no tienen la palabra "Deutsche" o el acrónimo "NYSE" en ella. ...

  • Sí molesto que no se confunde de forma recursiva. Yo era capaz de hacer una solución en la biblioteca de mi balphp.

blog alimentado por los comentarios Disqus