panda_api 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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/panda_api.rb +222 -0
  3. metadata +211 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7a2a7d41dc98c786e2367da1756d29c1e3412f27c252752c276e4778e5170fd7
4
+ data.tar.gz: f6d2eb153fd8a4d8cc4619251824f5e019475ed10e750b39078c817d2a7ae356
5
+ SHA512:
6
+ metadata.gz: e78a4d52385cc515f51b104a2b75fbe875f01984a7825c81c3437ce8b7c962b1761ffb286fa5e58fe223eef0a25fb720c0667f2566939041ceca884c0d959f6d
7
+ data.tar.gz: e0f7ba0b8bfaa8a181c27344df8ffcb01f5f002c0a8271a1aba4b359ea418888212f00a9c4d0bb3e06d076a348366038bbd95b606a4a5f33b29e2c8576701062
@@ -0,0 +1,222 @@
1
+ require 'httparty'
2
+ require 'faraday_middleware'
3
+ require 'launchy'
4
+ require 'uri'
5
+ require 'pry'
6
+
7
+ class PandaDoc
8
+ include HTTParty
9
+
10
+ attr_accessor :key, :key_type
11
+
12
+ def initialize(params)
13
+ @key = params[:key]
14
+ @key_type = params[:key_type]
15
+ end
16
+
17
+ # generic headers EXCEPT create doc from PDF
18
+ def headers
19
+ if @key_type == "bearer"
20
+ {
21
+ 'Authorization': "Bearer #{@key}",
22
+ "Content-Type": "application/json"
23
+ }
24
+ else
25
+ {
26
+ 'Authorization': "API-Key #{@key}",
27
+ "Content-Type": "application/json"
28
+ }
29
+ end
30
+ end
31
+
32
+ # key to make request is present
33
+ def raise_if_non_authed
34
+ raise 'No access key to make request' unless !@key.nil?
35
+ end
36
+
37
+ # show calls have corresponding ID
38
+ def raise_if_no_id(params)
39
+ raise 'No ID to make request' unless !params[:id].nil?
40
+ end
41
+
42
+ def document_status(params = nil)
43
+ raise_if_non_authed
44
+ raise_if_no_id(params)
45
+
46
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}", headers: headers).parsed_response
47
+ end
48
+
49
+ def document_details(params = nil)
50
+ raise_if_non_authed
51
+ raise_if_no_id(params)
52
+
53
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/details", headers: headers).parsed_response
54
+ end
55
+
56
+ def list_documents(params = nil)
57
+ raise_if_non_authed
58
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
59
+ self.class.get("https://api.pandadoc.com/public/v1/documents?#{sanitized_params}", headers: headers).parsed_response
60
+ end
61
+
62
+ def download_document(params = nil)
63
+ raise_if_non_authed
64
+ raise_if_no_id(params)
65
+
66
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
67
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/download?#{sanitized_params}", headers: headers).parsed_response
68
+ end
69
+
70
+ def download_protected_document(params = nil)
71
+ raise_if_non_authed
72
+ raise_if_no_id(params)
73
+
74
+ self.class.get("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/download-protected", headers: headers).parsed_response
75
+ end
76
+
77
+ def list_templates(params = nil)
78
+ raise_if_non_authed
79
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
80
+ self.class.get("https://api.pandadoc.com/public/v1/templates?#{sanitized_params}", headers: headers).parsed_response
81
+ end
82
+
83
+ def template_details(params = nil)
84
+ raise_if_non_authed
85
+ raise_if_no_id(params)
86
+
87
+ self.class.get("https://api.pandadoc.com/public/v1/templates/#{params[:id]}/details", headers: headers).parsed_response
88
+ end
89
+
90
+ def list_document_folders(params = nil)
91
+ raise_if_non_authed
92
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
93
+ self.class.get("https://api.pandadoc.com/public/v1/documents/folders?#{sanitized_params}", headers: headers).parsed_response
94
+ end
95
+
96
+ def list_template_folders(params = nil)
97
+ raise_if_non_authed
98
+ sanitized_params = params.nil? ? params : URI.encode_www_form(params)
99
+ self.class.get("https://api.pandadoc.com/public/v1/templates/folders?#{sanitized_params}", headers: headers).parsed_response
100
+ end
101
+
102
+ # POST
103
+
104
+ def create_document_from_pdf(params = nil)
105
+ raise_if_non_authed
106
+ # URI for Request
107
+ url = URI.parse('https://api.pandadoc.com/public/v1/documents/')
108
+ # Payload will have a file along with other form-data
109
+ json =
110
+ {
111
+ "name": params[:name],
112
+ "recipients": params[:recipients],
113
+ "fields": params[:fields],
114
+ "metadata": params[:metadata],
115
+ "parse_form_fields": params[:parse_form_fields]
116
+ }
117
+
118
+ payload = {
119
+ data: JSON.dump(json),
120
+ file: Faraday::UploadIO.new(params[:file], "application/pdf")
121
+ }
122
+ # making request connection
123
+ connection = Faraday.new(url) do |conn|
124
+ conn.authorization "API-Key", @key
125
+
126
+ # request is multipart
127
+ conn.request :multipart
128
+ # url_encoded request
129
+ conn.request :url_encoded
130
+
131
+ # expects json
132
+ conn.response :json, content_type: /\bjson$/
133
+ conn.adapter Faraday.default_adapter
134
+ end
135
+ # make request
136
+ connection.post(url, payload).body
137
+ end
138
+
139
+ def create_document_from_template(params = nil)
140
+ raise_if_non_authed
141
+
142
+ self.class.post('https://api.pandadoc.com/public/v1/documents/', body: JSON.dump(params), headers: headers).parsed_response
143
+ end
144
+
145
+ def send_document(params = nil)
146
+ raise_if_non_authed
147
+
148
+ self.class.post("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/send", body: JSON.dump(params), headers: headers).parsed_response
149
+ end
150
+
151
+ def create_document_link(params = nil)
152
+ raise_if_non_authed
153
+
154
+ self.class.post("https://api.pandadoc.com/public/v1/documents/#{params[:id]}/session", body: JSON.dump(params), headers: headers).parsed_response
155
+ end
156
+
157
+ def create_document_folder(params = nil)
158
+ raise_if_non_authed
159
+ self.class.post('https://api.pandadoc.com/public/v1/documents/folders', headers: headers, body: JSON.dump(params)).parsed_response
160
+ end
161
+
162
+ def create_template_folder(params = nil)
163
+ raise_if_non_authed
164
+ self.class.post('https://api.pandadoc.com/public/v1/templates/folders', headers: headers, body: JSON.dump(params)).parsed_response
165
+ end
166
+
167
+ def get_code(params = nil)
168
+ first = "https://app.pandadoc.com/oauth2/authorize?client_id=#{params[:client_id]}&redirect_uri=#{params[:redirect_uri]}&scope=read+write&response_type=code"
169
+ Launchy.open(first)
170
+ puts "enter the code located on your redirect URI browser instance: "
171
+ code = STDIN.gets
172
+ params[:code] = code
173
+ self.get_oauth_access_token(params)
174
+ end
175
+
176
+ def refresh_access_token(params = nil)
177
+ raise_if_non_authed
178
+ # required => client, client_secret, redirect
179
+ parsed_params = {
180
+ "grant_type": "refresh_token",
181
+ "client_id": @client_id || params[:client_id],
182
+ "client_secret": @client_secret || params[:client_secret],
183
+ "refresh_token": @key,
184
+ "scope": 'read+write'
185
+ }
186
+
187
+ missing_keys = parsed_params.keys.select { |p| parsed_params[p.to_sym].nil? }
188
+
189
+ raise "Please Provide #{missing_keys.join(', ')} to make request" if missing_keys.length > 0
190
+ res = self.class.post("https://api.pandadoc.com/oauth2/access_token", body: URI.encode_www_form(parsed_params), headers: {"Accept": "application/json"}).parsed_response
191
+
192
+ @key = res["access_token"]
193
+ @key_type = "bearer"
194
+
195
+ res
196
+ end
197
+
198
+ protected
199
+
200
+ def get_oauth_access_token(params = nil)
201
+ # required => client, client_secret, redirect
202
+ parsed_params = {
203
+ "grant_type": "authorization_code",
204
+ "client_id": @client_id || params[:client_id],
205
+ "client_secret": @client_secret || params[:client_secret],
206
+ "code": params[:code],
207
+ "scope": 'read+write',
208
+ "redirect_uri": @redirect_uri || params[:redirect_uri]
209
+ }
210
+
211
+ missing_keys = parsed_params.keys.select { |p| parsed_params[p.to_sym].nil? }
212
+
213
+ raise "Please Provide #{missing_keys.join(', ')} to make request" if missing_keys.length > 0
214
+
215
+ res = self.class.post("https://api.pandadoc.com/oauth2/access_token", body: URI.encode_www_form(parsed_params), headers: {"Accept": "application/json"}).parsed_response
216
+
217
+ @key = res["access_token"]
218
+ @key_type = "bearer"
219
+
220
+ res
221
+ end
222
+ end
metadata ADDED
@@ -0,0 +1,211 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: panda_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Matt Deatherage
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-09-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday_middleware
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httparty
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: launchy
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: launchy
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activesupport
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activesupport
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: uri
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: uri
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: fillable-pdf
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: Wrapper for PandaDoc API
182
+ email: matt.deatherage@pandadoc.com
183
+ executables: []
184
+ extensions: []
185
+ extra_rdoc_files: []
186
+ files:
187
+ - lib/panda_api.rb
188
+ homepage: https://rubygems.org/gems/panda_api
189
+ licenses:
190
+ - MIT
191
+ metadata: {}
192
+ post_install_message:
193
+ rdoc_options: []
194
+ require_paths:
195
+ - lib
196
+ required_ruby_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ required_rubygems_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ requirements: []
207
+ rubygems_version: 3.0.6
208
+ signing_key:
209
+ specification_version: 4
210
+ summary: PandaDoc API
211
+ test_files: []