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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +42 -5
- data/bin/contentful_bootstrap +9 -0
- data/lib/contentful/bootstrap/command_runner.rb +3 -1
- data/lib/contentful/bootstrap/commands/base.rb +2 -2
- data/lib/contentful/bootstrap/commands/create_space.rb +2 -1
- data/lib/contentful/bootstrap/commands/generate_json.rb +22 -10
- data/lib/contentful/bootstrap/commands/update_space.rb +3 -1
- data/lib/contentful/bootstrap/generator.rb +48 -26
- data/lib/contentful/bootstrap/templates/base.rb +31 -18
- data/lib/contentful/bootstrap/templates/json_template.rb +2 -2
- data/lib/contentful/bootstrap/version.rb +1 -1
- data/spec/contentful/bootstrap/command_runner_spec.rb +2 -2
- data/spec/contentful/bootstrap/commands/base_spec.rb +2 -2
- data/spec/contentful/bootstrap/commands/create_space_spec.rb +19 -0
- data/spec/contentful/bootstrap/commands/generate_json_spec.rb +17 -0
- data/spec/contentful/bootstrap/commands/update_space_spec.rb +73 -21
- data/spec/contentful/bootstrap/generator_spec.rb +3 -3
- data/spec/fixtures/json_fixtures/assets_draft.json +39 -0
- data/spec/fixtures/json_fixtures/f3abi4dqvrhg_preview.json +40 -0
- data/spec/fixtures/json_fixtures/wl1z0pal05vy.json +92 -79
- data/spec/fixtures/vcr_fixtures/check_update_space_with_draft_content.yml +444 -0
- data/spec/fixtures/vcr_fixtures/generate_json.yml +221 -207
- data/spec/fixtures/vcr_fixtures/generate_json_preview.yml +421 -0
- data/spec/fixtures/vcr_fixtures/update_existing_asset.yml +1802 -0
- metadata +12 -2
@@ -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
|
@@ -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
|
-
|
52
|
-
|
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
|
-
|
63
|
-
|
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
|
-
|
68
|
-
}
|
66
|
+
it 'calls JsonTemplate with skip_content_types' do
|
67
|
+
allow(::File).to receive(:exist?) { true }
|
69
68
|
|
70
|
-
|
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
|
-
|
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
|
-
|
81
|
-
}
|
76
|
+
subject.run
|
82
77
|
end
|
83
78
|
end
|
84
79
|
|
85
|
-
context 'with
|
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
|
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,
|
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.
|
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
|
-
"
|
365
|
-
"sku": "B0081F2CCK",
|
366
|
-
"quantity": 89,
|
437
|
+
"price": 22,
|
367
438
|
"brand": {
|
368
439
|
"linkType": "Entry",
|
369
440
|
"id": "651CQ8rLoIYCeY6G0QG22q"
|
370
441
|
},
|
371
|
-
"
|
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
|
]
|