Skip to content

Commit 50b9396

Browse files
authored
Merge pull request #36 from machow/refactor-renderer
refactor(renderer)!: change to_md method name to render
2 parents 8efcda7 + 55d4e98 commit 50b9396

File tree

6 files changed

+46
-47
lines changed

6 files changed

+46
-47
lines changed

docs/get-started/basic-docs.qmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ renderer = MdRenderer()
3939
4040
doc_parts = obj.docstring.parsed
4141
doc_params = [entry for entry in doc_parts if entry.kind.name == "parameters"][0]
42-
print(renderer.to_md(doc_params))
42+
print(renderer.render(doc_params))
4343
```
4444

4545
## Section options

docs/get-started/renderers.qmd

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,34 +98,34 @@ class SomeRenderer:
9898
self.header_level = header_level
9999
100100
@dispatch
101-
def visit(self, el):
101+
def render(self, el):
102102
raise NotImplementedError(f"Unsupported type: {type(el)}")
103103
104104
@dispatch
105-
def visit(self, el: Union[dc.Alias, dc.Object]):
105+
def render(self, el: Union[dc.Alias, dc.Object]):
106106
header = "#" * self.header_level
107107
str_header = f"{header} {el.name}"
108108
str_params = f"N PARAMETERS: {len(el.parameters)}"
109-
str_sections = "SECTIONS: " + self.visit(el.docstring)
109+
str_sections = "SECTIONS: " + self.render(el.docstring)
110110
111111
# return something pretty
112112
return "\n".join([str_header, str_params, str_sections])
113113
114114
@dispatch
115-
def visit(self, el: dc.Docstring):
115+
def render(self, el: dc.Docstring):
116116
return f"A docstring with {len(el.parsed)} pieces"
117117
118118
119119
f_obj = get_object("quartodoc", "get_object")
120120
121-
print(SomeRenderer(header_level=2).visit(f_obj))
121+
print(SomeRenderer(header_level=2).render(f_obj))
122122
```
123123

124124
Note 3 big pieces:
125125

126-
* **Generic dispatch**: The plum `dispatch` function decorates each `visit` method. The type annotations
127-
specify the types of data each version of visit should dispatch on.
128-
* **Default behavior**: The first `visit` method ensures a `NotImplementedError` is raised by default.
129-
* **Tree walking**: `visit` methods often call `visit` again on sub elements.
126+
* **Generic dispatch**: The plum `dispatch` function decorates each `render` method. The type annotations
127+
specify the types of data each version of render should dispatch on.
128+
* **Default behavior**: The first `render` method ensures a `NotImplementedError` is raised by default.
129+
* **Tree walking**: `render` methods often call `render` again on sub elements.
130130

131131

examples/shiny/_renderer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ class Renderer(MdRenderer):
3030
style = "shiny"
3131

3232
@dispatch
33-
def to_md(self, el: Union[dc.Object, dc.Alias]):
34-
rendered = super().to_md(el)
33+
def render(self, el: Union[dc.Object, dc.Alias]):
34+
rendered = super().render(el)
3535

3636
p_example = SHINY_PATH / "examples" / el.name / "app.py"
3737
if p_example.exists():

quartodoc/autosummary.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,9 @@ def render_item_link(self, obj):
311311
def write_doc_pages(self):
312312
"""Write individual function documentation pages."""
313313

314-
# TODO: rename to_md to render or something
315314
for item in self.items.values():
316315
_log.info(f"Rendering `{item.canonical_path}`")
317-
rendered = self.renderer.to_md(item)
316+
rendered = self.renderer.render(item)
318317
html_path = Path(self.fetch_object_uri(item))
319318
html_path.parent.mkdir(exist_ok=True, parents=True)
320319

@@ -410,7 +409,7 @@ class BuilderSinglePage(Builder):
410409
style = "single-page"
411410

412411
def render_index(self):
413-
return "\n\n".join([self.renderer.to_md(item) for item in self.items.values()])
412+
return "\n\n".join([self.renderer.render(item) for item in self.items.values()])
414413

415414
def fetch_object_uri(self, obj):
416415
index_name = Path(self.out_index).with_suffix(".html")

quartodoc/renderers.py

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def convert_rst_link_to_md(rst):
7676
return re.sub(expr, r"[](\1)", rst, flags=re.MULTILINE)
7777

7878

79-
# to_md -----------------------------------------------------------------------
79+
# render -----------------------------------------------------------------------
8080
# griffe function dataclass structure:
8181
# Object:
8282
# kind: Kind {"module", "class", "function", "attribute"}
@@ -155,7 +155,7 @@ class MdRenderer(Renderer):
155155
>>> from quartodoc import MdRenderer, get_object
156156
>>> renderer = MdRenderer(header_level=2)
157157
>>> f = get_object("quartodoc", "get_object")
158-
>>> print(renderer.to_md(f)[:81])
158+
>>> print(renderer.render(f)[:81])
159159
## get_object
160160
`get_object(module: str, object_name: str, parser: str = 'numpy')`
161161
@@ -201,25 +201,25 @@ def _fetch_object_dispname(self, el: "dc.Alias | dc.Object"):
201201
raise ValueError(f"Unsupported display_name: `{self.display_name}`")
202202

203203
@dispatch
204-
def to_md(self, el):
204+
def render(self, el):
205205
raise NotImplementedError(f"Unsupported type: {type(el)}")
206206

207207
@dispatch
208-
def to_md(self, el: str):
208+
def render(self, el: str):
209209
return el
210210

211211
# TODO: remove, as this is now handled by _render_annotation
212212
# @dispatch
213-
# def to_md(self, el: Union[Expression, Name]):
213+
# def render(self, el: Union[Expression, Name]):
214214
# # these are used often for annotations, and full returns it as a string
215215
# return el.full
216216

217217
@dispatch
218-
def to_md(self, el: Union[dc.Object, dc.Alias]):
218+
def render(self, el: Union[dc.Object, dc.Alias]):
219219
# TODO: replace hard-coded header level
220220

221221
_str_dispname = self._fetch_object_dispname(el)
222-
_str_pars = self.to_md(el.parameters)
222+
_str_pars = self.render(el.parameters)
223223
str_sig = f"`{_str_dispname}({_str_pars})`"
224224

225225
_anchor = f"{{ #{_str_dispname} }}"
@@ -232,7 +232,7 @@ def to_md(self, el: Union[dc.Object, dc.Alias]):
232232
for section in el.docstring.parsed:
233233
new_el = docstring_section_narrow(section)
234234
title = new_el.kind.value
235-
body = self.to_md(new_el)
235+
body = self.render(new_el)
236236

237237
if title != "text":
238238
header = f"{'#' * (self.header_level + 1)} {title.title()}"
@@ -248,17 +248,17 @@ def to_md(self, el: Union[dc.Object, dc.Alias]):
248248
return "\n\n".join(parts)
249249

250250
@dispatch
251-
def to_md(self, el: dc.Attribute):
251+
def render(self, el: dc.Attribute):
252252
raise NotImplementedError()
253253

254254
# signature parts -------------------------------------------------------------
255255

256256
@dispatch
257-
def to_md(self, el: dc.Parameters):
258-
return ", ".join(map(self.to_md, el))
257+
def render(self, el: dc.Parameters):
258+
return ", ".join(map(self.render, el))
259259

260260
@dispatch
261-
def to_md(self, el: dc.Parameter):
261+
def render(self, el: dc.Parameter):
262262
# TODO: missing annotation
263263
splats = {dc.ParameterKind.var_keyword, dc.ParameterKind.var_positional}
264264
has_default = el.default and el.kind not in splats
@@ -280,24 +280,24 @@ def to_md(self, el: dc.Parameter):
280280
# note this can be a number of things. for example, opening docstring text,
281281
# or a section with a header not included in the numpydoc standard
282282
@dispatch
283-
def to_md(self, el: ds.DocstringSectionText):
283+
def render(self, el: ds.DocstringSectionText):
284284
new_el = docstring_section_narrow(el)
285285
if isinstance(new_el, ds.DocstringSectionText):
286286
# ensures we don't recurse forever
287287
return el.value
288288

289-
return self.to_md(new_el)
289+
return self.render(new_el)
290290

291291
# parameters ----
292292

293293
@dispatch
294-
def to_md(self, el: ds.DocstringSectionParameters):
295-
rows = list(map(self.to_md, el.value))
294+
def render(self, el: ds.DocstringSectionParameters):
295+
rows = list(map(self.render, el.value))
296296
header = ["Name", "Type", "Description", "Default"]
297297
return tabulate(rows, header, tablefmt="github")
298298

299299
@dispatch
300-
def to_md(self, el: ds.DocstringParameter) -> Tuple[str]:
300+
def render(self, el: ds.DocstringParameter) -> Tuple[str]:
301301
# TODO: if default is not, should return the word "required" (unescaped)
302302
default = "required" if el.default is None else escape(el.default)
303303

@@ -307,56 +307,56 @@ def to_md(self, el: ds.DocstringParameter) -> Tuple[str]:
307307
# attributes ----
308308

309309
@dispatch
310-
def to_md(self, el: ds.DocstringSectionAttributes):
310+
def render(self, el: ds.DocstringSectionAttributes):
311311
header = ["Name", "Type", "Description"]
312-
rows = list(map(self.to_md, el.value))
312+
rows = list(map(self.render, el.value))
313313

314314
return tabulate(rows, header, tablefmt="github")
315315

316316
@dispatch
317-
def to_md(self, el: ds.DocstringAttribute):
317+
def render(self, el: ds.DocstringAttribute):
318318
annotation = self._render_annotation(el.annotation)
319-
return el.name, self.to_md(annotation), el.description
319+
return el.name, self.render(annotation), el.description
320320

321321
# see also ----
322322

323323
@dispatch
324-
def to_md(self, el: DocstringSectionSeeAlso):
324+
def render(self, el: DocstringSectionSeeAlso):
325325
# TODO: attempt to parse See Also sections
326326
return convert_rst_link_to_md(el.value)
327327

328328
# examples ----
329329

330330
@dispatch
331-
def to_md(self, el: ds.DocstringSectionExamples):
331+
def render(self, el: ds.DocstringSectionExamples):
332332
# its value is a tuple: DocstringSectionKind["text" | "examples"], str
333333
data = map(tuple_to_data, el.value)
334-
return "\n\n".join(list(map(self.to_md, data)))
334+
return "\n\n".join(list(map(self.render, data)))
335335

336336
@dispatch
337-
def to_md(self, el: ExampleCode):
337+
def render(self, el: ExampleCode):
338338
return f"""```python
339339
{el.value}
340340
```"""
341341

342342
# returns ----
343343

344344
@dispatch
345-
def to_md(self, el: Union[ds.DocstringSectionReturns, ds.DocstringSectionRaises]):
346-
rows = list(map(self.to_md, el.value))
345+
def render(self, el: Union[ds.DocstringSectionReturns, ds.DocstringSectionRaises]):
346+
rows = list(map(self.render, el.value))
347347
header = ["Type", "Description"]
348348
return tabulate(rows, header, tablefmt="github")
349349

350350
@dispatch
351-
def to_md(self, el: Union[ds.DocstringReturn, ds.DocstringRaise]):
351+
def render(self, el: Union[ds.DocstringReturn, ds.DocstringRaise]):
352352
# similar to DocstringParameter, but no name or default
353353
annotation = self._render_annotation(el.annotation)
354354
return (annotation, el.description)
355355

356356
# unsupported parts ----
357357

358358
@dispatch
359-
def to_md(self, el: ExampleText):
359+
def render(self, el: ExampleText):
360360
return el.value
361361

362362
@dispatch.multi(
@@ -367,5 +367,5 @@ def to_md(self, el: ExampleText):
367367
(ds.DocstringReceive,),
368368
(ds.DocstringAttribute,),
369369
)
370-
def to_md(self, el):
370+
def render(self, el):
371371
raise NotImplementedError(f"{type(el)}")

quartodoc/tests/tests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ def test_get_function():
1111
)
1212

1313

14-
def test_render_to_md():
14+
def test_renderer_render():
1515
# TODO: use snapshots?
1616
f_obj = get_function("quartodoc", "get_function")
1717

1818
renderer = MdRenderer()
19-
assert isinstance(renderer.to_md(f_obj), str)
19+
assert isinstance(renderer.render(f_obj), str)

0 commit comments

Comments
 (0)