tfl-toggl 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,45 @@
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 2
17
+
18
+ expect(users.first['id']).to eq Testing::OTHER_USER_ID
19
+ expect(users.first['email']).to eq Testing::OTHER_EMAIL
20
+ expect(users.first['fullname']).to eq Testing::OTHER_USERNAME
21
+
22
+ expect(users.last['id']).to eq Testing::USER_ID
23
+ expect(users.last['email']).to eq Testing::EMAIL
24
+ expect(users.last['fullname']).to eq Testing::USERNAME
25
+ expect(users.last['default_wid']).to eq @workspace_id
26
+ end
27
+
28
+ context 'tasks', :pro_account do
29
+ before :each do
30
+ @task = @toggl.create_task('name' => 'workspace task', 'pid' => @project['id'])
31
+ end
32
+
33
+ after :each do
34
+ @toggl.delete_task(@task['id'])
35
+ end
36
+
37
+ it 'shows tasks' do
38
+ tasks = @toggl.tasks(@workspace_id)
39
+ expect(tasks.length).to eq 1
40
+ expect(tasks.first['name']).to eq 'workspace task'
41
+ expect(tasks.first['pid']).to eq @project['id']
42
+ expect(tasks.first['wid']).to eq @workspace_id
43
+ end
44
+ end
45
+ 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,87 @@
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_relative 'togglv8_spec_helper'
11
+ require_relative '../lib/togglv8'
12
+
13
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
14
+ RSpec.configure do |config|
15
+ config.filter_run :focus
16
+ config.filter_run_excluding :pro_account unless ENV['TOGGL_PRO_ACCOUNT']
17
+ config.run_all_when_everything_filtered = true
18
+
19
+ config.order = :random
20
+ Kernel.srand config.seed
21
+
22
+ config.expect_with :rspec do |expectations|
23
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
24
+ expectations.syntax = :expect
25
+ end
26
+
27
+ config.mock_with :rspec do |mocks|
28
+ mocks.verify_partial_doubles = true
29
+ end
30
+
31
+ config.before(:suite) do
32
+ toggl = TogglV8::API.new(Testing::API_TOKEN)
33
+ TogglV8SpecHelper.setUp(toggl) # start tests from known state
34
+ end
35
+ end
36
+
37
+ class MockResponse
38
+ # https://github.com/lostisland/faraday/blob/master/lib/faraday/response.rb
39
+
40
+ attr_accessor :status, :headers, :body, :env
41
+
42
+ def initialize(status, headers, body)
43
+ @status = status
44
+ @headers = headers
45
+ @body = body
46
+ end
47
+
48
+ def success?
49
+ @status == 200
50
+ end
51
+ end
52
+
53
+ def mktemp_dir
54
+ dir = File.join(Dir.pwd, "tmp-#{Time.now.to_f}")
55
+ Dir.mkdir(dir)
56
+ dir
57
+ end
58
+
59
+ def file_contains(filename, pattern, maxlen=1000)
60
+ expect(File.exist?(filename))
61
+ contents = File.new(filename).sysread(maxlen)
62
+ expect(contents).to match pattern
63
+ end
64
+
65
+ def file_is_pdf(filename)
66
+ expect(File.exist?(filename))
67
+ first_line = File.foreach(filename).first
68
+ expect(first_line).to eq "%PDF-1.3\n"
69
+ end
70
+
71
+ def file_is_xls(filename)
72
+ expect(File.exist?(filename))
73
+ header = File.new(filename).sysread(8)
74
+ expect(header).to eq ['D0CF11E0A1B11AE1'].pack("H*")
75
+ end
76
+
77
+ class Testing
78
+ API_TOKEN = ENV['API_TOKEN'] || '4880adbe1bee9a241fa08070d33bd49f'
79
+ EMAIL = ENV['EMAIL'] || 'togglv8@mailinator.com'
80
+ USERNAME = ENV['USERNAME'] || 'togglv8'
81
+ PASSWORD = ENV['PASSWORD'] || 'togglv8'
82
+ USER_ID = (ENV['USER_ID'] || 1820939).to_i
83
+
84
+ OTHER_EMAIL = ENV['OTHER_EMAIL'] || 'pr5zwux59w@snkmail.com'
85
+ OTHER_USERNAME = ENV['OTHER_USERNAME'] || 'Pr5zwux59w'
86
+ OTHER_USER_ID = (ENV['OTHER_USER_ID'] || 2450739).to_i
87
+ 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:
@@ -0,0 +1,33 @@
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 = "tfl-toggl"
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://github.com/trifinlabs/togglv8"
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 "fivemat"
27
+ spec.add_development_dependency "coveralls"
28
+ # spec.add_development_dependency "awesome_print"
29
+
30
+ spec.add_dependency "logger"
31
+ spec.add_dependency "faraday"
32
+ spec.add_dependency "oj"
33
+ end
metadata ADDED
@@ -0,0 +1,223 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tfl-toggl
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: fivemat
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: coveralls
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: logger
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
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: faraday
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
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: oj
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
+ description:
140
+ email:
141
+ - sfielder@trifinlabs.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".codeclimate.yml"
147
+ - ".coveralls.yml"
148
+ - ".gitignore"
149
+ - ".rdoc_options"
150
+ - ".rspec"
151
+ - ".rubocop.yml"
152
+ - ".travis.yml"
153
+ - CHANGELOG.md
154
+ - Gemfile
155
+ - LICENSE.txt
156
+ - README.md
157
+ - Rakefile
158
+ - lib/logging.rb
159
+ - lib/reportsv2.rb
160
+ - lib/togglv8.rb
161
+ - lib/togglv8/clients.rb
162
+ - lib/togglv8/connection.rb
163
+ - lib/togglv8/dashboard.rb
164
+ - lib/togglv8/project_users.rb
165
+ - lib/togglv8/projects.rb
166
+ - lib/togglv8/tags.rb
167
+ - lib/togglv8/tasks.rb
168
+ - lib/togglv8/time_entries.rb
169
+ - lib/togglv8/togglv8.rb
170
+ - lib/togglv8/users.rb
171
+ - lib/togglv8/version.rb
172
+ - lib/togglv8/workspaces.rb
173
+ - spec/lib/reportsv2_spec.rb
174
+ - spec/lib/togglv8/clients_spec.rb
175
+ - spec/lib/togglv8/dashboard_spec.rb
176
+ - spec/lib/togglv8/projects_spec.rb
177
+ - spec/lib/togglv8/tags_spec.rb
178
+ - spec/lib/togglv8/tasks_spec.rb
179
+ - spec/lib/togglv8/time_entries_spec.rb
180
+ - spec/lib/togglv8/users_spec.rb
181
+ - spec/lib/togglv8/workspaces_spec.rb
182
+ - spec/lib/togglv8_spec.rb
183
+ - spec/spec_helper.rb
184
+ - spec/togglv8_spec_helper.rb
185
+ - togglv8.gemspec
186
+ homepage: https://github.com/trifinlabs/togglv8
187
+ licenses:
188
+ - MIT
189
+ metadata: {}
190
+ post_install_message:
191
+ rdoc_options: []
192
+ require_paths:
193
+ - lib
194
+ required_ruby_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ required_rubygems_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ requirements:
205
+ - A Toggl account (https://toggl.com/)
206
+ rubyforge_project:
207
+ rubygems_version: 2.5.1
208
+ signing_key:
209
+ specification_version: 4
210
+ summary: Toggl v8 API wrapper (See https://github.com/toggl/toggl_api_docs)
211
+ test_files:
212
+ - spec/lib/reportsv2_spec.rb
213
+ - spec/lib/togglv8/clients_spec.rb
214
+ - spec/lib/togglv8/dashboard_spec.rb
215
+ - spec/lib/togglv8/projects_spec.rb
216
+ - spec/lib/togglv8/tags_spec.rb
217
+ - spec/lib/togglv8/tasks_spec.rb
218
+ - spec/lib/togglv8/time_entries_spec.rb
219
+ - spec/lib/togglv8/users_spec.rb
220
+ - spec/lib/togglv8/workspaces_spec.rb
221
+ - spec/lib/togglv8_spec.rb
222
+ - spec/spec_helper.rb
223
+ - spec/togglv8_spec_helper.rb