web-dev-qa-db-fra.com

Comment analyser un fichier YAML?

J'aimerais savoir comment analyser un fichier YAML avec le contenu suivant:

--- 
javascripts: 
- fo_global:
  - lazyload-min
  - holla-min

J'essaie actuellement de l'analyser de la manière suivante:

@custom_asset_packages_yml = (File.exists?("#{Rails_ROOT}/config/asset_packages.yml") ? YAML.load_file("#{Rails_ROOT}/config/asset_packages.yml") : nil)
    if !@custom_asset_packages_yml.nil?
      @custom_asset_packages_yml['javascripts'].each{ |js|
        js['fo_global'].each{ |script|
         script
        }
      }
    end

Mais cela ne semble pas fonctionner et me donne une erreur que la valeur est nulle.

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Si j'essaye cela, il met toute la chaîne (fo_globallazyload-minholla-min):

if !@custom_asset_packages_yml.nil?
          @custom_asset_packages_yml['javascripts'].each{ |js|
            js['fo_global']
          }
        end
192
alvincrespo

Peut-être qu'il me manque quelque chose, mais pourquoi essayer d'analyser le fichier? Pourquoi ne pas simplement charger le YAML et examiner le ou les objets qui en résultent?

Si votre échantillon YAML est dans some.yml, alors ceci:

require 'yaml'
thing = YAML.load_file('some.yml')
puts thing.inspect

donne moi

{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}
431
Mike Woodhouse

J'ai eu le même problème, mais je voulais aussi obtenir le contenu du fichier (après l’avant-plan YAML).

C'est la meilleure solution que j'ai trouvée:

if (md = contents.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m))
  self.contents = md.post_match
  self.metadata = YAML.load(md[:metadata])
end

Source et discussion: https://practicingruby.com/articles/tricks-for-working-with-text-and-files

11
sarfata

Voici la ligne que j’utilise, depuis terminal, pour tester le contenu des fichiers yml:

$ Ruby  -r yaml -r pp  -e 'pp YAML.load_file("/Users/za/project/application.yml")'
{"logging"=>
  {"path"=>"/var/logs/",
   "file"=>"TacoCloud.log",
   "level"=>
    {"root"=>"WARN", "org"=>{"springframework"=>{"security"=>"DEBUG"}}}}}
1
zee