contentful 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 055e3549fae94399369cbf11af030345ecca06a2
4
+ data.tar.gz: afcffb79eb459aa3b7fb55092c5be10594d98c63
5
+ SHA512:
6
+ metadata.gz: 74469eca51e340966a57bf3e7d2bd4880c3c0f988e5eba58eaef49fcecc52d7a3a3ab4ea092a6211beb353642686052c92636a7502e0ef714c15793ca4d4666d
7
+ data.tar.gz: 8ccc5ef2d39f5b9e3fdab75b8fe47d9b39d2e8c734b84a6638707143f5e5782abf34e9830d7f96d817531644b0ef4bf2d70f7ed536db0f835d8e4757c5fbb6e9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### 0.1.3
2
+
3
+ * Better link inclusion processing, prevent "stack level to deep" errors
4
+
5
+
1
6
  ### 0.1.2
2
7
 
3
8
  * Fix the way all content types are retrieved
@@ -21,13 +21,14 @@ module Contentful
21
21
  'Link' => Link,
22
22
  }
23
23
 
24
- attr_reader :client, :response, :resource_mapping
24
+ attr_reader :client, :response, :resource_mapping, :resource
25
25
 
26
26
 
27
27
  def initialize(client, response, resource_mapping = {})
28
28
  @response = response
29
29
  @client = client
30
30
  @included_resources = {}
31
+ @known_resources = Hash.new{ |h,k| h[k] = {} }
31
32
  @resource_mapping = default_resource_mapping.merge(resource_mapping)
32
33
  end
33
34
 
@@ -54,24 +55,25 @@ module Contentful
54
55
  # - raise error if response not valid
55
56
  # - look for included objects and parse them to resources
56
57
  # - parse main object to resource
57
- # - replace links in included resources with included resources
58
- # - replace links in main resource with included resources
58
+ # - replace links in included resources with known resources
59
+ # - replace links in main resource with known resources
59
60
  # - return main resource
60
61
  def create_all_resources!
61
62
  create_included_resources! response.object['includes']
62
- res = create_resource(response.object)
63
+ @resource = create_resource(response.object)
63
64
 
64
65
  unless @included_resources.empty?
65
- replace_links_in_included_resources_with_included_resources
66
- replace_links_with_included_resources(res)
66
+ replace_links_in_included_resources_with_known_resources
67
+ replace_links_with_known_resources @resource
67
68
  end
68
69
 
69
- res
70
+ @resource
70
71
  end
71
72
 
72
73
  # Creates a single resource from the
73
74
  def create_resource(object)
74
75
  res = detect_resource_class(object).new(object, response.request, client)
76
+ add_to_known_resources res
75
77
  replace_children res, object
76
78
  replace_child_array res.items if res.array?
77
79
 
@@ -143,6 +145,10 @@ module Contentful
143
145
  end
144
146
  end
145
147
 
148
+ def add_to_known_resources(res)
149
+ @known_resources[res.type][res.id] = res if res.sys && res.id && res.type != 'Link'
150
+ end
151
+
146
152
  def replace_children(res, object)
147
153
  object.each do |name, potential_objects|
148
154
  detect_child_objects(potential_objects).each do |child_name, child_object|
@@ -172,48 +178,55 @@ module Contentful
172
178
  end
173
179
  end
174
180
 
175
- def replace_links_with_included_resources(res)
176
- [:properties, :sys, :fields].each do |property_container_name|
177
- if property_container = res.public_send(property_container_name)
178
- property_container.each do |property_name, property_value|
179
- if property_value.is_a? ::Array
180
- sub_property_container = property_value
181
- sub_property_container.each.with_index do |sub_property_value, sub_property_index|
182
- replace_link_or_check_recursively sub_property_value, sub_property_container, sub_property_index
183
- end
184
- else
185
- replace_link_or_check_recursively property_value, property_container, property_name
186
- end
187
- end
188
- end
181
+ def replace_links_with_known_resources(res, seen_resource_ids = [])
182
+ seen_resource_ids << res.id
183
+
184
+ [:properties, :sys, :fields].map do |property_container_name|
185
+ res.public_send(property_container_name)
186
+ end.compact.each do |property_container|
187
+ replace_links_in_properties(property_container, seen_resource_ids)
189
188
  end
189
+
190
190
  if res.array?
191
- property_container = res.items
192
- property_container.each.with_index do|child_property, property_index|
193
- replace_link_or_check_recursively child_property, property_container, property_index
191
+ replace_links_in_array res.items, seen_resource_ids
192
+ end
193
+ end
194
+
195
+ def replace_links_in_properties(property_container, seen_resource_ids)
196
+ property_container.each do |property_name, property_value|
197
+ if property_value.is_a? ::Array
198
+ replace_links_in_array property_value, seen_resource_ids
199
+ else
200
+ replace_link_or_check_recursively property_value, property_container, property_name, seen_resource_ids
194
201
  end
195
202
  end
196
203
  end
197
204
 
198
- def replace_link_or_check_recursively(property_value, property_container, property_name)
205
+ def replace_links_in_array(property_container, seen_resource_ids)
206
+ property_container.each.with_index do |child_property, property_index|
207
+ replace_link_or_check_recursively child_property, property_container, property_index, seen_resource_ids
208
+ end
209
+ end
210
+
211
+ def replace_link_or_check_recursively(property_value, property_container, property_name, seen_resource_ids)
199
212
  if property_value.is_a? Link
200
213
  maybe_replace_link(property_value, property_container, property_name)
201
- elsif property_value.is_a?(Resource) && property_value.sys
202
- replace_links_with_included_resources(property_value)
214
+ elsif property_value.is_a?(Resource) && property_value.sys && !seen_resource_ids.include?(property_value.id)
215
+ replace_links_with_known_resources(property_value, seen_resource_ids)
203
216
  end
204
217
  end
205
218
 
206
219
  def maybe_replace_link(link, parent, key)
207
- if @included_resources[link.link_type] &&
208
- @included_resources[link.link_type].key?(link.id)
209
- parent[key] = @included_resources[link.link_type][link.id]
220
+ if @known_resources[link.link_type] &&
221
+ @known_resources[link.link_type].key?(link.id)
222
+ parent[key] = @known_resources[link.link_type][link.id]
210
223
  end
211
224
  end
212
225
 
213
- def replace_links_in_included_resources_with_included_resources
226
+ def replace_links_in_included_resources_with_known_resources
214
227
  @included_resources.each do |_, for_type|
215
228
  for_type.each do |_, res|
216
- replace_links_with_included_resources(res)
229
+ replace_links_with_known_resources(res)
217
230
  end
218
231
  end
219
232
  end
@@ -1,3 +1,3 @@
1
1
  module Contentful
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -0,0 +1,82 @@
1
+ {
2
+ "sys": {
3
+ "type": "Array"
4
+ },
5
+ "total": 1,
6
+ "skip": 0,
7
+ "limit": 100,
8
+ "items": [
9
+ {
10
+ "sys": {
11
+ "space": {
12
+ "sys": {
13
+ "type": "Link",
14
+ "linkType": "Space",
15
+ "id": "6yahkaf5ehkk"
16
+ }
17
+ },
18
+ "type": "Entry",
19
+ "contentType": {
20
+ "sys": {
21
+ "type": "Link",
22
+ "linkType": "ContentType",
23
+ "id": "tSFLnCNqvuyoMA6SKkQ2W"
24
+ }
25
+ },
26
+ "id": "6HM4G3D4iciuoIk6CW2OK6",
27
+ "revision": 2,
28
+ "createdAt": "2014-04-16T17:52:42.289Z",
29
+ "updatedAt": "2014-04-16T17:53:28.780Z",
30
+ "locale": "en-US"
31
+ },
32
+ "fields": {
33
+ "foo": "777777777",
34
+ "e": {
35
+ "sys": {
36
+ "type": "Link",
37
+ "linkType": "Entry",
38
+ "id": "55t1gz1JUIQ2s4mcMwQ8cA"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ ],
44
+ "includes": {
45
+ "Entry": [
46
+ {
47
+ "sys": {
48
+ "space": {
49
+ "sys": {
50
+ "type": "Link",
51
+ "linkType": "Space",
52
+ "id": "6yahkaf5ehkk"
53
+ }
54
+ },
55
+ "type": "Entry",
56
+ "contentType": {
57
+ "sys": {
58
+ "type": "Link",
59
+ "linkType": "ContentType",
60
+ "id": "tSFLnCNqvuyoMA6SKkQ2W"
61
+ }
62
+ },
63
+ "id": "55t1gz1JUIQ2s4mcMwQ8cA",
64
+ "revision": 1,
65
+ "createdAt": "2014-04-16T17:53:15.753Z",
66
+ "updatedAt": "2014-04-16T17:53:15.753Z",
67
+ "locale": "en-US"
68
+ },
69
+ "fields": {
70
+ "foo": "88888888888",
71
+ "e": {
72
+ "sys": {
73
+ "type": "Link",
74
+ "linkType": "Entry",
75
+ "id": "6HM4G3D4iciuoIk6CW2OK6"
76
+ }
77
+ }
78
+ }
79
+ }
80
+ ]
81
+ }
82
+ }
@@ -17,4 +17,13 @@ describe 'Resource Building Examples' do
17
17
  expect( resource.fields[:links] ).to be_a Array
18
18
  expect( resource.fields[:links].first ).to be_a Contentful::Entry
19
19
  end
20
+
21
+ it 'can also reference itself' do
22
+ response = Contentful::Response.new raw_fixture('self_link')
23
+ resource = Contentful::ResourceBuilder.new(create_client, response).run.first
24
+
25
+ other_resource = resource.fields[:e]
26
+ expect( other_resource ).to be_a Contentful::Entry
27
+ expect( other_resource.fields[:e] ).to be resource
28
+ end
20
29
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contentful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
5
- prerelease:
4
+ version: 0.1.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Contentful GmbH (Jan Lelis)
@@ -14,157 +13,139 @@ dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: http
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
- - - <
20
+ - - "<"
23
21
  - !ruby/object:Gem::Version
24
22
  version: '0.6'
25
23
  type: :runtime
26
24
  prerelease: false
27
25
  version_requirements: !ruby/object:Gem::Requirement
28
- none: false
29
26
  requirements:
30
- - - ~>
27
+ - - "~>"
31
28
  - !ruby/object:Gem::Version
32
29
  version: '0'
33
- - - <
30
+ - - "<"
34
31
  - !ruby/object:Gem::Version
35
32
  version: '0.6'
36
33
  - !ruby/object:Gem::Dependency
37
34
  name: multi_json
38
35
  requirement: !ruby/object:Gem::Requirement
39
- none: false
40
36
  requirements:
41
- - - ~>
37
+ - - "~>"
42
38
  - !ruby/object:Gem::Version
43
39
  version: '1'
44
40
  type: :runtime
45
41
  prerelease: false
46
42
  version_requirements: !ruby/object:Gem::Requirement
47
- none: false
48
43
  requirements:
49
- - - ~>
44
+ - - "~>"
50
45
  - !ruby/object:Gem::Version
51
46
  version: '1'
52
47
  - !ruby/object:Gem::Dependency
53
48
  name: bundler
54
49
  requirement: !ruby/object:Gem::Requirement
55
- none: false
56
50
  requirements:
57
- - - ~>
51
+ - - "~>"
58
52
  - !ruby/object:Gem::Version
59
53
  version: '1.5'
60
54
  type: :development
61
55
  prerelease: false
62
56
  version_requirements: !ruby/object:Gem::Requirement
63
- none: false
64
57
  requirements:
65
- - - ~>
58
+ - - "~>"
66
59
  - !ruby/object:Gem::Version
67
60
  version: '1.5'
68
61
  - !ruby/object:Gem::Dependency
69
62
  name: rake
70
63
  requirement: !ruby/object:Gem::Requirement
71
- none: false
72
64
  requirements:
73
- - - ~>
65
+ - - "~>"
74
66
  - !ruby/object:Gem::Version
75
67
  version: '10'
76
68
  type: :development
77
69
  prerelease: false
78
70
  version_requirements: !ruby/object:Gem::Requirement
79
- none: false
80
71
  requirements:
81
- - - ~>
72
+ - - "~>"
82
73
  - !ruby/object:Gem::Version
83
74
  version: '10'
84
75
  - !ruby/object:Gem::Dependency
85
76
  name: rubygems-tasks
86
77
  requirement: !ruby/object:Gem::Requirement
87
- none: false
88
78
  requirements:
89
- - - ~>
79
+ - - "~>"
90
80
  - !ruby/object:Gem::Version
91
81
  version: '0.2'
92
82
  type: :development
93
83
  prerelease: false
94
84
  version_requirements: !ruby/object:Gem::Requirement
95
- none: false
96
85
  requirements:
97
- - - ~>
86
+ - - "~>"
98
87
  - !ruby/object:Gem::Version
99
88
  version: '0.2'
100
89
  - !ruby/object:Gem::Dependency
101
90
  name: rspec
102
91
  requirement: !ruby/object:Gem::Requirement
103
- none: false
104
92
  requirements:
105
- - - ~>
93
+ - - "~>"
106
94
  - !ruby/object:Gem::Version
107
95
  version: '2'
108
96
  type: :development
109
97
  prerelease: false
110
98
  version_requirements: !ruby/object:Gem::Requirement
111
- none: false
112
99
  requirements:
113
- - - ~>
100
+ - - "~>"
114
101
  - !ruby/object:Gem::Version
115
102
  version: '2'
116
103
  - !ruby/object:Gem::Dependency
117
104
  name: rr
118
105
  requirement: !ruby/object:Gem::Requirement
119
- none: false
120
106
  requirements:
121
- - - ! '>='
107
+ - - ">="
122
108
  - !ruby/object:Gem::Version
123
109
  version: '0'
124
110
  type: :development
125
111
  prerelease: false
126
112
  version_requirements: !ruby/object:Gem::Requirement
127
- none: false
128
113
  requirements:
129
- - - ! '>='
114
+ - - ">="
130
115
  - !ruby/object:Gem::Version
131
116
  version: '0'
132
117
  - !ruby/object:Gem::Dependency
133
118
  name: vcr
134
119
  requirement: !ruby/object:Gem::Requirement
135
- none: false
136
120
  requirements:
137
- - - ! '>='
121
+ - - ">="
138
122
  - !ruby/object:Gem::Version
139
123
  version: '0'
140
124
  type: :development
141
125
  prerelease: false
142
126
  version_requirements: !ruby/object:Gem::Requirement
143
- none: false
144
127
  requirements:
145
- - - ! '>='
128
+ - - ">="
146
129
  - !ruby/object:Gem::Version
147
130
  version: '0'
148
131
  - !ruby/object:Gem::Dependency
149
132
  name: webmock
150
133
  requirement: !ruby/object:Gem::Requirement
151
- none: false
152
134
  requirements:
153
- - - ~>
135
+ - - "~>"
154
136
  - !ruby/object:Gem::Version
155
137
  version: '1'
156
- - - ! '>='
138
+ - - ">="
157
139
  - !ruby/object:Gem::Version
158
140
  version: 1.17.3
159
141
  type: :development
160
142
  prerelease: false
161
143
  version_requirements: !ruby/object:Gem::Requirement
162
- none: false
163
144
  requirements:
164
- - - ~>
145
+ - - "~>"
165
146
  - !ruby/object:Gem::Version
166
147
  version: '1'
167
- - - ! '>='
148
+ - - ">="
168
149
  - !ruby/object:Gem::Version
169
150
  version: 1.17.3
170
151
  description: Ruby client for the https://www.contentful.com Content Delivery API
@@ -173,21 +154,25 @@ executables: []
173
154
  extensions: []
174
155
  extra_rdoc_files: []
175
156
  files:
176
- - .gitignore
177
- - .rspec
178
- - .travis.yml
179
- - coverage/.last_run.json
180
- - coverage/.resultset.json
157
+ - ".gitignore"
158
+ - ".rspec"
159
+ - ".travis.yml"
181
160
  - CHANGELOG.md
161
+ - Gemfile
162
+ - Gemfile.lock
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
182
166
  - contentful.gemspec
167
+ - coverage/.last_run.json
168
+ - coverage/.resultset.json
183
169
  - examples/custom_classes.rb
184
170
  - examples/dynamic_entries.rb
185
171
  - examples/example_queries.rb
186
172
  - examples/raise_errors.rb
187
173
  - examples/raw_mode.rb
188
174
  - examples/resource_mapping.rb
189
- - Gemfile
190
- - Gemfile.lock
175
+ - lib/contentful.rb
191
176
  - lib/contentful/array.rb
192
177
  - lib/contentful/asset.rb
193
178
  - lib/contentful/client.rb
@@ -201,19 +186,15 @@ files:
201
186
  - lib/contentful/locale.rb
202
187
  - lib/contentful/location.rb
203
188
  - lib/contentful/request.rb
189
+ - lib/contentful/resource.rb
204
190
  - lib/contentful/resource/asset_fields.rb
205
191
  - lib/contentful/resource/fields.rb
206
192
  - lib/contentful/resource/system_properties.rb
207
- - lib/contentful/resource.rb
208
193
  - lib/contentful/resource_builder.rb
209
194
  - lib/contentful/response.rb
210
195
  - lib/contentful/space.rb
211
196
  - lib/contentful/support.rb
212
197
  - lib/contentful/version.rb
213
- - lib/contentful.rb
214
- - LICENSE.txt
215
- - Rakefile
216
- - README.md
217
198
  - spec/array_spec.rb
218
199
  - spec/asset_spec.rb
219
200
  - spec/auto_includes_spec.rb
@@ -232,6 +213,7 @@ files:
232
213
  - spec/fixtures/json_responses/link_array.json
233
214
  - spec/fixtures/json_responses/not_found.json
234
215
  - spec/fixtures/json_responses/nyancat.json
216
+ - spec/fixtures/json_responses/self_link.json
235
217
  - spec/fixtures/json_responses/unparsable.json
236
218
  - spec/fixtures/vcr_cassettes/array.yml
237
219
  - spec/fixtures/vcr_cassettes/array_page_1.yml
@@ -265,33 +247,26 @@ files:
265
247
  homepage: https://github.com/contentful/contentful.rb
266
248
  licenses:
267
249
  - MIT
250
+ metadata: {}
268
251
  post_install_message:
269
252
  rdoc_options: []
270
253
  require_paths:
271
254
  - lib
272
255
  required_ruby_version: !ruby/object:Gem::Requirement
273
- none: false
274
256
  requirements:
275
- - - ! '>='
257
+ - - ">="
276
258
  - !ruby/object:Gem::Version
277
259
  version: '0'
278
- segments:
279
- - 0
280
- hash: -4173593734953116730
281
260
  required_rubygems_version: !ruby/object:Gem::Requirement
282
- none: false
283
261
  requirements:
284
- - - ! '>='
262
+ - - ">="
285
263
  - !ruby/object:Gem::Version
286
264
  version: '0'
287
- segments:
288
- - 0
289
- hash: -4173593734953116730
290
265
  requirements: []
291
266
  rubyforge_project:
292
- rubygems_version: 1.8.23.2
267
+ rubygems_version: 2.2.0
293
268
  signing_key:
294
- specification_version: 3
269
+ specification_version: 4
295
270
  summary: contentful
296
271
  test_files:
297
272
  - spec/array_spec.rb
@@ -312,6 +287,7 @@ test_files:
312
287
  - spec/fixtures/json_responses/link_array.json
313
288
  - spec/fixtures/json_responses/not_found.json
314
289
  - spec/fixtures/json_responses/nyancat.json
290
+ - spec/fixtures/json_responses/self_link.json
315
291
  - spec/fixtures/json_responses/unparsable.json
316
292
  - spec/fixtures/vcr_cassettes/array.yml
317
293
  - spec/fixtures/vcr_cassettes/array_page_1.yml