pyglove 0.4.5.dev202504220810__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.dev202504220810 → pyglove-0.4.5.dev202504230810}/PKG-INFO +1 -1
  2. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/formatting.py +20 -2
  3. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/formatting_test.py +26 -0
  4. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/PKG-INFO +1 -1
  5. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/LICENSE +0 -0
  6. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/README.md +0 -0
  7. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/__init__.py +0 -0
  8. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/__init__.py +0 -0
  9. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/__init__.py +0 -0
  10. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/errors.py +0 -0
  11. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/errors_test.py +0 -0
  12. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/execution.py +0 -0
  13. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/execution_test.py +0 -0
  14. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/function_generation.py +0 -0
  15. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/function_generation_test.py +0 -0
  16. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/parsing.py +0 -0
  17. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/parsing_test.py +0 -0
  18. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/permissions.py +0 -0
  19. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/coding/permissions_test.py +0 -0
  20. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/detouring/__init__.py +0 -0
  21. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/detouring/class_detour.py +0 -0
  22. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/detouring/class_detour_test.py +0 -0
  23. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/__init__.py +0 -0
  24. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/base.py +0 -0
  25. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/base_test.py +0 -0
  26. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/categorical.py +0 -0
  27. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/categorical_test.py +0 -0
  28. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/custom.py +0 -0
  29. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/custom_test.py +0 -0
  30. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/deduping.py +0 -0
  31. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/deduping_test.py +0 -0
  32. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/dna_generator.py +0 -0
  33. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/dna_generator_test.py +0 -0
  34. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/numerical.py +0 -0
  35. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/numerical_test.py +0 -0
  36. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/random.py +0 -0
  37. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/random_test.py +0 -0
  38. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/space.py +0 -0
  39. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/space_test.py +0 -0
  40. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/sweeping.py +0 -0
  41. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/geno/sweeping_test.py +0 -0
  42. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/__init__.py +0 -0
  43. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/base.py +0 -0
  44. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/categorical.py +0 -0
  45. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/categorical_test.py +0 -0
  46. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/custom.py +0 -0
  47. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/custom_test.py +0 -0
  48. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/derived.py +0 -0
  49. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/derived_test.py +0 -0
  50. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  51. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  52. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/evolvable.py +0 -0
  53. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/evolvable_test.py +0 -0
  54. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/iter.py +0 -0
  55. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/iter_test.py +0 -0
  56. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/numerical.py +0 -0
  57. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/numerical_test.py +0 -0
  58. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/object_template.py +0 -0
  59. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/hyper/object_template_test.py +0 -0
  60. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/__init__.py +0 -0
  61. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/file_system.py +0 -0
  62. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/file_system_test.py +0 -0
  63. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/sequence.py +0 -0
  64. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/io/sequence_test.py +0 -0
  65. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/logging.py +0 -0
  66. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/logging_test.py +0 -0
  67. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/__init__.py +0 -0
  68. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/object_factory.py +0 -0
  69. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/object_factory_test.py +0 -0
  70. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/pattern_based.py +0 -0
  71. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/pattern_based_test.py +0 -0
  72. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/rule_based.py +0 -0
  73. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/patching/rule_based_test.py +0 -0
  74. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/__init__.py +0 -0
  75. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/base.py +0 -0
  76. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/base_test.py +0 -0
  77. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/boilerplate.py +0 -0
  78. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  79. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/class_wrapper.py +0 -0
  80. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  81. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/compounding.py +0 -0
  82. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/compounding_test.py +0 -0
  83. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/contextual_object.py +0 -0
  84. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/contextual_object_test.py +0 -0
  85. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/dict.py +0 -0
  86. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/dict_test.py +0 -0
  87. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/diff.py +0 -0
  88. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/diff_test.py +0 -0
  89. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/flags.py +0 -0
  90. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/flags_test.py +0 -0
  91. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/functor.py +0 -0
  92. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/functor_test.py +0 -0
  93. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/inferred.py +0 -0
  94. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/inferred_test.py +0 -0
  95. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/list.py +0 -0
  96. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/list_test.py +0 -0
  97. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/object.py +0 -0
  98. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/object_test.py +0 -0
  99. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/origin.py +0 -0
  100. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/origin_test.py +0 -0
  101. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  102. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/ref.py +0 -0
  103. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/ref_test.py +0 -0
  104. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/symbolize.py +0 -0
  105. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/symbolic/symbolize_test.py +0 -0
  106. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/__init__.py +0 -0
  107. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/backend.py +0 -0
  108. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/backend_test.py +0 -0
  109. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/early_stopping.py +0 -0
  110. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/local_backend.py +0 -0
  111. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/protocols.py +0 -0
  112. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/protocols_test.py +0 -0
  113. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/sample.py +0 -0
  114. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/tuning/sample_test.py +0 -0
  115. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/__init__.py +0 -0
  116. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotated.py +0 -0
  117. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotated_test.py +0 -0
  118. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotation_conversion.py +0 -0
  119. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotation_conversion_test.py +0 -0
  120. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/annotation_future_test.py +0 -0
  121. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_ext.py +0 -0
  122. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_ext_test.py +0 -0
  123. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_signature.py +0 -0
  124. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/callable_signature_test.py +0 -0
  125. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/class_schema.py +0 -0
  126. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/class_schema_test.py +0 -0
  127. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/custom_typing.py +0 -0
  128. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/inspect.py +0 -0
  129. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/inspect_test.py +0 -0
  130. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/key_specs.py +0 -0
  131. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/key_specs_test.py +0 -0
  132. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/pytype_support.py +0 -0
  133. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/type_conversion.py +0 -0
  134. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/type_conversion_test.py +0 -0
  135. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/typed_missing.py +0 -0
  136. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/typed_missing_test.py +0 -0
  137. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/value_specs.py +0 -0
  138. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/typing/value_specs_test.py +0 -0
  139. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/__init__.py +0 -0
  140. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/common_traits.py +0 -0
  141. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/common_traits_test.py +0 -0
  142. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/contextual.py +0 -0
  143. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/contextual_test.py +0 -0
  144. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/docstr_utils.py +0 -0
  145. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/docstr_utils_test.py +0 -0
  146. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/error_utils.py +0 -0
  147. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/error_utils_test.py +0 -0
  148. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/hierarchical.py +0 -0
  149. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/hierarchical_test.py +0 -0
  150. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/json_conversion.py +0 -0
  151. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/json_conversion_test.py +0 -0
  152. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/missing.py +0 -0
  153. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/missing_test.py +0 -0
  154. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/text_color.py +0 -0
  155. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/text_color_test.py +0 -0
  156. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/thread_local.py +0 -0
  157. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/thread_local_test.py +0 -0
  158. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/timing.py +0 -0
  159. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/timing_test.py +0 -0
  160. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/value_location.py +0 -0
  161. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/utils/value_location_test.py +0 -0
  162. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/__init__.py +0 -0
  163. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/base.py +0 -0
  164. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/base_test.py +0 -0
  165. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/__init__.py +0 -0
  166. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/base.py +0 -0
  167. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/base_test.py +0 -0
  168. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/__init__.py +0 -0
  169. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/base.py +0 -0
  170. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/label.py +0 -0
  171. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/label_test.py +0 -0
  172. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/progress_bar.py +0 -0
  173. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/progress_bar_test.py +0 -0
  174. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tab.py +0 -0
  175. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tab_test.py +0 -0
  176. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tooltip.py +0 -0
  177. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
  178. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/tree_view.py +0 -0
  179. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/core/views/html/tree_view_test.py +0 -0
  180. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/__init__.py +0 -0
  181. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/__init__.py +0 -0
  182. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/base.py +0 -0
  183. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/base_test.py +0 -0
  184. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/step_wise.py +0 -0
  185. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  186. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/__init__.py +0 -0
  187. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/base.py +0 -0
  188. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/base_test.py +0 -0
  189. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/hill_climb.py +0 -0
  190. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  191. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/mutators.py +0 -0
  192. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/mutators_test.py +0 -0
  193. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/neat.py +0 -0
  194. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/neat_test.py +0 -0
  195. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/nsga2.py +0 -0
  196. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/nsga2_test.py +0 -0
  197. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/recombinators.py +0 -0
  198. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/recombinators_test.py +0 -0
  199. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  200. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  201. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/selectors.py +0 -0
  202. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/selectors_test.py +0 -0
  203. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/where.py +0 -0
  204. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/evolution/where_test.py +0 -0
  205. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/__init__.py +0 -0
  206. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/base.py +0 -0
  207. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/base_test.py +0 -0
  208. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/basic_ops.py +0 -0
  209. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  210. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/__init__.py +0 -0
  211. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/base.py +0 -0
  212. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/base_test.py +0 -0
  213. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/maths.py +0 -0
  214. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/maths_test.py +0 -0
  215. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/randoms.py +0 -0
  216. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/randoms_test.py +0 -0
  217. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/step_wise.py +0 -0
  218. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove/ext/scalars/step_wise_test.py +0 -0
  219. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/SOURCES.txt +0 -0
  220. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/dependency_links.txt +0 -0
  221. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/requires.txt +0 -0
  222. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/pyglove.egg-info/top_level.txt +0 -0
  223. {pyglove-0.4.5.dev202504220810 → pyglove-0.4.5.dev202504230810}/setup.cfg +0 -0
  224. {pyglove-0.4.5.dev202504220810 → 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.dev202504220810
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
@@ -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.dev202504220810
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