pyglove 0.5.0.dev202510290810__tar.gz → 0.5.0.dev202511040811__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 (230) hide show
  1. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/PKG-INFO +1 -1
  2. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/list_test.py +1 -2
  3. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/annotation_conversion.py +3 -0
  4. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/annotation_conversion_test.py +11 -19
  5. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/type_conversion.py +17 -3
  6. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/type_conversion_test.py +1 -1
  7. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/json_conversion_test.py +2 -1
  8. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/tab.py +33 -0
  9. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/tab_test.py +37 -0
  10. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/base_test.py +1 -1
  11. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove.egg-info/PKG-INFO +1 -1
  12. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/LICENSE +0 -0
  13. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/README.md +0 -0
  14. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/__init__.py +0 -0
  15. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/__init__.py +0 -0
  16. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/__init__.py +0 -0
  17. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/errors.py +0 -0
  18. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/errors_test.py +0 -0
  19. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/execution.py +0 -0
  20. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/execution_test.py +0 -0
  21. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/function_generation.py +0 -0
  22. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/function_generation_test.py +0 -0
  23. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/parsing.py +0 -0
  24. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/parsing_test.py +0 -0
  25. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/permissions.py +0 -0
  26. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/coding/permissions_test.py +0 -0
  27. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/detouring/__init__.py +0 -0
  28. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/detouring/class_detour.py +0 -0
  29. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/detouring/class_detour_test.py +0 -0
  30. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/__init__.py +0 -0
  31. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/base.py +0 -0
  32. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/base_test.py +0 -0
  33. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/categorical.py +0 -0
  34. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/categorical_test.py +0 -0
  35. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/custom.py +0 -0
  36. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/custom_test.py +0 -0
  37. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/deduping.py +0 -0
  38. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/deduping_test.py +0 -0
  39. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/dna_generator.py +0 -0
  40. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/dna_generator_test.py +0 -0
  41. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/numerical.py +0 -0
  42. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/numerical_test.py +0 -0
  43. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/random.py +0 -0
  44. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/random_test.py +0 -0
  45. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/space.py +0 -0
  46. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/space_test.py +0 -0
  47. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/sweeping.py +0 -0
  48. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/geno/sweeping_test.py +0 -0
  49. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/__init__.py +0 -0
  50. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/base.py +0 -0
  51. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/categorical.py +0 -0
  52. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/categorical_test.py +0 -0
  53. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/custom.py +0 -0
  54. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/custom_test.py +0 -0
  55. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/derived.py +0 -0
  56. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/derived_test.py +0 -0
  57. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  58. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  59. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/evolvable.py +0 -0
  60. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/evolvable_test.py +0 -0
  61. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/iter.py +0 -0
  62. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/iter_test.py +0 -0
  63. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/numerical.py +0 -0
  64. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/numerical_test.py +0 -0
  65. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/object_template.py +0 -0
  66. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/hyper/object_template_test.py +0 -0
  67. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/io/__init__.py +0 -0
  68. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/io/file_system.py +0 -0
  69. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/io/file_system_test.py +0 -0
  70. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/io/sequence.py +0 -0
  71. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/io/sequence_test.py +0 -0
  72. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/logging.py +0 -0
  73. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/logging_test.py +0 -0
  74. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/monitoring.py +0 -0
  75. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/monitoring_test.py +0 -0
  76. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/patching/__init__.py +0 -0
  77. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/patching/object_factory.py +0 -0
  78. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/patching/object_factory_test.py +0 -0
  79. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/patching/pattern_based.py +0 -0
  80. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/patching/pattern_based_test.py +0 -0
  81. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/patching/rule_based.py +0 -0
  82. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/patching/rule_based_test.py +0 -0
  83. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/__init__.py +0 -0
  84. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/base.py +0 -0
  85. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/base_test.py +0 -0
  86. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/boilerplate.py +0 -0
  87. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  88. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/class_wrapper.py +0 -0
  89. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  90. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/compounding.py +0 -0
  91. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/compounding_test.py +0 -0
  92. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/contextual_object.py +0 -0
  93. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/contextual_object_test.py +0 -0
  94. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/dict.py +0 -0
  95. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/dict_test.py +0 -0
  96. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/diff.py +0 -0
  97. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/diff_test.py +0 -0
  98. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/error_info.py +0 -0
  99. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/error_info_test.py +0 -0
  100. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/flags.py +0 -0
  101. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/flags_test.py +0 -0
  102. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/functor.py +0 -0
  103. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/functor_test.py +0 -0
  104. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/inferred.py +0 -0
  105. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/inferred_test.py +0 -0
  106. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/list.py +0 -0
  107. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/object.py +0 -0
  108. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/object_test.py +0 -0
  109. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/origin.py +0 -0
  110. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/origin_test.py +0 -0
  111. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  112. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/ref.py +0 -0
  113. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/ref_test.py +0 -0
  114. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/symbolize.py +0 -0
  115. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/symbolic/symbolize_test.py +0 -0
  116. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/__init__.py +0 -0
  117. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/backend.py +0 -0
  118. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/backend_test.py +0 -0
  119. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/early_stopping.py +0 -0
  120. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/local_backend.py +0 -0
  121. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/protocols.py +0 -0
  122. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/protocols_test.py +0 -0
  123. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/sample.py +0 -0
  124. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/tuning/sample_test.py +0 -0
  125. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/__init__.py +0 -0
  126. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/annotated.py +0 -0
  127. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/annotated_test.py +0 -0
  128. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/annotation_future_test.py +0 -0
  129. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/callable_ext.py +0 -0
  130. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/callable_ext_test.py +0 -0
  131. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/callable_signature.py +0 -0
  132. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/callable_signature_test.py +0 -0
  133. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/class_schema.py +0 -0
  134. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/class_schema_test.py +0 -0
  135. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/custom_typing.py +0 -0
  136. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/inspect.py +0 -0
  137. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/inspect_test.py +0 -0
  138. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/json_schema.py +0 -0
  139. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/json_schema_test.py +0 -0
  140. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/key_specs.py +0 -0
  141. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/key_specs_test.py +0 -0
  142. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/pytype_support.py +0 -0
  143. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/typed_missing.py +0 -0
  144. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/typed_missing_test.py +0 -0
  145. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/value_specs.py +0 -0
  146. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/typing/value_specs_test.py +0 -0
  147. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/__init__.py +0 -0
  148. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/common_traits.py +0 -0
  149. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/common_traits_test.py +0 -0
  150. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/contextual.py +0 -0
  151. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/contextual_test.py +0 -0
  152. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/docstr_utils.py +0 -0
  153. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/docstr_utils_test.py +0 -0
  154. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/error_utils.py +0 -0
  155. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/error_utils_test.py +0 -0
  156. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/formatting.py +0 -0
  157. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/formatting_test.py +0 -0
  158. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/hierarchical.py +0 -0
  159. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/hierarchical_test.py +0 -0
  160. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/json_conversion.py +0 -0
  161. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/missing.py +0 -0
  162. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/missing_test.py +0 -0
  163. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/text_color.py +0 -0
  164. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/text_color_test.py +0 -0
  165. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/thread_local.py +0 -0
  166. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/thread_local_test.py +0 -0
  167. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/timing.py +0 -0
  168. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/timing_test.py +0 -0
  169. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/value_location.py +0 -0
  170. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/utils/value_location_test.py +0 -0
  171. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/__init__.py +0 -0
  172. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/base.py +0 -0
  173. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/base_test.py +0 -0
  174. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/__init__.py +0 -0
  175. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/base.py +0 -0
  176. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/base_test.py +0 -0
  177. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/__init__.py +0 -0
  178. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/base.py +0 -0
  179. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/label.py +0 -0
  180. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/label_test.py +0 -0
  181. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/progress_bar.py +0 -0
  182. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/progress_bar_test.py +0 -0
  183. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/tooltip.py +0 -0
  184. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
  185. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/tree_view.py +0 -0
  186. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/core/views/html/tree_view_test.py +0 -0
  187. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/__init__.py +0 -0
  188. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/early_stopping/__init__.py +0 -0
  189. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/early_stopping/base.py +0 -0
  190. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/early_stopping/base_test.py +0 -0
  191. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/early_stopping/step_wise.py +0 -0
  192. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  193. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/__init__.py +0 -0
  194. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/base.py +0 -0
  195. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/hill_climb.py +0 -0
  196. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  197. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/mutators.py +0 -0
  198. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/mutators_test.py +0 -0
  199. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/neat.py +0 -0
  200. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/neat_test.py +0 -0
  201. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/nsga2.py +0 -0
  202. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/nsga2_test.py +0 -0
  203. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/recombinators.py +0 -0
  204. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/recombinators_test.py +0 -0
  205. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  206. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  207. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/selectors.py +0 -0
  208. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/selectors_test.py +0 -0
  209. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/where.py +0 -0
  210. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/evolution/where_test.py +0 -0
  211. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/mutfun/__init__.py +0 -0
  212. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/mutfun/base.py +0 -0
  213. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/mutfun/base_test.py +0 -0
  214. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/mutfun/basic_ops.py +0 -0
  215. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  216. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/__init__.py +0 -0
  217. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/base.py +0 -0
  218. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/base_test.py +0 -0
  219. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/maths.py +0 -0
  220. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/maths_test.py +0 -0
  221. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/randoms.py +0 -0
  222. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/randoms_test.py +0 -0
  223. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/step_wise.py +0 -0
  224. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove/ext/scalars/step_wise_test.py +0 -0
  225. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove.egg-info/SOURCES.txt +0 -0
  226. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove.egg-info/dependency_links.txt +0 -0
  227. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove.egg-info/requires.txt +0 -0
  228. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/pyglove.egg-info/top_level.txt +0 -0
  229. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/setup.cfg +0 -0
  230. {pyglove-0.5.0.dev202510290810 → pyglove-0.5.0.dev202511040811}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyglove
3
- Version: 0.5.0.dev202510290810
3
+ Version: 0.5.0.dev202511040811
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -506,8 +506,7 @@ class ListTest(unittest.TestCase):
506
506
  def test_index(self):
507
507
  sl = List([0, 1, 2, 1])
508
508
  self.assertEqual(sl.index(1), 1)
509
- with self.assertRaisesRegex(
510
- ValueError, '3 is not in list'):
509
+ with self.assertRaisesRegex(ValueError, '.* not in list'):
511
510
  _ = sl.index(3)
512
511
 
513
512
  # Index of inferred value is based on its symbolic form.
@@ -16,6 +16,7 @@
16
16
  import builtins
17
17
  import collections
18
18
  import inspect
19
+ import sys
19
20
  import types
20
21
  import typing
21
22
 
@@ -197,6 +198,8 @@ def annotation_from_str(
197
198
  def _resolve(type_id: str):
198
199
 
199
200
  def _as_forward_ref() -> typing.ForwardRef:
201
+ if sys.version_info >= (3, 14):
202
+ return typing.ForwardRef(type_id) # pytype: disable=not-callable
200
203
  return typing.ForwardRef(type_id, False, parent_module) # pytype: disable=not-callable
201
204
 
202
205
  def _resolve_name(name: str, parent_obj: typing.Any):
@@ -34,6 +34,12 @@ class Foo:
34
34
  _MODULE = sys.modules[__name__]
35
35
 
36
36
 
37
+ def typing_forward_ref(name: str) -> typing.ForwardRef:
38
+ if sys.version_info >= (3, 14):
39
+ return typing.ForwardRef(name)
40
+ return typing.ForwardRef(name, False, _MODULE)
41
+
42
+
37
43
  class AnnotationFromStrTest(unittest.TestCase):
38
44
  """Tests for annotation_from_str."""
39
45
 
@@ -69,7 +75,7 @@ class AnnotationFromStrTest(unittest.TestCase):
69
75
  )
70
76
  self.assertEqual(
71
77
  annotation_conversion.annotation_from_str('list[Foo.Baz]', _MODULE),
72
- list[typing.ForwardRef('Foo.Baz', False, _MODULE)]
78
+ list[typing_forward_ref('Foo.Baz')]
73
79
  )
74
80
 
75
81
  def test_generic_types(self):
@@ -138,18 +144,12 @@ class AnnotationFromStrTest(unittest.TestCase):
138
144
  self.assertEqual(
139
145
  annotation_conversion.annotation_from_str(
140
146
  'AAA', _MODULE),
141
- typing.ForwardRef(
142
- 'AAA', False, _MODULE
143
- )
147
+ typing_forward_ref('AAA')
144
148
  )
145
149
  self.assertEqual(
146
150
  annotation_conversion.annotation_from_str(
147
151
  'typing.List[AAA]', _MODULE),
148
- typing.List[
149
- typing.ForwardRef(
150
- 'AAA', False, _MODULE
151
- )
152
- ]
152
+ typing.List[typing_forward_ref('AAA')]
153
153
  )
154
154
 
155
155
  def test_reloading(self):
@@ -157,20 +157,12 @@ class AnnotationFromStrTest(unittest.TestCase):
157
157
  self.assertEqual(
158
158
  annotation_conversion.annotation_from_str(
159
159
  'typing.List[Foo]', _MODULE),
160
- typing.List[
161
- typing.ForwardRef(
162
- 'Foo', False, _MODULE
163
- )
164
- ]
160
+ typing.List[typing_forward_ref('Foo')]
165
161
  )
166
162
  self.assertEqual(
167
163
  annotation_conversion.annotation_from_str(
168
164
  'typing.List[Foo.Bar]', _MODULE),
169
- typing.List[
170
- typing.ForwardRef(
171
- 'Foo.Bar', False, _MODULE
172
- )
173
- ]
165
+ typing.List[typing_forward_ref('Foo.Bar')]
174
166
  )
175
167
  delattr(_MODULE, '__reloading__')
176
168
 
@@ -15,6 +15,7 @@
15
15
 
16
16
  import calendar
17
17
  import datetime
18
+ import sys
18
19
  from typing import Any, Callable, Optional, Tuple, Type, Union
19
20
 
20
21
  from pyglove.core import utils
@@ -135,9 +136,22 @@ def _register_builtin_converters():
135
136
  register_converter(int, float, float)
136
137
 
137
138
  # int <=> datetime.datetime.
138
- register_converter(int, datetime.datetime, datetime.datetime.utcfromtimestamp)
139
- register_converter(datetime.datetime, int,
140
- lambda x: calendar.timegm(x.timetuple()))
139
+ if sys.version_info >= (3, 11):
140
+ register_converter(
141
+ int,
142
+ datetime.datetime,
143
+ lambda x: datetime.datetime.fromtimestamp(x, datetime.UTC)
144
+ )
145
+ else:
146
+ register_converter(
147
+ int, datetime.datetime, datetime.datetime.utcfromtimestamp
148
+ )
149
+
150
+ register_converter(
151
+ datetime.datetime,
152
+ int,
153
+ lambda x: calendar.timegm(x.timetuple())
154
+ )
141
155
 
142
156
  # string <=> KeyPath.
143
157
  register_converter(str, utils.KeyPath, utils.KeyPath.parse)
@@ -130,7 +130,7 @@ class BuiltInConversionsTest(unittest.TestCase):
130
130
  def test_datetime_to_int(self):
131
131
  """Test built-in converter between int and datetime.datetime."""
132
132
  timestamp = calendar.timegm(datetime.datetime.now().timetuple())
133
- now = datetime.datetime.utcfromtimestamp(timestamp)
133
+ now = datetime.datetime.fromtimestamp(timestamp, datetime.UTC)
134
134
  self.assertEqual(vs.Object(datetime.datetime).apply(timestamp), now)
135
135
  self.assertEqual(vs.Int().apply(now), timestamp)
136
136
  self.assertEqual(
@@ -271,7 +271,8 @@ class JSONConvertibleTest(unittest.TestCase):
271
271
  self.assert_conversion_is(typing.List[typing.List[int]])
272
272
  self.assert_conversion_is(typing.Annotated[int, 'abc'])
273
273
  self.assert_conversion_is(typing.Dict[str, typing.Any])
274
- self.assert_conversion_is(typing.Union[int, str])
274
+ # From Python 3.14, union no longer preserves `is` identity.
275
+ self.assert_conversion_equal(typing.Union[int, str])
275
276
  self.assert_conversion_is(typing.Sequence[int])
276
277
  self.assert_conversion_is(typing.Set[int])
277
278
  self.assert_conversion_is(typing.FrozenSet[int])
@@ -158,6 +158,39 @@ class TabControl(HtmlControl):
158
158
  position='beforebegin',
159
159
  )
160
160
 
161
+ def remove(self, index_or_name: Union[int, str]) -> Tab:
162
+ """Removes a tab identified by index or name."""
163
+ index = self.indexof(index_or_name)
164
+ if index == -1:
165
+ raise ValueError(f'Tab not found: {index_or_name!r}')
166
+
167
+ with pg_flags.notify_on_change(False):
168
+ tab = self.tabs.pop(index)
169
+
170
+ self._run_javascript(
171
+ f"""
172
+ const button = document.querySelectorAll('#{self.element_id()}-button-group > .tab-button')[{index}];
173
+ if (button) {{
174
+ button.remove();
175
+ }}
176
+ const content = document.querySelectorAll('#{self.element_id()}-content-group > .tab-content')[{index}];
177
+ if (content) {{
178
+ content.remove();
179
+ }}
180
+ """
181
+ )
182
+
183
+ if not self.tabs:
184
+ self._sync_members(selected=0)
185
+ return tab
186
+
187
+ if self.selected == index:
188
+ new_selected = index - 1 if index == len(self.tabs) else index
189
+ self.select(max(0, new_selected))
190
+ elif self.selected > index:
191
+ self._sync_members(selected=self.selected - 1)
192
+ return tab
193
+
161
194
  def indexof(self, index_or_name: Union[int, str]) -> int:
162
195
  if isinstance(index_or_name, int):
163
196
  index = index_or_name
@@ -154,6 +154,43 @@ class TabControlTest(unittest.TestCase):
154
154
  self.assertEqual(len(scripts), 1)
155
155
  self.assertEqual(tab.selected, 1)
156
156
 
157
+ def test_remove(self):
158
+ tabs = [tab_lib.Tab(l, l, name=l) for l in ['a', 'b', 'c', 'd']]
159
+ tc = tab_lib.TabControl(tabs, selected='c')
160
+ self.assertEqual([t.name for t in tc.tabs], ['a', 'b', 'c', 'd'])
161
+ self.assertEqual(tc.selected, 2)
162
+
163
+ # Trigger rendering so scripts are tracked.
164
+ _ = tc.to_html()
165
+ with tc.track_scripts() as scripts:
166
+ tc.remove('b')
167
+ self.assertEqual(len(scripts), 1)
168
+ self.assertEqual([t.name for t in tc.tabs], ['a', 'c', 'd'])
169
+ self.assertEqual(tc.selected, 1)
170
+
171
+ with tc.track_scripts() as scripts:
172
+ # Remove currently selected tab 'c'
173
+ tc.remove('c')
174
+ # 1 script for remove, 1 for select.
175
+ self.assertEqual(len(scripts), 2)
176
+ self.assertEqual([t.name for t in tc.tabs], ['a', 'd'])
177
+ self.assertEqual(tc.selected, 1)
178
+
179
+ with tc.track_scripts() as scripts:
180
+ tc.remove(1)
181
+ self.assertEqual(len(scripts), 2)
182
+ self.assertEqual([t.name for t in tc.tabs], ['a'])
183
+ self.assertEqual(tc.selected, 0)
184
+
185
+ with tc.track_scripts() as scripts:
186
+ tc.remove('a')
187
+ self.assertEqual(len(scripts), 1)
188
+ self.assertEqual(tc.tabs, [])
189
+ self.assertEqual(tc.selected, 0)
190
+
191
+ with self.assertRaisesRegex(ValueError, 'Tab not found'):
192
+ tc.remove('x')
193
+
157
194
 
158
195
  if __name__ == '__main__':
159
196
  unittest.main()
@@ -57,7 +57,7 @@ class NextValue(base.Mutator):
57
57
  """A mutator to increase current DNA by 1."""
58
58
 
59
59
  def mutate(self, dna, step):
60
- return dna.next_dna()
60
+ return dna.next_dna() or dna
61
61
 
62
62
 
63
63
  def search_space():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyglove
3
- Version: 0.5.0.dev202510290810
3
+ Version: 0.5.0.dev202511040811
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors