rightsignature 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Rakefile +2 -0
- data/lib/rightsignature/account.rb +19 -0
- data/lib/rightsignature/connection.rb +73 -0
- data/lib/rightsignature/connection/oauth_connection.rb +28 -1
- data/lib/rightsignature/connection/token_connection.rb +13 -3
- data/lib/rightsignature/document.rb +201 -106
- data/lib/rightsignature/errors.rb +6 -2
- data/lib/rightsignature/helpers/normalizing.rb +8 -7
- data/lib/rightsignature/template.rb +128 -73
- data/lib/rightsignature/version.rb +1 -1
- data/spec/api_token_connection_spec.rb +4 -4
- metadata +16 -46
data/.gitignore
CHANGED
data/Rakefile
ADDED
@@ -1,13 +1,32 @@
|
|
1
1
|
module RightSignature
|
2
2
|
module Account
|
3
|
+
# Return account information about API user
|
4
|
+
#
|
5
|
+
# Ex.
|
6
|
+
# @rs_connection.user_details
|
7
|
+
#
|
3
8
|
def user_details
|
4
9
|
get "/api/users/user_details.xml"
|
5
10
|
end
|
6
11
|
|
12
|
+
# Creates a user on API user's account
|
13
|
+
# * name: User's name
|
14
|
+
# * email: User's email
|
15
|
+
#
|
16
|
+
# Ex.
|
17
|
+
# @rs_connection.add_user("John Bellingham", "john@example.com")
|
18
|
+
#
|
7
19
|
def add_user(name, email)
|
8
20
|
post "/api/users.xml", {:user => {:name => name, :email => email}}
|
9
21
|
end
|
10
22
|
|
23
|
+
# Return account's usage report (# of documents sent)
|
24
|
+
# * <b>since</b>: ("month"/"week"/"day") only count documents sent within a certain time
|
25
|
+
# * <b>signed</b>: (true/false) only count signed document
|
26
|
+
#
|
27
|
+
# Ex. Return count of signed documents sent this month
|
28
|
+
# @rs_connection.usage_report("month", true)
|
29
|
+
#
|
11
30
|
def usage_report(since=nil, signed=nil)
|
12
31
|
options = {}
|
13
32
|
options[:since] = since if since && ["month", "week", "day"].include?(since)
|
@@ -8,6 +8,22 @@ module RightSignature
|
|
8
8
|
attr_accessor :oauth_connection
|
9
9
|
attr_accessor :token_connection
|
10
10
|
|
11
|
+
# Creates new instance of RightSignature::Connection to make API calls
|
12
|
+
# * <b>creds</b>: Hash of credentials for API Token or OAuth. If both are specified, it uses API Token
|
13
|
+
# * Hash key for API Token:
|
14
|
+
# * :api_token
|
15
|
+
# * Hash keys for OAuth:
|
16
|
+
# * :consumer_key
|
17
|
+
# * :consumer_secret
|
18
|
+
# * :access_token
|
19
|
+
# * :access_secret
|
20
|
+
#
|
21
|
+
# Example for Api Token:
|
22
|
+
# @rs_connection = RightSignature::Connection.new(:api_token => "MYTOKEN")
|
23
|
+
#
|
24
|
+
# Example for OAuth:
|
25
|
+
# @rs_connection = RightSignature::Connection.new(:consumer_key => "ckey", :consumer_secret => "csecret", :access_token => "atoken", :access_secret => "asecret")
|
26
|
+
#
|
11
27
|
def initialize(creds={})
|
12
28
|
@configuration = {}
|
13
29
|
RightSignature::Connection.oauth_keys.each do |key|
|
@@ -24,10 +40,14 @@ module RightSignature
|
|
24
40
|
@configuration
|
25
41
|
end
|
26
42
|
|
43
|
+
# Checks if credentials are set for either API Token or for OAuth
|
44
|
+
#
|
27
45
|
def check_credentials
|
28
46
|
raise "Please set load_configuration with #{RightSignature::Connection.api_token_keys.join(',')} or #{RightSignature::Connection.oauth_keys.join(',')}" unless has_api_token? || has_oauth_credentials?
|
29
47
|
end
|
30
48
|
|
49
|
+
# Checks if API Token credentials are set. Does not validate creds with server.
|
50
|
+
#
|
31
51
|
def has_api_token?
|
32
52
|
return false if @configuration.nil?
|
33
53
|
RightSignature::Connection.api_token_keys.each do |key|
|
@@ -37,6 +57,8 @@ module RightSignature
|
|
37
57
|
return true
|
38
58
|
end
|
39
59
|
|
60
|
+
# Checks if OAuth credentials are set. Does not validate creds with server.
|
61
|
+
#
|
40
62
|
def has_oauth_credentials?
|
41
63
|
return false if @configuration.nil?
|
42
64
|
RightSignature::Connection.oauth_keys.each do |key|
|
@@ -46,14 +68,17 @@ module RightSignature
|
|
46
68
|
return true
|
47
69
|
end
|
48
70
|
|
71
|
+
# :nodoc:
|
49
72
|
def self.oauth_keys
|
50
73
|
[:consumer_key, :consumer_secret, :access_token, :access_secret].freeze
|
51
74
|
end
|
52
75
|
|
76
|
+
# :nodoc:
|
53
77
|
def self.api_token_keys
|
54
78
|
[:api_token].freeze
|
55
79
|
end
|
56
80
|
|
81
|
+
# :nodoc:
|
57
82
|
def site
|
58
83
|
if has_api_token?
|
59
84
|
RightSignature::TokenConnection.base_uri
|
@@ -62,6 +87,16 @@ module RightSignature
|
|
62
87
|
end
|
63
88
|
end
|
64
89
|
|
90
|
+
# PUT request to server
|
91
|
+
#
|
92
|
+
# Arguments:
|
93
|
+
# url: Path of API call
|
94
|
+
# body: XML body in hash format
|
95
|
+
# url: Hash of HTTP headers to include
|
96
|
+
#
|
97
|
+
# Example:
|
98
|
+
# @rs_connection.put("/api/documents.xml", {:documents=> {}}, {"User-Agent" => "My Own"})
|
99
|
+
#
|
65
100
|
def put(url, body={}, headers={})
|
66
101
|
if has_api_token?
|
67
102
|
options = {}
|
@@ -74,6 +109,15 @@ module RightSignature
|
|
74
109
|
end
|
75
110
|
end
|
76
111
|
|
112
|
+
# DELETE request to server
|
113
|
+
#
|
114
|
+
# Arguments:
|
115
|
+
# url: Path of API call
|
116
|
+
# url: Hash of HTTP headers to include
|
117
|
+
#
|
118
|
+
# Example:
|
119
|
+
# @rs_connection.delete("/api/users.xml", {"User-Agent" => "My Own"})
|
120
|
+
#
|
77
121
|
def delete(url, headers={})
|
78
122
|
if has_api_token?
|
79
123
|
options = {}
|
@@ -85,6 +129,16 @@ module RightSignature
|
|
85
129
|
end
|
86
130
|
end
|
87
131
|
|
132
|
+
# GET request to server
|
133
|
+
#
|
134
|
+
# Arguments:
|
135
|
+
# url: Path of API call
|
136
|
+
# params: Hash of URL parameters to include in request
|
137
|
+
# url: Hash of HTTP headers to include
|
138
|
+
#
|
139
|
+
# Example:
|
140
|
+
# @rs_connection.get("/api/documents.xml", {:search => "my term"}, {"User-Agent" => "My Own"})
|
141
|
+
#
|
88
142
|
def get(url, params={}, headers={})
|
89
143
|
check_credentials
|
90
144
|
|
@@ -101,6 +155,15 @@ module RightSignature
|
|
101
155
|
end
|
102
156
|
end
|
103
157
|
|
158
|
+
# POST request to server
|
159
|
+
#
|
160
|
+
# Arguments:
|
161
|
+
# url: Path of API call
|
162
|
+
# url: Hash of HTTP headers to include
|
163
|
+
#
|
164
|
+
# Example:
|
165
|
+
# @rs_connection.post("/api/users.xml", {"User-Agent" => "My Own"})
|
166
|
+
#
|
104
167
|
def post(url, body={}, headers={})
|
105
168
|
check_credentials
|
106
169
|
|
@@ -114,6 +177,16 @@ module RightSignature
|
|
114
177
|
end
|
115
178
|
end
|
116
179
|
|
180
|
+
# Attempts to parse response from a connection and return it as a hash.
|
181
|
+
# If response isn't a success, an RightSignature::ResponseError is raised
|
182
|
+
#
|
183
|
+
# Arguments:
|
184
|
+
# url: Path of API call
|
185
|
+
# url: Hash of HTTP headers to include
|
186
|
+
#
|
187
|
+
# Example:
|
188
|
+
# @rs_connection.delete("/api/users.xml", {"User-Agent" => "My Own"})
|
189
|
+
#
|
117
190
|
def parse_response(response)
|
118
191
|
if response.is_a? Net::HTTPResponse
|
119
192
|
unless response.is_a? Net::HTTPSuccess
|
@@ -3,6 +3,17 @@ module RightSignature
|
|
3
3
|
attr_reader :request_token
|
4
4
|
attr_reader :consumer_key, :consumer_secret, :oauth_access_token, :oauth_access_secret
|
5
5
|
|
6
|
+
# Creates new instance of RightSignature::OauthConnection to make API calls
|
7
|
+
# * <b>creds</b>: Hash of credentials for OAuth.
|
8
|
+
# * Hash keys for OAuth:
|
9
|
+
# * :consumer_key
|
10
|
+
# * :consumer_secret
|
11
|
+
# * :access_token
|
12
|
+
# * :access_secret
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
# @rs_oauth = RightSignature::OauthConnection.new(:consumer_key => "ckey", :consumer_secret => "csecret", :access_token => "atoken", :access_secret => "asecret")
|
16
|
+
#
|
6
17
|
def initialize(credentials={})
|
7
18
|
@consumer_key = credentials[:consumer_key]
|
8
19
|
@consumer_secret = credentials[:consumer_secret]
|
@@ -10,6 +21,7 @@ module RightSignature
|
|
10
21
|
@oauth_access_secret = credentials[:access_secret]
|
11
22
|
end
|
12
23
|
|
24
|
+
# Oauth consumer
|
13
25
|
def oauth_consumer
|
14
26
|
check_credentials unless @consumer_key && @consumer_secret
|
15
27
|
@oauth_consumer ||= OAuth::Consumer.new(
|
@@ -26,21 +38,30 @@ module RightSignature
|
|
26
38
|
)
|
27
39
|
end
|
28
40
|
|
41
|
+
# Access token
|
29
42
|
def access_token
|
30
43
|
check_credentials
|
31
44
|
@access_token ||= OAuth::AccessToken.new(oauth_consumer, @oauth_access_token, @oauth_access_secret)
|
32
45
|
end
|
33
|
-
|
46
|
+
|
47
|
+
# Replaces access token
|
48
|
+
# * <b>access_token</b>: access token key
|
49
|
+
# * <b>access_secret</b>: access token secret
|
50
|
+
#
|
34
51
|
def set_access_token(access_token, access_secret)
|
35
52
|
@oauth_access_token = access_token
|
36
53
|
@oauth_access_secret = access_secret
|
37
54
|
@access_token = OAuth::AccessToken.new(oauth_consumer, @oauth_access_token, @oauth_access_secret)
|
38
55
|
end
|
39
56
|
|
57
|
+
# Uses consumer to generate a request token.
|
40
58
|
def new_request_token
|
41
59
|
@request_token = oauth_consumer.get_request_token
|
42
60
|
end
|
43
61
|
|
62
|
+
# Uses request token and given OAuth verifier to generate an access token. Requires a request token to be set.
|
63
|
+
# * <b>oauth_verifier</b>: OAuth verifier
|
64
|
+
#
|
44
65
|
def generate_access_token(oauth_verifier)
|
45
66
|
raise "Please set request token with new_request_token" unless @request_token
|
46
67
|
@access_token = @request_token.get_access_token(:oauth_verifier => oauth_verifier)
|
@@ -49,6 +70,10 @@ module RightSignature
|
|
49
70
|
@access_token
|
50
71
|
end
|
51
72
|
|
73
|
+
# Generates HTTP request with oauth credentials. Require access_token to be set.
|
74
|
+
# * <b>method</b>: HTTP Method. Ex. ('get'/'post'/'delete'/'put')
|
75
|
+
# * <b>options</b>: OAuth::AccessToken options to pass. Last option should be headers
|
76
|
+
#
|
52
77
|
def request(method, *options)
|
53
78
|
options.last ||= {}
|
54
79
|
options.last["Accept"] ||= "*/*"
|
@@ -58,10 +83,12 @@ module RightSignature
|
|
58
83
|
end
|
59
84
|
|
60
85
|
private
|
86
|
+
# Raises exception if OAuth credentials are not set.
|
61
87
|
def check_credentials
|
62
88
|
raise "Please set #{RightSignature::Connection.oauth_keys.join(', ')}" unless has_oauth_credentials?
|
63
89
|
end
|
64
90
|
|
91
|
+
# Checks if OAuth credentials are set.
|
65
92
|
def has_oauth_credentials?
|
66
93
|
[@consumer_key, @consumer_secret, @oauth_access_token, @oauth_access_secret].each do |cred|
|
67
94
|
return false if cred.nil? || cred.match(/^\s*$/)
|
@@ -6,11 +6,21 @@ module RightSignature
|
|
6
6
|
|
7
7
|
attr_reader :api_token
|
8
8
|
|
9
|
+
# Creates new instance of RightSignature::TokenConnection to make API calls
|
10
|
+
# * <b>api_token</b>: API Token.
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
# @rs_token = RightSignature::TokenConnection.new("APITOKEN")
|
14
|
+
#
|
9
15
|
def initialize(api_token)
|
10
16
|
@api_token = api_token
|
11
17
|
end
|
12
18
|
|
13
|
-
|
19
|
+
# Generates HTTP request with token credentials. Require api_token to be set.
|
20
|
+
# * <b>method</b>: HTTP Method. Ex. ('get'/'post'/'delete'/'put')
|
21
|
+
# * <b>url</b>: request path/url of request
|
22
|
+
# * <b>options</b>: HTTPary options to pass. Last option should be headers
|
23
|
+
#
|
14
24
|
def request(method, url, options)
|
15
25
|
raise "Please set api_token" if @api_token.nil? || @api_token.empty?
|
16
26
|
|
@@ -18,9 +28,9 @@ module RightSignature
|
|
18
28
|
options[:headers]['api-token'] = @api_token
|
19
29
|
options[:headers]["Accept"] ||= "*/*"
|
20
30
|
options[:headers]["content-type"] ||= "application/xml"
|
21
|
-
__send__(method, url, options)
|
31
|
+
self.class.__send__(method, url, options)
|
22
32
|
end
|
23
33
|
|
24
34
|
end
|
25
35
|
|
26
|
-
end
|
36
|
+
end
|
@@ -2,152 +2,240 @@ module RightSignature
|
|
2
2
|
module Document
|
3
3
|
include RightSignature::Helpers
|
4
4
|
|
5
|
+
# Lists documents
|
6
|
+
# * <b>options</b>: (optional) search filters
|
7
|
+
# * <b>:state</b> - (completed/trashed/pending) filter by state
|
8
|
+
# * <b>:page</b> - page offset
|
9
|
+
# * <b>:per_page</b> - # of entries per page to return
|
10
|
+
# * <b>:search</b> - search term filter
|
11
|
+
# * <b>:tags</b> - tags filter. Array of ["single_tag", {"tag_key" => "tag_value"}]
|
12
|
+
# * <b>:sort</> - sort documents by given attribute.
|
13
|
+
# API supports 'created', 'completed', and 'activity'
|
14
|
+
# * <b>:range</b> - ('today'/'thisweek'/'thismonth'/'alltime'/Date) return documents with a certain date range.
|
15
|
+
# * <b> :recipient_email</b> - filter document where it has a recipient with given email and involves the current OAuth user.
|
16
|
+
# * <b> :account</b> - (true/false) include all documents in current account if true.
|
17
|
+
#
|
18
|
+
# Ex.
|
19
|
+
# options = {
|
20
|
+
# :state => ['completed', 'trashed'],
|
21
|
+
# :page => 1,
|
22
|
+
# :per_page => 20,
|
23
|
+
# :search => "me",
|
24
|
+
# :tags => ["single_tag", "key" => "with_value"]
|
25
|
+
# }
|
26
|
+
#
|
27
|
+
# @rs_connection.documents_list(options)
|
28
|
+
#
|
5
29
|
def documents_list(options={})
|
6
30
|
options[:tags] = TagsHelper.mixed_array_to_string_array(options[:tags]) if options[:tags]
|
7
31
|
options[:state] = options[:state].join(',') if options[:state] && options[:state].is_a?(Array)
|
8
32
|
get "/api/documents.xml", options
|
9
33
|
end
|
10
34
|
|
35
|
+
# Gets details for a document
|
36
|
+
# * <b>guids</b>: Array of document GUIDs
|
37
|
+
#
|
38
|
+
# Ex. Get details for document GUID123
|
39
|
+
# @rs_connection.document_details("GUID123")
|
40
|
+
#
|
11
41
|
def document_details(guid)
|
12
42
|
get "/api/documents/#{guid}.xml"
|
13
43
|
end
|
14
44
|
|
45
|
+
# Gets details for multiple documents.
|
46
|
+
# * <b>guids</b>: Array of document GUIDs
|
47
|
+
#
|
48
|
+
# Ex. Get details for documents GUID123 and GUID345
|
49
|
+
# @rs_connection.documents_batch_details(["GUID123","GUID345"])
|
50
|
+
#
|
15
51
|
def documents_batch_details(guids)
|
16
52
|
get "/api/documents/#{guids.join(',')}/batch_details.xml"
|
17
53
|
end
|
18
54
|
|
55
|
+
# Sends a reminder for a document
|
56
|
+
# * <b>guid</b>: Document GUID
|
57
|
+
#
|
58
|
+
# Ex. Sends reminder for document GUID123
|
59
|
+
# @rs_connection.send_reminder("GUID123")
|
60
|
+
#
|
19
61
|
def send_reminder(guid)
|
20
62
|
post "/api/documents/#{guid}/send_reminders.xml", {}
|
21
63
|
end
|
22
64
|
|
65
|
+
# Extends a document's expiration date by 7 days
|
66
|
+
# * <b>guid</b>: Document GUID
|
67
|
+
#
|
68
|
+
# Ex. Extend expiration for document GUID123 by 7 days
|
69
|
+
# @rs_connection.trash_document("GUID123")
|
70
|
+
#
|
23
71
|
def trash_document(guid)
|
24
72
|
post "/api/documents/#{guid}/trash.xml", {}
|
25
73
|
end
|
26
74
|
|
75
|
+
|
76
|
+
# Extends a document's expiration date by 7 days
|
77
|
+
# * <b>guid</b>: Document GUID
|
78
|
+
#
|
79
|
+
# Ex. Extend expiration for document GUID123 by 7 days
|
80
|
+
# @rs_connection.extend_document_expiration("GUID123")
|
81
|
+
#
|
27
82
|
def extend_document_expiration(guid)
|
28
83
|
post "/api/documents/#{guid}/extend_expiration.xml", {}
|
29
84
|
end
|
30
85
|
|
31
|
-
#
|
86
|
+
# <b>REPLACE</b> the tags on a document
|
32
87
|
# tags are an array of 'tag_name' or {'tag_name' => 'value'}
|
33
|
-
#
|
34
|
-
#
|
88
|
+
#
|
89
|
+
# Ex. Replaces document GUID123 with tags "single_tag", "hello:bye"
|
90
|
+
# @rs_connection.update_document_tags("GUID123", ["single_tag", {"hello" => "bye"}])
|
35
91
|
def update_document_tags(guid, tags)
|
36
92
|
post "/api/documents/#{guid}/update_tags.xml", { :tags => TagsHelper.array_to_xml_hash(tags) }
|
37
93
|
end
|
38
94
|
|
39
95
|
# Creates a document from a raw data
|
40
|
-
# * file
|
41
|
-
# * filename
|
42
|
-
# * subject
|
43
|
-
# * recipients
|
44
|
-
#
|
45
|
-
#
|
96
|
+
# * <b>file</b>: file binary. Ex. File.read('myfile.pdf')
|
97
|
+
# * <b>filename</b>: original filename
|
98
|
+
# * <b>subject</b>: subject of the document that'll appear in email
|
99
|
+
# * <b>recipients</b>: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
|
100
|
+
# One of the recipients requires <b>:is_sender</b> (true/false) to reference the API User and won't need to supply :name and :email
|
101
|
+
# Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
|
46
102
|
# [
|
47
103
|
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
48
104
|
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
49
105
|
# {'is_sender' => true, :role => 'signer'},
|
50
106
|
# ]
|
51
|
-
# * options
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
107
|
+
# * <b>options</b>: other optional values
|
108
|
+
# - <b>description</b>: document description that'll appear in the email
|
109
|
+
# - <b>action</b>: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
|
110
|
+
# - <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
111
|
+
# - <b>tags</b>: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
|
112
|
+
# Ex. ['sent_from_api', {"user_id" => "32"}]
|
113
|
+
# - <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
114
|
+
# Ex. "http://yoursite/callback"
|
115
|
+
# - <b>use_text_tags</b>: Document has special Text Tags that RightSignature parse. true or false.
|
116
|
+
# More info: https://rightsignature.com/apidocs/text_tags
|
61
117
|
def send_document_from_data(file_data, filename, subject, recipients, options={})
|
62
118
|
send_document(subject, recipients, {:type => "base64", :filename => filename, :value => Base64::encode64(file_data)}, options)
|
63
119
|
end
|
64
120
|
|
65
121
|
# Creates a document from a File or path to file
|
66
|
-
# * file
|
67
|
-
# * subject
|
68
|
-
# * recipients
|
69
|
-
#
|
70
|
-
#
|
122
|
+
# * <b>file</b>: Path to file or File object
|
123
|
+
# * <b>subject</b>: subject of the document that'll appear in email
|
124
|
+
# * <b>recipients</b>: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
|
125
|
+
# One of the recipients requires <b>:is_sender</b> (true/false) to reference the API User and won't need to supply :name and :email
|
126
|
+
# Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
|
71
127
|
# [
|
72
128
|
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
73
129
|
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
74
130
|
# {'is_sender' => true, :role => 'signer'},
|
75
131
|
# ]
|
76
|
-
# * options
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
132
|
+
# * <b>options</b>: other optional values
|
133
|
+
# - <b>description</b>: document description that'll appear in the email
|
134
|
+
# - <b>action</b>: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
|
135
|
+
# - <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
136
|
+
# - <b>tags</b>: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
|
137
|
+
# Ex. ['sent_from_api', {"user_id" => "32"}]
|
138
|
+
# - <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
139
|
+
# Ex. "http://yoursite/callback"
|
140
|
+
# - <b>use_text_tags</b>: Document has special Text Tags that RightSignature parse. true or false.
|
141
|
+
# More info: https://rightsignature.com/apidocs/text_tags
|
142
|
+
#
|
143
|
+
# Example:
|
144
|
+
# recipients = [
|
145
|
+
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
146
|
+
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
147
|
+
# {'is_sender' => true, :role => 'signer'}
|
148
|
+
# ]
|
149
|
+
# options={
|
150
|
+
# :tags => [{:tag => {:name => 'sent_from_api'}}, {:tag => {:name => 'user_id', :value => '12345'}}],
|
151
|
+
# :expires_in => '5 days',
|
152
|
+
# :action => "redirect",
|
153
|
+
# 'callback_location' => "http://example.com/doc_callback",
|
154
|
+
# 'use_text_tags' => false
|
155
|
+
# }
|
156
|
+
# @rs_connection.send_document_from_file("here/is/myfile.pdf", 'My Subject', recipients, options)
|
157
|
+
#
|
86
158
|
def send_document_from_file(file, subject, recipients, options={})
|
87
159
|
send_document(subject, recipients, {:type => "base64", :filename => File.basename(file), :value => Base64::encode64(File.read(file)) }, options)
|
88
160
|
end
|
89
161
|
|
90
162
|
# Creates a document from URL
|
91
|
-
# * url
|
92
|
-
# * subject
|
93
|
-
# * recipients
|
94
|
-
#
|
95
|
-
#
|
163
|
+
# * <b>url</b>: URL to file
|
164
|
+
# * <b>subject</b>: subject of the document that'll appear in email
|
165
|
+
# * <b>recipients</b>: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
|
166
|
+
# One of the recipients requires <b>:is_sender</b> (true/false) to reference the API User and won't need to supply :name and :email
|
167
|
+
# Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
|
96
168
|
# [
|
97
169
|
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
98
170
|
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
99
171
|
# {'is_sender' => true, :role => 'signer'},
|
100
172
|
# ]
|
101
|
-
# * options
|
102
|
-
#
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
173
|
+
# * <b>options</b>: other optional values
|
174
|
+
# - <b>description</b>: document description that'll appear in the email
|
175
|
+
# - <b>action</b>: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
|
176
|
+
# - <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
177
|
+
# - <b>tags</b>: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
|
178
|
+
# Ex. ['sent_from_api', {"user_id" => "32"}]
|
179
|
+
# - <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
180
|
+
# Ex. "http://yoursite/callback"
|
181
|
+
# - <b>use_text_tags</b>: Document has special Text Tags that RightSignature parse. true or false.
|
182
|
+
# More info: https://rightsignature.com/apidocs/text_tags
|
183
|
+
#
|
184
|
+
# Example:
|
185
|
+
# recipients = [
|
186
|
+
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
187
|
+
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
188
|
+
# {'is_sender' => true, :role => 'signer'}
|
189
|
+
# ]
|
190
|
+
# options={
|
191
|
+
# :tags => [{:tag => {:name => 'sent_from_api'}}, {:tag => {:name => 'user_id', :value => '12345'}}],
|
192
|
+
# :expires_in => '5 days',
|
193
|
+
# :action => "redirect",
|
194
|
+
# 'callback_location' => "http://example.com/doc_callback",
|
195
|
+
# 'use_text_tags' => false
|
196
|
+
# }
|
197
|
+
# @rs_connection.send_document_from_url("http://myfile/here", 'My Subject', recipients, options)
|
198
|
+
#
|
111
199
|
def send_document_from_url(url, subject, recipients, options={})
|
112
200
|
send_document(subject, recipients, {:type => "url", :filename => File.basename(url), :value => url }, options)
|
113
201
|
end
|
114
202
|
|
115
203
|
# Creates a document from a base64 encoded file or publicly available URL
|
116
|
-
# * document_data
|
117
|
-
# * subject
|
118
|
-
# * recipients
|
119
|
-
#
|
120
|
-
#
|
204
|
+
# * <b>document_data</b>: hash of document source :type ('base64' or 'url'), :filename to be used, :value of source (url or base64 encoded binary)
|
205
|
+
# * <b>subject</b>: subject of the document that'll appear in email
|
206
|
+
# * <b>recipients</b>: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
|
207
|
+
# One of the recipients requires <b>:is_sender</b> (true/false) to reference the API User and won't need to supply :name and :email
|
208
|
+
# Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
|
121
209
|
# [
|
122
210
|
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
123
211
|
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
124
212
|
# {'is_sender' => true, :role => 'signer'},
|
125
213
|
# ]
|
126
214
|
# * options: other optional values
|
127
|
-
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
133
|
-
#
|
134
|
-
#
|
135
|
-
#
|
215
|
+
# - <b>description</b>: document description that'll appear in the email
|
216
|
+
# - <b>action</b>: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
|
217
|
+
# - <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
218
|
+
# - <b>tags</b>: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
|
219
|
+
# Ex. ['sent_from_api', {"user_id" => "32"}]
|
220
|
+
# - <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
221
|
+
# Ex. "http://yoursite/callback"
|
222
|
+
# - <b>use_text_tags</b>: Document has special Text Tags that RightSignature parse. true or false.
|
223
|
+
# More info: https://rightsignature.com/apidocs/text_tags
|
136
224
|
# Ex.
|
137
|
-
#
|
138
|
-
#
|
139
|
-
#
|
140
|
-
#
|
141
|
-
#
|
142
|
-
#
|
143
|
-
#
|
144
|
-
#
|
145
|
-
#
|
146
|
-
#
|
147
|
-
#
|
148
|
-
#
|
149
|
-
#
|
150
|
-
#
|
225
|
+
# recipients = [
|
226
|
+
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
227
|
+
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
228
|
+
# {'is_sender' => true, :role => 'signer'},
|
229
|
+
# ]
|
230
|
+
# document_data = {:type => 'base64', :filename => "originalfile.pdf", :value => Base64.encode64(File.read('myfile.pdf','r'))}
|
231
|
+
# options = {
|
232
|
+
# :tags => ['sent_from_api', 'user_id' => '12345'],
|
233
|
+
# :expires_in => '5 days',
|
234
|
+
# :action => "redirect",
|
235
|
+
# 'callback_location' => "http://example.com/doc_callback",
|
236
|
+
# 'use_text_tags' => false
|
237
|
+
# }
|
238
|
+
# @rs_connection.send_document( "My Subject", recipients, document_data, options)
|
151
239
|
#
|
152
240
|
def send_document(subject, recipients, document_data, options={})
|
153
241
|
document_hash = {:document => {
|
@@ -166,41 +254,41 @@ module RightSignature
|
|
166
254
|
end
|
167
255
|
|
168
256
|
# Prefills a document from a base64 encoded file or publicly available URL and returns a url that allows someone to send as the API User
|
169
|
-
# * document_data
|
170
|
-
# * subject
|
171
|
-
# * recipients
|
172
|
-
#
|
173
|
-
#
|
257
|
+
# * <b>document_data</b>: hash of document source :type ('base64' or 'url'), :filename to be used, :value of source (url or base64 encoded binary)
|
258
|
+
# * <b>subject</b>: subject of the document that'll appear in email
|
259
|
+
# * <b>recipients</b>: Recipients of the document, should be an array of hashes with :name, :email, and :role ('cc' or 'signer').
|
260
|
+
# One of the recipients requires <b>:is_sender</b> (true/false) to reference the API User and won't need to supply :name and :email
|
261
|
+
# Ex. CC to support@rightsignature.com, with sender and john@rightsignature.com as a signer
|
174
262
|
# [
|
175
263
|
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
176
264
|
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
177
265
|
# {'is_sender' => true, :role => 'signer'},
|
178
266
|
# ]
|
179
|
-
# * options
|
180
|
-
#
|
181
|
-
#
|
182
|
-
#
|
183
|
-
#
|
184
|
-
#
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
267
|
+
# * <b>options</b>: other optional values
|
268
|
+
# - <b>description</b>: document description that'll appear in the email
|
269
|
+
# - <b>action</b>: 'send' or 'redirect'. Redirect will return a token that will allow another person to send the document under API user's account
|
270
|
+
# - <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
271
|
+
# - <b>tags</b>: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
|
272
|
+
# Ex. ['sent_from_api', {"user_id" => "32"}]
|
273
|
+
# - <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
274
|
+
# Ex. "http://yoursite/callback"
|
275
|
+
# - <b>use_text_tags</b>: Document has special Text Tags that RightSignature parse. true or false.
|
276
|
+
# More info: https://rightsignature.com/apidocs/text_tags
|
189
277
|
# Ex.
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
193
|
-
#
|
194
|
-
#
|
195
|
-
#
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
200
|
-
#
|
201
|
-
#
|
202
|
-
#
|
203
|
-
#
|
278
|
+
# recipients = [
|
279
|
+
# {:name => "RightSignature", :email => "support@rightsignature.com", :role => 'cc'},
|
280
|
+
# {:name => "John Bellingham", :email => "john@rightsignature.com", :role => 'signer'},
|
281
|
+
# {'is_sender' => true, :role => 'signer'},
|
282
|
+
# ]
|
283
|
+
# document_data = {:type => 'base64', :filename => "originalfile.pdf", :value => Base64.encode64(File.read('myfile.pdf','r'))}
|
284
|
+
# options = {
|
285
|
+
# :tags => ['sent_from_api', 'user_id' => '12345'],
|
286
|
+
# :expires_in => '5 days',
|
287
|
+
# :action => "redirect",
|
288
|
+
# 'callback_location' => "http://example.com/doc_callback",
|
289
|
+
# 'use_text_tags' => false
|
290
|
+
# }
|
291
|
+
# @rs_connection.generate_document_redirect_url( "My Subject", recipients, document_data, options)
|
204
292
|
#
|
205
293
|
def generate_document_redirect_url(subject, recipients, document_data, options={})
|
206
294
|
options[:action] = "redirect"
|
@@ -209,6 +297,13 @@ module RightSignature
|
|
209
297
|
"#{site}/builder/new?rt=#{response['document']['redirect_token']}"
|
210
298
|
end
|
211
299
|
|
300
|
+
# Generates signer links for a Document with signers with email of "noemail@rightsignautre.com"
|
301
|
+
# * <b>guid</b>: Document GUID
|
302
|
+
# * <b>redirect_location</b>: (Optional) URL to redirect each signer after it is completed
|
303
|
+
#
|
304
|
+
# Ex. Generate signer links for document GUID123 that redirects users to http://mysite/done_signing after signing
|
305
|
+
# @rs_connection.get_document_signer_links_for("GUID123", "http://mysite/done_signing")
|
306
|
+
#
|
212
307
|
def get_document_signer_links_for(guid, redirect_location = nil)
|
213
308
|
params = {}
|
214
309
|
params[:redirect_location] = URI.encode(redirect_location) if redirect_location
|
@@ -8,10 +8,12 @@ module RightSignature
|
|
8
8
|
super((message || @response.message))
|
9
9
|
end
|
10
10
|
|
11
|
+
# returns HTTP Code from response
|
11
12
|
def code
|
12
13
|
@response.code
|
13
14
|
end
|
14
15
|
|
16
|
+
# Suggestions on how to resolve a certain error
|
15
17
|
def common_solutions
|
16
18
|
if @response.code.to_i == 406
|
17
19
|
"Check the Content-Type and makes sure it's the correct type (usually application/json or application/xml), ensure url has .xml or .json at the end, check 'Accept' header to allow xml or json ('*/*' for anything)"
|
@@ -23,6 +25,8 @@ module RightSignature
|
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
|
-
class TokenResponseError <
|
27
|
-
|
28
|
+
class TokenResponseError < ResponseError # :nodoc:
|
29
|
+
end
|
30
|
+
class OAuthResponseError < ResponseError # :nodoc:
|
31
|
+
end
|
28
32
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
module RightSignature::Helpers
|
2
|
-
module TagsHelper
|
3
|
-
class <<self
|
1
|
+
module RightSignature::Helpers #:nodoc:
|
2
|
+
module TagsHelper #:nodoc:
|
3
|
+
class <<self #:nodoc:
|
4
4
|
def mixed_array_to_string_array(array_of_tags)
|
5
5
|
return array_of_tags unless array_of_tags.is_a?(Array)
|
6
6
|
|
@@ -32,8 +32,8 @@ module RightSignature::Helpers
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
module RolesHelper
|
36
|
-
class <<self
|
35
|
+
module RolesHelper #:nodoc:
|
36
|
+
class <<self #:nodoc:
|
37
37
|
# Converts [{"Role_ID" => {:name => "John", :email => "email@example.com"}}] to
|
38
38
|
# [{:role => {:name => "John", :email => "email@example.com", "@role_id" => "Role_ID"} }]
|
39
39
|
# Tries to guess if it's using Role ID or Role Name
|
@@ -56,8 +56,8 @@ module RightSignature::Helpers
|
|
56
56
|
end
|
57
57
|
|
58
58
|
|
59
|
-
module MergeFieldsHelper
|
60
|
-
class <<self
|
59
|
+
module MergeFieldsHelper #:nodoc:
|
60
|
+
class <<self #:nodoc:
|
61
61
|
# Converts [{"Role Name" => {:name => "John", :email => "email@example.com"}}] to
|
62
62
|
# [{"role roles_name=\"Role Name\"" => {:role => {:name => "John", :email => "email@example.com"}} }]
|
63
63
|
def array_to_xml_hash(merge_fields_array, use_id=false)
|
@@ -77,6 +77,7 @@ module RightSignature::Helpers
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
+
#:nodoc:
|
80
81
|
def array_to_acceptable_names_hash(acceptable_names)
|
81
82
|
converted_fields = []
|
82
83
|
acceptable_names.each do |name|
|
@@ -1,51 +1,64 @@
|
|
1
1
|
module RightSignature
|
2
2
|
module Template
|
3
3
|
include RightSignature::Helpers
|
4
|
-
# List Templates
|
5
|
-
#
|
6
|
-
# * page
|
7
|
-
# * per_page
|
8
|
-
#
|
9
|
-
# * tags
|
10
|
-
#
|
11
|
-
# * search
|
4
|
+
# List Templates with optional filters
|
5
|
+
# * <b>Options</b>: (optional) Hash of filters to use
|
6
|
+
# * <b>page</b>: page number
|
7
|
+
# * <b>per_page</b>: number of templates to return per page.
|
8
|
+
# API only supports 10, 20, 30, 40, or 50. Default is 10.
|
9
|
+
# * <b>tags</b>: filter templates by given tags. Array of strings, for name/value tags colon (:) should separate name and value.
|
10
|
+
# Ex. "single_tag,tag_key:tag_value" would find templates with 'single_tag' and the name/value of 'tag_key' with value 'tag_value'.
|
11
|
+
# * <b>search</b>: term to search for in templates.
|
12
|
+
#
|
13
|
+
# Ex.
|
14
|
+
# options = {
|
15
|
+
# :state => ['completed', 'trashed'],
|
16
|
+
# :page => 1,
|
17
|
+
# :per_page => 20,
|
18
|
+
# :search => "me",
|
19
|
+
# :tags => ["single_tag", "key" => "with_value"]
|
20
|
+
# }
|
21
|
+
# @rs_connection.templates_list(options)
|
12
22
|
def templates_list(options={})
|
13
23
|
options[:tags] = TagsHelper.mixed_array_to_string_array(options[:tags]) if options[:tags]
|
14
24
|
get "/api/templates.xml", options
|
15
25
|
end
|
16
26
|
|
27
|
+
# Gets template details
|
28
|
+
# * <b>guid</b>: templates guid. Ex. a_1_zcfdidf8fi23
|
17
29
|
def template_details(guid)
|
18
30
|
get "/api/templates/#{guid}.xml", {}
|
19
31
|
end
|
20
32
|
|
21
|
-
# Clones a template so it can be used for sending. Always first step in sending a template.
|
33
|
+
# Clones a template so it can be used for sending. Always first step in sending a template.
|
34
|
+
# * <b>guid</b>: templates guid. Ex. a_1_zcfdidf8fi23
|
22
35
|
def prepackage(guid)
|
23
36
|
post "/api/templates/#{guid}/prepackage.xml", {}
|
24
37
|
end
|
25
38
|
|
26
|
-
# Prefills template.
|
27
|
-
# * guid
|
28
|
-
# * subject
|
29
|
-
# * roles
|
39
|
+
# Prefills template. Should use a <b>prepackaged</b> template first.
|
40
|
+
# * <b>guid</b>: templates guid. Ex. a_1_zcfdidf8fi23
|
41
|
+
# * <b>subject</b>: subject of the document that'll appear in email
|
42
|
+
# * <b>roles</b>: Recipients of the document, should be an array of role names and emails in a hash with keys as role_names.
|
30
43
|
# Ex. [{"Employee" => {:name => "John Employee", :email => "john@employee.com"}}]
|
31
44
|
# is equivalent to
|
32
45
|
# <role role_name="Employee">
|
33
46
|
# <name>John Employee</name>
|
34
47
|
# <email>john@employee.com</email>
|
35
48
|
# </role>
|
36
|
-
# * options
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
+
# * <b>options</b>: other optional values
|
50
|
+
# * <b>description</b>: document description that'll appear in the email
|
51
|
+
# * <b>merge_fields</b>: document merge fields, should be an array of merge_field_values in a hash with the merge_field_name.
|
52
|
+
# Ex. [{"Salary" => "$1,000,000"}]
|
53
|
+
# is equivalent to
|
54
|
+
# <merge_field merge_field_name="Salary">
|
55
|
+
# <value>$1,000,000</value>
|
56
|
+
# </merge_field>
|
57
|
+
# * <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
58
|
+
# * <b>tags</b>: document tags, an array of string or hashes 'single_tag' (for simple tag) or {'tag_name' => 'tag_value'} (for tuples pairs)
|
59
|
+
# Ex. ['sent_from_api', {"user_id" => "32"}]
|
60
|
+
# * <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
61
|
+
# Ex. "http://yoursite/callback"
|
49
62
|
#
|
50
63
|
# Ex. call with all options used
|
51
64
|
# RightSignature::Template.prefill(
|
@@ -87,38 +100,80 @@ module RightSignature
|
|
87
100
|
post "/api/templates.xml", xml_hash
|
88
101
|
end
|
89
102
|
|
103
|
+
# Prepackages and sends template.
|
104
|
+
# * <b>guid</b>: templates guid. Ex. a_1_zcfdidf8fi23
|
105
|
+
# * <b>roles</b>: Recipients of the document, should be an array of role names and emails in a hash with keys as role_names.
|
106
|
+
# Ex. [{"Employee" => {:name => "John Employee", :email => "john@employee.com"}}]
|
107
|
+
# is equivalent to
|
108
|
+
# <role role_name="Employee">
|
109
|
+
# <name>John Employee</name>
|
110
|
+
# <email>john@employee.com</email>
|
111
|
+
# </role>
|
112
|
+
# * <b>options</b>: other optional values
|
113
|
+
# * <b>subject</b>: subject of the document that'll appear in email. Defaults to template's subject
|
114
|
+
# * <b>description</b>: document description that'll appear in the email
|
115
|
+
# * <b>merge_fields</b>: document merge fields, should be an array of merge_field_values in a hash with the merge_field_name.
|
116
|
+
# Ex. [{"Salary" => "$1,000,000"}]
|
117
|
+
# is equivalent to
|
118
|
+
# <merge_field merge_field_name="Salary">
|
119
|
+
# <value>$1,000,000</value>
|
120
|
+
# </merge_field>
|
121
|
+
# * <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
122
|
+
# * <b>tags</b>: document tags, an array of {:name => 'tag_name'} (for simple tag) or {:name => 'tag_name', :value => 'value'} (for tuples pairs)
|
123
|
+
# Ex. [{:name => 'sent_from_api'}, {:name => "user_id", :value => "32"}]
|
124
|
+
# * <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
125
|
+
# Ex. "http://yoursite/callback"
|
126
|
+
#
|
127
|
+
# Ex. call with all options used
|
128
|
+
# RightSignature::Template.prepackage_and_send(
|
129
|
+
# "a_1_zcfdidf8fi23",
|
130
|
+
# "Your Employee Handbook",
|
131
|
+
# [{"employee" => {:name => "John Employee", :email => "john@employee.com"}}],
|
132
|
+
# {
|
133
|
+
# :description => "Please read over the handbook and sign it.",
|
134
|
+
# :merge_fields => [
|
135
|
+
# { "Department" => "Fun and games" },
|
136
|
+
# { "Salary" => "$1,000,000" }
|
137
|
+
# ],
|
138
|
+
# :expires_in => 5,
|
139
|
+
# :tags => [
|
140
|
+
# {:name => 'sent_from_api'},
|
141
|
+
# {:name => 'user_id', :value => '32'}
|
142
|
+
# ],
|
143
|
+
# :callback_url => "http://yoursite/callback"
|
144
|
+
# })
|
90
145
|
def prepackage_and_send(guid, roles, options={})
|
91
146
|
response = prepackage(guid)
|
92
147
|
new_guid = response["template"]["guid"]
|
93
148
|
send_template(new_guid, options.delete(:subject) || response["template"]["subject"], roles, options)
|
94
149
|
end
|
95
150
|
|
96
|
-
# Sends template.
|
97
|
-
# * guid
|
98
|
-
# * subject
|
99
|
-
# * roles
|
151
|
+
# Sends template. Should use a <b>prepackaged</b> template first. Easier to use <b>prepackage_and_send</b> for most cases.
|
152
|
+
# * <b>guid</b>: templates guid. Ex. a_1_zcfdidf8fi23
|
153
|
+
# * <b>subject</b>: subject of the document that'll appear in email
|
154
|
+
# * <b>roles</b>: Recipients of the document, should be an array of role names and emails in a hash with keys as role_names.
|
100
155
|
# Ex. [{"Employee" => {:name => "John Employee", :email => "john@employee.com"}}]
|
101
156
|
# is equivalent to
|
102
157
|
# <role role_name="Employee">
|
103
158
|
# <name>John Employee</name>
|
104
159
|
# <email>john@employee.com</email>
|
105
160
|
# </role>
|
106
|
-
# * options
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
#
|
112
|
-
#
|
113
|
-
#
|
114
|
-
#
|
115
|
-
#
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
161
|
+
# * <b>options</b>: other optional values
|
162
|
+
# * <b>description</b>: document description that'll appear in the email
|
163
|
+
# * <b>merge_fields</b>: document merge fields, should be an array of merge_field_values in a hash with the merge_field_name.
|
164
|
+
# Ex. [{"Salary" => "$1,000,000"}]
|
165
|
+
# is equivalent to
|
166
|
+
# <merge_field merge_field_name="Salary">
|
167
|
+
# <value>$1,000,000</value>
|
168
|
+
# </merge_field>
|
169
|
+
# * <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
170
|
+
# * <b>tags</b>: document tags, an array of {:name => 'tag_name'} (for simple tag) or {:name => 'tag_name', :value => 'value'} (for tuples pairs)
|
171
|
+
# Ex. [{:name => 'sent_from_api'}, {:name => "user_id", :value => "32"}]
|
172
|
+
# * <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
173
|
+
# Ex. "http://yoursite/callback"
|
119
174
|
#
|
120
175
|
# Ex. call with all options used
|
121
|
-
# RightSignature::Template.
|
176
|
+
# RightSignature::Template.send_template(
|
122
177
|
# "a_1_zcfdidf8fi23",
|
123
178
|
# "Your Employee Handbook",
|
124
179
|
# [{"employee" => {:name => "John Employee", :email => "john@employee.com"}}],
|
@@ -140,17 +195,17 @@ module RightSignature
|
|
140
195
|
end
|
141
196
|
|
142
197
|
# Creates a URL that give person ability to create a template in your account.
|
143
|
-
# * options
|
144
|
-
#
|
145
|
-
#
|
146
|
-
#
|
147
|
-
#
|
148
|
-
#
|
149
|
-
#
|
150
|
-
#
|
151
|
-
#
|
152
|
-
#
|
153
|
-
#
|
198
|
+
# * <b>options</b>: optional options for redirected person
|
199
|
+
# * <b>callback_location</b>: URI encoded URL that specifies the location we will POST a callback notification to when the template has been created.
|
200
|
+
# * <b>redirect_location</b>: A URI encoded URL that specifies the location we will redirect the user to, after they have created a template.
|
201
|
+
# * <b>tags</b>: tags to add to the template. an array of 'tag_name' (for simple tag) or {'tag_name' => 'value'} (for tuples pairs)
|
202
|
+
# Ex. ['created_from_api', {"user_id" => "123"}]
|
203
|
+
# * <b>acceptable_role_names</b>: The user creating the Template will be forced to select one of the values provided.
|
204
|
+
# There will be no free-form name entry when adding roles to the Template. An array of strings.
|
205
|
+
# Ex. ["Employee", "Employeer"]
|
206
|
+
# * <b>acceptable_merge_field_names</b>: The user creating the Template will be forced to select one of the values provided.
|
207
|
+
# There will be no free-form name entry when adding merge fields to the Template.
|
208
|
+
# Ex. ["Location", "Tax ID", "Company Name"]
|
154
209
|
def generate_build_url(options={})
|
155
210
|
xml_hash = {:template => {}}
|
156
211
|
xml_hash[:template][:tags] = TagsHelper.array_to_xml_hash(options[:tags]) if options[:tags]
|
@@ -171,30 +226,30 @@ module RightSignature
|
|
171
226
|
end
|
172
227
|
|
173
228
|
# Sends template with all roles as embedded signers and returns an array of hashes with :name and :url for each signer link.
|
174
|
-
# * guid
|
175
|
-
# * roles
|
229
|
+
# * <b>guid</b>: templates guid. Ex. a_1_zcfdidf8fi23
|
230
|
+
# * <b>roles</b>: Recipients of the document, should be an array of role names in a hash with keys as role_names.
|
176
231
|
# Ex. [{"Employee" => {:name => "John Employee"}]
|
177
232
|
# is equivalent to
|
178
233
|
# <role role_name="Employee">
|
179
234
|
# <name>John Employee</name>
|
180
235
|
# <email>noemail@rightsignature.com</email>
|
181
236
|
# </role>
|
182
|
-
# * options
|
183
|
-
#
|
184
|
-
#
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
193
|
-
#
|
194
|
-
#
|
195
|
-
#
|
196
|
-
#
|
197
|
-
#
|
237
|
+
# * <b>options</b>: other optional values
|
238
|
+
# * <b>subject</b>: subject of the document that'll appear in email. Defaults to Template's subject
|
239
|
+
# * <b>description</b>: document description that'll appear in the email
|
240
|
+
# * <b>merge_fields</b>: document merge fields, should be an array of merge_field_values in a hash with the merge_field_name.
|
241
|
+
# Ex. [{"Salary" => "$1,000,000"}]
|
242
|
+
# is equivalent to
|
243
|
+
# <merge_field merge_field_name="Salary">
|
244
|
+
# <value>$1,000,000</value>
|
245
|
+
# </merge_field>
|
246
|
+
# * <b>expires_in</b>: number of days before expiring the document. API only allows 2,5,15, or 30.
|
247
|
+
# * <b>tags</b>: document tags, an array of {:name => 'tag_name'} (for simple tag) or {:name => 'tag_name', :value => 'value'} (for tuples pairs)
|
248
|
+
# Ex. [{:name => 'sent_from_api'}, {:name => "user_id", :value => "32"}]
|
249
|
+
# * <b>callback_url</b>: A URI encoded URL that specifies the location for API to POST a callback notification to when the document has been created and signed.
|
250
|
+
# Ex. "http://yoursite/callback"
|
251
|
+
# * <b>redirect_location</b>: A URI encoded URL that specifies the location for the signing widget to redirect the user to after it is signed.
|
252
|
+
# Ex. "http://yoursite/thanks_for_signing"
|
198
253
|
#
|
199
254
|
# Ex. call with all options used
|
200
255
|
# RightSignature::Template.prefill(
|
@@ -8,20 +8,20 @@ describe RightSignature::TokenConnection do
|
|
8
8
|
|
9
9
|
it "should create 'api-token' in headers with :api_token credentials, accept of '*/*', and content-type of xml with given method" do
|
10
10
|
token_connection = RightSignature::TokenConnection.new('APITOKEN')
|
11
|
-
token_connection.should_receive(:get).with("path", {:query => {:search => 'hey there'}, :headers => {"api-token" => "APITOKEN", "Accept" => "*/*", "content-type" => "application/xml"}}).and_return(stub("HTTPartyResponse", :parsed_response => nil))
|
11
|
+
token_connection.class.should_receive(:get).with("path", {:query => {:search => 'hey there'}, :headers => {"api-token" => "APITOKEN", "Accept" => "*/*", "content-type" => "application/xml"}}).and_return(stub("HTTPartyResponse", :parsed_response => nil))
|
12
12
|
token_connection.request(:get, "path", {:query => {:search => 'hey there'}})
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should add 'api-token' to headers with :api_token credentials, accept of '*/*', and content-type of xml with given method" do
|
16
16
|
token_connection = RightSignature::TokenConnection.new('APITOKEN')
|
17
|
-
token_connection.should_receive(:get).with("path", {:query => {:search => 'hey there'}, :headers => {"api-token" => "APITOKEN", "Accept" => "*/*", "content-type" => "application/xml", :my_header => "someHeader"}}).and_return(stub("HTTPartyResponse", :parsed_response => nil))
|
17
|
+
token_connection.class.should_receive(:get).with("path", {:query => {:search => 'hey there'}, :headers => {"api-token" => "APITOKEN", "Accept" => "*/*", "content-type" => "application/xml", :my_header => "someHeader"}}).and_return(stub("HTTPartyResponse", :parsed_response => nil))
|
18
18
|
token_connection.request(:get, "path", {:query => {:search => 'hey there'}, :headers => {:my_header => "someHeader"}})
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should create 'api-token' in headers with :api_token credentials, accept of '*/*', and content-type of xml to POST method" do
|
22
22
|
token_connection = RightSignature::TokenConnection.new('APITOKEN')
|
23
|
-
token_connection.should_receive(:post).with("path", {:body => {:document => {:roles => []}}, :headers => {"api-token" => "APITOKEN", "Accept" => "*/*", "content-type" => "application/xml"}}).and_return(stub("HTTPartyResponse", :parsed_response => nil))
|
23
|
+
token_connection.class.should_receive(:post).with("path", {:body => {:document => {:roles => []}}, :headers => {"api-token" => "APITOKEN", "Accept" => "*/*", "content-type" => "application/xml"}}).and_return(stub("HTTPartyResponse", :parsed_response => nil))
|
24
24
|
token_connection.request(:post, "path", {:body => {:document => {:roles => []}}})
|
25
25
|
end
|
26
26
|
|
27
|
-
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rightsignature
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-10-
|
14
|
+
date: 2012-10-23 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
18
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirement: &70183818100960 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ! '>='
|
@@ -23,15 +23,10 @@ dependencies:
|
|
23
23
|
version: 1.0.0
|
24
24
|
type: :development
|
25
25
|
prerelease: false
|
26
|
-
version_requirements:
|
27
|
-
none: false
|
28
|
-
requirements:
|
29
|
-
- - ! '>='
|
30
|
-
- !ruby/object:Gem::Version
|
31
|
-
version: 1.0.0
|
26
|
+
version_requirements: *70183818100960
|
32
27
|
- !ruby/object:Gem::Dependency
|
33
28
|
name: rspec
|
34
|
-
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirement: &70183818100180 !ruby/object:Gem::Requirement
|
35
30
|
none: false
|
36
31
|
requirements:
|
37
32
|
- - ! '>='
|
@@ -39,15 +34,10 @@ dependencies:
|
|
39
34
|
version: 2.11.0
|
40
35
|
type: :development
|
41
36
|
prerelease: false
|
42
|
-
version_requirements:
|
43
|
-
none: false
|
44
|
-
requirements:
|
45
|
-
- - ! '>='
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 2.11.0
|
37
|
+
version_requirements: *70183818100180
|
48
38
|
- !ruby/object:Gem::Dependency
|
49
39
|
name: bundler
|
50
|
-
requirement: !ruby/object:Gem::Requirement
|
40
|
+
requirement: &70183818099240 !ruby/object:Gem::Requirement
|
51
41
|
none: false
|
52
42
|
requirements:
|
53
43
|
- - ! '>='
|
@@ -55,15 +45,10 @@ dependencies:
|
|
55
45
|
version: 1.0.0
|
56
46
|
type: :runtime
|
57
47
|
prerelease: false
|
58
|
-
version_requirements:
|
59
|
-
none: false
|
60
|
-
requirements:
|
61
|
-
- - ! '>='
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: 1.0.0
|
48
|
+
version_requirements: *70183818099240
|
64
49
|
- !ruby/object:Gem::Dependency
|
65
50
|
name: oauth
|
66
|
-
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirement: &70183818097840 !ruby/object:Gem::Requirement
|
67
52
|
none: false
|
68
53
|
requirements:
|
69
54
|
- - ! '>='
|
@@ -71,15 +56,10 @@ dependencies:
|
|
71
56
|
version: 0.4.0
|
72
57
|
type: :runtime
|
73
58
|
prerelease: false
|
74
|
-
version_requirements:
|
75
|
-
none: false
|
76
|
-
requirements:
|
77
|
-
- - ! '>='
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version: 0.4.0
|
59
|
+
version_requirements: *70183818097840
|
80
60
|
- !ruby/object:Gem::Dependency
|
81
61
|
name: httparty
|
82
|
-
requirement: !ruby/object:Gem::Requirement
|
62
|
+
requirement: &70183818096560 !ruby/object:Gem::Requirement
|
83
63
|
none: false
|
84
64
|
requirements:
|
85
65
|
- - ! '>='
|
@@ -87,15 +67,10 @@ dependencies:
|
|
87
67
|
version: 0.9.0
|
88
68
|
type: :runtime
|
89
69
|
prerelease: false
|
90
|
-
version_requirements:
|
91
|
-
none: false
|
92
|
-
requirements:
|
93
|
-
- - ! '>='
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: 0.9.0
|
70
|
+
version_requirements: *70183818096560
|
96
71
|
- !ruby/object:Gem::Dependency
|
97
72
|
name: xml-fu
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirement: &70183818094620 !ruby/object:Gem::Requirement
|
99
74
|
none: false
|
100
75
|
requirements:
|
101
76
|
- - ! '>='
|
@@ -103,12 +78,7 @@ dependencies:
|
|
103
78
|
version: 0.1.7
|
104
79
|
type: :runtime
|
105
80
|
prerelease: false
|
106
|
-
version_requirements:
|
107
|
-
none: false
|
108
|
-
requirements:
|
109
|
-
- - ! '>='
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
version: 0.1.7
|
81
|
+
version_requirements: *70183818094620
|
112
82
|
description: Provides a wrapper for the RightSignature API.
|
113
83
|
email:
|
114
84
|
- dev@rightsignature.com
|
@@ -119,6 +89,7 @@ files:
|
|
119
89
|
- .gitignore
|
120
90
|
- Gemfile
|
121
91
|
- README.md
|
92
|
+
- Rakefile
|
122
93
|
- lib/rightsignature.rb
|
123
94
|
- lib/rightsignature/account.rb
|
124
95
|
- lib/rightsignature/connection.rb
|
@@ -160,9 +131,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
131
|
version: '0'
|
161
132
|
requirements: []
|
162
133
|
rubyforge_project:
|
163
|
-
rubygems_version: 1.8.
|
134
|
+
rubygems_version: 1.8.11
|
164
135
|
signing_key:
|
165
136
|
specification_version: 3
|
166
137
|
summary: API wrapper for RightSignature
|
167
138
|
test_files: []
|
168
|
-
has_rdoc:
|