jekyll-contentful-data-import 1.7.0 → 1.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37c1c1b1bddb8164bcc950d2e370ae3e15327c44c5d4c34cbd5f7b38429414d7
4
- data.tar.gz: c5aed758e4839abb2bc8dfe08ba883cd437d7c0c1c908b44a6362d35e84cac54
3
+ metadata.gz: 462c56e5cdfd73612d643ab860e3390149fc360462ab6027d63b54106fb99894
4
+ data.tar.gz: 1926f296f8fc998dceec8b221c1000b610a25c5167713a15e1764f719ee1d08d
5
5
  SHA512:
6
- metadata.gz: 3ceb1ae089f35241ff5b64a7069d5e00f0c13d890ca0608f2b63a2f0e20f110c013024893a629c4f1b1c7440169830365d234365ed76eae8535671bcdace34b4
7
- data.tar.gz: d11c17b6f0a9479fe7e036bc424eb14b8b542764c9ce354e730db94f62859356b5feee21bdd55433c59884d27fdcf6a642c6994b81f1d32351b14917ea629015
6
+ metadata.gz: 8b7a6998dc83466dc49f0058b3341901342d687c2c9abe6e5033425e11543f999cc6e60a769d1a471af08fb6bcf0094b552b8aa8bf9d1fe4b404c4d08f1fa7ce
7
+ data.tar.gz: bbe933c2c443d34ab33efdcca9fb2d97b3a22ebd8aec23aa2503473a18c228919b719ce9e5a134ad3993477c85336a1f4d4bd0d083f8339b2165430b9b917d4c
data/.rubocop_todo.yml CHANGED
@@ -23,7 +23,7 @@ Metrics/CyclomaticComplexity:
23
23
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
24
24
  # URISchemes: http, https
25
25
  Metrics/LineLength:
26
- Max: 100
26
+ Max: 120
27
27
 
28
28
  # Offense count: 3
29
29
  # Configuration parameters: CountComments.
@@ -33,6 +33,6 @@ Metrics/MethodLength:
33
33
  # Offense count: 1
34
34
  # Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
35
35
  # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
36
- Style/FileName:
36
+ Naming/FileName:
37
37
  Exclude:
38
38
  - 'lib/jekyll-contentful-data-import.rb'
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v1.8.0
6
+ ### Added
7
+ * Added capability to autoload mappers [#22](https://github.com/contentful/jekyll-contentful-data-import/issues/22)
8
+ * *This feature is currently in BETA state, changes may occur as patch fixes* Added support for RichText and added the `rich_text` view filter.
9
+
5
10
  ## v1.7.0
6
11
  ### Added
7
12
  * Added top-level environment assignment, with support for `ENV_` access [#61](https://github.com/contentful/jekyll-contentful-data-import/issues/61)
data/README.md CHANGED
@@ -43,23 +43,25 @@ To configure the extension, add the following configuration block to Jekyll's `_
43
43
  ```yaml
44
44
  contentful:
45
45
  spaces:
46
- - example: # Jekyll _data folder identifier - Required
47
- space: cfexampleapi # Required
48
- access_token: b4c0n73n7fu1 # Required
49
- environment: master # Optional
50
- cda_query: # Optional
46
+ - example: # Jekyll _data folder identifier - Required
47
+ space: cfexampleapi # Required
48
+ access_token: b4c0n73n7fu1 # Required
49
+ environment: master # Optional
50
+ cda_query: # Optional
51
51
  include: 2
52
52
  limit: 100
53
- all_entries: true # Optional - Defaults to false, only grabbing the amount set on CDA Query
54
- all_entries_page_size: 1000 # Optional - Defaults to 1000, maximum amount of entries per CDA Request for all_entries
55
- content_types: # Optional
53
+ all_entries: true # Optional - Defaults to false, only grabbing the amount set on CDA Query
54
+ all_entries_page_size: 1000 # Optional - Defaults to 1000, maximum amount of entries per CDA Request for all_entries
55
+ content_types: # Optional
56
56
  cat: MyCoolMapper
57
- client_options: # Optional
57
+ client_options: # Optional
58
58
  api_url: 'preview.contentful.com' # Defaults to 'api.contentful.com' which is Production
59
- max_include_resolution_depth: 5 # Optional - Defaults to 20, maximum amount of levels to resolve includes
60
- base_path: app_path # Optional - Defaults to Current directory
61
- destination: destination_in_data # Optional - Defaults to _data/contentful/spaces
62
- individual_entry_files: true # Optional - Defaults to false
59
+ max_include_resolution_depth: 5 # Optional - Defaults to 20, maximum amount of levels to resolve includes
60
+ base_path: app_path # Optional - Defaults to Current directory
61
+ destination: destination_in_data # Optional - Defaults to _data/contentful/spaces
62
+ individual_entry_files: true # Optional - Defaults to false
63
+ rich_text_mappings: # Optional - Defaults to {}
64
+ embedded-entry-block: MyEntryRenderer
63
65
  ```
64
66
 
65
67
  Parameter | Description
@@ -71,10 +73,11 @@ cda_query | Hash describing query configuration. See [contentful.rb
71
73
  all_entries | Boolean, if true will run multiple queries to the API until it fetches all entries for the space
72
74
  all_entries_page_size | Integer, the amount of maximum entries per CDA Request when fetching :all_entries
73
75
  content_types | Hash describing the mapping applied to entries of the imported content types
74
- client_options | Hash describing Contentful::Client configuration. See [contentful.rb](https://github.com/contentful/contentful.rb) for more info.
76
+ client_options | Hash describing `Contentful::Client` configuration. See [contentful.rb](https://github.com/contentful/contentful.rb) for more info.
75
77
  base_path | String with path to your Jekyll Application, defaults to current directory. Path is relative to your current location.
76
78
  destination | String with path within `_data` under which to store the output yaml file. Defaults to contentful/spaces
77
79
  individual_entry_files | Boolean, if true will create an individual file per entry separated in folders by content type, file path will be `{space_alias}/{content_type_id}/{entry_id}.yaml`. Default behavior is to create a file per space. Usage is affected when this is set to true, please look in the section below.
80
+ rich_text_mappings | Hash with `'nodeTyoe' => RendererClass` pairs determining overrides for the [`RichTextRenderer` library](https://github.com/contentful/rich-text-renderer.rb) configuration.
78
81
 
79
82
  You can add multiple spaces to your configuration
80
83
 
@@ -109,21 +112,51 @@ end
109
112
 
110
113
  #### Caveats
111
114
 
112
- Jekyll itself only allows you to import code as plugins only for its recognized plugin entry points.
113
- Therefore we need to use a custom [Rakefile](https://github.com/contentful/contentful_jekyll_examples/blob/master/examples/custom_mapper/example/Rakefile) to import the mapper and required files:
115
+ **Note:** This has changed since previous version.
114
116
 
115
- ```ruby
116
- require 'jekyll'
117
- require 'jekyll-contentful-data-import'
118
- require './_plugins/mappers'
117
+ When creating custom mappers, you should create them in a file under `#{source_dir}/_plugins/mappers/`.
118
+ This will allow the autoload mechanism that has been included in the latest version.
119
119
 
120
- desc "Import Contentful Data with Custom Mappers"
121
- task :contentful do
122
- Jekyll::Commands::Contentful.process([], {}, Jekyll.configuration['contentful'])
123
- end
120
+ With the autoload mechanism, there is no longer a need to create a `rake` task for importing using custom mappers.
121
+
122
+ If you already have a custom `rake` task, the new autoload mechanism will not affect it from working as it was working previously.
123
+
124
+ ### Rich Text *Beta*
125
+
126
+ To render rich text in your views, you can use the `rich_text` filter:
127
+
128
+ ```liquid
129
+ {{ entry.rich_text_field | rich_text }}
130
+ ```
131
+
132
+ This will output the generated HTML generated by the [`RichTextRenderer` library](https://github.com/contentful/rich-text-renderer.rb).
133
+
134
+ #### Adding custom renderers
135
+
136
+ When using rich text, if you're planning to embed entries, then you need to create your custom renderer for them. You can read how create your own renderer classes [here](https://github.com/contentful/rich-text-renderer.rb#using-different-renderers).
137
+
138
+ To configure the mappings, you need to add them in your `contentful` block like follows:
139
+
140
+ ```yaml
141
+ contentful:
142
+ spaces:
143
+ - example:
144
+ # ... all the regular config ...
145
+ rich_text_mappings:
146
+ embedded-entry-block: MyCustomRenderer
124
147
  ```
125
148
 
126
- Then proceed to run: `bundle exec rake contentful`
149
+ You can also add renderers for all other types of nodes if you want to have more granular control over the rendering.
150
+
151
+ This will use the same autoload strategy included for custom entry mappers, therefore, you should include your mapper classes in `#{source_dir}/_plugins/mappers/`.
152
+
153
+ #### Using the helper with multiple Contentful spaces
154
+
155
+ In case you have multiple configured spaces, and have different mapping configurations for them. You can specify which space you want to pull the configuration from when using the helper.
156
+
157
+ The helper receives an additional optional parameter for the space name. By default it is `nil`, indicating the first available space.
158
+
159
+ So, if for example you have 2 spaces with different configurations, to use the space called `foo`, you should call the helper as: `{{ entry.field | rich_text: "foo" }}`.
127
160
 
128
161
  ### Hiding Space and Access Token in Public Repositories
129
162
 
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
23
23
 
24
24
  # Additional dependencies
25
25
  s.add_dependency("contentful", '~> 2.1')
26
+ s.add_dependency("rich_text_renderer", '~> 0.1')
26
27
 
27
28
  s.add_development_dependency 'rubygems-tasks', '~> 0.2'
28
29
  s.add_development_dependency "guard"
@@ -1,4 +1,5 @@
1
1
  require 'jekyll-contentful-data-import/version'
2
+ require 'jekyll-contentful-data-import/helpers'
2
3
 
3
4
  %w[contentful].each do |file|
4
5
  require File.expand_path("jekyll/commands/#{file}.rb", File.dirname(__FILE__))
@@ -0,0 +1,35 @@
1
+ require 'rich_text_renderer'
2
+
3
+ module Jekyll
4
+ module Contentful
5
+ # Liquid filter for the RichText field.
6
+ module RichTextFilter
7
+ def rich_text(field, space = nil)
8
+ return if field.nil?
9
+
10
+ RichTextRenderer::Renderer.new(mappings_for(space)).render(field)
11
+ end
12
+
13
+ private
14
+
15
+ def mappings_for(space)
16
+ mappings = {}
17
+ config_for(space).fetch('rich_text_mappings', {}).each do |k, v|
18
+ mappings[k.to_s] = Module.const_get(v)
19
+ end
20
+
21
+ mappings
22
+ end
23
+
24
+ def config_for(space)
25
+ config = @context.registers[:site].config['contentful']['spaces']
26
+
27
+ # Spaces is a list of hashes indexed by space alias
28
+ return config.first.first[1] if space.nil? # Return the first available configuration
29
+ config.find { |sc| sc.key?(space) }[space]
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ Liquid::Template.register_filter(Jekyll::Contentful::RichTextFilter)
@@ -10,8 +10,11 @@ module Jekyll
10
10
  class Importer
11
11
  attr_reader :config
12
12
 
13
- def initialize(config)
14
- @config = config
13
+ def initialize(jekyll_config)
14
+ @jekyll_config = jekyll_config
15
+ @config = jekyll_config['contentful']
16
+
17
+ autoload_mappers!
15
18
  end
16
19
 
17
20
  def run
@@ -117,6 +120,14 @@ module Jekyll
117
120
  options.delete(:raise_errors)
118
121
  options
119
122
  end
123
+
124
+ def autoload_mappers!
125
+ mapper_search_path = File.join(@jekyll_config['source'], @jekyll_config['plugins_dir'], 'mappers')
126
+ mapper_files = Jekyll::Utils.safe_glob(mapper_search_path, File.join('**', '*.rb'))
127
+ Jekyll::External.require_with_graceful_fail(mapper_files)
128
+ rescue StandardError
129
+ Jekyll.logger.debug "Couldn't find custom mappers"
130
+ end
120
131
  end
121
132
  end
122
133
  end
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module Contentful
3
- VERSION = '1.7.0'.freeze
3
+ VERSION = '1.8.0'.freeze
4
4
  end
5
5
  end
@@ -30,15 +30,14 @@ module Jekyll
30
30
  def self.command_action(command)
31
31
  command.action do |args, options|
32
32
  jekyll_options = configuration_from_options(options)
33
- contentful_config = jekyll_options['contentful']
34
- process args, options, contentful_config
33
+ process args, options, jekyll_options
35
34
  end
36
35
  end
37
36
 
38
- def self.process(_args = [], options = {}, contentful_config = {})
37
+ def self.process(_args = [], options = {}, config = {})
39
38
  Jekyll.logger.info 'Starting Contentful import'
40
39
 
41
- Jekyll::Contentful::Importer.new(contentful_config).run
40
+ Jekyll::Contentful::Importer.new(config).run
42
41
 
43
42
  Jekyll.logger.info 'Contentful import finished'
44
43
 
@@ -0,0 +1,695 @@
1
+ require 'spec_helper'
2
+
3
+ class MockSite
4
+ attr_reader :config
5
+
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+ end
10
+
11
+ class MockContext
12
+ attr_reader :registers
13
+ def initialize(config)
14
+ @registers = {
15
+ site: MockSite.new(config)
16
+ }
17
+ end
18
+ end
19
+
20
+ class MockSiteContext
21
+ include Jekyll::Contentful::RichTextFilter
22
+
23
+ def initialize(config)
24
+ @context = MockContext.new(config)
25
+ end
26
+ end
27
+
28
+ class MyRenderer < RichTextRenderer::BaseNodeRenderer
29
+ def render(node)
30
+ return "<div>I eat nodes for breakfast</div>"
31
+ end
32
+ end
33
+
34
+ describe Jekyll::Contentful::RichTextFilter do
35
+ let(:config) do
36
+ {
37
+ 'contentful' => {
38
+ 'spaces' => [
39
+ 'foo' => {
40
+ 'rich_text_mappings' => {
41
+ 'embedded-entry-block' => 'MyRenderer'
42
+ }
43
+ },
44
+ 'bar' => {
45
+ }
46
+ ]
47
+ }
48
+ }
49
+ end
50
+
51
+ let(:rt_field) do
52
+ {
53
+ "content" => [
54
+ {
55
+ "data" => {
56
+ },
57
+ "content" => [
58
+ {
59
+ "marks" => [
60
+
61
+ ],
62
+ "value" => "Some heading",
63
+ "nodeType" => "text",
64
+ "nodeClass" => "text"
65
+ }
66
+ ],
67
+ "nodeType" => "heading-1",
68
+ "nodeClass" => "block"
69
+ },
70
+ {
71
+ "data" => {
72
+ },
73
+ "content" => [
74
+ {
75
+ "marks" => [
76
+
77
+ ],
78
+ "value" => "",
79
+ "nodeType" => "text",
80
+ "nodeClass" => "text"
81
+ }
82
+ ],
83
+ "nodeType" => "paragraph",
84
+ "nodeClass" => "block"
85
+ },
86
+ {
87
+ "data" => {
88
+ "sys" => {
89
+ "id" => "49rofLvvxCOiIMIi6mk8ai",
90
+ "created_at" => "2018-08-22T10:45:20+00:00",
91
+ "updated_at" => "2018-08-22T10:45:20+00:00",
92
+ "content_type_id" => "embedded",
93
+ "revision" => 1
94
+ },
95
+ "body" => "Embedded 1"
96
+ },
97
+ "content" => [
98
+ {
99
+ "marks" => [
100
+
101
+ ],
102
+ "value" => "",
103
+ "nodeType" => "text",
104
+ "nodeClass" => "text"
105
+ }
106
+ ],
107
+ "nodeType" => "embedded-entry-block",
108
+ "nodeClass" => "block"
109
+ },
110
+ {
111
+ "data" => {
112
+ },
113
+ "content" => [
114
+ {
115
+ "marks" => [
116
+
117
+ ],
118
+ "value" => "Some subheading",
119
+ "nodeType" => "text",
120
+ "nodeClass" => "text"
121
+ }
122
+ ],
123
+ "nodeType" => "heading-2",
124
+ "nodeClass" => "block"
125
+ },
126
+ {
127
+ "data" => {
128
+ },
129
+ "content" => [
130
+ {
131
+ "marks" => [
132
+ {
133
+ "data" => {
134
+ },
135
+ "type" => "bold",
136
+ "object" => "mark"
137
+ }
138
+ ],
139
+ "value" => "Some bold",
140
+ "nodeType" => "text",
141
+ "nodeClass" => "text"
142
+ }
143
+ ],
144
+ "nodeType" => "paragraph",
145
+ "nodeClass" => "block"
146
+ },
147
+ {
148
+ "data" => {
149
+ },
150
+ "content" => [
151
+ {
152
+ "marks" => [
153
+ {
154
+ "data" => {
155
+ },
156
+ "type" => "italic",
157
+ "object" => "mark"
158
+ }
159
+ ],
160
+ "value" => "Some italics",
161
+ "nodeType" => "text",
162
+ "nodeClass" => "text"
163
+ }
164
+ ],
165
+ "nodeType" => "paragraph",
166
+ "nodeClass" => "block"
167
+ },
168
+ {
169
+ "data" => {
170
+ },
171
+ "content" => [
172
+ {
173
+ "marks" => [
174
+ {
175
+ "data" => {
176
+ },
177
+ "type" => "underline",
178
+ "object" => "mark"
179
+ }
180
+ ],
181
+ "value" => "Some underline",
182
+ "nodeType" => "text",
183
+ "nodeClass" => "text"
184
+ }
185
+ ],
186
+ "nodeType" => "paragraph",
187
+ "nodeClass" => "block"
188
+ },
189
+ {
190
+ "data" => {
191
+ },
192
+ "content" => [
193
+ {
194
+ "marks" => [
195
+
196
+ ],
197
+ "value" => "",
198
+ "nodeType" => "text",
199
+ "nodeClass" => "text"
200
+ }
201
+ ],
202
+ "nodeType" => "paragraph",
203
+ "nodeClass" => "block"
204
+ },
205
+ {
206
+ "data" => {
207
+ },
208
+ "content" => [
209
+ {
210
+ "marks" => [
211
+
212
+ ],
213
+ "value" => "",
214
+ "nodeType" => "text",
215
+ "nodeClass" => "text"
216
+ }
217
+ ],
218
+ "nodeType" => "paragraph",
219
+ "nodeClass" => "block"
220
+ },
221
+ {
222
+ "data" => {
223
+ "sys" => {
224
+ "id" => "5ZF9Q4K6iWSYIU2OUs0UaQ",
225
+ "created_at" => "2018-08-22T10:45:29+00:00",
226
+ "updated_at" => "2018-08-22T10:45:29+00:00",
227
+ "content_type_id" => "embedded",
228
+ "revision" => 1
229
+ },
230
+ "body" => "Embedded 2"
231
+ },
232
+ "content" => [
233
+ {
234
+ "marks" => [
235
+
236
+ ],
237
+ "value" => "",
238
+ "nodeType" => "text",
239
+ "nodeClass" => "text"
240
+ }
241
+ ],
242
+ "nodeType" => "embedded-entry-block",
243
+ "nodeClass" => "block"
244
+ },
245
+ {
246
+ "data" => {
247
+ },
248
+ "content" => [
249
+ {
250
+ "marks" => [
251
+
252
+ ],
253
+ "value" => "",
254
+ "nodeType" => "text",
255
+ "nodeClass" => "text"
256
+ }
257
+ ],
258
+ "nodeType" => "paragraph",
259
+ "nodeClass" => "block"
260
+ },
261
+ {
262
+ "data" => {
263
+ },
264
+ "content" => [
265
+ {
266
+ "marks" => [
267
+
268
+ ],
269
+ "value" => "Some raw content",
270
+ "nodeType" => "text",
271
+ "nodeClass" => "text"
272
+ }
273
+ ],
274
+ "nodeType" => "paragraph",
275
+ "nodeClass" => "block"
276
+ },
277
+ {
278
+ "data" => {
279
+ },
280
+ "content" => [
281
+ {
282
+ "marks" => [
283
+
284
+ ],
285
+ "value" => "",
286
+ "nodeType" => "text",
287
+ "nodeClass" => "text"
288
+ }
289
+ ],
290
+ "nodeType" => "paragraph",
291
+ "nodeClass" => "block"
292
+ },
293
+ {
294
+ "data" => {
295
+ },
296
+ "content" => [
297
+ {
298
+ "marks" => [
299
+
300
+ ],
301
+ "value" => "An unpublished embed:",
302
+ "nodeType" => "text",
303
+ "nodeClass" => "text"
304
+ }
305
+ ],
306
+ "nodeType" => "paragraph",
307
+ "nodeClass" => "block"
308
+ },
309
+ {
310
+ "data" => {
311
+ },
312
+ "content" => [
313
+ {
314
+ "marks" => [
315
+
316
+ ],
317
+ "value" => "",
318
+ "nodeType" => "text",
319
+ "nodeClass" => "text"
320
+ }
321
+ ],
322
+ "nodeType" => "paragraph",
323
+ "nodeClass" => "block"
324
+ },
325
+ {
326
+ "data" => {
327
+ },
328
+ "content" => [
329
+ {
330
+ "marks" => [
331
+
332
+ ],
333
+ "value" => "Some more content",
334
+ "nodeType" => "text",
335
+ "nodeClass" => "text"
336
+ }
337
+ ],
338
+ "nodeType" => "paragraph",
339
+ "nodeClass" => "block"
340
+ },
341
+ {
342
+ "data" => {
343
+ },
344
+ "content" => [
345
+ {
346
+ "marks" => [
347
+ {
348
+ "data" => {
349
+ },
350
+ "type" => "code",
351
+ "object" => "mark"
352
+ }
353
+ ],
354
+ "value" => "Some code",
355
+ "nodeType" => "text",
356
+ "nodeClass" => "text"
357
+ }
358
+ ],
359
+ "nodeType" => "paragraph",
360
+ "nodeClass" => "block"
361
+ },
362
+ {
363
+ "data" => {
364
+ },
365
+ "content" => [
366
+ {
367
+ "marks" => [
368
+
369
+ ],
370
+ "value" => "",
371
+ "nodeType" => "text",
372
+ "nodeClass" => "text"
373
+ },
374
+ {
375
+ "data" => {
376
+ "uri" => "https://www.contentful.com"
377
+ },
378
+ "content" => [
379
+ {
380
+ "marks" => [
381
+
382
+ ],
383
+ "value" => "A hyperlink",
384
+ "nodeType" => "text",
385
+ "nodeClass" => "text"
386
+ }
387
+ ],
388
+ "nodeType" => "hyperlink",
389
+ "nodeClass" => "inline"
390
+ },
391
+ {
392
+ "marks" => [
393
+
394
+ ],
395
+ "value" => "",
396
+ "nodeType" => "text",
397
+ "nodeClass" => "text"
398
+ }
399
+ ],
400
+ "nodeType" => "paragraph",
401
+ "nodeClass" => "block"
402
+ },
403
+ {
404
+ "data" => {
405
+ },
406
+ "content" => [
407
+ {
408
+ "data" => {
409
+ },
410
+ "content" => [
411
+ {
412
+ "data" => {
413
+ },
414
+ "content" => [
415
+ {
416
+ "marks" => [
417
+
418
+ ],
419
+ "value" => "Ul list",
420
+ "nodeType" => "text",
421
+ "nodeClass" => "text"
422
+ }
423
+ ],
424
+ "nodeType" => "paragraph",
425
+ "nodeClass" => "block"
426
+ }
427
+ ],
428
+ "nodeType" => "list-item",
429
+ "nodeClass" => "block"
430
+ },
431
+ {
432
+ "data" => {
433
+ },
434
+ "content" => [
435
+ {
436
+ "data" => {
437
+ },
438
+ "content" => [
439
+ {
440
+ "marks" => [
441
+
442
+ ],
443
+ "value" => "A few ",
444
+ "nodeType" => "text",
445
+ "nodeClass" => "text"
446
+ },
447
+ {
448
+ "marks" => [
449
+ {
450
+ "data" => {
451
+ },
452
+ "type" => "bold",
453
+ "object" => "mark"
454
+ }
455
+ ],
456
+ "value" => "items",
457
+ "nodeType" => "text",
458
+ "nodeClass" => "text"
459
+ }
460
+ ],
461
+ "nodeType" => "paragraph",
462
+ "nodeClass" => "block"
463
+ },
464
+ {
465
+ "data" => {
466
+ },
467
+ "content" => [
468
+ {
469
+ "data" => {
470
+ },
471
+ "content" => [
472
+ {
473
+ "data" => {
474
+ },
475
+ "content" => [
476
+ {
477
+ "marks" => [
478
+
479
+ ],
480
+ "value" => "Ordered list nested inside an Unordered list item",
481
+ "nodeType" => "text",
482
+ "nodeClass" => "text"
483
+ }
484
+ ],
485
+ "nodeType" => "paragraph",
486
+ "nodeClass" => "block"
487
+ }
488
+ ],
489
+ "nodeType" => "list-item",
490
+ "nodeClass" => "block"
491
+ }
492
+ ],
493
+ "nodeType" => "ordered-list",
494
+ "nodeClass" => "block"
495
+ }
496
+ ],
497
+ "nodeType" => "list-item",
498
+ "nodeClass" => "block"
499
+ }
500
+ ],
501
+ "nodeType" => "unordered-list",
502
+ "nodeClass" => "block"
503
+ },
504
+ {
505
+ "data" => {
506
+ },
507
+ "content" => [
508
+ {
509
+ "data" => {
510
+ },
511
+ "content" => [
512
+ {
513
+ "data" => {
514
+ },
515
+ "content" => [
516
+ {
517
+ "marks" => [
518
+
519
+ ],
520
+ "value" => "Ol list",
521
+ "nodeType" => "text",
522
+ "nodeClass" => "text"
523
+ }
524
+ ],
525
+ "nodeType" => "paragraph",
526
+ "nodeClass" => "block"
527
+ }
528
+ ],
529
+ "nodeType" => "list-item",
530
+ "nodeClass" => "block"
531
+ },
532
+ {
533
+ "data" => {
534
+ },
535
+ "content" => [
536
+ {
537
+ "data" => {
538
+ },
539
+ "content" => [
540
+ {
541
+ "marks" => [
542
+
543
+ ],
544
+ "value" => "two",
545
+ "nodeType" => "text",
546
+ "nodeClass" => "text"
547
+ }
548
+ ],
549
+ "nodeType" => "paragraph",
550
+ "nodeClass" => "block"
551
+ }
552
+ ],
553
+ "nodeType" => "list-item",
554
+ "nodeClass" => "block"
555
+ },
556
+ {
557
+ "data" => {
558
+ },
559
+ "content" => [
560
+ {
561
+ "data" => {
562
+ },
563
+ "content" => [
564
+ {
565
+ "marks" => [
566
+
567
+ ],
568
+ "value" => "three",
569
+ "nodeType" => "text",
570
+ "nodeClass" => "text"
571
+ }
572
+ ],
573
+ "nodeType" => "paragraph",
574
+ "nodeClass" => "block"
575
+ }
576
+ ],
577
+ "nodeType" => "list-item",
578
+ "nodeClass" => "block"
579
+ }
580
+ ],
581
+ "nodeType" => "ordered-list",
582
+ "nodeClass" => "block"
583
+ },
584
+ {
585
+ "data" => {
586
+ },
587
+ "content" => [
588
+ {
589
+ "marks" => [
590
+
591
+ ],
592
+ "value" => "",
593
+ "nodeType" => "text",
594
+ "nodeClass" => "text"
595
+ }
596
+ ],
597
+ "nodeType" => "hr",
598
+ "nodeClass" => "block"
599
+ },
600
+ {
601
+ "data" => {
602
+ },
603
+ "content" => [
604
+ {
605
+ "marks" => [
606
+
607
+ ],
608
+ "value" => "",
609
+ "nodeType" => "text",
610
+ "nodeClass" => "text"
611
+ }
612
+ ],
613
+ "nodeType" => "paragraph",
614
+ "nodeClass" => "block"
615
+ },
616
+ {
617
+ "data" => {
618
+ },
619
+ "content" => [
620
+ {
621
+ "data" => {
622
+ },
623
+ "content" => [
624
+ {
625
+ "marks" => [
626
+
627
+ ],
628
+ "value" => "An inspirational quote",
629
+ "nodeType" => "text",
630
+ "nodeClass" => "text"
631
+ }
632
+ ],
633
+ "nodeType" => "paragraph",
634
+ "nodeClass" => "block"
635
+ },
636
+ {
637
+ "data" => {
638
+ },
639
+ "content" => [
640
+ {
641
+ "marks" => [
642
+
643
+ ],
644
+ "value" => "",
645
+ "nodeType" => "text",
646
+ "nodeClass" => "text"
647
+ }
648
+ ],
649
+ "nodeType" => "paragraph",
650
+ "nodeClass" => "block"
651
+ }
652
+ ],
653
+ "nodeType" => "blockquote",
654
+ "nodeClass" => "block"
655
+ },
656
+ {
657
+ "data" => {
658
+ },
659
+ "content" => [
660
+ {
661
+ "marks" => [
662
+
663
+ ],
664
+ "value" => "",
665
+ "nodeType" => "text",
666
+ "nodeClass" => "text"
667
+ }
668
+ ],
669
+ "nodeType" => "paragraph",
670
+ "nodeClass" => "block"
671
+ }
672
+ ],
673
+ "nodeType" => "document",
674
+ "nodeClass" => "document"
675
+ }
676
+ end
677
+
678
+ subject { MockSiteContext.new(config) }
679
+
680
+ describe 'renders rich text' do
681
+ it 'by defaults uses first available config' do
682
+ result = subject.rich_text(rt_field)
683
+
684
+ expect(result).to include("<div>I eat nodes for breakfast</div>")
685
+ end
686
+
687
+ it 'can define which space configuration to use' do
688
+ result = subject.rich_text(rt_field, 'foo')
689
+ expect(result).to include("<div>I eat nodes for breakfast</div>")
690
+
691
+ result = subject.rich_text(rt_field, 'bar')
692
+ expect(result).not_to include("<div>I eat nodes for breakfast</div>")
693
+ end
694
+ end
695
+ end
@@ -21,8 +21,12 @@ class ExporterDouble
21
21
  end
22
22
 
23
23
  describe Jekyll::Contentful::Importer do
24
+ before :each do
25
+ allow(Jekyll.logger).to receive(:debug).with("Couldn't find custom mappers")
26
+ end
27
+
24
28
  let(:config) do
25
- {
29
+ { 'contentful' => {
26
30
  'spaces' => [
27
31
  {
28
32
  'example' => {
@@ -31,7 +35,7 @@ describe Jekyll::Contentful::Importer do
31
35
  }
32
36
  }
33
37
  ]
34
- }
38
+ }}
35
39
  end
36
40
  subject { described_class.new(config) }
37
41
 
@@ -94,27 +98,29 @@ describe Jekyll::Contentful::Importer do
94
98
  it 'runs exporter with correct arguments' do
95
99
  allow(subject).to receive(:client).and_return(ClientDouble.new)
96
100
 
97
- expect(Jekyll::Contentful::SingleFileDataExporter).to receive(:new).with('example', [], config['spaces'].first['example']).and_return(ExporterDouble.new)
101
+ expect(Jekyll::Contentful::SingleFileDataExporter).to receive(:new).with('example', [], config['contentful']['spaces'].first['example']).and_return(ExporterDouble.new)
98
102
 
99
103
  subject.run
100
104
  end
101
105
 
102
106
  it 'runs multifile exporter when passed :individual_entry_files flag' do
103
107
  config = {
104
- 'spaces' => [
105
- {
106
- 'example' => {
107
- 'space' => 'cfexampleapi',
108
- 'access_token' => 'b4c0n73n7fu1',
109
- 'individual_entry_files' => true
108
+ 'contentful' => {
109
+ 'spaces' => [
110
+ {
111
+ 'example' => {
112
+ 'space' => 'cfexampleapi',
113
+ 'access_token' => 'b4c0n73n7fu1',
114
+ 'individual_entry_files' => true
115
+ }
110
116
  }
111
- }
112
- ]
117
+ ]
118
+ }
113
119
  }
114
120
  subject = described_class.new(config)
115
121
  allow(subject).to receive(:client).and_return(ClientDouble.new)
116
122
 
117
- expect(Jekyll::Contentful::MultiFileDataExporter).to receive(:new).with('example', [], config['spaces'].first['example']).and_return(ExporterDouble.new)
123
+ expect(Jekyll::Contentful::MultiFileDataExporter).to receive(:new).with('example', [], config['contentful']['spaces'].first['example']).and_return(ExporterDouble.new)
118
124
 
119
125
  subject.run
120
126
  end
@@ -143,4 +149,40 @@ describe Jekyll::Contentful::Importer do
143
149
  end
144
150
  end
145
151
  end
152
+
153
+ describe 'mappers are autoloaded' do
154
+ let(:jekyll_config) do
155
+ { 'contentful' => {
156
+ 'spaces' => [
157
+ {
158
+ 'example' => {
159
+ 'space' => 'cfexampleapi',
160
+ 'access_token' => 'b4c0n73n7fu1'
161
+ }
162
+ }
163
+ ]
164
+ }}
165
+ end
166
+
167
+ it 'custom mappers are autoloaded' do
168
+ config = jekyll_config.merge('source' => '.', 'plugins_dir' => '_plugins')
169
+
170
+ allow(subject).to receive(:spaces).and_return([['foo', {'space' => 'foo', 'access_token' => 'bar'}], ['bar', {'space' => 'bar', 'access_token' => 'foo'}]])
171
+ allow(subject).to receive(:client).and_return(ClientDouble.new)
172
+
173
+ expect(Jekyll::Utils).to receive(:safe_glob).with(File.join('.', '_plugins', 'mappers'), File.join('**', '*.rb')) { ['some_mapper.rb'] }
174
+ expect(Jekyll::External).to receive(:require_with_graceful_fail).with(['some_mapper.rb'])
175
+
176
+ described_class.new(config)
177
+ end
178
+
179
+ it 'raises a warning if no mappers found' do
180
+ allow(subject).to receive(:spaces).and_return([['foo', {'space' => 'foo', 'access_token' => 'bar'}], ['bar', {'space' => 'bar', 'access_token' => 'foo'}]])
181
+ allow(subject).to receive(:client).and_return(ClientDouble.new)
182
+
183
+ expect(Jekyll.logger).to receive(:debug).with("Couldn't find custom mappers")
184
+
185
+ described_class.new(config)
186
+ end
187
+ end
146
188
  end
@@ -1,6 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Jekyll::Commands::Contentful do
4
+ before :each do
5
+ allow(Jekyll.logger).to receive(:debug).with("Couldn't find custom mappers")
6
+ end
7
+
4
8
  describe 'class methods' do
5
9
  describe '::init_with_program' do
6
10
  it 'implements jekyll command interface' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-contentful-data-import
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Contentful GmbH
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-01 00:00:00.000000000 Z
11
+ date: 2018-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '2.1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rich_text_renderer
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.1'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.1'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: rubygems-tasks
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -234,6 +248,7 @@ files:
234
248
  - jekyll-contentful.gemspec
235
249
  - lib/jekyll-contentful-data-import.rb
236
250
  - lib/jekyll-contentful-data-import/base_data_exporter.rb
251
+ - lib/jekyll-contentful-data-import/helpers.rb
237
252
  - lib/jekyll-contentful-data-import/importer.rb
238
253
  - lib/jekyll-contentful-data-import/mappers.rb
239
254
  - lib/jekyll-contentful-data-import/mappers/base.rb
@@ -243,6 +258,7 @@ files:
243
258
  - lib/jekyll-contentful-data-import/version.rb
244
259
  - lib/jekyll/commands/contentful.rb
245
260
  - spec/fixtures/vcr_fixtures/entries.yml
261
+ - spec/jekyll-contentful/helpers_spec.rb
246
262
  - spec/jekyll-contentful/importer_spec.rb
247
263
  - spec/jekyll-contentful/mappers/base_spec.rb
248
264
  - spec/jekyll-contentful/multi_file_data_exporter_spec.rb
@@ -277,6 +293,7 @@ summary: Include mangablable content from the Contentful CMS and API into your J
277
293
  projects
278
294
  test_files:
279
295
  - spec/fixtures/vcr_fixtures/entries.yml
296
+ - spec/jekyll-contentful/helpers_spec.rb
280
297
  - spec/jekyll-contentful/importer_spec.rb
281
298
  - spec/jekyll-contentful/mappers/base_spec.rb
282
299
  - spec/jekyll-contentful/multi_file_data_exporter_spec.rb