jekyll-uj-powertools 1.7.0 → 1.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60803db8fb2a1e2c50aea11a0f49e964fc16d3323943ce0330f4312fd6468e37
4
- data.tar.gz: 05f5ac27b7651b0d5592395cc510ba5b31e77f9b5ead9f35f0de6420d5919fd9
3
+ metadata.gz: 59b2d051f809592cc566481818bc2ac531de4378c131841b1e01f6a1187b5a6d
4
+ data.tar.gz: ffab0a040714b14e3c407ac76a7ce9ffd73dd7bd91a8103a75eb14c15ada7e1d
5
5
  SHA512:
6
- metadata.gz: 17bb830ad04f8be16741f99f9dcaab5f723b7c9bb58f1ffbdfa0bf9a9637c0357e829c82dd4dc13feee2e70773bde48cd71e1cface15873f7232a60ea6880f4c
7
- data.tar.gz: 21c374abbaa0e43c40bf1ecda75ac52eda70dd33140c69c972bf352eca2d571c35c5d70485947275a639c46b7df8e235f496a2b678a29008722ebeadb9e4e62b
6
+ metadata.gz: 1bdb38f9cd185d941472c5ed062eea7e244b9fdbd706a877d1f7ec5873cea5f2e5781591c39793b1d85d5a2bc101c9d4e94fd90cc1b22494e9718c090a55ff05
7
+ data.tar.gz: 8add8dcc5ba487868e90d03ace655a195abd6891ab983066badd1ded22c6d2bb9cae2a99bb3aa33aa80b4d56edbef18bfacaf65be0b80578bbb12c29e1fe610d
data/README.md CHANGED
@@ -365,6 +365,38 @@ layout: default
365
365
  {% endfor %}
366
366
  ```
367
367
 
368
+ ## Parallel Build
369
+ Speed up Jekyll builds by rendering pages and documents in parallel using multiple CPU threads. This can significantly reduce build times for sites with many pages.
370
+
371
+ **Enabled by default** - no configuration needed! The plugin automatically uses all available CPU cores.
372
+
373
+ ### Configuration
374
+ Customize parallel build behavior in `_config.yml`:
375
+
376
+ ```yaml
377
+ parallel_build:
378
+ enabled: true # Enable/disable parallel builds (default: true)
379
+ threads: 8 # Number of threads (default: number of CPU cores)
380
+ min_items: 1 # Minimum items before parallelizing (default: 1)
381
+ ```
382
+
383
+ ### Disabling Parallel Build
384
+ If you encounter issues with thread-safety in custom Liquid tags:
385
+
386
+ ```yaml
387
+ # Option 1: Disable entirely
388
+ parallel_build: false
389
+
390
+ # Option 2: Disable via enabled flag
391
+ parallel_build:
392
+ enabled: false
393
+ ```
394
+
395
+ ### Performance Tips
396
+ - Parallel builds work best with CPU-bound Liquid rendering
397
+ - For maximum speed, combine with `limit_collections` during development
398
+ - Use `--profile` to identify slow templates that benefit most from parallelization
399
+
368
400
  ## Development Config (`_config.dev.yml`)
369
401
  Speed up dev builds by limiting collections. Create `_config.dev.yml` in your Jekyll source:
370
402
 
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  Gem::Specification.new do |spec|
6
6
  # Gem info
7
7
  spec.name = "jekyll-uj-powertools"
8
- spec.version = "1.7.0"
8
+ spec.version = "1.7.2"
9
9
 
10
10
  # Author info
11
11
  spec.authors = ["ITW Creative Works"]
@@ -31,10 +31,14 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "rake"
32
32
  spec.add_development_dependency "rspec"
33
33
  spec.add_development_dependency "simplecov"
34
+ spec.add_development_dependency "ostruct"
34
35
 
35
36
  # Translation and HTML manipulation requires Nokogiri
36
37
  spec.add_runtime_dependency 'nokogiri', '>= 1.17'
37
38
 
39
+ # Parallel processing for faster builds
40
+ spec.add_runtime_dependency 'parallel', '>= 1.20'
41
+
38
42
  # Ruby version
39
43
  spec.required_ruby_version = ">= 2.0.0"
40
44
  end
@@ -0,0 +1,129 @@
1
+ # Parallel Build Generator
2
+ # Speeds up Jekyll builds by rendering pages and documents in parallel
3
+ #
4
+ # This runs as a Generator with :lowest priority to ensure it processes
5
+ # all pages AFTER other generators (like DynamicPages) have created them.
6
+ #
7
+ # Configuration in _config.yml:
8
+ #
9
+ # parallel_build:
10
+ # enabled: true # Enable/disable parallel builds (default: true)
11
+ # threads: 8 # Number of threads (default: number of CPU cores)
12
+ # min_items: 1 # Minimum items before parallelizing (default: 1)
13
+ #
14
+ # Note: Parallel builds work best with CPU-bound rendering.
15
+ # Some Liquid tags may not be thread-safe - if you encounter issues,
16
+ # disable with `parallel_build: false` or `parallel_build.enabled: false`
17
+
18
+ require 'parallel'
19
+
20
+ module Jekyll
21
+ class ParallelBuildGenerator < Generator
22
+ safe true
23
+ priority :lowest # Run AFTER all other generators
24
+
25
+ def generate(site)
26
+ config = site.config['parallel_build']
27
+
28
+ # Handle both `parallel_build: false` and `parallel_build.enabled: false`
29
+ if config == false
30
+ Jekyll.logger.info "ParallelBuild:", "Disabled via config"
31
+ return
32
+ end
33
+
34
+ config = {} if config.nil? || config == true
35
+ return unless config.fetch('enabled', true)
36
+
37
+ threads = config.fetch('threads', Parallel.processor_count)
38
+ min_items = config.fetch('min_items', 1)
39
+
40
+ # Render documents in parallel (posts, collections)
41
+ render_documents_parallel(site, threads, min_items)
42
+
43
+ # Render pages in parallel
44
+ render_pages_parallel(site, threads, min_items)
45
+ end
46
+
47
+ private
48
+
49
+ def render_documents_parallel(site, threads, min_items)
50
+ # Collect all documents that need rendering
51
+ documents = site.collections.flat_map do |_name, collection|
52
+ collection.docs.select { |doc| doc.respond_to?(:render) && !doc.data['rendered_parallel'] }
53
+ end
54
+
55
+ return if documents.size < min_items
56
+
57
+ Jekyll.logger.info "ParallelBuild:", "Rendering #{documents.size} documents with #{threads} threads..."
58
+
59
+ start_time = Time.now
60
+
61
+ # Pre-render: prepare payload and info for each document
62
+ # We need to do the actual Liquid rendering in parallel
63
+ Parallel.each(documents, in_threads: threads) do |doc|
64
+ begin
65
+ # Mark as rendered to avoid double-rendering
66
+ doc.data['rendered_parallel'] = true
67
+
68
+ # Render content through Liquid
69
+ if doc.content && !doc.content.empty?
70
+ payload = site.site_payload
71
+ info = {
72
+ filters: [Jekyll::Filters],
73
+ registers: {
74
+ site: site,
75
+ page: doc.to_liquid
76
+ }
77
+ }
78
+
79
+ # Parse and render Liquid template
80
+ template = site.liquid_renderer.file(doc.path).parse(doc.content)
81
+ doc.content = template.render!(payload, info)
82
+ end
83
+ rescue => e
84
+ Jekyll.logger.warn "ParallelBuild:", "Error rendering #{doc.relative_path}: #{e.message}"
85
+ end
86
+ end
87
+
88
+ elapsed = Time.now - start_time
89
+ Jekyll.logger.info "ParallelBuild:", "Documents rendered in #{elapsed.round(2)}s"
90
+ end
91
+
92
+ def render_pages_parallel(site, threads, min_items)
93
+ # Get all pages (including dynamically generated ones without content)
94
+ pages = site.pages.reject { |page| page.data['rendered_parallel'] }
95
+
96
+ return if pages.size < min_items
97
+
98
+ Jekyll.logger.info "ParallelBuild:", "Rendering #{pages.size} pages with #{threads} threads..."
99
+
100
+ start_time = Time.now
101
+
102
+ Parallel.each(pages, in_threads: threads) do |page|
103
+ begin
104
+ page.data['rendered_parallel'] = true
105
+
106
+ # Only render if there's content to process
107
+ if page.content && !page.content.empty?
108
+ payload = site.site_payload
109
+ info = {
110
+ filters: [Jekyll::Filters],
111
+ registers: {
112
+ site: site,
113
+ page: page.to_liquid
114
+ }
115
+ }
116
+
117
+ template = site.liquid_renderer.file(page.path).parse(page.content)
118
+ page.content = template.render!(payload, info)
119
+ end
120
+ rescue => e
121
+ Jekyll.logger.warn "ParallelBuild:", "Error rendering #{page.name}: #{e.message}"
122
+ end
123
+ end
124
+
125
+ elapsed = Time.now - start_time
126
+ Jekyll.logger.info "ParallelBuild:", "Pages rendered in #{elapsed.round(2)}s"
127
+ end
128
+ end
129
+ end
@@ -1,5 +1,6 @@
1
1
  # Libraries
2
2
  require "jekyll"
3
+ require "parallel"
3
4
 
4
5
  module Jekyll
5
6
  # Load Filters
@@ -14,6 +15,7 @@ module Jekyll
14
15
  # Load Hooks
15
16
  require_relative "hooks/inject-properties"
16
17
  require_relative "hooks/markdown-images"
18
+ # require_relative "hooks/parallel-build"
17
19
 
18
20
  # Load Tags
19
21
  require_relative "tags/external"
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-uj-powertools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ITW Creative Works
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-12-29 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: jekyll
@@ -86,6 +85,20 @@ dependencies:
86
85
  - - ">="
87
86
  - !ruby/object:Gem::Version
88
87
  version: '0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: ostruct
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
89
102
  - !ruby/object:Gem::Dependency
90
103
  name: nokogiri
91
104
  requirement: !ruby/object:Gem::Requirement
@@ -100,6 +113,20 @@ dependencies:
100
113
  - - ">="
101
114
  - !ruby/object:Gem::Version
102
115
  version: '1.17'
116
+ - !ruby/object:Gem::Dependency
117
+ name: parallel
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '1.20'
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '1.20'
103
130
  description: jekyll-uj-powertools provides a powerful set of utilities for Jekyll,
104
131
  including functions to remove ads from strings and escape JSON characters.
105
132
  email:
@@ -121,6 +148,7 @@ files:
121
148
  - lib/helpers/variable_resolver.rb
122
149
  - lib/hooks/inject-properties.rb
123
150
  - lib/hooks/markdown-images.rb
151
+ - lib/hooks/parallel-build.rb
124
152
  - lib/jekyll-uj-powertools.rb
125
153
  - lib/tags/external.rb
126
154
  - lib/tags/fake_comments.rb
@@ -142,7 +170,6 @@ homepage: https://github.com/itw-creative-works/jekyll-uj-powertools
142
170
  licenses:
143
171
  - MIT
144
172
  metadata: {}
145
- post_install_message:
146
173
  rdoc_options: []
147
174
  require_paths:
148
175
  - lib
@@ -157,8 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
184
  - !ruby/object:Gem::Version
158
185
  version: '0'
159
186
  requirements: []
160
- rubygems_version: 3.2.3
161
- signing_key:
187
+ rubygems_version: 4.0.3
162
188
  specification_version: 4
163
189
  summary: A powerful set of utilities for Jekyll
164
190
  test_files: []