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