togglv8-lastobelus 1.2.2

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).sort {|a,b| a['id'] <=> b['id']}
16
+ expect(users.length).to eq 2
17
+
18
+ expect(users.first['id']).to eq Testing::USER_ID
19
+ expect(users.first['email']).to eq Testing::EMAIL
20
+ expect(users.first['fullname']).to eq Testing::USERNAME
21
+ expect(users.first['default_wid']).to eq @workspace_id
22
+
23
+ expect(users.last['id']).to eq Testing::OTHER_USER_ID
24
+ expect(users.last['email']).to eq Testing::OTHER_EMAIL
25
+ expect(users.last['fullname']).to eq Testing::OTHER_USERNAME
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,88 @@
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 'initializes with .toggl file ending with a newline' do
49
+ toggl_file = File.join(@tmp_home, '.toggl')
50
+ File.open(toggl_file, 'w') { |file| file.write(Testing::API_TOKEN + "\n") }
51
+
52
+ toggl = TogglV8::API.new
53
+ me = toggl.me
54
+ expect(me).to_not be nil
55
+ expect(me['api_token']).to eq Testing::API_TOKEN
56
+ expect(me['email']).to eq Testing::EMAIL
57
+ end
58
+
59
+ it 'raises error if .toggl file is missing' do
60
+ expect{ toggl = TogglV8::API.new }.to raise_error(RuntimeError)
61
+ end
62
+ end
63
+
64
+ context 'handles errors' do
65
+ before :all do
66
+ @toggl = TogglV8::API.new(Testing::API_TOKEN)
67
+ end
68
+
69
+ it 'surfaces an HTTP Status Code in case of error' do
70
+ expect(@toggl.conn).to receive(:get).once.and_return(
71
+ MockResponse.new(400, {}, 'body'))
72
+ expect { @toggl.me }.to raise_error(RuntimeError, "HTTP Status: 400")
73
+ end
74
+
75
+ it 'retries a request up to 3 times if a 429 is received' do
76
+ expect(@toggl.conn).to receive(:get).exactly(3).times.and_return(
77
+ MockResponse.new(429, {}, 'body'))
78
+ expect { @toggl.me }.to raise_error(RuntimeError, "HTTP Status: 429")
79
+ end
80
+
81
+ it 'retries a request after 429' do
82
+ expect(@toggl.conn).to receive(:get).twice.and_return(
83
+ MockResponse.new(429, {}, 'body'),
84
+ MockResponse.new(200, {}, nil))
85
+ expect(@toggl.me).to eq({}) # response is {} in this case because body is nil
86
+ end
87
+ end
88
+ 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:
data/togglv8.gemspec ADDED
@@ -0,0 +1,31 @@
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-lastobelus"
8
+ spec.version = TogglV8::VERSION
9
+ spec.authors = ["Tom Kane", "Michael Johnston"]
10
+ spec.email = ["kexf7pqsdu@snkmail.com"]
11
+ spec.summary = %q{Toggl v8 API wrapper (See https://github.com/toggl/toggl_api_docs). Fork by lastobelus for bugfixes/personal-enhancements.}
12
+ spec.homepage = "https://github.com/lastobelus/togglv8-lastobelus"
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
+
29
+ spec.add_dependency "faraday"
30
+ spec.add_dependency "oj"
31
+ end
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: togglv8-lastobelus
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.2
5
+ platform: ruby
6
+ authors:
7
+ - Tom Kane
8
+ - Michael Johnston
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2020-02-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec-mocks
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: fivemat
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: coveralls
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: faraday
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: oj
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description:
127
+ email:
128
+ - kexf7pqsdu@snkmail.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".codeclimate.yml"
134
+ - ".coveralls.yml"
135
+ - ".gitignore"
136
+ - ".rdoc_options"
137
+ - ".rspec"
138
+ - ".rubocop.yml"
139
+ - ".travis.yml"
140
+ - CHANGELOG.md
141
+ - Gemfile
142
+ - LICENSE.txt
143
+ - README.md
144
+ - Rakefile
145
+ - lib/logging.rb
146
+ - lib/reportsv2.rb
147
+ - lib/togglv8.rb
148
+ - lib/togglv8/clients.rb
149
+ - lib/togglv8/connection.rb
150
+ - lib/togglv8/dashboard.rb
151
+ - lib/togglv8/project_users.rb
152
+ - lib/togglv8/projects.rb
153
+ - lib/togglv8/tags.rb
154
+ - lib/togglv8/tasks.rb
155
+ - lib/togglv8/time_entries.rb
156
+ - lib/togglv8/togglv8.rb
157
+ - lib/togglv8/users.rb
158
+ - lib/togglv8/version.rb
159
+ - lib/togglv8/workspaces.rb
160
+ - spec/lib/reportsv2_spec.rb
161
+ - spec/lib/togglv8/clients_spec.rb
162
+ - spec/lib/togglv8/dashboard_spec.rb
163
+ - spec/lib/togglv8/projects_spec.rb
164
+ - spec/lib/togglv8/tags_spec.rb
165
+ - spec/lib/togglv8/tasks_spec.rb
166
+ - spec/lib/togglv8/time_entries_spec.rb
167
+ - spec/lib/togglv8/users_spec.rb
168
+ - spec/lib/togglv8/workspaces_spec.rb
169
+ - spec/lib/togglv8_spec.rb
170
+ - spec/spec_helper.rb
171
+ - spec/togglv8_spec_helper.rb
172
+ - togglv8.gemspec
173
+ homepage: https://github.com/lastobelus/togglv8-lastobelus
174
+ licenses:
175
+ - MIT
176
+ metadata: {}
177
+ post_install_message:
178
+ rdoc_options: []
179
+ require_paths:
180
+ - lib
181
+ required_ruby_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ requirements:
192
+ - A Toggl account (https://toggl.com/)
193
+ rubygems_version: 3.0.6
194
+ signing_key:
195
+ specification_version: 4
196
+ summary: Toggl v8 API wrapper (See https://github.com/toggl/toggl_api_docs). Fork
197
+ by lastobelus for bugfixes/personal-enhancements.
198
+ test_files:
199
+ - spec/lib/reportsv2_spec.rb
200
+ - spec/lib/togglv8/clients_spec.rb
201
+ - spec/lib/togglv8/dashboard_spec.rb
202
+ - spec/lib/togglv8/projects_spec.rb
203
+ - spec/lib/togglv8/tags_spec.rb
204
+ - spec/lib/togglv8/tasks_spec.rb
205
+ - spec/lib/togglv8/time_entries_spec.rb
206
+ - spec/lib/togglv8/users_spec.rb
207
+ - spec/lib/togglv8/workspaces_spec.rb
208
+ - spec/lib/togglv8_spec.rb
209
+ - spec/spec_helper.rb
210
+ - spec/togglv8_spec_helper.rb