contentful_bootstrap 1.6.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -0
  3. data/.rubocop_todo.yml +123 -0
  4. data/.travis.yml +6 -0
  5. data/CHANGELOG.md +25 -0
  6. data/Gemfile +1 -0
  7. data/Guardfile +5 -0
  8. data/README.md +40 -14
  9. data/Rakefile +7 -0
  10. data/bin/contentful_bootstrap +33 -22
  11. data/contentful_bootstrap.gemspec +7 -0
  12. data/lib/contentful/bootstrap.rb +7 -5
  13. data/lib/contentful/bootstrap/command_runner.rb +45 -0
  14. data/lib/contentful/bootstrap/commands.rb +3 -168
  15. data/lib/contentful/bootstrap/commands/base.rb +66 -0
  16. data/lib/contentful/bootstrap/commands/create_space.rb +111 -0
  17. data/lib/contentful/bootstrap/commands/generate_json.rb +41 -0
  18. data/lib/contentful/bootstrap/commands/generate_token.rb +52 -0
  19. data/lib/contentful/bootstrap/constants.rb +2 -2
  20. data/lib/contentful/bootstrap/generator.rb +94 -0
  21. data/lib/contentful/bootstrap/server.rb +25 -17
  22. data/lib/contentful/bootstrap/support.rb +3 -2
  23. data/lib/contentful/bootstrap/templates.rb +4 -4
  24. data/lib/contentful/bootstrap/templates/base.rb +51 -30
  25. data/lib/contentful/bootstrap/templates/blog.rb +33 -33
  26. data/lib/contentful/bootstrap/templates/catalogue.rb +103 -103
  27. data/lib/contentful/bootstrap/templates/gallery.rb +55 -56
  28. data/lib/contentful/bootstrap/templates/json_template.rb +22 -16
  29. data/lib/contentful/bootstrap/templates/links.rb +2 -2
  30. data/lib/contentful/bootstrap/templates/links/asset.rb +2 -2
  31. data/lib/contentful/bootstrap/templates/links/base.rb +3 -3
  32. data/lib/contentful/bootstrap/templates/links/entry.rb +2 -2
  33. data/lib/contentful/bootstrap/token.rb +32 -31
  34. data/lib/contentful/bootstrap/version.rb +1 -1
  35. data/spec/contentful/bootstrap/command_runner_spec.rb +111 -0
  36. data/spec/contentful/bootstrap/commands/base_spec.rb +102 -0
  37. data/spec/contentful/bootstrap/commands/create_space_spec.rb +72 -0
  38. data/spec/contentful/bootstrap/commands/generate_json_spec.rb +64 -0
  39. data/spec/contentful/bootstrap/commands/generate_token_spec.rb +82 -0
  40. data/spec/contentful/bootstrap/generator_spec.rb +15 -0
  41. data/spec/contentful/bootstrap/server_spec.rb +154 -0
  42. data/spec/contentful/bootstrap/support_spec.rb +27 -0
  43. data/spec/contentful/bootstrap/templates/base_spec.rb +34 -0
  44. data/spec/contentful/bootstrap/templates/blog_spec.rb +32 -0
  45. data/spec/contentful/bootstrap/templates/catalogue_spec.rb +40 -0
  46. data/spec/contentful/bootstrap/templates/gallery_spec.rb +40 -0
  47. data/spec/contentful/bootstrap/templates/json_template_spec.rb +52 -0
  48. data/spec/contentful/bootstrap/templates/links/asset_spec.rb +23 -0
  49. data/spec/contentful/bootstrap/templates/links/base_spec.rb +31 -0
  50. data/spec/contentful/bootstrap/templates/links/entry_spec.rb +23 -0
  51. data/spec/contentful/bootstrap/token_spec.rb +143 -0
  52. data/spec/fixtures/ini_fixtures/contentfulrc.ini +2 -0
  53. data/spec/fixtures/ini_fixtures/no_global.ini +2 -0
  54. data/spec/fixtures/ini_fixtures/no_token.ini +1 -0
  55. data/spec/fixtures/ini_fixtures/sections.ini +5 -0
  56. data/spec/fixtures/json_fixtures/issue_22.json +77 -0
  57. data/spec/fixtures/json_fixtures/simple.json +34 -0
  58. data/spec/fixtures/json_fixtures/wl1z0pal05vy.json +437 -0
  59. data/spec/fixtures/vcr_fixtures/generate_json.yml +384 -0
  60. data/spec/fixtures/vcr_fixtures/issue_22.yml +2488 -0
  61. data/spec/spec_helper.rb +51 -0
  62. metadata +167 -4
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::Links::Asset do
4
+ subject { Contentful::Bootstrap::Templates::Links::Asset.new 'foo' }
5
+
6
+ describe 'instance methods' do
7
+ it '#link_type' do
8
+ expect(subject.link_type).to eq 'Asset'
9
+ end
10
+
11
+ it '#type' do
12
+ expect(subject.type).to eq 'Link'
13
+ end
14
+
15
+ it '#to_management_object' do
16
+ expect(subject.to_management_object).to be_a Contentful::Management::Asset
17
+ end
18
+
19
+ it '#management_class' do
20
+ expect(subject.management_class).to eq Contentful::Management::Asset
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::Links::Base do
4
+ subject { Contentful::Bootstrap::Templates::Links::Base.new 'foo' }
5
+
6
+ describe 'instance methods' do
7
+ it '#link_type' do
8
+ expect(subject.link_type).to eq 'Base'
9
+ end
10
+
11
+ it '#type' do
12
+ expect(subject.type).to eq 'Link'
13
+ end
14
+
15
+ describe 'abstract methods' do
16
+ it '#to_management_object' do
17
+ expect { subject.to_management_object }.to raise_error "must implement"
18
+ end
19
+
20
+ it '#management_class' do
21
+ expect { subject.management_class }.to raise_error "must implement"
22
+ end
23
+ end
24
+ end
25
+
26
+ describe 'properties' do
27
+ it ':id' do
28
+ expect(subject.id).to eq 'foo'
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::Links::Entry do
4
+ subject { Contentful::Bootstrap::Templates::Links::Entry.new 'foo' }
5
+
6
+ describe 'instance methods' do
7
+ it '#link_type' do
8
+ expect(subject.link_type).to eq 'Entry'
9
+ end
10
+
11
+ it '#type' do
12
+ expect(subject.type).to eq 'Link'
13
+ end
14
+
15
+ it '#to_management_object' do
16
+ expect(subject.to_management_object).to be_a Contentful::Management::Entry
17
+ end
18
+
19
+ it '#management_class' do
20
+ expect(subject.management_class).to eq Contentful::Management::Entry
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Token do
4
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'contentfulrc.ini')) }
5
+ let(:no_token_path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'no_token.ini')) }
6
+ let(:sections_path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'sections.ini')) }
7
+ let(:no_global_path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'no_global.ini')) }
8
+ subject { Contentful::Bootstrap::Token.new(path) }
9
+
10
+ describe 'attributes' do
11
+ it ':config_path' do
12
+ expect(subject.config_path).to eq path
13
+ end
14
+ end
15
+
16
+ describe 'initialize' do
17
+ it 'uses provided config_path' do
18
+ expect(subject.class.new('bar').config_path).to eq 'bar'
19
+ end
20
+ end
21
+
22
+ describe 'instance methods' do
23
+ describe '#present?' do
24
+ it 'non existing file returns false' do
25
+ expect(subject.class.new('foobar').present?).to be_falsey
26
+ end
27
+
28
+ it 'existing file without management token returns false' do
29
+ expect(subject.class.new(no_token_path).present?).to be_falsey
30
+ end
31
+
32
+ it 'existing file with management token returns true' do
33
+ expect(subject.present?).to be_truthy
34
+ end
35
+ end
36
+
37
+ describe '#filename' do
38
+ it 'returns default path if config_path is empty' do
39
+ expect(subject.class.new.filename).to eq ::File.join(ENV['HOME'], subject.class::DEFAULT_PATH)
40
+ end
41
+
42
+ it 'returns config_path' do
43
+ expect(subject.filename).to eq path
44
+ end
45
+ end
46
+
47
+ describe '#config_section' do
48
+ it 'returns default section by default' do
49
+ expect(subject.config_section).to eq 'global'
50
+ end
51
+
52
+ it 'returns default section if ENV["CONTENTFUL_ENV"] section does not exist' do
53
+ ENV['CONTENTFUL_ENV'] = 'blah'
54
+ expect(subject.class.new(sections_path).config_section).to eq 'global'
55
+ ENV['CONTENTFUL_ENV'] = ''
56
+ end
57
+
58
+ it 'returns ENV["CONTENTFUL_ENV"] section if exists' do
59
+ ENV['CONTENTFUL_ENV'] = 'other_section'
60
+ expect(subject.class.new(sections_path).config_section).to eq 'other_section'
61
+ ENV['CONTENTFUL_ENV'] = ''
62
+ end
63
+ end
64
+
65
+ describe '#read' do
66
+ it 'fails if "global" section does not exist' do
67
+ expect { subject.class.new(no_global_path).read }.to raise_error 'Token not found'
68
+ end
69
+
70
+ it 'fails if management token is not found' do
71
+ expect { subject.class.new(no_token_path).read }.to raise_error 'Token not found'
72
+ end
73
+
74
+ it 'returns token if its found' do
75
+ expect(subject.read).to eq 'foobar'
76
+ end
77
+ end
78
+
79
+ describe 'write methods' do
80
+ before do
81
+ @file = subject.config_file
82
+ expect(@file).to receive(:save)
83
+ end
84
+
85
+ it '#write_access_token' do
86
+
87
+ expect(@file.has_section?('some_space')).to be_falsey
88
+
89
+ subject.write_access_token('some_space', 'asd')
90
+
91
+ expect(@file['some_space']['CONTENTFUL_DELIVERY_ACCESS_TOKEN']).to eq 'asd'
92
+ end
93
+
94
+ it '#write_space_id' do
95
+ expect(@file.has_section?('some_space')).to be_falsey
96
+
97
+ subject.write_space_id('some_space', 'asd')
98
+
99
+ expect(@file['some_space']['SPACE_ID']).to eq 'asd'
100
+ end
101
+
102
+ describe '#write' do
103
+ it 'writes management tokens when only value is sent' do
104
+ expect(@file['global']['CONTENTFUL_MANAGEMENT_ACCESS_TOKEN']).to eq 'foobar'
105
+
106
+ subject.write('baz')
107
+
108
+ expect(@file['global']['CONTENTFUL_MANAGEMENT_ACCESS_TOKEN']).to eq 'baz'
109
+ end
110
+
111
+ it 'can write management tokens to any section' do
112
+ expect(@file.has_section?('blah')).to be_falsey
113
+
114
+ subject.write('baz', 'blah')
115
+
116
+ expect(@file['blah']['CONTENTFUL_MANAGEMENT_ACCESS_TOKEN']).to eq 'baz'
117
+ end
118
+
119
+ it 'can write any key to any section' do
120
+ expect(@file.has_section?('blah')).to be_falsey
121
+
122
+ subject.write('foo', 'bar', 'baz')
123
+
124
+ expect(@file['bar']['baz']).to eq 'foo'
125
+ end
126
+ end
127
+ end
128
+
129
+ describe '#==' do
130
+ it 'returns false when other is not a token' do
131
+ expect(subject == 1).to be_falsey
132
+ end
133
+
134
+ it 'returns false when other token does not have same config_path' do
135
+ expect(subject == subject.class.new('foo')).to be_falsey
136
+ end
137
+
138
+ it 'returns true when other token has same config_path' do
139
+ expect(subject == subject.class.new(path)).to be_truthy
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,2 @@
1
+ [global]
2
+ CONTENTFUL_MANAGEMENT_ACCESS_TOKEN = foobar
@@ -0,0 +1,2 @@
1
+ [other_section]
2
+ SPACE_ID = blah
@@ -0,0 +1 @@
1
+ [global]
@@ -0,0 +1,5 @@
1
+ [global]
2
+ CONTENTFUL_MANAGEMENT_ACCESS_TOKEN = foo
3
+
4
+ [other_section]
5
+ SPACE_ID = blah
@@ -0,0 +1,77 @@
1
+ {
2
+ "content_types": [
3
+ {
4
+ "id": "1VX60jHERm6yuem8I2agWG",
5
+ "name": "yolo",
6
+ "display_field": "title",
7
+ "fields": [
8
+ {
9
+ "id": "title",
10
+ "name": "title",
11
+ "type": "Symbol"
12
+ },
13
+ {
14
+ "id": "assets",
15
+ "name": "assets",
16
+ "type": "Array",
17
+ "items": {
18
+ "type": "Link",
19
+ "link_type": "Asset"
20
+ }
21
+ }
22
+ ]
23
+ }
24
+ ],
25
+ "assets": [
26
+ {
27
+ "id": "2cMU9UUngYMqAEmw4Cm8Iw",
28
+ "title": "Screen Shot 2015-11-18 at 11.42.12",
29
+ "file": {
30
+ "filename": "Screen Shot 2015-11-18 at 11.42.12",
31
+ "url": "https://images.contentful.com/o2n5bdfcee61/2cMU9UUngYMqAEmw4Cm8Iw/466d36d31bb59d487115b7be995438e1/Screen_Shot_2015-11-18_at_11.42.12.png"
32
+ }
33
+ },
34
+ {
35
+ "id": "4D5sv49qaAoMIkWgAW8g0I",
36
+ "title": "Screen Shot 2015-11-16 at 21.37.19",
37
+ "file": {
38
+ "filename": "Screen Shot 2015-11-16 at 21.37.19",
39
+ "url": "https://images.contentful.com/o2n5bdfcee61/4D5sv49qaAoMIkWgAW8g0I/b61adc1bc26a74ac9b65e19365747cf9/Screen_Shot_2015-11-16_at_21.37.19.png"
40
+ }
41
+ },
42
+ {
43
+ "id": "4eX9aQsDdeqweg6Si00KaW",
44
+ "title": "Screen Shot 2015-11-17 at 17.57.00",
45
+ "file": {
46
+ "filename": "Screen Shot 2015-11-17 at 17.57.00",
47
+ "url": "https://images.contentful.com/o2n5bdfcee61/4eX9aQsDdeqweg6Si00KaW/16646165346d59974fbfd4e0223ea89e/Screen_Shot_2015-11-17_at_17.57.00.png"
48
+ }
49
+ },
50
+ {
51
+ "id": "7i1Ck3BG4o4KeIEUGosEeU",
52
+ "title": "Screen Shot 2015-11-17 at 18.04.02",
53
+ "file": {
54
+ "filename": "Screen Shot 2015-11-17 at 18.04.02",
55
+ "url": "https://images.contentful.com/o2n5bdfcee61/7i1Ck3BG4o4KeIEUGosEeU/4db1a207ec69f99f0d795c48a59cbcd1/Screen_Shot_2015-11-17_at_18.04.02.png"
56
+ }
57
+ }
58
+ ],
59
+ "entries": {
60
+ "1VX60jHERm6yuem8I2agWG": [
61
+ {
62
+ "id": "5nQB3z8RgW8CUG6uGyCsEw",
63
+ "title": "yolo",
64
+ "assets": [
65
+ {
66
+ "link_type": "Asset",
67
+ "id": "4eX9aQsDdeqweg6Si00KaW"
68
+ },
69
+ {
70
+ "link_type": "Asset",
71
+ "id": "4D5sv49qaAoMIkWgAW8g0I"
72
+ }
73
+ ]
74
+ }
75
+ ]
76
+ }
77
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "content_types": [
3
+ {
4
+ "id": "cat",
5
+ "name": "Cat",
6
+ "displayField": "name",
7
+ "fields": [
8
+ {
9
+ "id": "name",
10
+ "name": "Name",
11
+ "type": "Symbol"
12
+ }
13
+ ]
14
+ }
15
+ ],
16
+ "assets": [
17
+ {
18
+ "id": "cat_asset",
19
+ "title": "Cat",
20
+ "file": {
21
+ "filename": "cat",
22
+ "url": "https://somecat.com/my_cat.jpeg"
23
+ }
24
+ }
25
+ ],
26
+ "entries": {
27
+ "cat": [
28
+ {
29
+ "id": "nyancat",
30
+ "name": "Nyan Cat"
31
+ }
32
+ ]
33
+ }
34
+ }
@@ -0,0 +1,437 @@
1
+ {
2
+ "content_types": [
3
+ {
4
+ "id": "2PqfXUJwE8qSYKuM0U6w8M",
5
+ "name": "Product",
6
+ "display_field": "productName",
7
+ "fields": [
8
+ {
9
+ "id": "productName",
10
+ "name": "Product name",
11
+ "type": "Text"
12
+ },
13
+ {
14
+ "id": "slug",
15
+ "name": "Slug",
16
+ "type": "Symbol"
17
+ },
18
+ {
19
+ "id": "productDescription",
20
+ "name": "Description",
21
+ "type": "Text"
22
+ },
23
+ {
24
+ "id": "sizetypecolor",
25
+ "name": "Size/Type/Color",
26
+ "type": "Symbol"
27
+ },
28
+ {
29
+ "id": "image",
30
+ "name": "Image",
31
+ "type": "Array",
32
+ "items": {
33
+ "type": "Link",
34
+ "link_type": "Asset"
35
+ }
36
+ },
37
+ {
38
+ "id": "tags",
39
+ "name": "Tags",
40
+ "type": "Array",
41
+ "items": {
42
+ "type": "Symbol"
43
+ }
44
+ },
45
+ {
46
+ "id": "categories",
47
+ "name": "Categories",
48
+ "type": "Array",
49
+ "items": {
50
+ "type": "Link",
51
+ "link_type": "Entry"
52
+ }
53
+ },
54
+ {
55
+ "id": "price",
56
+ "name": "Price",
57
+ "type": "Number"
58
+ },
59
+ {
60
+ "id": "brand",
61
+ "name": "Brand",
62
+ "type": "Link",
63
+ "link_type": "Entry"
64
+ },
65
+ {
66
+ "id": "quantity",
67
+ "name": "Quantity",
68
+ "type": "Integer"
69
+ },
70
+ {
71
+ "id": "sku",
72
+ "name": "SKU",
73
+ "type": "Symbol"
74
+ },
75
+ {
76
+ "id": "website",
77
+ "name": "Available at",
78
+ "type": "Symbol"
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ "id": "6XwpTaSiiI2Ak2Ww0oi6qa",
84
+ "name": "Category",
85
+ "display_field": "title",
86
+ "fields": [
87
+ {
88
+ "id": "title",
89
+ "name": "Title",
90
+ "type": "Text"
91
+ },
92
+ {
93
+ "id": "icon",
94
+ "name": "Icon",
95
+ "type": "Link",
96
+ "link_type": "Asset"
97
+ },
98
+ {
99
+ "id": "categoryDescription",
100
+ "name": "Description",
101
+ "type": "Text"
102
+ }
103
+ ]
104
+ },
105
+ {
106
+ "id": "sFzTZbSuM8coEwygeUYes",
107
+ "name": "Brand",
108
+ "display_field": "companyName",
109
+ "fields": [
110
+ {
111
+ "id": "companyName",
112
+ "name": "Company name",
113
+ "type": "Text"
114
+ },
115
+ {
116
+ "id": "logo",
117
+ "name": "Logo",
118
+ "type": "Link",
119
+ "link_type": "Asset"
120
+ },
121
+ {
122
+ "id": "companyDescription",
123
+ "name": "Description",
124
+ "type": "Text"
125
+ },
126
+ {
127
+ "id": "website",
128
+ "name": "Website",
129
+ "type": "Symbol"
130
+ },
131
+ {
132
+ "id": "twitter",
133
+ "name": "Twitter",
134
+ "type": "Symbol"
135
+ },
136
+ {
137
+ "id": "email",
138
+ "name": "Email",
139
+ "type": "Symbol"
140
+ },
141
+ {
142
+ "id": "phone",
143
+ "name": "Phone #",
144
+ "type": "Array",
145
+ "items": {
146
+ "type": "Symbol"
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ ],
152
+ "assets": [
153
+ {
154
+ "id": "10TkaLheGeQG6qQGqWYqUI",
155
+ "title": "Whisk beaters",
156
+ "file": {
157
+ "filename": "ryugj83mqwa1asojwtwb",
158
+ "url": "https://images.contentful.com/wl1z0pal05vy/10TkaLheGeQG6qQGqWYqUI/393edd89fbc3f322bb6ab050ca81831a/ryugj83mqwa1asojwtwb.jpg"
159
+ }
160
+ },
161
+ {
162
+ "id": "1MgbdJNTsMWKI0W68oYqkU",
163
+ "title": "Chive logo",
164
+ "file": {
165
+ "filename": "9ef190c59f0d375c0dea58b58a4bc1f0",
166
+ "url": "https://images.contentful.com/wl1z0pal05vy/1MgbdJNTsMWKI0W68oYqkU/380777caf3b9146060b3928d70af99a0/9ef190c59f0d375c0dea58b58a4bc1f0.jpeg"
167
+ }
168
+ },
169
+ {
170
+ "id": "2Y8LhXLnYAYqKCGEWG4EKI",
171
+ "title": "Lemnos",
172
+ "file": {
173
+ "filename": "lemnos-logo",
174
+ "url": "https://images.contentful.com/wl1z0pal05vy/2Y8LhXLnYAYqKCGEWG4EKI/6b12623a0f68ce40b5338c4f34b98b39/lemnos-logo.jpg"
175
+ }
176
+ },
177
+ {
178
+ "id": "3wtvPBbBjiMKqKKga8I2Cu",
179
+ "title": "Normann Copenhagen",
180
+ "file": {
181
+ "filename": "zJYzDlGk",
182
+ "url": "https://images.contentful.com/wl1z0pal05vy/3wtvPBbBjiMKqKKga8I2Cu/a5fd08c6dba9eb4cb6f6041bd4c4c700/zJYzDlGk.jpeg"
183
+ }
184
+ },
185
+ {
186
+ "id": "4zj1ZOfHgQ8oqgaSKm4Qo2",
187
+ "title": "Playsam",
188
+ "file": {
189
+ "filename": "playsam",
190
+ "url": "https://images.contentful.com/wl1z0pal05vy/4zj1ZOfHgQ8oqgaSKm4Qo2/7b37248b127698ee0d9da1d1d49ccac4/playsam.jpg"
191
+ }
192
+ },
193
+ {
194
+ "id": "6m5AJ9vMPKc8OUoQeoCS4o",
195
+ "title": "Home and Kitchen",
196
+ "file": {
197
+ "filename": "1418244847_Streamline-18-256",
198
+ "url": "https://images.contentful.com/wl1z0pal05vy/6m5AJ9vMPKc8OUoQeoCS4o/64b4c38aa13cb6c721e7597b0116e851/1418244847_Streamline-18-256.png"
199
+ }
200
+ },
201
+ {
202
+ "id": "6s3iG2OVmoUcosmA8ocqsG",
203
+ "title": "House icon",
204
+ "file": {
205
+ "filename": "1418244847_Streamline-18-256 (1)",
206
+ "url": "https://images.contentful.com/wl1z0pal05vy/6s3iG2OVmoUcosmA8ocqsG/07f529c1ea9e5ec0d7c23a063126020d/1418244847_Streamline-18-256__1_.png"
207
+ }
208
+ },
209
+ {
210
+ "id": "6t4HKjytPi0mYgs240wkG",
211
+ "title": "Toys",
212
+ "file": {
213
+ "filename": "toys_512pxGREY",
214
+ "url": "https://images.contentful.com/wl1z0pal05vy/6t4HKjytPi0mYgs240wkG/ce975e9d2c67af83fd570c08b961ac5e/toys_512pxGREY.png"
215
+ }
216
+ },
217
+ {
218
+ "id": "KTRF62Q4gg60q6WCsWKw8",
219
+ "title": "SoSo Wall Clock",
220
+ "file": {
221
+ "filename": "soso.clock",
222
+ "url": "https://images.contentful.com/wl1z0pal05vy/KTRF62Q4gg60q6WCsWKw8/8ef0460460c427b0671214500d259504/soso.clock.jpg"
223
+ }
224
+ },
225
+ {
226
+ "id": "Xc0ny7GWsMEMCeASWO2um",
227
+ "title": "Hudson Wall Cup ",
228
+ "file": {
229
+ "filename": "jqvtazcyfwseah9fmysz",
230
+ "url": "https://images.contentful.com/wl1z0pal05vy/Xc0ny7GWsMEMCeASWO2um/e3fb971932a49ee6ad3fc292cf7c14b3/jqvtazcyfwseah9fmysz.jpg"
231
+ }
232
+ },
233
+ {
234
+ "id": "wtrHxeu3zEoEce2MokCSi",
235
+ "title": "Playsam Streamliner",
236
+ "file": {
237
+ "filename": "quwowooybuqbl6ntboz3",
238
+ "url": "https://images.contentful.com/wl1z0pal05vy/wtrHxeu3zEoEce2MokCSi/88765b99dba8d69101cc58fce66b63c7/quwowooybuqbl6ntboz3.jpg"
239
+ }
240
+ }
241
+ ],
242
+ "entries": {
243
+ "sFzTZbSuM8coEwygeUYes": [
244
+ {
245
+ "id": "4LgMotpNF6W20YKmuemW0a",
246
+ "companyName": "Lemnos",
247
+ "website": "http://www.lemnos.jp/en/",
248
+ "email": "info@acgears.com",
249
+ "phone": [
250
+ "+1 212 260 2269"
251
+ ],
252
+ "logo": {
253
+ "link_type": "Asset",
254
+ "id": "2Y8LhXLnYAYqKCGEWG4EKI"
255
+ },
256
+ "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."
257
+ },
258
+ {
259
+ "id": "651CQ8rLoIYCeY6G0QG22q",
260
+ "companyName": "Normann Copenhagen",
261
+ "logo": {
262
+ "link_type": "Asset",
263
+ "id": "3wtvPBbBjiMKqKKga8I2Cu"
264
+ },
265
+ "companyDescription": "Normann Copenhagen is a way of living - a mindset. We love to challenge the conventional design rules. This is why you will find traditional materials put into untraditional use such as a Stone Hook made of Icelandic stones, a vase made out of silicon and last but not least a dog made out of plastic.",
266
+ "website": "http://www.normann-copenhagen.com/",
267
+ "twitter": "https://twitter.com/NormannCPH",
268
+ "email": "normann@normann-copenhagen.com",
269
+ "phone": [
270
+ "+45 35 55 44 59"
271
+ ]
272
+ },
273
+ {
274
+ "id": "JrePkDVYomE8AwcuCUyMi",
275
+ "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.",
276
+ "companyName": "Playsam",
277
+ "logo": {
278
+ "link_type": "Asset",
279
+ "id": "4zj1ZOfHgQ8oqgaSKm4Qo2"
280
+ },
281
+ "website": "http://playsam.com/"
282
+ }
283
+ ],
284
+ "2PqfXUJwE8qSYKuM0U6w8M": [
285
+ {
286
+ "id": "4BqrajvA8E6qwgkieoqmqO",
287
+ "productName": "SoSo Wall Clock",
288
+ "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.",
289
+ "image": [
290
+ {
291
+ "link_type": "Asset",
292
+ "id": "KTRF62Q4gg60q6WCsWKw8"
293
+ }
294
+ ],
295
+ "categories": [
296
+ {
297
+ "link_type": "Entry",
298
+ "id": "7LAnCobuuWYSqks6wAwY2a"
299
+ }
300
+ ],
301
+ "price": 120,
302
+ "quantity": 3,
303
+ "sku": "B00MG4ULK2",
304
+ "tags": [
305
+ "home décor",
306
+ "clocks",
307
+ "interior design",
308
+ "yellow",
309
+ "gifts"
310
+ ],
311
+ "sizetypecolor": "10\" x 2.2\"",
312
+ "brand": {
313
+ "link_type": "Entry",
314
+ "id": "4LgMotpNF6W20YKmuemW0a"
315
+ },
316
+ "website": "http://store.dwell.com/soso-wall-clock.html",
317
+ "slug": "soso-wall-clock"
318
+ },
319
+ {
320
+ "id": "6dbjWqNd9SqccegcqYq224",
321
+ "slug": "whisk-beater",
322
+ "productName": "Whisk Beater",
323
+ "productDescription": "A creative little whisk that comes in 8 different colors. Handy and easy to clean after use. A great gift idea.",
324
+ "sizetypecolor": "0.8 x 0.8 x 11.2 inches; 1.6 ounces",
325
+ "image": [
326
+ {
327
+ "link_type": "Asset",
328
+ "id": "10TkaLheGeQG6qQGqWYqUI"
329
+ }
330
+ ],
331
+ "tags": [
332
+ "kitchen",
333
+ "accessories",
334
+ "whisk",
335
+ "scandinavia",
336
+ "design"
337
+ ],
338
+ "categories": [
339
+ {
340
+ "link_type": "Entry",
341
+ "id": "7LAnCobuuWYSqks6wAwY2a"
342
+ }
343
+ ],
344
+ "website": "http://www.amazon.com/dp/B0081F2CCK/",
345
+ "sku": "B0081F2CCK",
346
+ "quantity": 89,
347
+ "brand": {
348
+ "link_type": "Entry",
349
+ "id": "651CQ8rLoIYCeY6G0QG22q"
350
+ },
351
+ "price": 22
352
+ },
353
+ {
354
+ "id": "5KsDBWseXY6QegucYAoacS",
355
+ "slug": "playsam-streamliner-classic-car-espresso",
356
+ "productName": "Playsam Streamliner Classic Car, Espresso",
357
+ "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!",
358
+ "sizetypecolor": "Length: 135 mm | color: espresso, green, or icar (white)",
359
+ "image": [
360
+ {
361
+ "link_type": "Asset",
362
+ "id": "wtrHxeu3zEoEce2MokCSi"
363
+ }
364
+ ],
365
+ "tags": [
366
+ "wood",
367
+ "toy",
368
+ "car",
369
+ "sweden",
370
+ "design"
371
+ ],
372
+ "categories": [
373
+ {
374
+ "link_type": "Entry",
375
+ "id": "24DPGBDeGEaYy8ms4Y8QMQ"
376
+ }
377
+ ],
378
+ "website": "http://www.amazon.com/dp/B001R6JUZ2/",
379
+ "sku": "B001R6JUZ2",
380
+ "quantity": 56,
381
+ "price": 44,
382
+ "brand": {
383
+ "link_type": "Entry",
384
+ "id": "JrePkDVYomE8AwcuCUyMi"
385
+ }
386
+ },
387
+ {
388
+ "id": "3DVqIYj4dOwwcKu6sgqOgg",
389
+ "slug": "hudson-wall-cup",
390
+ "productName": "Hudson Wall Cup",
391
+ "productDescription": "Wall Hanging Glass Flower Vase and Terrarium",
392
+ "sizetypecolor": "3 x 3 x 5 inches; 5.3 ounces",
393
+ "image": [
394
+ {
395
+ "link_type": "Asset",
396
+ "id": "Xc0ny7GWsMEMCeASWO2um"
397
+ }
398
+ ],
399
+ "tags": [
400
+ "vase",
401
+ "flowers",
402
+ "accessories"
403
+ ],
404
+ "categories": [
405
+ {
406
+ "link_type": "Entry",
407
+ "id": "7LAnCobuuWYSqks6wAwY2a"
408
+ }
409
+ ],
410
+ "price": 11,
411
+ "quantity": 101,
412
+ "sku": "B00E82D7I8",
413
+ "website": "http://www.amazon.com/dp/B00E82D7I8/"
414
+ }
415
+ ],
416
+ "6XwpTaSiiI2Ak2Ww0oi6qa": [
417
+ {
418
+ "id": "7LAnCobuuWYSqks6wAwY2a",
419
+ "title": "Home & Kitchen",
420
+ "categoryDescription": "Shop for furniture, bedding, bath, vacuums, kitchen products, and more",
421
+ "icon": {
422
+ "link_type": "Asset",
423
+ "id": "6m5AJ9vMPKc8OUoQeoCS4o"
424
+ }
425
+ },
426
+ {
427
+ "id": "24DPGBDeGEaYy8ms4Y8QMQ",
428
+ "title": "Toys",
429
+ "categoryDescription": "Shop for toys, games, educational aids",
430
+ "icon": {
431
+ "link_type": "Asset",
432
+ "id": "6t4HKjytPi0mYgs240wkG"
433
+ }
434
+ }
435
+ ]
436
+ }
437
+ }