clinch-talent 0.2 → 0.2.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/clinch-talent.gemspec +1 -1
- data/lib/clinch_talent/hmac_signing_middleware.rb +10 -31
- data/test/clinch_talent/candidate_test.rb +38 -3
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 231b908831adf498b598d6eef29152e51e4764ce109c01615b3d59b27cbeede1
|
|
4
|
+
data.tar.gz: 0ccf8a2b09778626d1ed884b417d4cb32c3f28227eddf4ef992bf56921f0c128
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cf868b3ef0822074f3ee5e287dcc31ec2442c6f8fe8efe45d1b499c3774a961b8ed832d24ea3df62dd3f1f657e1435b270114f514310fac42ae6a1a5e668d26a
|
|
7
|
+
data.tar.gz: d411d3a6e4d0d1c07182cc69a2eb54f2470375076f854bee96216ee0b2e8f0905f5999437f0f5d6066e02acbb834eb3647a1b183f155977256397dbd832e852e
|
data/Gemfile.lock
CHANGED
data/clinch-talent.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.name = 'clinch-talent'
|
|
3
|
-
s.version = '0.2'
|
|
3
|
+
s.version = '0.2.1'
|
|
4
4
|
s.summary = 'A ruby client for the Clinch Talent API'
|
|
5
5
|
s.description = 'A ruby client for the Clinch Talent API. Requests are HMAC signed. Responses are in JSON API format (https://jsonapi.org). See https://support.clinchtalent.com/article/77-getting-started'
|
|
6
6
|
s.authors = ['Damien Glancy', 'Steve Quinlan']
|
|
@@ -12,32 +12,11 @@ module ClinchTalent
|
|
|
12
12
|
env.request_headers['Authorization'] = "APIAuth #{@options[:access_id]}:#{hmac_signature(env, @options[:secret])}"
|
|
13
13
|
@app.call(env)
|
|
14
14
|
end
|
|
15
|
-
private
|
|
16
|
-
def calculated_md5(env)
|
|
17
|
-
# if env.request.body
|
|
18
|
-
# body = env.request.body
|
|
19
|
-
# else
|
|
20
|
-
# body = ''
|
|
21
|
-
# end
|
|
22
|
-
#excluding the body as part of the md5'ing
|
|
23
|
-
md5_base64digest('')
|
|
24
|
-
end
|
|
25
15
|
|
|
26
|
-
|
|
27
|
-
if Digest::MD5.respond_to?(:base64digest)
|
|
28
|
-
Digest::MD5.base64digest(string)
|
|
29
|
-
else
|
|
30
|
-
b64_encode(Digest::MD5.digest(string))
|
|
31
|
-
end
|
|
32
|
-
end
|
|
16
|
+
private
|
|
33
17
|
|
|
34
|
-
def
|
|
35
|
-
|
|
36
|
-
Base64.strict_encode64(string)
|
|
37
|
-
else
|
|
38
|
-
# Fall back to stripping out newlines on Ruby 1.8.
|
|
39
|
-
Base64.encode64(string).gsub(/\n/, '')
|
|
40
|
-
end
|
|
18
|
+
def calculated_md5(env)
|
|
19
|
+
Digest::MD5.base64digest(env.body || '')
|
|
41
20
|
end
|
|
42
21
|
|
|
43
22
|
def fetch_headers(env)
|
|
@@ -46,21 +25,21 @@ private
|
|
|
46
25
|
|
|
47
26
|
def capitalize_keys(hsh)
|
|
48
27
|
capitalized_hash = {}
|
|
49
|
-
hsh.each_pair {|k,v| capitalized_hash[k.to_s.upcase] = v
|
|
28
|
+
hsh.each_pair {|k, v| capitalized_hash[k.to_s.upcase] = v}
|
|
50
29
|
capitalized_hash
|
|
51
30
|
end
|
|
52
31
|
|
|
53
32
|
def hmac_signature(env, secret_key)
|
|
54
33
|
canonical_string = canonical_string(env)
|
|
55
34
|
digest = OpenSSL::Digest.new('sha1')
|
|
56
|
-
|
|
35
|
+
Base64.strict_encode64(OpenSSL::HMAC.digest(digest, secret_key, canonical_string))
|
|
57
36
|
end
|
|
58
37
|
|
|
59
38
|
def canonical_string(env)
|
|
60
|
-
[
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
39
|
+
[content_type(env),
|
|
40
|
+
content_md5(env),
|
|
41
|
+
parse_uri(env.url.to_s),
|
|
42
|
+
timestamp(env)
|
|
64
43
|
].join(',')
|
|
65
44
|
end
|
|
66
45
|
|
|
@@ -80,7 +59,7 @@ private
|
|
|
80
59
|
end
|
|
81
60
|
|
|
82
61
|
def find_header(env, keys)
|
|
83
|
-
keys.map {|key| env.request_headers[key]
|
|
62
|
+
keys.map {|key| env.request_headers[key]}.compact.first
|
|
84
63
|
end
|
|
85
64
|
|
|
86
65
|
def parse_uri(uri)
|
|
@@ -2,11 +2,11 @@ require_relative '../test_helper'
|
|
|
2
2
|
|
|
3
3
|
module ClinchTalent
|
|
4
4
|
class CandidateTest < Minitest::Test
|
|
5
|
-
def
|
|
5
|
+
def setup
|
|
6
6
|
Time.stubs(:now).returns(Time.new(2014, 01, 01, 01, 01, 01))
|
|
7
|
+
end
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
def test_get_signing
|
|
10
10
|
stub_request(:get, 'https://api.clinchtalent.com/v1/candidates').
|
|
11
11
|
with(:headers => {'Accept' => 'application/vnd.api+json',
|
|
12
12
|
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
|
@@ -18,5 +18,40 @@ module ClinchTalent
|
|
|
18
18
|
ClinchTalent::Base.config('access_id', 'secret')
|
|
19
19
|
ClinchTalent::Candidate.all
|
|
20
20
|
end
|
|
21
|
+
|
|
22
|
+
def test_post_signing
|
|
23
|
+
stub_request(:post, "https://api.clinchtalent.com/v1/candidates").
|
|
24
|
+
with(
|
|
25
|
+
body: "{\"data\":{\"type\":\"candidates\",\"attributes\":{\"first_name\":\"Steve\",\"last_name\":\"Jobs\",\"email\":\"steve.jobs@example.com\"}}}",
|
|
26
|
+
headers: {
|
|
27
|
+
'Accept' => 'application/vnd.api+json',
|
|
28
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
|
29
|
+
'Authorization' => 'APIAuth access_id:GpqVWbyL6re9hA4PVFciK9JGXtE=',
|
|
30
|
+
'Content-Md5' => 'BHelHgS90QHICtQEYCK1CA==',
|
|
31
|
+
'Content-Type' => 'application/vnd.api+json',
|
|
32
|
+
'Date' => 'Wed, 01 Jan 2014 01:01:01 GMT',
|
|
33
|
+
'User-Agent' => 'Faraday v0.15.2'
|
|
34
|
+
}).
|
|
35
|
+
to_return(status: 200, body: "", headers: {})
|
|
36
|
+
|
|
37
|
+
ClinchTalent::Base.config('access_id', 'secret')
|
|
38
|
+
ClinchTalent::Candidate.create("first_name": "Steve", "last_name": "Jobs", "email": "steve.jobs@example.com")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_post_signing_no_body
|
|
42
|
+
stub_request(:post, "https://api.clinchtalent.com/v1/candidates").
|
|
43
|
+
with(:body => "{\"data\":{\"type\":\"candidates\",\"attributes\":{}}}",
|
|
44
|
+
:headers => {'Accept'=>'application/vnd.api+json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
|
45
|
+
'Authorization'=>'APIAuth access_id:P9RDanGcxbHK/aWLPC/T6Eitplc=',
|
|
46
|
+
'Content-Md5'=>'hy9ALXrYXtG7YZXuVdXzjA==',
|
|
47
|
+
'Content-Type'=>'application/vnd.api+json',
|
|
48
|
+
'Date'=>'Wed, 01 Jan 2014 01:01:01 GMT',
|
|
49
|
+
'User-Agent'=>'Faraday v0.15.2'}).
|
|
50
|
+
to_return(:status => 200, :body => "", :headers => {})
|
|
51
|
+
|
|
52
|
+
ClinchTalent::Base.config('access_id', 'secret')
|
|
53
|
+
ClinchTalent::Candidate.create
|
|
54
|
+
end
|
|
55
|
+
|
|
21
56
|
end
|
|
22
57
|
end
|