pyglove 0.4.5.dev202412110809__tar.gz → 0.4.5.dev202412130809__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 (208) hide show
  1. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/PKG-INFO +5 -2
  2. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/README.md +4 -1
  3. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/label.py +1 -1
  4. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/label_test.py +6 -6
  5. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/progress_bar_test.py +2 -2
  6. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/tab.py +80 -1
  7. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/tab_test.py +34 -1
  8. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove.egg-info/PKG-INFO +5 -2
  9. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/LICENSE +0 -0
  10. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/__init__.py +0 -0
  11. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/__init__.py +0 -0
  12. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/detouring/__init__.py +0 -0
  13. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/detouring/class_detour.py +0 -0
  14. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/detouring/class_detour_test.py +0 -0
  15. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/__init__.py +0 -0
  16. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/base.py +0 -0
  17. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/base_test.py +0 -0
  18. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/categorical.py +0 -0
  19. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/categorical_test.py +0 -0
  20. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/custom.py +0 -0
  21. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/custom_test.py +0 -0
  22. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/deduping.py +0 -0
  23. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/deduping_test.py +0 -0
  24. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/dna_generator.py +0 -0
  25. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/dna_generator_test.py +0 -0
  26. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/numerical.py +0 -0
  27. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/numerical_test.py +0 -0
  28. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/random.py +0 -0
  29. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/random_test.py +0 -0
  30. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/space.py +0 -0
  31. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/space_test.py +0 -0
  32. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/sweeping.py +0 -0
  33. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/geno/sweeping_test.py +0 -0
  34. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/__init__.py +0 -0
  35. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/base.py +0 -0
  36. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/categorical.py +0 -0
  37. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/categorical_test.py +0 -0
  38. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/custom.py +0 -0
  39. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/custom_test.py +0 -0
  40. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/derived.py +0 -0
  41. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/derived_test.py +0 -0
  42. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  43. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  44. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/evolvable.py +0 -0
  45. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/evolvable_test.py +0 -0
  46. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/iter.py +0 -0
  47. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/iter_test.py +0 -0
  48. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/numerical.py +0 -0
  49. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/numerical_test.py +0 -0
  50. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/object_template.py +0 -0
  51. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/hyper/object_template_test.py +0 -0
  52. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/io/__init__.py +0 -0
  53. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/io/file_system.py +0 -0
  54. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/io/file_system_test.py +0 -0
  55. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/io/sequence.py +0 -0
  56. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/io/sequence_test.py +0 -0
  57. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/logging.py +0 -0
  58. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/logging_test.py +0 -0
  59. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/__init__.py +0 -0
  60. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/codegen.py +0 -0
  61. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/codegen_test.py +0 -0
  62. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/common_traits.py +0 -0
  63. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/common_traits_test.py +0 -0
  64. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/docstr_utils.py +0 -0
  65. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/docstr_utils_test.py +0 -0
  66. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/error_utils.py +0 -0
  67. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/error_utils_test.py +0 -0
  68. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/formatting.py +0 -0
  69. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/formatting_test.py +0 -0
  70. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/hierarchical.py +0 -0
  71. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/hierarchical_test.py +0 -0
  72. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/json_conversion.py +0 -0
  73. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/json_conversion_test.py +0 -0
  74. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/missing.py +0 -0
  75. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/missing_test.py +0 -0
  76. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/thread_local.py +0 -0
  77. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/thread_local_test.py +0 -0
  78. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/timing.py +0 -0
  79. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/timing_test.py +0 -0
  80. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/value_location.py +0 -0
  81. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/object_utils/value_location_test.py +0 -0
  82. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/patching/__init__.py +0 -0
  83. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/patching/object_factory.py +0 -0
  84. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/patching/object_factory_test.py +0 -0
  85. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/patching/pattern_based.py +0 -0
  86. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/patching/pattern_based_test.py +0 -0
  87. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/patching/rule_based.py +0 -0
  88. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/patching/rule_based_test.py +0 -0
  89. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/__init__.py +0 -0
  90. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/base.py +0 -0
  91. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/base_test.py +0 -0
  92. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/boilerplate.py +0 -0
  93. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  94. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/class_wrapper.py +0 -0
  95. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  96. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/compounding.py +0 -0
  97. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/compounding_test.py +0 -0
  98. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/dict.py +0 -0
  99. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/dict_test.py +0 -0
  100. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/diff.py +0 -0
  101. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/diff_test.py +0 -0
  102. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/flags.py +0 -0
  103. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/flags_test.py +0 -0
  104. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/functor.py +0 -0
  105. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/functor_test.py +0 -0
  106. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/inferred.py +0 -0
  107. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/inferred_test.py +0 -0
  108. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/list.py +0 -0
  109. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/list_test.py +0 -0
  110. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/object.py +0 -0
  111. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/object_test.py +0 -0
  112. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/origin.py +0 -0
  113. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/origin_test.py +0 -0
  114. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  115. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/ref.py +0 -0
  116. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/ref_test.py +0 -0
  117. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/symbolize.py +0 -0
  118. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/symbolic/symbolize_test.py +0 -0
  119. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/__init__.py +0 -0
  120. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/backend.py +0 -0
  121. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/backend_test.py +0 -0
  122. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/early_stopping.py +0 -0
  123. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/local_backend.py +0 -0
  124. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/protocols.py +0 -0
  125. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/protocols_test.py +0 -0
  126. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/sample.py +0 -0
  127. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/tuning/sample_test.py +0 -0
  128. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/__init__.py +0 -0
  129. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/annotated.py +0 -0
  130. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/annotated_test.py +0 -0
  131. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/annotation_conversion.py +0 -0
  132. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/annotation_conversion_test.py +0 -0
  133. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/callable_ext.py +0 -0
  134. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/callable_ext_test.py +0 -0
  135. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/callable_signature.py +0 -0
  136. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/callable_signature_test.py +0 -0
  137. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/class_schema.py +0 -0
  138. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/class_schema_test.py +0 -0
  139. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/custom_typing.py +0 -0
  140. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/inspect.py +0 -0
  141. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/inspect_test.py +0 -0
  142. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/key_specs.py +0 -0
  143. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/key_specs_test.py +0 -0
  144. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/pytype_support.py +0 -0
  145. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/type_conversion.py +0 -0
  146. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/type_conversion_test.py +0 -0
  147. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/typed_missing.py +0 -0
  148. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/typed_missing_test.py +0 -0
  149. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/value_specs.py +0 -0
  150. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/typing/value_specs_test.py +0 -0
  151. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/__init__.py +0 -0
  152. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/base.py +0 -0
  153. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/base_test.py +0 -0
  154. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/__init__.py +0 -0
  155. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/base.py +0 -0
  156. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/base_test.py +0 -0
  157. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/__init__.py +0 -0
  158. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/base.py +0 -0
  159. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/progress_bar.py +0 -0
  160. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/tooltip.py +0 -0
  161. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
  162. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/tree_view.py +0 -0
  163. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/core/views/html/tree_view_test.py +0 -0
  164. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/__init__.py +0 -0
  165. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/early_stopping/__init__.py +0 -0
  166. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/early_stopping/base.py +0 -0
  167. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/early_stopping/base_test.py +0 -0
  168. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/early_stopping/step_wise.py +0 -0
  169. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  170. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/__init__.py +0 -0
  171. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/base.py +0 -0
  172. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/base_test.py +0 -0
  173. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/hill_climb.py +0 -0
  174. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  175. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/mutators.py +0 -0
  176. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/mutators_test.py +0 -0
  177. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/neat.py +0 -0
  178. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/neat_test.py +0 -0
  179. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/nsga2.py +0 -0
  180. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/nsga2_test.py +0 -0
  181. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/recombinators.py +0 -0
  182. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/recombinators_test.py +0 -0
  183. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  184. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  185. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/selectors.py +0 -0
  186. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/selectors_test.py +0 -0
  187. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/where.py +0 -0
  188. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/evolution/where_test.py +0 -0
  189. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/mutfun/__init__.py +0 -0
  190. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/mutfun/base.py +0 -0
  191. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/mutfun/base_test.py +0 -0
  192. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/mutfun/basic_ops.py +0 -0
  193. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  194. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/__init__.py +0 -0
  195. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/base.py +0 -0
  196. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/base_test.py +0 -0
  197. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/maths.py +0 -0
  198. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/maths_test.py +0 -0
  199. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/randoms.py +0 -0
  200. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/randoms_test.py +0 -0
  201. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/step_wise.py +0 -0
  202. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove/ext/scalars/step_wise_test.py +0 -0
  203. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove.egg-info/SOURCES.txt +0 -0
  204. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove.egg-info/dependency_links.txt +0 -0
  205. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove.egg-info/requires.txt +0 -0
  206. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/pyglove.egg-info/top_level.txt +0 -0
  207. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/setup.cfg +0 -0
  208. {pyglove-0.4.5.dev202412110809 → pyglove-0.4.5.dev202412130809}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202412110809
3
+ Version: 0.4.5.dev202412130809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -72,7 +72,7 @@ It's commonly used in:
72
72
  PyGlove has been [published](https://proceedings.neurips.cc/paper/2020/file/012a91467f210472fab4e11359bbfef6-Paper.pdf)
73
73
  at NeurIPS 2020. It is widely used within [Alphabet](https://abc.xyz/), including Google Research, Google Cloud, Youtube and Waymo.
74
74
 
75
- PyGlove is developed by Daiyi Peng and colleagues in [Google Brain Team](https://research.google/teams/brain/).
75
+ PyGlove is developed by Daiyi Peng and colleagues at [Google Brain](https://research.google/teams/brain/).
76
76
 
77
77
 
78
78
  ## Hello PyGlove
@@ -145,6 +145,9 @@ pip install pyglove --pre
145
145
  * [Interactive SVG: Components for Direct Manipulation](https://github.com/google/pyglove/blob/main/docs/notebooks/python/interactive_svg.ipynb)
146
146
  * [Where is the Duck: Developing Context-aware Component](https://github.com/google/pyglove/blob/main/docs/notebooks/python/where_is_the_duck.ipynb)
147
147
 
148
+ * Interactive Programming
149
+ * [Viewing PyGlove objects in HTML](https://colab.research.google.com/github/google/pyglove/blob/main/docs/notebooks/gui/html_view.ipynb)
150
+
148
151
  ## Citing PyGlove
149
152
 
150
153
  ```
@@ -47,7 +47,7 @@ It's commonly used in:
47
47
  PyGlove has been [published](https://proceedings.neurips.cc/paper/2020/file/012a91467f210472fab4e11359bbfef6-Paper.pdf)
48
48
  at NeurIPS 2020. It is widely used within [Alphabet](https://abc.xyz/), including Google Research, Google Cloud, Youtube and Waymo.
49
49
 
50
- PyGlove is developed by Daiyi Peng and colleagues in [Google Brain Team](https://research.google/teams/brain/).
50
+ PyGlove is developed by Daiyi Peng and colleagues at [Google Brain](https://research.google/teams/brain/).
51
51
 
52
52
 
53
53
  ## Hello PyGlove
@@ -120,6 +120,9 @@ pip install pyglove --pre
120
120
  * [Interactive SVG: Components for Direct Manipulation](https://github.com/google/pyglove/blob/main/docs/notebooks/python/interactive_svg.ipynb)
121
121
  * [Where is the Duck: Developing Context-aware Component](https://github.com/google/pyglove/blob/main/docs/notebooks/python/where_is_the_duck.ipynb)
122
122
 
123
+ * Interactive Programming
124
+ * [Viewing PyGlove objects in HTML](https://colab.research.google.com/github/google/pyglove/blob/main/docs/notebooks/gui/html_view.ipynb)
125
+
123
126
  ## Citing PyGlove
124
127
 
125
128
  ```
@@ -74,7 +74,7 @@ class Label(HtmlControl):
74
74
 
75
75
  def _to_html(self, **kwargs) -> Html:
76
76
  text_elem = Html.element(
77
- 'a',
77
+ 'a' if self.link is not None else 'span',
78
78
  [self.text],
79
79
  id=self.element_id(),
80
80
  href=self.link,
@@ -34,7 +34,7 @@ class LabelTest(TestCase):
34
34
  label = label_lib.Label('foo')
35
35
  self.assertIsNone(label.tooltip)
36
36
  self.assertIsNone(label.link)
37
- self.assert_html_content(label, '<a class="label">foo</a>')
37
+ self.assert_html_content(label, '<span class="label">foo</span>')
38
38
  with self.assertRaisesRegex(ValueError, 'Non-interactive .*'):
39
39
  label.update('bar')
40
40
 
@@ -54,7 +54,7 @@ class LabelTest(TestCase):
54
54
  self.assert_html_content(
55
55
  label,
56
56
  (
57
- '<div class="label-container"><a class="label">foo</a>'
57
+ '<div class="label-container"><span class="label">foo</span>'
58
58
  '<span class="tooltip">bar</span></div>'
59
59
  )
60
60
  )
@@ -130,7 +130,7 @@ class LabelTest(TestCase):
130
130
 
131
131
  def test_badge(self):
132
132
  badge = label_lib.Badge('foo')
133
- self.assert_html_content(badge, '<a class="label badge">foo</a>')
133
+ self.assert_html_content(badge, '<span class="label badge">foo</span>')
134
134
 
135
135
 
136
136
  class LabelGroupTest(TestCase):
@@ -140,9 +140,9 @@ class LabelGroupTest(TestCase):
140
140
  self.assert_html_content(
141
141
  group,
142
142
  (
143
- '<div class="label-group"><a class="label group-name">baz</a>'
144
- '<a class="label group-value">foo</a>'
145
- '<a class="label group-value">bar</a></div>'
143
+ '<div class="label-group"><span class="label group-name">baz</span>'
144
+ '<span class="label group-value">foo</span>'
145
+ '<span class="label group-value">bar</span></div>'
146
146
  )
147
147
  )
148
148
 
@@ -42,8 +42,8 @@ class ProgressBarTest(unittest.TestCase):
42
42
  f'<div class="sub-progress foo" id="{bar["foo"].element_id()}">'
43
43
  '</div><div class="sub-progress bar" '
44
44
  f'id="{bar["bar"].element_id()}"></div></div>'
45
- '<div class="label-container"><a class="label progress-label"'
46
- f' id="{bar._progress_label.element_id()}">n/a</a><span class='
45
+ '<div class="label-container"><span class="label progress-label"'
46
+ f' id="{bar._progress_label.element_id()}">n/a</span><span class='
47
47
  f'"tooltip" id="{bar._progress_label.tooltip.element_id()}">'
48
48
  'Not started</span></div></div>'
49
49
  )
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  """Tab control."""
15
15
 
16
- from typing import Annotated, List, Literal, Union
16
+ from typing import Annotated, List, Literal, Optional, Union
17
17
 
18
18
  from pyglove.core.symbolic import flags as pg_flags
19
19
  from pyglove.core.symbolic import object as pg_object
@@ -44,6 +44,11 @@ class Tab(pg_object.Object):
44
44
  'The CSS classes of the tab.'
45
45
  ] = []
46
46
 
47
+ name: Annotated[
48
+ Optional[str],
49
+ 'An optional name that can be used to identify a tab under a tab control'
50
+ ] = None
51
+
47
52
 
48
53
  @pg_object.use_init_args(
49
54
  ['tabs', 'selected', 'tab_position', 'id', 'css_classes', 'styles']
@@ -87,10 +92,84 @@ class TabControl(HtmlControl):
87
92
  position='beforeend',
88
93
  )
89
94
 
95
+ def insert(self, index_or_name: Union[int, str], tab: Tab) -> None:
96
+ """Inserts a tab before a tab identified by index or name."""
97
+ index = self.indexof(index_or_name)
98
+ if index == -1:
99
+ raise ValueError(f'Tab not found: {index_or_name!r}')
100
+ with pg_flags.notify_on_change(False):
101
+ self.tabs.insert(index, tab)
102
+
103
+ self._insert_adjacent_html(
104
+ f"""
105
+ const elem = document.querySelectorAll('#{self.element_id()}-button-group > .tab-button')[{index}];
106
+ """,
107
+ self._tab_button(tab, len(self.tabs) - 1),
108
+ position='beforebegin',
109
+ )
110
+ self._insert_adjacent_html(
111
+ f"""
112
+ const elem = document.querySelectorAll('#{self.element_id()}-content-group > .tab-content')[{index}];
113
+ """,
114
+ self._tab_content(tab, len(self.tabs) - 1),
115
+ position='beforebegin',
116
+ )
117
+
118
+ def indexof(self, index_or_name: Union[int, str]) -> int:
119
+ if isinstance(index_or_name, int):
120
+ index = index_or_name
121
+ if index >= len(self.tabs):
122
+ return len(self.tabs) - 1
123
+ elif index < -len(self.tabs):
124
+ return -1
125
+ elif index < 0:
126
+ index = index + len(self.tabs)
127
+ return index
128
+ else:
129
+ name = index_or_name
130
+ assert isinstance(name, str), name
131
+ for i, tab in enumerate(self.tabs):
132
+ if tab.name == name:
133
+ return i
134
+ return -1
135
+
90
136
  def extend(self, tabs: List[Tab]) -> None:
91
137
  for tab in tabs:
92
138
  self.append(tab)
93
139
 
140
+ def select(
141
+ self,
142
+ index_or_name: Union[int, str, List[str]]) -> Union[int, str]:
143
+ """Selects a tab identified by an index or name.
144
+
145
+ Args:
146
+ index_or_name: The index or name of the tab to select. If a list of names
147
+ is provided, the first name in the list that is found will be selected.
148
+
149
+ Returns:
150
+ The index (if the index was provided) or name of the selected tab.
151
+ """
152
+ selected_name = index_or_name if isinstance(index_or_name, str) else None
153
+ index = -1
154
+ if isinstance(index_or_name, list):
155
+ for name in index_or_name:
156
+ index = self.indexof(name)
157
+ if index != -1:
158
+ selected_name = name
159
+ break
160
+ else:
161
+ index = self.indexof(index_or_name)
162
+ if index == -1:
163
+ raise ValueError(f'Tab not found: {index_or_name!r}')
164
+ self._sync_members(selected=index)
165
+ self._run_javascript(
166
+ f"""
167
+ const tabButtons = document.querySelectorAll('#{self.element_id()}-button-group > .tab-button');
168
+ tabButtons[{index}].click();
169
+ """
170
+ )
171
+ return selected_name or index
172
+
94
173
  def _to_html(self, **kwargs):
95
174
  return Html.element(
96
175
  'table',
@@ -36,7 +36,7 @@ class TabControlTest(unittest.TestCase):
36
36
  elem_id = tab.element_id()
37
37
  self.assert_html_content(
38
38
  tab,
39
- f"""<table class="tab-control"><tr><td><div class="tab-button-group top" id="{elem_id}-button-group"><button class="tab-button selected foo" onclick="openTab(event, '{elem_id}', '{elem_id}-0')"><a class="label">foo</a></button><button class="tab-button" onclick="openTab(event, '{elem_id}', '{elem_id}-1')"><a class="label">bar</a></button></div></td></tr><tr><td><div class="tab-content-group top" id="{elem_id}-content-group"><div class="tab-content selected foo" id="{elem_id}-0"><h1>foo</h1></div><div class="tab-content" id="{elem_id}-1"><h1>bar</h1></div></div></td></tr></table>"""
39
+ f"""<table class="tab-control"><tr><td><div class="tab-button-group top" id="{elem_id}-button-group"><button class="tab-button selected foo" onclick="openTab(event, '{elem_id}', '{elem_id}-0')"><span class="label">foo</span></button><button class="tab-button" onclick="openTab(event, '{elem_id}', '{elem_id}-1')"><span class="label">bar</span></button></div></td></tr><tr><td><div class="tab-content-group top" id="{elem_id}-content-group"><div class="tab-content selected foo" id="{elem_id}-0"><h1>foo</h1></div><div class="tab-content" id="{elem_id}-1"><h1>bar</h1></div></div></td></tr></table>"""
40
40
  )
41
41
  with tab.track_scripts() as scripts:
42
42
  tab.extend([
@@ -48,6 +48,39 @@ class TabControlTest(unittest.TestCase):
48
48
  tab_lib.Tab('qux', base.Html('<h1>qux</h1>')),
49
49
  ])
50
50
  self.assertEqual(len(scripts), 6)
51
+ with tab.track_scripts() as scripts:
52
+ tab.insert(0, tab_lib.Tab('x', 'foo', name='x'))
53
+ self.assertEqual(len(scripts), 2)
54
+ self.assertEqual(len(tab.tabs), 5)
55
+ self.assertEqual(tab.indexof(-1), 4)
56
+ self.assertEqual(tab.indexof(3), 3)
57
+ self.assertEqual(tab.indexof(10), 4)
58
+ self.assertEqual(tab.indexof(-10), -1)
59
+ self.assertEqual(tab.indexof('x'), 0)
60
+ self.assertEqual(tab.indexof('y'), -1)
61
+ self.assertEqual(tab.select(0), 0)
62
+ self.assertEqual(tab.select('x'), 'x')
63
+ self.assertEqual(tab.select(['y', 'x']), 'x')
64
+
65
+ with self.assertRaisesRegex(ValueError, 'Tab not found'):
66
+ tab.select('y')
67
+ with self.assertRaisesRegex(ValueError, 'Tab not found'):
68
+ tab.insert('y', tab_lib.Tab('z', 'bar'))
69
+
70
+ with tab.track_scripts() as scripts:
71
+ tab.insert('x', tab_lib.Tab('y', 'bar'))
72
+ self.assertEqual(len(scripts), 2)
73
+ self.assertEqual(len(tab.tabs), 6)
74
+
75
+ with tab.track_scripts() as scripts:
76
+ tab.select(3)
77
+ self.assertEqual(len(scripts), 1)
78
+ self.assertEqual(tab.selected, 3)
79
+
80
+ with tab.track_scripts() as scripts:
81
+ tab.select('x')
82
+ self.assertEqual(len(scripts), 1)
83
+ self.assertEqual(tab.selected, 1)
51
84
 
52
85
 
53
86
  if __name__ == '__main__':
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202412110809
3
+ Version: 0.4.5.dev202412130809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -72,7 +72,7 @@ It's commonly used in:
72
72
  PyGlove has been [published](https://proceedings.neurips.cc/paper/2020/file/012a91467f210472fab4e11359bbfef6-Paper.pdf)
73
73
  at NeurIPS 2020. It is widely used within [Alphabet](https://abc.xyz/), including Google Research, Google Cloud, Youtube and Waymo.
74
74
 
75
- PyGlove is developed by Daiyi Peng and colleagues in [Google Brain Team](https://research.google/teams/brain/).
75
+ PyGlove is developed by Daiyi Peng and colleagues at [Google Brain](https://research.google/teams/brain/).
76
76
 
77
77
 
78
78
  ## Hello PyGlove
@@ -145,6 +145,9 @@ pip install pyglove --pre
145
145
  * [Interactive SVG: Components for Direct Manipulation](https://github.com/google/pyglove/blob/main/docs/notebooks/python/interactive_svg.ipynb)
146
146
  * [Where is the Duck: Developing Context-aware Component](https://github.com/google/pyglove/blob/main/docs/notebooks/python/where_is_the_duck.ipynb)
147
147
 
148
+ * Interactive Programming
149
+ * [Viewing PyGlove objects in HTML](https://colab.research.google.com/github/google/pyglove/blob/main/docs/notebooks/gui/html_view.ipynb)
150
+
148
151
  ## Citing PyGlove
149
152
 
150
153
  ```