harvest-ruby-v2 0.3.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11eefb4a95c2afe45777912d11df1af797579b171d93b5a1c6398b75749cd28a
4
- data.tar.gz: 6943ae64910c643dc5ef55da6507271d0c5e8899a993d88556fce8de67b135ec
3
+ metadata.gz: f341c06dfb732eeb0ab69f8a03d2d3a1d183c3afa1e200c14dba0cfe9e4bc81c
4
+ data.tar.gz: b10cb0684fb74ebb9a8e0dc87875b617a7b3c77af99ca5ed2dd75978c6fa7cf2
5
5
  SHA512:
6
- metadata.gz: 5d8fec631281d689903d475cc9c45d02e264c69906a86f6b42d23603031a879785f768d6a2e4e1df0fedac5a5b49e1a50d3dd0a3e72697a4a856657b9d39b166
7
- data.tar.gz: 26a5b2067684d9e3b7bf93ce0439417d3c8415d1a5e4b17813d98fecde178c66fa55810a1d346e9b4a95c82b3c0dcf50cfea21c7394bac62879e73e9368f0856
6
+ metadata.gz: bddbbd22c42beb25c7877adc7241b4d2feb61961c0f3ba61c5b774f34c9caf69a87239703a2e3eca0d7906a2b90e648b598492cc149c8d0752804d7f0bc58dd6
7
+ data.tar.gz: 8bdd8d98251fa443f0fbaf0b6665de237f64131aab1cc6d207c1305912f6891831bdd5eb8bf706e6d22696737209e9fccf158e8a9c3ba5625924254d5f8de086
@@ -0,0 +1,8 @@
1
+ ##########################
2
+ Changelog for harvest-ruby
3
+ ##########################
4
+
5
+ 0.5.0
6
+ ^^^^^
7
+
8
+ * Fixed bug with ApiCall which caused query params to not be passed to the underlying call.
data/Gemfile CHANGED
@@ -8,6 +8,7 @@ gemspec
8
8
  gem 'activesupport', '~> 6.0'
9
9
  gem 'configparser', '~> 0.1.7', group: :development
10
10
  gem 'pry', '~> 0.13.1', group: :development
11
+ gem 'pry-stack_explorer', '~> 0.5.1', group: :development
11
12
  gem 'rake', '~> 12.0', group: :development
12
13
  gem 'redcarpet', '~> 3.5', group: :development
13
14
  gem 'reek', '~> 6.0', group: :development
data/Rakefile CHANGED
@@ -9,6 +9,8 @@ RSpec::Core::RakeTask.new(:spec)
9
9
  RuboCop::RakeTask.new(:spec) do |rubocop|
10
10
  rubocop.options << '--auto-correct'
11
11
  rubocop.options << '--display-cop-names'
12
+ rubocop.options << '--extra-details'
13
+ rubocop.options << '--display-style-guide'
12
14
  end
13
15
 
14
16
  YARD::Rake::YardocTask.new do |t|
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'pry'
4
+ require 'pry-stack_explorer'
5
5
  require 'configparser'
6
6
  require 'date'
7
7
  require "bundler/setup"
@@ -11,6 +11,7 @@ require 'harvest/exceptions'
11
11
  require 'harvest/finders'
12
12
  require 'harvest/discovers'
13
13
  require 'harvest/creates'
14
+ require 'harvest/changers'
14
15
 
15
16
  # Conform to naming pattern of Finder, Discover, Creators.
16
17
  # @param key [Symbol] symbol of state
@@ -38,14 +39,17 @@ module Harvest
38
39
  @client = Harvest::HTTP::Api.new(**@config)
39
40
  @factory = Harvest::ResourceFactory.new
40
41
  @state = state
41
- @active_user = @factory.user(@client.api_call(@client.api_caller('/users/me')))
42
- @admin_api = if @active_user.is_admin
42
+ @admin_api = if active_user.is_admin
43
43
  config.admin_api
44
44
  else
45
45
  false
46
46
  end
47
47
  end
48
48
 
49
+ def active_user
50
+ @state[:active_user] ||= @factory.user(@client.api_call(@client.api_caller('/users/me')))
51
+ end
52
+
49
53
  def allowed?(meth)
50
54
  %i[
51
55
  projects
@@ -78,7 +82,7 @@ module Harvest
78
82
  super
79
83
  end
80
84
  rescue NoMethodError
81
- # binding.pry
85
+ # require 'pry'; binding.pry
82
86
  raise Harvest::Exceptions::BadState, "#{meth} is an invalid state change."
83
87
  end
84
88
 
@@ -90,6 +94,16 @@ module Harvest
90
94
  self
91
95
  end
92
96
 
97
+ # Find single instance of resource
98
+ def change(**kwargs)
99
+ @state[@state[:active]].map do |obj|
100
+ Harvest::Changers.const_get(to_class_name(@state[:active])).new.change(
101
+ @factory, @client, active_user, @state, kwargs
102
+ )
103
+ end
104
+ self
105
+ end
106
+
93
107
  # Discover resources
94
108
  def discover(**params)
95
109
  @state[@state[:active]] = Harvest::Discovers
@@ -101,6 +115,16 @@ module Harvest
101
115
  self
102
116
  end
103
117
 
118
+ # Create an instance of object based on state
119
+ def create(**kwargs)
120
+ @state[@state[:active]] = Harvest::Create.const_get(
121
+ to_class_name(@state[:active])
122
+ ).new.create(
123
+ @factory, @client, active_user, @state, kwargs
124
+ )
125
+ self
126
+ end
127
+
104
128
  # Select a subset of all items depending on state
105
129
  def select(&block)
106
130
  @state[@state[:active]] = @state[@state[:active]].select(&block)
@@ -116,15 +140,5 @@ module Harvest
116
140
  def data
117
141
  @state[@state[:active]]
118
142
  end
119
-
120
- # Create an instance of object based on state
121
- def create(**kwargs)
122
- @state[@state[:active]] = Harvest::Create.const_get(
123
- to_class_name(@state[:active])
124
- ).new.create(
125
- @factory, @client, active_user, @state, kwargs
126
- )
127
- self
128
- end
129
143
  end
130
144
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Harvest
4
+ module Changers
5
+ class TimeEntry
6
+ def change(factory, client, _active_user, state, kwargs)
7
+ # binding.pry
8
+ state[state[:active]].map do |te|
9
+ send(kwargs[:action].to_sym, factory, client, te)
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def restart(factory, client, te)
16
+ # PATCH /v2/time_entries/{TIME_ENTRY_ID}/restart
17
+ # binding.pry
18
+ [factory.time_entry(client.api_call(client.api_caller("time_entries/#{te.id}/restart", http_method: 'patch')))]
19
+ end
20
+
21
+ def stop(factory, client, te)
22
+ # PATCH /v2/time_entries/{TIME_ENTRY_ID}/stop
23
+ [factory.time_entry(client.api_call(client.api_caller("time_entries/#{te.id}/stop", http_method: 'patch')))]
24
+ end
25
+ end
26
+ end
27
+ end
@@ -34,8 +34,8 @@ module Harvest
34
34
 
35
35
  # @api private
36
36
  def time_entry_payload(kwargs)
37
- possible_keys = %i[spent_date notes external_reference user_id]
38
- payload = kwargs.map { |k, v| [k, v] if possible_keys.include?(k) }.to_h
37
+ possible_keys = %i[spent_date notes external_reference user_id project_id task_id]
38
+ payload = kwargs.each { |k, v| [k, v] if possible_keys.include?(k) }.to_h
39
39
  payload[:user_id] ||= @active_user.id
40
40
  payload[:task_id] = @state[:project_tasks][0].task.id
41
41
  payload[:project_id] = true_project(@state[:projects][0]).id
@@ -43,6 +43,9 @@ module Harvest
43
43
  paginator.path = 'time_entries'
44
44
  paginator.data_key = 'time_entries'
45
45
  paginator.param = params
46
+
47
+ # require 'pry'; binding.pry
48
+
46
49
  client.pagination(paginator).map do |time_entry|
47
50
  factory.time_entry(time_entry)
48
51
  end
@@ -10,7 +10,7 @@ module Harvest
10
10
 
11
11
  class TimeEntry
12
12
  def find(factory, client, id)
13
- [factory.time_entry(client.api_call(client.api_caller("time_entry/#{id}")))]
13
+ [factory.time_entry(client.api_call(client.api_caller("time_entries/#{id}")))]
14
14
  end
15
15
  end
16
16
  end
@@ -71,12 +71,11 @@ module Harvest
71
71
 
72
72
  # Make a api call to an endpoint.
73
73
  # @api public
74
- # @param struct [Struct::ApiCall]
74
+ # @param struct [ApiCall]
75
75
  def api_call(struct)
76
76
  JSON.parse(
77
77
  send(struct.http_method.to_sym, struct).tap do
78
- require 'pry'
79
- # binding.pry
78
+ # require 'pry'; binding.pry
80
79
  end
81
80
  )
82
81
  end
@@ -86,7 +85,9 @@ module Harvest
86
85
  # @param struct [Struct::Pagination]
87
86
  def pagination(struct)
88
87
  struct.param[:page] = struct.page_count
89
- page = api_call(struct.to_api_call)
88
+ page = api_call(struct.to_api_call).tap do
89
+ # require 'pry'; binding.pry
90
+ end
90
91
  struct.rows.concat(page[struct.data_key])
91
92
 
92
93
  return struct.rows if struct.page_count >= page['total_pages']
@@ -109,11 +110,11 @@ module Harvest
109
110
  end
110
111
 
111
112
  def api_caller(path, http_method: 'get', param: {}, payload: nil, headers: {})
112
- Struct::ApiCall.new(
113
+ ApiCall.new(
113
114
  {
114
115
  path: path,
115
116
  http_method: http_method.to_sym,
116
- param: param,
117
+ params: param,
117
118
  payload: payload,
118
119
  headers: headers
119
120
  }
@@ -126,22 +127,43 @@ module Harvest
126
127
  client[struct.path].get(struct.headers)
127
128
  end
128
129
 
130
+ def delete(struct)
131
+ client[struct.path].delete(struct.headers)
132
+ end
133
+
129
134
  def post(struct)
130
135
  client[struct.path].post(struct.payload, struct.headers)
131
136
  end
137
+
138
+ def patch(struct)
139
+ client[struct.path].patch(struct.payload, struct.headers)
140
+ end
132
141
  end
133
142
 
134
- Struct.new(
135
- 'ApiCall',
136
- :path,
137
- :http_method,
138
- :param,
139
- :payload,
140
- :headers,
141
- keyword_init: true
142
- ) do
143
- def param(params)
144
- headers['params'] = params
143
+ class NoOptionProvided; end
144
+
145
+ class ApiCall
146
+ attr_accessor :path, :http_method, :payload, :headers
147
+
148
+ def initialize(path:, payload: {}, http_method: 'get', headers: {}, params: {})
149
+ @path = path
150
+ @http_method = http_method
151
+ @payload = payload
152
+ @headers = headers
153
+ param(params)
154
+ end
155
+
156
+ def param(params = NoOptionProvided)
157
+ if params == NoOptionProvided
158
+ @headers['params']
159
+ else
160
+ @headers['params'] = params
161
+ end
162
+ end
163
+
164
+ def param=(params)
165
+ param(params)
166
+ self
145
167
  end
146
168
  end
147
169
 
@@ -158,11 +180,11 @@ module Harvest
158
180
  keyword_init: true
159
181
  ) do
160
182
  def to_api_call
161
- Struct::ApiCall.new(
162
- {
183
+ ApiCall.new(
184
+ **{
163
185
  path: path,
164
186
  http_method: http_method,
165
- param: param,
187
+ params: param,
166
188
  payload: payload,
167
189
  headers: headers
168
190
  }
@@ -208,11 +208,16 @@ module Harvest
208
208
  end
209
209
 
210
210
  def convert_dates(data)
211
- %i[created_at updated_at sent_at accepted_at declined_at spent_date].each do |key|
211
+ %i[created_at updated_at sent_at accepted_at declined_at].each do |key|
212
212
  if data.members.include?(key) && !data.method(key).call.nil?
213
213
  data.method("#{key}=").call(DateTime.strptime(data.method(key).call))
214
214
  end
215
215
  end
216
+ %i[spent_date].each do |key|
217
+ if data.members.include?(key) && !data.method(key).call.nil?
218
+ data.method("#{key}=").call(Date.strptime(data.method(key).call))
219
+ end
220
+ end
216
221
  data
217
222
  end
218
223
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Harvest
4
- VERSION = '0.3.1'
4
+ VERSION = '0.5.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: harvest-ruby-v2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig Davis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-20 00:00:00.000000000 Z
11
+ date: 2020-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -61,6 +61,7 @@ files:
61
61
  - bin/setup
62
62
  - harvest-ruby-v2.gemspec
63
63
  - lib/harvest.rb
64
+ - lib/harvest/changers.rb
64
65
  - lib/harvest/client.rb
65
66
  - lib/harvest/config.rb
66
67
  - lib/harvest/creates.rb