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
冗長な気がする。もっといいデータの持ち方がありそう。でも寝る。おやすみ。