harvesting 0.1.0 → 0.5.1

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