Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
#!/usr/bin/env ruby MY_TASKO_ID = 1111 # Put your key here MY_TASKO_KEY = 'aaa' # Put your Tasko API key here MY_TASKS_DIR = File.join(ENV['HOME'], 'Tasks') require 'yaml' require 'digest/md5' require 'xmlrpc/client' class String def md5 Digest::MD5::hexdigest(self) end end module XMLRPC module ParseContentType def parse_content_type(str) ["text/xml", "utf-8"] end end end class TaskoAPI XMLRPC::Config.module_eval { remove_const(:ENABLE_NIL_PARSER) } XMLRPC::Config.const_set(:ENABLE_NIL_PARSER, true) URL = "http://taskodone.com/api" def initialize(id, pass) @id = id @pass = pass end def client XMLRPC::Client.new2(URL) end private :client def papers client.call("papers", @id, @pass) end def paper(name) client.call("paper", @id, @pass, name) end def rename(old, new) client.call("rename", @id, @pass, old, new) end def edit(name, data) client.call("edit", @id, @pass, name, data) end def newpaper(name, data = "") client.call("new", @id, @pass, name, data) end def delete(name) client.call("delete", @id, @pass, name) end end class TaskoSyncer EXT = '.taskpaper' def initialize(id, pass, dir = nil, summary_file = nil) @tasko = TaskoAPI.new(id, pass) @dir ||= File.join(ENV['HOME'], 'Tasks') @summary_file ||= File.join(ENV['HOME'], '.tasko.yml') @summary = YAML::load(File.read(@summary_file)) rescue {} end def write_task_file(paper, data) File.open(File.join(@dir, paper + '.taskpaper'), 'w') do |f| f.write data end update_summary(paper, data) end def update_summary(paper, data) @summary[paper] = data.md5 end def save_summary File.open(@summary_file, 'w') do |f| f.write @summary.to_yaml end end def local_files Dir[File.join(@dir, "*#{EXT}")] end def summary_match?(paper, data) !@summary[paper].nil? and @summary[paper] == data.md5 end def sync begin papers = @tasko.papers local_files.each do |file| paper = File.basename(file, EXT) data = File.read(file) if summary_match?(paper, data) remote_data = @tasko.paper(paper) if data != remote_data puts "Pulling #{paper}" write_task_file(paper, remote_data) end papers.delete(paper) else puts "Pushing #{paper}" if papers.delete(paper) @tasko.edit(paper, data) else @tasko.newpaper(paper, data) end update_summary(paper, data) end end papers.each do |paper| if @summary[paper].nil? puts "Adding #{paper}" data = @tasko.paper(paper) write_task_file(paper, data) else puts "Deleting #{paper}" @tasko.delete(paper) @summary.delete(paper) end end save_summary rescue SocketError puts "No internet connection" end end end TaskoSyncer.new(MY_TASKO_ID, MY_TASKO_KEY, MY_TASKS_DIR).sync
This paste will be private.
From the Design Piracy series on my blog: