contentful 0.3.4 → 0.3.5
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 +7 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +43 -24
- data/README.md +22 -0
- data/RELEASE.md +8 -0
- data/Rakefile +4 -6
- data/contentful.gemspec +7 -9
- data/examples/custom_classes.rb +1 -2
- data/examples/dynamic_entries.rb +2 -4
- data/examples/example_queries.rb +2 -3
- data/examples/raise_errors.rb +3 -5
- data/examples/raw_mode.rb +2 -3
- data/examples/resource_mapping.rb +3 -4
- data/lib/contentful/array.rb +0 -1
- data/lib/contentful/asset.rb +1 -1
- data/lib/contentful/client.rb +47 -38
- data/lib/contentful/deleted_entry.rb +1 -1
- data/lib/contentful/request.rb +1 -2
- data/lib/contentful/resource.rb +1 -1
- data/lib/contentful/resource/array_like.rb +2 -3
- data/lib/contentful/resource/asset_fields.rb +1 -1
- data/lib/contentful/resource/fields.rb +2 -3
- data/lib/contentful/resource/system_properties.rb +1 -1
- data/lib/contentful/resource_builder.rb +14 -23
- data/lib/contentful/response.rb +40 -35
- data/lib/contentful/sync.rb +1 -3
- data/lib/contentful/sync_page.rb +2 -3
- data/lib/contentful/version.rb +1 -1
- data/spec/array_spec.rb +20 -20
- data/spec/asset_spec.rb +14 -14
- data/spec/auto_includes_spec.rb +4 -4
- data/spec/client_class_spec.rb +22 -24
- data/spec/client_configuration_spec.rb +48 -49
- data/spec/coercions_spec.rb +4 -4
- data/spec/content_type_spec.rb +12 -12
- data/spec/deleted_asset_spec.rb +10 -11
- data/spec/deleted_entry_spec.rb +9 -10
- data/spec/dynamic_entry_spec.rb +11 -11
- data/spec/entry_spec.rb +14 -14
- data/spec/error_class_spec.rb +15 -18
- data/spec/error_requests_spec.rb +6 -7
- data/spec/field_spec.rb +9 -9
- data/spec/file_spec.rb +7 -7
- data/spec/link_spec.rb +14 -14
- data/spec/locale_spec.rb +6 -6
- data/spec/location_spec.rb +10 -10
- data/spec/request_spec.rb +13 -13
- data/spec/resource_building_spec.rb +7 -8
- data/spec/resource_spec.rb +14 -14
- data/spec/response_spec.rb +25 -24
- data/spec/space_spec.rb +10 -10
- data/spec/spec_helper.rb +1 -2
- data/spec/support/json_responses.rb +2 -2
- data/spec/support/vcr.rb +3 -3
- data/spec/sync_page_spec.rb +26 -27
- data/spec/sync_spec.rb +22 -24
- metadata +41 -66
data/lib/contentful/request.rb
CHANGED
@@ -11,7 +11,7 @@ module Contentful
|
|
11
11
|
@absolute = true if @endpoint.start_with?('http')
|
12
12
|
|
13
13
|
@query = if query && !query.empty?
|
14
|
-
|
14
|
+
normalize_query(query)
|
15
15
|
end
|
16
16
|
|
17
17
|
if id
|
@@ -43,7 +43,6 @@ module Contentful
|
|
43
43
|
Marshal.load(Marshal.dump(self))
|
44
44
|
end
|
45
45
|
|
46
|
-
|
47
46
|
private
|
48
47
|
|
49
48
|
def normalize_query(query)
|
data/lib/contentful/resource.rb
CHANGED
@@ -21,7 +21,7 @@ module Contentful
|
|
21
21
|
|
22
22
|
attr_reader :properties, :request, :client, :default_locale
|
23
23
|
|
24
|
-
def initialize(object, request = nil, client = nil, nested_locale_fields = false, default_locale = Contentful::Client::DEFAULT_CONFIGURATION[:default_locale]
|
24
|
+
def initialize(object, request = nil, client = nil, nested_locale_fields = false, default_locale = Contentful::Client::DEFAULT_CONFIGURATION[:default_locale])
|
25
25
|
self.class.update_coercions!
|
26
26
|
@nested_locale_fields = nested_locale_fields
|
27
27
|
@default_locale = default_locale
|
@@ -14,7 +14,7 @@ module Contentful
|
|
14
14
|
def each_item(&block)
|
15
15
|
items.each(&block)
|
16
16
|
end
|
17
|
-
|
17
|
+
alias_method :each, :each_item
|
18
18
|
|
19
19
|
# Delegates to items#empty?
|
20
20
|
def empty?
|
@@ -25,8 +25,7 @@ module Contentful
|
|
25
25
|
def size
|
26
26
|
items.size
|
27
27
|
end
|
28
|
-
|
29
|
-
|
28
|
+
alias_method :length, :size
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
@@ -23,14 +23,13 @@ module Contentful
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
26
|
private
|
28
27
|
|
29
28
|
def extract_fields_from_object!(object)
|
30
29
|
@fields = {}
|
31
30
|
|
32
31
|
if nested_locale_fields?
|
33
|
-
object[
|
32
|
+
object['fields'].each do |field_name, nested_child_object|
|
34
33
|
nested_child_object.each do |object_locale, real_child_object|
|
35
34
|
@fields[object_locale] ||= {}
|
36
35
|
@fields[object_locale].merge! extract_from_object(
|
@@ -39,7 +38,7 @@ module Contentful
|
|
39
38
|
end
|
40
39
|
end
|
41
40
|
else
|
42
|
-
@fields[locale] = extract_from_object object[
|
41
|
+
@fields[locale] = extract_from_object object['fields'], :fields
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
@@ -28,12 +28,11 @@ module Contentful
|
|
28
28
|
|
29
29
|
attr_reader :client, :response, :resource_mapping, :entry_mapping, :resource
|
30
30
|
|
31
|
-
|
32
31
|
def initialize(client, response, resource_mapping = {}, entry_mapping = {}, default_locale = Contentful::Client::DEFAULT_CONFIGURATION[:default_locale])
|
33
32
|
@response = response
|
34
33
|
@client = client
|
35
34
|
@included_resources = {}
|
36
|
-
@known_resources = Hash.new{ |h,k| h[k] = {} }
|
35
|
+
@known_resources = Hash.new { |h, k| h[k] = {} }
|
37
36
|
@nested_locales = false
|
38
37
|
@default_locale = default_locale
|
39
38
|
@resource_mapping = default_resource_mapping.merge(resource_mapping)
|
@@ -43,19 +42,10 @@ module Contentful
|
|
43
42
|
# Starts the parsing process.
|
44
43
|
# Either returns an Error, or the parsed Resource
|
45
44
|
def run
|
46
|
-
|
47
|
-
|
48
|
-
Error[response.raw.status].new(response)
|
49
|
-
when :unparsable_json
|
50
|
-
UnparsableJson.new(response)
|
51
|
-
when :not_contentful
|
52
|
-
Error.new(response)
|
45
|
+
if response.status == :ok
|
46
|
+
create_all_resources!
|
53
47
|
else
|
54
|
-
|
55
|
-
create_all_resources!
|
56
|
-
rescue UnparsableResource => error
|
57
|
-
error
|
58
|
-
end
|
48
|
+
response.object
|
59
49
|
end
|
60
50
|
end
|
61
51
|
|
@@ -76,6 +66,8 @@ module Contentful
|
|
76
66
|
end
|
77
67
|
|
78
68
|
@resource
|
69
|
+
rescue UnparsableResource => error
|
70
|
+
error
|
79
71
|
end
|
80
72
|
|
81
73
|
# Creates a single resource from the response object
|
@@ -110,15 +102,15 @@ module Contentful
|
|
110
102
|
|
111
103
|
# Returns the id of the related ContentType, if there is one
|
112
104
|
def content_type_id_for_entry(object)
|
113
|
-
object[
|
114
|
-
object[
|
115
|
-
object[
|
116
|
-
object[
|
105
|
+
object['sys'] &&
|
106
|
+
object['sys']['contentType'] &&
|
107
|
+
object['sys']['contentType']['sys'] &&
|
108
|
+
object['sys']['contentType']['sys']['id']
|
117
109
|
end
|
118
110
|
|
119
111
|
# Detects if a resource is an Contentful::Array or a SyncPage
|
120
112
|
def array_or_sync_page(object)
|
121
|
-
if object[
|
113
|
+
if object['nextPageUrl'] || object['nextSyncUrl']
|
122
114
|
SyncPage
|
123
115
|
else
|
124
116
|
Array
|
@@ -133,7 +125,7 @@ module Contentful
|
|
133
125
|
# - Proc: Will be called, expected to return the proper Class
|
134
126
|
# - Symbol: Will be called as method of the ResourceBuilder itself
|
135
127
|
def detect_resource_class(object)
|
136
|
-
type = object[
|
128
|
+
type = object['sys'] && object['sys']['type']
|
137
129
|
|
138
130
|
case res_class = resource_mapping[type]
|
139
131
|
when Symbol
|
@@ -141,7 +133,7 @@ module Contentful
|
|
141
133
|
when Proc
|
142
134
|
res_class[object]
|
143
135
|
when nil
|
144
|
-
|
136
|
+
fail UnparsableResource.new(response)
|
145
137
|
else
|
146
138
|
res_class
|
147
139
|
end
|
@@ -157,7 +149,6 @@ module Contentful
|
|
157
149
|
DEFAULT_ENTRY_MAPPING.dup
|
158
150
|
end
|
159
151
|
|
160
|
-
|
161
152
|
private
|
162
153
|
|
163
154
|
def detect_child_objects(object)
|
@@ -191,7 +182,7 @@ module Contentful
|
|
191
182
|
res.public_send(name)[child_name.to_sym] = create_resource(child_object)
|
192
183
|
end
|
193
184
|
next if name == 'includes'
|
194
|
-
detect_child_arrays(potential_objects).each do |child_name,
|
185
|
+
detect_child_arrays(potential_objects).each do |child_name, _child_array|
|
195
186
|
replace_child_array res.public_send(name)[child_name.to_sym]
|
196
187
|
end
|
197
188
|
end
|
data/lib/contentful/response.rb
CHANGED
@@ -27,62 +27,67 @@ module Contentful
|
|
27
27
|
@request = request
|
28
28
|
@status = :ok
|
29
29
|
|
30
|
-
if
|
31
|
-
|
32
|
-
@error_message = 'Service Unavailable, contenful.com API seems to be down'
|
30
|
+
if valid_http_response?
|
31
|
+
parse_json!
|
33
32
|
elsif no_content_response?
|
34
33
|
@status = :no_content
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
elsif no_resource_or_bad_request?
|
35
|
+
parse_contentful_error
|
36
|
+
else
|
37
|
+
parse_http_error
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
def
|
44
|
-
|
43
|
+
def error_object?
|
44
|
+
object['sys']['type'] == 'Error'
|
45
|
+
end
|
46
|
+
|
47
|
+
def parse_contentful_error
|
48
|
+
@object = load_json
|
49
|
+
@error_message = object['message'] if error_object?
|
50
|
+
parse_http_error
|
51
|
+
end
|
52
|
+
|
53
|
+
def valid_http_response?
|
54
|
+
[200, 201].include?(raw.status)
|
55
|
+
end
|
56
|
+
|
57
|
+
def parse_http_error
|
58
|
+
@status = :error
|
59
|
+
@object = Error[raw.status].new(self)
|
60
|
+
end
|
61
|
+
|
62
|
+
def no_resource_or_bad_request?
|
63
|
+
[400, 404].include?(raw.status)
|
45
64
|
end
|
46
65
|
|
47
66
|
def no_content_response?
|
48
|
-
|
67
|
+
raw.to_s == '' && raw.status == 204
|
49
68
|
end
|
50
69
|
|
51
70
|
def parse_json!
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@error_message = e.message
|
58
|
-
@object = e
|
59
|
-
false
|
71
|
+
@object = load_json
|
72
|
+
rescue MultiJson::LoadError => error
|
73
|
+
@error_message = error.message
|
74
|
+
@status = :error
|
75
|
+
UnparsableJson.new(self)
|
60
76
|
end
|
61
77
|
|
62
|
-
def
|
63
|
-
|
64
|
-
if @object["sys"]["type"] == 'Error'
|
65
|
-
@status = :contentful_error
|
66
|
-
@error_message = object['message']
|
67
|
-
true
|
68
|
-
else
|
69
|
-
false
|
70
|
-
end
|
71
|
-
else
|
72
|
-
@status = :not_contentful
|
73
|
-
@error_message = "No contentful system properties found in object"
|
74
|
-
end
|
78
|
+
def load_json
|
79
|
+
MultiJson.load(unzip_response(raw))
|
75
80
|
end
|
76
81
|
|
77
82
|
def unzip_response(response)
|
78
|
-
|
79
|
-
|
83
|
+
parsed_response = response.to_s
|
84
|
+
if response.headers['Content-Encoding'].eql?('gzip')
|
85
|
+
sio = StringIO.new(parsed_response)
|
80
86
|
gz = Zlib::GzipReader.new(sio)
|
81
|
-
gz.read
|
87
|
+
gz.read
|
82
88
|
else
|
83
|
-
|
89
|
+
parsed_response
|
84
90
|
end
|
85
91
|
end
|
86
|
-
|
87
92
|
end
|
88
93
|
end
|
data/lib/contentful/sync.rb
CHANGED
@@ -32,7 +32,7 @@ module Contentful
|
|
32
32
|
|
33
33
|
# Returns false as long as last sync page has not been reached
|
34
34
|
def completed?
|
35
|
-
!!
|
35
|
+
!!next_sync_url
|
36
36
|
end
|
37
37
|
|
38
38
|
# Directly iterates over all resources that have changed
|
@@ -57,7 +57,6 @@ module Contentful
|
|
57
57
|
page
|
58
58
|
end
|
59
59
|
|
60
|
-
|
61
60
|
private
|
62
61
|
|
63
62
|
def link_page_to_sync!(page)
|
@@ -67,6 +66,5 @@ module Contentful
|
|
67
66
|
def update_sync_state_from!(page)
|
68
67
|
@next_sync_url = page.next_sync_url
|
69
68
|
end
|
70
|
-
|
71
69
|
end
|
72
70
|
end
|
data/lib/contentful/sync_page.rb
CHANGED
data/lib/contentful/version.rb
CHANGED
data/spec/array_spec.rb
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Contentful::Array do
|
4
|
-
let(:array){ vcr('array'){ create_client.content_types } }
|
4
|
+
let(:array) { vcr('array') { create_client.content_types } }
|
5
5
|
|
6
6
|
describe 'SystemProperties' do
|
7
7
|
it 'has a #sys getter returning a hash with symbol keys' do
|
8
|
-
expect(
|
9
|
-
expect(
|
8
|
+
expect(array.sys).to be_a Hash
|
9
|
+
expect(array.sys.keys.sample).to be_a Symbol
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'has #type' do
|
13
|
-
expect(
|
13
|
+
expect(array.type).to eq 'Array'
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
describe 'Properties' do
|
18
18
|
it 'has a #properties getter returning a hash with symbol keys' do
|
19
|
-
expect(
|
20
|
-
expect(
|
19
|
+
expect(array.properties).to be_a Hash
|
20
|
+
expect(array.properties.keys.sample).to be_a Symbol
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'has #total' do
|
24
|
-
expect(
|
24
|
+
expect(array.total).to eq 4
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'has #skip' do
|
28
|
-
expect(
|
28
|
+
expect(array.skip).to eq 0
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'has #limit' do
|
32
|
-
expect(
|
32
|
+
expect(array.limit).to eq 100
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'has #items which contain resources' do
|
36
|
-
expect(
|
37
|
-
expect(
|
36
|
+
expect(array.items).to be_a Array
|
37
|
+
expect(array.items.sample).to be_a Contentful::Resource
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
describe '#each' do
|
42
42
|
it 'is an Enumerator' do
|
43
|
-
expect(
|
43
|
+
expect(array.each).to be_a Enumerator
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'iterates over items' do
|
47
|
-
expect(
|
47
|
+
expect(array.each.to_a).to eq array.items
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'includes Enumerable' do
|
51
|
-
expect(
|
51
|
+
expect(array.map { |r| r.type }).to eq array.items.map { |r| r.type }
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
describe '#next_page' do
|
56
56
|
it 'requests more of the same content from the server, using its limit and skip values' do
|
57
|
-
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 }
|
57
|
+
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 }
|
59
59
|
|
60
|
-
expect(
|
61
|
-
expect(
|
62
|
-
expect(
|
60
|
+
expect(array_page_2).to be_a Contentful::Array
|
61
|
+
expect(array_page_2.limit).to eq 2
|
62
|
+
expect(array_page_2.skip).to eq 5
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'will return false if #request not available' do
|
66
|
-
expect(
|
66
|
+
expect(Contentful::Array.new({}).reload).to be_false
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
data/spec/asset_spec.rb
CHANGED
@@ -1,62 +1,62 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Contentful::Asset do
|
4
|
-
let(:asset){ vcr('asset'){ create_client.asset('nyancat') } }
|
4
|
+
let(:asset) { vcr('asset') { create_client.asset('nyancat') } }
|
5
5
|
|
6
6
|
describe 'SystemProperties' do
|
7
7
|
it 'has a #sys getter returning a hash with symbol keys' do
|
8
|
-
expect(
|
9
|
-
expect(
|
8
|
+
expect(asset.sys).to be_a Hash
|
9
|
+
expect(asset.sys.keys.sample).to be_a Symbol
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'has #id' do
|
13
|
-
expect(
|
13
|
+
expect(asset.id).to eq 'nyancat'
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'has #type' do
|
17
|
-
expect(
|
17
|
+
expect(asset.type).to eq 'Asset'
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'has #space' do
|
21
|
-
expect(
|
21
|
+
expect(asset.space).to be_a Contentful::Link
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'has #created_at' do
|
25
|
-
expect(
|
25
|
+
expect(asset.created_at).to be_a DateTime
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'has #updated_at' do
|
29
|
-
expect(
|
29
|
+
expect(asset.updated_at).to be_a DateTime
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'has #revision' do
|
33
|
-
expect(
|
33
|
+
expect(asset.revision).to eq 1
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
describe 'Fields' do
|
38
38
|
it 'has #title' do
|
39
|
-
expect(
|
39
|
+
expect(asset.title).to eq 'Nyan Cat'
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'could have #description' do
|
43
|
-
expect(
|
43
|
+
expect(asset).to respond_to :description
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'has #file' do
|
47
|
-
expect(
|
47
|
+
expect(asset.file).to be_a Contentful::File
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
describe '#image_url' do
|
52
52
|
it 'returns #url of #file without parameter' do
|
53
|
-
expect(
|
53
|
+
expect(asset.image_url).to eq asset.file.url
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'adds image options if given' do
|
57
57
|
url = asset.image_url(width: 100, format: 'jpg', quality: 50)
|
58
58
|
expect(url).to include asset.file.url
|
59
|
-
expect(url).to include
|
59
|
+
expect(url).to include '?w=100&fm=jpg&q=50'
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|