Ruby-YAML形式ファイルを操作する

RubyのYAML(YAML Ain't Markup Language)について

YAML を Ruby で使う

Ruby 1.8以降では、YAMLを利用するためのライブラリが標準添付されています。

以下のライブラリを要求します。( 「require 'yaml/store'」でもかまいません )


require 'yaml'

YAMLファイルの読み込み

YAML形式で記述されたファイルを読み込むには、以下のメソッドを呼び出します。


data = YAML.load_file(filename)

YAMLファイルの出力

ファイルにYAML形式でデータを出力するには、以下のメソッドを呼び出します。


open(filename,"w") do |e|
  YAML.dump(data, e)
end

YAMLに変換する

Rubyのオブジェクトは、YAML文字列へ簡単に変換することができます。


# YAMLへ変換
obj.to_yaml

Ruby YAMLサンプル

ユーザとパスワード情報をYAML形式で扱います。


#!/usr/bin/ruby

require 'yaml'

class Usrmgr
  def initialize(infofile)
    @infofile = infofile
    @infodata = read_infofile()
  end

  #!
  # @brief     ユーザを追加する
  # @param[in] username ユーザ名
  # @param[in] password パスワード
  #
  def useradd(username, password)
    return(false) if(is_exist_user(username))
    @infodata << {"username" => username, "password" => password}
    return(true)
  end

  #!
  # @brief     ユーザを削除する
  # @param[in] username ユーザ名
  # @param[in] password パスワード
  #
  def userdel(username, password)
    @infodata.each_with_index do |e, i|
      if(e["username"] == username)
        @infodata.delete_at(i)
        return(true)
      end
    end
    return(false)
  end

  #!
  # @brief     パスワードを取得する
  # @param[in] username ユーザ名
  #
  def get_password(username)
    @infodata.each do |e|
      return(e["password"]) if(e["username"] == username)
    end
    return("")
  end

  #!  
  # @brief    ユーザ情報ファイルを出力する
  #   
  def update()
    swapfile = "#{@infofile}.swap"
  
    open(swapfile,"w") do |e| 
      YAML.dump(@infodata, e)
    end 
    # 元ファイルを削除して置き換える
    File.delete(@infofile) if(FileTest.exist?(@infofile))
    File.rename(swapfile, @infofile)
  end 

  private
  #!  
  # @brief    ユーザ情報ファイルを読み込み
  #   
  def read_infofile()
    if(FileTest.exist?(@infofile))
      infodata = YAML.load_file(@infofile)
    else
      infodata = []
    end 
    return(infodata)
  end 

  #!
  # @brief     ユーザが存在するか確認する
  # @param[in] username ユーザ名
  # @return    true     ユーザは登録済み
  # @return    false    ユーザは未登録
  #
  def is_exist_user(username)
    @infodata.each do |e|
      return(true) if(e["username"] == username)
    end
    return(false)
  end
end

if(__FILE__ == $0)
  umgr = Usrmgr.new("./passwd")
  umgr.useradd("user1", "password1")
  umgr.useradd("user2", "password2")
  umgr.update
  p umgr.get_password("user2")
end


関連ページ