greenhouse_io 2.3.0 → 2.3.1

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
  SHA1:
3
- metadata.gz: 49c8386a45c7b5482cf1a4df48efdf410207e8b3
4
- data.tar.gz: c252b865695cb9945d0c17540765c79ae5ff98f5
3
+ metadata.gz: 9dd09e95805fe4b610dce4448a7caeaf045090aa
4
+ data.tar.gz: 141396f8491cfbf28f193c69dcec7af6d8f319b1
5
5
  SHA512:
6
- metadata.gz: 9b94a10545b93f7ef797f9b4b4f345c47df0a00fa5ca6d4faf3ddc82078f74985b0441e95c6fe29669f61996bc1becab8f66d82623eea9e830faf4dd08a5167c
7
- data.tar.gz: d09df4cd029729e6c22b367e36759b32ef1dce96057574b990ca874f5d2c030a805474a25eef0232ccba71d5dd7389e96b8a9269ac1ea2c2027cad6871405aeb
6
+ metadata.gz: f7289af592c6275e6577a1a9236088e875100099a8301a69c5f9c6d1f9e2bdf15f627cdcd754e5af0b6a6ced6d63fff9cd36b1c698493aa12b5d0c00ed087cb2
7
+ data.tar.gz: 076bcb038e271ff443ed58cef5769f4e9be601e6d1de620c6942201799b0d29b88c0814d3804bf887e0d2ec8e3722311c469e4096c2144f96f264c5c8ae65875
data/CHANGES.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  This project follows [semantic versioning](http://semver.org/). This changelog follows suggestions from [keepachangelog.com](http://keepachangelog.com/).
4
4
 
5
+ ## Version 2.3.1
6
+ Released 2016-04-20.
7
+
8
+ #### Added
9
+ - Added method `create_candidate_note`. Thanks for contributing, [@jleven](https://github.com/jleven)!
10
+
5
11
  ## Version 2.3.0
6
12
  Released 2016-02-13.
7
13
 
data/README.md CHANGED
@@ -116,6 +116,27 @@ If you've configured the gem with a default `api_token`, then you can just insta
116
116
  gh_client = GreenhouseIo::Client.new
117
117
  ```
118
118
 
119
+ #### Listing candidates
120
+
121
+ ```
122
+ gh_client.candidates
123
+ ```
124
+
125
+ #### Creating a candidate note
126
+ Use this method to attach a new note to a candidate.
127
+
128
+ ```
129
+ candidate_id = 4567
130
+ author_id = 123 # ID of the user who wrote this note
131
+ note = {
132
+ :user_id => 123,
133
+ :message => "This candidate has very strong opinions about Node.JS.",
134
+ :visibility => "public"
135
+ }
136
+
137
+ gh_client.create_candidate_note(candidate_id, note, author_id)
138
+ ```
139
+
119
140
  #### Throttling
120
141
 
121
142
  Rate limit and rate limit remaining are available after making an API request with an API client:
@@ -135,7 +156,7 @@ gh_client.offices(id, page: 1, per_page: 2)
135
156
 
136
157
  #### Available methods
137
158
 
138
- Methods in which an `id` is optional:
159
+ Methods for which an `id` is optional:
139
160
 
140
161
  * `offices`
141
162
  * `departments`
@@ -147,13 +168,14 @@ Methods in which an `id` is optional:
147
168
  * `all_scorecards`
148
169
  * `offers`
149
170
 
150
- Methods in which an `id` is **required**:
171
+ Methods for which an `id` is **required**:
151
172
 
152
173
  * `activity_feed` *(requires a candidate ID)*
153
174
  * `scorecards` *(requires an application ID)*
154
175
  * `scheduled_interviews` *(requires an application ID)*
155
176
  * `stages` *(requires a job ID)*
156
177
  * `job_post` *(requires a job ID)*
178
+ * `create_candidate_note` *(requires a candidate ID)*
157
179
 
158
180
  ## Contributing
159
181
 
@@ -162,3 +184,5 @@ Methods in which an `id` is **required**:
162
184
  3. Commit your changes (`git commit -am 'Add some feature'`)
163
185
  4. Push to the branch (`git push origin my-new-feature`)
164
186
  5. Create new Pull Request
187
+
188
+ Contributions are always welcome!
data/lib/greenhouse_io.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'httmultiparty'
2
2
  require 'multi_json'
3
- require 'cgi'
3
+ require 'json'
4
4
 
5
5
  require "greenhouse_io/version"
6
6
  require "greenhouse_io/error"
@@ -32,6 +32,14 @@ module GreenhouseIo
32
32
  get_from_harvest_api "/candidates/#{id}/activity_feed", options
33
33
  end
34
34
 
35
+ def create_candidate_note(candidate_id, note_hash, on_behalf_of)
36
+ post_to_harvest_api(
37
+ "/candidates/#{candidate_id}/activity_feed/notes",
38
+ note_hash,
39
+ { 'On-Behalf-Of' => on_behalf_of.to_s }
40
+ )
41
+ end
42
+
35
43
  def applications(id = nil, options = {})
36
44
  get_from_harvest_api "/applications#{path_id(id)}", options
37
45
  end
@@ -79,8 +87,29 @@ module GreenhouseIo
79
87
  end
80
88
 
81
89
  def get_from_harvest_api(url, options = {})
82
- response = get_response(url, query: permitted_options(options), basic_auth: basic_auth)
90
+ response = get_response(url, {
91
+ :query => permitted_options(options),
92
+ :basic_auth => basic_auth
93
+ })
94
+
95
+ set_rate_limits(response.headers)
96
+
97
+ if response.code == 200
98
+ parse_json(response)
99
+ else
100
+ raise GreenhouseIo::Error.new(response.code)
101
+ end
102
+ end
103
+
104
+ def post_to_harvest_api(url, body, headers)
105
+ response = post_response(url, {
106
+ :body => JSON.dump(body),
107
+ :basic_auth => basic_auth,
108
+ :headers => headers
109
+ })
110
+
83
111
  set_rate_limits(response.headers)
112
+
84
113
  if response.code == 200
85
114
  parse_json(response)
86
115
  else
@@ -1,3 +1,3 @@
1
1
  module GreenhouseIo
2
- VERSION = "2.3.0"
2
+ VERSION = "2.3.1"
3
3
  end
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://123FakeToken:@harvest.greenhouse.io/v1/candidates/1/activity_feed/notes
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"user_id":2,"message":"Candidate on vacation","visibility":"public"}'
9
+ headers:
10
+ On-Behalf-Of:
11
+ - '2'
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ Server:
18
+ - Cowboy
19
+ Connection:
20
+ - close
21
+ Date:
22
+ - Mon, 18 Apr 2016 19:41:43 GMT
23
+ Status:
24
+ - 200 OK
25
+ Content-Type:
26
+ - application/json;charset=utf-8
27
+ Content-Length:
28
+ - '154'
29
+ X-Ratelimit-Limit:
30
+ - '40'
31
+ X-Ratelimit-Remaining:
32
+ - '39'
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ Via:
36
+ - 1.1 vegur
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"created_at":"2016-04-18T19:43:52.534Z","body":"Candidate on vacation","user":{"id":2,"name":"Richard Feynman"},"private":false,"visiblity":"public"}'
40
+ http_version:
41
+ recorded_at: Mon, 18 Apr 2016 19:41:44 GMT
42
+ recorded_with: VCR 3.0.1
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://123FakeToken:@harvest.greenhouse.io/v1/candidates/99/activity_feed/notes
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"user_id":2,"message":"Candidate on vacation","visibility":"public"}'
9
+ headers:
10
+ On-Behalf-Of:
11
+ - '2'
12
+ response:
13
+ status:
14
+ code: 404
15
+ message: Resource not found
16
+ headers:
17
+ Server:
18
+ - Cowboy
19
+ Connection:
20
+ - close
21
+ Date:
22
+ - Mon, 18 Apr 2016 19:41:43 GMT
23
+ Status:
24
+ - 200 OK
25
+ Content-Type:
26
+ - application/json;charset=utf-8
27
+ Content-Length:
28
+ - '32'
29
+ X-Ratelimit-Limit:
30
+ - '40'
31
+ X-Ratelimit-Remaining:
32
+ - '39'
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ Via:
36
+ - 1.1 vegur
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"message":"Resource not found"}'
40
+ http_version:
41
+ recorded_at: Mon, 18 Apr 2016 19:41:44 GMT
42
+ recorded_with: VCR 3.0.1
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://123FakeToken:@harvest.greenhouse.io/v1/candidates/1/activity_feed/notes
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"user_id":2,"visibility":"public"}'
9
+ headers:
10
+ On-Behalf-Of:
11
+ - '2'
12
+ response:
13
+ status:
14
+ code: 422
15
+ message: Unprocessable Entity
16
+ headers:
17
+ Server:
18
+ - Cowboy
19
+ Connection:
20
+ - close
21
+ Date:
22
+ - Mon, 18 Apr 2016 19:41:43 GMT
23
+ Status:
24
+ - 200 OK
25
+ Content-Type:
26
+ - application/json;charset=utf-8
27
+ Content-Length:
28
+ - '70'
29
+ X-Ratelimit-Limit:
30
+ - '40'
31
+ X-Ratelimit-Remaining:
32
+ - '39'
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ Via:
36
+ - 1.1 vegur
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"errors":[{"message":"Missing required field: body","field":"body"}]}'
40
+ http_version:
41
+ recorded_at: Mon, 18 Apr 2016 19:41:44 GMT
42
+ recorded_with: VCR 3.0.1
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://123FakeToken:@harvest.greenhouse.io/v1/candidates/1/activity_feed/notes
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"user_id":2,"message":"Candidate on vacation","visibility":"public"}'
9
+ headers:
10
+ On-Behalf-Of:
11
+ - '99'
12
+ response:
13
+ status:
14
+ code: 404
15
+ message: Resource not found
16
+ headers:
17
+ Server:
18
+ - Cowboy
19
+ Connection:
20
+ - close
21
+ Date:
22
+ - Mon, 18 Apr 2016 19:41:43 GMT
23
+ Status:
24
+ - 200 OK
25
+ Content-Type:
26
+ - application/json;charset=utf-8
27
+ Content-Length:
28
+ - '32'
29
+ X-Ratelimit-Limit:
30
+ - '40'
31
+ X-Ratelimit-Remaining:
32
+ - '39'
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ Via:
36
+ - 1.1 vegur
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"message":"Resource not found"}'
40
+ http_version:
41
+ recorded_at: Mon, 18 Apr 2016 19:41:44 GMT
42
+ recorded_with: VCR 3.0.1
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://123FakeToken:@harvest.greenhouse.io/v1/candidates/1/activity_feed/notes
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"user_id":99,"message":"Candidate on vacation","visibility":"public"}'
9
+ headers:
10
+ On-Behalf-Of:
11
+ - '2'
12
+ response:
13
+ status:
14
+ code: 404
15
+ message: Resource not found
16
+ headers:
17
+ Server:
18
+ - Cowboy
19
+ Connection:
20
+ - close
21
+ Date:
22
+ - Mon, 18 Apr 2016 19:41:43 GMT
23
+ Status:
24
+ - 200 OK
25
+ Content-Type:
26
+ - application/json;charset=utf-8
27
+ Content-Length:
28
+ - '32'
29
+ X-Ratelimit-Limit:
30
+ - '40'
31
+ X-Ratelimit-Remaining:
32
+ - '39'
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ Via:
36
+ - 1.1 vegur
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"message":"Resource not found"}'
40
+ http_version:
41
+ recorded_at: Mon, 18 Apr 2016 19:41:44 GMT
42
+ recorded_with: VCR 3.0.1
@@ -225,6 +225,87 @@ describe GreenhouseIo::Client do
225
225
  end
226
226
  end
227
227
 
228
+ describe "#create_candidate_note" do
229
+ it "posts an note for a specified candidate" do
230
+ VCR.use_cassette('client/create_candidate_note') do
231
+ create_candidate_note = @client.create_candidate_note(
232
+ 1,
233
+ {
234
+ user_id: 2,
235
+ message: "Candidate on vacation",
236
+ visibility: "public"
237
+ },
238
+ 2
239
+ )
240
+ expect(create_candidate_note).to_not be_nil
241
+ expect(create_candidate_note).to include :body => 'Candidate on vacation'
242
+ end
243
+ end
244
+
245
+ it "errors when given invalid On-Behalf-Of id" do
246
+ VCR.use_cassette('client/create_candidate_note_invalid_on_behalf_of') do
247
+ expect {
248
+ @client.create_candidate_note(
249
+ 1,
250
+ {
251
+ user_id: 2,
252
+ message: "Candidate on vacation",
253
+ visibility: "public"
254
+ },
255
+ 99
256
+ )
257
+ }.to raise_error(GreenhouseIo::Error)
258
+ end
259
+ end
260
+
261
+ it "errors when given an invalid candidate id" do
262
+ VCR.use_cassette('client/create_candidate_note_invalid_candidate_id') do
263
+ expect {
264
+ @client.create_candidate_note(
265
+ 99,
266
+ {
267
+ user_id: 2,
268
+ message: "Candidate on vacation",
269
+ visibility: "public"
270
+ },
271
+ 2
272
+ )
273
+ }.to raise_error(GreenhouseIo::Error)
274
+ end
275
+ end
276
+
277
+ it "errors when given an invalid user_id" do
278
+ VCR.use_cassette('client/create_candidate_note_invalid_user_id') do
279
+ expect {
280
+ @client.create_candidate_note(
281
+ 1,
282
+ {
283
+ user_id: 99,
284
+ message: "Candidate on vacation",
285
+ visibility: "public"
286
+ },
287
+ 2
288
+ )
289
+ }.to raise_error(GreenhouseIo::Error)
290
+ end
291
+ end
292
+
293
+ it "errors when missing required field" do
294
+ VCR.use_cassette('client/create_candidate_note_invalid_missing_field') do
295
+ expect {
296
+ @client.create_candidate_note(
297
+ 1,
298
+ {
299
+ user_id: 2,
300
+ visibility: "public"
301
+ },
302
+ 2
303
+ )
304
+ }.to raise_error(GreenhouseIo::Error)
305
+ end
306
+ end
307
+ end
308
+
228
309
  describe "#applications" do
229
310
  context "given no id" do
230
311
  before do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: greenhouse_io
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greenhouse Software
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-13 00:00:00.000000000 Z
12
+ date: 2016-04-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httmultiparty
@@ -140,6 +140,11 @@ files:
140
140
  - spec/fixtures/cassettes/client/applications.yml
141
141
  - spec/fixtures/cassettes/client/candidate.yml
142
142
  - spec/fixtures/cassettes/client/candidates.yml
143
+ - spec/fixtures/cassettes/client/create_candidate_note.yml
144
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_candidate_id.yml
145
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_missing_field.yml
146
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_on_behalf_of.yml
147
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_user_id.yml
143
148
  - spec/fixtures/cassettes/client/department.yml
144
149
  - spec/fixtures/cassettes/client/departments.yml
145
150
  - spec/fixtures/cassettes/client/job.yml
@@ -206,6 +211,11 @@ test_files:
206
211
  - spec/fixtures/cassettes/client/applications.yml
207
212
  - spec/fixtures/cassettes/client/candidate.yml
208
213
  - spec/fixtures/cassettes/client/candidates.yml
214
+ - spec/fixtures/cassettes/client/create_candidate_note.yml
215
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_candidate_id.yml
216
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_missing_field.yml
217
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_on_behalf_of.yml
218
+ - spec/fixtures/cassettes/client/create_candidate_note_invalid_user_id.yml
209
219
  - spec/fixtures/cassettes/client/department.yml
210
220
  - spec/fixtures/cassettes/client/departments.yml
211
221
  - spec/fixtures/cassettes/client/job.yml