cloudxls 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
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
@@ -0,0 +1,3 @@
1
+ # cloudxls gem
2
+
3
+ This is a simple wrapper for the cloudxls api.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ task :default => [:test]
2
+
3
+ task :test do
4
+ ret = true
5
+ Dir["test/**/*.rb"].each do |f|
6
+ ret = ret && ruby(f, '')
7
+ end
8
+ exit(ret)
9
+ end
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
@@ -0,0 +1,3 @@
1
+ module CloudXLS
2
+ VERSION = '0.1.2'
3
+ 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: []