diff --git a/.cruft.json b/.cruft.json
index ce7583f..02dc312 100644
--- a/.cruft.json
+++ b/.cruft.json
@@ -1,6 +1,6 @@
{
"template": "https://github.com/sphinx-notes/cookiecutter",
- "commit": "4736b672023e3bf4bc80d0d51850d7bc45ca1e12",
+ "commit": "233a8daa4e276a9559975a51178f29e7079dcafd",
"checkout": null,
"context": {
"cookiecutter": {
@@ -12,6 +12,8 @@
"version": "1.1",
"github_owner": "sphinx-notes",
"github_repo": "incrbuild",
+ "generated_file_header": "This file is generated from sphinx-notes/cookiecutter.",
+ "dont_edit_header": "DO NOT EDIT.",
"pypi_name": "sphinxnotes-incrbuild",
"pypi_owner": "SilverRainZ",
"is_python_project": true,
@@ -20,7 +22,7 @@
"sphinx_version": "7.0",
"development_status": "3 - Alpha",
"_template": "https://github.com/sphinx-notes/cookiecutter",
- "_commit": "4736b672023e3bf4bc80d0d51850d7bc45ca1e12"
+ "_commit": "233a8daa4e276a9559975a51178f29e7079dcafd"
}
},
"directory": null
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index e9a39ba..eb63db9 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -1,3 +1,5 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
name: Ruff
on: [ push, pull_request ]
@@ -5,5 +7,5 @@ jobs:
ruff:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: chartboost/ruff-action@v1
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
index 0cf70c8..a7e42c9 100644
--- a/.github/workflows/pages.yml
+++ b/.github/workflows/pages.yml
@@ -1,3 +1,5 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
name: Deploy Sphinx documentation to Pages
# Runs on pushes targeting the default branch
diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml
index c967060..1395ae0 100644
--- a/.github/workflows/pypi.yml
+++ b/.github/workflows/pypi.yml
@@ -1,3 +1,5 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
name: Publish package distributions to PyPI
on:
@@ -14,10 +16,10 @@ jobs:
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
with:
submodules: true
- - uses: actions/setup-python@v5
+ - uses: actions/setup-python@v6
- run: pip install build twine && make dist
- uses: pypa/gh-action-pypi-publish@release/v1
with:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index de0b035..fcd0e11 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,3 +1,5 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
name: Publish Github Release
on:
@@ -11,7 +13,7 @@ jobs:
permissions:
contents: write
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: ncipollo/release-action@v1
with:
body: |
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..6a0fb9d
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,28 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
+name: Test
+on:
+ push:
+ pull_request:
+ schedule:
+ - cron: '0 7 * * 6'
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-python@v6
+ with:
+ python-version-file: 'pyproject.toml'
+ - run: python3 -m pip install .[test]
+ - run: make test
+ doctest:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-python@v6
+ with:
+ python-version-file: 'pyproject.toml'
+ - run: python3 -m pip install .
+ - run: python3 -m pip install -r docs/requirements.txt
+ - run: make doctest
diff --git a/.gitignore b/.gitignore
index 52736b3..7d4bcd8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index b631058..ba69c68 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,8 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.6.1
+ rev: v0.14.11
hooks:
- id: ruff-check
args: [ --fix ]
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..508fca6
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,40 @@
+
+
+## 基本说明
+
+这是一个由 SphinxNotes 开发的 Sphinx Extension,由 `sphinxnotes/cookiecutter` 生成,很多基础文件来自模板。
+
+## 首先阅读
+
+- 开始了解项目时,优先阅读 `docs/index.rst`。
+- 如果任务和文档、Sphinx 配置或示例有关,继续阅读 `docs/` 下的其他文件
+
+## 通用知识
+
+- 使用 `make` 会构建 `docs/` 下的文档,文档自依赖当前项目,因此文档构建成功也意味着项目基本能正常构建
+ - `docs/_build` 存放构建好的文档,`make clean` 清除所有构建结果
+ - `make test` 运行测试,测试位于 `tests/`,可能的 e2e 测试位于 `tests/test_e2e.py`
+ - `make doctest` 运行 Sphinx 文档测试
+ - `make install` 使用 `pip install --user` 将项目安装到本地,跨项目测试时常用
+- `make tmpl-*` 用于模板同步,参看 "模板同步" 小节
+
+## 关于 SphinxNotes 项目
+
+- 同为 `sphinxnotes` 项目的其他仓库通常位于当前项目的上一级目录
+- 如果你在阅读代码时遇到本地依赖、模板来源或跨仓库复用关系,可以直接读取这些本地仓库文件,不必先猜测实现,也不必优先去远程搜索。
+- 当我提到 "所有项目" 的时候,请从当前项目的上一级目录的 `cookiecutter/project-list.txt` 获取项目列表
+- `docs/conf.py` 往往会直接从源码树导入当前项目,因此排查文档构建问题时,要同时检查运行时依赖和文档依赖。
+
+## 模板同步
+
+- 先确认任务是当前项目问题,还是模板问题;如果是模板问题,优先在 `sphinxnotes/cookiecutter` 中修复。
+- 模板变更完成后,优先使用 `make tmpl-update` 把改动同步回项目,而不是手工重复修改生成文件。
+- 如果 `make tmpl-update` 产生 `.rej`、冲突或三方合并失败,优先尝试 `make tmpl-apply-rej`,再手工解决冲突。
+- 手工解决冲突时,重点检查 `README.rst`、`pyproject.toml`、`.github/workflows/`、`docs/conf.py`、`docs/requirements.txt` 这些常见受影响文件。
+- 当模板同步结果确认无误后,优先使用 `make tmpl-update-done` 完成后续收尾步骤。
+
+### 修改约定
+
+- 修改模板生成文件时,保留原有注释,除非模板本身已经统一移除了这些注释。
+- 遇到 `CUSTOM ... START` / `END` 这类用户自定义区块时,必须保留这些锚点,并尽量保留区块中的用户内容。
+- 如果模板更新和项目内手工修改发生冲突,优先保护用户自定义内容,再整理模板变更。
diff --git a/MANIFEST.in b/MANIFEST.in
index 4c868dc..98f33c8 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1,4 @@
# This file is generated from sphinx-notes/cookiecutter.
-# You need to consider modifying the TEMPLATE or modifying THIS FILE.
include LICENSE
include README.rst
diff --git a/Makefile b/Makefile
index e400990..fd5025a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,4 @@
# This file is generated from sphinx-notes/cookiecutter.
-# You need to consider modifying the TEMPLATE or modifying THIS FILE.
LANG = en_US.UTF-8
@@ -23,11 +22,15 @@ clean:
.PHONY: fmt
fmt:
- ruff format src/ && ruff check --fix src/
+ ruff format src/ tests/ && ruff check --fix src/ tests/
.PHONY: test
test:
- $(PY) -m unittest discover -s tests -v
+ $(PY) -m pytest tests/ -v
+
+.PHONY: doctest
+doctest:
+ $(MAKE) doctest -C docs/
################################################################################
# Distribution Package
@@ -36,7 +39,8 @@ test:
# Build distribution package, for "install" or "upload".
.PHONY: dist
dist: pyproject.toml clean
- $(PY) -m build
+ # Use ``--no-isolation`` to prevent network accessing when in local env.
+ $(PY) -m build $(if $(CI),,--no-isolation)
# Install distribution package to user directory.
#
diff --git a/README.rst b/README.rst
index baf657e..0a9a91e 100644
--- a/README.rst
+++ b/README.rst
@@ -1,5 +1,4 @@
.. This file is generated from sphinx-notes/cookiecutter.
- You need to consider modifying the TEMPLATE or modifying THIS FILE.
=====================
sphinxnotes-incrbuild
diff --git a/docs/Makefile b/docs/Makefile
index 57d350d..c6a9589 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,5 +1,4 @@
# This file is generated from sphinx-notes/cookiecutter.
-# You need to consider modifying the TEMPLATE or modifying THIS FILE.
# Minimal makefile for Sphinx documentation
diff --git a/docs/_images/.gitkeep b/docs/_images/.gitkeep
index e69de29..cc71341 100644
--- a/docs/_images/.gitkeep
+++ b/docs/_images/.gitkeep
@@ -0,0 +1 @@
+# This file is generated from sphinx-notes/cookiecutter.
diff --git a/docs/_static/.gitkeep b/docs/_static/.gitkeep
index e69de29..cc71341 100644
--- a/docs/_static/.gitkeep
+++ b/docs/_static/.gitkeep
@@ -0,0 +1 @@
+# This file is generated from sphinx-notes/cookiecutter.
diff --git a/docs/_static/custom.css b/docs/_static/custom.css
new file mode 100644
index 0000000..814ba33
--- /dev/null
+++ b/docs/_static/custom.css
@@ -0,0 +1,10 @@
+/* This file is generated from sphinx-notes/cookiecutter.
+ * DO NOT EDIT.
+ */
+
+/* Missing style for nodes.system_message from Alabaster. */
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
diff --git a/docs/changelog.rst b/docs/changelog.rst
index ff0af1b..07da147 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -1,5 +1,4 @@
.. This file is generated from sphinx-notes/cookiecutter.
- You need to consider modifying the TEMPLATE or modifying THIS FILE.
==========
Change Log
diff --git a/docs/conf.py b/docs/conf.py
index 340f896..c376a5e 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,5 +1,4 @@
# This file is generated from sphinx-notes/cookiecutter.
-# You need to consider modifying the TEMPLATE or modifying THIS FILE.
# Configuration file for the Sphinx documentation builder.
#
@@ -23,6 +22,8 @@
# ones.
extensions = [
'sphinx.ext.githubpages',
+ 'sphinx.ext.doctest',
+ 'sphinx.ext.viewcode',
'sphinx_design',
'sphinx_copybutton',
'sphinx_last_updated_by_git',
@@ -45,6 +46,9 @@
# produce any output in the built files.
show_authors = True
+# Keep warnings as “system message” paragraphs in the rendered documents.
+keep_warnings = True
+
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
@@ -52,12 +56,6 @@
#
html_theme = 'furo'
-html_theme_options = {}
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
html_theme_options = {
"source_repository": "https://github.com/sphinx-notes/incrbuild/",
"source_branch": "master",
@@ -70,6 +68,13 @@
html_logo = html_favicon = '_static/sphinx-notes.png'
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+html_css_files = ['custom.css']
+
# -- Extensions -------------------------------------------------------------
extensions.append('sphinx.ext.extlinks')
@@ -85,13 +90,12 @@
extensions.append('sphinx.ext.autodoc')
autoclass_content = 'init'
autodoc_typehints = 'description'
+autodoc_default_options = {
+ 'member-order': 'bysource',
+}
extensions.append('sphinx.ext.intersphinx')
-intersphinx_mapping = {
- 'python': ('https://docs.python.org/3', None),
- 'sphinx': ('https://www.sphinx-doc.org/en/master', None),
- 'jinja': ('https://jinja.palletsprojects.com/en/latest/', None),
-}
+intersphinx_mapping = {}
extensions.append('sphinx_sitemap')
sitemap_filename = "sitemap.xml"
@@ -107,6 +111,7 @@
'parsed_literal': (['literal'], True),
}
+
extensions.append('sphinxnotes.project')
primary_domain = 'any'
diff --git a/docs/index.rst b/docs/index.rst
index 4cca956..d7f8e18 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,5 +1,4 @@
.. This file is generated from sphinx-notes/cookiecutter.
- You need to consider modifying the TEMPLATE or modifying THIS FILE.
=====================
sphinxnotes-incrbuild
@@ -125,6 +124,7 @@ as part of **The Sphinx Notes Project**.
:caption: The Sphinx Notes Project
Home
+ GitHub
Blog
PyPI
diff --git a/docs/make.bat b/docs/make.bat
index b158787..ebe7703 100644
--- a/docs/make.bat
+++ b/docs/make.bat
@@ -1,37 +1,38 @@
-REM This file is generated from sphinx-notes/cookiecutter. DO NOT EDIT.
-
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=python -msphinx
-)
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The Sphinx module was not found. Make sure you have Sphinx installed,
- echo.then set the SPHINXBUILD environment variable to point to the full
- echo.path of the 'sphinx-build' executable. Alternatively you may add the
- echo.Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
-
-:end
-popd
+REM This file is generated from sphinx-notes/cookiecutter.
+REM DO NOT EDIT.
+
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=python -msphinx
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The Sphinx module was not found. Make sure you have Sphinx installed,
+ echo.then set the SPHINXBUILD environment variable to point to the full
+ echo.path of the 'sphinx-build' executable. Alternatively you may add the
+ echo.Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+
+:end
+popd
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..85c7d97
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,15 @@
+# This file is generated from sphinx-notes/cookiecutter.
+
+# Documentation build dependencies.
+# Keep these out of pyproject optional-dependencies to avoid resolver issues.
+furo
+sphinx_copybutton
+sphinxcontrib-gtagjs
+sphinx-sitemap
+sphinxext-opengraph
+sphinx-last-updated-by-git
+sphinxnotes-project
+sphinxnotes-comboroles
+
+# CUSTOM DOCS DEPENDENCIES START
+# CUSTOM DOCS DEPENDENCIES END
diff --git a/pyproject.toml b/pyproject.toml
index 7144ce2..c5f37f8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,5 +1,4 @@
# This file is generated from sphinx-notes/cookiecutter.
-# You need to consider modifying the TEMPLATE or modifying THIS FILE.
# This file is used to configure your project.
# Read more about the various options under:
@@ -59,22 +58,6 @@ dev = [
test = [
"pytest",
]
-docs = [
- "furo",
- "sphinx_design",
- "sphinx_copybutton",
- "sphinxcontrib-gtagjs",
- "sphinx-sitemap",
- "sphinxext-opengraph",
- "sphinx-last-updated-by-git",
-
- # Dependencies of sphinxnotes projcts.
- "sphinxnotes-project",
- "sphinxnotes-comboroles",
-
- # CUSTOM DOCS DEPENDENCIES START
- # CUSTOM DOCS DEPENDENCIES END
-]
[project.urls]
homepage = "https://sphinx.silverrainz.me/incrbuild"
diff --git a/ruff.toml b/ruff.toml
index 1774a67..9633cdd 100644
--- a/ruff.toml
+++ b/ruff.toml
@@ -1,5 +1,4 @@
# This file is generated from sphinx-notes/cookiecutter.
-# You need to consider modifying the TEMPLATE or modifying THIS FILE.
exclude = [
"docs/conf.py",
diff --git a/src/sphinxnotes/incrbuild/meta.py b/src/sphinxnotes/incrbuild/meta.py
index f666b2b..fda9b6c 100644
--- a/src/sphinxnotes/incrbuild/meta.py
+++ b/src/sphinxnotes/incrbuild/meta.py
@@ -1,5 +1,5 @@
# This file is generated from sphinx-notes/cookiecutter.
-# DO NOT EDIT!!!
+# DO NOT EDIT.
################################################################################
# Project meta infos.
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..cc71341
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1 @@
+# This file is generated from sphinx-notes/cookiecutter.
diff --git a/tests/test_always_pass.py b/tests/test_always_pass.py
new file mode 100644
index 0000000..9a05eb7
--- /dev/null
+++ b/tests/test_always_pass.py
@@ -0,0 +1,9 @@
+# This file is generated from sphinx-notes/cookiecutter.
+# DO NOT EDIT.
+
+import unittest
+
+
+class TestAlwaysPass(unittest.TestCase):
+ def test_dummy(self):
+ self.assertTrue(True)