contentful 1.2.2 → 2.0.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 +4 -4
- data/CHANGELOG.md +21 -0
- data/LICENSE.txt +1 -0
- data/README.md +8 -0
- data/contentful.gemspec +2 -1
- data/examples/custom_classes.rb +23 -26
- data/examples/raise_errors.rb +2 -2
- data/lib/contentful.rb +0 -1
- data/lib/contentful/array.rb +27 -19
- data/lib/contentful/array_like.rb +51 -0
- data/lib/contentful/asset.rb +43 -11
- data/lib/contentful/base_resource.rb +87 -0
- data/lib/contentful/client.rb +43 -34
- data/lib/contentful/coercions.rb +116 -0
- data/lib/contentful/content_type.rb +23 -8
- data/lib/contentful/content_type_cache.rb +26 -0
- data/lib/contentful/deleted_asset.rb +2 -5
- data/lib/contentful/deleted_entry.rb +2 -5
- data/lib/contentful/entry.rb +55 -33
- data/lib/contentful/error.rb +1 -1
- data/lib/contentful/field.rb +37 -9
- data/lib/contentful/fields_resource.rb +115 -0
- data/lib/contentful/file.rb +7 -8
- data/lib/contentful/link.rb +3 -6
- data/lib/contentful/locale.rb +6 -6
- data/lib/contentful/location.rb +7 -5
- data/lib/contentful/resource_builder.rb +72 -226
- data/lib/contentful/space.rb +16 -6
- data/lib/contentful/support.rb +41 -3
- data/lib/contentful/sync_page.rb +17 -10
- data/lib/contentful/version.rb +1 -1
- data/spec/array_spec.rb +4 -8
- data/spec/client_class_spec.rb +12 -23
- data/spec/client_configuration_spec.rb +13 -23
- data/spec/content_type_spec.rb +0 -5
- data/spec/entry_spec.rb +130 -125
- data/spec/error_requests_spec.rb +1 -1
- data/spec/field_spec.rb +0 -5
- data/spec/file_spec.rb +0 -5
- data/spec/fixtures/vcr_cassettes/entry.yml +54 -64
- data/spec/fixtures/vcr_cassettes/entry/include_resolution.yml +101 -0
- data/spec/fixtures/vcr_cassettes/entry/marshall.yml +227 -251
- data/spec/fixtures/vcr_cassettes/entry/raw.yml +88 -124
- data/spec/fixtures/vcr_cassettes/entry_locales.yml +56 -74
- data/spec/fixtures/vcr_cassettes/human.yml +63 -40
- data/spec/fixtures/vcr_cassettes/location.yml +99 -211
- data/spec/fixtures/vcr_cassettes/multi_locale_array_reference.yml +12 -16
- data/spec/fixtures/vcr_cassettes/not_found.yml +26 -21
- data/spec/fixtures/vcr_cassettes/nyancat.yml +53 -63
- data/spec/fixtures/vcr_cassettes/ratelimit.yml +1 -1
- data/spec/fixtures/vcr_cassettes/reloaded_entry.yml +54 -64
- data/spec/fixtures/vcr_cassettes/unauthorized.yml +1 -1
- data/spec/fixtures/vcr_cassettes/unavailable.yml +27 -15
- data/spec/link_spec.rb +3 -2
- data/spec/locale_spec.rb +0 -5
- data/spec/location_spec.rb +1 -6
- data/spec/request_spec.rb +3 -2
- data/spec/resource_building_spec.rb +10 -7
- data/spec/response_spec.rb +1 -1
- data/spec/space_spec.rb +0 -5
- data/spec/spec_helper.rb +3 -0
- data/spec/support/json_responses.rb +3 -3
- data/spec/sync_page_spec.rb +1 -6
- data/spec/sync_spec.rb +11 -7
- metadata +69 -20
- data/examples/dynamic_entries.rb +0 -124
- data/examples/resource_mapping.rb +0 -32
- data/lib/contentful/constants.rb +0 -504
- data/lib/contentful/dynamic_entry.rb +0 -57
- data/lib/contentful/resource.rb +0 -239
- data/lib/contentful/resource/array_like.rb +0 -39
- data/lib/contentful/resource/asset_fields.rb +0 -58
- data/lib/contentful/resource/custom_resource.rb +0 -29
- data/lib/contentful/resource/fields.rb +0 -73
- data/lib/contentful/resource/system_properties.rb +0 -55
- data/spec/coercions_spec.rb +0 -23
- data/spec/dynamic_entry_spec.rb +0 -75
- data/spec/resource_spec.rb +0 -79
data/lib/contentful/space.rb
CHANGED
@@ -1,14 +1,24 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'base_resource'
|
2
2
|
require_relative 'locale'
|
3
3
|
|
4
4
|
module Contentful
|
5
5
|
# Resource class for Space.
|
6
6
|
# https://www.contentful.com/developers/documentation/content-delivery-api/#spaces
|
7
|
-
class Space
|
8
|
-
|
9
|
-
include Contentful::Resource::SystemProperties
|
7
|
+
class Space < BaseResource
|
8
|
+
attr_reader :name, :locales
|
10
9
|
|
11
|
-
|
12
|
-
|
10
|
+
def initialize(item, *)
|
11
|
+
super
|
12
|
+
|
13
|
+
@name = item.fetch('name', nil)
|
14
|
+
@locales = item.fetch('locales', []).map { |locale| Locale.new(locale) }
|
15
|
+
end
|
16
|
+
|
17
|
+
# @private
|
18
|
+
def reload(client = nil)
|
19
|
+
return client.space unless client.nil?
|
20
|
+
|
21
|
+
false
|
22
|
+
end
|
13
23
|
end
|
14
24
|
end
|
data/lib/contentful/support.rb
CHANGED
@@ -8,17 +8,55 @@ module Contentful
|
|
8
8
|
#
|
9
9
|
# @return [String] snake_case_name
|
10
10
|
def snakify(object)
|
11
|
-
|
12
|
-
|
11
|
+
String(object)
|
12
|
+
.gsub(/::/, '/')
|
13
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
14
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
15
|
+
.tr('-', '_')
|
16
|
+
.downcase
|
13
17
|
end
|
14
18
|
|
15
19
|
# Returns true if resource is localized
|
16
20
|
#
|
17
|
-
# @return [
|
21
|
+
# @return [true, false]
|
18
22
|
def localized?(value)
|
19
23
|
return false unless value.is_a? ::Hash
|
20
24
|
value.keys.any? { |possible_locale| Contentful::Constants::KNOWN_LOCALES.include?(possible_locale) }
|
21
25
|
end
|
26
|
+
|
27
|
+
# Checks if value is a link
|
28
|
+
#
|
29
|
+
# @param value
|
30
|
+
#
|
31
|
+
# @return [true, false]
|
32
|
+
def link?(value)
|
33
|
+
value.is_a?(::Hash) &&
|
34
|
+
value.fetch('sys', {}).fetch('type', '') == 'Link'
|
35
|
+
end
|
36
|
+
|
37
|
+
# Checks if value is an array of links
|
38
|
+
#
|
39
|
+
# @param value
|
40
|
+
#
|
41
|
+
# @return [true, false]
|
42
|
+
def link_array?(value)
|
43
|
+
return link?(value[0]) if value.is_a?(::Array) && !value.empty?
|
44
|
+
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the resource that matches the link
|
49
|
+
#
|
50
|
+
# @param [Hash] link
|
51
|
+
# @param [::Array] includes
|
52
|
+
#
|
53
|
+
# @return [Hash]
|
54
|
+
def resource_for_link(link, includes)
|
55
|
+
includes.detect do |i|
|
56
|
+
i['sys']['id'] == link['sys']['id'] &&
|
57
|
+
i['sys']['type'] == link['sys']['linkType']
|
58
|
+
end
|
59
|
+
end
|
22
60
|
end
|
23
61
|
end
|
24
62
|
end
|
data/lib/contentful/sync_page.rb
CHANGED
@@ -1,18 +1,25 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative '
|
1
|
+
require_relative 'base_resource'
|
2
|
+
require_relative 'array_like'
|
3
3
|
|
4
4
|
module Contentful
|
5
5
|
# Wrapper Class for Sync results
|
6
|
-
class SyncPage
|
7
|
-
|
6
|
+
class SyncPage < BaseResource
|
7
|
+
include Contentful::ArrayLike
|
8
8
|
|
9
|
-
|
10
|
-
include Contentful::Resource::SystemProperties
|
11
|
-
include Contentful::Resource::ArrayLike
|
9
|
+
attr_reader :sync, :items, :next_sync_url, :next_page_url
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
def initialize(item, default_locale, *)
|
12
|
+
super(item, { default_locale: default_locale }, true)
|
13
|
+
|
14
|
+
@items = item.fetch('items', [])
|
15
|
+
@next_sync_url = item.fetch('nextSyncUrl', nil)
|
16
|
+
@next_page_url = item.fetch('nextPageUrl', nil)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @private
|
20
|
+
def inspect
|
21
|
+
"<#{repr_name} next_sync_url='#{next_sync_url}' last_page=#{last_page?}>"
|
22
|
+
end
|
16
23
|
|
17
24
|
# Requests next sync page from API
|
18
25
|
#
|
data/lib/contentful/version.rb
CHANGED
data/spec/array_spec.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Contentful::Array do
|
4
|
-
let(:
|
4
|
+
let(:client) { create_client }
|
5
|
+
let(:array) { vcr('array') { client.content_types } }
|
5
6
|
|
6
7
|
describe 'SystemProperties' do
|
7
8
|
it 'has a #sys getter returning a hash with symbol keys' do
|
@@ -15,11 +16,6 @@ describe Contentful::Array do
|
|
15
16
|
end
|
16
17
|
|
17
18
|
describe 'Properties' do
|
18
|
-
it 'has a #properties getter returning a hash with symbol keys' do
|
19
|
-
expect(array.properties).to be_a Hash
|
20
|
-
expect(array.properties.keys.sample).to be_a Symbol
|
21
|
-
end
|
22
|
-
|
23
19
|
it 'has #total' do
|
24
20
|
expect(array.total).to eq 4
|
25
21
|
end
|
@@ -34,7 +30,7 @@ describe Contentful::Array do
|
|
34
30
|
|
35
31
|
it 'has #items which contain resources' do
|
36
32
|
expect(array.items).to be_a Array
|
37
|
-
expect(array.items.sample).to be_a Contentful::
|
33
|
+
expect(array.items.sample).to be_a Contentful::BaseResource
|
38
34
|
end
|
39
35
|
end
|
40
36
|
|
@@ -55,7 +51,7 @@ describe Contentful::Array do
|
|
55
51
|
describe '#next_page' do
|
56
52
|
it 'requests more of the same content from the server, using its limit and skip values' do
|
57
53
|
array_page_1 = vcr('array_page_1') { create_client.content_types(skip: 3, limit: 2) }
|
58
|
-
array_page_2 = vcr('array_page_2') { array_page_1.next_page }
|
54
|
+
array_page_2 = vcr('array_page_2') { array_page_1.next_page(client) }
|
59
55
|
|
60
56
|
expect(array_page_2).to be_a Contentful::Array
|
61
57
|
expect(array_page_2.limit).to eq 2
|
data/spec/client_class_spec.rb
CHANGED
@@ -6,50 +6,39 @@ describe Contentful::Client do
|
|
6
6
|
let(:proxy_client) { create_client(proxy_host: '183.207.232.194',
|
7
7
|
proxy_port: 8080,
|
8
8
|
secure: false) }
|
9
|
-
let(:request)
|
10
|
-
Contentful::Request.new(nil, '/content_types', nil, 'cat')
|
11
|
-
end
|
9
|
+
let(:request) { Contentful::Request.new(nil, '/content_types', nil, 'cat') }
|
12
10
|
|
13
11
|
it 'uses #base_url' do
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
expect(client).to receive(:base_url).and_call_original
|
13
|
+
|
14
|
+
vcr('content_type') {
|
15
|
+
client.get(request)
|
16
|
+
}
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'uses #request_headers' do
|
20
|
-
|
21
|
-
{
|
22
|
-
'User-Agent' => 'RubyContentfulGem/0.1.0',
|
23
|
-
'Authorization' => 'Bearer b4c0n73n7fu1',
|
24
|
-
'Content-Type' => 'application/vnd.contentful.delivery.v1+json',
|
25
|
-
}
|
26
|
-
end
|
20
|
+
expect(client).to receive(:request_headers).and_call_original
|
27
21
|
vcr('content_type') { client.get(request) }
|
28
|
-
expect(client).to have_received.request_headers
|
29
22
|
end
|
30
23
|
|
31
24
|
it 'uses Request#url' do
|
32
|
-
|
25
|
+
expect(request).to receive(:url).and_call_original
|
33
26
|
vcr('content_type') { client.get(request) }
|
34
|
-
expect(request).to have_received.url
|
35
27
|
end
|
36
28
|
|
37
29
|
it 'uses Request#query' do
|
38
|
-
|
30
|
+
expect(request).to receive(:query).twice.and_call_original
|
39
31
|
vcr('content_type') { client.get(request) }
|
40
|
-
expect(request).to have_received.query
|
41
32
|
end
|
42
33
|
|
43
34
|
it 'calls #get_http' do
|
44
|
-
|
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') }
|
45
36
|
client.get(request)
|
46
|
-
expect(client.class).to have_received.get_http(client.base_url + request.url, request.query, client.request_headers, client.proxy_params)
|
47
37
|
end
|
48
38
|
|
49
39
|
it 'calls #get_http via proxy' do
|
50
|
-
|
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') }
|
51
41
|
proxy_client.get(request)
|
52
|
-
expect(proxy_client.class).to have_received.get_http(proxy_client.base_url + request.url, request.query, proxy_client.request_headers, proxy_client.proxy_params)
|
53
42
|
expect(proxy_client.proxy_params[:host]).to eq '183.207.232.194'
|
54
43
|
expect(proxy_client.proxy_params[:port]).to eq 8080
|
55
44
|
end
|
@@ -57,7 +46,7 @@ describe Contentful::Client do
|
|
57
46
|
describe 'build_resources parameter' do
|
58
47
|
it 'returns Contentful::Resource object if second parameter is true [default]' do
|
59
48
|
res = vcr('content_type') { client.get(request) }
|
60
|
-
expect(res).to be_a Contentful::
|
49
|
+
expect(res).to be_a Contentful::BaseResource
|
61
50
|
end
|
62
51
|
|
63
52
|
it 'returns a Contentful::Response object if second parameter is not true' do
|
@@ -34,7 +34,7 @@ describe 'Client Configuration Options' do
|
|
34
34
|
describe ':raise_errors' do
|
35
35
|
it 'will raise response errors if set to true [default]' do
|
36
36
|
expect_vcr('not found')do
|
37
|
-
create_client.
|
37
|
+
create_client.content_type 'not found'
|
38
38
|
end.to raise_error Contentful::NotFound
|
39
39
|
end
|
40
40
|
|
@@ -42,16 +42,15 @@ describe 'Client Configuration Options' do
|
|
42
42
|
res = nil
|
43
43
|
|
44
44
|
expect_vcr('not found')do
|
45
|
-
res = create_client(raise_errors: false).
|
45
|
+
res = create_client(raise_errors: false).content_type 'not found'
|
46
46
|
end.not_to raise_error
|
47
47
|
expect(res).to be_instance_of Contentful::NotFound
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
describe ':dynamic_entries' do
|
52
|
-
|
53
|
-
|
54
|
-
expect(entry).not_to be_a Contentful::DynamicEntry
|
52
|
+
before :each do
|
53
|
+
Contentful::ContentTypeCache.clear!
|
55
54
|
end
|
56
55
|
|
57
56
|
it 'will create dynamic entries if dynamic_entry_cache is not empty' do
|
@@ -59,24 +58,22 @@ describe 'Client Configuration Options' do
|
|
59
58
|
vcr('entry_cache') { client.update_dynamic_entry_cache! }
|
60
59
|
entry = vcr('nyancat') { client.entry('nyancat') }
|
61
60
|
|
62
|
-
expect(entry).to be_a Contentful::
|
61
|
+
expect(entry).to be_a Contentful::Entry
|
63
62
|
end
|
64
63
|
|
65
64
|
context ':auto' do
|
66
65
|
it 'will call update dynamic_entry_cache on start-up' do
|
67
|
-
|
66
|
+
vcr('entry_cache') do
|
68
67
|
create_client(dynamic_entries: :auto)
|
69
68
|
end
|
70
|
-
expect(
|
71
|
-
expect(client.dynamic_entry_cache.values.first.ancestors).to \
|
72
|
-
include Contentful::DynamicEntry
|
69
|
+
expect(Contentful::ContentTypeCache.cache).not_to be_empty
|
73
70
|
end
|
74
71
|
end
|
75
72
|
|
76
73
|
context ':manual' do
|
77
74
|
it 'will not call #update_dynamic_entry_cache! on start-up' do
|
78
|
-
|
79
|
-
expect(
|
75
|
+
create_client(dynamic_entries: :manual)
|
76
|
+
expect(Contentful::ContentTypeCache.cache).to be_empty
|
80
77
|
end
|
81
78
|
end
|
82
79
|
|
@@ -84,18 +81,15 @@ describe 'Client Configuration Options' do
|
|
84
81
|
let(:client) { create_client(dynamic_entries: :manual) }
|
85
82
|
|
86
83
|
it 'will fetch all content_types' do
|
87
|
-
|
84
|
+
expect(client).to receive(:content_types).with(limit: 1000) { {} }
|
88
85
|
client.update_dynamic_entry_cache!
|
89
|
-
expect(client).to have_received.content_types(limit: 1000)
|
90
86
|
end
|
91
87
|
|
92
88
|
it 'will save dynamic entries in @dynamic_entry_cache' do
|
93
89
|
vcr('entry_cache')do
|
94
90
|
client.update_dynamic_entry_cache!
|
95
91
|
end
|
96
|
-
expect(
|
97
|
-
expect(client.dynamic_entry_cache.values.first.ancestors).to \
|
98
|
-
include Contentful::DynamicEntry
|
92
|
+
expect(Contentful::ContentTypeCache.cache).not_to be_empty
|
99
93
|
end
|
100
94
|
end
|
101
95
|
|
@@ -104,12 +98,9 @@ describe 'Client Configuration Options' do
|
|
104
98
|
|
105
99
|
it 'can be used to register a dynamic entry manually' do
|
106
100
|
cat = vcr('content_type') { client.content_type 'cat' }
|
107
|
-
|
108
|
-
client.register_dynamic_entry 'cat', CatEntry
|
101
|
+
client.register_dynamic_entry 'cat', cat
|
109
102
|
|
110
|
-
|
111
|
-
expect(entry).to be_a Contentful::DynamicEntry
|
112
|
-
expect(entry).to be_a CatEntry
|
103
|
+
expect(Contentful::ContentTypeCache.cache).not_to be_empty
|
113
104
|
end
|
114
105
|
end
|
115
106
|
end
|
@@ -197,7 +188,6 @@ describe 'Client Configuration Options' do
|
|
197
188
|
describe ':entry_mapping' do
|
198
189
|
it 'lets you register your own entry classes for certain entry types' do
|
199
190
|
class Cat < Contentful::Entry
|
200
|
-
# define methods based on :fields, etc
|
201
191
|
end
|
202
192
|
|
203
193
|
client = create_client(
|
data/spec/content_type_spec.rb
CHANGED
@@ -19,11 +19,6 @@ describe Contentful::ContentType do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
describe 'Properties' do
|
22
|
-
it 'has a #properties getter returning a hash with symbol keys' do
|
23
|
-
expect(content_type.properties).to be_a Hash
|
24
|
-
expect(content_type.properties.keys.sample).to be_a Symbol
|
25
|
-
end
|
26
|
-
|
27
22
|
it 'has #name' do
|
28
23
|
expect(content_type.name).to eq 'Cat'
|
29
24
|
end
|
data/spec/entry_spec.rb
CHANGED
@@ -46,20 +46,20 @@ describe Contentful::Entry do
|
|
46
46
|
|
47
47
|
it "contains the entry's fields" do
|
48
48
|
expect(entry.fields[:color]).to eq 'rainbow'
|
49
|
-
expect(entry.fields[:
|
49
|
+
expect(entry.fields[:best_friend]).to be_a Contentful::Entry
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
describe 'multiple locales' do
|
54
54
|
it 'can handle multiple locales' do
|
55
55
|
vcr('entry_locales') {
|
56
|
-
|
57
|
-
expect(
|
58
|
-
expect(
|
56
|
+
nyancat = create_client.entries(locale: "*", 'sys.id' => 'nyancat').items.first
|
57
|
+
expect(nyancat.fields('en-US')[:name]).to eq "Nyan Cat"
|
58
|
+
expect(nyancat.fields('tlh')[:name]).to eq "Nyan vIghro'"
|
59
59
|
|
60
60
|
|
61
|
-
expect(
|
62
|
-
expect(
|
61
|
+
expect(nyancat.fields(:'en-US')[:name]).to eq "Nyan Cat"
|
62
|
+
expect(nyancat.fields(:tlh)[:name]).to eq "Nyan vIghro'"
|
63
63
|
}
|
64
64
|
end
|
65
65
|
|
@@ -74,10 +74,10 @@ describe Contentful::Entry do
|
|
74
74
|
|
75
75
|
it 'can handle entries with multiple locales' do
|
76
76
|
vcr('entry_locales') {
|
77
|
-
nyancat = create_client.entries(locale: "*").items.first
|
77
|
+
nyancat = create_client.entries(locale: "*", 'sys.id' => 'nyancat').items.first
|
78
78
|
expect(nyancat.fields_with_locales[:name].size).to eq(2)
|
79
79
|
expect(nyancat.fields_with_locales[:name][:'en-US']).to eq("Nyan Cat")
|
80
|
-
expect(nyancat.fields_with_locales[:name][:
|
80
|
+
expect(nyancat.fields_with_locales[:name][:tlh]).to eq("Nyan vIghro'")
|
81
81
|
}
|
82
82
|
end
|
83
83
|
|
@@ -128,133 +128,51 @@ describe Contentful::Entry do
|
|
128
128
|
it '#raw' do
|
129
129
|
vcr('entry/raw') {
|
130
130
|
nyancat = create_client.entry('nyancat')
|
131
|
-
expect(nyancat.raw).to eq(create_client(raw_mode: true).entry('nyancat').object)
|
131
|
+
expect(nyancat.raw).to eq(create_client(raw_mode: true).entry('nyancat').object['items'].first)
|
132
132
|
}
|
133
133
|
end
|
134
134
|
|
135
|
-
describe '
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
property :title
|
140
|
-
property :slug
|
141
|
-
property :image
|
142
|
-
property :top
|
143
|
-
property :subcategories
|
144
|
-
property :featuredArticles
|
145
|
-
property :catIntroHead
|
146
|
-
property :catIntroduction
|
147
|
-
property :seoText
|
148
|
-
property :metaKeywords
|
149
|
-
property :metaDescription
|
150
|
-
property :metaRobots
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'maps fields properly' do
|
154
|
-
vcr('entry/custom_resource') {
|
155
|
-
entry = create_client(
|
156
|
-
space: 'g2b4ltw00meh',
|
157
|
-
dynamic_entries: :auto,
|
158
|
-
entry_mapping: {
|
159
|
-
'kategorie' => Kategorie
|
160
|
-
}
|
161
|
-
).entries.first
|
162
|
-
|
163
|
-
expect(entry).to be_a Kategorie
|
164
|
-
expect(entry.title).to eq "Some Title"
|
165
|
-
expect(entry.slug).to eq "/asda.html"
|
166
|
-
expect(entry.featured_articles.first.is_a?(Contentful::Entry)).to be_truthy
|
167
|
-
expect(entry.top).to be_truthy
|
168
|
-
}
|
169
|
-
end
|
170
|
-
|
171
|
-
describe 'can be marshalled' do
|
172
|
-
class Cat < Contentful::Entry
|
173
|
-
include ::Contentful::Resource::CustomResource
|
174
|
-
|
175
|
-
property :name
|
176
|
-
property :lives
|
177
|
-
property :bestFriend, Cat
|
178
|
-
property :catPack
|
179
|
-
property :image, Contentful::Asset
|
180
|
-
end
|
181
|
-
|
182
|
-
def test_dump(nyancat)
|
183
|
-
dump = Marshal.dump(nyancat)
|
184
|
-
new_cat = Marshal.load(dump)
|
185
|
-
|
186
|
-
# Attributes
|
187
|
-
expect(new_cat).to be_a Cat
|
188
|
-
expect(new_cat.name).to eq "Nyan Cat"
|
189
|
-
expect(new_cat.lives).to eq 1337
|
190
|
-
|
191
|
-
# Single linked objects
|
192
|
-
expect(new_cat.best_friend).to be_a Cat
|
193
|
-
expect(new_cat.best_friend.name).to eq "Happy Cat"
|
135
|
+
describe 'can be marshalled' do
|
136
|
+
def test_dump(nyancat)
|
137
|
+
dump = Marshal.dump(nyancat)
|
138
|
+
new_cat = Marshal.load(dump)
|
194
139
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
140
|
+
# Attributes
|
141
|
+
expect(new_cat).to be_a Contentful::Entry
|
142
|
+
expect(new_cat.name).to eq "Nyan Cat"
|
143
|
+
expect(new_cat.lives).to eq 1337
|
199
144
|
|
200
|
-
|
201
|
-
|
202
|
-
|
145
|
+
# Single linked objects
|
146
|
+
expect(new_cat.best_friend).to be_a Contentful::Entry
|
147
|
+
expect(new_cat.best_friend.name).to eq "Happy Cat"
|
203
148
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
149
|
+
# Array of linked objects
|
150
|
+
expect(new_cat.cat_pack.count).to eq 2
|
151
|
+
expect(new_cat.cat_pack[0].name).to eq "Happy Cat"
|
152
|
+
expect(new_cat.cat_pack[1].name).to eq "Worried Cat"
|
208
153
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
expect(new_cat.cat_pack.first.cat_pack[1].name).to eq "Worried Cat"
|
154
|
+
# Nested Links
|
155
|
+
expect(new_cat.best_friend.best_friend).to be_a Contentful::Entry
|
156
|
+
expect(new_cat.best_friend.best_friend.name).to eq "Nyan Cat"
|
213
157
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
it 'using entry_mapping' do
|
218
|
-
vcr('entry/marshall') {
|
219
|
-
nyancat = create_client(entry_mapping: {'cat' => Cat}).entries(include: 2, 'sys.id' => 'nyancat').first
|
220
|
-
test_dump(nyancat)
|
221
|
-
}
|
222
|
-
end
|
223
|
-
|
224
|
-
it 'using resource_mapping' do
|
225
|
-
vcr('entry/marshall') {
|
226
|
-
nyancat = create_client(resource_mapping: {
|
227
|
-
'Entry' => ->(_json_object) do
|
228
|
-
return Cat if _json_object.fetch('sys', {}).fetch('contentType', {}).fetch('sys', {}).fetch('id', nil) == 'cat'
|
229
|
-
Contentful::Entry
|
230
|
-
end
|
231
|
-
}).entries(include: 2, 'sys.id' => 'nyancat').first
|
232
|
-
test_dump(nyancat)
|
233
|
-
}
|
234
|
-
end
|
158
|
+
# Asset
|
159
|
+
expect(new_cat.image.file.url).to eq "//images.contentful.com/cfexampleapi/4gp6taAwW4CmSgumq2ekUm/9da0cd1936871b8d72343e895a00d611/Nyan_cat_250px_frame.png"
|
160
|
+
end
|
235
161
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
end
|
243
|
-
}).entries(include: 2, 'sys.id' => 'nyancat').first
|
244
|
-
|
245
|
-
# The double load/dump is on purpose
|
246
|
-
test_dump(Marshal.load(Marshal.dump(nyancat)))
|
247
|
-
}
|
248
|
-
end
|
162
|
+
it 'marshals properly' do
|
163
|
+
vcr('entry/marshall') {
|
164
|
+
nyancat = create_client(gzip_encoded: false, max_include_resolution_depth: 2).entries(include: 2, 'sys.id' => 'nyancat').first
|
165
|
+
test_dump(nyancat)
|
166
|
+
}
|
167
|
+
end
|
249
168
|
|
250
|
-
|
251
|
-
|
169
|
+
it 'can remarshall an unmarshalled object' do
|
170
|
+
vcr('entry/marshall') {
|
171
|
+
nyancat = create_client(max_include_resolution_depth: 2).entries(include: 2, 'sys.id' => 'nyancat').first
|
252
172
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
expect(entry).to respond_to :cat_pack
|
257
|
-
end
|
173
|
+
# The double load/dump is on purpose
|
174
|
+
test_dump(Marshal.load(Marshal.dump(nyancat)))
|
175
|
+
}
|
258
176
|
end
|
259
177
|
end
|
260
178
|
|
@@ -314,15 +232,102 @@ describe Contentful::Entry do
|
|
314
232
|
end
|
315
233
|
end
|
316
234
|
|
235
|
+
describe 'include resolution' do
|
236
|
+
it 'defaults to 20 depth' do
|
237
|
+
vcr('entry/include_resolution') {
|
238
|
+
entry = create_client.entry('nyancat', include: 2)
|
239
|
+
|
240
|
+
expect(entry.best_friend.name).to eq 'Happy Cat'
|
241
|
+
expect(entry
|
242
|
+
.best_friend.best_friend
|
243
|
+
.best_friend.best_friend
|
244
|
+
.best_friend.best_friend
|
245
|
+
.best_friend.best_friend
|
246
|
+
.best_friend.best_friend
|
247
|
+
.best_friend.best_friend
|
248
|
+
.best_friend.best_friend
|
249
|
+
.best_friend.best_friend
|
250
|
+
.best_friend.best_friend
|
251
|
+
.best_friend.best_friend.name).to eq 'Nyan Cat'
|
252
|
+
|
253
|
+
expect(entry
|
254
|
+
.best_friend.best_friend
|
255
|
+
.best_friend.best_friend
|
256
|
+
.best_friend.best_friend
|
257
|
+
.best_friend.best_friend
|
258
|
+
.best_friend.best_friend
|
259
|
+
.best_friend.best_friend
|
260
|
+
.best_friend.best_friend
|
261
|
+
.best_friend.best_friend
|
262
|
+
.best_friend.best_friend
|
263
|
+
.best_friend.best_friend
|
264
|
+
.best_friend).to be_a ::Contentful::Link
|
265
|
+
}
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'can be configured arbitrarily' do
|
269
|
+
vcr('entry/include_resolution') {
|
270
|
+
entry = create_client(max_include_resolution_depth: 3).entry('nyancat', include: 2)
|
271
|
+
|
272
|
+
expect(entry.best_friend.name).to eq 'Happy Cat'
|
273
|
+
expect(entry
|
274
|
+
.best_friend.best_friend
|
275
|
+
.best_friend.name).to eq 'Happy Cat'
|
276
|
+
expect(entry
|
277
|
+
.best_friend.best_friend
|
278
|
+
.best_friend.best_friend).to be_a ::Contentful::Link
|
279
|
+
}
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
317
283
|
describe 'issues' do
|
318
284
|
it 'Symbol/Text field with null values should be serialized as nil - #117' do
|
319
285
|
vcr('entries/issue_117') {
|
320
|
-
client = create_client(space: '8jbbayggj9gj', access_token: '4ce0108f04e55c76476ba84ab0e6149734db73d67cd1b429323ef67f00977e07'
|
286
|
+
client = create_client(space: '8jbbayggj9gj', access_token: '4ce0108f04e55c76476ba84ab0e6149734db73d67cd1b429323ef67f00977e07')
|
321
287
|
entry = client.entries.first
|
322
288
|
|
323
289
|
expect(entry.nil).to be_nil
|
324
290
|
expect(entry.nil).not_to eq ''
|
325
291
|
}
|
326
292
|
end
|
293
|
+
|
294
|
+
describe 'JSON Fields should not be treated as locale data - #96' do
|
295
|
+
before do
|
296
|
+
vcr('entry/json_objects_client') {
|
297
|
+
@client = create_client(
|
298
|
+
space: 'h425t6gef30p',
|
299
|
+
access_token: '278f7aa72f2eb90c0e002d60f85bf2144c925acd2d37dd990d3ca274f25076cf',
|
300
|
+
dynamic_entries: :auto
|
301
|
+
)
|
302
|
+
|
303
|
+
}
|
304
|
+
vcr('entry/json_objects') {
|
305
|
+
@entry = @client.entries.first
|
306
|
+
}
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'only has default locale' do
|
310
|
+
expect(@entry.locales).to eq ['en-US']
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'can obtain all values properly' do
|
314
|
+
expect(@entry.name).to eq('Test')
|
315
|
+
expect(@entry.object_test).to eq({
|
316
|
+
null: nil,
|
317
|
+
text: 'some text',
|
318
|
+
array: [1, 2, 3],
|
319
|
+
number: 123,
|
320
|
+
boolean: true,
|
321
|
+
object: {
|
322
|
+
null: nil,
|
323
|
+
text: 'bar',
|
324
|
+
array: [1, 2, 3],
|
325
|
+
number: 123,
|
326
|
+
boolean: false,
|
327
|
+
object: {foo: 'bar'}
|
328
|
+
}
|
329
|
+
})
|
330
|
+
end
|
331
|
+
end
|
327
332
|
end
|
328
333
|
end
|