crocodoc 1.0.0
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.
- data/.gitignore +19 -0
- data/Gemfile +2 -0
- data/README.md +195 -0
- data/crocodoc.gemspec +18 -0
- data/example-files/form-w4.pdf +0 -0
- data/examples.rb +363 -0
- data/lib/crocodoc.rb +180 -0
- data/lib/crocodoc/document.rb +75 -0
- data/lib/crocodoc/download.rb +74 -0
- data/lib/crocodoc/session.rb +97 -0
- data/lib/crocodoc_error.rb +16 -0
- metadata +105 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
# crocodoc-ruby
|
2
|
+
|
3
|
+
## Introduction
|
4
|
+
|
5
|
+
crocodoc-ruby is a Ruby wrapper for the Crocodoc API.
|
6
|
+
The Crocodoc API lets you upload documents and then generate secure and customized viewing sessions for them.
|
7
|
+
Our API is based on REST principles and generally returns JSON encoded responses,
|
8
|
+
and in Ruby are converted to hashes unless otherwise noted.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
You can get the library by cloning or downloading the repo.
|
12
|
+
|
13
|
+
To clone:
|
14
|
+
|
15
|
+
git clone git@github.com:crocodoc/crocodoc-ruby.git
|
16
|
+
|
17
|
+
To download:
|
18
|
+
|
19
|
+
wget https://github.com/crocodoc/crocodoc-ruby/zipball/master -O crocodoc-ruby.zip
|
20
|
+
unzip crocodoc-ruby.zip
|
21
|
+
mv crocodoc-crocodoc-ruby-* crocodoc-ruby
|
22
|
+
|
23
|
+
Require the library into any of your Ruby files.
|
24
|
+
|
25
|
+
If you have the gem installed:
|
26
|
+
|
27
|
+
require 'crocodoc'
|
28
|
+
|
29
|
+
If you have the files locally:
|
30
|
+
|
31
|
+
require_relative /path/to/crocodoc-ruby/crocodoc.rb
|
32
|
+
|
33
|
+
Please note that this library also requires that the 'rest-client' gem is installed, and a version of Ruby >= 1.9.
|
34
|
+
|
35
|
+
## Getting Started
|
36
|
+
|
37
|
+
You can see a number of examples on how to use this library in examples.rb.
|
38
|
+
These examples are interactive and you can run this file to see crocodoc-ruby in action.
|
39
|
+
|
40
|
+
To run these examples, open up examples.rb and change this line to show your API token:
|
41
|
+
|
42
|
+
Crocodoc.api_token = 'YOUR_API_TOKEN'
|
43
|
+
|
44
|
+
Save the file, make sure the example-files directory is writeable, and then run examples.rb:
|
45
|
+
|
46
|
+
ruby examples.rb
|
47
|
+
|
48
|
+
You should see 15 examples run with output in your terminal.
|
49
|
+
You can inspect the examples.rb code to see each API call being used.
|
50
|
+
|
51
|
+
To start using crocodoc-ruby in your code, set your API token:
|
52
|
+
|
53
|
+
Crocodoc.api_token = 'YOUR_API_TOKEN'
|
54
|
+
|
55
|
+
And now you can start using the methods in Crocodoc::Document, Crocodoc::Download, and Crocodoc::Session.
|
56
|
+
|
57
|
+
Read on to find out more how to use crocodoc-ruby.
|
58
|
+
You can also find more detailed information about our API here:
|
59
|
+
https://crocodoc.com/docs/api/
|
60
|
+
|
61
|
+
## Using the Crocodoc API Library
|
62
|
+
|
63
|
+
### Errors
|
64
|
+
|
65
|
+
Errors are handled by throwing exceptions.
|
66
|
+
We throw instances of CrocodocError.
|
67
|
+
|
68
|
+
Note that any Crocodoc API call can throw an exception.
|
69
|
+
When making API calls, put them in a begin/rescue block.
|
70
|
+
You can see examples.rb to see working code for each method using begin/rescue blocks.
|
71
|
+
|
72
|
+
### Document
|
73
|
+
|
74
|
+
These methods allow you to upload, check the status of, and delete documents.
|
75
|
+
|
76
|
+
#### Upload
|
77
|
+
|
78
|
+
https://crocodoc.com/docs/api/#doc-upload
|
79
|
+
To upload a document, use Crocodoc::Document.upload().
|
80
|
+
Pass in a url (as a string) or a file resource object.
|
81
|
+
This function returns a UUID of the file.
|
82
|
+
|
83
|
+
// with a url
|
84
|
+
uuid = Crocodoc::Document.upload(url)
|
85
|
+
|
86
|
+
// with a file
|
87
|
+
file_handle = File.open(file_path, 'r')
|
88
|
+
uuid = Crocodoc::Document.upload(file_handle)
|
89
|
+
|
90
|
+
#### Status
|
91
|
+
|
92
|
+
https://crocodoc.com/docs/api/#doc-status
|
93
|
+
To check the status of one or more documents, use Crocodoc::Document.status().
|
94
|
+
Pass in the UUID of the file or an array of UUIDS you want to check the status of.
|
95
|
+
This function returns a hash containing a "status" string" and a "viewable" boolean.
|
96
|
+
If you passed in an array instead of a string, this function returns an array of hashes containing the status for each file.
|
97
|
+
|
98
|
+
// $status contains status['status'] and status['viewable']
|
99
|
+
status = Crocodoc::Document.status(uuid)
|
100
|
+
|
101
|
+
// statuses contains an array of status hashes
|
102
|
+
statuses = Crocodoc::Document.status([uuid, uuid2])
|
103
|
+
|
104
|
+
#### Delete
|
105
|
+
|
106
|
+
https://crocodoc.com/docs/api/#doc-delete
|
107
|
+
To delete a document, use Crocodoc::Document.delete().
|
108
|
+
Pass in the UUID of the file you want to delete.
|
109
|
+
This function returns a boolean of whether the document was successfully deleted or not.
|
110
|
+
|
111
|
+
deleted = Crocodoc::Document.delete(uuid)
|
112
|
+
|
113
|
+
### Download
|
114
|
+
|
115
|
+
These methods allow you to download documents from Crocodoc in different ways.
|
116
|
+
You can download originals, PDFs, extracted text, and thumbnails.
|
117
|
+
|
118
|
+
#### Document
|
119
|
+
|
120
|
+
https://crocodoc.com/docs/api/#dl-doc
|
121
|
+
To download a document, use Crocodoc::Download.document().
|
122
|
+
Pass in the uuid,
|
123
|
+
an optional boolean of whether or not the file should be downloaded as a PDF,
|
124
|
+
an optional boolean of whether or not the file should be annotated,
|
125
|
+
and an optional filter string.
|
126
|
+
This function returns the file contents as a string, which you probably want to save to a file.
|
127
|
+
|
128
|
+
// with no optional arguments
|
129
|
+
file = Crocodoc::Download.document(uuid)
|
130
|
+
file_handle.write(file)
|
131
|
+
|
132
|
+
// with all optional arguments
|
133
|
+
file = Crocodoc::Download.document(uuid, true, true, 'all')
|
134
|
+
file_handle.write(file)
|
135
|
+
|
136
|
+
#### Thumbnail
|
137
|
+
|
138
|
+
https://crocodoc.com/docs/api/#dl-thumb
|
139
|
+
To download a thumbnail, use Crocodoc::Download.thumbnail().
|
140
|
+
Pass in the uuid and optionally the width and height.
|
141
|
+
This function returns the file contents as a string, which you probably want to save to a file.
|
142
|
+
|
143
|
+
// with no optional size arguments
|
144
|
+
thumbnail = Crocodoc::Download.thumbnail(uuid)
|
145
|
+
file_handle.write(thumbnail)
|
146
|
+
|
147
|
+
// with optional size arguments (width 77, height 100)
|
148
|
+
thumbnail = Crocodoc::Download.thumbnail(uuid, 77, 100)
|
149
|
+
file_handle.write(thumbnail)
|
150
|
+
|
151
|
+
#### Text
|
152
|
+
|
153
|
+
https://crocodoc.com/docs/api/#dl-text
|
154
|
+
To download extracted text from a document, use Crocodoc::Download.text().
|
155
|
+
Pass in the uuid.
|
156
|
+
This function returns the extracted text as a string.
|
157
|
+
|
158
|
+
text = Crocodoc::Download.text(uuid)
|
159
|
+
|
160
|
+
### Session
|
161
|
+
|
162
|
+
The session method allows you to create a session for viewing documents in a secure manner.
|
163
|
+
|
164
|
+
#### Create
|
165
|
+
|
166
|
+
https://crocodoc.com/docs/api/#session-create
|
167
|
+
To get a session key, use Crocodoc::Session.create().
|
168
|
+
Pass in the uuid and optionally a params hash.
|
169
|
+
The params hash can contain an "is_editable" boolean,
|
170
|
+
a "user" hash with "id" and "name" fields,
|
171
|
+
a "filter" string, a "sidebar" string,
|
172
|
+
and booleans for "is_admin", "is_downloadable", "is_copyprotected", and "is_demo".
|
173
|
+
This function returns a session key.
|
174
|
+
|
175
|
+
// without optional params
|
176
|
+
session_key = Crocodoc::Session.create(uuid)
|
177
|
+
|
178
|
+
// with optional params
|
179
|
+
session_key = Crocodoc::Session.create(uuid, {
|
180
|
+
'is_editable' => true,
|
181
|
+
'user' => {
|
182
|
+
'id' => 1,
|
183
|
+
'name' => 'John Crocodile'
|
184
|
+
},
|
185
|
+
'filter' => 'all',
|
186
|
+
'is_admin' => true,
|
187
|
+
'is_downloadable' => true,
|
188
|
+
'is_copyprotected' => false,
|
189
|
+
'is_demo' => false,
|
190
|
+
'sidebar' => 'visible'
|
191
|
+
))
|
192
|
+
|
193
|
+
## Support
|
194
|
+
|
195
|
+
Please use github's issue tracker for API library support.
|
data/crocodoc.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
2
|
+
|
3
|
+
spec = Gem::Specification.new do |s|
|
4
|
+
s.name = 'crocodoc'
|
5
|
+
s.version = '1.0.0'
|
6
|
+
s.summary = 'Ruby wrapper for the Crocodoc API'
|
7
|
+
s.description = 'The Crocodoc API lets you upload documents and then generate secure and customized viewing sessions for them. See https://crocodoc.com for details.'
|
8
|
+
s.authors = ['Brandon Goldman']
|
9
|
+
s.email = ['brandon.goldman@gmail.com']
|
10
|
+
s.homepage = 'https://crocodoc.com/docs/api/'
|
11
|
+
s.require_paths = %w{lib}
|
12
|
+
|
13
|
+
s.add_dependency('rest-client', '~> 1.4')
|
14
|
+
s.add_dependency('json', '~> 1.1')
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.require_paths = ['lib']
|
18
|
+
end
|
Binary file
|
data/examples.rb
ADDED
@@ -0,0 +1,363 @@
|
|
1
|
+
# = Examples
|
2
|
+
|
3
|
+
# Require libraries and set API token
|
4
|
+
require 'pathname'
|
5
|
+
require_relative 'lib/crocodoc'
|
6
|
+
Crocodoc.api_token = 'YOUR_API_TOKEN'
|
7
|
+
|
8
|
+
# == Example #1
|
9
|
+
#
|
10
|
+
# Upload a file to Crocodoc. We're uploading Form W4 from the IRS by URL.
|
11
|
+
puts 'Example #1 - Upload Form W4 from the IRS by URL.'
|
12
|
+
form_w4_url = 'http://www.irs.gov/pub/irs-pdf/fw4.pdf'
|
13
|
+
print ' Uploading... '
|
14
|
+
uuid = nil
|
15
|
+
|
16
|
+
begin
|
17
|
+
uuid = Crocodoc::Document.upload(form_w4_url)
|
18
|
+
puts 'success :)'
|
19
|
+
puts ' UUID is ' + uuid
|
20
|
+
rescue CrocodocError => e
|
21
|
+
puts 'failed :('
|
22
|
+
puts ' Error Code: ' + e.code
|
23
|
+
puts ' Error Message: ' + e.message
|
24
|
+
end
|
25
|
+
|
26
|
+
# == Example #2
|
27
|
+
#
|
28
|
+
# Check the status of the file from Example #1.
|
29
|
+
puts ''
|
30
|
+
puts 'Example #2 - Check the status of the file we just uploaded.'
|
31
|
+
print ' Checking status... '
|
32
|
+
|
33
|
+
begin
|
34
|
+
status = Crocodoc::Document.status(uuid)
|
35
|
+
|
36
|
+
unless status.has_key? 'error'
|
37
|
+
puts 'success :)'
|
38
|
+
puts ' File status is ' + status['status'] + '.'
|
39
|
+
puts ' File ' + (status['viewable'] ? 'is' : 'is not') + ' viewable.'
|
40
|
+
else
|
41
|
+
puts 'failed :('
|
42
|
+
puts ' Error Message: ' + status['error']
|
43
|
+
end
|
44
|
+
rescue CrocodocError => e
|
45
|
+
puts 'failed :('
|
46
|
+
puts ' Error Code: ' + e.code
|
47
|
+
puts ' Error Message: ' + e.message
|
48
|
+
end
|
49
|
+
|
50
|
+
# == Example #3
|
51
|
+
#
|
52
|
+
# Upload another file to Crocodoc. We're uploading Form W4 from the IRS as a PDF.
|
53
|
+
puts ''
|
54
|
+
puts 'Example #3 - Upload a sample .pdf as a file.'
|
55
|
+
uuid2 = nil
|
56
|
+
file_path = String(Pathname.new(File.expand_path(__FILE__)).dirname) + '/example-files/form-w4.pdf'
|
57
|
+
|
58
|
+
if File.exists? file_path
|
59
|
+
file_handle = File.open(file_path, 'r+')
|
60
|
+
print ' Uploading... '
|
61
|
+
|
62
|
+
begin
|
63
|
+
uuid2 = Crocodoc::Document.upload(file_handle)
|
64
|
+
puts 'success :)'
|
65
|
+
puts ' UUID is ' + uuid2
|
66
|
+
rescue CrocodocError => e
|
67
|
+
puts 'failed :('
|
68
|
+
puts ' Error Code: ' + e.code
|
69
|
+
puts ' Error Message: ' + e.message
|
70
|
+
end
|
71
|
+
else
|
72
|
+
puts ' Skipping because the sample pdf can\'t be found.'
|
73
|
+
end
|
74
|
+
|
75
|
+
# == Example #4
|
76
|
+
#
|
77
|
+
# Check the status of both files we uploaded in Examples #1 and #3.
|
78
|
+
puts ''
|
79
|
+
puts 'Example #4 - Check the status of both files at the same time.'
|
80
|
+
print ' Checking statuses... '
|
81
|
+
|
82
|
+
begin
|
83
|
+
statuses = Crocodoc::Document.status([uuid, uuid2])
|
84
|
+
|
85
|
+
if statuses
|
86
|
+
puts 'success :)'
|
87
|
+
|
88
|
+
unless statuses[0].has_key? 'error'
|
89
|
+
puts ' File #1 status is ' + statuses[0]['status'] + '.'
|
90
|
+
puts ' File #1 ' + (statuses[0]['viewable'] ? 'is' : 'is not') + ' viewable.'
|
91
|
+
else
|
92
|
+
puts ' File #1 failed :('
|
93
|
+
puts ' Error Message: ' . statuses[0]['error']
|
94
|
+
end
|
95
|
+
|
96
|
+
unless statuses[1].has_key? 'error'
|
97
|
+
puts ' File #2 status is ' + statuses[1]['status'] + '.'
|
98
|
+
puts ' File #2 ' + (statuses[1]['viewable'] ? 'is' : 'is not') + ' viewable.'
|
99
|
+
else
|
100
|
+
puts ' File #2 failed :('
|
101
|
+
puts ' Error Message: ' . statuses[1]['error']
|
102
|
+
end
|
103
|
+
else
|
104
|
+
puts 'failed :('
|
105
|
+
puts ' Statuses were not returned.'
|
106
|
+
end
|
107
|
+
rescue CrocodocError => e
|
108
|
+
puts 'failed :('
|
109
|
+
puts ' Error Code: ' + e.code
|
110
|
+
puts ' Error Message: ' + e.message
|
111
|
+
end
|
112
|
+
|
113
|
+
# == Example #5
|
114
|
+
#
|
115
|
+
# Wait ten seconds and check the status of both files again.
|
116
|
+
puts ''
|
117
|
+
puts 'Example #5 - Wait ten seconds and check the statuses again.'
|
118
|
+
print ' Waiting... '
|
119
|
+
sleep(10)
|
120
|
+
puts 'done.'
|
121
|
+
print ' Checking statuses... '
|
122
|
+
|
123
|
+
begin
|
124
|
+
statuses = Crocodoc::Document.status([uuid, uuid2])
|
125
|
+
|
126
|
+
if statuses
|
127
|
+
puts 'success :)'
|
128
|
+
|
129
|
+
unless statuses[0].has_key? 'error'
|
130
|
+
puts ' File #1 status is ' + statuses[0]['status'] + '.'
|
131
|
+
puts ' File #1 ' + (statuses[0]['viewable'] ? 'is' : 'is not') + ' viewable.'
|
132
|
+
else
|
133
|
+
puts ' File #1 failed :('
|
134
|
+
puts ' Error Message: ' . statuses[0]['error']
|
135
|
+
end
|
136
|
+
|
137
|
+
unless statuses[1].has_key? 'error'
|
138
|
+
puts ' File #2 status is ' + statuses[1]['status'] + '.'
|
139
|
+
puts ' File #2 ' + (statuses[1]['viewable'] ? 'is' : 'is not') + ' viewable.'
|
140
|
+
else
|
141
|
+
puts ' File #2 failed :('
|
142
|
+
puts ' Error Message: ' . statuses[1]['error']
|
143
|
+
end
|
144
|
+
else
|
145
|
+
puts 'failed :('
|
146
|
+
puts ' Statuses were not returned.'
|
147
|
+
end
|
148
|
+
rescue CrocodocError => e
|
149
|
+
puts 'failed :('
|
150
|
+
puts ' Error Code: ' + e.code
|
151
|
+
puts ' Error Message: ' + e.message
|
152
|
+
end
|
153
|
+
|
154
|
+
# == Example #6
|
155
|
+
#
|
156
|
+
# Delete the file we uploaded from Example #1.
|
157
|
+
puts ''
|
158
|
+
puts 'Example #6 - Delete the first file we uploaded.'
|
159
|
+
print ' Deleting... '
|
160
|
+
|
161
|
+
begin
|
162
|
+
deleted = Crocodoc::Document.delete(uuid)
|
163
|
+
|
164
|
+
if deleted
|
165
|
+
puts 'success :)'
|
166
|
+
puts ' File was deleted.'
|
167
|
+
else
|
168
|
+
print 'failed :('
|
169
|
+
end
|
170
|
+
rescue CrocodocError => e
|
171
|
+
puts 'failed :('
|
172
|
+
puts ' Error Code: ' + e.code
|
173
|
+
puts ' Error Message: ' + e.message
|
174
|
+
end
|
175
|
+
|
176
|
+
# == Example #7
|
177
|
+
#
|
178
|
+
# Download the file we uploaded from Example #3 as an original
|
179
|
+
puts ''
|
180
|
+
puts 'Example #7 - Download a file as an original.'
|
181
|
+
print ' Downloading... '
|
182
|
+
|
183
|
+
begin
|
184
|
+
file = Crocodoc::Download.document(uuid2)
|
185
|
+
filename = String(Pathname.new(File.expand_path(__FILE__)).dirname) + '/example-files/test-original.pdf'
|
186
|
+
file_handle = File.open(filename, 'w')
|
187
|
+
file_handle.write(file)
|
188
|
+
puts 'success :)'
|
189
|
+
puts ' File was downloaded to ' + filename + '.'
|
190
|
+
rescue CrocodocError => e
|
191
|
+
puts 'failed :('
|
192
|
+
puts ' Error Code: ' + e.code
|
193
|
+
puts ' Error Message: ' + e.message
|
194
|
+
end
|
195
|
+
|
196
|
+
# == Example #8
|
197
|
+
#
|
198
|
+
# Download the file we uploaded from Example #3 as a PDF
|
199
|
+
puts ''
|
200
|
+
puts 'Example #8 - Download a file as a PDF.'
|
201
|
+
print ' Downloading... '
|
202
|
+
|
203
|
+
begin
|
204
|
+
file = Crocodoc::Download.document(uuid2, true)
|
205
|
+
filename = String(Pathname.new(File.expand_path(__FILE__)).dirname) + '/example-files/test.pdf'
|
206
|
+
file_handle = File.open(filename, 'w')
|
207
|
+
file_handle.write(file)
|
208
|
+
puts 'success :)'
|
209
|
+
puts ' File was downloaded to ' + filename + '.'
|
210
|
+
rescue CrocodocError => e
|
211
|
+
puts 'failed :('
|
212
|
+
puts ' Error Code: ' + e.code
|
213
|
+
puts ' Error Message: ' + e.message
|
214
|
+
end
|
215
|
+
|
216
|
+
# == Example #9
|
217
|
+
#
|
218
|
+
# Download the file we uploaded from Example #3 with all options
|
219
|
+
puts ''
|
220
|
+
puts 'Example #9 - Download a file with all options.'
|
221
|
+
print ' Downloading... '
|
222
|
+
|
223
|
+
begin
|
224
|
+
file = Crocodoc::Download.document(uuid2, true, true, 'all')
|
225
|
+
filename = String(Pathname.new(File.expand_path(__FILE__)).dirname) + '/example-files/test-with-options.pdf'
|
226
|
+
file_handle = File.open(filename, 'w')
|
227
|
+
file_handle.write(file)
|
228
|
+
puts 'success :)'
|
229
|
+
puts ' File was downloaded to ' + filename + '.'
|
230
|
+
rescue CrocodocError => e
|
231
|
+
puts 'failed :('
|
232
|
+
puts ' Error Code: ' + e.code
|
233
|
+
puts ' Error Message: ' + e.message
|
234
|
+
end
|
235
|
+
|
236
|
+
# == Example #10
|
237
|
+
#
|
238
|
+
# Download the file we uploaded from Example #3 as a default thumbnail
|
239
|
+
puts ''
|
240
|
+
puts 'Example #10 - Download a default thumbnail from a file.'
|
241
|
+
print ' Downloading... '
|
242
|
+
|
243
|
+
begin
|
244
|
+
file = Crocodoc::Download.thumbnail(uuid2)
|
245
|
+
filename = String(Pathname.new(File.expand_path(__FILE__)).dirname) + '/example-files/thumbnail.png'
|
246
|
+
file_handle = File.open(filename, 'w')
|
247
|
+
file_handle.write(file)
|
248
|
+
puts 'success :)'
|
249
|
+
puts ' File was downloaded to ' + filename + '.'
|
250
|
+
rescue CrocodocError => e
|
251
|
+
puts 'failed :('
|
252
|
+
puts ' Error Code: ' + e.code
|
253
|
+
puts ' Error Message: ' + e.message
|
254
|
+
end
|
255
|
+
|
256
|
+
# == Example #11
|
257
|
+
#
|
258
|
+
# Download the file we uploaded from Example #3 as a large thumbnail
|
259
|
+
puts ''
|
260
|
+
puts 'Example #11 - Download a large thumbnail from a file.'
|
261
|
+
print ' Downloading... '
|
262
|
+
|
263
|
+
begin
|
264
|
+
file = Crocodoc::Download.thumbnail(uuid2, 250, 250)
|
265
|
+
filename = String(Pathname.new(File.expand_path(__FILE__)).dirname) + '/example-files/thumbnail-large.png'
|
266
|
+
file_handle = File.open(filename, 'w')
|
267
|
+
file_handle.write(file)
|
268
|
+
puts 'success :)'
|
269
|
+
puts ' File was downloaded to ' + filename + '.'
|
270
|
+
rescue CrocodocError => e
|
271
|
+
puts 'failed :('
|
272
|
+
puts ' Error Code: ' + e.code
|
273
|
+
puts ' Error Message: ' + e.message
|
274
|
+
end
|
275
|
+
|
276
|
+
# == Example #12
|
277
|
+
#
|
278
|
+
# Download extracted text from the file we uploaded from Example #3
|
279
|
+
puts ''
|
280
|
+
puts 'Example #12 - Download extracted text from a file.'
|
281
|
+
print ' Downloading... '
|
282
|
+
|
283
|
+
begin
|
284
|
+
file = Crocodoc::Download.text(uuid2)
|
285
|
+
filename = String(Pathname.new(File.expand_path(__FILE__)).dirname) + '/example-files/text.txt'
|
286
|
+
file_handle = File.open(filename, 'w')
|
287
|
+
file_handle.write(file)
|
288
|
+
puts 'success :)'
|
289
|
+
puts ' File was downloaded to ' + filename + '.'
|
290
|
+
rescue CrocodocError => e
|
291
|
+
puts 'failed :('
|
292
|
+
puts ' Error Code: ' + e.code
|
293
|
+
puts ' Error Message: ' + e.message
|
294
|
+
end
|
295
|
+
|
296
|
+
# == Example #13
|
297
|
+
#
|
298
|
+
# Create a session key for the file we uploaded from Example #3 with default
|
299
|
+
# options.
|
300
|
+
puts ''
|
301
|
+
puts 'Example #13 - Create a session key for a file with default options.'
|
302
|
+
print ' Creating... '
|
303
|
+
session_key = nil
|
304
|
+
|
305
|
+
begin
|
306
|
+
session_key = Crocodoc::Session.create(uuid2)
|
307
|
+
puts 'success :)'
|
308
|
+
puts ' The session key is ' + session_key + '.'
|
309
|
+
rescue CrocodocError => e
|
310
|
+
puts 'failed :('
|
311
|
+
puts ' Error Code: ' + e.code
|
312
|
+
puts ' Error Message: ' + e.message
|
313
|
+
end
|
314
|
+
|
315
|
+
# == Example #14
|
316
|
+
#
|
317
|
+
# Create a session key for the file we uploaded from Example #3 all of the
|
318
|
+
# options.
|
319
|
+
puts ''
|
320
|
+
puts 'Example #14 - Create a session key for a file with all of the options.'
|
321
|
+
print ' Creating...'
|
322
|
+
session_key = nil
|
323
|
+
|
324
|
+
begin
|
325
|
+
user = {'id' => 1,
|
326
|
+
'name' => 'John Crocodoc'}
|
327
|
+
session_key = Crocodoc::Session.create(uuid2, {'isEditable' => true,
|
328
|
+
'user' => user,
|
329
|
+
'filter' => 'all',
|
330
|
+
'is_admin' => true,
|
331
|
+
'is_downloadable' => true,
|
332
|
+
'is_copyprotected' => false,
|
333
|
+
'is_demo' => false,
|
334
|
+
'sidebar' => 'visible'})
|
335
|
+
puts 'success :)'
|
336
|
+
puts ' The session key is ' + session_key + '.'
|
337
|
+
rescue CrocodocError => e
|
338
|
+
puts 'failed :('
|
339
|
+
puts ' Error Code: ' + e.code
|
340
|
+
puts ' Error Message: ' + e.message
|
341
|
+
end
|
342
|
+
|
343
|
+
# == Example #15
|
344
|
+
#
|
345
|
+
# Delete the file we uploaded from Example #2.
|
346
|
+
puts ''
|
347
|
+
puts 'Example #15 - Delete the second file we uploaded.'
|
348
|
+
print ' Deleting... '
|
349
|
+
|
350
|
+
begin
|
351
|
+
deleted = Crocodoc::Document.delete(uuid2)
|
352
|
+
|
353
|
+
if deleted
|
354
|
+
puts 'success :)'
|
355
|
+
puts ' File was deleted.'
|
356
|
+
else
|
357
|
+
print 'failed :('
|
358
|
+
end
|
359
|
+
rescue CrocodocError => e
|
360
|
+
puts 'failed :('
|
361
|
+
puts ' Error Code: ' + e.code
|
362
|
+
puts ' Error Message: ' + e.message
|
363
|
+
end
|
data/lib/crocodoc.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
# require core functionality
|
2
|
+
require 'json'
|
3
|
+
require 'rest-client'
|
4
|
+
|
5
|
+
# require our exception class
|
6
|
+
require_relative 'crocodoc_error'
|
7
|
+
|
8
|
+
# require the different crocodoc clients
|
9
|
+
require_relative 'crocodoc/document'
|
10
|
+
require_relative 'crocodoc/download'
|
11
|
+
require_relative 'crocodoc/session'
|
12
|
+
|
13
|
+
module Crocodoc
|
14
|
+
# The developer's Crocodoc API token
|
15
|
+
@@api_token = nil
|
16
|
+
|
17
|
+
# The default protocol (Crocodoc uses HTTPS)
|
18
|
+
@@protocol = 'https'
|
19
|
+
|
20
|
+
# The default host
|
21
|
+
@@host = 'crocodoc.com'
|
22
|
+
|
23
|
+
# The default base path on the server where the API lives
|
24
|
+
@@base_path = '/api/v2'
|
25
|
+
|
26
|
+
# Set the API token
|
27
|
+
def self.api_token=(api_token)
|
28
|
+
@@api_token = api_token
|
29
|
+
end
|
30
|
+
|
31
|
+
# Get the API token
|
32
|
+
def self.api_token
|
33
|
+
@@api_token
|
34
|
+
end
|
35
|
+
|
36
|
+
# Set the protocol
|
37
|
+
def self.protocol=(protocol)
|
38
|
+
@@protocol = protocol
|
39
|
+
end
|
40
|
+
|
41
|
+
# Get the protocol
|
42
|
+
def self.protocol
|
43
|
+
@@protocol
|
44
|
+
end
|
45
|
+
|
46
|
+
# Set the host
|
47
|
+
def self.host=(host)
|
48
|
+
@@host = host
|
49
|
+
end
|
50
|
+
|
51
|
+
# Get the host
|
52
|
+
def self.host
|
53
|
+
@@host
|
54
|
+
end
|
55
|
+
|
56
|
+
# Set the base path
|
57
|
+
def self.base_path=(base_path)
|
58
|
+
@@base_path = base_path
|
59
|
+
end
|
60
|
+
|
61
|
+
# Get the base path
|
62
|
+
def self.base_path
|
63
|
+
@@base_path
|
64
|
+
end
|
65
|
+
|
66
|
+
# Handle an error. We handle errors by throwing an exception.
|
67
|
+
#
|
68
|
+
# @param [String] error An error code representing the error
|
69
|
+
# (use_underscore_separators)
|
70
|
+
# @param [String] client Which API client the error is being called from
|
71
|
+
# @param [String] method Which method the error is being called from
|
72
|
+
# @param [Hash<String,>, String] response This is a hash of the response,
|
73
|
+
# usually from JSON, but can also be a string
|
74
|
+
#
|
75
|
+
# @raise [CrocodocError]
|
76
|
+
def self._error(error, client, method, response)
|
77
|
+
message = self.name + ': [' + error + '] ' + client + '.' + String(method) + "\r\n\r\n"
|
78
|
+
response = JSON.generate(response) if response.is_a? Hash
|
79
|
+
message += response
|
80
|
+
raise CrocodocError.new(message, error)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Make an HTTP request. Some of the params are polymorphic - get_params and
|
84
|
+
# post_params.
|
85
|
+
#
|
86
|
+
# @param [String] path The path on the server to make the request to
|
87
|
+
# relative to the base path
|
88
|
+
# @param [String] method This is just an addition to the path, for example,
|
89
|
+
# in "/documents/upload" the method would be "upload"
|
90
|
+
# @param [Hash<String, String>] get_params A hash of GET params to be added
|
91
|
+
# to the URL
|
92
|
+
# @param [Hash<String, String>] post_params A hash of GET params to be added
|
93
|
+
# to the URL
|
94
|
+
# @param [Boolean] is_json Should the file be converted from JSON? Defaults to
|
95
|
+
# true.
|
96
|
+
#
|
97
|
+
# @return [Hash<String,>, String] The response hash is usually converted from
|
98
|
+
# JSON, but sometimes we just return the raw response from the server
|
99
|
+
# @raise [CrocodocError]
|
100
|
+
def self._request(path, method, get_params, post_params, is_json=true)
|
101
|
+
url = @@protocol + '://' + @@host + @@base_path + path + method
|
102
|
+
|
103
|
+
# add the API token to get_params
|
104
|
+
get_params = {} unless get_params
|
105
|
+
get_params['token'] = @@api_token
|
106
|
+
|
107
|
+
# add the API token to post_params
|
108
|
+
if post_params and post_params.length > 0
|
109
|
+
# add the API token to post_params
|
110
|
+
post_params['token'] = @@api_token
|
111
|
+
end
|
112
|
+
|
113
|
+
result = nil
|
114
|
+
http_code = nil
|
115
|
+
|
116
|
+
if post_params && post_params.length > 0
|
117
|
+
response = RestClient.post(url, post_params, params: get_params){|response, request, result| result }
|
118
|
+
result = RestClient::Request.decode(response['content-encoding'], response.body)
|
119
|
+
http_code = Integer(response.code)
|
120
|
+
else
|
121
|
+
response = RestClient.get(url, params: get_params){|response, request, result| result }
|
122
|
+
result = RestClient::Request.decode(response['content-encoding'], response.body)
|
123
|
+
http_code = Integer(response.code)
|
124
|
+
end
|
125
|
+
|
126
|
+
if is_json
|
127
|
+
json_decoded = false
|
128
|
+
|
129
|
+
if result == 'true'
|
130
|
+
json_decoded = true
|
131
|
+
elsif result == 'false'
|
132
|
+
json_decoded = false
|
133
|
+
else
|
134
|
+
json_decoded = JSON.parse(result)
|
135
|
+
end
|
136
|
+
|
137
|
+
if json_decoded == false
|
138
|
+
return self._error('server_response_not_valid_json', self.name, __method__, {
|
139
|
+
response => result,
|
140
|
+
get_params => get_params,
|
141
|
+
post_params => post_params
|
142
|
+
})
|
143
|
+
end
|
144
|
+
|
145
|
+
if json_decoded.is_a? Hash and json_decoded.has_key? 'error'
|
146
|
+
return self._error(json_decoded['error'], self.name, __method__, {
|
147
|
+
get_params => get_params,
|
148
|
+
post_params => post_params
|
149
|
+
})
|
150
|
+
end
|
151
|
+
|
152
|
+
result = json_decoded
|
153
|
+
end
|
154
|
+
|
155
|
+
http_4xx_error_codes = {'400' => 'bad_request',
|
156
|
+
'401' => 'unauthorized',
|
157
|
+
'404' => 'not_found',
|
158
|
+
'405' => 'method_not_allowed'}
|
159
|
+
|
160
|
+
if http_4xx_error_codes.has_key? http_code
|
161
|
+
error = 'server_error_' + http_code + '_' + http_4xx_error_codes[http_code]
|
162
|
+
return self._error(error, self.name, __method__, {
|
163
|
+
url => url,
|
164
|
+
get_params => get_params,
|
165
|
+
postParams => post_params
|
166
|
+
})
|
167
|
+
end
|
168
|
+
|
169
|
+
if http_code >= 500 and http_code < 600
|
170
|
+
error = 'server_error_' + http_code + '_unknown'
|
171
|
+
return self._error(error, self.name, __method__, {
|
172
|
+
url => url,
|
173
|
+
get_params => get_params,
|
174
|
+
post_params => post_params
|
175
|
+
})
|
176
|
+
end
|
177
|
+
|
178
|
+
result
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Crocodoc
|
2
|
+
# Provides access to the Crocodoc Document API. The Document API is used for
|
3
|
+
# uploading, checking status, and deleting documents.
|
4
|
+
class Document
|
5
|
+
# The Document API path relative to the base API path
|
6
|
+
@@path = '/document/'
|
7
|
+
|
8
|
+
# Set the path
|
9
|
+
def self.path=(path)
|
10
|
+
@@path = path
|
11
|
+
end
|
12
|
+
|
13
|
+
# Get the path
|
14
|
+
def self.path
|
15
|
+
@@path
|
16
|
+
end
|
17
|
+
|
18
|
+
# Delete a file on Crocodoc by UUID.
|
19
|
+
#
|
20
|
+
# @param [String] uuid The uuid of the file to delete
|
21
|
+
#
|
22
|
+
# @return [Boolean] Was the file deleted?
|
23
|
+
# @raise [CrocodocError]
|
24
|
+
def self.delete(uuid)
|
25
|
+
post_params = {'uuid' => uuid}
|
26
|
+
Crocodoc._request(self.path, 'delete', nil, post_params)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Check the status of a file on Crocodoc by UUID. This method is
|
30
|
+
# polymorphic and can take an array of UUIDs and return an array of status
|
31
|
+
# hashes about those UUIDs, or can also take a one UUID string and return
|
32
|
+
# one status hash for that UUID.
|
33
|
+
#
|
34
|
+
# @param [Array<String>, String] uuids An array of the uuids of the file to
|
35
|
+
# check the status of - this can also be a single uuid string
|
36
|
+
#
|
37
|
+
# @return [Array<Hash<String,>>, Hash<String,>] An array of hashes (or just
|
38
|
+
# an hash if you passed in a string) of the uuid, status, and viewable
|
39
|
+
# bool, or an array of the uuid and an error
|
40
|
+
# @raise [CrocodocError]
|
41
|
+
def self.status(uuids)
|
42
|
+
is_single_uuid = uuids.is_a? String
|
43
|
+
uuids = [uuids] if is_single_uuid
|
44
|
+
get_params = {'uuids' => uuids.join(',')}
|
45
|
+
response = Crocodoc._request(self.path, 'status', get_params, nil)
|
46
|
+
is_single_uuid ? response[0] : response
|
47
|
+
end
|
48
|
+
|
49
|
+
# Upload a file to Crocodoc with a URL.
|
50
|
+
#
|
51
|
+
# @param url_or_file [String, File] The url of the file to upload or a file resource
|
52
|
+
#
|
53
|
+
# @return [String] The uuid of the newly-uploaded file
|
54
|
+
# @raise [CrocodocError]
|
55
|
+
def self.upload(url_or_file)
|
56
|
+
post_params = {}
|
57
|
+
|
58
|
+
if url_or_file.is_a? String
|
59
|
+
post_params['url'] = url_or_file
|
60
|
+
elsif url_or_file.is_a? File
|
61
|
+
post_params['file'] = url_or_file
|
62
|
+
else
|
63
|
+
return Crocodoc::_error('invalid_url_or_file_param', self.name, __method__, nil)
|
64
|
+
end
|
65
|
+
|
66
|
+
response = Crocodoc::_request(self.path, 'upload', nil, post_params)
|
67
|
+
|
68
|
+
unless response.has_key? 'uuid'
|
69
|
+
return Crocodoc::_error('missing_uuid', self.name, __method__, response)
|
70
|
+
end
|
71
|
+
|
72
|
+
response['uuid']
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Crocodoc
|
2
|
+
# Provides access to the Crocodoc Download API. The Download API is used for
|
3
|
+
# downloading an original of a document, a PDF of a document, a thumbnail of a
|
4
|
+
# document, and text extracted from a document.
|
5
|
+
class Download
|
6
|
+
# The Download API path relative to the base API path
|
7
|
+
@@path = '/download/'
|
8
|
+
|
9
|
+
# Set the path
|
10
|
+
def self.path=(path)
|
11
|
+
@@path = path
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get the path
|
15
|
+
def self.path
|
16
|
+
@@path
|
17
|
+
end
|
18
|
+
|
19
|
+
# Download a document's original file from Crocodoc. The file can
|
20
|
+
# optionally be downloaded as a PDF, as another filename, with
|
21
|
+
# annotations, and with filtered annotations.
|
22
|
+
#
|
23
|
+
# @param [String] uuid The uuid of the file to download
|
24
|
+
# @param [Boolean] is_pdf Should the file be downloaded as a PDF?
|
25
|
+
# @param [Boolean] is_annotated Should the file be downloaded with annotations?
|
26
|
+
# @param [String, Array<String>] filter Which annotations should be
|
27
|
+
# included if any - this is usually a string, but could also be an array
|
28
|
+
# if it's a comma-separated list of user IDs as the filter
|
29
|
+
#
|
30
|
+
# @return [String] The downloaded file contents as a string
|
31
|
+
# @raise CrocodocError
|
32
|
+
def self.document(uuid, is_pdf=false, is_annotated=false, filter=nil)
|
33
|
+
get_params = {'uuid' => uuid}
|
34
|
+
get_params['pdf'] = 'true' if is_pdf
|
35
|
+
get_params['annotated'] = 'true' if is_annotated
|
36
|
+
|
37
|
+
if filter
|
38
|
+
filter = filter.join(',') if filter.is_a? Array
|
39
|
+
get_params['filter'] = filter
|
40
|
+
end
|
41
|
+
|
42
|
+
Crocodoc._request(self.path, 'document', get_params, nil, false)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Download a document's extracted text from Crocodoc.
|
46
|
+
#
|
47
|
+
# @param [String] uuid The uuid of the file to extract text from
|
48
|
+
#
|
49
|
+
# @return [String] The file's extracted text
|
50
|
+
# @raise CrocodocError
|
51
|
+
def self.text(uuid)
|
52
|
+
get_params = {'uuid' => uuid}
|
53
|
+
Crocodoc._request(self.path, 'text', get_params, nil, false)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Download a document's thumbnail from Crocodoc with an optional size.
|
57
|
+
#
|
58
|
+
# @param [String] uuid The uuid of the file to download the thumbnail from
|
59
|
+
# @param [Integer] width The width you want the thumbnail to be
|
60
|
+
# @param [Integer] height The height you want the thumbnail to be
|
61
|
+
#
|
62
|
+
# @return [String] The downloaded thumbnail contents
|
63
|
+
# @raise CrocodocError
|
64
|
+
def self.thumbnail(uuid, width=nil, height=nil)
|
65
|
+
get_params = {'uuid' => uuid}
|
66
|
+
|
67
|
+
if width != nil and height != nil
|
68
|
+
get_params['size'] = String(width) + 'x' + String(height)
|
69
|
+
end
|
70
|
+
|
71
|
+
Crocodoc._request(self.path, 'thumbnail', get_params, nil, false)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Crocodoc
|
2
|
+
# Provides access to the Crocodoc Session API. The Session API is used to
|
3
|
+
# to create sessions for specific documents that can be used to view a
|
4
|
+
# document using a specific session-based URL.
|
5
|
+
class Session
|
6
|
+
# The Session API path relative to the base API path
|
7
|
+
@@path = '/session/'
|
8
|
+
|
9
|
+
# Set the path
|
10
|
+
def self.path=(path)
|
11
|
+
@@path = path
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get the path
|
15
|
+
def self.path
|
16
|
+
@@path
|
17
|
+
end
|
18
|
+
|
19
|
+
# Create a session for a specific document by UUID that is optionally
|
20
|
+
# editable and can use user ID and name info from your application,
|
21
|
+
# can filter annotations, can grant admin permissions, can be
|
22
|
+
# downloadable, can be copy-protected, and can prevent changes from being
|
23
|
+
# persisted.
|
24
|
+
#
|
25
|
+
# @param [String] uuid The uuid of the file to create a session for
|
26
|
+
# @param [Hash<String,>] params A hash representing:
|
27
|
+
# [Boolean] 'is_editable' Can users create annotations and comments while
|
28
|
+
# viewing the document with this session key?
|
29
|
+
# [Hash<String, String>] 'user' A hash with keys "id" and "name"
|
30
|
+
# representing a user's unique ID and name in your application; "id"
|
31
|
+
# must be a non-negative signed 32-bit integer; this field is required
|
32
|
+
# if is_editable is true
|
33
|
+
# [String, Array<String>] 'filter' Which annotations should be included
|
34
|
+
# if any - this is usually a string, but could also be an array if it's
|
35
|
+
# a comma-separated list of user IDs as the filter
|
36
|
+
# [Boolean] 'is_admin' Can users modify or delete any annotations or comments
|
37
|
+
# belonging to other users?
|
38
|
+
# [Boolean] 'is_downloadable' Can users download the original document?
|
39
|
+
# [Boolean] 'is_copyprotected' Can text be selected in the document?
|
40
|
+
# [Boolean] 'is_demo' Should we prevent any changes from being persisted?
|
41
|
+
# [String] 'sidebar' Sets if and how the viewer sidebar is included
|
42
|
+
#
|
43
|
+
# @return [String] A unique session key for the document
|
44
|
+
# @raise [CrocodocError]
|
45
|
+
def self.create(uuid, params = {})
|
46
|
+
post_params = {'uuid' => uuid}
|
47
|
+
|
48
|
+
if params.has_key? 'is_editable'
|
49
|
+
post_params['editable'] = params['is_editable'] ? 'true' : 'false'
|
50
|
+
end
|
51
|
+
|
52
|
+
if (
|
53
|
+
params.has_key? 'user' \
|
54
|
+
and params['user'] \
|
55
|
+
and params['user'].is_a? Hash \
|
56
|
+
and params['user'].has_key? 'id' \
|
57
|
+
and params['user'].has_key? 'name' \
|
58
|
+
)
|
59
|
+
post_params['user'] = String(params['user']['id']) + ',' + params['user']['name']
|
60
|
+
end
|
61
|
+
|
62
|
+
if params.has_key? 'filter'
|
63
|
+
if params['filter'].is_a? Array
|
64
|
+
params['filter'] = params['filter'].join(',')
|
65
|
+
end
|
66
|
+
|
67
|
+
post_params['filter'] = params['filter']
|
68
|
+
end
|
69
|
+
|
70
|
+
if params.has_key? 'is_admin'
|
71
|
+
post_params['admin'] = params['is_admin'] ? 'true' : 'false'
|
72
|
+
end
|
73
|
+
|
74
|
+
if params.has_key? 'is_downloadable'
|
75
|
+
post_params['downloadable'] = params['is_downloadable'] ? 'true' : 'false'
|
76
|
+
end
|
77
|
+
|
78
|
+
if params.has_key? 'is_copyprotected'
|
79
|
+
post_params['copyprotected'] = params['is_copyprotected'] ? 'true' : 'false'
|
80
|
+
end
|
81
|
+
|
82
|
+
if params.has_key? 'is_demo'
|
83
|
+
post_params['demo'] = params['is_demo'] ? 'true' : 'false'
|
84
|
+
end
|
85
|
+
|
86
|
+
post_params['sidebar'] = params['sidebar'] if params.has_key? 'sidebar'
|
87
|
+
|
88
|
+
session = Crocodoc._request(self.path, 'create', nil, post_params)
|
89
|
+
|
90
|
+
unless session.is_a? Hash and session.has_key? 'session'
|
91
|
+
return Crocodoc._error('missing_session_key', self.name, __method__, session)
|
92
|
+
end
|
93
|
+
|
94
|
+
session['session']
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# CrocodocError extends the default exception class.
|
2
|
+
# It adds a code field.
|
3
|
+
class CrocodocError < Exception
|
4
|
+
# An error code string
|
5
|
+
@code = nil
|
6
|
+
|
7
|
+
# Get the error code
|
8
|
+
def code
|
9
|
+
@code
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(message, code)
|
13
|
+
@message = message
|
14
|
+
@code = code
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: crocodoc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Brandon Goldman
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-10-19 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rest-client
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 7
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 4
|
32
|
+
version: "1.4"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: json
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 13
|
44
|
+
segments:
|
45
|
+
- 1
|
46
|
+
- 1
|
47
|
+
version: "1.1"
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
description: The Crocodoc API lets you upload documents and then generate secure and customized viewing sessions for them. See https://crocodoc.com for details.
|
51
|
+
email:
|
52
|
+
- brandon.goldman@gmail.com
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files: []
|
58
|
+
|
59
|
+
files:
|
60
|
+
- .gitignore
|
61
|
+
- Gemfile
|
62
|
+
- README.md
|
63
|
+
- crocodoc.gemspec
|
64
|
+
- example-files/form-w4.pdf
|
65
|
+
- examples.rb
|
66
|
+
- lib/crocodoc.rb
|
67
|
+
- lib/crocodoc/document.rb
|
68
|
+
- lib/crocodoc/download.rb
|
69
|
+
- lib/crocodoc/session.rb
|
70
|
+
- lib/crocodoc_error.rb
|
71
|
+
homepage: https://crocodoc.com/docs/api/
|
72
|
+
licenses: []
|
73
|
+
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 3
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
requirements: []
|
98
|
+
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 1.7.2
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: Ruby wrapper for the Crocodoc API
|
104
|
+
test_files: []
|
105
|
+
|