hello_sign 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/hello_sign.rb +29 -5
- data/lib/hello_sign/client.rb +13 -38
- data/lib/hello_sign/connection.rb +53 -0
- data/lib/hello_sign/error.rb +13 -9
- data/lib/hello_sign/middleware/parse_json.rb +22 -0
- data/lib/hello_sign/middleware/raise_error.rb +2 -0
- data/lib/hello_sign/parameters/reusable_form_signature_request.rb +27 -14
- data/lib/hello_sign/parameters/signature_request.rb +29 -21
- data/lib/hello_sign/parameters/unclaimed_draft.rb +8 -5
- data/lib/hello_sign/proxy/signature_request.rb +30 -18
- data/lib/hello_sign/version.rb +1 -1
- data/spec/helper.rb +0 -6
- data/spec/integration/hello_sign_spec.rb +7 -1
- data/spec/integration/helper.rb +17 -4
- data/spec/shared_examples/proxy.rb +58 -15
- data/spec/unit/client_spec.rb +42 -27
- data/spec/unit/connection_spec.rb +38 -0
- data/spec/unit/error_spec.rb +65 -13
- data/spec/unit/hello_sign_spec.rb +66 -23
- data/spec/unit/middleware/parse_json_spec.rb +38 -0
- data/spec/unit/middleware/raise_error_spec.rb +36 -23
- data/spec/unit/parameters/reusable_form_signature_request_spec.rb +74 -37
- data/spec/unit/parameters/signature_request_spec.rb +11 -5
- data/spec/unit/parameters/unclaimed_draft_spec.rb +14 -6
- data/spec/unit/proxy/account_spec.rb +17 -9
- data/spec/unit/proxy/reusable_form_spec.rb +31 -14
- data/spec/unit/proxy/settings_spec.rb +11 -4
- data/spec/unit/proxy/signature_request_spec.rb +74 -38
- data/spec/unit/proxy/team_spec.rb +39 -20
- data/spec/unit/proxy/unclaimed_draft_spec.rb +25 -6
- data/spec/unit/upload_io_spec.rb +69 -27
- metadata +20 -40
data/lib/hello_sign.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'hello_sign/middleware/raise_error'
|
2
|
+
require 'hello_sign/middleware/parse_json'
|
2
3
|
require 'hello_sign/client'
|
3
4
|
require 'hello_sign/version'
|
4
|
-
|
5
5
|
require 'forwardable'
|
6
6
|
|
7
7
|
module HelloSign
|
@@ -10,10 +10,19 @@ module HelloSign
|
|
10
10
|
|
11
11
|
attr_accessor :email_address, :password
|
12
12
|
|
13
|
-
delegate [
|
13
|
+
delegate [
|
14
|
+
:account,
|
15
|
+
:signature_request,
|
16
|
+
:reusable_form,
|
17
|
+
:team,
|
18
|
+
:unclaimed_draft
|
19
|
+
] => :client
|
14
20
|
|
15
21
|
def client
|
16
|
-
|
22
|
+
unless credentials_match?
|
23
|
+
@client = HelloSign::Client.new(email_address, password)
|
24
|
+
end
|
25
|
+
|
17
26
|
@client
|
18
27
|
end
|
19
28
|
|
@@ -24,10 +33,25 @@ module HelloSign
|
|
24
33
|
private
|
25
34
|
|
26
35
|
def credentials_match?
|
27
|
-
@client &&
|
36
|
+
@client && client_credentials.hash == provided_credentials.hash
|
37
|
+
end
|
38
|
+
|
39
|
+
def client_credentials
|
40
|
+
[@client.email_address, @client.password]
|
41
|
+
end
|
42
|
+
|
43
|
+
def provided_credentials
|
44
|
+
[email_address, password]
|
28
45
|
end
|
29
46
|
|
30
|
-
Faraday.register_middleware
|
47
|
+
Faraday.register_middleware(
|
48
|
+
:response,
|
49
|
+
raise_error: HelloSign::Middleware::RaiseError
|
50
|
+
)
|
51
|
+
Faraday.register_middleware(
|
52
|
+
:response,
|
53
|
+
json: HelloSign::Middleware::ParseJson
|
54
|
+
)
|
31
55
|
|
32
56
|
end
|
33
57
|
end
|
data/lib/hello_sign/client.rb
CHANGED
@@ -1,57 +1,32 @@
|
|
1
1
|
require 'hello_sign/proxy'
|
2
|
-
|
3
|
-
require '
|
4
|
-
require 'faraday_middleware-multi_json'
|
2
|
+
require 'hello_sign/connection'
|
3
|
+
require 'forwardable'
|
5
4
|
|
6
5
|
module HelloSign
|
7
6
|
class Client
|
8
|
-
|
7
|
+
extend Forwardable
|
9
8
|
|
10
|
-
|
11
|
-
API_VERSION = '/v3'
|
9
|
+
include HelloSign::Proxy
|
12
10
|
|
13
11
|
attr_reader :email_address, :password
|
14
12
|
|
15
|
-
def initialize(
|
16
|
-
if
|
17
|
-
@email_address =
|
18
|
-
@password =
|
13
|
+
def initialize(email_or_hash, password = nil)
|
14
|
+
if email_or_hash.is_a?(Hash)
|
15
|
+
@email_address = email_or_hash.fetch(:email_address) { raise ArgumentError }
|
16
|
+
@password = email_or_hash.fetch(:password) { raise ArgumentError }
|
19
17
|
else
|
20
|
-
@email_address =
|
18
|
+
@email_address = email_or_hash
|
21
19
|
@password = password
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
25
|
-
|
26
|
-
request(:get, path, options)
|
27
|
-
end
|
28
|
-
|
29
|
-
def post(path, options = {})
|
30
|
-
request(:post, path, options)
|
31
|
-
end
|
23
|
+
delegate [:get, :post] => :connection
|
32
24
|
|
33
25
|
private
|
34
26
|
|
35
|
-
def
|
36
|
-
|
37
|
-
connection.request :basic_auth, email_address, password
|
38
|
-
end.send(method) do |request|
|
39
|
-
request.url "#{API_VERSION}#{path}", options[:params]
|
40
|
-
request.body = options[:body]
|
41
|
-
end.body
|
42
|
-
end
|
43
|
-
|
44
|
-
def base_connection
|
45
|
-
options = {url: API_ENDPOINT, headers: {user_agent: "hello_sign gem v#{HelloSign::VERSION}"}}
|
46
|
-
|
47
|
-
Faraday.new(options) do |connection|
|
48
|
-
yield connection
|
49
|
-
|
50
|
-
connection.request :multipart
|
51
|
-
connection.request :url_encoded
|
52
|
-
connection.response :raise_error
|
53
|
-
connection.response :multi_json, symbolize_keys: true
|
54
|
-
connection.adapter :net_http
|
27
|
+
def connection
|
28
|
+
HelloSign::Connection.new do |connection|
|
29
|
+
connection.request :basic_auth, email_address, password
|
55
30
|
end
|
56
31
|
end
|
57
32
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module HelloSign
|
4
|
+
class Connection
|
5
|
+
API_ENDPOINT = 'https://api.hellosign.com'
|
6
|
+
API_VERSION = '3'
|
7
|
+
|
8
|
+
attr_reader :auth_configuration
|
9
|
+
|
10
|
+
def initialize(&auth_configuration)
|
11
|
+
@auth_configuration = auth_configuration
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(path, options = {})
|
15
|
+
request(:get, path, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def post(path, options = {})
|
19
|
+
request(:post, path, options)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def request(method, path, options)
|
25
|
+
base_connection do |connection|
|
26
|
+
auth_configuration.call(connection) unless options[:auth_not_required]
|
27
|
+
end.send(method) do |request|
|
28
|
+
request.url "/v#{API_VERSION}#{path}", options[:params]
|
29
|
+
request.body = options[:body]
|
30
|
+
end.body
|
31
|
+
end
|
32
|
+
|
33
|
+
def base_connection
|
34
|
+
Faraday.new(connection_options) do |connection|
|
35
|
+
yield connection
|
36
|
+
|
37
|
+
connection.request :multipart
|
38
|
+
connection.request :url_encoded
|
39
|
+
connection.response :raise_error
|
40
|
+
connection.response :json
|
41
|
+
connection.adapter :net_http
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def connection_options
|
46
|
+
{
|
47
|
+
url: API_ENDPOINT,
|
48
|
+
headers: {user_agent: "hello_sign gem v#{HelloSign::VERSION}"}
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/lib/hello_sign/error.rb
CHANGED
@@ -16,14 +16,18 @@ module HelloSign
|
|
16
16
|
"[Status code: #{status_code}] #{message}"
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
19
|
+
[
|
20
|
+
:BadRequest,
|
21
|
+
:Unauthorized,
|
22
|
+
:Forbidden,
|
23
|
+
:NotFound,
|
24
|
+
:Unknown,
|
25
|
+
:TeamInviteFailed,
|
26
|
+
:InvalidRecipient,
|
27
|
+
:ConvertFailed,
|
28
|
+
:SignatureRequestCancelFailed
|
29
|
+
].each do |error_name|
|
30
|
+
const_set(error_name, Class.new(HelloSign::Error))
|
31
|
+
end
|
28
32
|
end
|
29
33
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module HelloSign
|
5
|
+
module Middleware
|
6
|
+
class ParseJson < Faraday::Response::Middleware
|
7
|
+
|
8
|
+
def on_complete(env)
|
9
|
+
body = env[:body] or return
|
10
|
+
|
11
|
+
env[:body] = ::JSON.parse(body, symbolize_names: true) if json?(env)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def json?(env)
|
17
|
+
env[:response_headers]['Content-Type'] == 'application/json'
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module HelloSign
|
2
2
|
module Parameters
|
3
3
|
class ReusableFormSignatureRequest
|
4
|
-
attr_writer :reusable_form_id, :title, :subject, :message, :ccs, :signers,
|
4
|
+
attr_writer :reusable_form_id, :title, :subject, :message, :ccs, :signers,
|
5
|
+
:custom_fields
|
5
6
|
|
6
7
|
def formatted
|
7
8
|
{
|
@@ -9,9 +10,9 @@ module HelloSign
|
|
9
10
|
title: title,
|
10
11
|
subject: subject,
|
11
12
|
message: message,
|
12
|
-
ccs:
|
13
|
-
signers:
|
14
|
-
custom_fields:
|
13
|
+
ccs: formatted_ccs,
|
14
|
+
signers: formatted_signers,
|
15
|
+
custom_fields: formatted_custom_fields
|
15
16
|
}
|
16
17
|
end
|
17
18
|
|
@@ -19,27 +20,39 @@ module HelloSign
|
|
19
20
|
|
20
21
|
attr_reader :reusable_form_id, :title, :subject, :message
|
21
22
|
|
22
|
-
def
|
23
|
-
|
23
|
+
def formatted_ccs
|
24
|
+
ccs.each_with_object({}) do |cc, parameter|
|
24
25
|
parameter[cc[:role]] = {email_address: cc[:email_address]}
|
25
|
-
parameter
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
31
|
-
parameter[signer[:role]] = {
|
32
|
-
|
29
|
+
def formatted_signers
|
30
|
+
signers.each_with_object({}) do |signer, parameter|
|
31
|
+
parameter[signer[:role]] = {
|
32
|
+
name: signer[:name],
|
33
|
+
email_address: signer[:email_address]
|
34
|
+
}
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
|
-
def
|
37
|
-
|
38
|
+
def formatted_custom_fields
|
39
|
+
custom_fields.each_with_object({}) do |custom_field, parameter|
|
38
40
|
parameter[custom_field[:name]] = custom_field[:value]
|
39
|
-
parameter
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
44
|
+
def ccs
|
45
|
+
@ccs || {}
|
46
|
+
end
|
47
|
+
|
48
|
+
def signers
|
49
|
+
@signers || {}
|
50
|
+
end
|
51
|
+
|
52
|
+
def custom_fields
|
53
|
+
@custom_fields || {}
|
54
|
+
end
|
55
|
+
|
43
56
|
end
|
44
57
|
end
|
45
58
|
end
|
@@ -3,37 +3,45 @@ require 'hello_sign/file'
|
|
3
3
|
module HelloSign
|
4
4
|
module Parameters
|
5
5
|
class SignatureRequest
|
6
|
-
|
7
|
-
attr_writer :signers, :files
|
6
|
+
attr_writer :title, :subject, :message, :ccs, :signers, :files
|
8
7
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
8
|
+
def formatted
|
9
|
+
{
|
10
|
+
title: title,
|
11
|
+
subject: subject,
|
12
|
+
message: message,
|
13
|
+
cc_email_addresses: ccs,
|
14
|
+
signers: formatted_signers,
|
15
|
+
file: formatted_files
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :title, :subject, :message, :ccs
|
22
|
+
|
23
|
+
def formatted_signers
|
24
|
+
signers.each_with_index.each_with_object({}) do |(signer, i), parameter|
|
25
|
+
parameter[i] = {
|
12
26
|
name: signer[:name],
|
13
27
|
email_address: signer[:email_address],
|
14
|
-
order:
|
28
|
+
order: i
|
15
29
|
}
|
16
|
-
parameter[index] = signer
|
17
|
-
parameter
|
18
30
|
end
|
19
31
|
end
|
20
32
|
|
21
|
-
def
|
22
|
-
|
23
|
-
parameter[
|
24
|
-
parameter
|
33
|
+
def formatted_files
|
34
|
+
files.each_with_index.each_with_object({}) do |(file, i), parameter|
|
35
|
+
parameter[i + 1] = HelloSign::File.new(file).attachment
|
25
36
|
end
|
26
37
|
end
|
27
38
|
|
28
|
-
def
|
29
|
-
{
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
signers: signers,
|
35
|
-
file: files
|
36
|
-
}
|
39
|
+
def signers
|
40
|
+
@signers || {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def files
|
44
|
+
@files || {}
|
37
45
|
end
|
38
46
|
|
39
47
|
end
|
@@ -6,18 +6,21 @@ module HelloSign
|
|
6
6
|
attr_writer :files
|
7
7
|
|
8
8
|
def formatted
|
9
|
-
{file:
|
9
|
+
{file: formatted_files}
|
10
10
|
end
|
11
11
|
|
12
12
|
private
|
13
13
|
|
14
|
-
def
|
15
|
-
|
16
|
-
parameter[
|
17
|
-
parameter
|
14
|
+
def formatted_files
|
15
|
+
files.each_with_index.each_with_object({}) do |(file, i), parameter|
|
16
|
+
parameter[i] = HelloSign::File.new(file).attachment
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
20
|
+
def files
|
21
|
+
@files || {}
|
22
|
+
end
|
23
|
+
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|
@@ -7,23 +7,15 @@ module HelloSign
|
|
7
7
|
attr_reader :client, :request_id
|
8
8
|
|
9
9
|
def initialize(client, request_id)
|
10
|
-
@client
|
10
|
+
@client = client
|
11
11
|
@request_id = request_id
|
12
12
|
end
|
13
13
|
|
14
|
-
def deliver(params = {})
|
14
|
+
def deliver(params = {}, &block)
|
15
15
|
if form_id = params[:form]
|
16
|
-
|
17
|
-
yield reusable_form_request_parameters
|
18
|
-
|
19
|
-
client.post(
|
20
|
-
'/signature_request/send_with_reusable_form',
|
21
|
-
body: reusable_form_request_parameters.formatted
|
22
|
-
)
|
16
|
+
deliver_request_with_form(form_id, &block)
|
23
17
|
else
|
24
|
-
|
25
|
-
|
26
|
-
client.post('/signature_request/send', body: request_parameters.formatted)
|
18
|
+
deliver_request(&block)
|
27
19
|
end
|
28
20
|
end
|
29
21
|
|
@@ -32,15 +24,15 @@ module HelloSign
|
|
32
24
|
end
|
33
25
|
|
34
26
|
def list(params = {})
|
35
|
-
params
|
27
|
+
client.get('/signature_request/list', params: {page: 1}.merge(params))
|
36
28
|
|
37
|
-
client.get('/signature_request/list', params: params)
|
38
29
|
end
|
39
30
|
|
40
31
|
def remind(params = {})
|
41
|
-
|
42
|
-
|
43
|
-
|
32
|
+
client.post(
|
33
|
+
"/signature_request/remind/#{request_id}",
|
34
|
+
body: {email_address: params.delete(:email)}.merge(params)
|
35
|
+
)
|
44
36
|
end
|
45
37
|
|
46
38
|
def cancel
|
@@ -53,12 +45,32 @@ module HelloSign
|
|
53
45
|
|
54
46
|
private
|
55
47
|
|
48
|
+
def deliver_request
|
49
|
+
yield request_parameters
|
50
|
+
|
51
|
+
client.post(
|
52
|
+
'/signature_request/send',
|
53
|
+
body: request_parameters.formatted
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def deliver_request_with_form(form_id)
|
58
|
+
reusable_form_request_parameters.reusable_form_id = form_id
|
59
|
+
yield reusable_form_request_parameters
|
60
|
+
|
61
|
+
client.post(
|
62
|
+
'/signature_request/send_with_reusable_form',
|
63
|
+
body: reusable_form_request_parameters.formatted
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
56
67
|
def request_parameters
|
57
68
|
@request_parameters ||= Parameters::SignatureRequest.new
|
58
69
|
end
|
59
70
|
|
60
71
|
def reusable_form_request_parameters
|
61
|
-
@reusable_form_request_parameters ||=
|
72
|
+
@reusable_form_request_parameters ||=
|
73
|
+
Parameters::ReusableFormSignatureRequest.new
|
62
74
|
end
|
63
75
|
|
64
76
|
end
|