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 +4 -4
- data/README.md +32 -0
- data/jekyll-uj-powertools.gemspec +5 -1
- data/lib/hooks/parallel-build.rb +129 -0
- data/lib/jekyll-uj-powertools.rb +2 -0
- metadata +32 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 59b2d051f809592cc566481818bc2ac531de4378c131841b1e01f6a1187b5a6d
|
|
4
|
+
data.tar.gz: ffab0a040714b14e3c407ac76a7ce9ffd73dd7bd91a8103a75eb14c15ada7e1d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
data/lib/jekyll-uj-powertools.rb
CHANGED
|
@@ -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.
|
|
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:
|
|
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:
|
|
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: []
|