v2gpti 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f53b2eecf9f72b895dca650a0ad5054e28c4da11
4
- data.tar.gz: 3b561a4430fa050469c30579c51ebe91f6576184
3
+ metadata.gz: 5a09e57e80af81a45583c28e77abbbd0077152f7
4
+ data.tar.gz: 9755fa1d0100286f3861264260d55d044b2fc910
5
5
  SHA512:
6
- metadata.gz: e1618d849ae1535eb523d12eb76502fece99b506379a4b9f014b21cff3c0d713c7c60048a73591f625d08446a7ede574409ce0a9423fa3ef080326e3d7c38795
7
- data.tar.gz: 81d3474a038ca15529083077340409d3da965ab8406899ee741df52f5c39d8172c09b7706afa6e4eb0d96bc0695287a19f46ced772dfac406b00457c6c07042d
6
+ metadata.gz: 2fa6335e4af27e4d660d90e968ee36fe1ed795e5cd34e632c8d5c7015fc71478e5ed30a04601b52a633ef98efbda6ce9da0b890916808bac6704003460e8e5a0
7
+ data.tar.gz: 0fa9f32ee10a80862d8680793b4d4da7e95d86ef7a171b117f5b572cbdfc49f92051428e4840d45463c0faa080487182458dfa61e39f4e043246c5ee1e10d1a8
@@ -6,9 +6,6 @@ project-name =
6
6
  project-manager =
7
7
  project-manager-email =
8
8
 
9
- [toggl]
10
- project-id =
11
-
12
9
  [platform]
13
10
  platform-name =
14
11
 
@@ -40,5 +40,3 @@ module GitPivotalTrackerIntegration
40
40
  end
41
41
  end
42
42
 
43
- autoload :Toggl, 'git-pivotal-tracker-integration/util/togglV8'
44
- autoload :TogglException, 'git-pivotal-tracker-integration/util/togglV8'
@@ -37,7 +37,6 @@ module GitPivotalTrackerIntegration
37
37
  end
38
38
 
39
39
  @repository_root = Util::Git.repository_root
40
- @toggl = Toggl.new
41
40
  @configuration = Command::Configuration.new
42
41
 
43
42
  @configuration.check_for_config_file
@@ -58,28 +57,6 @@ module GitPivotalTrackerIntegration
58
57
  end
59
58
  end
60
59
 
61
- def finish_toggle(configuration, time_spent)
62
- current_story = @configuration.story(@project)
63
-
64
- # If a story gets rejected and the developer works on it, then we need to check if the task is already created or not.
65
- params = parameters(configuration, time_spent)
66
- if params[:tid].nil?
67
- begin
68
- @toggl.create_task(params)
69
- rescue StandardError => te
70
- $LOG.error(te.backtrace.join("\n\t"))
71
- end
72
- end
73
-
74
- #If for some reason time entry cannot be done, then catch exception and continue.
75
- begin
76
- @toggl.create_time_entry(params)
77
- rescue StandardError => te
78
- $LOG.error(te.backtrace.join("\n\t"))
79
- puts "Unable to log the time."
80
- end
81
- end
82
-
83
60
  def start_logging
84
61
  $LOG = Logger.new("#{logger_filename}", 'weekly')
85
62
  end
@@ -111,46 +88,7 @@ module GitPivotalTrackerIntegration
111
88
  raise NotImplementedError
112
89
  end
113
90
 
114
- # Toggl keys
115
- # name : The name of the task (string, required, unique in project)
116
- # pid : project ID for the task (integer, required)
117
- # wid : workspace ID, where the task will be saved (integer, project's workspace id is used when not supplied)
118
- # uid : user ID, to whom the task is assigned to (integer, not required)
119
- # estimated_seconds : estimated duration of task in seconds (integer, not required)
120
- # active : whether the task is done or not (boolean, by default true)
121
- # at : timestamp that is sent in the response for PUT, indicates the time task was last updated
122
- # -- Additional fields --
123
- # done_seconds : duration (in seconds) of all the time entries registered for this task
124
- # uname : full name of the person to whom the task is assigned to
125
- TIMER_TOKENS = {
126
- "m" => (60),
127
- "h" => (60 * 60),
128
- "d" => (60 * 60 * 8) # a work day is 8 hours
129
- }
130
- def parameters(configuration, time_spent)
131
- current_story = configuration.story(@project)
132
- params = Hash.new
133
- params[:name] = "#{current_story.id}" + " - " + "#{current_story.name}"
134
- params[:estimated_seconds] = estimated_seconds current_story
135
- params[:pid] = configuration.toggl_project_id
136
- params[:uid] = @toggl.me["id"]
137
- params[:tags] = [current_story.story_type]
138
- params[:active] = false
139
- params[:description] = "#{current_story.id}" + " commit:" + "#{(Util::Shell.exec "git rev-parse HEAD").chomp[0..6]}"
140
- params[:created_with] = "v2gpti"
141
- params[:duration] = seconds_spent(time_spent)
142
- params[:start] = (Time.now - params[:duration]).iso8601
143
- task = @toggl.get_project_task_with_name(configuration.toggl_project_id, "#{current_story.id}")
144
- if !task.nil?
145
- params[:tid] = task['id']
146
- end
147
- params
148
- rescue TogglException => te
149
- $LOG.error("[TOGGL] ---------------- #{te.message}")
150
- $LOG.error("[TOGGL] ---------------- #{te.message}")
151
- params
152
- end
153
-
91
+
154
92
  def seconds_spent(time_spent)
155
93
  seconds = 0
156
94
  time_spent.scan(/(\d+)(\w)/).each do |amount, measure|
@@ -44,14 +44,6 @@ module GitPivotalTrackerIntegration
44
44
  api_token
45
45
  end
46
46
 
47
- def toggl_project_id
48
- toggle_config = self.pconfig["toggl"]
49
- if toggle_config.nil?
50
- abort "toggle project id not set"
51
- else
52
- toggle_config["project-id"]
53
- end
54
- end
55
47
 
56
48
  def check_config_project_id
57
49
  Util::Git.set_config("pivotal.project-id", self.pconfig["pivotal-tracker"]["project-id"])
@@ -43,16 +43,6 @@ module GitPivotalTrackerIntegration
43
43
 
44
44
  self.commit_new_build
45
45
 
46
- time_spent = ""
47
- while 1
48
- time_spent = ask("How much time did you spend on this task? (example: 15m, 2.5h)")
49
- if (/\d/.match( time_spent )) && /[mhd]/.match(time_spent)
50
- break
51
- end
52
- end
53
-
54
- finish_toggle(@configuration, time_spent)
55
-
56
46
  Util::Git.merge(@configuration.story(@project), no_complete)
57
47
  Util::Git.push Util::Git.branch_name
58
48
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: v2gpti
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Wolski
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-02-03 00:00:00.000000000 Z
13
+ date: 2017-11-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: highline
@@ -186,28 +186,28 @@ dependencies:
186
186
  requirements:
187
187
  - - "~>"
188
188
  - !ruby/object:Gem::Version
189
- version: 4.2.7
189
+ version: '4.2'
190
190
  type: :runtime
191
191
  prerelease: false
192
192
  version_requirements: !ruby/object:Gem::Requirement
193
193
  requirements:
194
194
  - - "~>"
195
195
  - !ruby/object:Gem::Version
196
- version: 4.2.7
196
+ version: '4.2'
197
197
  - !ruby/object:Gem::Dependency
198
198
  name: activemodel
199
199
  requirement: !ruby/object:Gem::Requirement
200
200
  requirements:
201
201
  - - "~>"
202
202
  - !ruby/object:Gem::Version
203
- version: 4.2.7
203
+ version: '4.2'
204
204
  type: :runtime
205
205
  prerelease: false
206
206
  version_requirements: !ruby/object:Gem::Requirement
207
207
  requirements:
208
208
  - - "~>"
209
209
  - !ruby/object:Gem::Version
210
- version: 4.2.7
210
+ version: '4.2'
211
211
  - !ruby/object:Gem::Dependency
212
212
  name: bundler
213
213
  requirement: !ruby/object:Gem::Requirement
@@ -338,15 +338,15 @@ description: Provides a set of additional Git commands to help developers when w
338
338
  with Pivotal Tracker
339
339
  email: jeff@xxxxxxxxx.com
340
340
  executables:
341
- - git-deliver
342
- - git-finish
343
- - git-newbug
344
- - git-newfeature
345
341
  - git-qa
346
- - git-release
342
+ - git-uat
343
+ - git-newbug
344
+ - git-finish
347
345
  - git-report
346
+ - git-newfeature
348
347
  - git-start
349
- - git-uat
348
+ - git-deliver
349
+ - git-release
350
350
  extensions: []
351
351
  extra_rdoc_files: []
352
352
  files:
@@ -378,7 +378,6 @@ files:
378
378
  - lib/git-pivotal-tracker-integration/util/git.rb
379
379
  - lib/git-pivotal-tracker-integration/util/shell.rb
380
380
  - lib/git-pivotal-tracker-integration/util/story.rb
381
- - lib/git-pivotal-tracker-integration/util/togglV8.rb
382
381
  - lib/git-pivotal-tracker-integration/version-update/gradle.rb
383
382
  - spec/git-pivotal-tracker-integration/command/base_spec.rb
384
383
  - spec/git-pivotal-tracker-integration/command/configuration_spec.rb
@@ -447,17 +446,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
447
446
  version: '0'
448
447
  requirements: []
449
448
  rubyforge_project:
450
- rubygems_version: 2.5.1
449
+ rubygems_version: 2.5.2.1
451
450
  signing_key:
452
451
  specification_version: 4
453
452
  summary: Git commands for integration with Pivotal Tracker
454
453
  test_files:
455
- - spec/git-pivotal-tracker-integration/command/base_spec.rb
456
- - spec/git-pivotal-tracker-integration/command/configuration_spec.rb
457
- - spec/git-pivotal-tracker-integration/command/finish_spec.rb
458
- - spec/git-pivotal-tracker-integration/command/release_spec.rb
459
- - spec/git-pivotal-tracker-integration/command/start_spec.rb
460
454
  - spec/git-pivotal-tracker-integration/util/git_spec.rb
461
455
  - spec/git-pivotal-tracker-integration/util/shell_spec.rb
462
456
  - spec/git-pivotal-tracker-integration/util/story_spec.rb
463
457
  - spec/git-pivotal-tracker-integration/version-update/gradle_spec.rb
458
+ - spec/git-pivotal-tracker-integration/command/configuration_spec.rb
459
+ - spec/git-pivotal-tracker-integration/command/finish_spec.rb
460
+ - spec/git-pivotal-tracker-integration/command/start_spec.rb
461
+ - spec/git-pivotal-tracker-integration/command/release_spec.rb
462
+ - spec/git-pivotal-tracker-integration/command/base_spec.rb
@@ -1,438 +0,0 @@
1
- #! /usr/bin/env rvm ruby-1.9.3-head do ruby
2
- # encoding: utf-8
3
-
4
- require 'rubygems'
5
- require 'logger'
6
- require 'faraday'
7
- require 'json'
8
-
9
- require 'awesome_print' # for debug output
10
-
11
- class TogglException < StandardError
12
- def initialize(message)
13
- @message = "[Toggl] #{message}"
14
- end
15
- end
16
-
17
- class Toggl
18
- attr_accessor :conn, :debug
19
-
20
- def initialize(username=nil, password='api_token', debug=nil)
21
- self.debug_on(debug) if !debug.nil?
22
- if (password.to_s == 'api_token' && username.to_s == '')
23
- toggl_api_file = self.toggl_file
24
- username = IO.read(toggl_api_file).strip
25
- end
26
-
27
- @conn = connection(username, password)
28
- end
29
-
30
- def toggl_file
31
- t_file = ENV['HOME']+'/.toggl'
32
- if !FileTest.exist?(t_file) then
33
- puts "\n\nIt looks like this is the first time you have used Toggl on this machine.\n"
34
- t_API_key = ask("Please enter your Toggl API key:")
35
- output = File.open( t_file, "w")
36
- output << t_API_key
37
- output.close
38
- end
39
-
40
- t_file
41
- end
42
- def connection(username, password)
43
- Faraday.new(url: 'https://www.toggl.com/api/v8', :ssl => {:verify => false}) do |faraday|
44
- faraday.request :url_encoded
45
- faraday.response :logger, Logger.new('faraday.log')
46
- faraday.adapter Faraday.default_adapter
47
- faraday.headers = {"Content-Type" => "application/json"}
48
- faraday.basic_auth username, password
49
- end
50
- end
51
-
52
- def debug_on(debug=true)
53
- puts "debugging is %s" % [debug ? "ON" : "OFF"]
54
- @debug = debug
55
- end
56
-
57
- def checkParams(params, fields=[])
58
- raise ArgumentError, 'params is not a Hash' unless params.is_a? Hash
59
- return if fields.empty?
60
- errors = []
61
- for f in fields
62
- errors.push("params[#{f}] is required") unless params.has_key?(f)
63
- end
64
- raise ArgumentError, errors.join(', ') if !errors.empty?
65
- end
66
-
67
- #----------#
68
- #--- Me ---#
69
- #----------#
70
-
71
- def me(all=nil)
72
- # TODO: Reconcile this with get_client_projects
73
- get "me%s" % [all.nil? ? "" : "?with_related_data=#{all}"]
74
- rescue TogglException => te
75
- puts "Failed to retrieve the Toggl User Id"
76
- raise te
77
- end
78
-
79
- def my_clients(user)
80
- user['projects']
81
- end
82
-
83
- def my_projects(user)
84
- user['projects']
85
- end
86
-
87
- def my_tags(user)
88
- user['tags']
89
- end
90
-
91
- def my_time_entries(user)
92
- user['time_entries']
93
- end
94
-
95
- def my_workspaces(user)
96
- user['workspaces']
97
- end
98
-
99
- #---------------#
100
- #--- Clients ---#
101
- #---------------#
102
-
103
- # name : The name of the client (string, required, unique in workspace)
104
- # wid : workspace ID, where the client will be used (integer, required)
105
- # notes : Notes for the client (string, not required)
106
- # hrate : The hourly rate for this client (float, not required, available only for pro workspaces)
107
- # cur : The name of the client's currency (string, not required, available only for pro workspaces)
108
- # at : timestamp that is sent in the response, indicates the time client was last updated
109
-
110
- def create_client(params)
111
- checkParams(params, [:name, :wid])
112
- post "clients", {client: params}
113
- end
114
-
115
- def get_client(client_id)
116
- get "clients/#{client_id}"
117
- end
118
-
119
- def update_client(client_id, params)
120
- put "clients/#{client_id}", {client: params}
121
- end
122
-
123
- def delete_client(client_id)
124
- delete "clients/#{client_id}"
125
- end
126
-
127
- def get_client_projects(client_id, params={})
128
- active = params.has_key?(:active) ? "?active=#{params[:active]}" : ""
129
- get "clients/#{client_id}/projects#{active}"
130
- end
131
-
132
-
133
- #----------------#
134
- #--- Projects ---#
135
- #----------------#
136
-
137
- # name : The name of the project (string, required, unique for client and workspace)
138
- # wid : workspace ID, where the project will be saved (integer, required)
139
- # cid : client ID(integer, not required)
140
- # active : whether the project is archived or not (boolean, by default true)
141
- # is_private : whether project is accessible for only project users or for all workspace users (boolean, default true)
142
- # template : whether the project can be used as a template (boolean, not required)
143
- # template_id : id of the template project used on current project's creation
144
- # billable : whether the project is billable or not (boolean, default true, available only for pro workspaces)
145
- # at : timestamp that is sent in the response for PUT, indicates the time task was last updated
146
- # -- Undocumented --
147
- # color : number (in the range 0-23?)
148
-
149
- def create_project(params)
150
- checkParams(params, [:name, :wid])
151
- post "projects", {project: params}
152
- end
153
-
154
- def get_project(project_id)
155
- get "projects/#{project_id}"
156
- end
157
-
158
- def update_project(project_id, params)
159
- put "projects/#{project_id}", {project: params}
160
- end
161
-
162
- def get_project_users(project_id)
163
- get "projects/#{project_id}/project_users"
164
- end
165
-
166
- def get_project_tasks(project_id)
167
- get "projects/#{project_id}/tasks"
168
- end
169
-
170
- def get_project_task_with_name(project_id, task_name)
171
- task = nil
172
- project_tasks = get_project_tasks(project_id) || []
173
- project_tasks.each { |a_task|
174
- a_task_name = "#{a_task["name"]}"
175
- if (a_task_name.include?task_name)
176
- task = a_task
177
- break
178
- end
179
- }
180
- task
181
- end
182
- #---------------------#
183
- #--- Project users ---#
184
- #---------------------#
185
-
186
- # pid : project ID (integer, required)
187
- # uid : user ID, who is added to the project (integer, required)
188
- # wid : workspace ID, where the project belongs to (integer, not-required, project's workspace id is used)
189
- # manager : admin rights for this project (boolean, default false)
190
- # rate : hourly rate for the project user (float, not-required, only for pro workspaces) in the currency of the project's client or in workspace default currency.
191
- # at : timestamp that is sent in the response, indicates when the project user was last updated
192
- # -- Additional fields --
193
- # fullname : full name of the user, who is added to the project
194
-
195
- def create_project_user(params)
196
- checkParams(params, [:pid, :uid])
197
- params[:fields] = "fullname" # for simplicity, always request fullname field
198
- post "project_users", {project_user: params}
199
- end
200
-
201
- def update_project_user(project_user_id, params)
202
- params[:fields] = "fullname" # for simplicity, always request fullname field
203
- put "project_users/#{project_user_id}", {project_user: params}
204
- end
205
-
206
- def delete_project_user(project_user_id)
207
- delete "project_users/#{project_user_id}"
208
- end
209
-
210
- #------------#
211
- #--- Tags ---#
212
- #------------#
213
-
214
- # name : The name of the tag (string, required, unique in workspace)
215
- # wid : workspace ID, where the tag will be used (integer, required)
216
-
217
- def create_tag(params)
218
- checkParams(params, [:name, :wid])
219
- post "tags", {tag: params}
220
- end
221
-
222
- # ex: update_tag(12345, {name: "same tame game"})
223
- def update_tag(tag_id, params)
224
- put "tags/#{tag_id}", {tag: params}
225
- end
226
-
227
- def delete_tag(tag_id)
228
- delete "tags/#{tag_id}"
229
- end
230
-
231
- #-------------#
232
- #--- Tasks ---#
233
- #-------------#
234
-
235
- # name : The name of the task (string, required, unique in project)
236
- # pid : project ID for the task (integer, required)
237
- # wid : workspace ID, where the task will be saved (integer, project's workspace id is used when not supplied)
238
- # uid : user ID, to whom the task is assigned to (integer, not required)
239
- # estimated_seconds : estimated duration of task in seconds (integer, not required)
240
- # active : whether the task is done or not (boolean, by default true)
241
- # at : timestamp that is sent in the response for PUT, indicates the time task was last updated
242
- # -- Additional fields --
243
- # done_seconds : duration (in seconds) of all the time entries registered for this task
244
- # uname : full name of the person to whom the task is assigned to
245
-
246
- def create_task(params)
247
- checkParams(params, [:name, :pid])
248
- post "tasks", {task: params}
249
- end
250
-
251
- def get_task(task_id)
252
- get "tasks/#{task_id}"
253
- end
254
-
255
- # ex: update_task(1894675, {active: true, estimated_seconds: 4500, fields: "done_seconds,uname"})
256
- def update_task(*task_id, params)
257
- put "tasks/#{task_id.join(',')}", {task: params}
258
- end
259
-
260
- def delete_task(*task_id)
261
- delete "tasks/#{task_id.join(',')}"
262
- end
263
-
264
- #--------------------#
265
- #--- Time entries ---#
266
- #--------------------#
267
-
268
- # description : (string, required)
269
- # wid : workspace ID (integer, required if pid or tid not supplied)
270
- # pid : project ID (integer, not required)
271
- # tid : task ID (integer, not required)
272
- # billable : (boolean, not required, default false, available for pro workspaces)
273
- # start : time entry start time (string, required, ISO 8601 date and time)
274
- # stop : time entry stop time (string, not required, ISO 8601 date and time)
275
- # duration : time entry duration in seconds. If the time entry is currently running, the duration attribute contains a negative value, denoting the start of the time entry in seconds since epoch (Jan 1 1970). The correct duration can be calculated as current_time + duration, where current_time is the current time in seconds since epoch. (integer, required)
276
- # created_with : the name of your client app (string, required)
277
- # tags : a list of tag names (array of strings, not required)
278
- # duronly : should Toggl show the start and stop time of this time entry? (boolean, not required)
279
- # at : timestamp that is sent in the response, indicates the time item was last updated
280
-
281
- def create_time_entry(params)
282
- checkParams(params, [:description, :start, :created_with])
283
- if !params.has_key?(:wid) and !params.has_key?(:pid) and !params.has_key?(:tid) then
284
- raise ArgumentError, "one of params['wid'], params['pid'], params['tid'] is required"
285
- end
286
- post "time_entries", {time_entry: params}
287
- end
288
-
289
- def start_time_entry(params)
290
- if !params.has_key?(:wid) and !params.has_key?(:pid) and !params.has_key?(:tid) then
291
- raise ArgumentError, "one of params['wid'], params['pid'], params['tid'] is required"
292
- end
293
- post "time_entries/start", {time_entry: params}
294
- end
295
-
296
- def stop_time_entry(time_entry_id)
297
- put "time_entries/#{time_entry_id}/stop", {}
298
- end
299
-
300
- def get_time_entry(time_entry_id)
301
- get "time_entries/#{time_entry_id}"
302
- end
303
-
304
- def update_time_entry(time_entry_id, params)
305
- put "time_entries/#{time_entry_id}", {time_entry: params}
306
- end
307
-
308
- def delete_time_entry(time_entry_id)
309
- delete "time_entries/#{time_entry_id}"
310
- end
311
-
312
- def iso8601(date)
313
- return nil if date.nil?
314
- if date.is_a?(Time) or date.is_a?(Date)
315
- iso = date.iso8601
316
- elsif date.is_a?(String)
317
- iso = DateTime.parse(date).iso8601
318
- else
319
- raise ArgumentError, "Can't convert #{date.class} to ISO-8601 Date/Time"
320
- end
321
- return Faraday::Utils.escape(iso)
322
- end
323
-
324
- def get_time_entries(start_date=nil, end_date=nil)
325
- params = []
326
- params.push("start_date=#{iso8601(start_date)}") if !start_date.nil?
327
- params.push("end_date=#{iso8601(end_date)}") if !end_date.nil?
328
- get "time_entries%s" % [params.empty? ? "" : "?#{params.join('&')}"]
329
- end
330
-
331
- #-------------#
332
- #--- Users ---#
333
- #-------------#
334
-
335
- # api_token : (string)
336
- # default_wid : default workspace id (integer)
337
- # email : (string)
338
- # jquery_timeofday_format : (string)
339
- # jquery_date_format :(string)
340
- # timeofday_format : (string)
341
- # date_format : (string)
342
- # store_start_and_stop_time : whether start and stop time are saved on time entry (boolean)
343
- # beginning_of_week : (integer, Sunday=0)
344
- # language : user's language (string)
345
- # image_url : url with the user's profile picture(string)
346
- # sidebar_piechart : should a piechart be shown on the sidebar (boolean)
347
- # at : timestamp of last changes
348
- # new_blog_post : an object with toggl blog post title and link
349
-
350
- #------------------#
351
- #--- Workspaces ---#
352
- #------------------#
353
-
354
- # name : (string, required)
355
- # premium : If it's a pro workspace or not. Shows if someone is paying for the workspace or not (boolean, not required)
356
- # at : timestamp that is sent in the response, indicates the time item was last updated
357
-
358
- def workspaces
359
- get "workspaces"
360
- end
361
-
362
- def clients(workspace=nil)
363
- if workspace.nil?
364
- get "clients"
365
- else
366
- get "workspaces/#{workspace}/clients"
367
- end
368
- end
369
-
370
- def projects(workspace, params={})
371
- active = params.has_key?(:active) ? "?active=#{params[:active]}" : ""
372
- get "workspaces/#{workspace}/projects#{active}"
373
- end
374
-
375
- def users(workspace)
376
- get "workspaces/#{workspace}/users"
377
- end
378
-
379
- def tasks(workspace, params={})
380
- active = params.has_key?(:active) ? "?active=#{params[:active]}" : ""
381
- get "workspaces/#{workspace}/tasks#{active}"
382
- end
383
-
384
- #---------------#
385
- #--- Private ---#
386
- #---------------#
387
-
388
- private
389
-
390
- def get(resource)
391
- puts "GET #{resource}" if @debug
392
- full_res = self.conn.get(resource)
393
- # ap full_res.env if @debug
394
- return nil if full_res.env[:body] == 'null'
395
- res = JSON.parse(full_res.env[:body])
396
- res.is_a?(Array) || res['data'].nil? ? res : res['data']
397
- rescue StandardError => e
398
- raise TogglException, "GET #{resource} Failed -- #{e.message}"
399
- end
400
-
401
- def post(resource, data)
402
- puts "POST #{resource} / #{data}" if @debug
403
- full_res = self.conn.post(resource, JSON.generate(data))
404
- #ap full_res.env if @debug
405
- if (200 == full_res.env[:status]) then
406
- res = JSON.parse(full_res.env[:body])
407
- res['data'].nil? ? res : res['data']
408
- else
409
- puts(full_res.env[:body])
410
- end
411
- rescue StandardError => e
412
- raise TogglException, "POST #{resource} / #{data} Failed -- #{e.message}"
413
- end
414
-
415
- def put(resource, data)
416
- puts "PUT #{resource} / #{data}" if @debug
417
- full_res = self.conn.put(resource, JSON.generate(data))
418
- # ap full_res.env if @debug
419
- if (200 == full_res.env[:status]) then
420
- res = JSON.parse(full_res.env[:body])
421
- res['data'].nil? ? res : res['data']
422
- else
423
- puts(full_res.env[:body])
424
- end
425
- rescue StandardError => e
426
- raise TogglException, "PUT #{resource} / #{data} Failed -- #{e.message}"
427
- end
428
-
429
- def delete(resource)
430
- puts "DELETE #{resource}" if @debug
431
- full_res = self.conn.delete(resource)
432
- # ap full_res.env if @debug
433
- (200 == full_res.env[:status]) ? "" : puts(full_res.env[:body])
434
- rescue StandardError => e
435
- raise TogglException, "DELETE #{resource} Failed -- #{e.message}"
436
- end
437
-
438
- end