contentful 0.1.2 → 0.1.3

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 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