togglv8-lastobelus 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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