Skip to content

Commit 4b014f3

Browse files
committed
feat: filter argument for Builder and CLI
1 parent f91823a commit 4b014f3

File tree

3 files changed

+71
-8
lines changed

3 files changed

+71
-8
lines changed

quartodoc/__main__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,10 @@ def cli():
4242

4343
@click.command()
4444
@click.argument("config", default="_quarto.yml")
45+
@click.option("--filter", nargs=1, default="*")
4546
@click.option("--dry-run", is_flag=True, default=False)
4647
@click.option("--verbose", is_flag=True, default=False)
47-
def build(config, dry_run, verbose):
48+
def build(config, filter, dry_run, verbose):
4849
if verbose:
4950
_enable_logs()
5051

@@ -55,7 +56,7 @@ def build(config, dry_run, verbose):
5556
pass
5657
else:
5758
with chdir(Path(config).parent):
58-
builder.build()
59+
builder.build(filter=filter)
5960

6061

6162
@click.command()

quartodoc/autosummary.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import warnings
55
import yaml
66

7+
from fnmatch import fnmatchcase
78
from griffe.loader import GriffeLoader
89
from griffe.collections import ModulesCollection, LinesCollection
910
from griffe.dataclasses import Alias
@@ -375,7 +376,7 @@ def __init__(
375376
renderer: "dict | Renderer | str" = "markdown",
376377
out_index: str = None,
377378
sidebar: "str | None" = None,
378-
rewrite_all_pages=True,
379+
rewrite_all_pages=False,
379380
):
380381
self.layout = self.load_layout(sections=sections, package=package)
381382

@@ -400,8 +401,16 @@ def load_layout(self, sections: dict, package: str):
400401

401402
# building ----------------------------------------------------------------
402403

403-
def build(self):
404-
"""Build index page, sphinx inventory, and individual doc pages."""
404+
def build(self, filter: str = "*"):
405+
"""Build index page, sphinx inventory, and individual doc pages.
406+
407+
Parameters
408+
----------
409+
filter:
410+
A simple pattern, that may include * as a wildcard. If specified,
411+
only doc paths for objects with matching names will be written.
412+
Path is the file's base name in the API dir (e.g. MdRenderer.render)
413+
"""
405414

406415
from quartodoc import blueprint, collect
407416

@@ -419,7 +428,7 @@ def build(self):
419428
self.write_index(blueprint)
420429

421430
_log.info("Writing docs pages")
422-
self.write_doc_pages(pages)
431+
self.write_doc_pages(pages, filter)
423432

424433
# inventory ----
425434

@@ -448,7 +457,7 @@ def write_index(self, blueprint: layout.Layout):
448457

449458
return str(p_index)
450459

451-
def write_doc_pages(self, pages):
460+
def write_doc_pages(self, pages, filter: str):
452461
"""Write individual function documentation pages."""
453462

454463
for page in pages:
@@ -460,13 +469,24 @@ def write_doc_pages(self, pages):
460469
# Only write out page if it has changed, or we've set the
461470
# rewrite_all_pages option. This ensures that quarto won't have
462471
# to re-render every page of the API all the time.
472+
if filter != "*":
473+
is_match = fnmatchcase(page.path, filter)
474+
475+
if is_match:
476+
_log.info("Matched filter")
477+
else:
478+
_log.info("Skipping write (no filter match)")
479+
continue
480+
463481
if (
464482
self.rewrite_all_pages
465483
or (not html_path.exists())
466484
or (html_path.read_text() != rendered)
467485
):
468-
_log.info(f"Writing {page.path}")
486+
_log.info(f"Writing: {page.path}")
469487
html_path.write_text(rendered)
488+
else:
489+
_log.info("Skipping write (content unchanged)")
470490

471491
# inventory ----
472492

quartodoc/tests/test_builder.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import pytest
2+
3+
from pathlib import Path
4+
from quartodoc import layout as lo
5+
from quartodoc import Builder
6+
7+
8+
@pytest.fixture
9+
def builder(tmp_path):
10+
section = lo.Section(
11+
title="abc",
12+
desc="xyz",
13+
contents=[
14+
lo.Auto(name="get_object"),
15+
lo.Auto(
16+
name="MdRenderer", members=["render", "summarize"], children="separate"
17+
),
18+
],
19+
)
20+
21+
builder = Builder(package="quartodoc", sections=[section], dir=str(tmp_path))
22+
23+
yield builder
24+
25+
26+
def test_builder_build_filter_simple(builder):
27+
builder.build(filter="get_object")
28+
29+
assert (Path(builder.dir) / "get_object.qmd").exists()
30+
assert not (Path(builder.dir) / "MdRenderer.qmd").exists()
31+
32+
33+
def test_builder_build_filter_wildcard_class(builder):
34+
builder.build(filter="MdRenderer*")
35+
36+
len(list(Path(builder.dir).glob("Mdrenderer*"))) == 3
37+
38+
39+
def test_builder_build_filter_wildcard_methods(builder):
40+
builder.build(filter="MdRenderer.*")
41+
42+
len(list(Path(builder.dir).glob("Mdrenderer.*"))) == 2

0 commit comments

Comments
 (0)