pyglove 0.5.0.dev202508140811__tar.gz → 0.5.0.dev202511030811__tar.gz

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.

Files changed (231) hide show
  1. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/PKG-INFO +1 -1
  2. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/__init__.py +8 -1
  3. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/base.py +7 -3
  4. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/logging.py +45 -1
  5. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/logging_test.py +12 -21
  6. pyglove-0.5.0.dev202511030811/pyglove/core/monitoring.py +657 -0
  7. pyglove-0.5.0.dev202511030811/pyglove/core/monitoring_test.py +289 -0
  8. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/base.py +70 -31
  9. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/base_test.py +3 -3
  10. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/dict.py +31 -12
  11. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/dict_test.py +49 -0
  12. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/list.py +17 -3
  13. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/list_test.py +24 -2
  14. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/object.py +1 -0
  15. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/ref.py +19 -7
  16. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/ref_test.py +94 -7
  17. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/annotation_conversion.py +8 -1
  18. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/annotation_conversion_test.py +14 -19
  19. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/class_schema.py +24 -1
  20. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/json_schema.py +221 -8
  21. pyglove-0.5.0.dev202511030811/pyglove/core/typing/json_schema_test.py +973 -0
  22. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/type_conversion.py +17 -3
  23. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/type_conversion_test.py +1 -1
  24. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/__init__.py +2 -0
  25. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/contextual.py +9 -4
  26. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/contextual_test.py +10 -0
  27. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/error_utils.py +59 -25
  28. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/json_conversion.py +255 -16
  29. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/json_conversion_test.py +63 -4
  30. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/tab.py +33 -0
  31. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/tab_test.py +37 -0
  32. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/base_test.py +1 -1
  33. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove.egg-info/PKG-INFO +1 -1
  34. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove.egg-info/SOURCES.txt +2 -0
  35. pyglove-0.5.0.dev202508140811/pyglove/core/typing/json_schema_test.py +0 -477
  36. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/LICENSE +0 -0
  37. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/README.md +0 -0
  38. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/__init__.py +0 -0
  39. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/__init__.py +0 -0
  40. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/errors.py +0 -0
  41. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/errors_test.py +0 -0
  42. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/execution.py +0 -0
  43. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/execution_test.py +0 -0
  44. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/function_generation.py +0 -0
  45. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/function_generation_test.py +0 -0
  46. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/parsing.py +0 -0
  47. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/parsing_test.py +0 -0
  48. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/permissions.py +0 -0
  49. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/coding/permissions_test.py +0 -0
  50. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/detouring/__init__.py +0 -0
  51. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/detouring/class_detour.py +0 -0
  52. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/detouring/class_detour_test.py +0 -0
  53. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/__init__.py +0 -0
  54. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/base_test.py +0 -0
  55. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/categorical.py +0 -0
  56. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/categorical_test.py +0 -0
  57. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/custom.py +0 -0
  58. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/custom_test.py +0 -0
  59. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/deduping.py +0 -0
  60. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/deduping_test.py +0 -0
  61. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/dna_generator.py +0 -0
  62. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/dna_generator_test.py +0 -0
  63. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/numerical.py +0 -0
  64. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/numerical_test.py +0 -0
  65. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/random.py +0 -0
  66. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/random_test.py +0 -0
  67. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/space.py +0 -0
  68. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/space_test.py +0 -0
  69. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/sweeping.py +0 -0
  70. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/geno/sweeping_test.py +0 -0
  71. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/__init__.py +0 -0
  72. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/base.py +0 -0
  73. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/categorical.py +0 -0
  74. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/categorical_test.py +0 -0
  75. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/custom.py +0 -0
  76. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/custom_test.py +0 -0
  77. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/derived.py +0 -0
  78. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/derived_test.py +0 -0
  79. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  80. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  81. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/evolvable.py +0 -0
  82. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/evolvable_test.py +0 -0
  83. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/iter.py +0 -0
  84. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/iter_test.py +0 -0
  85. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/numerical.py +0 -0
  86. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/numerical_test.py +0 -0
  87. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/object_template.py +0 -0
  88. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/hyper/object_template_test.py +0 -0
  89. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/io/__init__.py +0 -0
  90. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/io/file_system.py +0 -0
  91. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/io/file_system_test.py +0 -0
  92. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/io/sequence.py +0 -0
  93. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/io/sequence_test.py +0 -0
  94. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/patching/__init__.py +0 -0
  95. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/patching/object_factory.py +0 -0
  96. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/patching/object_factory_test.py +0 -0
  97. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/patching/pattern_based.py +0 -0
  98. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/patching/pattern_based_test.py +0 -0
  99. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/patching/rule_based.py +0 -0
  100. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/patching/rule_based_test.py +0 -0
  101. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/__init__.py +0 -0
  102. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/boilerplate.py +0 -0
  103. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  104. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/class_wrapper.py +0 -0
  105. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  106. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/compounding.py +0 -0
  107. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/compounding_test.py +0 -0
  108. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/contextual_object.py +0 -0
  109. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/contextual_object_test.py +0 -0
  110. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/diff.py +0 -0
  111. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/diff_test.py +0 -0
  112. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/error_info.py +0 -0
  113. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/error_info_test.py +0 -0
  114. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/flags.py +0 -0
  115. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/flags_test.py +0 -0
  116. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/functor.py +0 -0
  117. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/functor_test.py +0 -0
  118. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/inferred.py +0 -0
  119. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/inferred_test.py +0 -0
  120. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/object_test.py +0 -0
  121. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/origin.py +0 -0
  122. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/origin_test.py +0 -0
  123. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  124. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/symbolize.py +0 -0
  125. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/symbolic/symbolize_test.py +0 -0
  126. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/__init__.py +0 -0
  127. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/backend.py +0 -0
  128. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/backend_test.py +0 -0
  129. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/early_stopping.py +0 -0
  130. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/local_backend.py +0 -0
  131. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/protocols.py +0 -0
  132. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/protocols_test.py +0 -0
  133. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/sample.py +0 -0
  134. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/tuning/sample_test.py +0 -0
  135. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/__init__.py +0 -0
  136. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/annotated.py +0 -0
  137. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/annotated_test.py +0 -0
  138. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/annotation_future_test.py +0 -0
  139. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/callable_ext.py +0 -0
  140. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/callable_ext_test.py +0 -0
  141. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/callable_signature.py +0 -0
  142. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/callable_signature_test.py +0 -0
  143. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/class_schema_test.py +0 -0
  144. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/custom_typing.py +0 -0
  145. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/inspect.py +0 -0
  146. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/inspect_test.py +0 -0
  147. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/key_specs.py +0 -0
  148. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/key_specs_test.py +0 -0
  149. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/pytype_support.py +0 -0
  150. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/typed_missing.py +0 -0
  151. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/typed_missing_test.py +0 -0
  152. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/value_specs.py +0 -0
  153. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/typing/value_specs_test.py +0 -0
  154. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/common_traits.py +0 -0
  155. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/common_traits_test.py +0 -0
  156. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/docstr_utils.py +0 -0
  157. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/docstr_utils_test.py +0 -0
  158. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/error_utils_test.py +0 -0
  159. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/formatting.py +0 -0
  160. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/formatting_test.py +0 -0
  161. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/hierarchical.py +0 -0
  162. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/hierarchical_test.py +0 -0
  163. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/missing.py +0 -0
  164. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/missing_test.py +0 -0
  165. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/text_color.py +0 -0
  166. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/text_color_test.py +0 -0
  167. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/thread_local.py +0 -0
  168. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/thread_local_test.py +0 -0
  169. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/timing.py +0 -0
  170. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/timing_test.py +0 -0
  171. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/value_location.py +0 -0
  172. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/utils/value_location_test.py +0 -0
  173. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/__init__.py +0 -0
  174. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/base.py +0 -0
  175. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/base_test.py +0 -0
  176. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/__init__.py +0 -0
  177. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/base.py +0 -0
  178. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/base_test.py +0 -0
  179. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/__init__.py +0 -0
  180. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/base.py +0 -0
  181. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/label.py +0 -0
  182. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/label_test.py +0 -0
  183. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/progress_bar.py +0 -0
  184. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/progress_bar_test.py +0 -0
  185. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/tooltip.py +0 -0
  186. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
  187. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/tree_view.py +0 -0
  188. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/core/views/html/tree_view_test.py +0 -0
  189. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/__init__.py +0 -0
  190. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/early_stopping/__init__.py +0 -0
  191. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/early_stopping/base.py +0 -0
  192. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/early_stopping/base_test.py +0 -0
  193. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/early_stopping/step_wise.py +0 -0
  194. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  195. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/__init__.py +0 -0
  196. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/base.py +0 -0
  197. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/hill_climb.py +0 -0
  198. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  199. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/mutators.py +0 -0
  200. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/mutators_test.py +0 -0
  201. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/neat.py +0 -0
  202. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/neat_test.py +0 -0
  203. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/nsga2.py +0 -0
  204. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/nsga2_test.py +0 -0
  205. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/recombinators.py +0 -0
  206. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/recombinators_test.py +0 -0
  207. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  208. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  209. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/selectors.py +0 -0
  210. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/selectors_test.py +0 -0
  211. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/where.py +0 -0
  212. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/evolution/where_test.py +0 -0
  213. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/mutfun/__init__.py +0 -0
  214. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/mutfun/base.py +0 -0
  215. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/mutfun/base_test.py +0 -0
  216. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/mutfun/basic_ops.py +0 -0
  217. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  218. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/__init__.py +0 -0
  219. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/base.py +0 -0
  220. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/base_test.py +0 -0
  221. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/maths.py +0 -0
  222. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/maths_test.py +0 -0
  223. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/randoms.py +0 -0
  224. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/randoms_test.py +0 -0
  225. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/step_wise.py +0 -0
  226. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove/ext/scalars/step_wise_test.py +0 -0
  227. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove.egg-info/dependency_links.txt +0 -0
  228. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove.egg-info/requires.txt +0 -0
  229. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/pyglove.egg-info/top_level.txt +0 -0
  230. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/setup.cfg +0 -0
  231. {pyglove-0.5.0.dev202508140811 → pyglove-0.5.0.dev202511030811}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyglove
3
- Version: 0.5.0.dev202508140811
3
+ Version: 0.5.0.dev202511030811
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -1,4 +1,4 @@
1
- # Copyright 2019 The PyGlove Authors
1
+ # Copyright 2025 The PyGlove Authors
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -306,6 +306,7 @@ format = utils.format # pylint: disable=redefined-builtin
306
306
  print = utils.print # pylint: disable=redefined-builtin
307
307
  docstr = utils.docstr
308
308
  catch_errors = utils.catch_errors
309
+ match_error = utils.match_error
309
310
  timeit = utils.timeit
310
311
 
311
312
  contextual_override = utils.contextual_override
@@ -352,6 +353,12 @@ from pyglove.core import coding
352
353
 
353
354
  from pyglove.core import logging
354
355
 
356
+ #
357
+ # Symbols from `monitoring.py`.
358
+ #
359
+
360
+ from pyglove.core import monitoring
361
+
355
362
  # pylint: enable=g-import-not-at-top
356
363
  # pylint: enable=reimported
357
364
  # pylint: enable=unused-import
@@ -1447,6 +1447,7 @@ class DNA(symbolic.Object):
1447
1447
  *,
1448
1448
  allow_partial: bool = False,
1449
1449
  root_path: Optional[utils.KeyPath] = None,
1450
+ **kwargs,
1450
1451
  ) -> 'DNA':
1451
1452
  """Class method that load a DNA from a JSON value.
1452
1453
 
@@ -1454,6 +1455,7 @@ class DNA(symbolic.Object):
1454
1455
  json_value: Input JSON value, only JSON dict is acceptable.
1455
1456
  allow_partial: Whether to allow elements of the list to be partial.
1456
1457
  root_path: KeyPath of loaded object in its object tree.
1458
+ **kwargs: Keyword arguments that will be passed to symbolic.from_json.
1457
1459
 
1458
1460
  Returns:
1459
1461
  A DNA object.
@@ -1463,16 +1465,18 @@ class DNA(symbolic.Object):
1463
1465
  # NOTE(daiyip): DNA.parse will validate the input. Therefore, we can
1464
1466
  # disable runtime type check during constructing the DNA objects.
1465
1467
  with symbolic.enable_type_check(False):
1466
- dna = DNA.parse(symbolic.from_json(json_value.get('value')))
1468
+ dna = DNA.parse(symbolic.from_json(json_value.get('value'), **kwargs))
1467
1469
  if 'metadata' in json_value:
1468
1470
  dna.rebind(
1469
- metadata=symbolic.from_json(json_value.get('metadata')),
1471
+ metadata=symbolic.from_json(json_value.get('metadata'), **kwargs),
1470
1472
  raise_on_no_change=False, skip_notification=True)
1471
1473
  else:
1472
1474
  dna = super(DNA, cls).from_json(
1473
1475
  json_value,
1474
1476
  allow_partial=allow_partial,
1475
- root_path=root_path) # pytype: disable=bad-return-type
1477
+ root_path=root_path,
1478
+ **kwargs,
1479
+ ) # pytype: disable=bad-return-type
1476
1480
  assert isinstance(dna, DNA)
1477
1481
  if cloneable_metadata_keys:
1478
1482
  dna._cloneable_metadata_keys = set(cloneable_metadata_keys) # pylint: disable=protected-access
@@ -17,9 +17,11 @@ This module allows PyGlove to use external created logger for logging PyGlove
17
17
  events without introducing library dependencies in PyGlove.
18
18
  """
19
19
 
20
+ import contextlib
20
21
  import inspect
21
22
  import logging
22
- from typing import Any, Callable, List, Union
23
+ import sys
24
+ from typing import Any, Callable, Iterator, List, Union
23
25
 
24
26
 
25
27
  _DEFAULT_LOGGER = logging.getLogger()
@@ -117,3 +119,45 @@ def critical(msg: str, *args, **kwargs) -> None:
117
119
  **kwargs: Keyword arguments for the logger.
118
120
  """
119
121
  _DEFAULT_LOGGER.critical(msg, *args, **kwargs)
122
+
123
+
124
+ def use_stream(
125
+ stream: Any,
126
+ level: int = logging.INFO,
127
+ name: str = 'custom',
128
+ fmt: str = '{levelname:8} | {asctime} | {message}',
129
+ datefmt: str = '%Y-%m-%d %H:%M:%S') -> logging.Logger:
130
+ """Use stdout for logging."""
131
+ logger = logging.getLogger(name)
132
+ logger.setLevel(level)
133
+ stdout_handler = logging.StreamHandler(stream=stream)
134
+ stdout_handler.setLevel(level)
135
+ stdout_handler.setFormatter(
136
+ logging.Formatter(fmt=fmt, datefmt=datefmt, style='{'))
137
+ logger.addHandler(stdout_handler)
138
+ set_logger(logger)
139
+ return logger
140
+
141
+
142
+ def use_stdout(
143
+ level: int = logging.INFO,
144
+ fmt: str = '{levelname:8} | {asctime} | {message}',
145
+ datefmt: str = '%Y-%m-%d %H:%M:%S') -> logging.Logger:
146
+ """Use stdout for logging."""
147
+ return use_stream(sys.stdout, level, 'stdout', fmt, datefmt)
148
+
149
+
150
+ @contextlib.contextmanager
151
+ def redirect_stream(
152
+ stream: Any,
153
+ level: int = logging.INFO,
154
+ name: str = 'custom',
155
+ fmt: str = '{levelname:8} | {asctime} | {message}',
156
+ datefmt: str = '%Y-%m-%d %H:%M:%S') -> Iterator[logging.Logger]:
157
+ """Redirect the stream to the given logger."""
158
+ previous_logger = get_logger()
159
+ try:
160
+ logger = use_stream(stream, level, name, fmt, datefmt)
161
+ yield logger
162
+ finally:
163
+ set_logger(previous_logger)
@@ -21,15 +21,9 @@ class LoggingTest(unittest.TestCase):
21
21
  """Tests for pg.logging."""
22
22
 
23
23
  def testLogging(self):
24
- string_io = io.StringIO()
25
- logger = logging.getLogger('logger1')
26
- logger.setLevel(logging.INFO)
27
- console_handler = logging.StreamHandler(stream=string_io)
28
- console_handler.setLevel(logging.INFO)
29
- logger.addHandler(console_handler)
30
-
31
24
  self.assertIs(pg_logging.get_logger(), logging.getLogger())
32
- pg_logging.set_logger(logger)
25
+ string_io = io.StringIO()
26
+ logger = pg_logging.use_stream(string_io, name='logger1', fmt='')
33
27
  self.assertIs(pg_logging.get_logger(), logger)
34
28
 
35
29
  pg_logging.debug('x=%s', 1)
@@ -46,19 +40,16 @@ class LoggingTest(unittest.TestCase):
46
40
  ]) + '\n')
47
41
 
48
42
  string_io = io.StringIO()
49
- logger = logging.getLogger('logger2')
50
- logger.setLevel(logging.DEBUG)
51
- console_handler = logging.StreamHandler(stream=string_io)
52
- console_handler.setLevel(logging.DEBUG)
53
- logger.addHandler(console_handler)
54
-
55
- pg_logging.set_logger(logger)
56
-
57
- pg_logging.debug('x=%s', 6)
58
- self.assertEqual(string_io.getvalue(), '\n'.join([
59
- 'x=6',
60
- ]) + '\n')
61
-
43
+ with pg_logging.redirect_stream(
44
+ string_io, level=logging.DEBUG, name='logger2', fmt=''
45
+ ):
46
+ pg_logging.debug('x=%s', 6)
47
+ self.assertEqual(string_io.getvalue(), '\n'.join([
48
+ 'x=6',
49
+ ]) + '\n')
50
+
51
+ pg_logging.use_stdout()
52
+ pg_logging.info('y=%s', 7)
62
53
 
63
54
  if __name__ == '__main__':
64
55
  unittest.main()