togglv8-tfl 0.0.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.
@@ -0,0 +1,82 @@
1
+ describe 'Users' do
2
+ before :all do
3
+ @toggl = TogglV8::API.new(Testing::API_TOKEN)
4
+ @user = @toggl.me(all=true)
5
+ @workspaces = @toggl.workspaces
6
+ @workspace_id = @workspaces.first['id']
7
+ end
8
+
9
+ it 'returns /me' do
10
+ expect(@user).to_not be_nil
11
+ expect(@user['id']).to eq Testing::USER_ID
12
+ expect(@user['fullname']).to eq Testing::USERNAME
13
+ # expect(@user['image_url']).to eq 'https://assets.toggl.com/avatars/a5d106126b6bed8df283e708af0828ee.png'
14
+ # expect(@user['timezone']).to eq 'Etc/UTC'
15
+ # expect(@user['workspaces'].length).to eq 1
16
+ # expect(@user['workspaces'].first['name']).to eq "togglv8's workspace"
17
+ end
18
+
19
+ it 'returns my_clients' do
20
+ my_clients = @toggl.my_clients(@user)
21
+ expect(my_clients).to be_empty
22
+ end
23
+
24
+ it 'returns my_projects' do
25
+ my_projects = @toggl.my_projects(@user)
26
+ expect(my_projects).to be_empty
27
+ end
28
+
29
+ it 'returns my_projects and my_deleted_projects' do
30
+ # Create project
31
+ project = @toggl.create_project({ 'name' => 'my project', 'wid' => @workspace_id })
32
+
33
+ my_project_ids = @toggl.my_projects.map { |p| p['id'] }
34
+ my_deleted_project_ids = @toggl.my_deleted_projects.map { |p| p['id'] }
35
+
36
+ expect(my_project_ids).to eq [ project['id'] ]
37
+ expect(my_deleted_project_ids).not_to include(project['id'])
38
+
39
+ # Delete project
40
+ @toggl.delete_project(project['id'])
41
+
42
+ my_project_ids = @toggl.my_projects.map { |p| p['id'] }
43
+ my_deleted_project_ids = @toggl.my_deleted_projects.map { |p| p['id'] }
44
+
45
+ expect(my_project_ids).to eq []
46
+ expect(my_deleted_project_ids).to include(project['id'])
47
+ end
48
+
49
+ it 'returns my_tags' do
50
+ my_tags = @toggl.my_tags(@user)
51
+ expect(my_tags).to be_empty
52
+ end
53
+
54
+ it 'returns my_tasks' do
55
+ my_tasks = @toggl.my_tasks(@user)
56
+ expect(my_tasks).to be_empty
57
+ end
58
+
59
+ it 'returns my_time_entries' do
60
+ my_time_entries = @toggl.my_time_entries(@user)
61
+ expect(my_time_entries).to be_empty
62
+ end
63
+
64
+ it 'returns my_workspaces' do
65
+ my_workspaces = @toggl.my_workspaces(@user)
66
+ expect(my_workspaces.length).to eq 1
67
+ end
68
+
69
+ context 'new user' do
70
+ it 'creates a new user' do
71
+ now = Time.now.to_i
72
+ user_info = {
73
+ 'email' => "test-#{now}+1@mailinator.com",
74
+ 'timezone' => 'Etc/UTC'
75
+ }
76
+ user_password = { 'password' => "password-#{now}+1" }
77
+
78
+ new_user = @toggl.create_user(user_info.merge(user_password))
79
+ expect(new_user).to include(user_info)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,40 @@
1
+ describe 'Workspaces' do
2
+ before :all do
3
+ @toggl = TogglV8::API.new(Testing::API_TOKEN)
4
+ @user = @toggl.me(all=true)
5
+ @workspaces = @toggl.workspaces
6
+ @workspace_id = @workspaces.first['id']
7
+ @project = @toggl.create_project({ 'name' => 'project with a task', 'wid' => @workspace_id })
8
+ end
9
+
10
+ after :all do
11
+ @toggl.delete_project(@project['id'])
12
+ end
13
+
14
+ it 'shows users' do
15
+ users = @toggl.users(@workspace_id)
16
+ expect(users.length).to eq 1
17
+ expect(users.first['id']).to eq Testing::USER_ID
18
+ expect(users.first['email']).to eq Testing::EMAIL
19
+ expect(users.first['fullname']).to eq Testing::USERNAME
20
+ expect(users.first['default_wid']).to eq @workspace_id
21
+ end
22
+
23
+ context 'tasks', :pro_account do
24
+ before :each do
25
+ @task = @toggl.create_task('name' => 'workspace task', 'pid' => @project['id'])
26
+ end
27
+
28
+ after :each do
29
+ @toggl.delete_task(@task['id'])
30
+ end
31
+
32
+ it 'shows tasks' do
33
+ tasks = @toggl.tasks(@workspace_id)
34
+ expect(tasks.length).to eq 1
35
+ expect(tasks.first['name']).to eq 'workspace task'
36
+ expect(tasks.first['pid']).to eq @project['id']
37
+ expect(tasks.first['wid']).to eq @workspace_id
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,77 @@
1
+ require 'fileutils'
2
+
3
+ describe 'TogglV8' do
4
+ it 'initializes with api_token' do
5
+ toggl = TogglV8::API.new(Testing::API_TOKEN)
6
+ me = toggl.me
7
+ expect(me).to_not be nil
8
+ expect(me['api_token']).to eq Testing::API_TOKEN
9
+ expect(me['email']).to eq Testing::EMAIL
10
+ end
11
+
12
+ it 'initializes with username and password' do
13
+ toggl = TogglV8::API.new(Testing::EMAIL, Testing::PASSWORD)
14
+ me = toggl.me
15
+ expect(me).to_not be nil
16
+ expect(me['api_token']).to eq Testing::API_TOKEN
17
+ expect(me['email']).to eq Testing::EMAIL
18
+ end
19
+
20
+ it 'does not initialize with bogus api_token' do
21
+ toggl = TogglV8::API.new('4880nqor1orr9n241sn08070q33oq49s')
22
+ expect { toggl.me }.to raise_error(RuntimeError, "HTTP Status: 403")
23
+ end
24
+
25
+ context '.toggl file' do
26
+ before :each do
27
+ @tmp_home = mktemp_dir
28
+ @original_home = Dir.home
29
+ ENV['HOME'] = @tmp_home
30
+ end
31
+
32
+ after :each do
33
+ FileUtils.rm_rf(@tmp_home)
34
+ ENV['HOME'] = @original_home
35
+ end
36
+
37
+ it 'initializes with .toggl file' do
38
+ toggl_file = File.join(@tmp_home, '.toggl')
39
+ File.open(toggl_file, 'w') { |file| file.write(Testing::API_TOKEN) }
40
+
41
+ toggl = TogglV8::API.new
42
+ me = toggl.me
43
+ expect(me).to_not be nil
44
+ expect(me['api_token']).to eq Testing::API_TOKEN
45
+ expect(me['email']).to eq Testing::EMAIL
46
+ end
47
+
48
+ it 'raises error if .toggl file is missing' do
49
+ expect{ toggl = TogglV8::API.new }.to raise_error(RuntimeError)
50
+ end
51
+ end
52
+
53
+ context 'handles errors' do
54
+ before :all do
55
+ @toggl = TogglV8::API.new(Testing::API_TOKEN)
56
+ end
57
+
58
+ it 'surfaces an HTTP Status Code in case of error' do
59
+ expect(@toggl.conn).to receive(:get).once.and_return(
60
+ MockResponse.new(400, {}, 'body'))
61
+ expect { @toggl.me }.to raise_error(RuntimeError, "HTTP Status: 400")
62
+ end
63
+
64
+ it 'retries a request up to 3 times if a 429 is received' do
65
+ expect(@toggl.conn).to receive(:get).exactly(3).times.and_return(
66
+ MockResponse.new(429, {}, 'body'))
67
+ expect { @toggl.me }.to raise_error(RuntimeError, "HTTP Status: 429")
68
+ end
69
+
70
+ it 'retries a request after 429' do
71
+ expect(@toggl.conn).to receive(:get).twice.and_return(
72
+ MockResponse.new(429, {}, 'body'),
73
+ MockResponse.new(200, {}, nil))
74
+ expect(@toggl.me).to eq({}) # response is {} in this case because body is nil
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,85 @@
1
+ require "simplecov"
2
+ require "coveralls"
3
+
4
+ SimpleCov.formatters = [
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+ SimpleCov.start
9
+
10
+ require 'pry-byebug'
11
+
12
+ require_relative 'togglv8_spec_helper'
13
+ require_relative '../lib/togglv8'
14
+
15
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
16
+ RSpec.configure do |config|
17
+ config.filter_run :focus
18
+ config.filter_run_excluding :pro_account unless ENV['TOGGL_PRO_ACCOUNT']
19
+ config.run_all_when_everything_filtered = true
20
+
21
+ config.order = :random
22
+ Kernel.srand config.seed
23
+
24
+ config.expect_with :rspec do |expectations|
25
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
26
+ expectations.syntax = :expect
27
+ end
28
+
29
+ config.mock_with :rspec do |mocks|
30
+ mocks.verify_partial_doubles = true
31
+ end
32
+
33
+ config.before(:suite) do
34
+ toggl = TogglV8::API.new(Testing::API_TOKEN)
35
+ TogglV8SpecHelper.setUp(toggl) # start tests from known state
36
+ end
37
+ end
38
+
39
+ class MockResponse
40
+ # https://github.com/lostisland/faraday/blob/master/lib/faraday/response.rb
41
+
42
+ attr_accessor :status, :headers, :body, :env
43
+
44
+ def initialize(status, headers, body)
45
+ @status = status
46
+ @headers = headers
47
+ @body = body
48
+ end
49
+
50
+ def success?
51
+ @status == 200
52
+ end
53
+ end
54
+
55
+ def mktemp_dir
56
+ dir = File.join(Dir.pwd, "tmp-#{Time.now.to_f}")
57
+ Dir.mkdir(dir)
58
+ dir
59
+ end
60
+
61
+ def file_contains(filename, pattern, maxlen=1000)
62
+ expect(File.exist?(filename))
63
+ contents = File.new(filename).sysread(maxlen)
64
+ expect(contents).to match pattern
65
+ end
66
+
67
+ def file_is_pdf(filename)
68
+ expect(File.exist?(filename))
69
+ first_line = File.foreach(filename).first
70
+ expect(first_line).to eq "%PDF-1.3\n"
71
+ end
72
+
73
+ def file_is_xls(filename)
74
+ expect(File.exist?(filename))
75
+ header = File.new(filename).sysread(8)
76
+ expect(header).to eq ['D0CF11E0A1B11AE1'].pack("H*")
77
+ end
78
+
79
+ class Testing
80
+ API_TOKEN = ENV['API_TOKEN'] || '4880adbe1bee9a241fa08070d33bd49f'
81
+ EMAIL = ENV['EMAIL'] || 'togglv8@mailinator.com'
82
+ USERNAME = ENV['USERNAME'] || 'togglv8'
83
+ PASSWORD = ENV['PASSWORD'] || 'togglv8'
84
+ USER_ID = (ENV['USER_ID'] || 1820939).to_i
85
+ end
@@ -0,0 +1,75 @@
1
+ # :nocov:
2
+ require_relative '../lib/togglv8'
3
+
4
+ class TogglV8SpecHelper
5
+ include Logging
6
+
7
+ def self.setUp(toggl)
8
+ user = toggl.me(all=true)
9
+ @default_workspace_id = user['default_wid']
10
+
11
+ delete_all_projects(toggl)
12
+ delete_all_clients(toggl)
13
+ delete_all_tags(toggl)
14
+ delete_all_time_entries(toggl)
15
+ delete_all_workspaces(toggl)
16
+ end
17
+
18
+ def self.delete_all_clients(toggl)
19
+ clients = toggl.my_clients
20
+ unless clients.nil?
21
+ client_ids ||= clients.map { |c| c['id'] }
22
+ # logger.debug("Deleting #{client_ids.length} clients")
23
+ client_ids.each do |c_id|
24
+ toggl.delete_client(c_id)
25
+ end
26
+ end
27
+ end
28
+
29
+ def self.delete_all_projects(toggl)
30
+ projects = toggl.projects(@default_workspace_id)
31
+ unless projects.nil?
32
+ project_ids ||= projects.map { |p| p['id'] }
33
+ # logger.debug("Deleting #{project_ids.length} projects")
34
+ return unless project_ids.length > 0
35
+ toggl.delete_projects(project_ids)
36
+ end
37
+ end
38
+
39
+ def self.delete_all_tags(toggl)
40
+ tags = toggl.my_tags
41
+ unless tags.nil?
42
+ tag_ids ||= tags.map { |t| t['id'] }
43
+ # logger.debug("Deleting #{tag_ids.length} tags")
44
+ tag_ids.each do |t_id|
45
+ toggl.delete_tag(t_id)
46
+ end
47
+ end
48
+ end
49
+
50
+ def self.delete_all_time_entries(toggl)
51
+ time_entries = toggl.get_time_entries(
52
+ { :start_date => DateTime.now - 30, :end_date => DateTime.now + 30 } )
53
+ unless time_entries.nil?
54
+ time_entry_ids ||= time_entries.map { |t| t['id'] }
55
+ # logger.debug("Deleting #{time_entry_ids.length} time_entries")
56
+ time_entry_ids.each do |t_id|
57
+ toggl.delete_time_entry(t_id)
58
+ end
59
+ end
60
+ end
61
+
62
+ def self.delete_all_workspaces(toggl)
63
+ user = toggl.me(all=true)
64
+ workspaces = toggl.my_workspaces(user)
65
+ unless workspaces.nil?
66
+ workspace_ids ||= workspaces.map { |w| w['id'] }
67
+ workspace_ids.delete(user['default_wid'])
68
+ # logger.debug("Leaving #{workspace_ids.length} workspaces")
69
+ workspace_ids.each do |w_id|
70
+ toggl.leave_workspace(w_id)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ # :nocov:
data/togglv8.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'togglv8/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "togglv8-tfl"
8
+ spec.version = TogglV8::VERSION
9
+ spec.authors = ["Scott Fielder"]
10
+ spec.email = ["sfielder@trifinlabs.com"]
11
+ spec.summary = %q{Toggl v8 API wrapper (See https://github.com/toggl/toggl_api_docs)}
12
+ spec.homepage = "https://bitbucket.org/trifinlabs/togglv8-tfl"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.requirements << 'A Toggl account (https://toggl.com/)'
21
+
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "rspec-mocks"
26
+ spec.add_development_dependency "awesome_print"
27
+ spec.add_development_dependency "fivemat"
28
+ spec.add_development_dependency "coveralls"
29
+ spec.add_development_dependency "pry-byebug"
30
+
31
+ spec.add_dependency "logger"
32
+ spec.add_dependency "faraday"
33
+ spec.add_dependency "oj"
34
+ end
metadata ADDED
@@ -0,0 +1,251 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: togglv8-tfl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Scott Fielder
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-06-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-mocks
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: fivemat
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: logger
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: faraday
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: oj
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description:
168
+ email:
169
+ - sfielder@trifinlabs.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - ".codeclimate.yml"
175
+ - ".coveralls.yml"
176
+ - ".gitignore"
177
+ - ".rdoc_options"
178
+ - ".rspec"
179
+ - ".rubocop.yml"
180
+ - ".travis.yml"
181
+ - CHANGELOG.md
182
+ - Gemfile
183
+ - LICENSE.txt
184
+ - README.md
185
+ - Rakefile
186
+ - lib/logging.rb
187
+ - lib/reportsv2.rb
188
+ - lib/togglv8.rb
189
+ - lib/togglv8/clients.rb
190
+ - lib/togglv8/connection.rb
191
+ - lib/togglv8/dashboard.rb
192
+ - lib/togglv8/project_users.rb
193
+ - lib/togglv8/projects.rb
194
+ - lib/togglv8/tags.rb
195
+ - lib/togglv8/tasks.rb
196
+ - lib/togglv8/time_entries.rb
197
+ - lib/togglv8/togglv8.rb
198
+ - lib/togglv8/users.rb
199
+ - lib/togglv8/version.rb
200
+ - lib/togglv8/workspaces.rb
201
+ - spec/lib/reportsv2_spec.rb
202
+ - spec/lib/togglv8/clients_spec.rb
203
+ - spec/lib/togglv8/dashboard_spec.rb
204
+ - spec/lib/togglv8/projects_spec.rb
205
+ - spec/lib/togglv8/tags_spec.rb
206
+ - spec/lib/togglv8/tasks_spec.rb
207
+ - spec/lib/togglv8/time_entries_spec.rb
208
+ - spec/lib/togglv8/users_spec.rb
209
+ - spec/lib/togglv8/workspaces_spec.rb
210
+ - spec/lib/togglv8_spec.rb
211
+ - spec/spec_helper.rb
212
+ - spec/togglv8_spec_helper.rb
213
+ - togglv8.gemspec
214
+ homepage: https://bitbucket.org/trifinlabs/togglv8-tfl
215
+ licenses:
216
+ - MIT
217
+ metadata: {}
218
+ post_install_message:
219
+ rdoc_options: []
220
+ require_paths:
221
+ - lib
222
+ required_ruby_version: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - ">="
225
+ - !ruby/object:Gem::Version
226
+ version: '0'
227
+ required_rubygems_version: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ requirements:
233
+ - A Toggl account (https://toggl.com/)
234
+ rubyforge_project:
235
+ rubygems_version: 2.5.1
236
+ signing_key:
237
+ specification_version: 4
238
+ summary: Toggl v8 API wrapper (See https://github.com/toggl/toggl_api_docs)
239
+ test_files:
240
+ - spec/lib/reportsv2_spec.rb
241
+ - spec/lib/togglv8/clients_spec.rb
242
+ - spec/lib/togglv8/dashboard_spec.rb
243
+ - spec/lib/togglv8/projects_spec.rb
244
+ - spec/lib/togglv8/tags_spec.rb
245
+ - spec/lib/togglv8/tasks_spec.rb
246
+ - spec/lib/togglv8/time_entries_spec.rb
247
+ - spec/lib/togglv8/users_spec.rb
248
+ - spec/lib/togglv8/workspaces_spec.rb
249
+ - spec/lib/togglv8_spec.rb
250
+ - spec/spec_helper.rb
251
+ - spec/togglv8_spec_helper.rb