signnow-ruby 0.0.2
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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +9 -0
- data/LICENSE +23 -0
- data/README.md +150 -0
- data/Rakefile +8 -0
- data/lib/signnow.rb +119 -0
- data/lib/signnow/authentications/base.rb +57 -0
- data/lib/signnow/authentications/oauth.rb +68 -0
- data/lib/signnow/base.rb +45 -0
- data/lib/signnow/client.rb +29 -0
- data/lib/signnow/document.rb +28 -0
- data/lib/signnow/operations/all.rb +51 -0
- data/lib/signnow/operations/create.rb +35 -0
- data/lib/signnow/operations/delete.rb +42 -0
- data/lib/signnow/operations/download_link.rb +41 -0
- data/lib/signnow/operations/find.rb +43 -0
- data/lib/signnow/operations/show.rb +42 -0
- data/lib/signnow/operations/update.rb +52 -0
- data/lib/signnow/request/base.rb +34 -0
- data/lib/signnow/request/connection.rb +74 -0
- data/lib/signnow/request/helpers.rb +36 -0
- data/lib/signnow/request/info.rb +50 -0
- data/lib/signnow/request/validator.rb +52 -0
- data/lib/signnow/user.rb +31 -0
- data/lib/signnow/version.rb +3 -0
- data/signnow.gemspec +22 -0
- data/spec/signnow/base_spec.rb +12 -0
- data/spec/signnow/client_spec.rb +53 -0
- data/spec/signnow/document_spec.rb +188 -0
- data/spec/signnow/request/base_spec.rb +27 -0
- data/spec/signnow/request/connection_spec.rb +58 -0
- data/spec/signnow/request/info_spec.rb +27 -0
- data/spec/signnow/request/validator_spec.rb +13 -0
- data/spec/signnow/user_spec.rb +86 -0
- data/spec/signnow_spec.rb +45 -0
- data/spec/spec_helper.rb +13 -0
- metadata +133 -0
data/lib/signnow/base.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Signnow
|
2
|
+
class Base
|
3
|
+
include Signnow::Operations::All
|
4
|
+
include Signnow::Operations::Create
|
5
|
+
include Signnow::Operations::Find
|
6
|
+
|
7
|
+
attr_accessor :created
|
8
|
+
|
9
|
+
# Initializes the object using the given attributes
|
10
|
+
#
|
11
|
+
# @param [Hash] attributes The attributes to use for initialization
|
12
|
+
def initialize(attributes = {})
|
13
|
+
set_attributes(attributes)
|
14
|
+
parse_timestamps
|
15
|
+
end
|
16
|
+
|
17
|
+
# Model validations
|
18
|
+
#
|
19
|
+
# @return [Boolean]
|
20
|
+
def valid?
|
21
|
+
self.errors.empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
# Accesor for the errors
|
25
|
+
#
|
26
|
+
def errors
|
27
|
+
@errors || []
|
28
|
+
end
|
29
|
+
|
30
|
+
# Sets the attributes
|
31
|
+
#
|
32
|
+
# @param [Hash] attributes The attributes to initialize
|
33
|
+
def set_attributes(attributes)
|
34
|
+
attributes.each_pair do |key, value|
|
35
|
+
instance_variable_set("@#{key}", value)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Parses UNIX timestamps and creates Time objects.
|
40
|
+
def parse_timestamps
|
41
|
+
@created = created.to_i if created.is_a? String
|
42
|
+
@created = Time.at(created) if created
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Signnow
|
2
|
+
class Client
|
3
|
+
attr_reader :access_token
|
4
|
+
|
5
|
+
# Creates an account object using the given Signnow user.
|
6
|
+
# existing account.
|
7
|
+
#
|
8
|
+
# @param [String] User access token to use the signnow api.
|
9
|
+
def initialize(access_token=nil)
|
10
|
+
@access_token = access_token
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
# Executes block with the access token
|
15
|
+
#
|
16
|
+
# @param [block] block to execute
|
17
|
+
#
|
18
|
+
# @example [description]
|
19
|
+
# client = Signnow::Client.new('_user_auth_')
|
20
|
+
# client.perform! do |access_token|
|
21
|
+
# Signnow::User.show(access_token: access_token)
|
22
|
+
# end
|
23
|
+
def perform!(&block)
|
24
|
+
raise Signnow::AuthenticationError unless access_token
|
25
|
+
block.call(access_token)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Signnow
|
2
|
+
class Document < Base
|
3
|
+
include Signnow::Operations::Show
|
4
|
+
include Signnow::Operations::All
|
5
|
+
include Signnow::Operations::DownloadLink
|
6
|
+
|
7
|
+
attr_accessor :id, :user_id, :document_name, :page_count, :created,
|
8
|
+
:updated, :original_filename, :thumbnail, :signatures, :seals, :texts,
|
9
|
+
:inserts, :tags, :fields, :requests, :notary_invites, :version_time, :pages
|
10
|
+
|
11
|
+
# Parses UNIX timestamps and creates Time objects.
|
12
|
+
def parse_timestamps
|
13
|
+
super
|
14
|
+
@updated = updated.to_i if updated.is_a? String
|
15
|
+
@updated = Time.at(updated) if updated
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
# Redefining the documents api endpoint
|
20
|
+
#
|
21
|
+
def api_all_url
|
22
|
+
"user/documentsv2"
|
23
|
+
end
|
24
|
+
protected :api_all_url
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Operations
|
3
|
+
module All
|
4
|
+
module ClassMethods
|
5
|
+
# Retrieves all available objects from the Signnow API
|
6
|
+
#
|
7
|
+
# @param [Hash] options Options to pass to the API
|
8
|
+
# @return [Array] The available objects
|
9
|
+
def all(attributes = {})
|
10
|
+
response = Signnow.request(:get, nil, api_all_url , attributes, options_for_all(attributes))
|
11
|
+
results_from response
|
12
|
+
end
|
13
|
+
|
14
|
+
# URl for the all endpoint
|
15
|
+
# overwrite this in the model if the api is not well named
|
16
|
+
#
|
17
|
+
def api_all_url
|
18
|
+
"#{self.name.split("::").last.downcase}"
|
19
|
+
end
|
20
|
+
protected :api_all_url
|
21
|
+
|
22
|
+
# Options for all
|
23
|
+
# overwrite this in the model to set security
|
24
|
+
#
|
25
|
+
# @return [Hash]
|
26
|
+
def options_for_all(attributes)
|
27
|
+
access_token = attributes.delete(:access_token)
|
28
|
+
raise AuthenticationError unless access_token
|
29
|
+
{
|
30
|
+
auth_type: :user_token,
|
31
|
+
auth_token: access_token
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def results_from(response)
|
37
|
+
results = []
|
38
|
+
response.each do |obj|
|
39
|
+
results << self.new(obj)
|
40
|
+
end
|
41
|
+
results
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.included(base)
|
46
|
+
base.extend(ClassMethods)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Operations
|
3
|
+
module Create
|
4
|
+
module ClassMethods
|
5
|
+
# Creates a new object
|
6
|
+
#
|
7
|
+
# @param [Hash] attributes The attributes of the created object
|
8
|
+
def create(attributes)
|
9
|
+
response = Signnow.request(:post, nil, api_create_url, attributes, options_for_create)
|
10
|
+
self.new(response)
|
11
|
+
end
|
12
|
+
|
13
|
+
# URl for the create endpoint
|
14
|
+
# overwrite this in the model if the api is not well named
|
15
|
+
#
|
16
|
+
def api_create_url
|
17
|
+
"#{self.name.split("::").last.downcase}"
|
18
|
+
end
|
19
|
+
protected :api_create_url
|
20
|
+
|
21
|
+
# Options for create
|
22
|
+
# overwrite this in the model if the api is not well named
|
23
|
+
#
|
24
|
+
# @return [Hash]
|
25
|
+
def options_for_create
|
26
|
+
{ auth_type: :basic }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(base)
|
31
|
+
base.extend(ClassMethods)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Operations
|
3
|
+
module Delete
|
4
|
+
module ClassMethods
|
5
|
+
# Deletes the given object
|
6
|
+
#
|
7
|
+
# @param [Integer] id The id of the object that gets deleted
|
8
|
+
def delete(attributes={})
|
9
|
+
id = attributes.delete(:id)
|
10
|
+
response = Signnow.request(:delete, nil, api_delete_url(id) , {}, options_for_delete(attributes))
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
# URl for the delete endpoint
|
15
|
+
# overwrite this in the model if the api is not well named
|
16
|
+
#
|
17
|
+
def api_delete_url(id)
|
18
|
+
"#{self.name.split("::").last.downcase}s/#{id}"
|
19
|
+
end
|
20
|
+
protected :api_delete_url
|
21
|
+
|
22
|
+
# Options for delete
|
23
|
+
# overwrite this in the model to set security
|
24
|
+
#
|
25
|
+
# @return [Hash]
|
26
|
+
def options_for_delete(attributes)
|
27
|
+
access_token = attributes.delete(:access_token)
|
28
|
+
raise AuthenticationError unless access_token
|
29
|
+
{
|
30
|
+
auth_type: :user_token,
|
31
|
+
auth_token: access_token
|
32
|
+
}
|
33
|
+
end
|
34
|
+
protected :options_for_delete
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.included(base)
|
38
|
+
base.extend(ClassMethods)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Operations
|
3
|
+
module DownloadLink
|
4
|
+
module ClassMethods
|
5
|
+
# Request a one time download
|
6
|
+
#
|
7
|
+
def download_link(attributes={})
|
8
|
+
response = Signnow.request(:post, nil, api_download_link_url(attributes[:id]), {}, options_for_download_link(attributes))
|
9
|
+
response['link']
|
10
|
+
end
|
11
|
+
|
12
|
+
# URl for the show endpoint
|
13
|
+
# overwrite this in the model if the api is not well named
|
14
|
+
#
|
15
|
+
def api_download_link_url(id=nil)
|
16
|
+
url = "#{self.name.split("::").last.downcase}"
|
17
|
+
url += "/#{id}" if id
|
18
|
+
url += "/download/link"
|
19
|
+
url
|
20
|
+
end
|
21
|
+
protected :api_download_link_url
|
22
|
+
|
23
|
+
# Options for show
|
24
|
+
# overwrite this in the model to set security
|
25
|
+
#
|
26
|
+
# @return [Hash]
|
27
|
+
def options_for_download_link(attributes)
|
28
|
+
raise AuthenticationError unless attributes[:access_token]
|
29
|
+
{
|
30
|
+
auth_type: :user_token,
|
31
|
+
auth_token: attributes[:access_token]
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.included(base)
|
37
|
+
base.extend(ClassMethods)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Operations
|
3
|
+
module Find
|
4
|
+
module ClassMethods
|
5
|
+
# Finds a given object
|
6
|
+
#
|
7
|
+
# @param [Integer] id The id of the object that should be found
|
8
|
+
# @return [Signnow::Base] The found object
|
9
|
+
def find(attibutes)
|
10
|
+
id = attibutes.delete(:id)
|
11
|
+
response = Signnow.request(:get, nil, api_find_url(id), {}, options_for_find(attributes))
|
12
|
+
self.new(response["data"])
|
13
|
+
end
|
14
|
+
|
15
|
+
# URl for the find endpoint
|
16
|
+
# overwrite this in the model if the api is not well named
|
17
|
+
#
|
18
|
+
def api_find_url(id)
|
19
|
+
"#{self.name.split("::").last.downcase}s/#{id}"
|
20
|
+
end
|
21
|
+
protected :api_find_url
|
22
|
+
|
23
|
+
# Options for find
|
24
|
+
# overwrite this in the model to set security
|
25
|
+
#
|
26
|
+
# @return [Hash]
|
27
|
+
def options_for_find(attributes)
|
28
|
+
access_token = attributes.delete(:access_token)
|
29
|
+
raise AuthenticationError unless access_token
|
30
|
+
{
|
31
|
+
auth_type: :user_token,
|
32
|
+
auth_token: access_token
|
33
|
+
}
|
34
|
+
end
|
35
|
+
protected :options_for_find
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.included(base)
|
39
|
+
base.extend(ClassMethods)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Operations
|
3
|
+
module Show
|
4
|
+
module ClassMethods
|
5
|
+
# Shows a given object
|
6
|
+
#
|
7
|
+
# @param [Integer] id The id of the object that should be shown
|
8
|
+
# @return [Signnow::Base] The found object
|
9
|
+
def show(attributes={})
|
10
|
+
response = Signnow.request(:get, nil, api_show_url(attributes[:id]), {}, options_for_show(attributes))
|
11
|
+
self.new(response)
|
12
|
+
end
|
13
|
+
|
14
|
+
# URl for the show endpoint
|
15
|
+
# overwrite this in the model if the api is not well named
|
16
|
+
#
|
17
|
+
def api_show_url(id=nil)
|
18
|
+
url = "#{self.name.split("::").last.downcase}"
|
19
|
+
url += "/#{id}" if id
|
20
|
+
url
|
21
|
+
end
|
22
|
+
protected :api_show_url
|
23
|
+
|
24
|
+
# Options for show
|
25
|
+
# overwrite this in the model to set security
|
26
|
+
#
|
27
|
+
# @return [Hash]
|
28
|
+
def options_for_show(attributes)
|
29
|
+
raise AuthenticationError unless attributes[:access_token]
|
30
|
+
{
|
31
|
+
auth_type: :user_token,
|
32
|
+
auth_token: attributes[:access_token]
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.included(base)
|
38
|
+
base.extend(ClassMethods)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Operations
|
3
|
+
module Update
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
# Updates a object
|
7
|
+
# @param [Integer] id The id of the object that should be updated
|
8
|
+
# @param [Hash] attributes The attributes that should be updated
|
9
|
+
def update_attributes(attributes={})
|
10
|
+
id = attributes.delete(:id)
|
11
|
+
response = Signnow.request(:put, nil, api_update_url(id), attributes, options_for_update(attributes))
|
12
|
+
self.new(response["data"])
|
13
|
+
end
|
14
|
+
|
15
|
+
# URl for the update endpoint
|
16
|
+
# overwrite this in the model if the api is not well named
|
17
|
+
#
|
18
|
+
def api_update_url(id=nil)
|
19
|
+
url = "#{self.name.split("::").last.downcase}"
|
20
|
+
url += "/#{id}" if id
|
21
|
+
url
|
22
|
+
end
|
23
|
+
protected :api_update_url
|
24
|
+
|
25
|
+
# Options for update
|
26
|
+
# overwrite this in the model to set security
|
27
|
+
#
|
28
|
+
# @return [Hash]
|
29
|
+
def options_for_update(attributes)
|
30
|
+
access_token = attributes.delete(:access_token)
|
31
|
+
raise AuthenticationError unless access_token
|
32
|
+
{
|
33
|
+
auth_type: :user_token,
|
34
|
+
auth_token: access_token
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.included(base)
|
40
|
+
base.extend(ClassMethods)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Updates a object
|
44
|
+
#
|
45
|
+
# @param [Hash] attributes The attributes that should be updated
|
46
|
+
def update_attributes(attributes)
|
47
|
+
response = Signnow.request(:put, nil, "#{self.class.name.split("::").last.downcase}/#{id}", attributes)
|
48
|
+
set_attributes(response["data"])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Signnow
|
2
|
+
module Request
|
3
|
+
class Base
|
4
|
+
attr_reader :info
|
5
|
+
attr_accessor :response
|
6
|
+
|
7
|
+
def initialize(info)
|
8
|
+
@info = info
|
9
|
+
end
|
10
|
+
|
11
|
+
def perform
|
12
|
+
raise AuthenticationError if Signnow.encoded_app_credentials.nil?
|
13
|
+
connection.setup_https
|
14
|
+
send_request
|
15
|
+
|
16
|
+
validator.validated_data_for(response)
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def send_request
|
22
|
+
self.response = connection.request
|
23
|
+
end
|
24
|
+
|
25
|
+
def connection
|
26
|
+
@connection ||= Connection.new(info)
|
27
|
+
end
|
28
|
+
|
29
|
+
def validator
|
30
|
+
@validator ||= Validator.new(info)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|