contentful 2.11.1 → 2.12.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1fbecbc8ac849d1c1c4388b0dfcb53db763b237195c03f1e2fbdea09d8544d8
4
- data.tar.gz: acbc31c3bfe0073f945ba181ab16f0bc878327182fc15c7fe222ba8ee4ad11aa
3
+ metadata.gz: ee3c004cc764ee56ec8a0f8a9cf739f5e5ab10e8fda5c327e1708829b8585145
4
+ data.tar.gz: 57d48057485ff6260801e2090bd3dd37e71c1fb6afb53628f1f1e93bc5eabb3f
5
5
  SHA512:
6
- metadata.gz: f1fc0748c09d0bb5a70f26f35ac90805443b87e3a3a71189a08b0c682a846b9fa53de2b4fb1f07c754ccaae81a692a73598b9059c89fe79fad7d4a06911e71ae
7
- data.tar.gz: 786f075c50d8588cddbe9cbe77ec565fb4ad504176a112e522e9e8018e3d0b9f4901848fb91f68833c47c242383e5ed98fa353264d13152179e21f6b9957041a
6
+ metadata.gz: 88eb373835acf4f0cf9d90a48c407fa082efb9e73052c33b0c89c4ed1f685cf37d6ea6f90306a683e2b4f49c972e4aa0f3c5784fe4c2e44a4da0124373d5ec85
7
+ data.tar.gz: 5d7f33c79174fb1867a6509af1c59a76afec8b04d5a3cc557117d0e90cbd394bdd3243522404bba18e210d50aa941c773614a2815f868e1358f28dae0e665898
@@ -19,7 +19,7 @@ AllCops:
19
19
  - Rakefile
20
20
 
21
21
  Metrics/ClassLength:
22
- Max: 250
22
+ Max: 280
23
23
 
24
24
  Style/MutableConstant:
25
25
  Enabled: false
@@ -12,7 +12,7 @@ Metrics/AbcSize:
12
12
 
13
13
  # Offense count: 5
14
14
  Metrics/CyclomaticComplexity:
15
- Max: 8
15
+ Max: 10
16
16
 
17
17
  # Offense count: 1
18
18
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
@@ -28,8 +28,8 @@ Metrics/MethodLength:
28
28
  # Offense count: 2
29
29
  # Configuration parameters: CountComments.
30
30
  Metrics/ModuleLength:
31
- Max: 499
31
+ Max: 500
32
32
 
33
33
  # Offense count: 4
34
34
  Metrics/PerceivedComplexity:
35
- Max: 8
35
+ Max: 10
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 2.12.0
6
+ ### Added
7
+ * Add HTTP timeout configuration. [#196](https://github.com/contentful/contentful.rb/pull/196)
8
+
5
9
  ## 2.11.1
6
10
  ### Fixed
7
11
  * Fixed coercion error when same entry was included more than once in the same RichText field. [#194](https://github.com/contentful/contentful.rb/pull/194)
data/README.md CHANGED
@@ -337,6 +337,21 @@ client = Contentful::Client.new(
337
337
  <td><code>nil</code></td>
338
338
  <td>Password for proxy authentication.</td>
339
339
  </tr>
340
+ <tr>
341
+ <td><code>timeout_read</code></td>
342
+ <td><code>nil</code></td>
343
+ <td>Number of seconds the request waits to read from the server before timing out.</td>
344
+ </tr>
345
+ <tr>
346
+ <td><code>timeout_write</code></td>
347
+ <td><code>nil</code></td>
348
+ <td>Number of seconds the request waits when writing to the server before timing out.</td>
349
+ </tr>
350
+ <tr>
351
+ <td><code>timeout_connect</code></td>
352
+ <td><code>nil</code></td>
353
+ <td>Number of seconds the request waits to connect to the server before timing out.</td>
354
+ </tr>
340
355
  <tr>
341
356
  <td><code>logger</code></td>
342
357
  <td><code>nil</code></td>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'support'
2
4
 
3
5
  module Contentful
@@ -63,12 +65,15 @@ module Contentful
63
65
  end
64
66
  end
65
67
 
68
+ LINKS = %w[space contentType environment].freeze
69
+ TIMESTAMPS = %w[createdAt updatedAt deletedAt].freeze
70
+
66
71
  def hydrate_sys
67
72
  result = {}
68
73
  raw.fetch('sys', {}).each do |k, v|
69
- if %w[space contentType environment].include?(k)
74
+ if LINKS.include?(k)
70
75
  v = build_link(v)
71
- elsif %w[createdAt updatedAt deletedAt].include?(k)
76
+ elsif TIMESTAMPS.include?(k)
72
77
  v = DateTime.parse(v)
73
78
  end
74
79
  result[Support.snakify(k, @configuration[:use_camel_case]).to_sym] = v
@@ -35,6 +35,9 @@ module Contentful
35
35
  proxy_username: nil,
36
36
  proxy_password: nil,
37
37
  proxy_port: nil,
38
+ timeout_connect: nil,
39
+ timeout_read: nil,
40
+ timeout_write: nil,
38
41
  max_rate_limit_retries: 1,
39
42
  max_rate_limit_wait: 60,
40
43
  max_include_resolution_depth: 20,
@@ -49,11 +52,13 @@ module Contentful
49
52
 
50
53
  # Wraps the actual HTTP request via proxy
51
54
  # @private
52
- def self.get_http(url, query, headers = {}, proxy = {})
55
+ def self.get_http(url, query, headers = {}, proxy = {}, timeout = {})
56
+ http = HTTP[headers]
57
+ http = http.timeout(timeout) if timeout.any?
53
58
  if proxy[:host]
54
- HTTP[headers].via(proxy[:host], proxy[:port], proxy[:username], proxy[:password]).get(url, params: query)
59
+ http.via(proxy[:host], proxy[:port], proxy[:username], proxy[:password]).get(url, params: query)
55
60
  else
56
- HTTP[headers].get(url, params: query)
61
+ http.get(url, params: query)
57
62
  end
58
63
  end
59
64
 
@@ -68,6 +73,9 @@ module Contentful
68
73
  # @option given_configuration [String] :proxy_username
69
74
  # @option given_configuration [String] :proxy_password
70
75
  # @option given_configuration [Number] :proxy_port
76
+ # @option given_configuration [Number] :timeout_read
77
+ # @option given_configuration [Number] :timeout_write
78
+ # @option given_configuration [Number] :timeout_connect
71
79
  # @option given_configuration [Number] :max_rate_limit_retries
72
80
  # @option given_configuration [Number] :max_rate_limit_wait
73
81
  # @option given_configuration [Number] :max_include_resolution_depth
@@ -110,6 +118,15 @@ module Contentful
110
118
  }
111
119
  end
112
120
 
121
+ # @private
122
+ def timeout_params
123
+ {
124
+ connect: configuration[:timeout_connect],
125
+ read: configuration[:timeout_read],
126
+ write: configuration[:timeout_write]
127
+ }.reject { |_, value| value.nil? }
128
+ end
129
+
113
130
  # Returns the default configuration
114
131
  # @private
115
132
  def default_configuration
@@ -355,7 +372,8 @@ module Contentful
355
372
  url,
356
373
  request_query(request.query),
357
374
  request_headers,
358
- proxy_params
375
+ proxy_params,
376
+ timeout_params
359
377
  ), request
360
378
  )
361
379
  end
@@ -431,6 +449,7 @@ module Contentful
431
449
  fail ArgumentError, 'The :dynamic_entries mode must be :auto or :manual' unless %i[auto manual].include?(
432
450
  configuration[:dynamic_entries]
433
451
  )
452
+ fail ArgumentError, 'Timeout parameters must be all omitted or all present' unless timeout_params.empty? || timeout_params.length == 3
434
453
  end
435
454
  end
436
455
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'support'
2
4
  require_relative 'base_resource'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contentful
2
4
  # Utility methods used by the contentful gem
3
5
  module Support
@@ -1,5 +1,5 @@
1
1
  # Contentful Namespace
2
2
  module Contentful
3
3
  # Gem Version
4
- VERSION = '2.11.1'
4
+ VERSION = '2.12.0'
5
5
  end
@@ -2,10 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe Contentful::Client do
4
4
  describe '#get' do
5
- let(:client) { create_client }
5
+ let(:client) { create_client() }
6
6
  let(:proxy_client) { create_client(proxy_host: '183.207.232.194',
7
7
  proxy_port: 8080,
8
8
  secure: false) }
9
+ let(:timeout_client) { create_client(timeout_connect: 1, timeout_read: 2, timeout_write: 3) }
9
10
  let(:request) { Contentful::Request.new(nil, client.environment_url('/content_types'), nil, 'cat') }
10
11
 
11
12
  it 'uses #base_url' do
@@ -32,17 +33,37 @@ describe Contentful::Client do
32
33
  end
33
34
 
34
35
  it 'calls #get_http' do
35
- expect(client.class).to receive(:get_http).with(client.base_url + request.url, request.query, client.request_headers, client.proxy_params) { raw_fixture('content_type') }
36
+ expect(client.class).to receive(:get_http).with(client.base_url + request.url, request.query, client.request_headers, client.proxy_params, client.timeout_params) { raw_fixture('content_type') }
36
37
  client.get(request)
37
38
  end
38
39
 
39
40
  it 'calls #get_http via proxy' do
40
- expect(proxy_client.class).to receive(:get_http).with(proxy_client.base_url + request.url, request.query, proxy_client.request_headers, proxy_client.proxy_params) { raw_fixture('content_type') }
41
+ expect(proxy_client.class).to receive(:get_http).with(proxy_client.base_url + request.url, request.query, proxy_client.request_headers, proxy_client.proxy_params, client.timeout_params) { raw_fixture('content_type') }
41
42
  proxy_client.get(request)
42
43
  expect(proxy_client.proxy_params[:host]).to eq '183.207.232.194'
43
44
  expect(proxy_client.proxy_params[:port]).to eq 8080
44
45
  end
45
46
 
47
+ describe 'timeout params' do
48
+ context 'with timeouts configured' do
49
+ it 'calls #get_http with timeouts' do
50
+ expect(timeout_client.class).to receive(:get_http).with(timeout_client.base_url + request.url, request.query, timeout_client.request_headers, timeout_client.proxy_params, timeout_client.timeout_params) { raw_fixture('content_type') }
51
+ timeout_client.get(request)
52
+ expect(timeout_client.timeout_params[:connect]).to eq 1
53
+ expect(timeout_client.timeout_params[:read]).to eq 2
54
+ expect(timeout_client.timeout_params[:write]).to eq 3
55
+ end
56
+ end
57
+
58
+ context 'without timeouts' do
59
+ it 'calls #get_http with timeouts' do
60
+ expect(client.class).to receive(:get_http).with(client.base_url + request.url, request.query, client.request_headers, client.proxy_params, client.timeout_params) { raw_fixture('content_type') }
61
+ client.get(request)
62
+ expect(client.timeout_params).to eq({})
63
+ end
64
+ end
65
+ end
66
+
46
67
  describe 'build_resources parameter' do
47
68
  it 'returns Contentful::Resource object if second parameter is true [default]' do
48
69
  res = vcr('content_type') { client.get(request) }
@@ -347,4 +347,31 @@ describe 'Client Configuration Options' do
347
347
  expect(client.request_headers['X-Contentful-User-Agent']).to eq client.contentful_user_agent
348
348
  end
349
349
  end
350
+
351
+ describe 'timeout options' do
352
+ let(:full_options) { { timeout_connect: 1, timeout_read: 2, timeout_write: 3 } }
353
+
354
+ it 'allows the three options to be present together' do
355
+ expect do
356
+ create_client(full_options)
357
+ end.not_to raise_error
358
+ end
359
+
360
+ it 'allows the three options to be omitted' do
361
+ expect do
362
+ create_client()
363
+ end.not_to raise_error
364
+ end
365
+
366
+ it 'does not allow only some options to be set' do
367
+ # Test that any combination of 1 or 2 keys is rejected
368
+ 1.upto(2) do |options_count|
369
+ full_options.keys.combination(options_count).each do |option_keys|
370
+ expect do
371
+ create_client(full_options.select { |key, _| option_keys.include?(key) })
372
+ end.to raise_error(ArgumentError)
373
+ end
374
+ end
375
+ end
376
+ end
350
377
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contentful
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.1
4
+ version: 2.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Contentful GmbH (Jan Lelis)
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-01-23 00:00:00.000000000 Z
13
+ date: 2019-04-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: http
@@ -532,7 +532,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
532
532
  version: '0'
533
533
  requirements: []
534
534
  rubyforge_project:
535
- rubygems_version: 2.7.6
535
+ rubygems_version: 2.7.8
536
536
  signing_key:
537
537
  specification_version: 4
538
538
  summary: contentful