harvesting 0.1.0 → 0.5.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +10 -0
  3. data/.gitignore +13 -0
  4. data/.travis.yml +7 -2
  5. data/Dockerfile +6 -0
  6. data/README.md +173 -32
  7. data/RELEASE_NOTES.md +80 -0
  8. data/TODO.md +1 -1
  9. data/bin/console +1 -0
  10. data/bin/setup +5 -0
  11. data/docker-compose.yml +10 -0
  12. data/harvesting.gemspec +9 -6
  13. data/lib/harvesting.rb +20 -5
  14. data/lib/harvesting/client.rb +76 -15
  15. data/lib/harvesting/enumerable.rb +5 -2
  16. data/lib/harvesting/errors.rb +9 -0
  17. data/lib/harvesting/models/base.rb +93 -12
  18. data/lib/harvesting/models/client.rb +7 -1
  19. data/lib/harvesting/models/clients.rb +18 -0
  20. data/lib/harvesting/models/contact.rb +14 -1
  21. data/lib/harvesting/models/harvest_record.rb +18 -0
  22. data/lib/harvesting/models/harvest_record_collection.rb +43 -0
  23. data/lib/harvesting/models/invoice.rb +44 -0
  24. data/lib/harvesting/models/invoices.rb +17 -0
  25. data/lib/harvesting/models/line_item.rb +19 -0
  26. data/lib/harvesting/models/project.rb +28 -3
  27. data/lib/harvesting/models/project_task_assignment.rb +33 -0
  28. data/lib/harvesting/models/project_task_assignments.rb +18 -0
  29. data/lib/harvesting/models/project_user_assignment.rb +25 -0
  30. data/lib/harvesting/models/project_user_assignments.rb +19 -0
  31. data/lib/harvesting/models/projects.rb +6 -33
  32. data/lib/harvesting/models/task.rb +6 -3
  33. data/lib/harvesting/models/tasks.rb +6 -33
  34. data/lib/harvesting/models/time_entries.rb +6 -33
  35. data/lib/harvesting/models/time_entry.rb +22 -8
  36. data/lib/harvesting/models/user.rb +20 -6
  37. data/lib/harvesting/models/users.rb +18 -0
  38. data/lib/harvesting/version.rb +1 -1
  39. metadata +90 -21
  40. data/Gemfile.lock +0 -103
@@ -1,12 +1,13 @@
1
1
  module Harvesting
2
2
  module Models
3
- class TimeEntry < Base
3
+ # A time entry record from your Harvest account.
4
+ #
5
+ # For more information: https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/
6
+ class TimeEntry < HarvestRecord
4
7
  attributed :id,
5
8
  :spent_date,
6
9
  :hours,
7
10
  :notes,
8
- :created_at,
9
- :updated_at,
10
11
  :is_locked,
11
12
  :locked_reason,
12
13
  :is_closed,
@@ -15,18 +16,31 @@ module Harvesting
15
16
  :started_time,
16
17
  :ended_time,
17
18
  :is_running,
18
- :invoice,
19
- :external_reference,
20
19
  :billable,
21
20
  :budgeted,
22
21
  :billable_rate,
23
22
  :cost_rate,
24
- :project_id,
25
- :task_id
23
+ :invoice,
24
+ :external_reference,
25
+ :created_at,
26
+ :updated_at
27
+
28
+ modeled project: Project,
29
+ user: User,
30
+ task: Task,
31
+ client: Client,
32
+ task_assignment: ProjectTaskAssignment,
33
+ user_assignment: ProjectUserAssignment
34
+
26
35
 
27
36
  def path
28
- id.nil? ? "time_entries" : "time_entries/#{id}"
37
+ @attributes['id'].nil? ? "time_entries" : "time_entries/#{@attributes['id']}"
29
38
  end
39
+
40
+ def to_hash
41
+ { project_id: project.id, task_id: task.id, user_id: user.id }.merge(super)
42
+ end
43
+
30
44
  end
31
45
  end
32
46
  end
@@ -1,25 +1,39 @@
1
1
  module Harvesting
2
2
  module Models
3
- class User < Base
3
+ # An user record from your Harvest account.
4
+ #
5
+ # For more information: https://help.getharvest.com/api-v2/users-api/users/users/
6
+ class User < HarvestRecord
4
7
  attributed :id,
8
+ :name,
5
9
  :first_name,
6
10
  :last_name,
7
11
  :email,
8
12
  :telephone,
9
13
  :timezone,
10
- :weekly_capacity,
11
14
  :has_access_to_all_future_projects,
12
15
  :is_contractor,
13
16
  :is_admin,
14
17
  :is_project_manager,
15
18
  :can_see_rates,
16
- :can_create_projects,
17
19
  :can_create_invoices,
20
+ :can_create_projects,
18
21
  :is_active,
19
- :created_at,
20
- :updated_at,
22
+ :weekly_capacity,
23
+ :default_hourly_rate,
24
+ :cost_rate,
21
25
  :roles,
22
- :avatar_url
26
+ :avatar_url,
27
+ :created_at,
28
+ :updated_at
29
+
30
+ def path
31
+ @attributes['id'].nil? ? "users" : "users/#{@attributes['id']}"
32
+ end
33
+
34
+ def name
35
+ @attributes['name'].nil? ? "#{first_name} #{last_name}" : @attributes['name']
36
+ end
23
37
  end
24
38
  end
25
39
  end
@@ -0,0 +1,18 @@
1
+ module Harvesting
2
+ module Models
3
+ class Users < HarvestRecordCollection
4
+
5
+ def initialize(attrs, query_opts = {}, opts = {})
6
+ super(attrs.reject {|k,v| k == "users" }, query_opts, opts)
7
+ @entries = attrs["users"].map do |entry|
8
+ User.new(entry, harvest_client: opts[:harvest_client])
9
+ end
10
+ end
11
+
12
+ def fetch_next_page
13
+ @entries += harvest_client.users(next_page_query_opts).entries
14
+ @attributes['page'] = page + 1
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module Harvesting
2
- VERSION = "0.1.0"
2
+ VERSION = "0.5.1".freeze
3
3
  end
metadata CHANGED
@@ -1,63 +1,70 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: harvesting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ernesto Tagwerker
8
- autorequire:
8
+ - M. Scott Ford
9
+ autorequire:
9
10
  bindir: exe
10
11
  cert_chain: []
11
- date: 2018-09-04 00:00:00.000000000 Z
12
+ date: 2021-01-15 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: http
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.3'
20
18
  - - ">="
21
19
  - !ruby/object:Gem::Version
22
20
  version: '3.3'
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '5.0'
23
24
  type: :runtime
24
25
  prerelease: false
25
26
  version_requirements: !ruby/object:Gem::Requirement
26
27
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '3.3'
30
28
  - - ">="
31
29
  - !ruby/object:Gem::Version
32
30
  version: '3.3'
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
33
34
  - !ruby/object:Gem::Dependency
34
35
  name: bundler
35
36
  requirement: !ruby/object:Gem::Requirement
36
37
  requirements:
37
- - - "~>"
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - - "<"
38
42
  - !ruby/object:Gem::Version
39
- version: '1.16'
43
+ version: '3.0'
40
44
  type: :development
41
45
  prerelease: false
42
46
  version_requirements: !ruby/object:Gem::Requirement
43
47
  requirements:
44
- - - "~>"
48
+ - - ">="
45
49
  - !ruby/object:Gem::Version
46
- version: '1.16'
50
+ version: '2.0'
51
+ - - "<"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
47
54
  - !ruby/object:Gem::Dependency
48
55
  name: rake
49
56
  requirement: !ruby/object:Gem::Requirement
50
57
  requirements:
51
58
  - - "~>"
52
59
  - !ruby/object:Gem::Version
53
- version: '10.0'
60
+ version: '13.0'
54
61
  type: :development
55
62
  prerelease: false
56
63
  version_requirements: !ruby/object:Gem::Requirement
57
64
  requirements:
58
65
  - - "~>"
59
66
  - !ruby/object:Gem::Version
60
- version: '10.0'
67
+ version: '13.0'
61
68
  - !ruby/object:Gem::Dependency
62
69
  name: rspec
63
70
  requirement: !ruby/object:Gem::Requirement
@@ -152,25 +159,77 @@ dependencies:
152
159
  - - ">="
153
160
  - !ruby/object:Gem::Version
154
161
  version: '3.4'
162
+ - !ruby/object:Gem::Dependency
163
+ name: dotenv
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '2.5'
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '2.5'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: '2.5'
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '2.5'
182
+ - !ruby/object:Gem::Dependency
183
+ name: simplecov
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: 0.19.0
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: 0.19.0
196
+ - !ruby/object:Gem::Dependency
197
+ name: codecov
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: 0.2.9
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: 0.2.9
155
210
  description: Interact with the Harvest API v2.0 from your Ruby application
156
211
  email:
157
212
  - ernesto+github@ombulabs.com
213
+ - scott@mscottford.com
158
214
  executables: []
159
215
  extensions: []
160
216
  extra_rdoc_files: []
161
217
  files:
218
+ - ".env.sample"
162
219
  - ".gitignore"
163
220
  - ".travis.yml"
164
221
  - CODE_OF_CONDUCT.md
222
+ - Dockerfile
165
223
  - Gemfile
166
- - Gemfile.lock
167
224
  - Guardfile
168
225
  - LICENSE.txt
169
226
  - README.md
227
+ - RELEASE_NOTES.md
170
228
  - Rakefile
171
229
  - TODO.md
172
230
  - bin/console
173
231
  - bin/setup
232
+ - docker-compose.yml
174
233
  - harvesting.gemspec
175
234
  - lib/harvesting.rb
176
235
  - lib/harvesting/client.rb
@@ -178,20 +237,31 @@ files:
178
237
  - lib/harvesting/errors.rb
179
238
  - lib/harvesting/models/base.rb
180
239
  - lib/harvesting/models/client.rb
240
+ - lib/harvesting/models/clients.rb
181
241
  - lib/harvesting/models/contact.rb
242
+ - lib/harvesting/models/harvest_record.rb
243
+ - lib/harvesting/models/harvest_record_collection.rb
244
+ - lib/harvesting/models/invoice.rb
245
+ - lib/harvesting/models/invoices.rb
246
+ - lib/harvesting/models/line_item.rb
182
247
  - lib/harvesting/models/project.rb
248
+ - lib/harvesting/models/project_task_assignment.rb
249
+ - lib/harvesting/models/project_task_assignments.rb
250
+ - lib/harvesting/models/project_user_assignment.rb
251
+ - lib/harvesting/models/project_user_assignments.rb
183
252
  - lib/harvesting/models/projects.rb
184
253
  - lib/harvesting/models/task.rb
185
254
  - lib/harvesting/models/tasks.rb
186
255
  - lib/harvesting/models/time_entries.rb
187
256
  - lib/harvesting/models/time_entry.rb
188
257
  - lib/harvesting/models/user.rb
258
+ - lib/harvesting/models/users.rb
189
259
  - lib/harvesting/version.rb
190
- homepage: https://github.com/ombulabs/harvesting
260
+ homepage: https://github.com/fastruby/harvesting
191
261
  licenses:
192
262
  - MIT
193
263
  metadata: {}
194
- post_install_message:
264
+ post_install_message:
195
265
  rdoc_options: []
196
266
  require_paths:
197
267
  - lib
@@ -206,9 +276,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
276
  - !ruby/object:Gem::Version
207
277
  version: '0'
208
278
  requirements: []
209
- rubyforge_project:
210
- rubygems_version: 2.7.6
211
- signing_key:
279
+ rubygems_version: 3.1.3
280
+ signing_key:
212
281
  specification_version: 4
213
282
  summary: Ruby wrapper for the Harvest API v2.0
214
283
  test_files: []
@@ -1,103 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- harvesting (0.1.0)
5
- http (~> 3.3, >= 3.3)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- addressable (2.5.2)
11
- public_suffix (>= 2.0.2, < 4.0)
12
- byebug (10.0.2)
13
- coderay (1.1.2)
14
- crack (0.4.3)
15
- safe_yaml (~> 1.0.0)
16
- diff-lcs (1.3)
17
- domain_name (0.5.20180417)
18
- unf (>= 0.0.5, < 1.0.0)
19
- ffi (1.9.23)
20
- formatador (0.2.5)
21
- guard (2.14.2)
22
- formatador (>= 0.2.4)
23
- listen (>= 2.7, < 4.0)
24
- lumberjack (>= 1.0.12, < 2.0)
25
- nenv (~> 0.1)
26
- notiffany (~> 0.0)
27
- pry (>= 0.9.12)
28
- shellany (~> 0.0)
29
- thor (>= 0.18.1)
30
- guard-compat (1.2.1)
31
- guard-rspec (4.7.3)
32
- guard (~> 2.1)
33
- guard-compat (~> 1.1)
34
- rspec (>= 2.99.0, < 4.0)
35
- hashdiff (0.3.7)
36
- http (3.3.0)
37
- addressable (~> 2.3)
38
- http-cookie (~> 1.0)
39
- http-form_data (~> 2.0)
40
- http_parser.rb (~> 0.6.0)
41
- http-cookie (1.0.3)
42
- domain_name (~> 0.5)
43
- http-form_data (2.1.1)
44
- http_parser.rb (0.6.0)
45
- listen (3.1.5)
46
- rb-fsevent (~> 0.9, >= 0.9.4)
47
- rb-inotify (~> 0.9, >= 0.9.7)
48
- ruby_dep (~> 1.2)
49
- lumberjack (1.0.13)
50
- method_source (0.9.0)
51
- nenv (0.3.0)
52
- notiffany (0.1.1)
53
- nenv (~> 0.1)
54
- shellany (~> 0.0)
55
- pry (0.11.3)
56
- coderay (~> 1.1.0)
57
- method_source (~> 0.9.0)
58
- public_suffix (3.0.2)
59
- rake (10.5.0)
60
- rb-fsevent (0.10.3)
61
- rb-inotify (0.9.10)
62
- ffi (>= 0.5.0, < 2)
63
- rspec (3.7.0)
64
- rspec-core (~> 3.7.0)
65
- rspec-expectations (~> 3.7.0)
66
- rspec-mocks (~> 3.7.0)
67
- rspec-core (3.7.1)
68
- rspec-support (~> 3.7.0)
69
- rspec-expectations (3.7.0)
70
- diff-lcs (>= 1.2.0, < 2.0)
71
- rspec-support (~> 3.7.0)
72
- rspec-mocks (3.7.0)
73
- diff-lcs (>= 1.2.0, < 2.0)
74
- rspec-support (~> 3.7.0)
75
- rspec-support (3.7.1)
76
- ruby_dep (1.5.0)
77
- safe_yaml (1.0.4)
78
- shellany (0.0.1)
79
- thor (0.20.0)
80
- unf (0.1.4)
81
- unf_ext
82
- unf_ext (0.0.7.5)
83
- vcr (4.0.0)
84
- webmock (3.4.0)
85
- addressable (>= 2.3.6)
86
- crack (>= 0.3.2)
87
- hashdiff
88
-
89
- PLATFORMS
90
- ruby
91
-
92
- DEPENDENCIES
93
- bundler (~> 1.16)
94
- byebug (~> 10.0, >= 10.0)
95
- guard-rspec (~> 4.7, >= 4.7)
96
- harvesting!
97
- rake (~> 10.0)
98
- rspec (~> 3.0)
99
- vcr (~> 4.0, >= 4.0)
100
- webmock (~> 3.4, >= 3.4)
101
-
102
- BUNDLED WITH
103
- 1.16.1