require 'rexml/document'
require 'date'
GOOD = 'GOOD'
NORMAL = 'NORMAL'
BAD = 'BAD'
class Niko2Api
attr_reader :workspace
attr_accessor :userFeelings
def initialize(workspace)
@workspace = workspace
end
def niko2files()
return Dir[@workspace + '/niko2/*.xml']
end
def paste(year, month, day, email, comment, feeling)
date = create_date_string(Date.new(year, month, day))
@userFeelings.each do |uf|
if uf.user.email == email
feelingItem = nil
uf.feelingItems.each do |fi|
if fi.date == date
feelingItem = fi
end
end
if feelingItem == nil
feelingItem = FeelingItem.new(date)
uf.feelingItems << feelingItem
end
feelingItem.comment = comment
feelingItem.feeling = feeling
end
end
end
def find(year, month, day)
d = create_date_string(Date.new(year, month, day))
ufs = []
@userFeelings.each do |uf|
fis = []
uf.feelingItems.each do |fi|
if fi.date == d
fis << fi
end
end
if fis.size > 0
ufs << UserFeeling.new(uf.user, fis)
end
end
return ufs
end
def paste_today(email, comment, feeling)
t = Date.today
return paste(t.year, t.month, t.day, email, comment, feeling)
end
def find_today()
t = Date.today
return find(t.year, t.month, t.day)
end
def save()
@userFeelings.each do |uf|
email = uf.user.email
file = @workspace + '/niko2/' + email + '.xml'
File.open(file, 'w') do |file|
file.print(uf.to_xml)
end
end
end
def load()
@userFeelings = []
niko2files().each do |file|
xml = REXML::Document.new(File.open(file))
@userFeelings << UserFeeling.create(xml)
end
return @userFeelings
end
end
class UserFeeling
attr_reader :user, :feelingItems
def initialize(user, feelingItems)
@user = user
@feelingItems = feelingItems
end
def to_xml
fis_xml = ''
@feelingItems.each do |fi|
fis_xml += fi.to_xml
end
fis_xml += ''
s = '' +
'' +
@user.to_xml +
fis_xml +
''
return s
end
def to_s
s = @user.to_s
@feelingItems.each do |fi|
s += fi.to_s
end
return s
end
def self.create(element)
element_uf = element.get_elements('UserFeeling')[0]
user = User.create(element_uf.get_elements('user')[0])
feelingItems = []
element_uf.get_elements('feelingItems/FeelingItem').each do |fi|
feelingItems << FeelingItem.create(fi)
end
return UserFeeling.new(user, feelingItems)
end
end
class User
attr_reader :email, :name
def initialize(email, name)
@email = email
@name = name
end
def to_xml
s = '' +
'' + @email + '' +
'' + @name + '' +
''
return s
end
def to_s
return "email:" + @email + ", name:" + @name + "\n"
end
def self.create(element)
email = get_element_text(element, 'email')
name = get_element_text(element, 'name')
return User.new(email, name)
end
end
class FeelingItem
attr_reader :date, :comment, :feeling
def initialize(date, comment = '', feeling = NORMAL)
@date = date
self.comment=(comment)
self.feeling=(feeling)
end
def comment=(comment)
if comment == nil
@comment = ''
return
end
comment.gsub!('&', '&')
comment.gsub!('<', '<')
comment.gsub!('>', '>')
@comment = comment
end
def feeling=(feeling)
if not [GOOD, NORMAL, BAD].include?(feeling)
raise ArgumentError
end
@feeling = feeling
end
def to_xml
s = '' +
'' + @date + '' +
'' + @comment + '' +
'' + @feeling + '' +
''
return s
end
def to_s
return 'date:' + @date + ', comment:' + @comment + ', feeling:' + @feeling + "\n"
end
def self.create(element)
date = get_element_text(element, 'date')
fi = FeelingItem.new(date)
fi.comment = get_element_text(element, 'comment')
fi.feeling = get_element_text(element, 'feeling')
return fi
end
end
def get_element_text(element, name)
child = element.get_elements(name)[0]
if not child
return nil
end
if not child.text
return nil
end
return child.text
end
def create_date_string(date)
return date.to_s + " 00:00:00.0 JST"
end
if $0 == __FILE__
TimeShift.new().change(ARGV[0], ARGV[1], ARGV[2].to_i)
end
# require 'rexml/document'
# require 'csv'
# require 'nkf'
#
# ROW_NAMES = ["iterationId", "storyId", "name",
# "status", "estimate", "signedUp",
# "todoDate", "doingDate", "doneDate"]
#
# def getElementText(element, name)
# child = element.elements[name]
# if not child
# return nil
# end
# if not child.text
# return nil
# end
# return NKF.nkf("-s", child.text)
# end
#
# CSV.open("tasks.csv","w") do |writer|
# writer << ROW_NAMES
#
# Dir["../tasks/iteration_*.xml"].each do |filename|
# File.open(filename) do |file|
# doc = REXML::Document.new(file)
# doc.elements.each('PlanImpl/tasks/Task') do |element|
# column = []
# ROW_NAMES.each do |row_name|
# column << getElementText(element, row_name)
# end
# writer << column
# end
# end
# end
# end
#