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 #