Skip to content

Commit e27aea0

Browse files
authored
Comprehensive documentation update (#94)
## Summary - **Python versions**: Update to 3.10-3.14, add v0.13.17 as last 3.9 version - **Documentation fixes**: Fix broken `git://` URL, `pythonbuilder.core` typo, remove deleted plugins (frosted, pychecker), remove Python 3.2 warnings, fix `distutils_commands` default, remove `distutils_use_setuptools` - **Missing plugin properties**: Add undocumented properties for flake8, pylint, unittest, coverage, integrationtest - **New dependency params**: Document `extra` and `markers` keyword arguments - **New manual sections**: Virtual environment infrastructure, unittest subprocess remoting, integration test classpath/PYTHONPATH, coverage instrumentation, logs and reports - **New pages**: Coding agents guide, CLAUDE.md - **Release notes**: Add entries for v0.13.4 through v0.13.19 - **News posts**: 7 new posts for notable releases (3.11, 3.12, 3.13, 3.14, PEP 517, extras) - **Infrastructure**: Bump Jekyll 4.0→4.4, Ruby 3.1→3.4, add `csv`/`base64` gems - **Link fixes**: Migrate DuckDuckGo favicon proxy `ip`→`ip3`, update Twitter→X, remove dead author URL ## Test plan - [x] `./build.sh` passes (Jekyll build + htmlproofer + production build) - [ ] Verify CI passes with Ruby 3.4 - [ ] Review rendered pages for formatting
2 parents 3ac1640 + 8688dd3 commit e27aea0

22 files changed

Lines changed: 1281 additions & 159 deletions

.github/workflows/pybuilder.github.io.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ jobs:
1010
build:
1111
runs-on: ubuntu-latest
1212
steps:
13-
- uses: actions/checkout@v5
13+
- uses: actions/checkout@v6
1414
- uses: ruby/setup-ruby@v1
1515
with:
16-
ruby-version: "3.1"
16+
ruby-version: "3.4"
1717
bundler-cache: false
1818
- name: Install Dependencies
1919
run: bundle install

CLAUDE.md

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
# PyBuilder Documentation Site — Project Instructions
2+
3+
## Overview
4+
5+
This is the official documentation website for [PyBuilder](https://pybuilder.io),
6+
hosted on GitHub Pages. It is a Jekyll static site. The source lives on the `source`
7+
branch; the `master` branch contains only the built output deployed by CI.
8+
9+
Repository: `pybuilder/pybuilder.github.io` (origin, not a fork).
10+
11+
## Branch Model
12+
13+
- **`source`** — all development happens here. This is the default working branch.
14+
- **`master`** — auto-deployed built site. Never edit or push to `master` directly.
15+
- **`plugin_doc_gen`** — WIP branch for plugin documentation rework.
16+
- **`bootstrap_4`** — stale Bootstrap 4 migration branch.
17+
18+
PRs target `source`. The CI deploys to `master` on push to `source`.
19+
20+
## Site Structure
21+
22+
```
23+
_config.yml — primary Jekyll configuration
24+
_config-prod.yml — production URL overlay (https://pybuilder.io)
25+
Gemfile — Ruby dependencies (Jekyll 4.x, plugins, html-proofer)
26+
build.sh — CI build script (build, validate, rebuild with prod config)
27+
CNAME — custom domain (pybuilder.io)
28+
29+
_layouts/
30+
default.html — base layout (header, container, footer)
31+
documentation.html — two-column layout with auto-generated ToC sidebar
32+
post.html — blog post layout with author metadata
33+
34+
_includes/layout/
35+
metaAndStyles.html — Google Analytics, meta tags, CSS imports
36+
header.html — navbar with navigation dropdowns
37+
footer.html — links, scripts, JS imports
38+
39+
_plugins/
40+
pybuilder.rb — custom Liquid filters (abs/rel canonical URL helpers)
41+
42+
_data/
43+
authors.yml — author profiles referenced by blog posts
44+
45+
documentation/ — all documentation pages (layout: documentation)
46+
index.md — documentation hub
47+
installation.md — installation guide
48+
tutorial.md — comprehensive tutorial (~590 lines, largest doc)
49+
manual.md — usage manual
50+
plugins.md — built-in plugin reference (~1100 lines)
51+
writing-plugins.md — plugin development guide
52+
publishing-plugins.md — how to publish plugins
53+
external-plugin-list.md — third-party plugins
54+
examples.md — example projects
55+
ide.md — IDE integration
56+
developing-pybuilder.md — contributing to PyBuilder core
57+
58+
articles/ — Jekyll collections directory
59+
_posts/ — blog posts (layout: post, author: <key from authors.yml>)
60+
_release-notes/ — release notes collection (v0.10.x through v0.13.x)
61+
_migration-guides/ — migration guides collection
62+
63+
css/ — custom stylesheets (styles.css, highlightjs.css, tabcontent.css)
64+
js/ — custom JS (highlight.pack.js, tabcontent.js, toc.js)
65+
img/ — logos, mascot, screenshots
66+
```
67+
68+
## Building Locally
69+
70+
```bash
71+
# Install Ruby dependencies
72+
bundle install
73+
74+
# Start development server with live reload
75+
bundle exec jekyll serve --watch
76+
# Browse to http://localhost:4000
77+
78+
# Full CI-equivalent build (build + htmlproofer + prod rebuild)
79+
./build.sh
80+
```
81+
82+
## CI / Deployment
83+
84+
GitHub Actions workflow at `.github/workflows/pybuilder.github.io.yml`:
85+
1. Triggers on PRs to `source` and pushes to `source`
86+
2. Sets up Ruby 3.1, installs bundle dependencies
87+
3. Runs `build.sh`:
88+
- `jekyll build` (dev config)
89+
- `htmlproofer` validates links, scripts, images, OpenGraph, favicon
90+
- `jekyll build -c _config.yml,_config-prod.yml` (prod config with real URL)
91+
4. On push (not PR): deploys `_site/` to `master` branch
92+
93+
## Content Conventions
94+
95+
### Documentation Pages
96+
97+
- Layout: `documentation` (provides auto-ToC sidebar)
98+
- Front matter: `layout: documentation`, `title: <Page Title>`
99+
- Use `{% link documentation/filename.md %}` for cross-references
100+
- Markdown with kramdown extensions (fenced code blocks, etc.)
101+
102+
### Blog Posts
103+
104+
- Location: `articles/_posts/YYYY-MM-DD-slug.md`
105+
- Layout: `post`
106+
- Front matter: `layout: post`, `title`, `author` (key from `_data/authors.yml`)
107+
- Optional: `update_date` for showing last-updated
108+
109+
### Release Notes
110+
111+
- Location: `articles/_release-notes/vX.Y.x.md`
112+
- One file per minor version series
113+
114+
### Migration Guides
115+
116+
- Location: `articles/_migration-guides/vX.Y.x-vA.B.C.md`
117+
118+
## Technology Stack
119+
120+
- Jekyll 4.x with kramdown (Markdown) and rouge (syntax highlighting)
121+
- Bootstrap 3.4.1 (CSS framework)
122+
- jQuery 3.4.1
123+
- bootstrap-toc 0.4.1 (auto table of contents)
124+
- highlight.js (code highlighting)
125+
- lite-youtube 1.5.0 (lazy YouTube embeds)
126+
- Plugins: jekyll-sitemap, jekyll-paginate, jekyll-last-modified-at,
127+
jekyll-redirect-from, jekyll-seo-tag, jekyll-feed, jemoji, and others
128+
129+
## Git Workflow
130+
131+
This is an origin repo (not a fork). All changes go through PRs to `source`.
132+
Never push directly to `source` or `master`.
133+
134+
## Content Editing
135+
136+
- Keep documentation accurate with respect to the current PyBuilder release.
137+
Cross-reference the main PyBuilder repo at `../pybuilder/` for feature details.
138+
- Preserve existing front matter fields exactly. Do not add or remove fields
139+
unless intentionally changing page behavior.
140+
- Use the `{% link %}` Liquid tag for internal cross-references, never raw paths.
141+
- Do not reformat or rewrap existing paragraphs that you are not changing.
142+
Minimize diff noise.
143+
144+
## Layouts and Includes
145+
146+
- Bootstrap 3, not 4 or 5. The `bootstrap_4` migration was never completed.
147+
Do not upgrade Bootstrap unless explicitly asked.
148+
- Google Analytics tag is in `_includes/layout/metaAndStyles.html`. Do not
149+
modify or remove it.
150+
- Navigation structure is in `_includes/layout/header.html`. When adding new
151+
documentation pages, add a corresponding nav entry there and in
152+
`documentation/index.md`.
153+
154+
## Adding New Documentation Pages
155+
156+
1. Create the `.md` file in `documentation/` with front matter:
157+
```yaml
158+
---
159+
layout: documentation
160+
title: Your Page Title
161+
---
162+
```
163+
2. Add a link in `documentation/index.md` under the appropriate section
164+
3. Add a navigation entry in `_includes/layout/header.html`
165+
166+
## Adding Blog Posts
167+
168+
1. Create `articles/_posts/YYYY-MM-DD-slug.md` with front matter:
169+
```yaml
170+
---
171+
layout: post
172+
title: "Post Title"
173+
author: arcivanov
174+
---
175+
```
176+
2. Author key must exist in `_data/authors.yml`
177+
178+
## Adding Release Notes
179+
180+
1. If a file for the minor version series exists, append to it
181+
2. Otherwise create `articles/_release-notes/vX.Y.x.md`
182+
3. The release notes index auto-generates from the collection
183+
184+
## Testing Changes
185+
186+
- Always run `bundle exec jekyll build` to verify the site builds without errors
187+
- For thorough validation, run `./build.sh` which also checks links and images
188+
via htmlproofer
189+
- htmlproofer may fail on transient external link issues (429, timeouts). These
190+
are usually not your fault. Check if the link is actually broken before fixing.
191+
192+
## Things to Avoid
193+
194+
- Do not edit files on the `master` branch. It is auto-generated.
195+
- Do not add `Gemfile.lock` to version control (it is gitignored).
196+
- Do not modify vendored JS libraries (`highlight.pack.js`, jQuery, Bootstrap)
197+
unless upgrading them intentionally.
198+
- Do not remove or alter the `CNAME` file.
199+
- Do not change `_config.yml` pagination or permalink settings without
200+
understanding the URL impact on existing links and SEO.

Gemfile

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,39 @@
11
source "https://rubygems.org"
22

33
gem "html-proofer"
4-
gem "jekyll", "~> 4.0"
5-
gem "jekyll-sass-converter" #, "~>2.0
4+
gem "jekyll", "~> 4.4"
5+
gem "jekyll-sass-converter"
6+
7+
# Ruby 3.4+ stdlib extractions
8+
gem "csv"
9+
gem "base64"
610

711
# Converters
8-
gem "kramdown" #, "1.17.0"
9-
gem "jekyll-commonmark-ghpages" # "0.1.6"
12+
gem "kramdown"
13+
gem "jekyll-commonmark-ghpages"
1014

1115
# Misc
12-
gem "liquid" #=> "4.0.3",
13-
gem "rouge" #=> "3.13.0",
14-
gem "github-pages-health-check" #=> "1.16.1",
16+
gem "liquid"
17+
gem "rouge"
18+
gem "github-pages-health-check"
1519

1620
# Plugins
17-
gem "jekyll-redirect-from" #=> "0.15.0",
18-
gem "jekyll-sitemap" #=> "1.4.0",
21+
gem "jekyll-redirect-from"
22+
gem "jekyll-sitemap"
1923
gem "jekyll-last-modified-at"
20-
gem "jekyll-feed" #=> "0.13.0",
21-
gem "jekyll-gist" #=> "1.5.0",
22-
gem "jekyll-paginate" #=> "1.1.0",
23-
gem "jekyll-coffeescript" #=> "1.1.1",
24-
gem "jekyll-seo-tag" #=> "2.6.1",
25-
gem "jekyll-github-metadata" #=> "2.13.0",
26-
gem "jekyll-avatar" #=> "0.7.0",
27-
gem "jekyll-remote-theme" #=> "0.4.1",
24+
gem "jekyll-feed"
25+
gem "jekyll-gist"
26+
gem "jekyll-paginate"
27+
gem "jekyll-coffeescript"
28+
gem "jekyll-seo-tag"
29+
gem "jekyll-github-metadata"
30+
gem "jekyll-avatar"
31+
gem "jekyll-remote-theme"
2832

2933
# Plugins to match GitHub.com Markdown
30-
gem "jemoji" #=> "0.11.1",
31-
gem "jekyll-mentions" #=> "1.5.1",
32-
gem "jekyll-relative-links" #=> "0.6.1",
33-
gem "jekyll-optional-front-matter" #=> "0.3.2",
34-
gem "jekyll-readme-index" #=> "0.3.0",
35-
# gem "jekyll-default-layout" #=> "0.1.4",
36-
gem "jekyll-titles-from-headings" #=> "0.5.3",
34+
gem "jemoji"
35+
gem "jekyll-mentions"
36+
gem "jekyll-relative-links"
37+
gem "jekyll-optional-front-matter"
38+
gem "jekyll-readme-index"
39+
gem "jekyll-titles-from-headings"

_data/authors.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,3 @@ mriehl:
1010
name: Maximilien Riehl
1111
email: max@riehl.io
1212
github: mriehl
13-
website: https://max.riehl.io/

_includes/layout/header.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
<li>
5252
<a href="/documentation/ide">IDE integration</a>
5353
</li>
54+
<li>
55+
<a href="/documentation/coding-agents">Coding Agents</a>
56+
</li>
5457
</ul>
5558
</li>
5659
<li class="dropdown-submenu">

_layouts/post.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,21 @@ <h1>{{ page.title }}</h1>
3030
{% endif %}
3131
{% if author.github %}
3232
<a rel="author" href="https://github.com/{{ author.github }}" title="{{ author.name }}'s GitHub">
33-
<img src="https://external-content.duckduckgo.com/ip/github.com.ico" alt="GitHub Logo"></a>
33+
<img src="https://icons.duckduckgo.com/ip3/github.com.ico" alt="GitHub Logo"></a>
3434
{% endif %}
3535
{% if author.openhub %}
3636
<a rel="author" href="https://www.openhub.net/accounts/{{ author.openhub }}"
3737
title="{{ author.name }}'s OpenHub">
38-
<img src="https://external-content.duckduckgo.com/ip/openhub.net.ico" alt="OpenHub Logo"></a>
38+
<img src="https://icons.duckduckgo.com/ip3/openhub.net.ico" alt="OpenHub Logo"></a>
3939
{% endif %}
4040
{% if author.twitter %}
41-
<a rel="author" href="https://twitter.com/{{ author.twitter }}" title="{{ author.name }}'s Twitter">
42-
<img src="https://external-content.duckduckgo.com/ip/twitter.com.ico" alt="Twitter Logo"></a>
41+
<a rel="author" href="https://x.com/{{ author.twitter }}" title="{{ author.name }}'s X">
42+
<img src="https://icons.duckduckgo.com/ip3/x.com.ico" alt="X Logo"></a>
4343
{% endif %}
4444
{% if author.linkedin %}
4545
<a rel="author" href="https://www.linkedin.com/in/{{ author.linkedin }}/"
4646
title="{{ author.name }}'s LinkedIn">
47-
<img src="https://external-content.duckduckgo.com/ip/linkedin.com.ico" alt="LinkedIn Logo">
47+
<img src="https://icons.duckduckgo.com/ip3/linkedin.com.ico" alt="LinkedIn Logo">
4848
</a>
4949
{% endif %}
5050
{% endif %}

about.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ <h2>Who Built The PyBuilder?</h2>
1313
Past maintainers include Maximilien Riehl and Michael Gruber.
1414
</p>
1515
<p>
16-
As of 2020 <a href="https://www.ivanov.biz/">Arcadiy Ivanov</a> is actively developing PyBuilder.
16+
<a href="https://www.ivanov.biz/">Arcadiy Ivanov</a> is the current maintainer and active developer of PyBuilder.
1717
</p>
1818
</div>
1919
</div>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
layout: post
3+
title: "Python 3.11 Support in PyBuilder 0.13.6"
4+
author: arcivanov
5+
categories: news
6+
---
7+
8+
PyBuilder 0.13.6 adds support for Python 3.11, which introduced breaking changes
9+
to both the `multiprocessing` module's spawn mechanism and the `unittest.TestCase`
10+
internal results API. Both are core to PyBuilder's test isolation infrastructure
11+
and required targeted fixes.
12+
13+
This release also drops support for Python 3.6.
14+
15+
See the [release notes](/release-notes/v0.13.x) for details.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
layout: post
3+
title: "PyBuilder 0.13.8: Debug Python Support and Log Formatting"
4+
author: arcivanov
5+
categories: news
6+
---
7+
8+
PyBuilder 0.13.8 brings two notable improvements:
9+
10+
**Debug/release venv distinction.** Managed virtual environments now distinguish
11+
between debug and release builds of Python. Debug builds (compiled with `--with-pydebug`)
12+
get their own isolated venv directories, preventing ABI-incompatible packages from
13+
being mixed between debug and release environments.
14+
15+
**Configurable log format.** A new `--log-format` command line parameter allows
16+
customizing PyBuilder's log output format.
17+
18+
See the [release notes](/release-notes/v0.13.x) for details.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
layout: post
3+
title: "PyBuilder 0.13.11: Python 3.12 Support"
4+
author: arcivanov
5+
categories: news
6+
---
7+
8+
PyBuilder 0.13.11 officially supports Python 3.12. Preliminary fixes for 3.12
9+
compatibility landed in v0.13.10, and this release completes the work with full
10+
CI coverage across CPython 3.8 through 3.12 on Linux, macOS, and Windows.
11+
12+
See the [release notes](/release-notes/v0.13.x) for details.

0 commit comments

Comments
 (0)