pyglove 0.5.0.dev202510200810__py3-none-any.whl → 0.5.0.dev202512080812__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.
Potentially problematic release.
This version of pyglove might be problematic. Click here for more details.
- pyglove/core/geno/base.py +7 -3
- pyglove/core/io/file_system.py +452 -2
- pyglove/core/io/file_system_test.py +442 -0
- pyglove/core/symbolic/__init__.py +7 -0
- pyglove/core/symbolic/base.py +89 -35
- pyglove/core/symbolic/base_test.py +3 -3
- pyglove/core/symbolic/dict.py +31 -12
- pyglove/core/symbolic/dict_test.py +49 -0
- pyglove/core/symbolic/list.py +17 -3
- pyglove/core/symbolic/list_test.py +24 -2
- pyglove/core/symbolic/object.py +3 -1
- pyglove/core/symbolic/object_test.py +13 -10
- pyglove/core/symbolic/ref.py +19 -7
- pyglove/core/symbolic/ref_test.py +94 -7
- pyglove/core/symbolic/unknown_symbols.py +147 -0
- pyglove/core/symbolic/unknown_symbols_test.py +100 -0
- pyglove/core/typing/annotation_conversion.py +8 -1
- pyglove/core/typing/annotation_conversion_test.py +14 -19
- pyglove/core/typing/class_schema.py +4 -1
- pyglove/core/typing/type_conversion.py +17 -3
- pyglove/core/typing/type_conversion_test.py +7 -2
- pyglove/core/typing/value_specs.py +5 -1
- pyglove/core/typing/value_specs_test.py +5 -0
- pyglove/core/utils/__init__.py +1 -0
- pyglove/core/utils/json_conversion.py +360 -63
- pyglove/core/utils/json_conversion_test.py +146 -13
- pyglove/core/views/html/controls/tab.py +33 -0
- pyglove/core/views/html/controls/tab_test.py +37 -0
- pyglove/ext/evolution/base_test.py +1 -1
- {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/METADATA +8 -1
- {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/RECORD +34 -32
- {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/WHEEL +0 -0
- {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/licenses/LICENSE +0 -0
- {pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/top_level.txt +0 -0
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import abc
|
|
15
15
|
import typing
|
|
16
16
|
import unittest
|
|
17
|
+
from pyglove.core.symbolic import unknown_symbols
|
|
17
18
|
from pyglove.core.typing import inspect as pg_inspect
|
|
18
19
|
from pyglove.core.utils import json_conversion
|
|
19
20
|
|
|
@@ -156,7 +157,7 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
156
157
|
def __init__(self, x=None):
|
|
157
158
|
self.x = x
|
|
158
159
|
|
|
159
|
-
def to_json(self):
|
|
160
|
+
def to_json(self, **kwargs):
|
|
160
161
|
return T.to_json_dict(dict(x=(self.x, None)), exclude_default=True)
|
|
161
162
|
|
|
162
163
|
def __eq__(self, other):
|
|
@@ -202,7 +203,7 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
202
203
|
def __init__(self, x=None):
|
|
203
204
|
self.x = x
|
|
204
205
|
|
|
205
|
-
def to_json(self):
|
|
206
|
+
def to_json(self, **kwargs):
|
|
206
207
|
return self.to_json_dict(
|
|
207
208
|
dict(x=(self.x, None)), exclude_default=True
|
|
208
209
|
)
|
|
@@ -215,7 +216,6 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
215
216
|
|
|
216
217
|
def test_json_conversion_with_auto_import(self):
|
|
217
218
|
json_dict = json_conversion.to_json(self.CustomJsonConvertible(1))
|
|
218
|
-
|
|
219
219
|
with self.assertRaisesRegex(
|
|
220
220
|
TypeError, 'Type name .* is not registered'):
|
|
221
221
|
json_conversion.from_json(json_dict, auto_import=False)
|
|
@@ -272,7 +272,8 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
272
272
|
self.assert_conversion_is(typing.List[typing.List[int]])
|
|
273
273
|
self.assert_conversion_is(typing.Annotated[int, 'abc'])
|
|
274
274
|
self.assert_conversion_is(typing.Dict[str, typing.Any])
|
|
275
|
-
|
|
275
|
+
# From Python 3.14, union no longer preserves `is` identity.
|
|
276
|
+
self.assert_conversion_equal(typing.Union[int, str])
|
|
276
277
|
self.assert_conversion_is(typing.Sequence[int])
|
|
277
278
|
self.assert_conversion_is(typing.Set[int])
|
|
278
279
|
self.assert_conversion_is(typing.FrozenSet[int])
|
|
@@ -308,6 +309,19 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
308
309
|
self.assertEqual(baz1(1), 2)
|
|
309
310
|
self.assertEqual(baz1(1, 2), 3)
|
|
310
311
|
|
|
312
|
+
with self.assertRaisesRegex(
|
|
313
|
+
TypeError, 'Cannot load function .*'):
|
|
314
|
+
json_conversion.from_json(
|
|
315
|
+
{'_type': 'function', 'name': 'non_existent_function'}
|
|
316
|
+
)
|
|
317
|
+
self.assertEqual(
|
|
318
|
+
json_conversion.from_json(
|
|
319
|
+
{'_type': 'function', 'name': 'non_existent_function'},
|
|
320
|
+
convert_unknown=True
|
|
321
|
+
),
|
|
322
|
+
unknown_symbols.UnknownFunction('non_existent_function')
|
|
323
|
+
)
|
|
324
|
+
|
|
311
325
|
def test_json_conversion_for_methods(self):
|
|
312
326
|
# Test class-level method.
|
|
313
327
|
f = json_conversion.from_json(json_conversion.to_json(X.Y.Z.class_method))
|
|
@@ -320,6 +334,19 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
320
334
|
ValueError, 'Cannot convert instance method .* to JSON.'):
|
|
321
335
|
json_conversion.to_json(X.Y.Z().instance_method)
|
|
322
336
|
|
|
337
|
+
with self.assertRaisesRegex(
|
|
338
|
+
TypeError, 'Cannot load method .*'):
|
|
339
|
+
json_conversion.from_json(
|
|
340
|
+
{'_type': 'method', 'name': 'non_existent_method'}
|
|
341
|
+
)
|
|
342
|
+
self.assertEqual(
|
|
343
|
+
json_conversion.from_json(
|
|
344
|
+
{'_type': 'method', 'name': 'non_existent_method'},
|
|
345
|
+
convert_unknown=True
|
|
346
|
+
),
|
|
347
|
+
unknown_symbols.UnknownMethod('non_existent_method')
|
|
348
|
+
)
|
|
349
|
+
|
|
323
350
|
def test_json_conversion_for_opaque_objects(self):
|
|
324
351
|
self.assert_conversion_equal(X(1))
|
|
325
352
|
|
|
@@ -336,12 +363,15 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
336
363
|
ValueError, 'Cannot decode opaque object with pickle.'):
|
|
337
364
|
json_conversion.from_json(json_dict)
|
|
338
365
|
|
|
339
|
-
def
|
|
340
|
-
# Does not exist.
|
|
366
|
+
def test_json_conversion_convert_unknown(self):
|
|
341
367
|
self.assertEqual(
|
|
342
368
|
json_conversion.from_json([
|
|
343
369
|
'__tuple__',
|
|
344
370
|
1,
|
|
371
|
+
{
|
|
372
|
+
'_type': 'type',
|
|
373
|
+
'name': 'Unknown type',
|
|
374
|
+
},
|
|
345
375
|
{
|
|
346
376
|
'_type': 'Unknown type',
|
|
347
377
|
'x': [{
|
|
@@ -351,13 +381,18 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
351
381
|
'name': 'builtins.print'
|
|
352
382
|
}]
|
|
353
383
|
}
|
|
354
|
-
],
|
|
355
|
-
(
|
|
356
|
-
|
|
357
|
-
'
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
384
|
+
], convert_unknown=True),
|
|
385
|
+
(
|
|
386
|
+
1,
|
|
387
|
+
unknown_symbols.UnknownType('Unknown type'),
|
|
388
|
+
unknown_symbols.UnknownTypedObject(
|
|
389
|
+
type_name='Unknown type',
|
|
390
|
+
x=[
|
|
391
|
+
unknown_symbols.UnknownTypedObject('Unknown type'),
|
|
392
|
+
print
|
|
393
|
+
]
|
|
394
|
+
)
|
|
395
|
+
)
|
|
361
396
|
)
|
|
362
397
|
|
|
363
398
|
def test_json_conversion_with_bad_types(self):
|
|
@@ -384,6 +419,10 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
384
419
|
TypeError, 'Cannot load class .*'):
|
|
385
420
|
json_conversion.from_json({'_type': '__main__.ABC'})
|
|
386
421
|
|
|
422
|
+
with self.assertRaisesRegex(
|
|
423
|
+
TypeError, 'Cannot load type .*'):
|
|
424
|
+
json_conversion.from_json({'_type': 'type', 'name': '__main__.ABC'})
|
|
425
|
+
|
|
387
426
|
# Type exist but not a JSONConvertible subclass.
|
|
388
427
|
class A:
|
|
389
428
|
pass
|
|
@@ -393,6 +432,100 @@ class JSONConvertibleTest(unittest.TestCase):
|
|
|
393
432
|
TypeError, '.* is not a `pg.JSONConvertible` subclass'):
|
|
394
433
|
json_conversion.from_json({'_type': '__main__.A'})
|
|
395
434
|
|
|
435
|
+
def test_json_conversion_with_sharing(self):
|
|
436
|
+
|
|
437
|
+
class T(json_conversion.JSONConvertible):
|
|
438
|
+
|
|
439
|
+
def __init__(self, x=None):
|
|
440
|
+
self.x = x
|
|
441
|
+
|
|
442
|
+
def to_json(self, **kwargs):
|
|
443
|
+
return T.to_json_dict(dict(x=(self.x, None)), exclude_default=True)
|
|
444
|
+
|
|
445
|
+
t = T(1)
|
|
446
|
+
x = X(1)
|
|
447
|
+
u = {'x': x}
|
|
448
|
+
v = [u, t]
|
|
449
|
+
y = dict(t=t, x=x, u=u, v=v)
|
|
450
|
+
y_json = json_conversion.to_json(y)
|
|
451
|
+
x_serialized = json_conversion._OpaqueObject(x).to_json()
|
|
452
|
+
self.assertEqual(
|
|
453
|
+
y_json,
|
|
454
|
+
{
|
|
455
|
+
'__context__': {
|
|
456
|
+
'shared_objects': [
|
|
457
|
+
{
|
|
458
|
+
'_type': json_conversion._type_name(T),
|
|
459
|
+
'x': 1
|
|
460
|
+
},
|
|
461
|
+
x_serialized,
|
|
462
|
+
{
|
|
463
|
+
'x': {
|
|
464
|
+
'__ref__': 1
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
]
|
|
468
|
+
},
|
|
469
|
+
'__root__': {
|
|
470
|
+
't': {
|
|
471
|
+
'__ref__': 0
|
|
472
|
+
},
|
|
473
|
+
'x': {
|
|
474
|
+
'__ref__': 1
|
|
475
|
+
},
|
|
476
|
+
'u': {
|
|
477
|
+
'__ref__': 2
|
|
478
|
+
},
|
|
479
|
+
'v': [
|
|
480
|
+
{
|
|
481
|
+
'__ref__': 2
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
'__ref__': 0
|
|
485
|
+
}
|
|
486
|
+
]
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
)
|
|
490
|
+
y_prime = json_conversion.from_json(y_json)
|
|
491
|
+
self.assertIs(y_prime['t'], y_prime['v'][1])
|
|
492
|
+
self.assertIs(y_prime['u'], y_prime['v'][0])
|
|
493
|
+
|
|
494
|
+
def test_json_conversion_with_sharing_convert_unknown(self):
|
|
495
|
+
self.assertEqual(
|
|
496
|
+
json_conversion.from_json(
|
|
497
|
+
{
|
|
498
|
+
'__context__': {
|
|
499
|
+
'shared_objects': [
|
|
500
|
+
{
|
|
501
|
+
'_type': 'type',
|
|
502
|
+
'name': '__main__.ABC',
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
'_type': '__main__.ABC',
|
|
506
|
+
'x': 1
|
|
507
|
+
}
|
|
508
|
+
]
|
|
509
|
+
},
|
|
510
|
+
'__root__': [
|
|
511
|
+
{
|
|
512
|
+
'__ref__': 0
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
'__ref__': 1
|
|
516
|
+
},
|
|
517
|
+
]
|
|
518
|
+
},
|
|
519
|
+
convert_unknown=True
|
|
520
|
+
),
|
|
521
|
+
[
|
|
522
|
+
unknown_symbols.UnknownType('__main__.ABC'),
|
|
523
|
+
unknown_symbols.UnknownTypedObject(
|
|
524
|
+
type_name='__main__.ABC',
|
|
525
|
+
x=1
|
|
526
|
+
)
|
|
527
|
+
]
|
|
528
|
+
)
|
|
396
529
|
|
|
397
530
|
if __name__ == '__main__':
|
|
398
531
|
unittest.main()
|
|
@@ -158,6 +158,39 @@ class TabControl(HtmlControl):
|
|
|
158
158
|
position='beforebegin',
|
|
159
159
|
)
|
|
160
160
|
|
|
161
|
+
def remove(self, index_or_name: Union[int, str]) -> Tab:
|
|
162
|
+
"""Removes a tab identified by index or name."""
|
|
163
|
+
index = self.indexof(index_or_name)
|
|
164
|
+
if index == -1:
|
|
165
|
+
raise ValueError(f'Tab not found: {index_or_name!r}')
|
|
166
|
+
|
|
167
|
+
with pg_flags.notify_on_change(False):
|
|
168
|
+
tab = self.tabs.pop(index)
|
|
169
|
+
|
|
170
|
+
self._run_javascript(
|
|
171
|
+
f"""
|
|
172
|
+
const button = document.querySelectorAll('#{self.element_id()}-button-group > .tab-button')[{index}];
|
|
173
|
+
if (button) {{
|
|
174
|
+
button.remove();
|
|
175
|
+
}}
|
|
176
|
+
const content = document.querySelectorAll('#{self.element_id()}-content-group > .tab-content')[{index}];
|
|
177
|
+
if (content) {{
|
|
178
|
+
content.remove();
|
|
179
|
+
}}
|
|
180
|
+
"""
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
if not self.tabs:
|
|
184
|
+
self._sync_members(selected=0)
|
|
185
|
+
return tab
|
|
186
|
+
|
|
187
|
+
if self.selected == index:
|
|
188
|
+
new_selected = index - 1 if index == len(self.tabs) else index
|
|
189
|
+
self.select(max(0, new_selected))
|
|
190
|
+
elif self.selected > index:
|
|
191
|
+
self._sync_members(selected=self.selected - 1)
|
|
192
|
+
return tab
|
|
193
|
+
|
|
161
194
|
def indexof(self, index_or_name: Union[int, str]) -> int:
|
|
162
195
|
if isinstance(index_or_name, int):
|
|
163
196
|
index = index_or_name
|
|
@@ -154,6 +154,43 @@ class TabControlTest(unittest.TestCase):
|
|
|
154
154
|
self.assertEqual(len(scripts), 1)
|
|
155
155
|
self.assertEqual(tab.selected, 1)
|
|
156
156
|
|
|
157
|
+
def test_remove(self):
|
|
158
|
+
tabs = [tab_lib.Tab(l, l, name=l) for l in ['a', 'b', 'c', 'd']]
|
|
159
|
+
tc = tab_lib.TabControl(tabs, selected='c')
|
|
160
|
+
self.assertEqual([t.name for t in tc.tabs], ['a', 'b', 'c', 'd'])
|
|
161
|
+
self.assertEqual(tc.selected, 2)
|
|
162
|
+
|
|
163
|
+
# Trigger rendering so scripts are tracked.
|
|
164
|
+
_ = tc.to_html()
|
|
165
|
+
with tc.track_scripts() as scripts:
|
|
166
|
+
tc.remove('b')
|
|
167
|
+
self.assertEqual(len(scripts), 1)
|
|
168
|
+
self.assertEqual([t.name for t in tc.tabs], ['a', 'c', 'd'])
|
|
169
|
+
self.assertEqual(tc.selected, 1)
|
|
170
|
+
|
|
171
|
+
with tc.track_scripts() as scripts:
|
|
172
|
+
# Remove currently selected tab 'c'
|
|
173
|
+
tc.remove('c')
|
|
174
|
+
# 1 script for remove, 1 for select.
|
|
175
|
+
self.assertEqual(len(scripts), 2)
|
|
176
|
+
self.assertEqual([t.name for t in tc.tabs], ['a', 'd'])
|
|
177
|
+
self.assertEqual(tc.selected, 1)
|
|
178
|
+
|
|
179
|
+
with tc.track_scripts() as scripts:
|
|
180
|
+
tc.remove(1)
|
|
181
|
+
self.assertEqual(len(scripts), 2)
|
|
182
|
+
self.assertEqual([t.name for t in tc.tabs], ['a'])
|
|
183
|
+
self.assertEqual(tc.selected, 0)
|
|
184
|
+
|
|
185
|
+
with tc.track_scripts() as scripts:
|
|
186
|
+
tc.remove('a')
|
|
187
|
+
self.assertEqual(len(scripts), 1)
|
|
188
|
+
self.assertEqual(tc.tabs, [])
|
|
189
|
+
self.assertEqual(tc.selected, 0)
|
|
190
|
+
|
|
191
|
+
with self.assertRaisesRegex(ValueError, 'Tab not found'):
|
|
192
|
+
tc.remove('x')
|
|
193
|
+
|
|
157
194
|
|
|
158
195
|
if __name__ == '__main__':
|
|
159
196
|
unittest.main()
|
{pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyglove
|
|
3
|
-
Version: 0.5.0.
|
|
3
|
+
Version: 0.5.0.dev202512080812
|
|
4
4
|
Summary: PyGlove: A library for manipulating Python objects.
|
|
5
5
|
Home-page: https://github.com/google/pyglove
|
|
6
6
|
Author: PyGlove Authors
|
|
@@ -23,6 +23,12 @@ Description-Content-Type: text/markdown
|
|
|
23
23
|
License-File: LICENSE
|
|
24
24
|
Requires-Dist: docstring-parser>=0.12
|
|
25
25
|
Requires-Dist: termcolor>=1.1.0
|
|
26
|
+
Provides-Extra: all
|
|
27
|
+
Requires-Dist: docstring-parser>=0.12; extra == "all"
|
|
28
|
+
Requires-Dist: termcolor>=1.1.0; extra == "all"
|
|
29
|
+
Requires-Dist: fsspec>=2023.3.0; extra == "all"
|
|
30
|
+
Provides-Extra: io
|
|
31
|
+
Requires-Dist: fsspec>=2023.3.0; extra == "io"
|
|
26
32
|
Dynamic: author
|
|
27
33
|
Dynamic: author-email
|
|
28
34
|
Dynamic: classifier
|
|
@@ -32,6 +38,7 @@ Dynamic: home-page
|
|
|
32
38
|
Dynamic: keywords
|
|
33
39
|
Dynamic: license
|
|
34
40
|
Dynamic: license-file
|
|
41
|
+
Dynamic: provides-extra
|
|
35
42
|
Dynamic: requires-dist
|
|
36
43
|
Dynamic: summary
|
|
37
44
|
|
|
@@ -19,7 +19,7 @@ pyglove/core/detouring/__init__.py,sha256=ck_n2VSuU31HNVYQkbG4Zvnx90mNYtSVc2StN3
|
|
|
19
19
|
pyglove/core/detouring/class_detour.py,sha256=ejuUr7UfRU3l9PrDxD0dpKmt2iqdDU6liHdebA1jEfQ,13312
|
|
20
20
|
pyglove/core/detouring/class_detour_test.py,sha256=9aAK6qPiT0_HJe5oUpqMVTpoHv0wr_h6c4gWYKMTJoM,5507
|
|
21
21
|
pyglove/core/geno/__init__.py,sha256=cWA583n7JpsGUkGtoTlMMX83tNS7geRBKFsoPEvFZ4A,4767
|
|
22
|
-
pyglove/core/geno/base.py,sha256=
|
|
22
|
+
pyglove/core/geno/base.py,sha256=fZaTmmCJaiIm2ACU8EgEUHQLr9iF0f6yBNdYWIwYKWg,64639
|
|
23
23
|
pyglove/core/geno/base_test.py,sha256=f0pMpfXsjAqFOBtlOxof3jRX0jLvXpzowk9szcr6bgY,38512
|
|
24
24
|
pyglove/core/geno/categorical.py,sha256=t1bS129D5iF4CZ0yVHaFDXy2T6ujv5F5HHDc_0X36z8,28015
|
|
25
25
|
pyglove/core/geno/categorical_test.py,sha256=23UkOPhDSvonxxM_1YoBYp723Xim-BmBzywl612CRyg,18444
|
|
@@ -56,8 +56,8 @@ pyglove/core/hyper/numerical_test.py,sha256=UWdH55Bok7bghYDLJOGsgOwV_2LNkhj1AmFw
|
|
|
56
56
|
pyglove/core/hyper/object_template.py,sha256=YPALTV0mMULa7iuqnryTpA2wMsdyFZ_6g-R525asAr8,22222
|
|
57
57
|
pyglove/core/hyper/object_template_test.py,sha256=TEFX7LIqUvdCdJILnK_gP5xIgNJKzRnioUF0CGVBzcY,9105
|
|
58
58
|
pyglove/core/io/__init__.py,sha256=4ZT1a595DqQuLTNYc2JP_eCp_KesXvHmKRkr777bzpg,785
|
|
59
|
-
pyglove/core/io/file_system.py,sha256=
|
|
60
|
-
pyglove/core/io/file_system_test.py,sha256=
|
|
59
|
+
pyglove/core/io/file_system.py,sha256=cggBMIzQxQpTjPsYQPQj8IsO-UpunsEGxaclYQcUHjw,28093
|
|
60
|
+
pyglove/core/io/file_system_test.py,sha256=2c2l3HCNS8Q4mv8k1dqopnGpeVLiWSzmc8eDIx4b5oo,24561
|
|
61
61
|
pyglove/core/io/sequence.py,sha256=XdVpPBuvhUnrTIWMUrak_qdcNdUJBpjgH5c1b5I3E2A,8873
|
|
62
62
|
pyglove/core/io/sequence_test.py,sha256=mnONyNG1M1sCae2tyI-tF8qns96htfZPKycthETPthU,4062
|
|
63
63
|
pyglove/core/patching/__init__.py,sha256=C1Q1cWPV74YL3eXbzGvc-8aPw1DR8EK6lRhQYDCwHek,2059
|
|
@@ -67,9 +67,9 @@ pyglove/core/patching/pattern_based.py,sha256=UtSNB-ARNqVjXwZovjVi84QEoXUGLLBTgL
|
|
|
67
67
|
pyglove/core/patching/pattern_based_test.py,sha256=PW1EcVfsFPB6wtgwg3s4dzvigWn3b5S8eMNGo0SJiZ0,2771
|
|
68
68
|
pyglove/core/patching/rule_based.py,sha256=JAQp8mWeIOxwIdqusA3GmXia-fxQhQsxbUTmE329wF8,17038
|
|
69
69
|
pyglove/core/patching/rule_based_test.py,sha256=qfy0ILmczV_LMHWEnwo2y079OrJsGYO0nKxSZdmIUcI,18782
|
|
70
|
-
pyglove/core/symbolic/__init__.py,sha256=
|
|
71
|
-
pyglove/core/symbolic/base.py,sha256=
|
|
72
|
-
pyglove/core/symbolic/base_test.py,sha256=
|
|
70
|
+
pyglove/core/symbolic/__init__.py,sha256=ifUnJyF_hNFyrNAqlN7ClKWUvZouIA38GrYctnMc-F4,6402
|
|
71
|
+
pyglove/core/symbolic/base.py,sha256=QMAMFuqH_FjwJUSlUZKTBnxDpiVkM9Z8j611u6FWAcg,79816
|
|
72
|
+
pyglove/core/symbolic/base_test.py,sha256=OHEexXI7uE2bixT-trfR3j-dfiAJsbY7pFyAA6XEPqA,7338
|
|
73
73
|
pyglove/core/symbolic/boilerplate.py,sha256=sQ3G25r5bo_UmIdjreL4jkAuQCXIHVlvUfGjjkNod6Y,5955
|
|
74
74
|
pyglove/core/symbolic/boilerplate_test.py,sha256=1CZ1W6kq3l-3tpaknhGFa04V18bO7vPzis5qzWnxHEs,5252
|
|
75
75
|
pyglove/core/symbolic/class_wrapper.py,sha256=xQiMh5vFlOQ76tbqsF5UWEghvU4d9UmvbNqIyBccNHg,22869
|
|
@@ -78,8 +78,8 @@ pyglove/core/symbolic/compounding.py,sha256=gvOodZ2gWHA0jNdwt8yvnRsPkHQDXDb5s88U
|
|
|
78
78
|
pyglove/core/symbolic/compounding_test.py,sha256=hOzrIROvajUTtPm0SUbEsEV4C1bXanhAoHinHrjZoXw,8320
|
|
79
79
|
pyglove/core/symbolic/contextual_object.py,sha256=ar9Q_0P0HHbDf8kLHpS8GFZEMCRuCCB6DP18iGItiiw,9146
|
|
80
80
|
pyglove/core/symbolic/contextual_object_test.py,sha256=wA5xfIhEHOC9qE3bbiA59CAPxWs9AVPaNiKEoprkWpQ,10209
|
|
81
|
-
pyglove/core/symbolic/dict.py,sha256=
|
|
82
|
-
pyglove/core/symbolic/dict_test.py,sha256=
|
|
81
|
+
pyglove/core/symbolic/dict.py,sha256=ELM-5XSxChNZNTaDxRDm_rCpMkuJ2nBASMOMxVjB07g,37657
|
|
82
|
+
pyglove/core/symbolic/dict_test.py,sha256=XPOe5DV_opYMkzSJZEl7rTvBBN-H9NvKe8zC7tQf7EE,74429
|
|
83
83
|
pyglove/core/symbolic/diff.py,sha256=zHfED0Bbq8G_HWNPj3vrOCWzt_062rFhx3BMlpCb9oo,16282
|
|
84
84
|
pyglove/core/symbolic/diff_test.py,sha256=EDiGHqqKhi-NeMxr-bgjBEqlquee_4l_0IM6hgAb9Mg,29400
|
|
85
85
|
pyglove/core/symbolic/error_info.py,sha256=rqRwfmnEibMixaS2G-P0VhKjkZl79qjO6EUItnATHlQ,3675
|
|
@@ -90,17 +90,19 @@ pyglove/core/symbolic/functor.py,sha256=AwE9GX2cO3QNihac1_ZN0sdG-TrWAJ5lXO2ZQ5Gs
|
|
|
90
90
|
pyglove/core/symbolic/functor_test.py,sha256=9c5_7OBKNVNbYC7IaVQB6c5ks2v00qQ36oivyWiBbKA,31798
|
|
91
91
|
pyglove/core/symbolic/inferred.py,sha256=E4zgphg6NNZad9Fl3jdHQOMZeqEp9XHq5OUYqXEmwZQ,3178
|
|
92
92
|
pyglove/core/symbolic/inferred_test.py,sha256=G6uPykONcChvs6vZujXHSWaYfjewLTVBscMqzzKNty0,1270
|
|
93
|
-
pyglove/core/symbolic/list.py,sha256=
|
|
94
|
-
pyglove/core/symbolic/list_test.py,sha256=
|
|
95
|
-
pyglove/core/symbolic/object.py,sha256=
|
|
96
|
-
pyglove/core/symbolic/object_test.py,sha256=
|
|
93
|
+
pyglove/core/symbolic/list.py,sha256=CRDoBxYJsmNly1MxhY5vO0wp6EUTnxze6-2O9vXHna4,30717
|
|
94
|
+
pyglove/core/symbolic/list_test.py,sha256=sH3wuJB6SqXVefJEPmzGVfoXc-ZiJ1ZTV4-O88LFuaM,61943
|
|
95
|
+
pyglove/core/symbolic/object.py,sha256=g6omG6r6B5TQaHSgoOWCEL_2OY_DcutxOTe1R1M1uFo,42822
|
|
96
|
+
pyglove/core/symbolic/object_test.py,sha256=mB8Aw1foE3XWdRX1LVn9C9U5XJeR7iqZYHrv4y94STE,94514
|
|
97
97
|
pyglove/core/symbolic/origin.py,sha256=OSWMKjvPcISOXrzuX3lCQC8m_qaGl-9INsIB81erUnU,6124
|
|
98
98
|
pyglove/core/symbolic/origin_test.py,sha256=dU_ZGrGDetM_lYVMn3wQO0d367_t_t8eESe3NrKPBNE,3159
|
|
99
99
|
pyglove/core/symbolic/pure_symbolic.py,sha256=pvo15gn35_KLiGW_XrTjlx5ddmHbwpLr93VgbQ59uQ8,3231
|
|
100
|
-
pyglove/core/symbolic/ref.py,sha256=
|
|
101
|
-
pyglove/core/symbolic/ref_test.py,sha256
|
|
100
|
+
pyglove/core/symbolic/ref.py,sha256=gIu02b8BfKspH1XejXhEFh_Iil3jvfGHdpaCRq6qor0,8817
|
|
101
|
+
pyglove/core/symbolic/ref_test.py,sha256=-rCA1AaLZnyuKOh0cJzS5UaQ_9Kp4p7xexZ_e3IwpOg,8974
|
|
102
102
|
pyglove/core/symbolic/symbolize.py,sha256=ohID9-V8QiFe7OMpPlRomiqUnKBVMpypd8ZuMuHaa4s,6582
|
|
103
103
|
pyglove/core/symbolic/symbolize_test.py,sha256=o7bRfMhGc6uw2FIH8arE99-bPb3i0YixcHYyiP-QqeQ,6487
|
|
104
|
+
pyglove/core/symbolic/unknown_symbols.py,sha256=-BuT1izzGZDjuz_OSPDz9UAd1ialpxK8ceTZtIdni1Y,4323
|
|
105
|
+
pyglove/core/symbolic/unknown_symbols_test.py,sha256=0bjZ4cYjDdTCHwQ5GHe-D7VVDfJez7iG0v6Z0ksEDTU,3069
|
|
104
106
|
pyglove/core/tuning/__init__.py,sha256=JtXpjsBto01fLf55hZ1dSx-CEZUyVQeyRP9AMH_hw8c,2229
|
|
105
107
|
pyglove/core/tuning/backend.py,sha256=GwbBI9nHYYe5h6iDuhqRtD-Msjmmc7wFtagxW0rTypU,5597
|
|
106
108
|
pyglove/core/tuning/backend_test.py,sha256=vyfUi509-hbF5uYk-I0FsoniPFBXmobQVl-4d0YPIWY,1999
|
|
@@ -113,14 +115,14 @@ pyglove/core/tuning/sample_test.py,sha256=JqwDPy3EPC_VjU9dipk90jj1kovZB3Zb9hAjAl
|
|
|
113
115
|
pyglove/core/typing/__init__.py,sha256=u2YSrSi8diTkQn8_1J2hEpk5o7zDhx2tU_oRuS-k1XU,14580
|
|
114
116
|
pyglove/core/typing/annotated.py,sha256=llaajIDj9GK-4kUGJoO4JsHU6ESPOra2SZ-jG6xmsOQ,3203
|
|
115
117
|
pyglove/core/typing/annotated_test.py,sha256=p1qid3R-jeiOTTxOVq6hXW8XFvn-h1cUzJWISPst2l8,2484
|
|
116
|
-
pyglove/core/typing/annotation_conversion.py,sha256=
|
|
117
|
-
pyglove/core/typing/annotation_conversion_test.py,sha256=
|
|
118
|
+
pyglove/core/typing/annotation_conversion.py,sha256=pnm6dZbn_nsTCreyarspkwpsdteMb8uFT2TLtblq_0M,15780
|
|
119
|
+
pyglove/core/typing/annotation_conversion_test.py,sha256=N49ZuzsmaqVi23wszDpfwcJApr2-Pk2E_ELrjssSQb0,17598
|
|
118
120
|
pyglove/core/typing/annotation_future_test.py,sha256=tAVuzWNfW8R4e4l7fx88Q4nJDM2LPUogNKNAIIPAEWQ,3959
|
|
119
121
|
pyglove/core/typing/callable_ext.py,sha256=PiBQWPeUAH7Lgmf2xKCZqgK7N0OSrTdbnEkV8Ph31OA,9127
|
|
120
122
|
pyglove/core/typing/callable_ext_test.py,sha256=TnWKU4_ZjvpbHZFtFHgFvCMDiCos8VmLlODcM_7Xg8M,10156
|
|
121
123
|
pyglove/core/typing/callable_signature.py,sha256=DRpt7aShfkn8pb3SCiZzS_27eHbkQ_d2UB8BUhJjs0Q,27176
|
|
122
124
|
pyglove/core/typing/callable_signature_test.py,sha256=iQmHsKPhJPQlMikDhEyxKyq7yWyXI9juKCLYgKhrH3U,25145
|
|
123
|
-
pyglove/core/typing/class_schema.py,sha256=
|
|
125
|
+
pyglove/core/typing/class_schema.py,sha256=lbY5yAC8p5rBuvJ8qMBwqbJmqTlC5bunN4yU4T9rhMg,56037
|
|
124
126
|
pyglove/core/typing/class_schema_test.py,sha256=sJkE7ndDSIKb0EUcjZiVFOeJYDI7Hdu2GdPJCMgZxrI,29556
|
|
125
127
|
pyglove/core/typing/custom_typing.py,sha256=qdnIKHWNt5kZAAFdpQXra8bBu6RljMbbJ_YDG2mhAUA,2205
|
|
126
128
|
pyglove/core/typing/inspect.py,sha256=VLSz1KAunNm2hx0eEMjiwxKLl9FHlKr9nHelLT25iEA,7726
|
|
@@ -130,13 +132,13 @@ pyglove/core/typing/json_schema_test.py,sha256=ZxMO2xgKiELNDzoQ84cmXsyCtFA0Ltn1I
|
|
|
130
132
|
pyglove/core/typing/key_specs.py,sha256=-7xjCuUGoQgD0sMafsRFNlw3S4f1r-7t5OO4ev5bbeI,9225
|
|
131
133
|
pyglove/core/typing/key_specs_test.py,sha256=5zornpyHMAYoRaG8KDXHiQ3obu9UfRp3399lBeUNTPk,6499
|
|
132
134
|
pyglove/core/typing/pytype_support.py,sha256=lyX11WVbCwoOi5tTQ90pEOS-yvo_6iEi7Lxbp-nXu2A,2069
|
|
133
|
-
pyglove/core/typing/type_conversion.py,sha256=
|
|
134
|
-
pyglove/core/typing/type_conversion_test.py,sha256=
|
|
135
|
+
pyglove/core/typing/type_conversion.py,sha256=S_57FU-9DOk-MTE-1Mh31FMshaA3IoKiSDsoKxGxGv4,5432
|
|
136
|
+
pyglove/core/typing/type_conversion_test.py,sha256=rK0lAjLi1azKY4ZltquIsCpKh20EtYSIekArnqI6ThQ,5475
|
|
135
137
|
pyglove/core/typing/typed_missing.py,sha256=-l1omAu0jBZv5BnsFYXBqfvQwVBnmPh_X1wcIKD9bOk,2734
|
|
136
138
|
pyglove/core/typing/typed_missing_test.py,sha256=TCNsb1SRpFaVdxYn2mB_yaLuja8w5Qn5NP7uGiZVBWs,2301
|
|
137
|
-
pyglove/core/typing/value_specs.py,sha256=
|
|
138
|
-
pyglove/core/typing/value_specs_test.py,sha256=
|
|
139
|
-
pyglove/core/utils/__init__.py,sha256=
|
|
139
|
+
pyglove/core/typing/value_specs.py,sha256=oaLjvJ61Gv7myn93krzG3kfdw0n9va3sxmyDjy0xRFY,103368
|
|
140
|
+
pyglove/core/typing/value_specs_test.py,sha256=Mi0Esw-0E_1JSjoEQcjkefkcaS0-omIBzlWVTRYv1F8,131170
|
|
141
|
+
pyglove/core/utils/__init__.py,sha256=6P2VcGkjDsOFG640Jqu-jd1K3pfAK5NkcK3NBPLI6RY,8726
|
|
140
142
|
pyglove/core/utils/common_traits.py,sha256=PWxOgPhG5H60ZwfO8xNAEGRjFUqqDZQBWQYomOfvdy8,3640
|
|
141
143
|
pyglove/core/utils/common_traits_test.py,sha256=DIuZB_1xfmeTVfWnGOguDQcDAM_iGgBOe8C-5CsIqBc,1122
|
|
142
144
|
pyglove/core/utils/contextual.py,sha256=_EO_ubCcmI81QyYyyucm3QcH1asQWSeXvT2Xa4KONs8,5355
|
|
@@ -149,8 +151,8 @@ pyglove/core/utils/formatting.py,sha256=Wn4d933LQLhuMIfjdRJgpxOThCxBxQrkRBa6Z1-h
|
|
|
149
151
|
pyglove/core/utils/formatting_test.py,sha256=hhg-nL6DyE5A2QA92ALHK5QtfAYKfPpTbBARF-IT1j0,14241
|
|
150
152
|
pyglove/core/utils/hierarchical.py,sha256=jwB-0FhqOspAymAkvJphRhPTQEsoShmKupCZpU3Vip4,19690
|
|
151
153
|
pyglove/core/utils/hierarchical_test.py,sha256=f382DMJPa_bavJGGQDjuw-hWcafUg5bkQCPX-nbzeiI,21077
|
|
152
|
-
pyglove/core/utils/json_conversion.py,sha256=
|
|
153
|
-
pyglove/core/utils/json_conversion_test.py,sha256=
|
|
154
|
+
pyglove/core/utils/json_conversion.py,sha256=PWV51Dm7J-ovakhqXJux_zBAFqvjHKb9RObER8phDvw,37165
|
|
155
|
+
pyglove/core/utils/json_conversion_test.py,sha256=w4k6qgXGEnNXrfryTQppxtF3GJ9rdEHjvjznXSIOMcg,15809
|
|
154
156
|
pyglove/core/utils/missing.py,sha256=9gslt1lXd1qSEIuAFxUWu30oD-YdYcnm13eau1S9uqY,1445
|
|
155
157
|
pyglove/core/utils/missing_test.py,sha256=D6-FuVEwCyJemUiPLcwLmwyptqI5Bx0Pfipc2juhKSE,1335
|
|
156
158
|
pyglove/core/utils/text_color.py,sha256=xcCTCxY2qFNZs_jismMGus8scEXKBpYGAhpAgnz-MHk,4112
|
|
@@ -175,8 +177,8 @@ pyglove/core/views/html/controls/label.py,sha256=2u7z_6o-ANf6EbxufFl_fZ1VFSUrjNw
|
|
|
175
177
|
pyglove/core/views/html/controls/label_test.py,sha256=_Fi6vMITup8iFYTiU_1w7FZCXaYp1eMmVBxub8JMYbs,5170
|
|
176
178
|
pyglove/core/views/html/controls/progress_bar.py,sha256=0an0eCbPCDjwrR58C16NwLZ-cf3Oy0wQerLsiNgGHmk,5235
|
|
177
179
|
pyglove/core/views/html/controls/progress_bar_test.py,sha256=kKOJDZQtBPkmNcgIBrRQkNNzcTm51ojuFBTRUEDSsp0,3506
|
|
178
|
-
pyglove/core/views/html/controls/tab.py,sha256=
|
|
179
|
-
pyglove/core/views/html/controls/tab_test.py,sha256=
|
|
180
|
+
pyglove/core/views/html/controls/tab.py,sha256=f3ZfYyXfMmERGOXY4a4bxmOhomL3MQONMossaxw8hQw,11851
|
|
181
|
+
pyglove/core/views/html/controls/tab_test.py,sha256=V0HrY0YaGyVlOykMCFg85QSxOq8eBPa3Fqcv2q1c12s,6912
|
|
180
182
|
pyglove/core/views/html/controls/tooltip.py,sha256=01BbpuM1twf3FYMUT09_Ck5JSSONe8QE9RmyA9nhCnU,3092
|
|
181
183
|
pyglove/core/views/html/controls/tooltip_test.py,sha256=17BY-WmZKpz9tCbySPcwG6KJyfeE_MeMyKxtfxorBQ0,3194
|
|
182
184
|
pyglove/ext/__init__.py,sha256=3jp8cJvKW6PENOZlmVAbT0w-GBRn_kjhc0wDX3XjpOE,755
|
|
@@ -187,7 +189,7 @@ pyglove/ext/early_stopping/step_wise.py,sha256=P99Z2hODmCNBnR3iVOOj2NCCwveSH6h5V
|
|
|
187
189
|
pyglove/ext/early_stopping/step_wise_test.py,sha256=I9DDMrCpDwIWC6mV9w2pDypnrwYnWjg6QXTFNT13cts,9032
|
|
188
190
|
pyglove/ext/evolution/__init__.py,sha256=lAf4NyxUZRt39kMFFoW_i8-ExigJXakG1-sUREW7jkQ,3214
|
|
189
191
|
pyglove/ext/evolution/base.py,sha256=I27qJja6MErMs3SyrlBYvmDQ4eTq9dY9RVpscKlwReQ,50090
|
|
190
|
-
pyglove/ext/evolution/base_test.py,sha256=
|
|
192
|
+
pyglove/ext/evolution/base_test.py,sha256=HgWSGGHh7nd03IFLln3dKV4TsI1kK4idJd4azAGaxHw,29943
|
|
191
193
|
pyglove/ext/evolution/hill_climb.py,sha256=Bysi2u4KEM7d9CIPcnvKKgEQHttkaKFkI8xlrNOkBB8,1688
|
|
192
194
|
pyglove/ext/evolution/hill_climb_test.py,sha256=7snzopGFRgkryNXiDVcHMhtVz6LXLZCOH_tz_t15b4I,3110
|
|
193
195
|
pyglove/ext/evolution/mutators.py,sha256=ZkNmIf9B2KRP3H7UfML7nkjUYPPgOkm5Fe1kaJQ8W5I,10062
|
|
@@ -218,8 +220,8 @@ pyglove/ext/scalars/randoms.py,sha256=LkMIIx7lOq_lvJvVS3BrgWGuWl7Pi91-lA-O8x_gZs
|
|
|
218
220
|
pyglove/ext/scalars/randoms_test.py,sha256=nEhiqarg8l_5EOucp59CYrpO2uKxS1pe0hmBdZUzRNM,2000
|
|
219
221
|
pyglove/ext/scalars/step_wise.py,sha256=IDw3tuTpv0KVh7AN44W43zqm1-E0HWPUlytWOQC9w3Y,3789
|
|
220
222
|
pyglove/ext/scalars/step_wise_test.py,sha256=TL1vJ19xVx2t5HKuyIzGoogF7N3Rm8YhLE6JF7i0iy8,2540
|
|
221
|
-
pyglove-0.5.0.
|
|
222
|
-
pyglove-0.5.0.
|
|
223
|
-
pyglove-0.5.0.
|
|
224
|
-
pyglove-0.5.0.
|
|
225
|
-
pyglove-0.5.0.
|
|
223
|
+
pyglove-0.5.0.dev202512080812.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
224
|
+
pyglove-0.5.0.dev202512080812.dist-info/METADATA,sha256=E7UuKxo0wIhPc7Z3L0cRpVKXxj9eY_qfcbr0fjPfym8,7349
|
|
225
|
+
pyglove-0.5.0.dev202512080812.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
226
|
+
pyglove-0.5.0.dev202512080812.dist-info/top_level.txt,sha256=wITzJSKcj8GZUkbq-MvUQnFadkiuAv_qv5qQMw0fIow,8
|
|
227
|
+
pyglove-0.5.0.dev202512080812.dist-info/RECORD,,
|
|
File without changes
|
{pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{pyglove-0.5.0.dev202510200810.dist-info → pyglove-0.5.0.dev202512080812.dist-info}/top_level.txt
RENAMED
|
File without changes
|