pyglove 0.4.5.dev202504210810__tar.gz → 0.4.5.dev202504230810__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.
Files changed (224) hide show
  1. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/PKG-INFO +1 -1
  2. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/errors.py +2 -2
  3. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/execution.py +3 -3
  4. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/execution_test.py +4 -0
  5. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/formatting.py +20 -2
  6. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/formatting_test.py +26 -0
  7. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/PKG-INFO +1 -1
  8. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/LICENSE +0 -0
  9. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/README.md +0 -0
  10. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/__init__.py +0 -0
  11. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/__init__.py +0 -0
  12. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/__init__.py +0 -0
  13. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/errors_test.py +0 -0
  14. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/function_generation.py +0 -0
  15. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/function_generation_test.py +0 -0
  16. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/parsing.py +0 -0
  17. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/parsing_test.py +0 -0
  18. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/permissions.py +0 -0
  19. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/permissions_test.py +0 -0
  20. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/detouring/__init__.py +0 -0
  21. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/detouring/class_detour.py +0 -0
  22. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/detouring/class_detour_test.py +0 -0
  23. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/__init__.py +0 -0
  24. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/base.py +0 -0
  25. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/base_test.py +0 -0
  26. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/categorical.py +0 -0
  27. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/categorical_test.py +0 -0
  28. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/custom.py +0 -0
  29. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/custom_test.py +0 -0
  30. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/deduping.py +0 -0
  31. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/deduping_test.py +0 -0
  32. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/dna_generator.py +0 -0
  33. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/dna_generator_test.py +0 -0
  34. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/numerical.py +0 -0
  35. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/numerical_test.py +0 -0
  36. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/random.py +0 -0
  37. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/random_test.py +0 -0
  38. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/space.py +0 -0
  39. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/space_test.py +0 -0
  40. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/sweeping.py +0 -0
  41. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/sweeping_test.py +0 -0
  42. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/__init__.py +0 -0
  43. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/base.py +0 -0
  44. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/categorical.py +0 -0
  45. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/categorical_test.py +0 -0
  46. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/custom.py +0 -0
  47. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/custom_test.py +0 -0
  48. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/derived.py +0 -0
  49. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/derived_test.py +0 -0
  50. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  51. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  52. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/evolvable.py +0 -0
  53. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/evolvable_test.py +0 -0
  54. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/iter.py +0 -0
  55. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/iter_test.py +0 -0
  56. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/numerical.py +0 -0
  57. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/numerical_test.py +0 -0
  58. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/object_template.py +0 -0
  59. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/object_template_test.py +0 -0
  60. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/__init__.py +0 -0
  61. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/file_system.py +0 -0
  62. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/file_system_test.py +0 -0
  63. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/sequence.py +0 -0
  64. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/sequence_test.py +0 -0
  65. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/logging.py +0 -0
  66. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/logging_test.py +0 -0
  67. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/__init__.py +0 -0
  68. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/object_factory.py +0 -0
  69. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/object_factory_test.py +0 -0
  70. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/pattern_based.py +0 -0
  71. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/pattern_based_test.py +0 -0
  72. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/rule_based.py +0 -0
  73. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/rule_based_test.py +0 -0
  74. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/__init__.py +0 -0
  75. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/base.py +0 -0
  76. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/base_test.py +0 -0
  77. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/boilerplate.py +0 -0
  78. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  79. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/class_wrapper.py +0 -0
  80. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  81. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/compounding.py +0 -0
  82. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/compounding_test.py +0 -0
  83. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/contextual_object.py +0 -0
  84. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/contextual_object_test.py +0 -0
  85. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/dict.py +0 -0
  86. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/dict_test.py +0 -0
  87. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/diff.py +0 -0
  88. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/diff_test.py +0 -0
  89. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/flags.py +0 -0
  90. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/flags_test.py +0 -0
  91. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/functor.py +0 -0
  92. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/functor_test.py +0 -0
  93. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/inferred.py +0 -0
  94. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/inferred_test.py +0 -0
  95. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/list.py +0 -0
  96. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/list_test.py +0 -0
  97. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/object.py +0 -0
  98. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/object_test.py +0 -0
  99. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/origin.py +0 -0
  100. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/origin_test.py +0 -0
  101. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  102. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/ref.py +0 -0
  103. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/ref_test.py +0 -0
  104. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/symbolize.py +0 -0
  105. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/symbolize_test.py +0 -0
  106. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/__init__.py +0 -0
  107. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/backend.py +0 -0
  108. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/backend_test.py +0 -0
  109. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/early_stopping.py +0 -0
  110. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/local_backend.py +0 -0
  111. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/protocols.py +0 -0
  112. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/protocols_test.py +0 -0
  113. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/sample.py +0 -0
  114. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/sample_test.py +0 -0
  115. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/__init__.py +0 -0
  116. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotated.py +0 -0
  117. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotated_test.py +0 -0
  118. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotation_conversion.py +0 -0
  119. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotation_conversion_test.py +0 -0
  120. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotation_future_test.py +0 -0
  121. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_ext.py +0 -0
  122. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_ext_test.py +0 -0
  123. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_signature.py +0 -0
  124. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_signature_test.py +0 -0
  125. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/class_schema.py +0 -0
  126. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/class_schema_test.py +0 -0
  127. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/custom_typing.py +0 -0
  128. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/inspect.py +0 -0
  129. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/inspect_test.py +0 -0
  130. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/key_specs.py +0 -0
  131. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/key_specs_test.py +0 -0
  132. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/pytype_support.py +0 -0
  133. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/type_conversion.py +0 -0
  134. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/type_conversion_test.py +0 -0
  135. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/typed_missing.py +0 -0
  136. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/typed_missing_test.py +0 -0
  137. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/value_specs.py +0 -0
  138. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/value_specs_test.py +0 -0
  139. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/__init__.py +0 -0
  140. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/common_traits.py +0 -0
  141. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/common_traits_test.py +0 -0
  142. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/contextual.py +0 -0
  143. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/contextual_test.py +0 -0
  144. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/docstr_utils.py +0 -0
  145. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/docstr_utils_test.py +0 -0
  146. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/error_utils.py +0 -0
  147. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/error_utils_test.py +0 -0
  148. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/hierarchical.py +0 -0
  149. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/hierarchical_test.py +0 -0
  150. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/json_conversion.py +0 -0
  151. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/json_conversion_test.py +0 -0
  152. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/missing.py +0 -0
  153. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/missing_test.py +0 -0
  154. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/text_color.py +0 -0
  155. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/text_color_test.py +0 -0
  156. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/thread_local.py +0 -0
  157. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/thread_local_test.py +0 -0
  158. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/timing.py +0 -0
  159. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/timing_test.py +0 -0
  160. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/value_location.py +0 -0
  161. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/value_location_test.py +0 -0
  162. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/__init__.py +0 -0
  163. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/base.py +0 -0
  164. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/base_test.py +0 -0
  165. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/__init__.py +0 -0
  166. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/base.py +0 -0
  167. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/base_test.py +0 -0
  168. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/__init__.py +0 -0
  169. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/base.py +0 -0
  170. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/label.py +0 -0
  171. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/label_test.py +0 -0
  172. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/progress_bar.py +0 -0
  173. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/progress_bar_test.py +0 -0
  174. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tab.py +0 -0
  175. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tab_test.py +0 -0
  176. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tooltip.py +0 -0
  177. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
  178. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/tree_view.py +0 -0
  179. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/tree_view_test.py +0 -0
  180. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/__init__.py +0 -0
  181. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/__init__.py +0 -0
  182. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/base.py +0 -0
  183. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/base_test.py +0 -0
  184. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/step_wise.py +0 -0
  185. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  186. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/__init__.py +0 -0
  187. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/base.py +0 -0
  188. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/base_test.py +0 -0
  189. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/hill_climb.py +0 -0
  190. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  191. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/mutators.py +0 -0
  192. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/mutators_test.py +0 -0
  193. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/neat.py +0 -0
  194. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/neat_test.py +0 -0
  195. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/nsga2.py +0 -0
  196. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/nsga2_test.py +0 -0
  197. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/recombinators.py +0 -0
  198. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/recombinators_test.py +0 -0
  199. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  200. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  201. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/selectors.py +0 -0
  202. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/selectors_test.py +0 -0
  203. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/where.py +0 -0
  204. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/where_test.py +0 -0
  205. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/__init__.py +0 -0
  206. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/base.py +0 -0
  207. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/base_test.py +0 -0
  208. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/basic_ops.py +0 -0
  209. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  210. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/__init__.py +0 -0
  211. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/base.py +0 -0
  212. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/base_test.py +0 -0
  213. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/maths.py +0 -0
  214. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/maths_test.py +0 -0
  215. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/randoms.py +0 -0
  216. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/randoms_test.py +0 -0
  217. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/step_wise.py +0 -0
  218. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/step_wise_test.py +0 -0
  219. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/SOURCES.txt +0 -0
  220. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/dependency_links.txt +0 -0
  221. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/requires.txt +0 -0
  222. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/top_level.txt +0 -0
  223. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/setup.cfg +0 -0
  224. {pyglove-0.4.5.dev202504210810 → pyglove-0.4.5.dev202504230810}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202504210810
3
+ Version: 0.4.5.dev202504230810
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -28,7 +28,7 @@ class CodeError(RuntimeError):
28
28
  def __init__(
29
29
  self,
30
30
  code: str,
31
- cause: Exception,
31
+ cause: BaseException,
32
32
  ):
33
33
  self.code = code
34
34
  self.cause = cause
@@ -93,7 +93,7 @@ class CodeError(RuntimeError):
93
93
  class SerializationError(RuntimeError):
94
94
  """Object serialization error."""
95
95
 
96
- def __init__(self, message: Optional[str], cause: Exception):
96
+ def __init__(self, message: Optional[str], cause: BaseException):
97
97
  self.message = message
98
98
  self.cause = cause
99
99
 
@@ -131,7 +131,7 @@ def evaluate(
131
131
  result = eval( # pylint: disable=eval-used
132
132
  compile(last_expr, '', mode='eval'), global_vars
133
133
  )
134
- except Exception as e:
134
+ except BaseException as e:
135
135
  raise errors.CodeError(code, e) from e
136
136
 
137
137
  for result_var in result_vars:
@@ -139,7 +139,7 @@ def evaluate(
139
139
  else:
140
140
  try:
141
141
  exec(compile(code_block, '', mode='exec'), global_vars) # pylint: disable=exec-used
142
- except Exception as e:
142
+ except BaseException as e:
143
143
  raise errors.CodeError(code, e) from e
144
144
  global_vars[RESULT_KEY] = list(global_vars.values())[-1]
145
145
 
@@ -188,7 +188,7 @@ def sandbox_call(
188
188
  r = func(*args, **kwargs)
189
189
  try:
190
190
  return pickle.dumps(r)
191
- except Exception as e:
191
+ except BaseException as e:
192
192
  raise errors.SerializationError(
193
193
  f'Cannot serialize sandbox result: {r}', e
194
194
  ) from e
@@ -217,6 +217,10 @@ class EvaluateTest(unittest.TestCase):
217
217
  execution.evaluate(
218
218
  'raise ValueError()', permission=permissions.CodePermission.ALL
219
219
  )
220
+ with self.assertRaisesRegex(errors.CodeError, 'SystemExit'):
221
+ execution.evaluate(
222
+ 'raise SystemExit()', permission=permissions.CodePermission.ALL
223
+ )
220
224
 
221
225
 
222
226
  @dataclasses.dataclass
@@ -161,6 +161,7 @@ def kvlist_str(
161
161
  label: Optional[str] = None,
162
162
  bracket_type: BracketType = BracketType.ROUND,
163
163
  custom_format: Optional[CustomFormatFn] = None,
164
+ memo: Optional[Set[int]] = None,
164
165
  **kwargs,
165
166
  ) -> str:
166
167
  """Formats a list key/value pairs into a comma delimited string.
@@ -178,6 +179,8 @@ def kvlist_str(
178
179
  custom_format: An optional custom format function, which will be applied to
179
180
  each value (and child values) in kvlist. If the function returns None, it
180
181
  will fall back to the default `pg.format`.
182
+ memo: A set of object ids that have been formatted. Used to avoid
183
+ infinite recursion in the formatting process.
181
184
  **kwargs: Keyword arguments that will be passed through unto child
182
185
  ``Formattable`` objects.
183
186
  Returns:
@@ -208,6 +211,7 @@ def kvlist_str(
208
211
  verbose=verbose,
209
212
  root_indent=child_indent,
210
213
  custom_format=custom_format,
214
+ memo=memo,
211
215
  **kwargs
212
216
  )
213
217
  if not compact:
@@ -271,6 +275,7 @@ def format( # pylint: disable=redefined-builtin
271
275
  max_bytes_len: Optional[int] = None,
272
276
  *,
273
277
  custom_format: Optional[CustomFormatFn] = None,
278
+ memo: Optional[Set[int]] = None,
274
279
  **kwargs,
275
280
  ) -> str:
276
281
  """Formats a (maybe) hierarchical value with flags.
@@ -297,6 +302,8 @@ def format( # pylint: disable=redefined-builtin
297
302
  custom_format: An optional custom format function, which will be applied to
298
303
  each value (and child values) in kvlist. If the function returns None, it
299
304
  will fall back to the default `pg.format`.
305
+ memo: A set of object ids that have been formatted. Used to avoid
306
+ infinite recursion in the formatting process.
300
307
  **kwargs: Keyword arguments that will be passed through unto child
301
308
  ``Formattable`` objects.
302
309
 
@@ -309,6 +316,14 @@ def format( # pylint: disable=redefined-builtin
309
316
  if result is not None:
310
317
  return maybe_markdown_quote(result, markdown)
311
318
 
319
+ if memo is None:
320
+ memo = set()
321
+
322
+ id_ = id(value)
323
+ if id_ in memo:
324
+ return f'<recursive {value.__class__.__name__} at 0x{id_:x}>' # pylint: disable=bad-whitespace
325
+ memo.add(id_)
326
+
312
327
  exclude_keys = exclude_keys or set()
313
328
 
314
329
  def _should_include_key(key: str) -> bool:
@@ -327,6 +342,7 @@ def format( # pylint: disable=redefined-builtin
327
342
  max_str_len=max_str_len,
328
343
  max_bytes_len=max_bytes_len,
329
344
  custom_format=custom_format,
345
+ memo=memo,
330
346
  **kwargs
331
347
  )
332
348
 
@@ -345,6 +361,7 @@ def format( # pylint: disable=redefined-builtin
345
361
  max_str_len=max_str_len,
346
362
  max_bytes_len=max_bytes_len,
347
363
  custom_format=custom_format,
364
+ memo=memo,
348
365
  **kwargs
349
366
  )
350
367
  elif isinstance(value, (list, tuple)):
@@ -393,6 +410,7 @@ def format( # pylint: disable=redefined-builtin
393
410
  if compact else str_ext(value, custom_format, root_indent)]
394
411
  if strip_object_id and 'object at 0x' in s[-1]:
395
412
  s = [f'{value.__class__.__name__}(...)']
413
+ memo.remove(id_)
396
414
  return maybe_markdown_quote(''.join(s), markdown)
397
415
 
398
416
 
@@ -454,10 +472,10 @@ def camel_to_snake(text: str, separator: str = '_') -> str:
454
472
  return (separator.join(c for c in chunks if c)).lower()
455
473
 
456
474
 
457
- def printv(v: Any, **kwargs):
475
+ def printv(*args, **kwargs):
458
476
  """Prints formatted value."""
459
477
  fs = kwargs.pop('file', sys.stdout)
460
- print(format(v, **kwargs), file=fs)
478
+ print(*[format(v, **kwargs) for v in args], file=fs)
461
479
 
462
480
 
463
481
  def _indent(text: str, indent: int) -> str:
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  import inspect
15
+ import io
15
16
  import unittest
16
17
 
17
18
  from pyglove.core.utils import formatting
@@ -408,6 +409,26 @@ class FormatTest(unittest.TestCase):
408
409
  '{\'x\': <a/>}'
409
410
  )
410
411
 
412
+ def test_recursion(self):
413
+ # Recursive dict.
414
+ x = dict(x=1)
415
+ x['y'] = x
416
+ self.assertEqual(
417
+ formatting.format(x, compact=True),
418
+ f'{{\'x\': 1, \'y\': <recursive dict at 0x{id(x):x}>}}'
419
+ )
420
+ self.assertEqual(
421
+ formatting.format(x, compact=False),
422
+ f'{{\n \'x\': 1,\n \'y\': <recursive dict at 0x{id(x):x}>\n}}'
423
+ )
424
+ # Non-recursive dict.
425
+ y = dict(x=1)
426
+ a = dict(x=y, y=y)
427
+ self.assertEqual(
428
+ formatting.format(a, compact=True),
429
+ '{\'x\': {\'x\': 1}, \'y\': {\'x\': 1}}'
430
+ )
431
+
411
432
  def test_markdown(self):
412
433
 
413
434
  class A(formatting.Formattable):
@@ -448,6 +469,11 @@ class FormatTest(unittest.TestCase):
448
469
  formatting.format(b'bar', max_bytes_len=2), 'b\'ba...\''
449
470
  )
450
471
 
472
+ def test_printv(self):
473
+ with io.StringIO() as f:
474
+ formatting.printv(1, 2, 3, file=f)
475
+ self.assertEqual(f.getvalue(), '1 2 3\n')
476
+
451
477
 
452
478
  if __name__ == '__main__':
453
479
  unittest.main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202504210810
3
+ Version: 0.4.5.dev202504230810
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors