2008-03-14

Pstoreを利用したタスク管理

RubyのPstoreのお勉強。

PstoreはRubyのオブジェクトをバイナリ形式でファイルに保存することができる。オブジェクトのまま保存できるので、

  • テキストみたいにファイルフォーマットとか考えないでいい。
  • DB不要。
  • 可変長のデータをさくっと扱える。

みたいなメリットがある。逆にデメリットは、

  • バイナリなのでファイルを直接編集するのは厳しい。

まあとにかく、Pstoreを使ってタスク管理をするためのクラスを実装してみた。

#!/usr/local/bin/ruby

require 'pstore'
require 'date'

class MyTask
  def initialize(filepath)
    @db = PStore.new(filepath)

    @db.transaction do
      unless @db[:max_id]
        @db[:max_id] = 0
        @db[:tasks] = []
      end
    end
  end

  def list_all
    @db.transaction(true) do
      @db[:tasks]
    end
  end

  def list_done
    done_tasks = []
    @db.transaction(true) do
      @db[:tasks].each do |task|
        done_tasks << task if task[:status]
      end
      done_tasks
    end
  end

  def list_yet
    yet_tasks = []
    @db.transaction(true) do
      @db[:tasks].each do |task|
        yet_tasks << task unless task[:status]
      end
      yet_tasks
    end
  end

  def add(task_name)
    new_task = { :name => task_name, :date => Date.today, :status => false }
    @db.transaction do
      new_task[:id] = @db[:max_id] += 1
      @db[:tasks] << new_task
    end
  end

  def delete(id)
    @db.transaction do
      @db[:tasks].each_index do |index|
        if @db[:tasks][index][:id] == id
          @db[:tasks].delete_at(index)
          @db.commit
        end
      end
    end
  end

  def done(id)
    @db.transaction do
      @db[:tasks].each do |task|
        task[:status] = true if task[:id] == id
      end
    end
  end

  def yet(id)
    @db.transaction do
      @db[:tasks].each do |task|
        task[:status] = false if task[:id] == id
      end
    end
  end
end

# インスタンス作成
task = MyTask.new("./hoge")

# タスク追加
task.add('部屋の片付け')
task.add('パンツの受け取り')
task.add('クリーニング')

# タスク一覧
#task.list_all.each do |task|
  puts "#{task[:id]}: #{task[:name]} - #{task[:status]}"
end

冗長な気がする。もっといいデータの持ち方がありそう。でも寝る。おやすみ。

Posted at 01:53 in | WriteBacks (32) | Edit