Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
  • 4 commits
  • 4 files changed
  • 0 comments
  • 2 contributors
23  README.rdoc
Source Rendered
... ...
@@ -1,6 +1,6 @@
1 1
 = toggl
2 2
 
3  
-Toggl API wrapper in a Ruby gem
  3
+Toggl API wrapper in a Ruby gem, this is compatible with v6 of the API
4 4
 
5 5
 https://www.toggl.com
6 6
 
@@ -12,6 +12,27 @@ If you want to create new tasks from the command line, make sure you create ~/.t
12 12
 
13 13
 run 'toggl' to see all options.
14 14
 
  15
+NOTE: the command line tool is currently broken and needs to be updated for V6 of the API
  16
+
  17
+== examples
  18
+
  19
+ toggl_interface = Toggl.new(token, "blah")
  20
+
  21
+ toggl_interface.time_entries
  22
+
  23
+ toggl_interface.time_entries({"start_date" => Date.today-1, "end_date" => Date.today})
  24
+
  25
+ toggl_interface.get_time_entry(12345)
  26
+
  27
+ toggl_interface.delete_time_entry(12345)
  28
+
  29
+ entry = toggl_interface.create_time_entry({ "duration" => 900, :start => Time.now, :description => "blabla"})
  30
+
  31
+ toggl_interface.update_time_entry(entry)
  32
+
  33
+similar methods exist for clients, projects, and tasks, check the source while we work on better documentation
  34
+
  35
+
15 36
 == Copyright
16 37
 
17 38
 Copyright (c) 2010 Koen Van der Auwera. See LICENSE for details.
128  lib/toggl.rb
... ...
@@ -1,11 +1,13 @@
1 1
 require "rubygems"
2 2
 require "httparty"
3 3
 require "chronic_duration"
  4
+require "multi_json"
4 5
 
5 6
 class Toggl
6 7
   include HTTParty
7  
-  base_uri "https://toggl.com"
  8
+  base_uri "https://www.toggl.com"
8 9
   format :json
  10
+  headers  "Content-Type" => "application/json"
9 11
 
10 12
   attr_reader :name, :api_token
11 13
 
@@ -14,35 +16,12 @@ def initialize(token, name="toggl-gem", debug=false)
14 16
     @api_token = token
15 17
     @name = name
16 18
     self.class.debug_output if debug
  19
+    auth
17 20
   end
18 21
 
19  
-  def delete_task(task_id)
20  
-    delete 'tasks', task_id
21  
-  end
22  
-
23  
-  def create_task(params={})
24  
-    workspace   = params[:workspace] || default_workspace_id
25  
-    project_id  = find_project_id(params[:project]) || create_project(params, workspace)
26  
-    params[:billable] = true
27  
-
28  
-    params.merge!({ :created_with => name,
29  
-                    :workspace => {:id => workspace},
30  
-                    :project => {:id => project_id},
31  
-                    :tag_names => [name],
32  
-                    :start => start(params[:start]),
33  
-                    :duration => duration(params[:duration])})
34  
-
35  
-    post 'tasks', {:task => params}
36  
-  end
37  
-
38  
-  def create_project(params={}, workspace=nil)
39  
-    workspace ||= default_workspace_id
40  
-    if project = post("projects",
41  
-                      :project => {:name => params[:project],
42  
-                                   :workspace => {:id => workspace},
43  
-                                   :billable => (params[:billable] || true)})
44  
-       project["id"]
45  
-     end
  22
+  def auth
  23
+    session_response = get "sessions"
  24
+    self.class.default_cookies.add_cookies(session_response.headers["set-cookie"][0])
46 25
   end
47 26
 
48 27
   def default_workspace_id
@@ -80,26 +59,109 @@ def workspaces
80 59
     get 'workspaces'
81 60
   end
82 61
 
83  
-  def tasks(params={})
84  
-    get 'tasks', params
  62
+  def time_entries(params={})
  63
+    get 'time_entries', params
  64
+  end
  65
+
  66
+  def get_time_entry(id)
  67
+    get "time_entries/#{id}"
  68
+  end
  69
+
  70
+  def create_time_entry(params={})
  71
+    workspace   = params[:workspace] || default_workspace_id
  72
+    project_id  = find_project_id(params[:project]) || create_project(params, workspace)
  73
+    params[:billable] = true
  74
+    params[:start] = Time.now if params[:start].nil?
  75
+    params[:start] = params[:start].iso8601
  76
+    params.merge!({ :created_with => name,
  77
+                    :workspace => {:id => workspace},
  78
+                    :project => {:id => project_id},
  79
+                    :tag_names => [name]})
  80
+
  81
+    post 'time_entries', MultiJson.encode({:time_entry => params})
  82
+  end
  83
+
  84
+  def update_time_entry(params={})
  85
+    put "time_entries/#{params['id']}", MultiJson.encode({:time_entry => params})
  86
+  end
  87
+
  88
+  def delete_time_entry(id)
  89
+    self.class.delete("/api/v6/time_entries/#{id}.json", :basic_auth => basic_auth)
  90
+  end
  91
+
  92
+  def clients
  93
+    get 'clients'
  94
+  end
  95
+
  96
+  def create_client(params={})
  97
+    post "clients", MultiJson.encode({:client => params})
  98
+  end
  99
+
  100
+  def update_client(params={})
  101
+    put "clients/#{params['id']}", MultiJson.encode({:client => params})
  102
+  end
  103
+
  104
+  def delete_client(id)
  105
+    delete "clients/#{id}"
85 106
   end
86 107
 
87 108
   def projects
88 109
     get 'projects'
89 110
   end
90 111
 
  112
+  def create_project(params={})
  113
+    post "projects", MultiJson.encode({:project => params})
  114
+  end
  115
+
  116
+  def update_project(params={})
  117
+    put "projects/#{params['id']}", MultiJson.encode({:project => params})
  118
+  end
  119
+
  120
+  def create_project_user(params={})
  121
+    post "project_users", MultiJson.encode({:project_user => params})
  122
+  end
  123
+
  124
+  def tasks
  125
+    get 'tasks'
  126
+  end
  127
+
  128
+  def create_task(params={})
  129
+    post "tasks", MultiJson.encode({:task => params})
  130
+  end
  131
+
  132
+  def update_task(params={})
  133
+    put "tasks/#{params['id']}", MultiJson.encode({:task => params})
  134
+  end
  135
+
  136
+  def delete_task(id)
  137
+    delete "tasks/#{id}"
  138
+  end
  139
+
  140
+  def tags
  141
+    get 'tags'
  142
+  end
  143
+
91 144
   private
92 145
 
93 146
   def get(resource_name, data={})
94  
-    self.class.get("/api/v1/#{resource_name}.json", :basic_auth => basic_auth, :query => data)
  147
+    response = self.class.get("/api/v6/#{resource_name}.json", :basic_auth => basic_auth, :query => data)
  148
+    response['data'].nil? ? response : response['data'] 
95 149
   end
96 150
 
97 151
   def post(resource_name, data)
98  
-    self.class.post("/api/v1/#{resource_name}.json", :body => data, :basic_auth => basic_auth)
  152
+    response = self.class.post("/api/v6/#{resource_name}.json", :body => data, :basic_auth => basic_auth,
  153
+      :options => { :headers => {"Content-type" => "application/json"}})
  154
+    response['data'].nil? ? response : response['data'] 
  155
+  end
  156
+
  157
+  def put(resource_name, data)
  158
+    response = self.class.put("/api/v6/#{resource_name}.json", :body => data, :basic_auth => basic_auth,
  159
+      :options => { :headers => {"Content-type" => "application/json"}})
  160
+    response['data'].nil? ? response : response['data'] 
99 161
   end
100 162
 
101 163
   def delete(resource_name, id)
102  
-    self.class.delete("/api/v1/#{resource_name}/#{id}.json", :basic_auth => basic_auth)
  164
+    self.class.delete("/api/v6/#{resource_name}/#{id}.json", :basic_auth => basic_auth)
103 165
   end
104 166
 
105 167
   def basic_auth
11  lib/toggl_cmd/runner.rb
@@ -12,16 +12,16 @@ class Runner
12 12
     def self.toggl(args)
13 13
       token = IO.readlines(File.expand_path("~/.toggl")).join.strip
14 14
       options = RunnerOptions.new(args)
15  
-      if options[:tasks]
16  
-        prettify_tasks(Toggl.new(token, NAME).tasks)
  15
+      if options[:time_entries]
  16
+        prettify_tasks(Toggl.new(token, NAME).time_entries)
17 17
       elsif options[:projects]
18 18
         prettify_projects(Toggl.new(token, NAME).projects)
19 19
       elsif options[:delete]
20 20
         toggl = Toggl.new(token, NAME)
21  
-        toggl.delete_task(options[:delete])
22  
-        prettify_tasks(toggl.tasks)
  21
+        toggl.delete_time_entry(options[:delete])
  22
+        prettify_tasks(toggl.time_entries)
23 23
       elsif options.any?
24  
-        prettify_tasks(Toggl.new(token, NAME, options.delete(:debug)).create_task(options))
  24
+        prettify_tasks(Toggl.new(token, NAME, options.delete(:debug)).create_time_entry(options))
25 25
       else
26 26
         puts options.opts
27 27
       end
@@ -35,6 +35,7 @@ def self.prettify_tasks(values)
35 35
         value["project"]    = value["project"]["name"]
36 36
         value["workspace"]  = value["workspace"]["name"]
37 37
         value["duration"] = ChronicDuration.output(value["duration"].to_i, :format => :short)
  38
+        value["start"] = Time.parse(value["start"])
38 39
         value["start"] = value["start"].strftime("%d/%m/%Y")
39 40
       end
40 41
       values.view(:class => :table, :fields => TASK_FIELDS)
4  lib/toggl_cmd/runner_options.rb
@@ -25,8 +25,8 @@ def initialize(args)
25 25
           self[:start] = date
26 26
         end
27 27
 
28  
-        o.on('--tasks', 'Show tasks') do |tasks|
29  
-          self[:tasks] = tasks
  28
+        o.on('--time_entries', 'Show time entries') do |time_entries|
  29
+          self[:time_entries] = time_entries
30 30
         end
31 31
 
32 32
         o.on('--projects', 'Show projects') do |projects|

No commit comments for this range

Something went wrong with that request. Please try again.