cloudxls 0.1.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.
- data/Gemfile +2 -0
- data/Gemfile.lock +32 -0
- data/README.md +3 -0
- data/Rakefile +9 -0
- data/cloudxls.gemspec +24 -0
- data/lib/cloudxls/version.rb +3 -0
- data/lib/cloudxls.rb +137 -0
- data/lib/data/ca-certificates.txt +0 -0
- metadata +139 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
cloudxls (0.1.0)
|
5
|
+
multi_json (>= 1.0.4, < 2)
|
6
|
+
rest-client (~> 1.4)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
addressable (2.3.5)
|
12
|
+
crack (0.4.1)
|
13
|
+
safe_yaml (~> 0.9.0)
|
14
|
+
mime-types (1.25)
|
15
|
+
minitest (5.0.8)
|
16
|
+
multi_json (1.8.0)
|
17
|
+
rake (10.1.0)
|
18
|
+
rest-client (1.6.7)
|
19
|
+
mime-types (>= 1.16)
|
20
|
+
safe_yaml (0.9.7)
|
21
|
+
webmock (1.13.0)
|
22
|
+
addressable (>= 2.2.7)
|
23
|
+
crack (>= 0.3.2)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
cloudxls!
|
30
|
+
minitest
|
31
|
+
rake
|
32
|
+
webmock
|
data/README.md
ADDED
data/Rakefile
ADDED
data/cloudxls.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$LOAD_PATH.push(File.expand_path "../lib", __FILE__)
|
3
|
+
require "cloudxls/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "cloudxls"
|
7
|
+
gem.authors = ["Sebastian Burkhard"]
|
8
|
+
gem.email = ["sebi.burkhard@gmail.com"]
|
9
|
+
gem.description = %q{Provides a simple ruby wrapper around the CloudXLS API}
|
10
|
+
gem.summary = %q{Provides a simple ruby wrapper around the CloudXLS API}
|
11
|
+
gem.homepage = "https://csv.io"
|
12
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
13
|
+
gem.files = `git ls-files`.split("\n")
|
14
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = CloudXLS::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency('rest-client', '~> 1.4')
|
19
|
+
gem.add_dependency('multi_json', '>= 1.0.4', '< 2')
|
20
|
+
|
21
|
+
gem.add_development_dependency "minitest"
|
22
|
+
gem.add_development_dependency "rake"
|
23
|
+
gem.add_development_dependency "webmock"
|
24
|
+
end
|
data/lib/cloudxls.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'set'
|
3
|
+
require 'openssl'
|
4
|
+
require 'json'
|
5
|
+
require 'rest_client'
|
6
|
+
require 'multi_json'
|
7
|
+
|
8
|
+
require 'cloudxls/version'
|
9
|
+
|
10
|
+
module CloudXLS
|
11
|
+
@https = true
|
12
|
+
@api_base = 'csv.io'
|
13
|
+
@api_key = ENV["CLOUDXLS_API_KEY"]
|
14
|
+
@ssl_bundle_path = File.dirname(__FILE__) + '/data/ca-certificates.crt'
|
15
|
+
@verify_ssl_certs = true
|
16
|
+
|
17
|
+
class << self
|
18
|
+
attr_accessor :api_key, :api_base, :verify_ssl_certs, :api_version, :https
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.api_url(path = '')
|
22
|
+
# @api_base + url
|
23
|
+
"http#{@https ? 's' : ''}://#{@api_key}:@#{@api_base}/api/v1/#{path}"
|
24
|
+
end
|
25
|
+
|
26
|
+
class ExportResponse
|
27
|
+
attr_reader :url, :uuid, :response
|
28
|
+
|
29
|
+
def initialize(response)
|
30
|
+
data = CloudXLS.parse_response(response)
|
31
|
+
@response = response
|
32
|
+
@url = data['url']
|
33
|
+
@uuid = data['uuid']
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# CloudXLS.csv2xls :data => File.new('/path/to/data.csv', 'r')
|
38
|
+
# CloudXLS.csv2xls :data => File.new("foo,bar\nlorem,ipsum")
|
39
|
+
# CloudXLS.csv2xls :data_url => "https://example.com/data.csv"
|
40
|
+
# CloudXLS.csv2xls :data_url => "https://username:password@example.com/data.csv"
|
41
|
+
#
|
42
|
+
def self.csv2xls(params = {})
|
43
|
+
check_api_key!
|
44
|
+
|
45
|
+
headers = {}
|
46
|
+
|
47
|
+
response = execute_request do
|
48
|
+
RestClient.post(api_url("export.json"), params, headers)
|
49
|
+
end
|
50
|
+
|
51
|
+
if params[:async].to_s == 'false'
|
52
|
+
response
|
53
|
+
else
|
54
|
+
ExportResponse.new(response)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def validate_params(params)
|
59
|
+
# complain if excel_format together with template
|
60
|
+
#
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.execute_request
|
64
|
+
begin
|
65
|
+
return yield
|
66
|
+
rescue SocketError => e
|
67
|
+
handle_restclient_error(e)
|
68
|
+
rescue NoMethodError => e
|
69
|
+
# Work around RestClient bug
|
70
|
+
if e.message =~ /\WRequestFailed\W/
|
71
|
+
e = APIConnectionError.new('Unexpected HTTP response code')
|
72
|
+
handle_restclient_error(e)
|
73
|
+
else
|
74
|
+
raise
|
75
|
+
end
|
76
|
+
rescue RestClient::ExceptionWithResponse => e
|
77
|
+
if rcode = e.http_code and rbody = e.http_body
|
78
|
+
# TODO
|
79
|
+
# handle_api_error(rcode, rbody)
|
80
|
+
handle_restclient_error(e)
|
81
|
+
else
|
82
|
+
handle_restclient_error(e)
|
83
|
+
end
|
84
|
+
rescue RestClient::Exception, Errno::ECONNREFUSED => e
|
85
|
+
handle_restclient_error(e)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.parse_response(response)
|
90
|
+
json = MultiJson.load(response.body)
|
91
|
+
rescue MultiJson::DecodeError => e
|
92
|
+
raise general_api_error(response.code, response.body)
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.general_api_error(rcode, rbody)
|
96
|
+
StandardError.new("Invalid response object from API: #{rbody.inspect} " +
|
97
|
+
"(HTTP response code was #{rcode})" ) #, rcode, rbody)
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
private
|
103
|
+
def self.handle_restclient_error(e)
|
104
|
+
case e
|
105
|
+
when RestClient::ServerBrokeConnection, RestClient::RequestTimeout
|
106
|
+
message = "Could not connect to CloudXLS (#{@api_base}). " +
|
107
|
+
"Please check your internet connection and try again. "
|
108
|
+
|
109
|
+
when RestClient::SSLCertificateNotVerified
|
110
|
+
message = "Could not verify CloudXLS's SSL certificate. " +
|
111
|
+
"Please make sure that your network is not intercepting certificates. "
|
112
|
+
|
113
|
+
when SocketError
|
114
|
+
message = "Unexpected error communicating when trying to connect to CloudXLS. " +
|
115
|
+
"You may be seeing this message because your DNS is not working. " +
|
116
|
+
"To check, try running 'host cloudxls.com' from the command line."
|
117
|
+
|
118
|
+
else
|
119
|
+
message = "Unexpected error communicating with CloudXLS. " +
|
120
|
+
"If this problem persists, let us know at support@cloudxls.com."
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
raise StandardError.new(message + "\n\n(Network error: #{e.message})")
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.check_api_key!
|
128
|
+
unless api_key ||= @api_key
|
129
|
+
raise StandardError.new('No API key provided. Set your API key using "CloudXLS.api_key = <API-KEY>". ')
|
130
|
+
end
|
131
|
+
|
132
|
+
if api_key =~ /\s/
|
133
|
+
raise StandardError.new('Your API key is invalid, as it contains whitespace.')
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cloudxls
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sebastian Burkhard
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rest-client
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.4'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.4'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: multi_json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.0.4
|
38
|
+
- - <
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2'
|
41
|
+
type: :runtime
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.0.4
|
49
|
+
- - <
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '2'
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: minitest
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
type: :development
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rake
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
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
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: webmock
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
description: Provides a simple ruby wrapper around the CloudXLS API
|
101
|
+
email:
|
102
|
+
- sebi.burkhard@gmail.com
|
103
|
+
executables: []
|
104
|
+
extensions: []
|
105
|
+
extra_rdoc_files: []
|
106
|
+
files:
|
107
|
+
- Gemfile
|
108
|
+
- Gemfile.lock
|
109
|
+
- README.md
|
110
|
+
- Rakefile
|
111
|
+
- cloudxls.gemspec
|
112
|
+
- lib/cloudxls.rb
|
113
|
+
- lib/cloudxls/version.rb
|
114
|
+
- lib/data/ca-certificates.txt
|
115
|
+
homepage: https://csv.io
|
116
|
+
licenses: []
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 1.8.23
|
136
|
+
signing_key:
|
137
|
+
specification_version: 3
|
138
|
+
summary: Provides a simple ruby wrapper around the CloudXLS API
|
139
|
+
test_files: []
|