contentful 1.2.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|