2015-07-28 23 views
9

Attualmente sto usando Sidekiq in un progetto e ho il seguente file YAML di configurazione:Colon nella parte anteriore: sintassi YAML

:concurrency: 5 
:pidfile: /tmp/pids/sidekiq.pid 
:logfile: log/sidekiq.log 
staging: 
    :concurrency: 10 
production: 
    :concurrency: 20 
queues: 
    - default 

non ho visto avere due punti di fronte a una chiave di prima, ma omettendo quel colon produce risultati interessanti. Nel caso del :pidfile:, ad esempio, con i due punti in primo piano crea/sostituisce il file di destinazione dove è senza, utilizza quello già lì e non scrive su di esso.

Questo documento è documentato da qualche parte o semplicemente come Sidekiq si aspetta determinate chiavi?

risposta

11

chiavi YAML che iniziano con i due punti generare chiavi in ​​Ruby simboleggiavano, mentre le chiavi senza i due punti saranno generare chiavi stringata:

require 'yaml' 

string =<<-END_OF_YAML 
:concurrency: 5 
:pidfile: /tmp/pids/sidekiq.pid 
:logfile: log/sidekiq.log 
staging: 
    :concurrency: 10 
production: 
    :concurrency: 20 
queues: 
    - default 
END_OF_YAML 

YAML.load(string) 
# { 
#  :concurrency => 5, 
#  :pidfile  => "/tmp/pids/sidekiq.pid", 
#  :logfile  => "log/sidekiq.log", 
#  "staging" => { 
#   :concurrency => 10 
#  }, 
#  "production" => { 
#   :concurrency => 20 
#  }, 
#  "queues"  => [ 
#   [0] "default" 
#  ] 
# } 

Nota: Se una gemma dipende da chiavi simbolizzate, le chiavi non saranno sovrascritte dai valori predefiniti.

+0

Più uno per i tasti simbolici. Non l'ho mai visto prima in Ruby, ma ho visto luoghi in cui un simbolo è richiesto come chiave. Buono a sapersi – TheJKFever

+0

Capisco come si comporta in Ruby qui ... ma per quanto riguarda lo YAML sintattico, è legittimo avviare una chiave con i due punti, ed è solo l'interprete Ruby che genera i simboli dalle chiavi che iniziano con un colon? – Brian

3

In realtà non è sidekiq specifico. I due punti di fronte a una chiave fa solo questa chiave un simbolo invece di una stringa:

# example.yml 
a: 
    value: 1 
:b: 
    value: 2 


yaml = YAML.load_file('example.yml') 

yaml["a"] => { "value" => 1 } 
yaml[:b] => { "value" => 1 } 

Quindi, se il codice accede alla configurazione con i simboli dei tasti, si dovrebbe aggiungere una colon davanti alla chiave nella yaml file o utilizzare alcuni conversione di tasti come #with_indifferent_access per l'hash risultato (dopo l'analisi del file YAML)

+0

Grazie! Ho corretto la risposta. –

+0

quindi si tratta di un comportamento specifico di ruby ​​e non utilizzato da altre lingue, giusto? – Tony