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)