contentful_bootstrap 3.9.1 → 3.10.0
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +3 -1
- data/bin/contentful_bootstrap +3 -0
- data/lib/contentful/bootstrap/command_runner.rb +8 -1
- data/lib/contentful/bootstrap/commands/generate_json.rb +5 -3
- data/lib/contentful/bootstrap/generator.rb +18 -4
- data/lib/contentful/bootstrap/version.rb +1 -1
- data/spec/contentful/bootstrap/command_runner_spec.rb +2 -2
- data/spec/contentful/bootstrap/commands/generate_json_spec.rb +32 -0
- data/spec/contentful/bootstrap/generator_spec.rb +2 -2
- data/spec/fixtures/json_fixtures/cfexampleapi_cat.json +154 -0
- data/spec/fixtures/json_fixtures/cfexampleapi_cat_human.json +202 -0
- data/spec/fixtures/vcr_fixtures/generate_json_multi_ct.yml +474 -0
- data/spec/fixtures/vcr_fixtures/generate_json_single_ct.yml +474 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87bf2f847f495230e20ba2d7ddaaf81f9549275a
|
4
|
+
data.tar.gz: 30ee1008a09c1297e319e82350256ad94892da13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4392ba1adde7708b019dd6b6fa6d50568435c2a57712f430639c54db9077479bac1183f9c58e52b75cee700cf8025aa2f4b6a90e352af5ef195cc6663348547f
|
7
|
+
data.tar.gz: dabba1d78944aecd7f117e95f85124ddf5be620c4b530576c65ac7adfa74d585838fef53d2341ee391b3627f35a6647bed15a4798c5d48d5148da2b98865e312
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## v3.10.0
|
6
|
+
### Added
|
7
|
+
* Added `--content-type-ids` filter to `generate_json` command to allow selecting which content types to import.
|
8
|
+
|
5
9
|
## v3.9.1
|
6
10
|
### Fixed
|
7
11
|
* Fixed an issue in which assets save as `Contentful::Management::File` objects instead of as JSON when using `--mark-processed`.
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ $ contentful_bootstrap generate_token <space_id> [--name token_name] [--config C
|
|
38
38
|
You can also generate JSON Templates from existing spaces by doing:
|
39
39
|
|
40
40
|
```bash
|
41
|
-
$ contentful_bootstrap generate_json <space_id> <delivery_api_access_token> [--output-file OUTPUT PATH] [--content-types-only] [--use-preview] [--quiet]
|
41
|
+
$ contentful_bootstrap generate_json <space_id> <delivery_api_access_token> [--output-file OUTPUT PATH] [--content-type-ids ct_id_1,ct_id_2] [--content-types-only] [--use-preview] [--quiet]
|
42
42
|
```
|
43
43
|
|
44
44
|
You can update existing spaces from JSON Templates by doing:
|
@@ -140,6 +140,7 @@ Contentful::Bootstrap::CommandRunner.new.generate_json(
|
|
140
140
|
use_preview: false, # if true will fetch from the Preview API instead of Delivery API
|
141
141
|
filename: nil, # path to file in which to store JSON
|
142
142
|
content_types_only: false, # if true will not fetch Entries and Assets
|
143
|
+
content_type_ids: [], # if any ID is specified, JSON will only include those content types and entries that have that content type
|
143
144
|
quiet: false, # if true will not output to STDOUT - only when filename is provided
|
144
145
|
no_input: false # if true all input operations won't be done, exceptions thrown with alternatives through configuration file in cases in which it cannot proceed
|
145
146
|
)
|
@@ -154,6 +155,7 @@ options = {
|
|
154
155
|
use_preview: false, # if true will fetch from the Preview API instead of Delivery API
|
155
156
|
filename: "template.json", # Will save the JSON to the specified file
|
156
157
|
content_types_only: false, # if true will not fetch Entries and Assets
|
158
|
+
content_type_ids: [], # if any ID is specified, JSON will only include those content types and entries that have that content type
|
157
159
|
quiet: false, # if true will not output to STDOUT
|
158
160
|
no_input: false # if true all input operations won't be done, exceptions thrown with alternatives through configuration file in cases in which it cannot proceed
|
159
161
|
}
|
data/bin/contentful_bootstrap
CHANGED
@@ -83,6 +83,9 @@ subcommands = {
|
|
83
83
|
opts.on("-p", "--use-preview", "Use Preview API") do |p|
|
84
84
|
options[:use_preview] = p
|
85
85
|
end
|
86
|
+
opts.on("-i", "--content-type-ids <ID_1>,<ID_2>", ::Array, "Array of content type IDs to import") do |ids|
|
87
|
+
options[:content_type_ids] = ids
|
88
|
+
end
|
86
89
|
opts.on("-o OUTPUT_PATH", "--output-file OUTPUT_PATH", "Specify Output File") do |f|
|
87
90
|
options[:filename] = f
|
88
91
|
end
|
@@ -35,11 +35,18 @@ module Contentful
|
|
35
35
|
content_types_only = options.fetch(:content_types_only, false)
|
36
36
|
quiet = options.fetch(:quiet, false)
|
37
37
|
use_preview = options.fetch(:use_preview, false)
|
38
|
+
content_type_ids = options.fetch(:content_type_ids, [])
|
38
39
|
|
39
40
|
fail 'Access Token required' if access_token.nil?
|
40
41
|
|
41
42
|
Contentful::Bootstrap::Commands::GenerateJson.new(
|
42
|
-
space_id,
|
43
|
+
space_id,
|
44
|
+
access_token,
|
45
|
+
filename,
|
46
|
+
content_types_only,
|
47
|
+
quiet,
|
48
|
+
use_preview,
|
49
|
+
content_type_ids
|
43
50
|
).run
|
44
51
|
end
|
45
52
|
end
|
@@ -5,14 +5,15 @@ module Contentful
|
|
5
5
|
module Bootstrap
|
6
6
|
module Commands
|
7
7
|
class GenerateJson
|
8
|
-
attr_reader :space_id, :filename, :access_token, :content_types_only, :use_preview
|
9
|
-
def initialize(space_id, access_token, filename = nil, content_types_only = false, quiet = false, use_preview = false)
|
8
|
+
attr_reader :space_id, :filename, :access_token, :content_types_only, :use_preview, :content_type_ids
|
9
|
+
def initialize(space_id, access_token, filename = nil, content_types_only = false, quiet = false, use_preview = false, content_type_ids = [])
|
10
10
|
@space_id = space_id
|
11
11
|
@access_token = access_token
|
12
12
|
@filename = filename
|
13
13
|
@content_types_only = content_types_only
|
14
14
|
@quiet = quiet
|
15
15
|
@use_preview = use_preview
|
16
|
+
@content_type_ids = content_type_ids
|
16
17
|
end
|
17
18
|
|
18
19
|
def run
|
@@ -29,7 +30,8 @@ module Contentful
|
|
29
30
|
space_id,
|
30
31
|
access_token,
|
31
32
|
content_types_only,
|
32
|
-
use_preview
|
33
|
+
use_preview,
|
34
|
+
content_type_ids
|
33
35
|
).generate_json
|
34
36
|
|
35
37
|
write(json)
|
@@ -10,9 +10,9 @@ module Contentful
|
|
10
10
|
DELIVERY_API_URL = 'cdn.contentful.com'.freeze
|
11
11
|
PREVIEW_API_URL = 'preview.contentful.com'.freeze
|
12
12
|
|
13
|
-
attr_reader :content_types_only, :client
|
13
|
+
attr_reader :content_types_only, :content_type_ids, :client
|
14
14
|
|
15
|
-
def initialize(space_id, access_token, content_types_only, use_preview)
|
15
|
+
def initialize(space_id, access_token, content_types_only, use_preview, content_type_ids)
|
16
16
|
@client = Contentful::Client.new(
|
17
17
|
access_token: access_token,
|
18
18
|
space: space_id,
|
@@ -21,6 +21,7 @@ module Contentful
|
|
21
21
|
api_url: use_preview ? PREVIEW_API_URL : DELIVERY_API_URL
|
22
22
|
)
|
23
23
|
@content_types_only = content_types_only
|
24
|
+
@content_type_ids = content_type_ids
|
24
25
|
end
|
25
26
|
|
26
27
|
def generate_json
|
@@ -35,7 +36,10 @@ module Contentful
|
|
35
36
|
private
|
36
37
|
|
37
38
|
def content_types
|
38
|
-
|
39
|
+
query = {}
|
40
|
+
query['sys.id[in]'] = content_type_ids.join(',') unless content_type_ids.empty?
|
41
|
+
|
42
|
+
proccessed_content_types = @client.content_types(query).map do |type|
|
39
43
|
result = { 'id' => type.sys[:id], 'name' => type.name }
|
40
44
|
result['displayField'] = type.display_field unless type.display_field.nil?
|
41
45
|
|
@@ -80,7 +84,17 @@ module Contentful
|
|
80
84
|
entries = {}
|
81
85
|
|
82
86
|
query = { order: 'sys.createdAt', limit: 1000 }
|
83
|
-
|
87
|
+
count_query = { limit: 1 }
|
88
|
+
|
89
|
+
unless content_type_ids.empty?
|
90
|
+
search_key = 'sys.contentType.sys.id[in]'
|
91
|
+
ids = content_type_ids.join(',')
|
92
|
+
|
93
|
+
query[search_key] = ids
|
94
|
+
count_query[search_key] = ids
|
95
|
+
end
|
96
|
+
|
97
|
+
entries_count = @client.entries(count_query).total
|
84
98
|
((entries_count / 1000) + 1).times do |i|
|
85
99
|
query[:skip] = i * 1000
|
86
100
|
|
@@ -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, false, 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, false, false
|
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,6 +48,38 @@ describe Contentful::Bootstrap::Commands::GenerateJson do
|
|
48
48
|
subject.run
|
49
49
|
}
|
50
50
|
end
|
51
|
+
|
52
|
+
describe 'specific content types' do
|
53
|
+
it 'can select a single content type' do
|
54
|
+
vcr('generate_json_single_ct') {
|
55
|
+
subject.instance_variable_set(:@space_id, 'cfexampleapi')
|
56
|
+
subject.instance_variable_set(:@access_token, 'b4c0n73n7fu1')
|
57
|
+
subject.instance_variable_set(:@content_type_ids, ['cat'])
|
58
|
+
subject.instance_variable_set(:@quiet, true)
|
59
|
+
|
60
|
+
json_fixture('cfexampleapi_cat') { |json|
|
61
|
+
expect(subject).to receive(:write).with(JSON.pretty_generate(json))
|
62
|
+
}
|
63
|
+
|
64
|
+
subject.run
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'can select multiple content types' do
|
69
|
+
vcr('generate_json_multi_ct') {
|
70
|
+
subject.instance_variable_set(:@space_id, 'cfexampleapi')
|
71
|
+
subject.instance_variable_set(:@access_token, 'b4c0n73n7fu1')
|
72
|
+
subject.instance_variable_set(:@content_type_ids, ['cat', 'human'])
|
73
|
+
subject.instance_variable_set(:@quiet, true)
|
74
|
+
|
75
|
+
json_fixture('cfexampleapi_cat_human') { |json|
|
76
|
+
expect(subject).to receive(:write).with(JSON.pretty_generate(json))
|
77
|
+
}
|
78
|
+
|
79
|
+
subject.run
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
51
83
|
end
|
52
84
|
|
53
85
|
describe '#write' do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Contentful::Bootstrap::Generator do
|
4
|
-
subject { Contentful::Bootstrap::Generator.new('wl1z0pal05vy', '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e', false, 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
|
@@ -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, false) }
|
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,154 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"contentTypes": [
|
4
|
+
{
|
5
|
+
"id": "cat",
|
6
|
+
"name": "Cat",
|
7
|
+
"displayField": "name",
|
8
|
+
"fields": [
|
9
|
+
{
|
10
|
+
"id": "name",
|
11
|
+
"name": "Name",
|
12
|
+
"type": "Text"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"id": "likes",
|
16
|
+
"name": "Likes",
|
17
|
+
"type": "Array",
|
18
|
+
"items": {
|
19
|
+
"type": "Symbol"
|
20
|
+
}
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"id": "color",
|
24
|
+
"name": "Color",
|
25
|
+
"type": "Symbol"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"id": "bestFriend",
|
29
|
+
"name": "Best Friend",
|
30
|
+
"type": "Link",
|
31
|
+
"linkType": "Entry"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"id": "birthday",
|
35
|
+
"name": "Birthday",
|
36
|
+
"type": "Date"
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"id": "lifes",
|
40
|
+
"name": "Lifes left",
|
41
|
+
"type": "Integer"
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"id": "lives",
|
45
|
+
"name": "Lives left",
|
46
|
+
"type": "Integer"
|
47
|
+
},
|
48
|
+
{
|
49
|
+
"id": "image",
|
50
|
+
"name": "Image",
|
51
|
+
"type": "Link",
|
52
|
+
"linkType": "Asset"
|
53
|
+
}
|
54
|
+
]
|
55
|
+
}
|
56
|
+
],
|
57
|
+
"assets": [
|
58
|
+
{
|
59
|
+
"id": "1x0xpXu4pSGS4OukSyWGUK",
|
60
|
+
"title": "Doge",
|
61
|
+
"file": {
|
62
|
+
"filename": "doge",
|
63
|
+
"url": "https://images.contentful.com/cfexampleapi/1x0xpXu4pSGS4OukSyWGUK/cc1239c6385428ef26f4180190532818/doge.jpg"
|
64
|
+
}
|
65
|
+
},
|
66
|
+
{
|
67
|
+
"id": "happycat",
|
68
|
+
"title": "Happy Cat",
|
69
|
+
"file": {
|
70
|
+
"filename": "happycatw",
|
71
|
+
"url": "https://images.contentful.com/cfexampleapi/3MZPnjZTIskAIIkuuosCss/382a48dfa2cb16c47aa2c72f7b23bf09/happycatw.jpg"
|
72
|
+
}
|
73
|
+
},
|
74
|
+
{
|
75
|
+
"id": "jake",
|
76
|
+
"title": "Jake",
|
77
|
+
"file": {
|
78
|
+
"filename": "jake",
|
79
|
+
"url": "https://images.contentful.com/cfexampleapi/4hlteQAXS8iS0YCMU6QMWg/2a4d826144f014109364ccf5c891d2dd/jake.png"
|
80
|
+
}
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"id": "nyancat",
|
84
|
+
"title": "Nyan Cat",
|
85
|
+
"file": {
|
86
|
+
"filename": "Nyan_cat_250px_frame",
|
87
|
+
"url": "https://images.contentful.com/cfexampleapi/4gp6taAwW4CmSgumq2ekUm/9da0cd1936871b8d72343e895a00d611/Nyan_cat_250px_frame.png"
|
88
|
+
}
|
89
|
+
}
|
90
|
+
],
|
91
|
+
"entries": {
|
92
|
+
"cat": [
|
93
|
+
{
|
94
|
+
"sys": {
|
95
|
+
"id": "nyancat"
|
96
|
+
},
|
97
|
+
"fields": {
|
98
|
+
"name": "Nyan Cat",
|
99
|
+
"likes": [
|
100
|
+
"rainbows",
|
101
|
+
"fish"
|
102
|
+
],
|
103
|
+
"color": "rainbow",
|
104
|
+
"bestFriend": {
|
105
|
+
"linkType": "Entry",
|
106
|
+
"id": "happycat"
|
107
|
+
},
|
108
|
+
"birthday": "2011-04-04T22:00:00+00:00",
|
109
|
+
"lives": 1337,
|
110
|
+
"image": {
|
111
|
+
"linkType": "Asset",
|
112
|
+
"id": "nyancat"
|
113
|
+
}
|
114
|
+
}
|
115
|
+
},
|
116
|
+
{
|
117
|
+
"sys": {
|
118
|
+
"id": "happycat"
|
119
|
+
},
|
120
|
+
"fields": {
|
121
|
+
"name": "Happy Cat",
|
122
|
+
"likes": [
|
123
|
+
"cheezburger"
|
124
|
+
],
|
125
|
+
"color": "gray",
|
126
|
+
"bestFriend": {
|
127
|
+
"linkType": "Entry",
|
128
|
+
"id": "nyancat"
|
129
|
+
},
|
130
|
+
"birthday": "2003-10-28T23:00:00+00:00",
|
131
|
+
"lives": 1,
|
132
|
+
"image": {
|
133
|
+
"linkType": "Asset",
|
134
|
+
"id": "happycat"
|
135
|
+
}
|
136
|
+
}
|
137
|
+
},
|
138
|
+
{
|
139
|
+
"sys": {
|
140
|
+
"id": "garfield"
|
141
|
+
},
|
142
|
+
"fields": {
|
143
|
+
"name": "Garfield",
|
144
|
+
"likes": [
|
145
|
+
"lasagna"
|
146
|
+
],
|
147
|
+
"color": "orange",
|
148
|
+
"birthday": "1979-06-18T23:00:00+00:00",
|
149
|
+
"lives": 9
|
150
|
+
}
|
151
|
+
}
|
152
|
+
]
|
153
|
+
}
|
154
|
+
}
|
@@ -0,0 +1,202 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"contentTypes": [
|
4
|
+
{
|
5
|
+
"id": "cat",
|
6
|
+
"name": "Cat",
|
7
|
+
"displayField": "name",
|
8
|
+
"fields": [
|
9
|
+
{
|
10
|
+
"id": "name",
|
11
|
+
"name": "Name",
|
12
|
+
"type": "Text"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"id": "likes",
|
16
|
+
"name": "Likes",
|
17
|
+
"type": "Array",
|
18
|
+
"items": {
|
19
|
+
"type": "Symbol"
|
20
|
+
}
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"id": "color",
|
24
|
+
"name": "Color",
|
25
|
+
"type": "Symbol"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"id": "bestFriend",
|
29
|
+
"name": "Best Friend",
|
30
|
+
"type": "Link",
|
31
|
+
"linkType": "Entry"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"id": "birthday",
|
35
|
+
"name": "Birthday",
|
36
|
+
"type": "Date"
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"id": "lifes",
|
40
|
+
"name": "Lifes left",
|
41
|
+
"type": "Integer"
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"id": "lives",
|
45
|
+
"name": "Lives left",
|
46
|
+
"type": "Integer"
|
47
|
+
},
|
48
|
+
{
|
49
|
+
"id": "image",
|
50
|
+
"name": "Image",
|
51
|
+
"type": "Link",
|
52
|
+
"linkType": "Asset"
|
53
|
+
}
|
54
|
+
]
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"id": "human",
|
58
|
+
"name": "Human",
|
59
|
+
"displayField": "name",
|
60
|
+
"fields": [
|
61
|
+
{
|
62
|
+
"id": "name",
|
63
|
+
"name": "Name",
|
64
|
+
"type": "Text"
|
65
|
+
},
|
66
|
+
{
|
67
|
+
"id": "description",
|
68
|
+
"name": "Description",
|
69
|
+
"type": "Text"
|
70
|
+
},
|
71
|
+
{
|
72
|
+
"id": "likes",
|
73
|
+
"name": "Likes",
|
74
|
+
"type": "Array",
|
75
|
+
"items": {
|
76
|
+
"type": "Symbol"
|
77
|
+
}
|
78
|
+
},
|
79
|
+
{
|
80
|
+
"id": "image",
|
81
|
+
"name": "Image",
|
82
|
+
"type": "Array",
|
83
|
+
"items": {
|
84
|
+
"type": "Link",
|
85
|
+
"linkType": "Asset"
|
86
|
+
}
|
87
|
+
}
|
88
|
+
]
|
89
|
+
}
|
90
|
+
],
|
91
|
+
"assets": [
|
92
|
+
{
|
93
|
+
"id": "1x0xpXu4pSGS4OukSyWGUK",
|
94
|
+
"title": "Doge",
|
95
|
+
"file": {
|
96
|
+
"filename": "doge",
|
97
|
+
"url": "https://images.contentful.com/cfexampleapi/1x0xpXu4pSGS4OukSyWGUK/cc1239c6385428ef26f4180190532818/doge.jpg"
|
98
|
+
}
|
99
|
+
},
|
100
|
+
{
|
101
|
+
"id": "happycat",
|
102
|
+
"title": "Happy Cat",
|
103
|
+
"file": {
|
104
|
+
"filename": "happycatw",
|
105
|
+
"url": "https://images.contentful.com/cfexampleapi/3MZPnjZTIskAIIkuuosCss/382a48dfa2cb16c47aa2c72f7b23bf09/happycatw.jpg"
|
106
|
+
}
|
107
|
+
},
|
108
|
+
{
|
109
|
+
"id": "jake",
|
110
|
+
"title": "Jake",
|
111
|
+
"file": {
|
112
|
+
"filename": "jake",
|
113
|
+
"url": "https://images.contentful.com/cfexampleapi/4hlteQAXS8iS0YCMU6QMWg/2a4d826144f014109364ccf5c891d2dd/jake.png"
|
114
|
+
}
|
115
|
+
},
|
116
|
+
{
|
117
|
+
"id": "nyancat",
|
118
|
+
"title": "Nyan Cat",
|
119
|
+
"file": {
|
120
|
+
"filename": "Nyan_cat_250px_frame",
|
121
|
+
"url": "https://images.contentful.com/cfexampleapi/4gp6taAwW4CmSgumq2ekUm/9da0cd1936871b8d72343e895a00d611/Nyan_cat_250px_frame.png"
|
122
|
+
}
|
123
|
+
}
|
124
|
+
],
|
125
|
+
"entries": {
|
126
|
+
"cat": [
|
127
|
+
{
|
128
|
+
"sys": {
|
129
|
+
"id": "nyancat"
|
130
|
+
},
|
131
|
+
"fields": {
|
132
|
+
"name": "Nyan Cat",
|
133
|
+
"likes": [
|
134
|
+
"rainbows",
|
135
|
+
"fish"
|
136
|
+
],
|
137
|
+
"color": "rainbow",
|
138
|
+
"bestFriend": {
|
139
|
+
"linkType": "Entry",
|
140
|
+
"id": "happycat"
|
141
|
+
},
|
142
|
+
"birthday": "2011-04-04T22:00:00+00:00",
|
143
|
+
"lives": 1337,
|
144
|
+
"image": {
|
145
|
+
"linkType": "Asset",
|
146
|
+
"id": "nyancat"
|
147
|
+
}
|
148
|
+
}
|
149
|
+
},
|
150
|
+
{
|
151
|
+
"sys": {
|
152
|
+
"id": "happycat"
|
153
|
+
},
|
154
|
+
"fields": {
|
155
|
+
"name": "Happy Cat",
|
156
|
+
"likes": [
|
157
|
+
"cheezburger"
|
158
|
+
],
|
159
|
+
"color": "gray",
|
160
|
+
"bestFriend": {
|
161
|
+
"linkType": "Entry",
|
162
|
+
"id": "nyancat"
|
163
|
+
},
|
164
|
+
"birthday": "2003-10-28T23:00:00+00:00",
|
165
|
+
"lives": 1,
|
166
|
+
"image": {
|
167
|
+
"linkType": "Asset",
|
168
|
+
"id": "happycat"
|
169
|
+
}
|
170
|
+
}
|
171
|
+
},
|
172
|
+
{
|
173
|
+
"sys": {
|
174
|
+
"id": "garfield"
|
175
|
+
},
|
176
|
+
"fields": {
|
177
|
+
"name": "Garfield",
|
178
|
+
"likes": [
|
179
|
+
"lasagna"
|
180
|
+
],
|
181
|
+
"color": "orange",
|
182
|
+
"birthday": "1979-06-18T23:00:00+00:00",
|
183
|
+
"lives": 9
|
184
|
+
}
|
185
|
+
}
|
186
|
+
],
|
187
|
+
"human": [
|
188
|
+
{
|
189
|
+
"sys": {
|
190
|
+
"id": "finn"
|
191
|
+
},
|
192
|
+
"fields": {
|
193
|
+
"name": "Finn",
|
194
|
+
"description": "Fearless adventurer! Defender of pancakes.",
|
195
|
+
"likes": [
|
196
|
+
"adventure"
|
197
|
+
]
|
198
|
+
}
|
199
|
+
}
|
200
|
+
]
|
201
|
+
}
|
202
|
+
}
|