pyglove 0.4.5.dev202410100808__py3-none-any.whl → 0.4.5.dev202410110808__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,12 +13,15 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import inspect
16
+ from typing import Any, List, Sequence
16
17
  import unittest
17
18
 
18
19
  from pyglove.core.views.html import base
19
20
  from pyglove.core.views.html import tree_view
20
21
 
21
22
  Html = base.Html
23
+ KeyPath = tree_view.KeyPath
24
+ KeyPathSet = tree_view.KeyPathSet
22
25
 
23
26
 
24
27
  class TestCase(unittest.TestCase):
@@ -82,7 +85,7 @@ class TooltipTest(TestCase):
82
85
  name='name',
83
86
  ),
84
87
  """
85
- <span class="tooltip">&#x27;This &lt;hello&gt;&lt;world&gt;&lt;/world&gt;&lt;/hello&gt;.&#x27;</span>
88
+ <span class="tooltip str">&#x27;This &lt;hello&gt;&lt;world&gt;&lt;/world&gt;&lt;/hello&gt;.&#x27;</span>
86
89
  """
87
90
  )
88
91
  self.assert_content(
@@ -92,7 +95,7 @@ class TooltipTest(TestCase):
92
95
  name='name',
93
96
  ),
94
97
  """
95
- <span class="tooltip"><div>hello</div></span>
98
+ <span class="tooltip int"><div>hello</div></span>
96
99
  """
97
100
  )
98
101
 
@@ -158,7 +161,7 @@ class SummaryTest(TestCase):
158
161
  self.assert_content(
159
162
  self._view.summary('foo', enable_summary=True),
160
163
  """
161
- <summary><div class="summary_title">&#x27;foo&#x27;</div><span class="tooltip">&#x27;foo&#x27;</span></summary>
164
+ <summary><div class="summary_title">&#x27;foo&#x27;</div><span class="tooltip str">&#x27;foo&#x27;</span></summary>
162
165
  """
163
166
  )
164
167
  self.assert_content(
@@ -166,7 +169,7 @@ class SummaryTest(TestCase):
166
169
  'foo', enable_summary=None, max_summary_len_for_str=1
167
170
  ),
168
171
  """
169
- <summary><div class="summary_title">&#x27;f...&#x27;</div><span class="tooltip">&#x27;foo&#x27;</span></summary>
172
+ <summary><div class="summary_title">&#x27;f...&#x27;</div><span class="tooltip str">&#x27;foo&#x27;</span></summary>
170
173
  """
171
174
  )
172
175
 
@@ -177,7 +180,7 @@ class SummaryTest(TestCase):
177
180
  max_summary_len_for_str=5
178
181
  ),
179
182
  """
180
- <summary><div class="summary_title">&#x27;abcde...&#x27;</div><span class="tooltip">&#x27;abcdefg&#x27;</span></summary>
183
+ <summary><div class="summary_title">&#x27;abcde...&#x27;</div><span class="tooltip str">&#x27;abcdefg&#x27;</span></summary>
181
184
  """
182
185
  )
183
186
 
@@ -185,7 +188,7 @@ class SummaryTest(TestCase):
185
188
  self.assert_content(
186
189
  self._view.summary('foo', name='x'),
187
190
  """
188
- <summary><div class="summary_name">x</div><div class="summary_title">&#x27;foo&#x27;</div><span class="tooltip">&#x27;foo&#x27;</span></summary>
191
+ <summary><div class="summary_name">x</div><div class="summary_title">&#x27;foo&#x27;</div><span class="tooltip str">&#x27;foo&#x27;</span></summary>
189
192
  """
190
193
  )
191
194
 
@@ -195,7 +198,7 @@ class SummaryTest(TestCase):
195
198
  'foo', enable_summary=True, enable_summary_tooltip=True
196
199
  ),
197
200
  """
198
- <summary><div class="summary_title">&#x27;foo&#x27;</div><span class="tooltip">&#x27;foo&#x27;</span></summary>
201
+ <summary><div class="summary_title">&#x27;foo&#x27;</div><span class="tooltip str">&#x27;foo&#x27;</span></summary>
199
202
  """
200
203
  )
201
204
  self.assert_content(
@@ -235,26 +238,26 @@ class ContentTest(TestCase):
235
238
  visibility: visible;
236
239
  background-color: darkblue;
237
240
  }
238
- .complex_value .object_key{
241
+ .object_key.str {
239
242
  color: gray;
240
243
  border: 1px solid lightgray;
241
244
  background-color: ButtonFace;
242
245
  border-radius: 0.2em;
243
246
  padding: 0.3em;
244
247
  }
245
- .complex_value.list .object_key{
248
+ .object_key.int::before{
249
+ content: '[';
250
+ }
251
+ .object_key.int::after{
252
+ content: ']';
253
+ }
254
+ .object_key.int{
246
255
  border: 0;
247
256
  color: lightgray;
248
257
  background-color: transparent;
249
258
  border-radius: 0;
250
259
  padding: 0;
251
260
  }
252
- .complex_value.list .object_key::before{
253
- content: '[';
254
- }
255
- .complex_value.list .object_key::after{
256
- content: ']';
257
- }
258
261
  /* Simple value styles. */
259
262
  .simple_value {
260
263
  color: blue;
@@ -308,7 +311,7 @@ class ContentTest(TestCase):
308
311
  )
309
312
  self.assert_content(
310
313
  self._view.content('<foo>'),
311
- """
314
+ """
312
315
  <span class="simple_value str">&#x27;&lt;foo&gt;&#x27;</span>
313
316
  """
314
317
  )
@@ -316,7 +319,7 @@ class ContentTest(TestCase):
316
319
  self._view.content(
317
320
  '<hello><world> \nto everyone.', max_summary_len_for_str=10
318
321
  ),
319
- """
322
+ """
320
323
  <span class="simple_value str">&lt;hello&gt;&lt;world&gt;
321
324
  to everyone.</span>
322
325
  """
@@ -326,7 +329,7 @@ class ContentTest(TestCase):
326
329
  self.assert_content(
327
330
  self._view.content([1, 2, 'abc']),
328
331
  """
329
- <div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[1]</span></td><td><span class="simple_value int">2</span></td></tr><tr><td><span class="object_key">2</span><span class="tooltip">[2]</span></td><td><span class="simple_value str">&#x27;abc&#x27;</span></td></tr></table></div>
332
+ <div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[1]</span></td><td><div><span class="simple_value int">2</span></div></td></tr><tr><td><span class="object_key int">2</span><span class="tooltip key-path">[2]</span></td><td><div><span class="simple_value str">&#x27;abc&#x27;</span></div></td></tr></table></div>
330
333
  """
331
334
  )
332
335
  self.assert_content(
@@ -340,7 +343,7 @@ class ContentTest(TestCase):
340
343
  self.assert_content(
341
344
  self._view.content((1, True)),
342
345
  """
343
- <div class="complex_value tuple"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[1]</span></td><td><span class="simple_value bool">True</span></td></tr></table></div>
346
+ <div class="complex_value tuple"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[1]</span></td><td><div><span class="simple_value bool">True</span></div></td></tr></table></div>
344
347
  """
345
348
  )
346
349
  self.assert_content(
@@ -354,7 +357,7 @@ class ContentTest(TestCase):
354
357
  self.assert_content(
355
358
  self._view.content(dict(x=1, y='foo')),
356
359
  """
357
- <div class="complex_value dict"><table><tr><td><span class="object_key">x</span><span class="tooltip">x</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">y</span><span class="tooltip">y</span></td><td><span class="simple_value str">&#x27;foo&#x27;</span></td></tr></table></div>
360
+ <div class="complex_value dict"><table><tr><td><span class="object_key str">x</span><span class="tooltip key-path">x</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key str">y</span><span class="tooltip key-path">y</span></td><td><div><span class="simple_value str">&#x27;foo&#x27;</span></div></td></tr></table></div>
358
361
  """
359
362
  )
360
363
  self.assert_content(
@@ -377,6 +380,28 @@ class ContentTest(TestCase):
377
380
  """
378
381
  )
379
382
 
383
+ def test_custom_key_value_render(self):
384
+ def render_key(key, **kwargs):
385
+ del kwargs
386
+ return Html.element('span', [f'custom {key}'])
387
+
388
+ def render_value(value, **kwargs):
389
+ del kwargs
390
+ return Html.element('span', [f'custom {value}'])
391
+
392
+ self.assert_content(
393
+ self._view.complex_value(
394
+ dict(x=1, y='foo'),
395
+ parent=None,
396
+ root_path=KeyPath(),
397
+ render_key_fn=render_key,
398
+ render_value_fn=render_value,
399
+ ),
400
+ """
401
+ <div class="complex_value none-type"><table><tr><td><span>custom x</span></td><td><div><span>custom 1</span></div></td></tr><tr><td><span>custom y</span></td><td><div><span>custom foo</span></div></td></tr></table></div>
402
+ """
403
+ )
404
+
380
405
  def test_nesting(self):
381
406
 
382
407
  class Foo:
@@ -395,16 +420,16 @@ class ContentTest(TestCase):
395
420
  ]
396
421
  ),
397
422
  """
398
- <div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0]</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip">{
423
+ <div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0]</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip dict">{
399
424
  &#x27;x&#x27;: [(1, 2)],
400
425
  &#x27;y&#x27;: [&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]
401
- }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key">x</span><span class="tooltip">[0].x</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[(1, 2)]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].x[0]</span></td><td><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div><span class="tooltip">(1, 2)</span></summary><div class="complex_value tuple"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].x[0][0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[0].x[0][1]</span></td><td><span class="simple_value int">2</span></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">y</span><span class="tooltip">[0].y</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].y[0]</span></td><td><span class="simple_value str">&#x27;b&#x27;</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[0].y[1]</span></td><td><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div><span class="tooltip">&lt;Foo&gt;&lt;/Foo&gt;</span></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[1]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">2</span><span class="tooltip">[2]</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[1, {
426
+ }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">x</span><span class="tooltip key-path">[0].x</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[(1, 2)]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].x[0]</span></td><td><div><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div><span class="tooltip tuple">(1, 2)</span></summary><div class="complex_value tuple"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].x[0][0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[0].x[0][1]</span></td><td><div><span class="simple_value int">2</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key str">y</span><span class="tooltip key-path">[0].y</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].y[0]</span></td><td><div><span class="simple_value str">&#x27;b&#x27;</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[0].y[1]</span></td><td><div><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div><span class="tooltip foo">&lt;Foo&gt;&lt;/Foo&gt;</span></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[1]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">2</span><span class="tooltip key-path">[2]</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[1, {
402
427
  &#x27;xx&#x27;: 1,
403
428
  &#x27;yy&#x27;: &#x27;a&#x27;
404
- }]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[2][0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[2][1]</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip">{
429
+ }]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[2][0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[2][1]</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip dict">{
405
430
  &#x27;xx&#x27;: 1,
406
431
  &#x27;yy&#x27;: &#x27;a&#x27;
407
- }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key">xx</span><span class="tooltip">[2][1].xx</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">yy</span><span class="tooltip">[2][1].yy</span></td><td><span class="simple_value str">&#x27;a&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div>
432
+ }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">xx</span><span class="tooltip key-path">[2][1].xx</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key str">yy</span><span class="tooltip key-path">[2][1].yy</span></td><td><div><span class="simple_value str">&#x27;a&#x27;</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr></table></div>
408
433
  """
409
434
  )
410
435
 
@@ -425,22 +450,22 @@ class ContentTest(TestCase):
425
450
  self.assert_content(
426
451
  self._view.content(value, enable_summary_tooltip=False),
427
452
  """
428
- <div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0]</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key">x</span><span class="tooltip">[0].x</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].x[0]</span></td><td><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div></summary><div class="complex_value tuple"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].x[0][0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[0].x[0][1]</span></td><td><span class="simple_value int">2</span></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">y</span><span class="tooltip">[0].y</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].y[0]</span></td><td><span class="simple_value str">&#x27;b&#x27;</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[0].y[1]</span></td><td><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[1]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">2</span><span class="tooltip">[2]</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[2][0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[2][1]</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key">xx</span><span class="tooltip">[2][1].xx</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">yy</span><span class="tooltip">[2][1].yy</span></td><td><span class="simple_value str">&#x27;a&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div>
453
+ <div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0]</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">x</span><span class="tooltip key-path">[0].x</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].x[0]</span></td><td><div><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div></summary><div class="complex_value tuple"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].x[0][0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[0].x[0][1]</span></td><td><div><span class="simple_value int">2</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key str">y</span><span class="tooltip key-path">[0].y</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].y[0]</span></td><td><div><span class="simple_value str">&#x27;b&#x27;</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[0].y[1]</span></td><td><div><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[1]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">2</span><span class="tooltip key-path">[2]</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[2][0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[2][1]</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">xx</span><span class="tooltip key-path">[2][1].xx</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key str">yy</span><span class="tooltip key-path">[2][1].yy</span></td><td><div><span class="simple_value str">&#x27;a&#x27;</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr></table></div>
429
454
  """
430
455
  )
431
456
  self.assert_content(
432
457
  self._view.content(value, enable_key_tooltip=False),
433
458
  """
434
- <div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip">{
459
+ <div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip dict">{
435
460
  &#x27;x&#x27;: [(1, 2)],
436
461
  &#x27;y&#x27;: [&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]
437
- }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key">x</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[(1, 2)]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div><span class="tooltip">(1, 2)</span></summary><div class="complex_value tuple"><table><tr><td><span class="object_key">0</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span></td><td><span class="simple_value int">2</span></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">y</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><span class="simple_value str">&#x27;b&#x27;</span></td></tr><tr><td><span class="object_key">1</span></td><td><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div><span class="tooltip">&lt;Foo&gt;&lt;/Foo&gt;</span></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">1</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">2</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[1, {
462
+ }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">x</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[(1, 2)]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div><span class="tooltip tuple">(1, 2)</span></summary><div class="complex_value tuple"><table><tr><td><span class="object_key int">0</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><span class="simple_value int">2</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key str">y</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><span class="simple_value str">&#x27;b&#x27;</span></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div><span class="tooltip foo">&lt;Foo&gt;&lt;/Foo&gt;</span></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">2</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[1, {
438
463
  &#x27;xx&#x27;: 1,
439
464
  &#x27;yy&#x27;: &#x27;a&#x27;
440
- }]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip">{
465
+ }]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip dict">{
441
466
  &#x27;xx&#x27;: 1,
442
467
  &#x27;yy&#x27;: &#x27;a&#x27;
443
- }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key">xx</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">yy</span></td><td><span class="simple_value str">&#x27;a&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div>
468
+ }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">xx</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key str">yy</span></td><td><div><span class="simple_value str">&#x27;a&#x27;</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr></table></div>
444
469
  """
445
470
  )
446
471
  self.assert_content(
@@ -448,7 +473,7 @@ class ContentTest(TestCase):
448
473
  value, enable_summary_tooltip=False, enable_key_tooltip=False
449
474
  ),
450
475
  """
451
- <div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key">x</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div></summary><div class="complex_value tuple"><table><tr><td><span class="object_key">0</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span></td><td><span class="simple_value int">2</span></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">y</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><span class="simple_value str">&#x27;b&#x27;</span></td></tr><tr><td><span class="object_key">1</span></td><td><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">1</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">2</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key">xx</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">yy</span></td><td><span class="simple_value str">&#x27;a&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div>
476
+ <div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">x</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div></summary><div class="complex_value tuple"><table><tr><td><span class="object_key int">0</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><span class="simple_value int">2</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key str">y</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><span class="simple_value str">&#x27;b&#x27;</span></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">2</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">xx</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key str">yy</span></td><td><div><span class="simple_value str">&#x27;a&#x27;</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr></table></div>
452
477
  """
453
478
  )
454
479
 
@@ -474,7 +499,7 @@ class ContentTest(TestCase):
474
499
  enable_key_tooltip=False,
475
500
  ),
476
501
  """
477
- <div class="complex_value dict"><details class="pyglove str special_value"><summary><div class="summary_name">c</div><div class="summary_title">&#x27;z&#x27;</div></summary><span class="simple_value str">&#x27;z&#x27;</span></details><details class="pyglove dict special_value"><summary><div class="summary_name">b</div><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key">e</span></td><td><span class="simple_value str">&#x27;y&#x27;</span></td></tr></table></div></details><table><tr><td><span class="object_key">a</span></td><td><span class="simple_value str">&#x27;x&#x27;</span></td></tr><tr><td><span class="object_key">d</span></td><td><span class="simple_value str">&#x27;w&#x27;</span></td></tr><tr><td><span class="object_key">e</span></td><td><span class="simple_value str">&#x27;v&#x27;</span></td></tr><tr><td><span class="object_key">f</span></td><td><span class="simple_value str">&#x27;u&#x27;</span></td></tr></table></div>
502
+ <div class="complex_value dict"><div class="special_value"><details class="pyglove str"><summary><div class="summary_name">c</div><div class="summary_title">&#x27;z&#x27;</div></summary><span class="simple_value str">&#x27;z&#x27;</span></details></div><div class="special_value"><details class="pyglove dict"><summary><div class="summary_name">b</div><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">e</span></td><td><div><span class="simple_value str">&#x27;y&#x27;</span></div></td></tr></table></div></details></div><table><tr><td><span class="object_key str">a</span></td><td><div><span class="simple_value str">&#x27;x&#x27;</span></div></td></tr><tr><td><span class="object_key str">d</span></td><td><div><span class="simple_value str">&#x27;w&#x27;</span></div></td></tr><tr><td><span class="object_key str">e</span></td><td><div><span class="simple_value str">&#x27;v&#x27;</span></div></td></tr><tr><td><span class="object_key str">f</span></td><td><div><span class="simple_value str">&#x27;u&#x27;</span></div></td></tr></table></div>
478
503
  """
479
504
  )
480
505
  self.assert_count(
@@ -497,7 +522,7 @@ class ContentTest(TestCase):
497
522
  filter=(lambda k, v, p: len(k) > 1 or isinstance(v, dict))
498
523
  ),
499
524
  """
500
- <div class="complex_value dict"><table><tr><td><span class="object_key">b</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key">e</span></td><td><span class="simple_value str">&#x27;y&#x27;</span></td></tr></table></div></details></td></tr></table></div>
525
+ <div class="complex_value dict"><table><tr><td><span class="object_key str">b</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">e</span></td><td><div><span class="simple_value str">&#x27;y&#x27;</span></div></td></tr></table></div></details></div></td></tr></table></div>
501
526
  """
502
527
  )
503
528
 
@@ -511,7 +536,7 @@ class ContentTest(TestCase):
511
536
  lowlight_keys=(lambda k, v, p: isinstance(v, str)),
512
537
  ),
513
538
  """
514
- <div class="complex_value dict"><table><tr><td><span class="object_key">a</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">b</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key">e</span></td><td><span class="simple_value str">&#x27;y&#x27;</span></td></tr></table></div></details></td></tr><tr><td><span class="object_key">c</span></td><td><span class="simple_value int">2</span></td></tr><tr><td><span class="object_key">d</span></td><td><span class="simple_value str">&#x27;w&#x27;</span></td></tr><tr><td><span class="object_key">e</span></td><td><span class="simple_value int">3</span></td></tr><tr><td><span class="object_key">f</span></td><td><span class="simple_value str">&#x27;u&#x27;</span></td></tr></table></div>
539
+ <div class="complex_value dict"><table><tr><td><span class="object_key str">a</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key str">b</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">e</span></td><td><div><span class="simple_value str">&#x27;y&#x27;</span></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key str">c</span></td><td><div><span class="simple_value int">2</span></div></td></tr><tr><td><span class="object_key str">d</span></td><td><div><span class="simple_value str">&#x27;w&#x27;</span></div></td></tr><tr><td><span class="object_key str">e</span></td><td><div><span class="simple_value int">3</span></div></td></tr><tr><td><span class="object_key str">f</span></td><td><div><span class="simple_value str">&#x27;u&#x27;</span></div></td></tr></table></div>
515
540
  """
516
541
  )
517
542
 
@@ -625,7 +650,7 @@ class RenderTest(TestCase):
625
650
  ],
626
651
  ),
627
652
  """
628
- <details open class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[
653
+ <details open class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[
629
654
  {
630
655
  &#x27;x&#x27;: [(1, 2)],
631
656
  &#x27;y&#x27;: [&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]
@@ -635,16 +660,16 @@ class RenderTest(TestCase):
635
660
  &#x27;xx&#x27;: 1,
636
661
  &#x27;yy&#x27;: &#x27;a&#x27;
637
662
  }]
638
- ]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0]</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip">{
663
+ ]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0]</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip dict">{
639
664
  &#x27;x&#x27;: [(1, 2)],
640
665
  &#x27;y&#x27;: [&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]
641
- }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key">x</span><span class="tooltip">[0].x</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[(1, 2)]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].x[0]</span></td><td><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div><span class="tooltip">(1, 2)</span></summary><div class="complex_value tuple"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].x[0][0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[0].x[0][1]</span></td><td><span class="simple_value int">2</span></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">y</span><span class="tooltip">[0].y</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[0].y[0]</span></td><td><span class="simple_value str">&#x27;b&#x27;</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[0].y[1]</span></td><td><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div><span class="tooltip">&lt;Foo&gt;&lt;/Foo&gt;</span></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></td></tr></table></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[1]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">2</span><span class="tooltip">[2]</span></td><td><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip">[1, {
666
+ }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">x</span><span class="tooltip key-path">[0].x</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[(1, 2)]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].x[0]</span></td><td><div><details class="pyglove tuple"><summary><div class="summary_title">tuple(...)</div><span class="tooltip tuple">(1, 2)</span></summary><div class="complex_value tuple"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].x[0][0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[0].x[0][1]</span></td><td><div><span class="simple_value int">2</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key str">y</span><span class="tooltip key-path">[0].y</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[&#x27;b&#x27;, &lt;Foo&gt;&lt;/Foo&gt;]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[0].y[0]</span></td><td><div><span class="simple_value str">&#x27;b&#x27;</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[0].y[1]</span></td><td><div><details class="pyglove foo"><summary><div class="summary_title">Foo(...)</div><span class="tooltip foo">&lt;Foo&gt;&lt;/Foo&gt;</span></summary><span class="simple_value foo">&lt;Foo&gt;&lt;/Foo&gt;</span></details></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[1]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">2</span><span class="tooltip key-path">[2]</span></td><td><div><details class="pyglove list"><summary><div class="summary_title">list(...)</div><span class="tooltip list">[1, {
642
667
  &#x27;xx&#x27;: 1,
643
668
  &#x27;yy&#x27;: &#x27;a&#x27;
644
- }]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key">0</span><span class="tooltip">[2][0]</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">1</span><span class="tooltip">[2][1]</span></td><td><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip">{
669
+ }]</span></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span><span class="tooltip key-path">[2][0]</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key int">1</span><span class="tooltip key-path">[2][1]</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div><span class="tooltip dict">{
645
670
  &#x27;xx&#x27;: 1,
646
671
  &#x27;yy&#x27;: &#x27;a&#x27;
647
- }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key">xx</span><span class="tooltip">[2][1].xx</span></td><td><span class="simple_value int">1</span></td></tr><tr><td><span class="object_key">yy</span><span class="tooltip">[2][1].yy</span></td><td><span class="simple_value str">&#x27;a&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div></details>
672
+ }</span></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">xx</span><span class="tooltip key-path">[2][1].xx</span></td><td><div><span class="simple_value int">1</span></div></td></tr><tr><td><span class="object_key str">yy</span><span class="tooltip key-path">[2][1].yy</span></td><td><div><span class="simple_value str">&#x27;a&#x27;</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr></table></div></details>
648
673
  """
649
674
  )
650
675
 
@@ -666,7 +691,7 @@ class ExtensionTest(TestCase):
666
691
  enable_tooltip=True,
667
692
  ),
668
693
  """
669
- <summary><div class="summary_title">Foo(...)</div><span class="tooltip">Foo()</span></summary>
694
+ <summary><div class="summary_title">Foo(...)</div><span class="tooltip foo">Foo()</span></summary>
670
695
  """
671
696
  )
672
697
  self.assert_content(
@@ -678,7 +703,79 @@ class ExtensionTest(TestCase):
678
703
  """
679
704
  )
680
705
 
681
- def test_overrides(self):
706
+ def test_options_overrides(self):
707
+
708
+ class Foo(tree_view.HtmlTreeView.Extension):
709
+
710
+ def __str__(self):
711
+ return 'Foo()'
712
+
713
+ def _html_style(self) -> List[str]:
714
+ return [
715
+ """
716
+ /* Foo style */
717
+ """
718
+ ]
719
+
720
+ def _html_element_class(self) -> List[str]:
721
+ return ['foo', 'bar']
722
+
723
+ def _html_tree_view_special_keys(self) -> Sequence[str]:
724
+ return ['x']
725
+
726
+ def _html_tree_view_include_keys(self) -> Sequence[str]:
727
+ return ['x', 'y', 'z', 'w']
728
+
729
+ def _html_tree_view_exclude_keys(self) -> Sequence[str]:
730
+ return ['z']
731
+
732
+ def _html_tree_view_collapse_level(self) -> int:
733
+ return 1
734
+
735
+ def _html_tree_view_uncollapse(self) -> KeyPathSet:
736
+ return KeyPathSet(['x.a', 'y.b'], include_intermediate=True)
737
+
738
+ def _html_tree_view_content(
739
+ self,
740
+ *,
741
+ view: tree_view.HtmlTreeView,
742
+ parent: Any,
743
+ root_path: KeyPath,
744
+ **kwargs) -> base.Html:
745
+ return view.complex_value(
746
+ kv=dict(
747
+ x=dict(a=dict(foo=2)),
748
+ y=dict(b=dict(bar=3)),
749
+ z=dict(c=dict(baz=4)),
750
+ w=dict(d=dict(qux=5)),
751
+ ),
752
+ parent=self,
753
+ root_path=root_path,
754
+ **kwargs
755
+ )
756
+
757
+ self.assertIn(
758
+ '/* Foo style */',
759
+ self._view.render(
760
+ Foo(),
761
+ enable_summary_tooltip=False,
762
+ enable_key_tooltip=False,
763
+ collapse_level=0,
764
+ ).styles.content,
765
+ )
766
+ self.assert_content(
767
+ self._view.render(
768
+ [Foo()],
769
+ enable_summary_tooltip=False,
770
+ enable_key_tooltip=False,
771
+ collapse_level=0,
772
+ ),
773
+ """
774
+ <details class="pyglove list"><summary><div class="summary_title">list(...)</div></summary><div class="complex_value list"><table><tr><td><span class="object_key int">0</span></td><td><div><details open class="pyglove foo bar"><summary><div class="summary_title">Foo(...)</div></summary><div class="complex_value foo bar"><div class="special_value"><details open class="pyglove dict"><summary><div class="summary_name">x</div><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">a</span></td><td><div><details open class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">foo</span></td><td><div><span class="simple_value int">2</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div><table><tr><td><span class="object_key str">y</span></td><td><div><details open class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">b</span></td><td><div><details open class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">bar</span></td><td><div><span class="simple_value int">3</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr><tr><td><span class="object_key str">w</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">d</span></td><td><div><details class="pyglove dict"><summary><div class="summary_title">dict(...)</div></summary><div class="complex_value dict"><table><tr><td><span class="object_key str">qux</span></td><td><div><span class="simple_value int">5</span></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr></table></div></details></div></td></tr></table></div></details>
775
+ """
776
+ )
777
+
778
+ def test_behavior_overrides(self):
682
779
 
683
780
  class Foo(tree_view.HtmlTreeView.Extension):
684
781
 
@@ -692,7 +789,6 @@ class ExtensionTest(TestCase):
692
789
  return view.summary(
693
790
  self,
694
791
  title='MyFoo',
695
- title_class='t_MyFoo',
696
792
  **kwargs
697
793
  )
698
794
 
@@ -720,7 +816,7 @@ class ExtensionTest(TestCase):
720
816
  Foo(),
721
817
  ),
722
818
  """
723
- <details open class="pyglove foo"><summary><div class="summary_title">MyFoo</div><span class="tooltip">Tooltip <MyFoo></span></summary>Content of MyFoo</details>
819
+ <details open class="pyglove foo"><summary><div class="summary_title">MyFoo</div><span class="tooltip foo">Tooltip <MyFoo></span></summary>Content of MyFoo</details>
724
820
  """
725
821
  )
726
822
  self.assert_content(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202410100808
3
+ Version: 0.4.5.dev202410110808
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors