2016-11-03 8 views
3

У меня есть yml-файл, который я использую для хранения списка историй, которые я добавил между релизами.Ruby Добавление блока комментариев в файл YAML

Я использую задачу rake для динамического обновления номера версии, основываясь на том, какие истории я добавил в этот файл.

Он вводит новый процесс, поэтому я создал следующий блок комментария это поможет кому комментирует здесь, чтобы добавить истории в правильном формате:

# Version control file. 
# Versions should be incremented as follows 
# 
# [X - major change] . [V - new feature] . [I - Bug fix/Small change] 
# 
# Update the undefined block with a one line readable description of what your story was about. example: 
# 
# undefined: 
# stories: 
# - "I - fixed spelling mistake" 
# - "V - added import functionality" 
# - "X - rebuilt the main dashboard" 
# 

Этого вопрос после того, как мои реки задача сделать работу файл теряет блок комментариев.

Я в значительной степени нагружают YAML versions = YAML.load_file('doc/release.yml'), а затем, как только логика закончена я File.open("doc/release.yml", 'w') { |f| YAML.dump(versions, f) }

Где versions это новый обновленный хэш. Однако это удаляет блок комментариев в файл.

Другие решения, которые я нашел, просто изменяют существующие линии.

Есть ли способ открыть файл и добавить выше, не испортив YAML внизу. Любая помощь будет высоко ценится.

ответ

1

То, что комментарии потеряны с дампом, к сожалению, является нормальным. У вас есть два варианта:

  1. конвертировать ваши версии хэша YAML { :a => 'b'}.to_yaml, добавить комментарии и с File.write сделать дамп самостоятельно, вы можете переписать нормальный .dump метод в YAML этого пути
  2. присвоить комментарии к некоторому фиктивному значению в конце вашего файла yaml , чтобы они были прочитаны в версиях и сохранены.
+0

Спасибо бутон! Я изменил его на это сейчас. File.open ('doc/release.yml', 'w') {| f | f.write comment_block; f.write versions.to_yaml} ', метод' comment_block' просто возвращает строчную версию блока комментариев. Это сработало :) – TheLegend

1

Это возможное решение.

require 'yaml' 

versions_yaml = File.read('release.yml') 
versions = YAML.load(versions_yaml) 
comments = versions_yaml.scan(/^#.*?$/) 

File.open("release2.yml", 'w') { |f| 
    f.puts comments 
    YAML.dump(versions, f) 
} 

puts File.read("release2.yml") 

С release.yml:

# I'm a comment on first line 
--- 
- 1 
- 2 
- 3 
# I'm a comment somewhere in the middle 
- - 4 
    - 5 

выводит:

# I'm a comment on first line 
# I'm a comment somewhere in the middle 
--- 
- 1 
- 2 
- 3 
- - 4 
    - 5 
+1

Мне очень нравится этот подход, потому что он не создает какой-то другой источник истины. Комментарии - это комментарии. – TheLegend