saaspose 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +44 -0
- data/README.md +79 -0
- data/lib/saaspose.rb +8 -0
- data/lib/saaspose/cells.rb +10 -0
- data/lib/saaspose/configuration.rb +39 -0
- data/lib/saaspose/pdf.rb +21 -0
- data/lib/saaspose/slides.rb +12 -0
- data/lib/saaspose/storage.rb +29 -0
- data/lib/saaspose/utils.rb +62 -0
- data/lib/saaspose/version.rb +3 -0
- data/lib/saaspose/words.rb +12 -0
- data/saaspose.gemspec +25 -0
- data/spec/fixtures/saaspose_test.doc +0 -0
- data/spec/fixtures/saaspose_test.pdf +0 -0
- data/spec/fixtures/saaspose_test.ppt +0 -0
- data/spec/fixtures/saaspose_test.xls +0 -0
- data/spec/lib/saaspose_spec.rb +105 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/vcr_cassettes/ensure_remote_file_saaspose_test_doc.yml +40 -0
- data/spec/vcr_cassettes/ensure_remote_file_saaspose_test_pdf.yml +40 -0
- data/spec/vcr_cassettes/ensure_remote_file_saaspose_test_ppt.yml +40 -0
- data/spec/vcr_cassettes/ensure_remote_file_saaspose_test_xls.yml +40 -0
- data/spec/vcr_cassettes/saaspose/cells_should_generate_a_pdf_from_a_remote_xls.yml +409 -0
- data/spec/vcr_cassettes/saaspose/pdf_should_generate_a_png_from_a_remote_pdf.yml +905 -0
- data/spec/vcr_cassettes/saaspose/pdf_should_read_the_number_of_pages_from_a_remote_pdf.yml +43 -0
- data/spec/vcr_cassettes/saaspose/slides_should_generate_a_pdf_from_a_remote_ppt.yml +12882 -0
- data/spec/vcr_cassettes/saaspose/storage_should_get_a_list_of_files_from_the_root_dir.yml +40 -0
- data/spec/vcr_cassettes/saaspose/storage_should_upload_a_file_to_the_root_dir.yml +805 -0
- data/spec/vcr_cassettes/saaspose/words_should_generate_a_pdf_from_a_remote_doc.yml +767 -0
- metadata +150 -0
data/.gitignore
ADDED
File without changes
|
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.3@saaspose --create
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
saasposesdk (0.1.0)
|
5
|
+
rest-client (~> 1.6)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
addressable (2.2.7)
|
11
|
+
coderay (1.0.6)
|
12
|
+
crack (0.3.1)
|
13
|
+
diff-lcs (1.1.3)
|
14
|
+
method_source (0.7.1)
|
15
|
+
mime-types (1.18)
|
16
|
+
pry (0.9.9.4)
|
17
|
+
coderay (~> 1.0.5)
|
18
|
+
method_source (~> 0.7.1)
|
19
|
+
slop (>= 2.4.4, < 3)
|
20
|
+
rest-client (1.6.7)
|
21
|
+
mime-types (>= 1.16)
|
22
|
+
rspec (2.9.0)
|
23
|
+
rspec-core (~> 2.9.0)
|
24
|
+
rspec-expectations (~> 2.9.0)
|
25
|
+
rspec-mocks (~> 2.9.0)
|
26
|
+
rspec-core (2.9.0)
|
27
|
+
rspec-expectations (2.9.1)
|
28
|
+
diff-lcs (~> 1.1.3)
|
29
|
+
rspec-mocks (2.9.0)
|
30
|
+
slop (2.4.4)
|
31
|
+
vcr (2.1.1)
|
32
|
+
webmock (1.8.6)
|
33
|
+
addressable (>= 2.2.7)
|
34
|
+
crack (>= 0.1.7)
|
35
|
+
|
36
|
+
PLATFORMS
|
37
|
+
ruby
|
38
|
+
|
39
|
+
DEPENDENCIES
|
40
|
+
pry (~> 0.9)
|
41
|
+
rspec (~> 2.9)
|
42
|
+
saasposesdk!
|
43
|
+
vcr (~> 2.1)
|
44
|
+
webmock (~> 1.8)
|
data/README.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
#Saaspose.SDK for Ruby Repository
|
2
|
+
|
3
|
+
This repository contains Saaspose.SDK for Ruby source code. This SDK allows you to work with Saaspose REST API in your Ruby applications quickly and easily.
|
4
|
+
|
5
|
+
|
6
|
+
##What's included in this SDK repository?
|
7
|
+
|
8
|
+
###Code
|
9
|
+
|
10
|
+
<table>
|
11
|
+
<tr>
|
12
|
+
<th>Module</th>
|
13
|
+
<th>Description</th>
|
14
|
+
</tr>
|
15
|
+
|
16
|
+
<tr>
|
17
|
+
<td>Common</td>
|
18
|
+
<td>This module provides the features commonly used by other sections of the SDK.</td>
|
19
|
+
</tr>
|
20
|
+
|
21
|
+
<tr>
|
22
|
+
<td>Storage</td>
|
23
|
+
<td>This module provides the features to work with Saaspose storage.</td>
|
24
|
+
</tr>
|
25
|
+
|
26
|
+
<tr>
|
27
|
+
<td>Pdf</td>
|
28
|
+
<td>This module provides the features to manipulate PDF files using Saaspose.Pdf.</td>
|
29
|
+
</tr>
|
30
|
+
|
31
|
+
<tr>
|
32
|
+
<td>Words</td>
|
33
|
+
<td>This module provides the features to manipulate Word files using Saaspose.Words.</td>
|
34
|
+
</tr>
|
35
|
+
|
36
|
+
<tr>
|
37
|
+
<td>Cells</td>
|
38
|
+
<td>This module provides the features to manipulate Excel files using Saaspose.Cells.</td>
|
39
|
+
</tr>
|
40
|
+
|
41
|
+
<tr>
|
42
|
+
<td>Slides</td>
|
43
|
+
<td>This module provides the features to manipulate Powerpoint files using Saaspose.Slides.</td>
|
44
|
+
</tr>
|
45
|
+
|
46
|
+
<tr>
|
47
|
+
<td>BarCode</td>
|
48
|
+
<td>This module provides the features to manipulate bar codes using Saaspose.BarCode.</td>
|
49
|
+
</tr>
|
50
|
+
|
51
|
+
|
52
|
+
</table>
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
###Data
|
57
|
+
|
58
|
+
In order to manipulate any files, you first need to upload them to the Saaspose storage using Storage module.
|
59
|
+
|
60
|
+
###Output
|
61
|
+
|
62
|
+
The Saaspose.SDK for Ruby allows you to save the output files at your specified location.
|
63
|
+
|
64
|
+
|
65
|
+
###Help Material
|
66
|
+
|
67
|
+
You may get help regarding Saaspose API or Saaspose.SDK for Ruby on [www.saaspose.com](http://www.saaspose.com).
|
68
|
+
|
69
|
+
##How to use Saaspose.SDK for Ruby?
|
70
|
+
|
71
|
+
Please see the Saaaspose.SDK for Ruby Examples sections in the [Documentation](http://www.saaspose.com/docs).
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
data/lib/saaspose.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require "logger"
|
2
|
+
|
3
|
+
module Saaspose
|
4
|
+
class Configuration
|
5
|
+
class << self
|
6
|
+
attr_accessor :product_uri
|
7
|
+
attr_accessor :app_sid, :app_key
|
8
|
+
attr_accessor :logger
|
9
|
+
attr_accessor :init
|
10
|
+
|
11
|
+
def configure(options={})
|
12
|
+
init_config
|
13
|
+
if block_given?
|
14
|
+
yield self
|
15
|
+
else
|
16
|
+
options.each do |key, value|
|
17
|
+
send(:"#{key}=", value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset
|
24
|
+
init_config(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def init_config(force=false)
|
30
|
+
return if @init && !force
|
31
|
+
@init = true
|
32
|
+
@product_uri = ""
|
33
|
+
@app_key = ""
|
34
|
+
@app_sid = ""
|
35
|
+
@logger = Logger.new(STDERR)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/saaspose/pdf.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "rexml/document"
|
2
|
+
|
3
|
+
module Saaspose
|
4
|
+
class Pdf
|
5
|
+
class << self
|
6
|
+
def convert(name, local_file, save_image_format, page_number, height, width)
|
7
|
+
url_doc = Configuration.product_uri + '/pdf/' + name + '/pages/' + page_number + '?format=' + save_image_format + '&width=' + width + '&height=' + height
|
8
|
+
signed_url = Utils.sign(url_doc)
|
9
|
+
response = RestClient.get(signed_url, :accept => 'application/json')
|
10
|
+
Utils.save_file(response, local_file)
|
11
|
+
end
|
12
|
+
|
13
|
+
def page_count(name)
|
14
|
+
url_page = Configuration.product_uri + '/pdf/' + name + '/pages'
|
15
|
+
signed_url = Utils.sign(url_page)
|
16
|
+
response = RestClient.get(signed_url, :accept => 'application/xml')
|
17
|
+
REXML::Document.new(response.body).elements.size
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Saaspose
|
2
|
+
class Slides
|
3
|
+
class << self
|
4
|
+
def convert(name, local_file, save_format)
|
5
|
+
url_doc = Configuration.product_uri + '/slides/' + name + '?format=' + save_format
|
6
|
+
signed_url = Utils.sign(url_doc)
|
7
|
+
response = RestClient.get(signed_url, :accept => 'application/json')
|
8
|
+
Utils.save_file(response, local_file)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module Saaspose
|
4
|
+
class Storage
|
5
|
+
File = Struct.new(:name, :folder, :modified, :size)
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def upload(local_file_path, remote_folder_path)
|
9
|
+
file_name = ::File.basename(local_file_path)
|
10
|
+
url_file = "#{Configuration.product_uri}/storage/file/#{remote_folder_path.empty? ? "" : "/#{remote_folder_path}" }#{file_name}"
|
11
|
+
signed_url = Utils.sign(url_file)
|
12
|
+
RestClient.put(signed_url, ::File.new(local_file_path, 'rb'))
|
13
|
+
end
|
14
|
+
|
15
|
+
def files(remote_folder_path="")
|
16
|
+
url_folder = "#{Configuration.product_uri}/storage/folder"
|
17
|
+
url_folder << "/#{remote_folder_path}" unless remote_folder_path.empty?
|
18
|
+
|
19
|
+
signed_url = Utils.sign(url_folder)
|
20
|
+
response = RestClient.get(signed_url, :accept => 'application/json')
|
21
|
+
result = JSON.parse(response.body)
|
22
|
+
|
23
|
+
result["Files"].map do |entry|
|
24
|
+
File.new(entry["Name"], entry["IsFolder"], Utils.parse_date(entry["ModifiedDate"]), entry["Size"])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'rest_client'
|
3
|
+
require 'openssl'
|
4
|
+
require 'base64'
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
module Saaspose
|
8
|
+
class Utils
|
9
|
+
class << self
|
10
|
+
# Signs a URI with your appSID and Key.
|
11
|
+
# * :url describes the URL to sign
|
12
|
+
def sign(url)
|
13
|
+
url = URI.escape(url)
|
14
|
+
parsed_url = URI.parse(url)
|
15
|
+
|
16
|
+
url_to_sign =''
|
17
|
+
if parsed_url.query.nil?
|
18
|
+
url_to_sign = parsed_url.scheme+"://"+ parsed_url.host + parsed_url.path + "?appSID=" + Configuration.app_sid
|
19
|
+
else
|
20
|
+
url_to_sign = parsed_url.scheme+"://"+ parsed_url.host + parsed_url.path + '?' + parsed_url.query + "&appSID=" + Configuration.app_sid
|
21
|
+
end
|
22
|
+
|
23
|
+
# create a signature using the private key and the URL
|
24
|
+
raw_signature = OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), Configuration.app_key, url_to_sign)
|
25
|
+
|
26
|
+
#Convert raw to encoded string
|
27
|
+
signature = Base64.strict_encode64(raw_signature).tr('+/','-_')
|
28
|
+
|
29
|
+
#remove invalid character
|
30
|
+
signature = signature.gsub(/[=_-]/,'=' => '', '_' => '%2f', '-' => '%2b')
|
31
|
+
|
32
|
+
#Define expression
|
33
|
+
pat = /%[0-9a-f]{2}/
|
34
|
+
|
35
|
+
#Replace the portion matched to the above pattern to upper case
|
36
|
+
6.times do
|
37
|
+
signature = signature.sub(pat, pat.match(signature).to_s.upcase)
|
38
|
+
end
|
39
|
+
|
40
|
+
# prepend the server and append the signature.
|
41
|
+
url_to_sign + "&signature=#{signature}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_date(date_string)
|
45
|
+
seconds_since_epoch = date_string.scan(/[0-9]+/)[0].to_i
|
46
|
+
Time.at((seconds_since_epoch-(21600000 + 18000000))/1000)
|
47
|
+
end
|
48
|
+
|
49
|
+
def call(uri, options, file)
|
50
|
+
url = "#{Configuration.product_uri}#{uri}"
|
51
|
+
url << "?" << options.map{|key, value| "#{key}=#{CGI::escape(value.to_s)}"}.join("&") if options
|
52
|
+
signed_url = Utils.sign(url)
|
53
|
+
response = RestClient.get(signed_url, :accept => 'application/json')
|
54
|
+
Utils.save_file(response, file)
|
55
|
+
end
|
56
|
+
|
57
|
+
def save_file(response_stream, local_file)
|
58
|
+
File.open(local_file, "wb") { |file| file.write(response_stream.body) }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Saaspose
|
2
|
+
class Words
|
3
|
+
class << self
|
4
|
+
def convert(name, local_file, save_format)
|
5
|
+
urlDoc = Configuration.product_uri + '/words/' + name + '?format=' + save_format
|
6
|
+
signedURL = Utils.sign(urlDoc)
|
7
|
+
response = RestClient.get(signedURL, :accept => 'application/json')
|
8
|
+
Utils.save_file(response, local_file)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/saaspose.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "saaspose/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'saaspose'
|
7
|
+
s.version = Saaspose::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.summary = s.description = "Ruby bindings to Saaspose REST API"
|
10
|
+
s.authors = ["Peter Schröder"]
|
11
|
+
s.email = 'phoetmail@googlemail.com'
|
12
|
+
s.homepage = 'http://nofail.de'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_dependency 'rest-client', '~> 1.6'
|
20
|
+
|
21
|
+
s.add_development_dependency 'vcr', '~> 2.1'
|
22
|
+
s.add_development_dependency 'webmock', '~> 1.8'
|
23
|
+
s.add_development_dependency 'rspec', '~> 2.9'
|
24
|
+
s.add_development_dependency 'pry', '~> 0.9'
|
25
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "saaspose" do
|
4
|
+
REMOTE_ROOT_DIR = ""
|
5
|
+
|
6
|
+
PNG_PATH = "/tmp/test.png"
|
7
|
+
PDF_PATH = "/tmp/test.pdf"
|
8
|
+
|
9
|
+
TEST_PDF_NAME = "saaspose_test.pdf"
|
10
|
+
TEST_PPT_NAME = "saaspose_test.ppt"
|
11
|
+
TEST_DOC_NAME = "saaspose_test.doc"
|
12
|
+
TEST_XLS_NAME = "saaspose_test.xls"
|
13
|
+
|
14
|
+
before(:all) do
|
15
|
+
configure_client
|
16
|
+
[TEST_PDF_NAME, TEST_PPT_NAME, TEST_DOC_NAME, TEST_XLS_NAME].each { |path| ensure_remote_file(path) }
|
17
|
+
end
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
[PNG_PATH, PDF_PATH].each { |path| FileUtils.rm(path) if File.exists?(path) }
|
21
|
+
end
|
22
|
+
|
23
|
+
context "pdf" do
|
24
|
+
it "should generate a png from a remote pdf", :vcr => true do
|
25
|
+
Saaspose::Pdf.convert(TEST_PDF_NAME, PNG_PATH, 'png', '1', '800', '600')
|
26
|
+
File.exists?(PNG_PATH).should be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should read the number of pages from a remote pdf", :vcr => true do
|
30
|
+
Saaspose::Pdf.page_count(TEST_PDF_NAME).should eql(1)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "slides" do
|
35
|
+
it "should generate a pdf from a remote ppt", :vcr => true do
|
36
|
+
Saaspose::Slides.convert(TEST_PPT_NAME, PDF_PATH, 'pdf')
|
37
|
+
File.exists?(PDF_PATH).should be_true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "words" do
|
42
|
+
it "should generate a pdf from a remote doc", :vcr => true do
|
43
|
+
Saaspose::Words.convert(TEST_DOC_NAME, PDF_PATH, 'pdf')
|
44
|
+
File.exists?(PDF_PATH).should be_true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "cells" do
|
49
|
+
it "should generate a pdf from a remote xls", :vcr => true do
|
50
|
+
Saaspose::Cells.convert(TEST_XLS_NAME, PDF_PATH)
|
51
|
+
File.exists?(PDF_PATH).should be_true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "storage" do
|
56
|
+
let(:folder) { Saaspose::Storage::File.new("test", true, Time.at(1334562314), 0) }
|
57
|
+
|
58
|
+
it "should upload a file to the root dir", :vcr => true do
|
59
|
+
resp = Saaspose::Storage.upload(fixture_path(TEST_PDF_NAME), REMOTE_ROOT_DIR)
|
60
|
+
resp.should match("<Status>OK</Status>")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should get a list of files from the root dir", :vcr => true do
|
64
|
+
files = Saaspose::Storage.files(REMOTE_ROOT_DIR)
|
65
|
+
files.first.should be_an_instance_of(Saaspose::Storage::File)
|
66
|
+
files.map(&:name).should include(TEST_PDF_NAME)
|
67
|
+
files.first.should eql(folder)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "utils" do
|
72
|
+
before(:each) do
|
73
|
+
Saaspose::Configuration.configure do |config|
|
74
|
+
config.app_sid = "SAASPOSE_APPSID"
|
75
|
+
config.app_key = "SAASPOSE_APPKEY"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
let(:url) { "http://example.com/path?uschi=true&a_param=yes" }
|
80
|
+
it "should sign a uri" do
|
81
|
+
Saaspose::Utils.sign(url).should eql("http://example.com/path?uschi=true&a_param=yes&appSID=SAASPOSE_APPSID&signature=zl%2BjolbjggyKZ31QgflGVILu%2F0I")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def configure_client
|
87
|
+
Saaspose::Configuration.configure do |config|
|
88
|
+
config.product_uri = "http://api.saaspose.com/v1.0"
|
89
|
+
config.app_sid = ENV["SAASPOSE_APPSID"]
|
90
|
+
config.app_key = ENV["SAASPOSE_APPKEY"]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def ensure_remote_file(test_file)
|
95
|
+
VCR.use_cassette("ensure_remote_file #{test_file}", :record => :new_episodes, :match_requests_on => [:host, :path]) do
|
96
|
+
unless Saaspose::Storage.files.map(&:name).include?(test_file)
|
97
|
+
puts "uploading #{test_file} for testing purposes"
|
98
|
+
Saaspose::Storage.upload(fixture_path(test_file), REMOTE_ROOT_DIR)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def fixture_path(name)
|
104
|
+
File.expand_path("../fixtures/#{name}", File.dirname(__FILE__))
|
105
|
+
end
|