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 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: []