Skip to content

Commit

Permalink
show source code for properties (#654)
Browse files Browse the repository at this point in the history
  • Loading branch information
tmeyier committed Dec 22, 2023
1 parent 28d394e commit 44ece4c
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 27 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

- Improve rendering of `.pyi` type stubs containing `@typing.overload`.
([#652](https://github.com/mitmproxy/pdoc/pull/652), @mhils)
- `@property` and `@cached_property` attributes now have a "View Source" button.
([#654](https://github.com/mitmproxy/pdoc/pull/654), @tmeyier)

## 2023-12-13: pdoc 14.2.0

Expand Down
3 changes: 3 additions & 0 deletions pdoc/doc.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,9 @@ def members(self) -> dict[str, Doc]:
default_value=empty,
taken_from=taken_from,
)
doc.source = doc_f.source
doc.source_file = doc_f.source_file
doc.source_lines = doc_f.source_lines
elif inspect.isroutine(obj):
doc = Function(self.modulename, qualname, obj, taken_from) # type: ignore
elif (
Expand Down
43 changes: 34 additions & 9 deletions test/testdata/demo_long.html
Original file line number Diff line number Diff line change
Expand Up @@ -800,26 +800,42 @@ <h1 id="a-second-section">A Second Section</h1>

</div>
<div id="Foo.a_property" class="classattr">
<div class="attr variable">
<input id="Foo.a_property-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">a_property</span><span class="annotation">: str</span>


<label class="view-source-button" for="Foo.a_property-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#Foo.a_property"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="Foo.a_property-117"><a href="#Foo.a_property-117"><span class="linenos">117</span></a> <span class="nd">@property</span>
</span><span id="Foo.a_property-118"><a href="#Foo.a_property-118"><span class="linenos">118</span></a> <span class="k">def</span> <span class="nf">a_property</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Foo.a_property-119"><a href="#Foo.a_property-119"><span class="linenos">119</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;This is a `@property` attribute. pdoc will display it as a variable.&quot;&quot;&quot;</span>
</span><span id="Foo.a_property-120"><a href="#Foo.a_property-120"><span class="linenos">120</span></a> <span class="k">return</span> <span class="s2">&quot;true foo&quot;</span>
</span></pre></div>


<div class="docstring"><p>This is a <code>@property</code> attribute. pdoc will display it as a variable.</p>
</div>


</div>
<div id="Foo.a_cached_property" class="classattr">
<div class="attr variable">
<input id="Foo.a_cached_property-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">a_cached_property</span><span class="annotation">: str</span>


<label class="view-source-button" for="Foo.a_cached_property-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#Foo.a_cached_property"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="Foo.a_cached_property-122"><a href="#Foo.a_cached_property-122"><span class="linenos">122</span></a> <span class="nd">@cached_property</span>
</span><span id="Foo.a_cached_property-123"><a href="#Foo.a_cached_property-123"><span class="linenos">123</span></a> <span class="k">def</span> <span class="nf">a_cached_property</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Foo.a_cached_property-124"><a href="#Foo.a_cached_property-124"><span class="linenos">124</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;This is a `@functools.cached_property` attribute. pdoc will display it as a variable as well.&quot;&quot;&quot;</span>
</span><span id="Foo.a_cached_property-125"><a href="#Foo.a_cached_property-125"><span class="linenos">125</span></a> <span class="k">return</span> <span class="s2">&quot;true foo&quot;</span>
</span></pre></div>


<div class="docstring"><p>This is a <code>@functools.cached_property</code> attribute. pdoc will display it as a variable as well.</p>
</div>

Expand Down Expand Up @@ -874,13 +890,22 @@ <h1 id="a-second-section">A Second Section</h1>

</div>
<div id="Foo.a_class_property" class="classattr">
<div class="attr variable">
<input id="Foo.a_class_property-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">a_class_property</span><span class="annotation">: int</span>


<label class="view-source-button" for="Foo.a_class_property-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#Foo.a_class_property"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="Foo.a_class_property-137"><a href="#Foo.a_class_property-137"><span class="linenos">137</span></a> <span class="nd">@classmethod</span> <span class="c1"># type: ignore</span>
</span><span id="Foo.a_class_property-138"><a href="#Foo.a_class_property-138"><span class="linenos">138</span></a> <span class="nd">@property</span>
</span><span id="Foo.a_class_property-139"><a href="#Foo.a_class_property-139"><span class="linenos">139</span></a> <span class="k">def</span> <span class="nf">a_class_property</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span><span id="Foo.a_class_property-140"><a href="#Foo.a_class_property-140"><span class="linenos">140</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;This is what a `@classmethod @property` looks like.&quot;&quot;&quot;</span>
</span><span id="Foo.a_class_property-141"><a href="#Foo.a_class_property-141"><span class="linenos">141</span></a> <span class="k">return</span> <span class="mi">24</span>
</span></pre></div>


<div class="docstring"><p>This is what a <code>@classmethod @property</code> looks like.</p>
</div>

Expand Down
33 changes: 27 additions & 6 deletions test/testdata/flavors_google.html
Original file line number Diff line number Diff line change
Expand Up @@ -1384,26 +1384,47 @@ <h6 id="arguments">Arguments:</h6>

</div>
<div id="ExampleClass.readonly_property" class="classattr">
<div class="attr variable">
<input id="ExampleClass.readonly_property-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">readonly_property</span>


<label class="view-source-button" for="ExampleClass.readonly_property-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#ExampleClass.readonly_property"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="ExampleClass.readonly_property-244"><a href="#ExampleClass.readonly_property-244"><span class="linenos">244</span></a> <span class="nd">@property</span>
</span><span id="ExampleClass.readonly_property-245"><a href="#ExampleClass.readonly_property-245"><span class="linenos">245</span></a> <span class="k">def</span> <span class="nf">readonly_property</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="ExampleClass.readonly_property-246"><a href="#ExampleClass.readonly_property-246"><span class="linenos">246</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;str: Properties should be documented in their getter method.&quot;&quot;&quot;</span>
</span><span id="ExampleClass.readonly_property-247"><a href="#ExampleClass.readonly_property-247"><span class="linenos">247</span></a> <span class="k">return</span> <span class="s1">&#39;readonly_property&#39;</span>
</span></pre></div>


<div class="docstring"><p>str: Properties should be documented in their getter method.</p>
</div>


</div>
<div id="ExampleClass.readwrite_property" class="classattr">
<div class="attr variable">
<input id="ExampleClass.readwrite_property-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">readwrite_property</span>


<label class="view-source-button" for="ExampleClass.readwrite_property-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#ExampleClass.readwrite_property"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="ExampleClass.readwrite_property-249"><a href="#ExampleClass.readwrite_property-249"><span class="linenos">249</span></a> <span class="nd">@property</span>
</span><span id="ExampleClass.readwrite_property-250"><a href="#ExampleClass.readwrite_property-250"><span class="linenos">250</span></a> <span class="k">def</span> <span class="nf">readwrite_property</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="ExampleClass.readwrite_property-251"><a href="#ExampleClass.readwrite_property-251"><span class="linenos">251</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;:obj:`list` of :obj:`str`: Properties with both a getter and setter</span>
</span><span id="ExampleClass.readwrite_property-252"><a href="#ExampleClass.readwrite_property-252"><span class="linenos">252</span></a><span class="sd"> should only be documented in their getter method.</span>
</span><span id="ExampleClass.readwrite_property-253"><a href="#ExampleClass.readwrite_property-253"><span class="linenos">253</span></a>
</span><span id="ExampleClass.readwrite_property-254"><a href="#ExampleClass.readwrite_property-254"><span class="linenos">254</span></a><span class="sd"> If the setter method contains notable behavior, it should be</span>
</span><span id="ExampleClass.readwrite_property-255"><a href="#ExampleClass.readwrite_property-255"><span class="linenos">255</span></a><span class="sd"> mentioned here.</span>
</span><span id="ExampleClass.readwrite_property-256"><a href="#ExampleClass.readwrite_property-256"><span class="linenos">256</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ExampleClass.readwrite_property-257"><a href="#ExampleClass.readwrite_property-257"><span class="linenos">257</span></a> <span class="k">return</span> <span class="p">[</span><span class="s1">&#39;readwrite_property&#39;</span><span class="p">]</span>
</span></pre></div>


<div class="docstring"><p><code>list</code> of <code>str</code>: Properties with both a getter and setter
should only be documented in their getter method.</p>

Expand Down
33 changes: 27 additions & 6 deletions test/testdata/flavors_numpy.html
Original file line number Diff line number Diff line change
Expand Up @@ -1439,26 +1439,47 @@ <h6 id="parameters">Parameters</h6>

</div>
<div id="ExampleClass.readonly_property" class="classattr">
<div class="attr variable">
<input id="ExampleClass.readonly_property-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">readonly_property</span>


<label class="view-source-button" for="ExampleClass.readonly_property-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#ExampleClass.readonly_property"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="ExampleClass.readonly_property-295"><a href="#ExampleClass.readonly_property-295"><span class="linenos">295</span></a> <span class="nd">@property</span>
</span><span id="ExampleClass.readonly_property-296"><a href="#ExampleClass.readonly_property-296"><span class="linenos">296</span></a> <span class="k">def</span> <span class="nf">readonly_property</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="ExampleClass.readonly_property-297"><a href="#ExampleClass.readonly_property-297"><span class="linenos">297</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;str: Properties should be documented in their getter method.&quot;&quot;&quot;</span>
</span><span id="ExampleClass.readonly_property-298"><a href="#ExampleClass.readonly_property-298"><span class="linenos">298</span></a> <span class="k">return</span> <span class="s2">&quot;readonly_property&quot;</span>
</span></pre></div>


<div class="docstring"><p>str: Properties should be documented in their getter method.</p>
</div>


</div>
<div id="ExampleClass.readwrite_property" class="classattr">
<div class="attr variable">
<input id="ExampleClass.readwrite_property-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">readwrite_property</span>


<label class="view-source-button" for="ExampleClass.readwrite_property-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#ExampleClass.readwrite_property"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="ExampleClass.readwrite_property-300"><a href="#ExampleClass.readwrite_property-300"><span class="linenos">300</span></a> <span class="nd">@property</span>
</span><span id="ExampleClass.readwrite_property-301"><a href="#ExampleClass.readwrite_property-301"><span class="linenos">301</span></a> <span class="k">def</span> <span class="nf">readwrite_property</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="ExampleClass.readwrite_property-302"><a href="#ExampleClass.readwrite_property-302"><span class="linenos">302</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;:obj:`list` of :obj:`str`: Properties with both a getter and setter</span>
</span><span id="ExampleClass.readwrite_property-303"><a href="#ExampleClass.readwrite_property-303"><span class="linenos">303</span></a><span class="sd"> should only be documented in their getter method.</span>
</span><span id="ExampleClass.readwrite_property-304"><a href="#ExampleClass.readwrite_property-304"><span class="linenos">304</span></a>
</span><span id="ExampleClass.readwrite_property-305"><a href="#ExampleClass.readwrite_property-305"><span class="linenos">305</span></a><span class="sd"> If the setter method contains notable behavior, it should be</span>
</span><span id="ExampleClass.readwrite_property-306"><a href="#ExampleClass.readwrite_property-306"><span class="linenos">306</span></a><span class="sd"> mentioned here.</span>
</span><span id="ExampleClass.readwrite_property-307"><a href="#ExampleClass.readwrite_property-307"><span class="linenos">307</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="ExampleClass.readwrite_property-308"><a href="#ExampleClass.readwrite_property-308"><span class="linenos">308</span></a> <span class="k">return</span> <span class="p">[</span><span class="s2">&quot;readwrite_property&quot;</span><span class="p">]</span>
</span></pre></div>


<div class="docstring"><p><code>list</code> of <code>str</code>: Properties with both a getter and setter
should only be documented in their getter method.</p>

Expand Down
26 changes: 20 additions & 6 deletions test/testdata/misc.html
Original file line number Diff line number Diff line change
Expand Up @@ -1133,26 +1133,40 @@ <h1 class="modulename">

</div>
<div id="Child.qux" class="classattr">
<div class="attr variable">
<input id="Child.qux-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">qux</span>


<label class="view-source-button" for="Child.qux-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#Child.qux"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="Child.qux-135"><a href="#Child.qux-135"><span class="linenos">135</span></a> <span class="nd">@property</span>
</span><span id="Child.qux-136"><a href="#Child.qux-136"><span class="linenos">136</span></a> <span class="k">def</span> <span class="nf">qux</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Child.qux-137"><a href="#Child.qux-137"><span class="linenos">137</span></a> <span class="k">return</span>
</span></pre></div>


<div class="docstring"><p>qux</p>
</div>


</div>
<div id="Child.quux" class="classattr">
<div class="attr variable">
<input id="Child.quux-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr variable">
<span class="name">quux</span>


<label class="view-source-button" for="Child.quux-view-source"><span>View Source</span></label>

</div>
<a class="headerlink" href="#Child.quux"></a>

<div class="pdoc-code codehilite"><pre><span></span><span id="Child.quux-139"><a href="#Child.quux-139"><span class="linenos">139</span></a> <span class="nd">@cached_property</span>
</span><span id="Child.quux-140"><a href="#Child.quux-140"><span class="linenos">140</span></a> <span class="k">def</span> <span class="nf">quux</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Child.quux-141"><a href="#Child.quux-141"><span class="linenos">141</span></a> <span class="k">return</span>
</span></pre></div>


<div class="docstring"><p>quux</p>
</div>

Expand Down

0 comments on commit 44ece4c

Please sign in to comment.