class Wunderlist::API

The API class provides access to the Wunderlist API over HTTP.

Attributes

domain[R]

Domain of the Wunderlist API

email[R]

Your email address from login

path[R]

Path of the Wunderlist API

session[R]

Wunderlist Session ID

Public Class Methods

new(domain = "www.wunderlist.com", path = "/") click to toggle source
# File lib/wunderlist/api.rb, line 53
def initialize(domain = "www.wunderlist.com", path = "/")
  @domain = domain
  @path = path
  @http = Net::HTTP.new(@domain)
  @logged_in = false
end

Public Instance Methods

create_list(name) click to toggle source

Create new empty List

# File lib/wunderlist/api.rb, line 132
def create_list(name)
  Wunderlist::List.new(name, false, self).save
end
destroy(obj) click to toggle source

Destroy List or Task

# File lib/wunderlist/api.rb, line 148
def destroy(obj)
  if obj.is_a? Wunderlist::List
    return destroy_list obj
  elsif obj.is_a? Wunderlist::Task
    return destroy_task obj
  end
end
flush() click to toggle source

Delete internal list caching

# File lib/wunderlist/api.rb, line 85
def flush
  @lists = nil
end
inbox() click to toggle source

Get INBOX list

# File lib/wunderlist/api.rb, line 98
def inbox
  lists.values.detect { |list| list.inbox }
end
lists() click to toggle source

Return all lists

# File lib/wunderlist/api.rb, line 91
def lists
  @lists = load_lists if @lists == nil
  @lists
end
login(email, password) click to toggle source

Request new session and connects it with your login credentials

# File lib/wunderlist/api.rb, line 62
def login(email, password)
  get_session if @session == nil
  return true if @logged_in
  @email = email

  req = prepare_request(Net::HTTP::Post.new "#{@path}/ajax/user")
  req.set_form_data({ "email" => @email, "password" => Digest::MD5.hexdigest(password) })
  res = JSON.parse(@http.request(req).body)

  @logged_in = true if res["code"] == 200
  @logged_in
end
login_by_session(sessid) click to toggle source

Login with a session ID without login credentials

# File lib/wunderlist/api.rb, line 77
def login_by_session(sessid)
  return if @logged_in
  @logged_in = true
  @session = sessid
end
save(obj) click to toggle source

Save List or Task

# File lib/wunderlist/api.rb, line 138
def save(obj)
  if obj.is_a? Wunderlist::List
    return save_list obj
  elsif obj.is_a? Wunderlist::Task
    return save_task obj
  end
end
tasks(list) click to toggle source

Load and parse tasks from Wunderlist API

# File lib/wunderlist/api.rb, line 104
def tasks(list)
  list_obj = list.is_a?(Wunderlist::List) ? list : lists[list]
  list = list.id if list.is_a? Wunderlist::List

  request = prepare_request(Net::HTTP::Get.new "#{@path}/ajax/lists/id/#{list}")
  response = @http.request request
  result = []

  Nokogiri::HTML(JSON.parse(response.body)["data"]).css("li.more").each do |html_task|
    task = Wunderlist::Task.new
    task.id = html_task.attributes["id"].value.to_i
    task.name = html_task.css("span.description").first.content
    task.important = html_task.css("span.fav").empty? ? false : true
    task.done = html_task.attributes["class"].value.split(" ").include?("done")
    html_timestamp = html_task.css("span.timestamp")
    task.date = Time.at(html_timestamp.first.attributes["rel"].
    value.to_i).to_date unless html_timestamp.empty?
    task.api = self
    task.list = list_obj

    result << task
  end

  result
end

Protected Instance Methods

destroy_list(obj) click to toggle source
# File lib/wunderlist/api.rb, line 157
def destroy_list(obj)
  json_data = { "id" => obj.id, "deleted" => 1 }
  request = prepare_request(Net::HTTP::Post.new "#{@path}/ajax/lists/update")
  request.set_form_data "list" => json_data.to_json
  response = @http.request request
  response_json = JSON.parse(response.body)

  if response_json["status"] == "success"
    obj.id = nil
    return obj
  end

  false
end
destroy_task(obj) click to toggle source
# File lib/wunderlist/api.rb, line 172
def destroy_task(obj)
  json_data = {"list_id" => obj.list_id, "name" => obj.name, "deleted" => 1}

  request = prepare_request(Net::NTTP::Post.new "#{@path}/ajax/tasks/update")
  request.set_form_data "task" => json_data
  response = @http.request request
  response_json = JSON.parse(response.body)

  if response_json["status"] == "success"
    obj.id = nil
    return obj
  end

  false
end
get_session() click to toggle source
# File lib/wunderlist/api.rb, line 261
def get_session
  res = @http.request_get("#{@path}/account")
  @session = res["Set-Cookie"].match(/WLSESSID=([0-9a-zA-Z]+)/)[1]
end
load_lists() click to toggle source
# File lib/wunderlist/api.rb, line 266
def load_lists
  request = prepare_request(Net::HTTP::Get.new "#{@path}/ajax/lists/all")
  response = @http.request request
  result = {}
  
  JSON.parse(response.body)["data"].each do |list_elem|
    list = Wunderlist::List.new
    list.id = list_elem[0].to_i
    list.name = list_elem[1]["name"]
    list.inbox = list_elem[1]["inbox"] == "1" ? true : false
    list.shared = list_elem[1]["shared"] == "1" ? true : false
    list.api = self

    result[list.id] = list
  end

  result
end
prepare_request(req) click to toggle source
# File lib/wunderlist/api.rb, line 285
def prepare_request(req)
  req["Cookie"] = "WLSESSID=#{@session}"
  req
end
save_list(obj) click to toggle source
# File lib/wunderlist/api.rb, line 228
def save_list(obj)
  return update_list(obj) if obj.id

  json_data = {"name" => obj.name}
  request = prepare_request(Net::HTTP::Post.new "#{@path}/ajax/lists/insert")
  request.set_form_data "list" => json_data.to_json
  response = @http.request request
  response_json = JSON.parse(response.body)

  if response_json["status"] == "success"
    obj.id = response_json["id"]
    return obj
  end

  nil
end
save_task(obj) click to toggle source
# File lib/wunderlist/api.rb, line 188
def save_task(obj)
  return update_task(obj) if obj.id

  json_data = {"list_id" => obj.list.id, "name" => obj.name, "date" => 0}
  json_data["date"] = obj.date.to_time.to_i if obj.date

  request = prepare_request(Net::HTTP::Post.new "#{@path}/ajax/tasks/insert")
  request.set_form_data "task" => json_data.to_json
  response = @http.request request
  response_json = JSON.parse(response.body)

  if response_json["status"] == "success"
    obj.id = response_json["id"]
    obj.list.tasks << obj
    return obj
  end

  nil
end
update_list(obj) click to toggle source
# File lib/wunderlist/api.rb, line 245
def update_list(obj)
  json_data = {}
  json_data["id"] = obj.id
  json_data["name"] = obj.name

  request = prepare_request(Net::HTTP::Post.new "#{@path}/ajax/lists/update")
  request.set_form_data "list" => json_data.to_json
  response = @http.request request

  if JSON.parse(response.body)["status"] == "success"
    return obj
  end

  nil
end
update_task(obj) click to toggle source
# File lib/wunderlist/api.rb, line 208
def update_task(obj)
  json_data = {}
  json_data["id"] = obj.id
  json_data["important"] = obj.important ? 1 : 0
  json_data["done"] = obj.done ? 1 : 0
  json_data["name"] = obj.name
  json_data["date"] = obj.date ? obj.date.to_time.to_i.to_s : "0"

  request = prepare_request(Net::HTTP::Post.new "#{@path}/ajax/tasks/update")
  request.set_form_data "task" => json_data.to_json
  response = @http.request request
  response_json = JSON.parse response.body

  if response_json["status"] == "success"
    return obj
  end

  nil
end