cloudxls 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc4d555e2c11a064de173550ec112a8515b16604
4
- data.tar.gz: 78a87ac79d22710035968edaa8b662dc90d18c33
3
+ metadata.gz: 1fab7cbcc052f7807d5d721580dedaa82d7cb64e
4
+ data.tar.gz: 9f6c7a7e75036f8d7d79ddbdebac9e03f6178b7a
5
5
  SHA512:
6
- metadata.gz: 9a444d889a3a7243894721ee13f3267403cd7b596f5298713d31234ee3737172b94848d89fba0cdc2a1be43d69804469816423374f624c90224bb1d7d91829de
7
- data.tar.gz: c4045675c18f8ed7eb7bc8430c41de16b134f17c4276e273b619ad84a5d9eaead6376e4189b0da68d8403cbd234fa9e34a527fb054b6d6baba5911fc2946a020
6
+ metadata.gz: 9ce70375e14270a59099be0f95b57eb6f0bd38938362d52d2867e2ad2c7e9f84e1a1791d8d50c9de63a3b1d8de59d894e53aa6537e2a935e398198b1911e5599
7
+ data.tar.gz: 15247999df556ae0b684e40676cb46487c089f63f4ff150f665ea32521d16e289cd4f554e431fbad338dfeaba2fab4e6b75bbd23478dd1c7d74e99fa5962f333
data/README.md CHANGED
@@ -52,7 +52,7 @@ Output
52
52
  From a remote url
53
53
 
54
54
  ```ruby
55
- data = Cloudxls.read(file_url: "http://example.org/data.xls").to_h
55
+ data = Cloudxls.read(file_url: "http://example.org/data.xls").as_json.to_h
56
56
  ```
57
57
 
58
58
  Save json to a file
@@ -66,7 +66,7 @@ Or access the response_stream directly
66
66
 
67
67
  ```ruby
68
68
  io = File.new("output.json", "w")
69
- Cloudxls.read(file: File.new("/path/to/my-excel.xls")).each do |chunk|
69
+ Cloudxls.read(file: File.new("/path/to/my-excel.xls")).as_csv.each do |chunk|
70
70
  io.write chunk
71
71
  end
72
72
  io.close
@@ -80,7 +80,9 @@ Write a xls file with a single sheet.
80
80
  csv_string = "hello,world\nfoo,bar"
81
81
 
82
82
  Cloudxls.write(csv: csv_string)
83
+ .as_xls
83
84
  .save_as("/tmp/hello-world.xls")
85
+
84
86
  ```
85
87
 
86
88
  Write xlsx:
@@ -99,7 +101,8 @@ req = Cloudxls.write(
99
101
  offset: "B2",
100
102
  sheet_name: "Data"
101
103
  )
102
- req.save_as("/tmp/hello-world.xls")
104
+ xls_response = req.as_xls
105
+ xls_response.save_as("/tmp/hello-world.xls")
103
106
  ```
104
107
 
105
108
  Multiple sheets:
@@ -108,6 +111,7 @@ Multiple sheets:
108
111
  Cloudxls.write(csv: csv_string)
109
112
  .add_data(csv: "more,data")
110
113
  .add_data(csv: "more,data", sheet_name: "foobar")
114
+ .as_xls
111
115
  .save_as("/tmp/hello-world.xls")
112
116
  ```
113
117
 
@@ -116,6 +120,7 @@ Append data to a excel file (xls or xlsx)
116
120
  ```ruby
117
121
  Cloudxls.write(csv: csv_string)
118
122
  .target_file(File.new("/path/to/my-file.xls"))
123
+ .as_xls
119
124
  .save_as("/tmp/hello-world.xls")
120
125
  ```
121
126
 
@@ -126,9 +131,16 @@ Assign the result of a `#write` or `#read` call to the `response_body`.
126
131
 
127
132
  ```ruby
128
133
  def index
129
- headers["Content-Type"] = "application/vnd.ms-excel"
130
- headers["Content-disposition"] = "attachment; filename=users.xls"
134
+ csv_data = "hello,world"
135
+
136
+ headers["Content-Type"] = Mime::Type.lookup_by_extension(params[:format])
137
+ headers["Content-disposition"] = "attachment; filename=data.#{params[:format]}"
138
+
139
+ respond_to do |format|
131
140
 
132
- self.response_body = Cloudxls.write(csv: User.all.to_csv)
141
+ format.csv { self.response_body = csv_data }
142
+ format.xls { self.response_body = Cloudxls.write(csv: csv_data).as_xls }
143
+ format.xlsx { self.response_body = Cloudxls.write(csv: csv_data).as_xlsx }
144
+ end
133
145
  end
134
146
  ```
@@ -1,3 +1,3 @@
1
1
  class Cloudxls
2
- VERSION = '2.0.0'
2
+ VERSION = '2.0.1'
3
3
  end
data/lib/cloudxls.rb CHANGED
@@ -8,8 +8,6 @@ class Cloudxls
8
8
  class ApiError < Exception
9
9
  end
10
10
 
11
- @api_key = ENV.fetch("CLOUDXLS_API_KEY", nil)
12
- @api_base = ENV.fetch("CLOUDXLS_API_BASE", "api.cloudxls.com")
13
11
  @sandbox_base = "sandbox.cloudxls.com"
14
12
  @api_version = "v2".freeze
15
13
 
@@ -22,9 +20,9 @@ class Cloudxls
22
20
 
23
21
  def client_options
24
22
  {
25
- api_key: self.api_key,
23
+ api_key: self.api_key || ENV.fetch("CLOUDXLS_API_KEY", nil),
26
24
  api_version: self.api_version,
27
- api_base: self.api_base,
25
+ api_base: self.api_base || ENV.fetch("CLOUDXLS_API_BASE", "api.cloudxls.com"),
28
26
  port: 443
29
27
  }
30
28
  end
@@ -35,7 +33,7 @@ class Cloudxls
35
33
  # @return [WriteRequest] write request object
36
34
  #
37
35
  def write(params = nil)
38
- WriteRequest.new(client_options).add_data(params)
36
+ WriteRequest.new(self.client_options).add_data(params)
39
37
  end
40
38
 
41
39
  # Initializes a Read request
@@ -44,14 +42,13 @@ class Cloudxls
44
42
  # @return [WriteRequest] write request object
45
43
  #
46
44
  def read(params = nil)
47
- ReadRequest.new(client_options).add_data(params)
45
+ ReadRequest.new(self.client_options).add_data(params)
48
46
  end
49
47
  end
50
48
 
51
49
  module BaseRequest
52
50
  def initialize(client_options = nil)
53
51
  @post_data = []
54
-
55
52
  @finished = false
56
53
  @client_options = client_options || Cloudxls.client_options
57
54
  end
@@ -90,10 +87,54 @@ class Cloudxls
90
87
  "/#{client_options[:api_version]}/#{path}"
91
88
  end
92
89
 
93
- # Alias for #each
90
+
91
+ # Starts request and yields response to block
92
+ #
93
+ # @params [String] path
94
+ #
95
+ def each(&block)
96
+ raise "#{self.class.name} already executed" if @finished
97
+
98
+ start do |http|
99
+ request = Net::HTTP::Post::Multipart.new(self.path, @post_data)
100
+ request.basic_auth api_key, ""
101
+ request['User-Agent'] = "cloudxls-ruby #{VERSION}"
102
+
103
+ if block_given?
104
+ http.request(request) do |response|
105
+ if Net::HTTPSuccess === response
106
+ response.read_body(&block)
107
+ else
108
+ raise ApiError.new("#{response.code} #{response.class.name.to_s}: #{response.body}")
109
+ end
110
+ end
111
+ else
112
+ http.request(request)
113
+ end
114
+ end
115
+ @finished = true
116
+ self
117
+ end
118
+ end
119
+
120
+ module BaseResponse
121
+ # Response as string
94
122
  #
95
- def data
96
- each
123
+ # @return [String]
124
+ #
125
+ def response_body
126
+ # TODO: optimize
127
+ str = ""
128
+ each do |chunk|
129
+ str << chunk
130
+ end
131
+ str
132
+ end
133
+
134
+ # Response body. Required to make Rails send_data work out of the box.
135
+ #
136
+ def to_s
137
+ response_body
97
138
  end
98
139
 
99
140
  # Writes to IO object
@@ -119,32 +160,24 @@ class Cloudxls
119
160
  write_to File.open(path, 'wb')
120
161
  end
121
162
 
122
- # Starts request and yields response to block
123
- #
124
- # @params [String] path
125
- #
126
163
  def each(&block)
127
- raise "#{self.class.name} already executed" if @finished
164
+ @request.each(&block)
165
+ end
166
+ end
128
167
 
129
- start do |http|
130
- request = Net::HTTP::Post::Multipart.new(self.path, @post_data)
131
- request.basic_auth api_key, ""
132
- request['User-Agent'] = "cloudxls-ruby #{Cloudxls::VERSION}"
168
+ class ReadResponse
169
+ include BaseResponse
133
170
 
134
- if block_given?
135
- http.request(request) do |response|
136
- if Net::HTTPSuccess === response
137
- response.read_body(&block)
138
- else
139
- raise ApiError.new("#{response.code} #{response.class.name.to_s}: #{response.body}")
140
- end
141
- end
142
- else
143
- http.request(request)
144
- end
145
- end
146
- @finished = true
147
- self
171
+ def initialize(req)
172
+ @request = req
173
+ end
174
+
175
+ # Response as Hash (used with json)
176
+ #
177
+ # @return [String]
178
+ #
179
+ def to_h
180
+ JSON.load(response_body)
148
181
  end
149
182
  end
150
183
 
@@ -173,43 +206,22 @@ class Cloudxls
173
206
  self
174
207
  end
175
208
 
176
- # Response as string
177
- #
178
- # @return [String]
179
- #
180
- def response_body
181
- # TODO: optimize
182
- str = ""
183
- each do |chunk|
184
- str << chunk
185
- end
186
- str
187
- end
188
-
189
209
  # Set request to JSON
190
210
  #
191
- # @returns [require] returns self
211
+ # @returns [ReadResponse] read response
192
212
  #
193
213
  def as_json
194
214
  self.file_format = "json"
195
- self
215
+ ReadResponse.new(self)
196
216
  end
197
217
 
198
218
  # Set request to CSV
199
219
  #
200
- # @returns [WriteRequest] returns self
220
+ # @returns [ReadResponse] returns self
201
221
  #
202
222
  def as_csv
203
223
  self.file_format = "csv"
204
- self
205
- end
206
-
207
- # Response as Hash (used with json)
208
- #
209
- # @return [String]
210
- #
211
- def to_h
212
- JSON.load(response_body)
224
+ ReadResponse.new(self)
213
225
  end
214
226
 
215
227
  protected
@@ -219,6 +231,14 @@ class Cloudxls
219
231
  end
220
232
  end
221
233
 
234
+ class WriteResponse
235
+ include BaseResponse
236
+
237
+ def initialize(req)
238
+ @request = req
239
+ end
240
+ end
241
+
222
242
  class WriteRequest
223
243
  include BaseRequest
224
244
  # post_data is an array of key,value arrays. Reason:
@@ -257,20 +277,20 @@ class Cloudxls
257
277
 
258
278
  # Set request to XLS
259
279
  #
260
- # @returns [WriteRequest] returns self
280
+ # @returns [WriteResponse] response object without starting the request
261
281
  #
262
282
  def as_xls
263
283
  self.file_format = "xls"
264
- self
284
+ WriteResponse.new(self)
265
285
  end
266
286
 
267
287
  # Set request to XLSX
268
288
  #
269
- # @returns [WriteRequest] returns self
289
+ # @returns [WriteResponse] response object without starting the request
270
290
  #
271
291
  def as_xlsx
272
292
  self.file_format = "xlsx"
273
- self
293
+ WriteResponse.new(self)
274
294
  end
275
295
 
276
296
  # Sets request to XLSX
@@ -3,15 +3,15 @@ require 'test_helper'
3
3
  class CloudxlsTest < Minitest::Test
4
4
  def test_defaults
5
5
  Cloudxls.api_key = "test_foo"
6
- file = Cloudxls.write(csv: "hello,world").save_as("/tmp/foo.xls")
6
+ file = Cloudxls.write(csv: "hello,world").as_xls.save_as("/tmp/foo.xls")
7
7
  hash = Cloudxls.read(excel: File.new(file.path)).to_h
8
8
  assert_equal ["hello", "world"], hash.first["rows"][0]
9
9
  end
10
10
 
11
11
  def test_defaults
12
12
  Cloudxls.api_key = "test_foo"
13
- file = Cloudxls.write(csv: File.new("test/test.csv")).save_as("/tmp/foo.xls")
14
- hash = Cloudxls.read(excel: File.new(file.path)).to_h
13
+ file = Cloudxls.write(csv: File.new("test/test.csv")).as_xls.save_as("/tmp/foo.xls")
14
+ hash = Cloudxls.read(excel: File.new(file.path)).as_json.to_h
15
15
  assert_equal ["hello", "world"], hash.first["rows"][0]
16
16
  end
17
17
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudxls
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Burkhard