tinify 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,12 @@ require "json"
4
4
  module Tinify
5
5
  class Client
6
6
  API_ENDPOINT = "https://api.tinify.com".freeze
7
+
8
+ RETRY_COUNT = 1
9
+ RETRY_DELAY = 500
10
+
7
11
  USER_AGENT = "Tinify/#{VERSION} Ruby/#{RUBY_VERSION}p#{RUBY_PATCHLEVEL} (#{defined?(RUBY_ENGINE) ? RUBY_ENGINE : "unknown"})".freeze
12
+
8
13
  CA_BUNDLE = File.expand_path("../../data/cacert.pem", __FILE__).freeze
9
14
 
10
15
  def initialize(key, app_identifier = nil, proxy = nil)
@@ -24,7 +29,8 @@ module Tinify
24
29
  @client.ssl_config.add_trust_ca(CA_BUNDLE)
25
30
  end
26
31
 
27
- def request(method, url, body = nil, header = {})
32
+ def request(method, url, body = nil)
33
+ header = {}
28
34
  if Hash === body
29
35
  if body.empty?
30
36
  body = nil
@@ -34,26 +40,31 @@ module Tinify
34
40
  end
35
41
  end
36
42
 
37
- begin
38
- response = @client.request(method, url, body: body, header: header)
39
- rescue HTTPClient::TimeoutError => err
40
- raise ConnectionError.new("Timeout while connecting")
41
- rescue StandardError => err
42
- raise ConnectionError.new("Error while connecting: #{err.message}")
43
- end
43
+ RETRY_COUNT.downto(0) do |retries|
44
+ sleep RETRY_DELAY / 1000.0 if retries < RETRY_COUNT
44
45
 
45
- if count = response.headers["Compression-Count"]
46
- Tinify.compression_count = count.to_i
47
- end
46
+ begin
47
+ response = @client.request(method, url, body: body, header: header)
48
+ rescue HTTPClient::TimeoutError => err
49
+ next if retries > 0
50
+ raise ConnectionError.new("Timeout while connecting")
51
+ rescue StandardError => err
52
+ next if retries > 0
53
+ raise ConnectionError.new("Error while connecting: #{err.message}")
54
+ end
55
+
56
+ if count = response.headers["Compression-Count"]
57
+ Tinify.compression_count = count.to_i
58
+ end
59
+
60
+ return response if response.ok?
48
61
 
49
- if response.ok?
50
- response
51
- else
52
62
  details = begin
53
63
  JSON.parse(response.body)
54
64
  rescue StandardError => err
55
- { "message" => "Error while parsing response: #{err.message}", "error" => "ParseError" }
65
+ {"message" => "Error while parsing response: #{err.message}", "error" => "ParseError"}
56
66
  end
67
+ next if retries > 0 and response.status >= 500
57
68
  raise Error.create(details["message"], details["error"], response.status)
58
69
  end
59
70
  end
@@ -1,3 +1,3 @@
1
1
  module Tinify
2
- VERSION = "1.4.0"
2
+ VERSION = "1.5.0"
3
3
  end
@@ -1,6 +1,9 @@
1
1
  require File.expand_path("../helper", __FILE__)
2
2
 
3
3
  describe Tinify::Client do
4
+ Tinify::Client.send(:remove_const, :RETRY_DELAY)
5
+ Tinify::Client.const_set(:RETRY_DELAY, 10)
6
+
4
7
  subject do
5
8
  Tinify::Client.new("key")
6
9
  end
@@ -96,7 +99,19 @@ describe Tinify::Client do
96
99
  end
97
100
  end
98
101
 
99
- describe "with timeout" do
102
+ describe "with timeout once" do
103
+ before do
104
+ stub_request(:get, "https://api:key@api.tinify.com").to_timeout
105
+ .then.to_return(status: 201)
106
+ end
107
+
108
+ it "should return response" do
109
+ response = subject.request(:get, "/")
110
+ assert_equal "", response.body
111
+ end
112
+ end
113
+
114
+ describe "with timeout repeatedly" do
100
115
  before do
101
116
  stub_request(:get, "https://api:key@api.tinify.com").to_timeout
102
117
  end
@@ -114,7 +129,20 @@ describe Tinify::Client do
114
129
  end
115
130
  end
116
131
 
117
- describe "with socket error" do
132
+ describe "with socket error once" do
133
+ before do
134
+ stub_request(:get, "https://api:key@api.tinify.com")
135
+ .to_raise(SocketError.new("nodename nor servname provided"))
136
+ .then.to_return(status: 201)
137
+ end
138
+
139
+ it "should return response" do
140
+ response = subject.request(:get, "/")
141
+ assert_equal "", response.body
142
+ end
143
+ end
144
+
145
+ describe "with socket error repeatedly" do
118
146
  before do
119
147
  stub_request(:get, "https://api:key@api.tinify.com").to_raise(SocketError.new("nodename nor servname provided"))
120
148
  end
@@ -132,7 +160,20 @@ describe Tinify::Client do
132
160
  end
133
161
  end
134
162
 
135
- describe "with unexpected error" do
163
+ describe "with unexpected error once" do
164
+ before do
165
+ stub_request(:get, "https://api:key@api.tinify.com")
166
+ .to_raise("some error")
167
+ .then.to_return(status: 201)
168
+ end
169
+
170
+ it "should return response" do
171
+ response = subject.request(:get, "/")
172
+ assert_equal "", response.body
173
+ end
174
+ end
175
+
176
+ describe "with unexpected error repeatedly" do
136
177
  before do
137
178
  stub_request(:get, "https://api:key@api.tinify.com").to_raise("some error")
138
179
  end
@@ -150,7 +191,21 @@ describe Tinify::Client do
150
191
  end
151
192
  end
152
193
 
153
- describe "with server error" do
194
+ describe "with server error once" do
195
+ before do
196
+ stub_request(:get, "https://api:key@api.tinify.com").to_return(
197
+ status: 584,
198
+ body: '{"error":"InternalServerError","message":"Oops!"}'
199
+ ).then.to_return(status: 201)
200
+ end
201
+
202
+ it "should return response" do
203
+ response = subject.request(:get, "/")
204
+ assert_equal "", response.body
205
+ end
206
+ end
207
+
208
+ describe "with server error repeatedly" do
154
209
  before do
155
210
  stub_request(:get, "https://api:key@api.tinify.com").to_return(
156
211
  status: 584,
@@ -171,7 +226,21 @@ describe Tinify::Client do
171
226
  end
172
227
  end
173
228
 
174
- describe "with bad server response" do
229
+ describe "with bad server response once" do
230
+ before do
231
+ stub_request(:get, "https://api:key@api.tinify.com").to_return(
232
+ status: 543,
233
+ body: '<!-- this is not json -->'
234
+ ).then.to_return(status: 201)
235
+ end
236
+
237
+ it "should return response" do
238
+ response = subject.request(:get, "/")
239
+ assert_equal "", response.body
240
+ end
241
+ end
242
+
243
+ describe "with bad server response repeatedly" do
175
244
  before do
176
245
  stub_request(:get, "https://api:key@api.tinify.com").to_return(
177
246
  status: 543,
@@ -197,7 +266,7 @@ describe Tinify::Client do
197
266
  stub_request(:get, "https://api:key@api.tinify.com").to_return(
198
267
  status: 492,
199
268
  body: '{"error":"BadRequest","message":"Oops!"}'
200
- )
269
+ ).then.to_return(status: 201)
201
270
  end
202
271
 
203
272
  it "should raise client error" do
@@ -213,12 +282,13 @@ describe Tinify::Client do
213
282
  end
214
283
  end
215
284
 
285
+
216
286
  describe "with bad credentials" do
217
287
  before do
218
288
  stub_request(:get, "https://api:key@api.tinify.com").to_return(
219
289
  status: 401,
220
290
  body: '{"error":"Unauthorized","message":"Oops!"}'
221
- )
291
+ ).then.to_return(status: 201)
222
292
  end
223
293
 
224
294
  it "should raise account error" do
@@ -0,0 +1,17 @@
1
+ #!/bin/sh
2
+ dir=lib/data
3
+
4
+ cert=0
5
+ curl https://curl.haxx.se/ca/cacert.pem | while read line; do
6
+ if [ "-----BEGIN CERTIFICATE-----" == "$line" ]; then
7
+ cert=1
8
+ echo $line
9
+ elif [ "-----END CERTIFICATE-----" == "$line" ]; then
10
+ cert=0
11
+ echo $line
12
+ else
13
+ if [ $cert == 1 ]; then
14
+ echo $line
15
+ fi
16
+ fi
17
+ done > $dir/cacert.pem
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tinify
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rolf Timmermans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-21 00:00:00.000000000 Z
11
+ date: 2017-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -89,6 +89,7 @@ extensions: []
89
89
  extra_rdoc_files: []
90
90
  files:
91
91
  - ".travis.yml"
92
+ - CHANGES.md
92
93
  - Gemfile
93
94
  - Gemfile.lock
94
95
  - LICENSE
@@ -112,6 +113,7 @@ files:
112
113
  - test/tinify_source_test.rb
113
114
  - test/tinify_test.rb
114
115
  - tinify.gemspec
116
+ - update-cacert.sh
115
117
  homepage: https://tinify.com/developers
116
118
  licenses:
117
119
  - MIT