contentful_bootstrap 3.8.0 → 3.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,8 +16,8 @@ module Contentful
16
16
 
17
17
  attr_reader :assets, :entries, :content_types
18
18
 
19
- def initialize(space, file, mark_processed = false, all = true, quiet = false, skip_content_types = false)
20
- super(space, quiet, skip_content_types)
19
+ def initialize(space, file, mark_processed = false, all = true, quiet = false, skip_content_types = false, no_publish = false)
20
+ super(space, quiet, skip_content_types, no_publish)
21
21
  @file = file
22
22
  @all = all
23
23
  @mark_processed = mark_processed
@@ -1,6 +1,6 @@
1
1
  module Contentful
2
2
  module Bootstrap
3
- VERSION = '3.8.0'
3
+ VERSION = '3.9.0'
4
4
 
5
5
  def self.major_version
6
6
  VERSION.split('.').first.to_i
@@ -101,7 +101,7 @@ describe Contentful::Bootstrap::CommandRunner do
101
101
  allow_any_instance_of(Contentful::Bootstrap::Commands::GenerateJson).to receive(:run)
102
102
 
103
103
  expect(Contentful::Bootstrap::Commands::GenerateJson).to receive(:new).with(
104
- 'foo', 'bar', nil, false
104
+ 'foo', 'bar', nil, false, false, false
105
105
  ).and_call_original
106
106
 
107
107
  subject.generate_json('foo', access_token: 'bar')
@@ -111,7 +111,7 @@ describe Contentful::Bootstrap::CommandRunner do
111
111
  allow_any_instance_of(Contentful::Bootstrap::Commands::GenerateJson).to receive(:run)
112
112
 
113
113
  expect(Contentful::Bootstrap::Commands::GenerateJson).to receive(:new).with(
114
- 'foo', 'bar', 'baz', true
114
+ 'foo', 'bar', 'baz', true, false, false
115
115
  ).and_call_original
116
116
 
117
117
  subject.generate_json('foo', access_token: 'bar', filename: 'baz', content_types_only: true)
@@ -48,8 +48,8 @@ describe Contentful::Bootstrap::Commands::Base do
48
48
  token.read,
49
49
  default_locale: 'en-US',
50
50
  raise_errors: true,
51
- integration_name: 'bootstrap',
52
- integration_version: Contentful::Bootstrap::VERSION
51
+ application_name: 'bootstrap',
52
+ application_version: Contentful::Bootstrap::VERSION
53
53
  )
54
54
 
55
55
  described_class.new(token, 'foo', quiet: true)
@@ -134,6 +134,25 @@ describe Contentful::Bootstrap::Commands::CreateSpace do
134
134
  subject.run
135
135
  }
136
136
  end
137
+
138
+ context 'with no_publish set to true' do
139
+ subject { described_class.new token, 'foo', json_template: 'bar', trigger_oauth: false, quiet: true, no_publish: true }
140
+
141
+ it 'calls JsonTemplate with no_publish' do
142
+ allow(Contentful::Bootstrap::Support).to receive(:gets).and_return('y')
143
+ allow(Contentful::Bootstrap::Support).to receive(:gets).and_return('n')
144
+ allow(::File).to receive(:exist?) { true }
145
+
146
+ mock_template = Object.new
147
+
148
+ expect(subject).to receive(:fetch_space) { space_double }
149
+ expect(mock_template).to receive(:run)
150
+
151
+ expect(::Contentful::Bootstrap::Templates::JsonTemplate).to receive(:new).with(space_double, 'bar', false, true, true, false, true) { mock_template }
152
+
153
+ subject.run
154
+ end
155
+ end
137
156
  end
138
157
 
139
158
  describe 'integration' do
@@ -7,6 +7,7 @@ describe Contentful::Bootstrap::Commands::GenerateJson do
7
7
  describe '#run' do
8
8
  it 'exits if access_token is nil' do
9
9
  subject.instance_variable_set(:@access_token, nil)
10
+ subject.instance_variable_set(:@quiet, true)
10
11
 
11
12
  expect { subject.run }.to raise_error SystemExit
12
13
  end
@@ -23,6 +24,7 @@ describe Contentful::Bootstrap::Commands::GenerateJson do
23
24
  vcr('generate_json') {
24
25
  subject.instance_variable_set(:@space_id, 'wl1z0pal05vy')
25
26
  subject.instance_variable_set(:@access_token, '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e')
27
+ subject.instance_variable_set(:@quiet, true)
26
28
 
27
29
  json_fixture('wl1z0pal05vy') { |json|
28
30
  expect(subject).to receive(:write).with(JSON.pretty_generate(json))
@@ -31,6 +33,21 @@ describe Contentful::Bootstrap::Commands::GenerateJson do
31
33
  subject.run
32
34
  }
33
35
  end
36
+
37
+ it 'can use the preview api' do
38
+ vcr('generate_json_preview') {
39
+ subject.instance_variable_set(:@space_id, 'f3abi4dqvrhg')
40
+ subject.instance_variable_set(:@access_token, '06c28ef41823bb636714dfd812066fa026a49e95041a0e94903d6cf016bba50e')
41
+ subject.instance_variable_set(:@use_preview, true)
42
+ subject.instance_variable_set(:@quiet, true)
43
+
44
+ json_fixture('f3abi4dqvrhg_preview') { |json|
45
+ expect(subject).to receive(:write).with(JSON.pretty_generate(json))
46
+ }
47
+
48
+ subject.run
49
+ }
50
+ end
34
51
  end
35
52
 
36
53
  describe '#write' do
@@ -52,40 +52,35 @@ describe Contentful::Bootstrap::Commands::UpdateSpace do
52
52
  expect(subject).to receive(:fetch_space) { space_double }
53
53
  expect(mock_template).to receive(:run)
54
54
 
55
- expect(::Contentful::Bootstrap::Templates::JsonTemplate).to receive(:new).with(space_double, 'bar', mark_processed, true, false, false) { mock_template }
55
+ expect(::Contentful::Bootstrap::Templates::JsonTemplate).to receive(:new).with(space_double, 'bar', mark_processed, true, true, false, false) { mock_template }
56
56
 
57
57
  subject.run
58
58
  end
59
59
  end
60
60
  end
61
+ end
61
62
 
62
- it 'can update localized spaces' do
63
- vcr('update_space_localized') {
64
- json_path = File.expand_path(File.join('spec', 'fixtures', 'json_fixtures', 'update_space_localized.json'))
65
- subject = described_class.new(token, 'vsy1ouf6jdcq', locale: 'es-AR', json_template: json_path, mark_processed: false, trigger_oauth: false, quiet: true)
63
+ context 'with skip_content_types set to true' do
64
+ subject { described_class.new token, 'foo', json_template: 'bar', trigger_oauth: false, skip_content_types: true, quiet: true }
66
65
 
67
- subject.run
68
- }
66
+ it 'calls JsonTemplate with skip_content_types' do
67
+ allow(::File).to receive(:exist?) { true }
69
68
 
70
- vcr('check_update_space_localized') {
71
- client = Contentful::Client.new(
72
- space: 'vsy1ouf6jdcq',
73
- access_token: '90e1b4964c3631cc9c751c42339814635623b001a53aec5aad23377299445433',
74
- dynamic_entries: :auto,
75
- raise_errors: true
76
- )
69
+ mock_template = Object.new
77
70
 
78
- entries = client.entries(locale: 'es-AR')
71
+ expect(subject).to receive(:fetch_space) { space_double }
72
+ expect(mock_template).to receive(:run)
73
+
74
+ expect(::Contentful::Bootstrap::Templates::JsonTemplate).to receive(:new).with(space_double, 'bar', false, true, true, true, false) { mock_template }
79
75
 
80
- expect(entries.map(&:text)).to eq ['Foo', 'Bar']
81
- }
76
+ subject.run
82
77
  end
83
78
  end
84
79
 
85
- context 'with skip_content_types set to true' do
86
- subject { described_class.new token, 'foo', json_template: 'bar', trigger_oauth: false, skip_content_types: true, quiet: true }
80
+ context 'with no_publish set to true' do
81
+ subject { described_class.new token, 'foo', json_template: 'bar', trigger_oauth: false, skip_content_types: true, quiet: true, no_publish: true }
87
82
 
88
- it 'calls JsonTemplate with skip_content_types' do
83
+ it 'calls JsonTemplate with no_publish' do
89
84
  allow(::File).to receive(:exist?) { true }
90
85
 
91
86
  mock_template = Object.new
@@ -93,7 +88,7 @@ describe Contentful::Bootstrap::Commands::UpdateSpace do
93
88
  expect(subject).to receive(:fetch_space) { space_double }
94
89
  expect(mock_template).to receive(:run)
95
90
 
96
- expect(::Contentful::Bootstrap::Templates::JsonTemplate).to receive(:new).with(space_double, 'bar', false, true, false, true) { mock_template }
91
+ expect(::Contentful::Bootstrap::Templates::JsonTemplate).to receive(:new).with(space_double, 'bar', false, true, true, true, true) { mock_template }
97
92
 
98
93
  subject.run
99
94
  end
@@ -106,4 +101,61 @@ describe Contentful::Bootstrap::Commands::UpdateSpace do
106
101
  expect(subject.json_template).to eq 'bar'
107
102
  end
108
103
  end
104
+
105
+ describe 'integration' do
106
+ it 'can update localized spaces' do
107
+ vcr('update_space_localized') {
108
+ json_path = File.expand_path(File.join('spec', 'fixtures', 'json_fixtures', 'update_space_localized.json'))
109
+ subject = described_class.new(token, 'vsy1ouf6jdcq', locale: 'es-AR', json_template: json_path, mark_processed: false, trigger_oauth: false, quiet: true)
110
+
111
+ subject.run
112
+ }
113
+
114
+ vcr('check_update_space_localized') {
115
+ client = Contentful::Client.new(
116
+ space: 'vsy1ouf6jdcq',
117
+ access_token: '90e1b4964c3631cc9c751c42339814635623b001a53aec5aad23377299445433',
118
+ dynamic_entries: :auto,
119
+ raise_errors: true
120
+ )
121
+
122
+ entries = client.entries(locale: 'es-AR')
123
+
124
+ expect(entries.map(&:text)).to eq ['Foo', 'Bar']
125
+ }
126
+ end
127
+
128
+ it 'can update an existing asset and keep it as draft' do
129
+ vcr('update_existing_asset') {
130
+ json_path = File.expand_path(File.join('spec', 'fixtures', 'json_fixtures', 'assets_draft.json'))
131
+ subject = described_class.new(token, 'f3abi4dqvrhg', json_template: json_path, no_publish: true, trigger_oauth: false, quiet: true)
132
+
133
+ subject.run
134
+ }
135
+
136
+ vcr('check_update_space_with_draft_content') {
137
+ delivery_client = Contentful::Client.new(
138
+ space: 'f3abi4dqvrhg',
139
+ access_token: 'efab52abe735b200abb0f053ad8a3d0da633487c0c98cf03dc806c2b3bd049a1',
140
+ dynamic_entries: :auto,
141
+ raise_errors: true
142
+ )
143
+
144
+ preview_client = Contentful::Client.new(
145
+ space: 'f3abi4dqvrhg',
146
+ access_token: '06c28ef41823bb636714dfd812066fa026a49e95041a0e94903d6cf016bba50e',
147
+ dynamic_entries: :auto,
148
+ api_url: 'preview.contentful.com',
149
+ raise_errors: true
150
+ )
151
+
152
+ delivery_cat = delivery_client.assets.first
153
+ preview_cat = preview_client.assets.first
154
+
155
+ expect(preview_cat.title).not_to eq delivery_cat
156
+ expect(preview_cat.title).to eq 'Cat'
157
+ expect(delivery_cat.title).to eq 'Foo'
158
+ }
159
+ end
160
+ end
109
161
  end
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Contentful::Bootstrap::Generator do
4
- subject { Contentful::Bootstrap::Generator.new('wl1z0pal05vy', '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e', false) }
4
+ subject { Contentful::Bootstrap::Generator.new('wl1z0pal05vy', '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e', false, false) }
5
5
 
6
6
  describe 'user agent headers' do
7
7
  it 'client has proper integration data' do
8
- expect(subject.client.integration_info).to eq(name: 'bootstrap', version: Contentful::Bootstrap::VERSION)
8
+ expect(subject.client.app_info).to eq(name: 'bootstrap', version: Contentful::Bootstrap::VERSION)
9
9
  end
10
10
  end
11
11
 
@@ -19,7 +19,7 @@ describe Contentful::Bootstrap::Generator do
19
19
  end
20
20
 
21
21
  context 'with content_types_only set to true' do
22
- subject { Contentful::Bootstrap::Generator.new('wl1z0pal05vy', '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e', true) }
22
+ subject { Contentful::Bootstrap::Generator.new('wl1z0pal05vy', '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e', true, false) }
23
23
 
24
24
  it 'can generate a JSON template for a given space with only Content Types' do
25
25
  vcr('generate_json_content_types_only') {
@@ -0,0 +1,39 @@
1
+ {
2
+ "version": 3,
3
+ "contentTypes": [
4
+ {
5
+ "id": "testContentType",
6
+ "name": "Test Content Type",
7
+ "displayField": "title",
8
+ "fields": [
9
+ {
10
+ "id": "title",
11
+ "name": "Title",
12
+ "type": "Symbol"
13
+ }
14
+ ]
15
+ }
16
+ ],
17
+ "assets": [
18
+ {
19
+ "id": "3JX5vcHRhmAmaYwWq0S0wa",
20
+ "title": "Cat",
21
+ "file": {
22
+ "filename": "cat",
23
+ "url": "https://images.contentful.com/f3abi4dqvrhg/3JX5vcHRhmAmaYwWq0S0wa/9ba45c1084d8530702bcd0de5617c59b/cat.jpg"
24
+ }
25
+ }
26
+ ],
27
+ "entries": {
28
+ "testContentType": [
29
+ {
30
+ "sys": {
31
+ "id": "1uT4AXWJ1me40QsAgAeSIi"
32
+ },
33
+ "fields": {
34
+ "title": "Published Entry"
35
+ }
36
+ }
37
+ ]
38
+ }
39
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "version": 3,
3
+ "contentTypes": [
4
+ {
5
+ "id": "testContentType",
6
+ "name": "Test Content Type",
7
+ "displayField": "title",
8
+ "fields": [
9
+ {
10
+ "id": "title",
11
+ "name": "Title",
12
+ "type": "Symbol"
13
+ }
14
+ ]
15
+ }
16
+ ],
17
+ "assets": [
18
+
19
+ ],
20
+ "entries": {
21
+ "testContentType": [
22
+ {
23
+ "sys": {
24
+ "id": "1uT4AXWJ1me40QsAgAeSIi"
25
+ },
26
+ "fields": {
27
+ "title": "Published Entry"
28
+ }
29
+ },
30
+ {
31
+ "sys": {
32
+ "id": "49iT3aM9aUkK44KwuuyQow"
33
+ },
34
+ "fields": {
35
+ "title": "Draft Entry"
36
+ }
37
+ }
38
+ ]
39
+ }
40
+ }
@@ -241,6 +241,34 @@
241
241
  }
242
242
  ],
243
243
  "entries": {
244
+ "6XwpTaSiiI2Ak2Ww0oi6qa": [
245
+ {
246
+ "sys": {
247
+ "id": "7LAnCobuuWYSqks6wAwY2a"
248
+ },
249
+ "fields": {
250
+ "title": "Home & Kitchen",
251
+ "icon": {
252
+ "linkType": "Asset",
253
+ "id": "6m5AJ9vMPKc8OUoQeoCS4o"
254
+ },
255
+ "categoryDescription": "Shop for furniture, bedding, bath, vacuums, kitchen products, and more"
256
+ }
257
+ },
258
+ {
259
+ "sys": {
260
+ "id": "24DPGBDeGEaYy8ms4Y8QMQ"
261
+ },
262
+ "fields": {
263
+ "title": "Toys",
264
+ "icon": {
265
+ "linkType": "Asset",
266
+ "id": "6t4HKjytPi0mYgs240wkG"
267
+ },
268
+ "categoryDescription": "Shop for toys, games, educational aids"
269
+ }
270
+ }
271
+ ],
244
272
  "sFzTZbSuM8coEwygeUYes": [
245
273
  {
246
274
  "sys": {
@@ -248,16 +276,16 @@
248
276
  },
249
277
  "fields": {
250
278
  "companyName": "Lemnos",
251
- "website": "http://www.lemnos.jp/en/",
252
- "email": "info@acgears.com",
253
- "phone": [
254
- "+1 212 260 2269"
255
- ],
256
279
  "logo": {
257
280
  "linkType": "Asset",
258
281
  "id": "2Y8LhXLnYAYqKCGEWG4EKI"
259
282
  },
260
- "companyDescription": "TAKATA Lemnos Inc. was founded in 1947 as a brass casting manufacturing industry in Takaoka-city, Toyama Prefecture, Japan and we launched out into the full-scale business trade with Seiko Clock Co., Ltd. since 1966.\n\nWe entered into the development for the original planning from late 1980 and \"Lemnos Brand\" recognized as the global design clock by a masterpiece \"HOLA\" designed by Kazuo KAWASAKI which released in 1989.\n\nAfterwards, we made a lot of projects with well-known designers who took in active in Japan and overseas such as Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. and we made announcement of their fine works abounding in artistry and prominent designs. In addition, we realized to make a special project by the collaboration with Andrea Branzi, a well-known architect in the world.\n\nLemnos brand products are now highly praised from the design shops and the interior shops all over the world.\n\nIn recent years, we also have been given high priority to develop interior accessories making full use of our traditional techniques by the founding manufacturer and we always focus our minds on the development for the new Lemnos products in the new market.\n\nOur Lemnos products are made carefully by our craftsmen finely honed skillful techniques in Japan. They surely bring out the attractiveness of the materials to the maximum and create fine products not being influenced on the fashion trend accordingly. TAKATA Lemnos Inc. definitely would like to be innovative and continuously propose the beauty lasts forever."
283
+ "companyDescription": "TAKATA Lemnos Inc. was founded in 1947 as a brass casting manufacturing industry in Takaoka-city, Toyama Prefecture, Japan and we launched out into the full-scale business trade with Seiko Clock Co., Ltd. since 1966.\n\nWe entered into the development for the original planning from late 1980 and \"Lemnos Brand\" recognized as the global design clock by a masterpiece \"HOLA\" designed by Kazuo KAWASAKI which released in 1989.\n\nAfterwards, we made a lot of projects with well-known designers who took in active in Japan and overseas such as Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. and we made announcement of their fine works abounding in artistry and prominent designs. In addition, we realized to make a special project by the collaboration with Andrea Branzi, a well-known architect in the world.\n\nLemnos brand products are now highly praised from the design shops and the interior shops all over the world.\n\nIn recent years, we also have been given high priority to develop interior accessories making full use of our traditional techniques by the founding manufacturer and we always focus our minds on the development for the new Lemnos products in the new market.\n\nOur Lemnos products are made carefully by our craftsmen finely honed skillful techniques in Japan. They surely bring out the attractiveness of the materials to the maximum and create fine products not being influenced on the fashion trend accordingly. TAKATA Lemnos Inc. definitely would like to be innovative and continuously propose the beauty lasts forever.",
284
+ "website": "http://www.lemnos.jp/en/",
285
+ "email": "info@acgears.com",
286
+ "phone": [
287
+ "+1 212 260 2269"
288
+ ]
261
289
  }
262
290
  },
263
291
  {
@@ -284,12 +312,12 @@
284
312
  "id": "JrePkDVYomE8AwcuCUyMi"
285
313
  },
286
314
  "fields": {
287
- "companyDescription": "Playsam is the leading Scandinavian design company for executive wooden toy gift. Scandinavian design playful creativity, integrity and sophistication are Playsam. Scandinavian design and wooden toy makes Playsam gift lovely to the world of design since 1984.",
288
315
  "companyName": "Playsam",
289
316
  "logo": {
290
317
  "linkType": "Asset",
291
318
  "id": "4zj1ZOfHgQ8oqgaSKm4Qo2"
292
319
  },
320
+ "companyDescription": "Playsam is the leading Scandinavian design company for executive wooden toy gift. Scandinavian design playful creativity, integrity and sophistication are Playsam. Scandinavian design and wooden toy makes Playsam gift lovely to the world of design since 1984.",
293
321
  "website": "http://playsam.com/"
294
322
  }
295
323
  }
@@ -301,13 +329,22 @@
301
329
  },
302
330
  "fields": {
303
331
  "productName": "SoSo Wall Clock",
332
+ "slug": "soso-wall-clock",
304
333
  "productDescription": "The newly released SoSo Clock from Lemnos marries simple, clean design and bold, striking features. Its saturated marigold face is a lively pop of color to white or grey walls, but would also pair nicely with navy and maroon. Where most clocks feature numbers at the border of the clock, the SoSo brings them in tight to the middle, leaving a wide space between the numbers and the slight frame. The hour hand provides a nice interruption to the black and yellow of the clock - it is featured in a brilliant white. Despite its bold color and contrast, the SoSo maintains a clean, pure aesthetic that is suitable to a variety of contemporary interiors.",
334
+ "sizetypecolor": "10\" x 2.2\"",
305
335
  "image": [
306
336
  {
307
337
  "linkType": "Asset",
308
338
  "id": "KTRF62Q4gg60q6WCsWKw8"
309
339
  }
310
340
  ],
341
+ "tags": [
342
+ "home décor",
343
+ "clocks",
344
+ "interior design",
345
+ "yellow",
346
+ "gifts"
347
+ ],
311
348
  "categories": [
312
349
  {
313
350
  "linkType": "Entry",
@@ -315,8 +352,6 @@
315
352
  }
316
353
  ],
317
354
  "price": 120,
318
- "quantity": 3,
319
- "sku": "B00MG4ULK2",
320
355
  "tags": [
321
356
  "home décor",
322
357
  "clocks",
@@ -329,17 +364,55 @@
329
364
  "linkType": "Entry",
330
365
  "id": "4LgMotpNF6W20YKmuemW0a"
331
366
  },
367
+ "quantity": 3,
368
+ "sku": "B00MG4ULK2",
332
369
  "website": "http://store.dwell.com/soso-wall-clock.html",
333
370
  "slug": "soso-wall-clock"
334
371
  }
335
372
  },
373
+ {
374
+ "sys": {
375
+ "id": "3DVqIYj4dOwwcKu6sgqOgg"
376
+ },
377
+ "fields": {
378
+ "productName": "Hudson Wall Cup",
379
+ "slug": "hudson-wall-cup",
380
+ "productDescription": "Wall Hanging Glass Flower Vase and Terrarium",
381
+ "sizetypecolor": "3 x 3 x 5 inches; 5.3 ounces",
382
+ "image": [
383
+ {
384
+ "linkType": "Asset",
385
+ "id": "Xc0ny7GWsMEMCeASWO2um"
386
+ }
387
+ ],
388
+ "tags": [
389
+ "vase",
390
+ "flowers",
391
+ "accessories"
392
+ ],
393
+ "categories": [
394
+ {
395
+ "linkType": "Entry",
396
+ "id": "7LAnCobuuWYSqks6wAwY2a"
397
+ }
398
+ ],
399
+ "price": 11,
400
+ "brand": {
401
+ "linkType": "Entry",
402
+ "id": "651CQ8rLoIYCeY6G0QG22q"
403
+ },
404
+ "quantity": 101,
405
+ "sku": "B00E82D7I8",
406
+ "website": "http://www.amazon.com/dp/B00E82D7I8/"
407
+ }
408
+ },
336
409
  {
337
410
  "sys": {
338
411
  "id": "6dbjWqNd9SqccegcqYq224"
339
412
  },
340
413
  "fields": {
341
- "slug": "whisk-beater",
342
414
  "productName": "Whisk Beater",
415
+ "slug": "whisk-beater",
343
416
  "productDescription": "A creative little whisk that comes in 8 different colors. Handy and easy to clean after use. A great gift idea.",
344
417
  "sizetypecolor": "0.8 x 0.8 x 11.2 inches; 1.6 ounces",
345
418
  "image": [
@@ -361,14 +434,14 @@
361
434
  "id": "7LAnCobuuWYSqks6wAwY2a"
362
435
  }
363
436
  ],
364
- "website": "http://www.amazon.com/dp/B0081F2CCK/",
365
- "sku": "B0081F2CCK",
366
- "quantity": 89,
437
+ "price": 22,
367
438
  "brand": {
368
439
  "linkType": "Entry",
369
440
  "id": "651CQ8rLoIYCeY6G0QG22q"
370
441
  },
371
- "price": 22
442
+ "quantity": 89,
443
+ "sku": "B0081F2CCK",
444
+ "website": "http://www.amazon.com/dp/B0081F2CCK/"
372
445
  }
373
446
  },
374
447
  {
@@ -376,8 +449,8 @@
376
449
  "id": "5KsDBWseXY6QegucYAoacS"
377
450
  },
378
451
  "fields": {
379
- "slug": "playsam-streamliner-classic-car-espresso",
380
452
  "productName": "Playsam Streamliner Classic Car, Espresso",
453
+ "slug": "playsam-streamliner-classic-car-espresso",
381
454
  "productDescription": "A classic Playsam design, the Streamliner Classic Car has been selected as Swedish Design Classic by the Swedish National Museum for its inventive style and sleek surface. It's no wonder that this wooden car has also been a long-standing favorite for children both big and small!",
382
455
  "sizetypecolor": "Length: 135 mm | color: espresso, green, or icar (white)",
383
456
  "image": [
@@ -399,74 +472,14 @@
399
472
  "id": "24DPGBDeGEaYy8ms4Y8QMQ"
400
473
  }
401
474
  ],
402
- "website": "http://www.amazon.com/dp/B001R6JUZ2/",
403
- "sku": "B001R6JUZ2",
404
- "quantity": 56,
405
475
  "price": 44,
406
476
  "brand": {
407
477
  "linkType": "Entry",
408
478
  "id": "JrePkDVYomE8AwcuCUyMi"
409
- }
410
- }
411
- },
412
- {
413
- "sys": {
414
- "id": "3DVqIYj4dOwwcKu6sgqOgg"
415
- },
416
- "fields": {
417
- "slug": "hudson-wall-cup",
418
- "productName": "Hudson Wall Cup",
419
- "productDescription": "Wall Hanging Glass Flower Vase and Terrarium",
420
- "sizetypecolor": "3 x 3 x 5 inches; 5.3 ounces",
421
- "image": [
422
- {
423
- "linkType": "Asset",
424
- "id": "Xc0ny7GWsMEMCeASWO2um"
425
- }
426
- ],
427
- "tags": [
428
- "vase",
429
- "flowers",
430
- "accessories"
431
- ],
432
- "categories": [
433
- {
434
- "linkType": "Entry",
435
- "id": "7LAnCobuuWYSqks6wAwY2a"
436
- }
437
- ],
438
- "price": 11,
439
- "quantity": 101,
440
- "sku": "B00E82D7I8",
441
- "website": "http://www.amazon.com/dp/B00E82D7I8/"
442
- }
443
- }
444
- ],
445
- "6XwpTaSiiI2Ak2Ww0oi6qa": [
446
- {
447
- "sys": {
448
- "id": "7LAnCobuuWYSqks6wAwY2a"
449
- },
450
- "fields": {
451
- "title": "Home & Kitchen",
452
- "categoryDescription": "Shop for furniture, bedding, bath, vacuums, kitchen products, and more",
453
- "icon": {
454
- "linkType": "Asset",
455
- "id": "6m5AJ9vMPKc8OUoQeoCS4o"
456
- }
457
- }
458
- },
459
- {
460
- "sys": {
461
- "id": "24DPGBDeGEaYy8ms4Y8QMQ"
462
- },
463
- "fields": {
464
- "title": "Toys",
465
- "categoryDescription": "Shop for toys, games, educational aids",
466
- "icon": {
467
- "linkType": "Asset",
468
- "id": "6t4HKjytPi0mYgs240wkG"
469
- }
479
+ },
480
+ "quantity": 56,
481
+ "sku": "B001R6JUZ2",
482
+ "website": "http://www.amazon.com/dp/B001R6JUZ2/"
470
483
  }
471
484
  }
472
485
  ]