kontent-jekyll 0.11.1 → 0.11.2

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.
@@ -1,15 +1,15 @@
1
- module Kentico
2
- module Kontent
3
- module Resolvers
4
- ##
5
- # This class instantiate the resolver based on the name from configuration.
6
-
7
- class InlineContentItemResolver
8
- def self.for(config)
9
- class_name = config.inline_content_item_resolver
10
- class_name && Module.const_get(class_name).new
11
- end
12
- end
13
- end
14
- end
15
- end
1
+ module Kentico
2
+ module Kontent
3
+ module Resolvers
4
+ ##
5
+ # This class instantiate the resolver based on the name from configuration.
6
+
7
+ class InlineContentItemResolver
8
+ def self.for(config)
9
+ class_name = config.inline_content_item_resolver
10
+ class_name && Module.const_get(class_name).new
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,12 +1,12 @@
1
- module Kentico
2
- module Kontent
3
- module SiteProcessing
4
- class CustomSiteProcessor
5
- def self.for(config)
6
- class_name = config.custom_site_processor
7
- class_name && Module.const_get(class_name).new
8
- end
9
- end
10
- end
11
- end
12
- end
1
+ module Kentico
2
+ module Kontent
3
+ module SiteProcessing
4
+ class CustomSiteProcessor
5
+ def self.for(config)
6
+ class_name = config.custom_site_processor
7
+ class_name && Module.const_get(class_name).new
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,88 +1,88 @@
1
- require 'kontent-delivery-sdk-ruby'
2
-
3
- require 'kontent-jekyll/resolvers/content_link_resolver'
4
- require 'kontent-jekyll/resolvers/inline_content_item_resolver'
5
-
6
- require 'kontent-jekyll/constants/kentico_config_keys'
7
-
8
- require 'kontent-jekyll/version'
9
- require 'kontent-jekyll/gem_name'
10
-
11
- module Kentico
12
- module Kontent
13
- module SiteProcessing
14
- include Constants
15
- include Resolvers
16
-
17
- class KenticoKontentImporter
18
- def initialize(config)
19
- @config = config
20
- @items = []
21
- @taxonomy_groups = []
22
- end
23
-
24
- def items_by_type(language)
25
- retrieve_items(language)
26
- .group_by { |item| item.system.type }
27
- end
28
-
29
- def taxonomies
30
- @taxonomy_groups = retrieve_taxonomies
31
- end
32
-
33
- private
34
-
35
- def inline_content_item_resolver
36
- @inline_content_item_resolver ||= Resolvers::InlineContentItemResolver.for(@config)
37
- end
38
-
39
- def content_link_url_resolver
40
- @content_link_url_resolver ||= Resolvers::ContentLinkResolver.for(@config)
41
- end
42
-
43
- def delivery_client
44
- project_id = value_for(@config, Constants::KenticoConfigKeys::PROJECT_ID)
45
- secure_key = value_for(@config, Constants::KenticoConfigKeys::SECURE_KEY)
46
-
47
- Kentico::Kontent::Delivery::DeliveryClient.new(
48
- project_id: project_id,
49
- secure_key: secure_key,
50
- content_link_url_resolver: content_link_url_resolver,
51
- inline_content_item_resolver: inline_content_item_resolver
52
- )
53
- end
54
-
55
- def retrieve_taxonomies
56
- delivery_client
57
- .taxonomies
58
- .custom_headers(custom_headers)
59
- .request_latest_content
60
- .execute { |response| return response.taxonomies }
61
- end
62
-
63
- def retrieve_items(language)
64
- client = delivery_client.items
65
- client = client.language(language) if language
66
- client
67
- .custom_headers(custom_headers)
68
- .request_latest_content
69
- .depth(@config.max_linked_items_depth || 1)
70
- .execute { |response| return response.items }
71
- end
72
-
73
- def value_for(config, key)
74
- potential_value = config[key]
75
- return ENV[potential_value.gsub('ENV_', '')] if !potential_value.nil? && potential_value.start_with?('ENV_')
76
- potential_value
77
- end
78
-
79
- # Add extra headers like tracking
80
- def custom_headers
81
- {
82
- 'X-KC-SOURCE' => "#{GEM_NAME};#{VERSION}",
83
- }
84
- end
85
- end
86
- end
87
- end
88
- end
1
+ require 'kontent-delivery-sdk-ruby'
2
+
3
+ require 'kontent-jekyll/resolvers/content_link_resolver'
4
+ require 'kontent-jekyll/resolvers/inline_content_item_resolver'
5
+
6
+ require 'kontent-jekyll/constants/kentico_config_keys'
7
+
8
+ require 'kontent-jekyll/version'
9
+ require 'kontent-jekyll/gem_name'
10
+
11
+ module Kentico
12
+ module Kontent
13
+ module SiteProcessing
14
+ include Constants
15
+ include Resolvers
16
+
17
+ class KenticoKontentImporter
18
+ def initialize(config)
19
+ @config = config
20
+ @items = []
21
+ @taxonomy_groups = []
22
+ end
23
+
24
+ def items_by_type(language)
25
+ retrieve_items(language)
26
+ .group_by { |item| item.system.type }
27
+ end
28
+
29
+ def taxonomies
30
+ @taxonomy_groups = retrieve_taxonomies
31
+ end
32
+
33
+ private
34
+
35
+ def inline_content_item_resolver
36
+ @inline_content_item_resolver ||= Resolvers::InlineContentItemResolver.for(@config)
37
+ end
38
+
39
+ def content_link_url_resolver
40
+ @content_link_url_resolver ||= Resolvers::ContentLinkResolver.for(@config)
41
+ end
42
+
43
+ def delivery_client
44
+ project_id = value_for(@config, Constants::KenticoConfigKeys::PROJECT_ID)
45
+ secure_key = value_for(@config, Constants::KenticoConfigKeys::SECURE_KEY)
46
+
47
+ Kentico::Kontent::Delivery::DeliveryClient.new(
48
+ project_id: project_id,
49
+ secure_key: secure_key,
50
+ content_link_url_resolver: content_link_url_resolver,
51
+ inline_content_item_resolver: inline_content_item_resolver
52
+ )
53
+ end
54
+
55
+ def retrieve_taxonomies
56
+ delivery_client
57
+ .taxonomies
58
+ .custom_headers(custom_headers)
59
+ .request_latest_content
60
+ .execute { |response| return response.taxonomies }
61
+ end
62
+
63
+ def retrieve_items(language)
64
+ client = delivery_client.items
65
+ client = client.language(language) if language
66
+ client
67
+ .custom_headers(custom_headers)
68
+ .request_latest_content
69
+ .depth(@config.max_linked_items_depth || 1)
70
+ .execute { |response| return response.items }
71
+ end
72
+
73
+ def value_for(config, key)
74
+ potential_value = config[key]
75
+ return ENV[potential_value.gsub('ENV_', '')] if !potential_value.nil? && potential_value.start_with?('ENV_')
76
+ potential_value
77
+ end
78
+
79
+ # Add extra headers like tracking
80
+ def custom_headers
81
+ {
82
+ 'X-KC-SOURCE' => "#{GEM_NAME};#{VERSION}",
83
+ }
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,249 +1,249 @@
1
- require 'date'
2
-
3
- require 'kontent-jekyll/constants/page_type'
4
-
5
- require 'kontent-jekyll/resolvers/front_matter_resolver'
6
- require 'kontent-jekyll/resolvers/content_resolver'
7
- require 'kontent-jekyll/resolvers/data_resolver'
8
- require 'kontent-jekyll/resolvers/filename_resolver'
9
-
10
- require 'kontent-jekyll/utils/normalize_object'
11
-
12
- module Kentico
13
- module Kontent
14
- module SiteProcessing
15
- ##
16
- # This class processes the the imported content and populate Jekyll structures.
17
-
18
- class SiteProcessor
19
- include Constants
20
- include Resolvers
21
- include Utils
22
-
23
- ##
24
- # These collections have specific purposes in the original Jekyll generation will be omitted.
25
-
26
- RESERVED_COLLECTIONS = %w(posts data)
27
-
28
- def initialize(site, config)
29
- @site = site
30
- @config = config
31
- end
32
-
33
- ##
34
- # Populates standard Jekyll pages and collections
35
-
36
- def process_pages(items_by_type)
37
- pages_config = @config.pages
38
- return unless pages_config
39
-
40
- pages_config.each_pair do |type, page_config|
41
- pages = items_by_type[type.to_s]
42
- next unless pages
43
-
44
- collection_name = page_config&.collection
45
-
46
- pages_data = []
47
- pages.each do |page_item|
48
- content = content_resolver.execute(page_item, page_config)
49
- front_matter = front_matter_resolver.execute(page_item, PageType::PAGE)
50
- front_matter = normalize_object(front_matter)
51
-
52
- mapped_name = filename_resolver.execute(page_item)
53
- filename = "#{mapped_name}.html"
54
-
55
- page_data = OpenStruct.new(content: content, collection: collection_name, front_matter: front_matter, filename: filename)
56
- pages_data << page_data
57
- end
58
-
59
- are_pages_from_collection = collection_name && !collection_name.empty? && !RESERVED_COLLECTIONS.include?(collection_name)
60
-
61
- unless are_pages_from_collection
62
- @site.pages += pages_data.map { |page_data| create_kentico_page(@site, page_data) }
63
- next
64
- end
65
-
66
- collection_config = @site.config['collections'][collection_name]
67
- if collection_config
68
- collection_config['output'] = true unless defined?(collection_config['output'])
69
- else
70
- @site.config['collections'][collection_name] = { 'output' => true }
71
- end
72
-
73
- collection = @site.collections[collection_name] ||= Jekyll::Collection.new(@site, collection_name)
74
-
75
- pages_data.each do |page_data|
76
- path = File.join(@site.source, "_#{collection_name}", page_data.filename)
77
-
78
- page = create_document(path, @site, collection, page_data)
79
-
80
- page.instance_eval 'merge_defaults'
81
- page.instance_eval 'read_post_data'
82
-
83
- collection.docs << page
84
- end
85
-
86
- collection.docs = collection.docs.reverse.uniq(&:path).reverse
87
- collection.docs.sort!
88
- end
89
-
90
- @site.pages = @site.pages.reverse.uniq(&:path).reverse
91
- @site.pages.sort_by!(&:name)
92
- end
93
-
94
- ##
95
- # Populates posts part of the Jekyll site
96
-
97
- def process_posts(items_by_type)
98
- posts_config = @config.posts
99
- return unless posts_config
100
-
101
- type = posts_config&.type
102
-
103
- posts = items_by_type[type.to_s]
104
- return unless posts
105
-
106
- posts.each do |post_item|
107
- content = content_resolver.execute(post_item, posts_config)
108
- front_matter = front_matter_resolver.execute(post_item, PageType::POST)
109
- front_matter = normalize_object(front_matter)
110
-
111
- date = post_item.elements[posts_config.date || 'date'].value
112
- date_string = DateTime.parse(date).strftime('%Y-%m-%d')
113
-
114
- mapped_name = filename_resolver.execute(post_item)
115
- filename = "#{date_string}-#{mapped_name}.html"
116
-
117
- post_data = OpenStruct.new(content: content, front_matter: front_matter, filename: filename)
118
-
119
- path = File.join(@site.source, '_posts', filename)
120
- post = create_document(path, @site, @site.posts, post_data)
121
-
122
- ##
123
- # We need to invoke these private methods as they correctly populate certain data automatically.
124
-
125
- post.instance_eval 'merge_defaults'
126
- post.instance_eval 'read_post_data'
127
-
128
- @site.posts.docs << post
129
- end
130
-
131
- @site.posts.docs = @site.posts.docs.reverse.uniq(&:path).reverse
132
- @site.posts.docs.sort!
133
- end
134
-
135
- ##
136
- # Populates data part of the Jekyll site.
137
-
138
- def process_data(items_by_type)
139
- config = @config.data
140
-
141
- data_items = {}
142
- config && config.each_pair do |item_type, name|
143
- items = items_by_type[item_type.to_s]
144
- next unless items
145
-
146
- name ||= item_type.to_s
147
- processed_items = items.map do |item|
148
- data = data_resolver.execute(item)
149
- normalize_object(data)
150
- end
151
-
152
- data_items[name] = (data_items[name] || []) + processed_items
153
- end
154
-
155
- @site.data.merge!({ 'items' => data_items })
156
- end
157
-
158
- ##
159
- # Populates data part of the Jekyll site with taxonomies.
160
-
161
- def process_taxonomies(taxonomies)
162
- codenames = @config.taxonomies
163
- return unless codenames && taxonomies
164
-
165
- filtered_taxonomies = taxonomies.select { |taxonomy| codenames.include? taxonomy.system.codename }
166
-
167
- processed_taxonomies = {}
168
- filtered_taxonomies.each do |taxonomy|
169
- taxonomy_data = normalize_object({
170
- system: taxonomy.system,
171
- terms: taxonomy.terms,
172
- })
173
-
174
- processed_taxonomies[taxonomy.system.codename] = taxonomy_data
175
- end
176
-
177
- @site.data['taxonomies'] = processed_taxonomies
178
- end
179
-
180
- private
181
-
182
- ##
183
- # Creates a Jekyll::Page.
184
-
185
- def create_kentico_page(site, page_info)
186
- page = Jekyll::Page.allocate
187
-
188
- ## A hack to create a Jekyll::Page with custom constructor without overriding the class
189
- # because jekyll-redirect-from can work only with Jekyll::Page instances.
190
- # Once this PR https://github.com/jekyll/jekyll-redirect-from/pull/204 is merged and released
191
- # we can create a subclass of the Page and simplify the code.
192
-
193
- page.define_singleton_method(:initialize) do
194
- @site = site
195
- @base = site.source
196
- @dir = ''
197
- @name = page_info.filename
198
- @path = if site.in_theme_dir(@base) == @base
199
- site.in_theme_dir(@base, @dir, @name)
200
- else
201
- site.in_source_dir(@base, @dir, @name)
202
- end
203
-
204
- self.process(@name)
205
-
206
- self.data = page_info.front_matter
207
- self.content = page_info.content
208
-
209
- data.default_proc = proc do |_, key|
210
- site.frontmatter_defaults.find(File.join(@dir, @name), type, key)
211
- end
212
-
213
- Jekyll::Hooks.trigger :pages, :post_init, self
214
-
215
- self
216
- end
217
-
218
- page.initialize
219
- end
220
-
221
- ##
222
- # Creates a Jekyll::Document. Used for collections.
223
-
224
- def create_document(path, site, collection, source)
225
- doc = Jekyll::Document.new(path, site: site, collection: collection)
226
- doc.content = source.content
227
- doc.data.merge!(source.front_matter)
228
- doc
229
- end
230
-
231
- def content_resolver
232
- @content_resolver ||= Resolvers::ContentResolver.new(@config)
233
- end
234
-
235
- def filename_resolver
236
- @filename_resolver ||= Resolvers::FilenameResolver.new(@config)
237
- end
238
-
239
- def front_matter_resolver
240
- @front_matter_resolver ||= Resolvers::FrontMatterResolver.new(@config)
241
- end
242
-
243
- def data_resolver
244
- @data_resolver ||= Resolvers::DataResolver.new(@config)
245
- end
246
- end
247
- end
248
- end
1
+ require 'date'
2
+
3
+ require 'kontent-jekyll/constants/page_type'
4
+
5
+ require 'kontent-jekyll/resolvers/front_matter_resolver'
6
+ require 'kontent-jekyll/resolvers/content_resolver'
7
+ require 'kontent-jekyll/resolvers/data_resolver'
8
+ require 'kontent-jekyll/resolvers/filename_resolver'
9
+
10
+ require 'kontent-jekyll/utils/normalize_object'
11
+
12
+ module Kentico
13
+ module Kontent
14
+ module SiteProcessing
15
+ ##
16
+ # This class processes the the imported content and populate Jekyll structures.
17
+
18
+ class SiteProcessor
19
+ include Constants
20
+ include Resolvers
21
+ include Utils
22
+
23
+ ##
24
+ # These collections have specific purposes in the original Jekyll generation will be omitted.
25
+
26
+ RESERVED_COLLECTIONS = %w(posts data)
27
+
28
+ def initialize(site, config)
29
+ @site = site
30
+ @config = config
31
+ end
32
+
33
+ ##
34
+ # Populates standard Jekyll pages and collections
35
+
36
+ def process_pages(items_by_type)
37
+ pages_config = @config.pages
38
+ return unless pages_config
39
+
40
+ pages_config.each_pair do |type, page_config|
41
+ pages = items_by_type[type.to_s]
42
+ next unless pages
43
+
44
+ collection_name = page_config&.collection
45
+
46
+ pages_data = []
47
+ pages.each do |page_item|
48
+ content = content_resolver.execute(page_item, page_config)
49
+ front_matter = front_matter_resolver.execute(page_item, PageType::PAGE)
50
+ front_matter = normalize_object(front_matter)
51
+
52
+ mapped_name = filename_resolver.execute(page_item)
53
+ filename = "#{mapped_name}.html"
54
+
55
+ page_data = OpenStruct.new(content: content, collection: collection_name, front_matter: front_matter, filename: filename)
56
+ pages_data << page_data
57
+ end
58
+
59
+ are_pages_from_collection = collection_name && !collection_name.empty? && !RESERVED_COLLECTIONS.include?(collection_name)
60
+
61
+ unless are_pages_from_collection
62
+ @site.pages += pages_data.map { |page_data| create_kentico_page(@site, page_data) }
63
+ next
64
+ end
65
+
66
+ collection_config = @site.config['collections'][collection_name]
67
+ if collection_config
68
+ collection_config['output'] = true unless defined?(collection_config['output'])
69
+ else
70
+ @site.config['collections'][collection_name] = { 'output' => true }
71
+ end
72
+
73
+ collection = @site.collections[collection_name] ||= Jekyll::Collection.new(@site, collection_name)
74
+
75
+ pages_data.each do |page_data|
76
+ path = File.join(@site.source, "_#{collection_name}", page_data.filename)
77
+
78
+ page = create_document(path, @site, collection, page_data)
79
+
80
+ page.instance_eval 'merge_defaults'
81
+ page.instance_eval 'read_post_data'
82
+
83
+ collection.docs << page
84
+ end
85
+
86
+ collection.docs = collection.docs.reverse.uniq(&:path).reverse
87
+ collection.docs.sort!
88
+ end
89
+
90
+ @site.pages = @site.pages.reverse.uniq(&:path).reverse
91
+ @site.pages.sort_by!(&:name)
92
+ end
93
+
94
+ ##
95
+ # Populates posts part of the Jekyll site
96
+
97
+ def process_posts(items_by_type)
98
+ posts_config = @config.posts
99
+ return unless posts_config
100
+
101
+ type = posts_config&.type
102
+
103
+ posts = items_by_type[type.to_s]
104
+ return unless posts
105
+
106
+ posts.each do |post_item|
107
+ content = content_resolver.execute(post_item, posts_config)
108
+ front_matter = front_matter_resolver.execute(post_item, PageType::POST)
109
+ front_matter = normalize_object(front_matter)
110
+
111
+ date = post_item.elements[posts_config.date || 'date'].value
112
+ date_string = DateTime.parse(date).strftime('%Y-%m-%d')
113
+
114
+ mapped_name = filename_resolver.execute(post_item)
115
+ filename = "#{date_string}-#{mapped_name}.html"
116
+
117
+ post_data = OpenStruct.new(content: content, front_matter: front_matter, filename: filename)
118
+
119
+ path = File.join(@site.source, '_posts', filename)
120
+ post = create_document(path, @site, @site.posts, post_data)
121
+
122
+ ##
123
+ # We need to invoke these private methods as they correctly populate certain data automatically.
124
+
125
+ post.instance_eval 'merge_defaults'
126
+ post.instance_eval 'read_post_data'
127
+
128
+ @site.posts.docs << post
129
+ end
130
+
131
+ @site.posts.docs = @site.posts.docs.reverse.uniq(&:path).reverse
132
+ @site.posts.docs.sort!
133
+ end
134
+
135
+ ##
136
+ # Populates data part of the Jekyll site.
137
+
138
+ def process_data(items_by_type)
139
+ config = @config.data
140
+
141
+ data_items = {}
142
+ config && config.each_pair do |item_type, name|
143
+ items = items_by_type[item_type.to_s]
144
+ next unless items
145
+
146
+ name ||= item_type.to_s
147
+ processed_items = items.map do |item|
148
+ data = data_resolver.execute(item)
149
+ normalize_object(data)
150
+ end
151
+
152
+ data_items[name] = (data_items[name] || []) + processed_items
153
+ end
154
+
155
+ @site.data.merge!({ 'items' => data_items })
156
+ end
157
+
158
+ ##
159
+ # Populates data part of the Jekyll site with taxonomies.
160
+
161
+ def process_taxonomies(taxonomies)
162
+ codenames = @config.taxonomies
163
+ return unless codenames && taxonomies
164
+
165
+ filtered_taxonomies = taxonomies.select { |taxonomy| codenames.include? taxonomy.system.codename }
166
+
167
+ processed_taxonomies = {}
168
+ filtered_taxonomies.each do |taxonomy|
169
+ taxonomy_data = normalize_object({
170
+ system: taxonomy.system,
171
+ terms: taxonomy.terms,
172
+ })
173
+
174
+ processed_taxonomies[taxonomy.system.codename] = taxonomy_data
175
+ end
176
+
177
+ @site.data['taxonomies'] = processed_taxonomies
178
+ end
179
+
180
+ private
181
+
182
+ ##
183
+ # Creates a Jekyll::Page.
184
+
185
+ def create_kentico_page(site, page_info)
186
+ page = Jekyll::Page.allocate
187
+
188
+ ## A hack to create a Jekyll::Page with custom constructor without overriding the class
189
+ # because jekyll-redirect-from can work only with Jekyll::Page instances.
190
+ # Once this PR https://github.com/jekyll/jekyll-redirect-from/pull/204 is merged and released
191
+ # we can create a subclass of the Page and simplify the code.
192
+
193
+ page.define_singleton_method(:initialize) do
194
+ @site = site
195
+ @base = site.source
196
+ @dir = ''
197
+ @name = page_info.filename
198
+ @path = if site.in_theme_dir(@base) == @base
199
+ site.in_theme_dir(@base, @dir, @name)
200
+ else
201
+ site.in_source_dir(@base, @dir, @name)
202
+ end
203
+
204
+ self.process(@name)
205
+
206
+ self.data = page_info.front_matter
207
+ self.content = page_info.content
208
+
209
+ data.default_proc = proc do |_, key|
210
+ site.frontmatter_defaults.find(File.join(@dir, @name), type, key)
211
+ end
212
+
213
+ Jekyll::Hooks.trigger :pages, :post_init, self
214
+
215
+ self
216
+ end
217
+
218
+ page.initialize
219
+ end
220
+
221
+ ##
222
+ # Creates a Jekyll::Document. Used for collections.
223
+
224
+ def create_document(path, site, collection, source)
225
+ doc = Jekyll::Document.new(path, site: site, collection: collection)
226
+ doc.content = source.content
227
+ doc.data.merge!(source.front_matter)
228
+ doc
229
+ end
230
+
231
+ def content_resolver
232
+ @content_resolver ||= Resolvers::ContentResolver.new(@config)
233
+ end
234
+
235
+ def filename_resolver
236
+ @filename_resolver ||= Resolvers::FilenameResolver.new(@config)
237
+ end
238
+
239
+ def front_matter_resolver
240
+ @front_matter_resolver ||= Resolvers::FrontMatterResolver.new(@config)
241
+ end
242
+
243
+ def data_resolver
244
+ @data_resolver ||= Resolvers::DataResolver.new(@config)
245
+ end
246
+ end
247
+ end
248
+ end
249
249
  end