2011-02-09 8 views
23

Sto usando Jammit per confezionare le attività per un'applicazione Rails e ho un paio di file di risorse che mi piacerebbe essere inclusi in ciascuno dei pochi gruppi. Ad esempio, mi piacerebbe che lo Sammy ei suoi plug-in fossero entrambi nei miei pacchetti JS mobile e screen.C'è un modo per creare alias/ancorare una matrice in YAML?

Ho provato questo:

sammy: &SAMMY 
    - public/javascripts/vendor/sammy.js 
    - public/javascripts/vendor/sammy*.js 

mobile: 
    <<: *SAMMY 
    - public/javascripts/something_else.js 

e questo:

mobile: 
    - *SAMMY 

ma sia messo i file Sammy JS in un array nidificato, che Jammit non può capire. Esiste una sintassi per includere gli elementi di una matrice direttamente in un'altra matrice?

NB: realizzo che in questo caso ci sono solo due elementi nella SAMMY Array, quindi non sarebbe male dare ciascuno un alias e riferimento sia in ogni pacchetto. Va bene per questo caso, ma diventa rapidamente non mantenibile quando ci sono cinque o dieci elementi con un ordine di caricamento specifico.

risposta

12

Il vostro esempio è valido YAML (un posto comodo per controllare è YPaste), ma non è definito quanto l'unione fa. Per il spec, una chiave di unione può avere un valore:

  1. Una mappatura, nel qual caso è unita alla mappatura genitore.
  2. Una sequenza di mappature, in questo caso vengono fusi, uno per uno, nella mappatura genitore.

Non c'è modo di fondere sequenze. Tuttavia, è possibile farlo in codice. Utilizzando la YAML dalla seconda idea:

mobile: 
    - *SAMMY 

si otterrà sequenze nidificate - così li appiattire! Supponendo di aver una mappatura di tali sequenze nidificate:

data = YAML::load(File.open('test.yaml')) 
data.each_pair { |key, value| value.flatten! } 

(Naturalmente, se si dispone di un file YAML più complicata, e non si vuole ogni sequenza appiattito (o loro non sono tutte le sequenze), è 'll hanno a che fare un po' di filtraggio)

+0

Ecco un esempio: http://www.yaml.org/ypaste/803/index.html. Ho appena controllato di nuovo e ho notato che non si tratta di un errore di sintassi, ma che questo costrutto non crea un arra piatto y; crea una mappa, che Jammit non può gestire. Ho appena modificato la domanda per mostrarlo. –

+0

@James, mi spiace, non mi sono reso conto che stavi unendo le sequenze. Modificato. –

+0

Assicurati di appiattire (1) per un appiattimento superficiale in modo da non distruggere i tuoi array nei valori. – Costi

11

Se si desidera mobile di essere uguale a sammy, si può solo fare:

mobile: *SAMMY 

Tuttavia, se si desidera mobile per contenere altri elementi oltre a quelli in sammy, non c'è modo di farlo in YAML al meglio delle mie conoscenze.

2

questo dovrebbe risolvere il problema:. http://pastie.org/1790173.

Si noti che ho dovuto creare vuoto gruppo default (o qualsiasi altra cosa è il nome) sulla parte superiore.

+1

Questo non si comporta in modo diverso dal secondo tentativo dell'OP ('- * SAMMY'). Il riferimento diventa una matrice nidificata. Devi ancora appiattire l'array principale se non vuoi il nesting. – Kelvin

10

soluzione più vicina che conosco è questa:

sammy: 
    - &SAMMY1 
    public/javascripts/vendor/sammy.js 
    - &SAMMY2 
    public/javascripts/vendor/sammy*.js 

mobile: 
    - *SAMMY1 
    - *SAMMY2 
    - public/javascripts/something_else.js 

In alternativa, come già suggerito, appiattire le liste nidificate in un frammento di codice.

. Nota: secondo il yaml-online-parser, il vostro primo suggerimento non è un uso valida di < < (utilizzato per unire le chiavi di due dizionari L'ancoraggio deve quindi puntare a un altro dizionario Credo

0

Come è stato. suggerito, quando è necessario appiattire un elenco, almeno in ruby, è banale aggiungere un identificatore di tipo "! flatten" a mobile e implementare una classe che estende Array, aggiunge lo yaml_tag e appiattisce il seq del codificatore su init_with.

Problemi correlati