Как включить файл YAML в файл YAML в Ruby - PullRequest
16 голосов
/ 17 февраля 2010

Есть ли в YAML специальный тег для ruby ​​для включения файла YAML в файл YAML?

#E.g.:  
--- !include
filename: another.yml

A аналогичный вопрос был задан некоторое время назад, и не было никакого соответствующего ответа.

Мне интересно, есть ли какой-нибудь пользовательский тег для Ruby, похожий на этот один для Python.

Ответы [ 7 ]

16 голосов
/ 15 декабря 2012

Если вы находитесь в Rails, YAML может включать ERB.

Объедините это вместе, и вот как вы можете использовать <%= %> для включения одного файла из другого:

database.yml

<% if File.exists?('/tmp/mysql.sock') %>
<%= IO.read('config/database.mysql.yml') %>
<% else %>
<%= IO.read('config/database.sqlite.yml') %>
<% end %>

database.sqlite.yml

sqlite: &defaults
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *defaults
  database: db/development.sqlite3

test:
  <<: *defaults
  database: db/test.sqlite3

production:
  <<: *defaults
  database: db/production.sqlite3

database.mysql.yml

development:
  adapter: mysql2
  # ... the rest of your mysql configuration ...
14 голосов
/ 18 февраля 2010

Я нашел способ обратиться к моему сценарию, используя ERB.

Я пропатчил модуль YAML для добавления двух новых методов

module YAML
    def YAML.include file_name
      require 'erb'
      ERB.new(IO.read(file_name)).result
    end

    def YAML.load_erb file_name
      YAML::load(YAML::include(file_name))
    end  
end

У меня есть три файла YAML.

mod1_config.yml

mod1:
    age: 30
    city: San Francisco

mod2_config.yml

mod2:
    menu: menu1
    window: window1

all_config.yml

<%= YAML::include("mod1_config.yml") %>
<%= YAML::include("mod2_config.yml") %>

Разобрать файл yaml, используя метод YAML::load_erb вместо метода YAML::load.

  config = YAML::load_erb('all_config.yml') 
  config['mod1']['age'] # 30
  config['mod2']['menu'] # menu1

Предостережения:

  1. Не поддерживает слияние документов
  2. Последнее включает перезаписывающие одноименные ключи
8 голосов
/ 20 июля 2010

Если ваша цель - избежать дублирования в вашем файле YAML, не обязательно включая внешний файл, я рекомендую сделать что-то вроде этого:

development: &default
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: db_dev
  pool: 5
  username: usr
  password: psw
  host: localhost
  port: 3306

dev_cache:
  <<: *default

new:
  <<: *default
  database: db_new

test:
  <<: *default
  database: db_test
2 голосов
/ 08 апреля 2011

Я использую это:

load_config.rb (инициализатор)

cf_1 = YAML::load(File.read("/etc/my_app/config.yml"))
cf_2 = YAML::load(File.read(File.join(Rails.root, "config", "config.yml")))
CONFIG = cf_1.merge(cf_2)

Позже вы можете получить доступ к значениям конфигурации, выполнив:

CONFIG['value']
1 голос
/ 14 ноября 2017

Если вы просто хотите наследовать от другого файла YAML, есть гем, обеспечивающий эту функцию, которую вы запрашиваете, путем расширения библиотеки ruby ​​YAML:

https://github.com/entwanderer/yaml_extend

https://rubygems.org/gems/yaml_extend

Использование

yaml_extend добавляет метод YAML # ext_load_file в YAML.

Этот метод работает как оригинальный YAML # load_file, расширяя его наследованием файлов.

Примеры

# start.yml
extends: 'super.yml'
data:
    name: 'Mr. Superman'
    age: 134    
    favorites:
        - 'Raspberrys'

-

# super.yml
data:
    name: 'Unknown'
    power: 2000
    favorites:
        - 'Bananas'
        - 'Apples'

Базовое наследование

YAML.ext_load_file('start.yml')

результаты в

data:
    name: 'Mr. Superman'
    age: 134
    power: 2000
    favorites:
        - 'Bananas'
        - 'Apples'
        - 'Raspberrys'
1 голос
/ 18 февраля 2010
  1. !include не директива, а тег.
  2. это не особенность Python (или PyYAML), а особенность библиотеки poze:

    poze.configuration предоставляет директиву по умолчанию с именем include.

  3. Спецификация YAML не определяет такой стандартный тег.

0 голосов
/ 20 февраля 2010

Зависит от того, что вам нужно. Если вам нужно перенести файл, вы можете закодировать Base64 внутренний файл yaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...