todoist_client 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: daaf0e3c2b23ff8f526a58e0c4bcaba96d7c8ab0
4
- data.tar.gz: 7801782fffd4985061175702c616c43dcad303e7
3
+ metadata.gz: c2b2d7aee3f1adc50907f02b6e661a49b62a5b52
4
+ data.tar.gz: d19483330538c142f0c6a4b372e9a9a3bb514760
5
5
  SHA512:
6
- metadata.gz: c4b7df3adb7bf4ba4ca3c7f96585a9376796086c5aac866d27aa3432dd043fdd772a8267f2a70a531b0ff3b6128d69d7677b4b4f7c73c909f5418dd59783a61b
7
- data.tar.gz: bc0641e163de0eb16f1b761143b4817df1cccceb2a3b219734d3a4bbd3e948658c42eef88b1edf4d29f8f8797dc42c887234d3f35f89f42c26640059c121a222
6
+ metadata.gz: 7b0ec160b53fee8a9d4b61c02bbd279b177f0da891932bd90cdc0f8fd2912ea5425ea9f8a0fb10942aee4cf11771355515858803b3ff9fdc413be5f92d88485c
7
+ data.tar.gz: d811f07f039f85fc7396182b83dc155804815872cf598d506e9670e76c488cb9aa2adb48167d76d0c95a4651d3d31fb8e2f12aed06cd19c225538d0597b28c58
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # TodoistClient
2
2
 
3
- TODO: Write a gem description
3
+ [![Gem Version](https://badge.fury.io/rb/todoist_client.svg)](http://badge.fury.io/rb/todoist_client)
4
+
5
+ Todoist API Client.
4
6
 
5
7
  ## Installation
6
8
 
@@ -18,7 +20,57 @@ Or install it yourself as:
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
23
+ #### API Token
24
+
25
+ Copy from account setting in Todoist.
26
+
27
+ ```
28
+ TodoistClient.api_token = 'some_api_token'
29
+ ```
30
+
31
+ #### Project
32
+
33
+ ```
34
+ # create project
35
+ project = TodoistClient::Project.create(name: "SomeProject")
36
+ puts [project.id, project.name].join(":") # => 123:SomeProject
37
+
38
+ project = TodoistClient::Project.find(some_id)
39
+ project.name = "OtherProject"
40
+ project.save # => update
41
+ project.delete # => delete
42
+
43
+ TodoistClient::Project.all.each do |project|
44
+ # number of uncompleted tasks
45
+ puts project.uncompleted_items.size
46
+ end
47
+ ```
48
+
49
+ #### Item
50
+
51
+ ```
52
+ # create item
53
+ item = TodoistClient::Item.create(content: "SomeTask")
54
+ puts [item.id, item.content] # => 123:SomeTask
55
+
56
+ item = TodoistClient::Item.find(some_id)
57
+ item.finished? # => false (if incomplete item)
58
+ item.content = "OtherTask"
59
+ item.save # => update
60
+ item.complete # => to complete
61
+ item.uncomplete # => to uncomplete
62
+ item.delete # => delete
63
+
64
+ project = TodoistClient::Project.find(some_id)
65
+ TodoistClient::Item.uncompleted(project).each do |item|
66
+ item.complete
67
+ end
68
+
69
+ # only premium user
70
+ TodoistClient::Item.completed_items.each do |completed_item|
71
+ puts [completed_item.completed_date.to_s, completed_item.content].join(":")
72
+ end
73
+ ```
22
74
 
23
75
  ## Contributing
24
76
 
@@ -6,15 +6,27 @@ module TodoistClient
6
6
  klass.extend ClassMethods
7
7
  end
8
8
 
9
+ def with_remote_object(&block)
10
+ if id
11
+ block.call if block_given?
12
+ else
13
+ raise RemoteObjectNotExists
14
+ end
15
+ end
16
+
17
+ def set_params(params)
18
+ params.each do |k,v|
19
+ self.send "#{k}=", v if self.respond_to? "#{k}="
20
+ end
21
+ end
22
+
9
23
  module ClassMethods
10
24
  def request(method, endpoint, params = nil)
11
- p "#{BASE_URI}#{endpoint}"
12
- p query_string(params)
13
25
  JSON.load RestClient.send(method, "#{BASE_URI}#{endpoint}", query_string(params))
14
26
  end
15
27
 
16
28
  def query_string(params = nil)
17
- raise NoApiToken, "API Token not find" unless TodoistClient.api_token
29
+ raise NoApiToken unless TodoistClient.api_token
18
30
  params ||= {}
19
31
  {
20
32
  params: {
@@ -0,0 +1,39 @@
1
+ module TodoistClient
2
+ # only premium user
3
+ class CompletedItem
4
+ include ApiClient
5
+
6
+ VALID_PARAMS = [
7
+ :content,
8
+ :meta_data,
9
+ :user_id,
10
+ :task_id,
11
+ :note_count,
12
+ :project_id,
13
+ :completed_date,
14
+ :id
15
+ ].freeze
16
+
17
+ attr_accessor *VALID_PARAMS
18
+
19
+ def initialize(params)
20
+ raise ArgumentError if params["id"].nil?
21
+ set_params(params)
22
+ end
23
+
24
+ def completed_date=(date_string)
25
+ @completed_date = case
26
+ when date_string.is_a?(String)
27
+ Time.parse(date_string)
28
+ when date_string.is_a?(Time)
29
+ date_string
30
+ else
31
+ raise ArgumentError
32
+ end
33
+ end
34
+
35
+ def to_item
36
+ Item.find(@task_id)
37
+ end
38
+ end
39
+ end
@@ -1,4 +1,5 @@
1
1
  module TodoistClient
2
2
  class TodoistClientError < StandardError; end
3
3
  class NoApiToken < TodoistClientError; end
4
+ class RemoteObjectNotExists < TodoistClientError; end
4
5
  end
@@ -22,6 +22,7 @@ module TodoistClient
22
22
  module Paths
23
23
  UNCOMPLETED = [:get, "/API/getUncompletedItems"]
24
24
  COMPLETED = [:get, "/API/getCompletedItems"]
25
+ ALL_COMPLETED = [:get, "/API/getAllCompletedItems"]
25
26
  FIND = [:get, "/API/getItemsById"]
26
27
  ADD = [:get, "/API/addItem"]
27
28
  UPDATE = [:get, "/API/updateItem"]
@@ -31,59 +32,87 @@ module TodoistClient
31
32
  end
32
33
 
33
34
  def initialize(params = nil)
34
- set_params(params) if params
35
+ case
36
+ when params.is_a?(String)
37
+ @content = params
38
+ when params.is_a?(Hash)
39
+ set_params(params)
40
+ end
35
41
  end
36
42
 
37
43
  def save
38
44
  if id
39
45
  json = self.class.request *Paths::UPDATE, {
40
- id: id,
41
- content: content
42
- }
46
+ id: @id, # required
47
+ content: @content,
48
+ priority: @priority,
49
+ indent: @indent,
50
+ item_order: @item_order,
51
+ collapsed: @collapsed
52
+ }.select {|k,v| !v.nil?}
43
53
  else
44
54
  json = self.class.request *Paths::ADD, {
45
- content: content,
46
- project_id: project_id
47
- }
55
+ content: @content, # required
56
+ project_id: @project_id,
57
+ date_string: @date_string,
58
+ priority: @priority,
59
+ indent: @indent,
60
+ item_order: @item_order
61
+ }.select {|k,v| !v.nil?}
48
62
  end
49
63
  set_params(json)
64
+ self
50
65
  end
51
66
 
52
67
  def delete
53
- self.class.request *Paths::DELETE, {ids: JSON.generate([id])} if id
68
+ with_remote_object do
69
+ self.class.request *Paths::DELETE, {ids: JSON.generate([id])}
70
+ end
54
71
  end
55
72
 
56
73
  def complete
57
- self.class.request *Paths::COMPLETE, {ids: JSON.generate([id])} if id
74
+ with_remote_object do
75
+ self.class.request *Paths::COMPLETE, {ids: JSON.generate([id])}
76
+ end
58
77
  end
59
78
 
60
79
  def uncomplete
61
- self.class.request *Paths::UNCOMPLETE, {ids: JSON.generate([id])} if id
80
+ with_remote_object do
81
+ self.class.request *Paths::UNCOMPLETE, {ids: JSON.generate([id])}
82
+ end
62
83
  end
63
84
 
64
- def set_params(params)
65
- params.each do |k,v|
66
- self.send "#{k}=", v if self.respond_to? "#{k}="
67
- end
85
+ def finished?
86
+ checked == 1
68
87
  end
69
88
 
70
89
  class << self
71
- def uncompleted(project_id)
72
- request(*Paths::UNCOMPLETED, {project_id: project_id}).map { |item|
73
- self.new(item)
74
- }
90
+ def uncompleted(project)
91
+ project_id = project.is_a?(Project) ? project.id : project
92
+ request(*Paths::UNCOMPLETED, {project_id: project_id}).map {|item| self.new(item)}
93
+ end
94
+
95
+ def completed(project)
96
+ project_id = project.is_a?(Project) ? project.id : project
97
+ request(*Paths::COMPLETED, {project_id: project_id}).map {|item| self.new(item)}
75
98
  end
76
99
 
77
- def completed(project_id)
78
- request(*Paths::COMPLETED, {project_id: project_id}).map { |item|
79
- self.new(item)
100
+ # only premium user
101
+ def completed_items(project = nil)
102
+ project_id = project.is_a?(Project) ? project.id : project
103
+ request(*Paths::ALL_COMPLETED, {project_id: project_id})["items"].map {|item|
104
+ CompletedItem.new(item)
80
105
  }
81
106
  end
82
107
 
83
108
  def find(ids)
84
- request(*Paths::FIND, {ids: json_ids(ids)}).map { |item|
85
- self.new(item)
86
- }
109
+ items = request(*Paths::FIND, {ids: json_ids(ids)}).map {|item| self.new(item)}
110
+ # return nil or Item object if item does not exist multiple.
111
+ items.size > 1 ? items : items.first
112
+ end
113
+
114
+ def create(params)
115
+ self.new(params).save
87
116
  end
88
117
 
89
118
  def delete_all(ids)
@@ -22,57 +22,70 @@ module TodoistClient
22
22
  ADD = [:get, "/API/addProject"]
23
23
  UPDATE = [:get, "/API/updateProject"]
24
24
  DELETE = [:get, "/API/deleteProject"]
25
- # ARCHIVE = [:get, "/API/archiveProject"]
26
- # UNARCHIVE = [:get, "/API/unarchiveProject"]
25
+ ARCHIVE = [:get, "/API/archiveProject"]
26
+ UNARCHIVE = [:get, "/API/unarchiveProject"]
27
27
  end
28
28
 
29
29
  def initialize(params = nil)
30
- set_params(params) if params
30
+ case
31
+ when params.is_a?(String)
32
+ @name = params
33
+ when params.is_a?(Hash)
34
+ set_params(params)
35
+ end
31
36
  end
32
37
 
33
38
  def save
34
39
  if id
35
40
  json = self.class.request *Paths::UPDATE, {
36
- project_id: id,
37
- name: name,
38
- color: color,
39
- indent: indent,
40
- order: item_order
41
- }
41
+ project_id: @id, # required
42
+ name: @name,
43
+ color: @color,
44
+ indent: @indent,
45
+ order: @item_order
46
+ }.select {|k,v| !v.nil?}
42
47
  else
43
48
  json = self.class.request *Paths::ADD, {
44
- name: name,
45
- color: color,
46
- indent: indent,
47
- order: item_order
48
- }
49
+ name: @name, # required
50
+ color: @color,
51
+ indent: @indent,
52
+ order: @item_order
53
+ }.select {|k,v| !v.nil?}
49
54
  end
50
55
  set_params(json)
56
+ self
51
57
  end
52
58
 
53
59
  def delete
54
- self.class.request *Paths::DELETE, {project_id: id} if id
60
+ with_remote_object do
61
+ self.class.request *Paths::DELETE, {project_id: id}
62
+ end
55
63
  end
56
64
 
57
- # def archive
58
- # self.class.request *Paths::ARCHIVE, {project_id: id} if id
59
- # end
65
+ # only premium user
66
+ def archive
67
+ with_remote_object do
68
+ self.class.request *Paths::ARCHIVE, {project_id: id}
69
+ end
70
+ end
60
71
 
61
- # def unarchive
62
- # self.class.request *Paths::UNARCHIVE, {project_id: id} if id
63
- # end
72
+ # only premium user
73
+ def unarchive
74
+ with_remote_object do
75
+ self.class.request *Paths::UNARCHIVE, {project_id: id}
76
+ end
77
+ end
64
78
 
65
79
  def uncompleted_items
66
- Item.uncompleted(id) if id
80
+ with_remote_object do
81
+ Item.uncompleted(id)
82
+ end
67
83
  end
68
84
 
85
+ # only premium user
69
86
  def completed_items
70
- Item.completed(id) if id
71
- end
72
-
73
- def set_params(params)
74
- params.each do |k,v|
75
- self.send "#{k}=", v if self.respond_to? "#{k}="
87
+ with_remote_object do
88
+ Item.completed_items(id)
76
89
  end
77
90
  end
78
91
 
@@ -85,8 +98,8 @@ module TodoistClient
85
98
  self.new(request(*Paths::FIND, {project_id: id}))
86
99
  end
87
100
 
88
- def create(name)
89
- self.new(name).save
101
+ def create(params)
102
+ self.new(params).save
90
103
  end
91
104
  end
92
105
  end
@@ -1,3 +1,3 @@
1
1
  module TodoistClient
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -6,4 +6,5 @@ require "todoist_client/errors"
6
6
  require "todoist_client/api_client"
7
7
  require "todoist_client/project"
8
8
  require "todoist_client/item"
9
+ require "todoist_client/completed_item"
9
10
  require "todoist_client/version"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: todoist_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - i2bskn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-01 00:00:00.000000000 Z
11
+ date: 2014-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -81,6 +81,7 @@ files:
81
81
  - lib/todoist_client.rb
82
82
  - lib/todoist_client/api_client.rb
83
83
  - lib/todoist_client/base.rb
84
+ - lib/todoist_client/completed_item.rb
84
85
  - lib/todoist_client/errors.rb
85
86
  - lib/todoist_client/item.rb
86
87
  - lib/todoist_client/project.rb