pyglove 0.4.5.dev202501160330__tar.gz → 0.4.5.dev202501170808__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 (223) hide show
  1. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/PKG-INFO +1 -1
  2. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/derived_test.py +1 -1
  3. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/object.py +3 -0
  4. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/object_test.py +26 -0
  5. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/class_schema.py +41 -10
  6. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/class_schema_test.py +1 -0
  7. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove.egg-info/PKG-INFO +1 -1
  8. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/LICENSE +0 -0
  9. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/README.md +0 -0
  10. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/__init__.py +0 -0
  11. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/__init__.py +0 -0
  12. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/__init__.py +0 -0
  13. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/errors.py +0 -0
  14. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/errors_test.py +0 -0
  15. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/execution.py +0 -0
  16. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/execution_test.py +0 -0
  17. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/function_generation.py +0 -0
  18. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/function_generation_test.py +0 -0
  19. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/parsing.py +0 -0
  20. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/parsing_test.py +0 -0
  21. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/permissions.py +0 -0
  22. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/coding/permissions_test.py +0 -0
  23. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/detouring/__init__.py +0 -0
  24. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/detouring/class_detour.py +0 -0
  25. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/detouring/class_detour_test.py +0 -0
  26. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/__init__.py +0 -0
  27. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/base.py +0 -0
  28. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/base_test.py +0 -0
  29. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/categorical.py +0 -0
  30. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/categorical_test.py +0 -0
  31. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/custom.py +0 -0
  32. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/custom_test.py +0 -0
  33. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/deduping.py +0 -0
  34. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/deduping_test.py +0 -0
  35. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/dna_generator.py +0 -0
  36. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/dna_generator_test.py +0 -0
  37. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/numerical.py +0 -0
  38. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/numerical_test.py +0 -0
  39. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/random.py +0 -0
  40. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/random_test.py +0 -0
  41. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/space.py +0 -0
  42. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/space_test.py +0 -0
  43. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/sweeping.py +0 -0
  44. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/geno/sweeping_test.py +0 -0
  45. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/__init__.py +0 -0
  46. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/base.py +0 -0
  47. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/categorical.py +0 -0
  48. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/categorical_test.py +0 -0
  49. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/custom.py +0 -0
  50. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/custom_test.py +0 -0
  51. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/derived.py +0 -0
  52. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  53. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  54. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/evolvable.py +0 -0
  55. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/evolvable_test.py +0 -0
  56. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/iter.py +0 -0
  57. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/iter_test.py +0 -0
  58. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/numerical.py +0 -0
  59. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/numerical_test.py +0 -0
  60. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/object_template.py +0 -0
  61. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/hyper/object_template_test.py +0 -0
  62. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/io/__init__.py +0 -0
  63. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/io/file_system.py +0 -0
  64. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/io/file_system_test.py +0 -0
  65. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/io/sequence.py +0 -0
  66. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/io/sequence_test.py +0 -0
  67. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/logging.py +0 -0
  68. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/logging_test.py +0 -0
  69. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/patching/__init__.py +0 -0
  70. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/patching/object_factory.py +0 -0
  71. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/patching/object_factory_test.py +0 -0
  72. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/patching/pattern_based.py +0 -0
  73. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/patching/pattern_based_test.py +0 -0
  74. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/patching/rule_based.py +0 -0
  75. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/patching/rule_based_test.py +0 -0
  76. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/__init__.py +0 -0
  77. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/base.py +0 -0
  78. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/base_test.py +0 -0
  79. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/boilerplate.py +0 -0
  80. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  81. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/class_wrapper.py +0 -0
  82. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  83. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/compounding.py +0 -0
  84. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/compounding_test.py +0 -0
  85. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/contextual_object.py +0 -0
  86. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/contextual_object_test.py +0 -0
  87. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/dict.py +0 -0
  88. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/dict_test.py +0 -0
  89. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/diff.py +0 -0
  90. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/diff_test.py +0 -0
  91. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/flags.py +0 -0
  92. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/flags_test.py +0 -0
  93. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/functor.py +0 -0
  94. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/functor_test.py +0 -0
  95. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/inferred.py +0 -0
  96. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/inferred_test.py +0 -0
  97. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/list.py +0 -0
  98. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/list_test.py +0 -0
  99. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/origin.py +0 -0
  100. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/origin_test.py +0 -0
  101. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  102. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/ref.py +0 -0
  103. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/ref_test.py +0 -0
  104. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/symbolize.py +0 -0
  105. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/symbolic/symbolize_test.py +0 -0
  106. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/__init__.py +0 -0
  107. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/backend.py +0 -0
  108. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/backend_test.py +0 -0
  109. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/early_stopping.py +0 -0
  110. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/local_backend.py +0 -0
  111. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/protocols.py +0 -0
  112. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/protocols_test.py +0 -0
  113. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/sample.py +0 -0
  114. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/tuning/sample_test.py +0 -0
  115. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/__init__.py +0 -0
  116. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/annotated.py +0 -0
  117. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/annotated_test.py +0 -0
  118. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/annotation_conversion.py +0 -0
  119. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/annotation_conversion_test.py +0 -0
  120. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/callable_ext.py +0 -0
  121. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/callable_ext_test.py +0 -0
  122. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/callable_signature.py +0 -0
  123. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/callable_signature_test.py +0 -0
  124. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/custom_typing.py +0 -0
  125. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/inspect.py +0 -0
  126. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/inspect_test.py +0 -0
  127. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/key_specs.py +0 -0
  128. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/key_specs_test.py +0 -0
  129. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/pytype_support.py +0 -0
  130. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/type_conversion.py +0 -0
  131. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/type_conversion_test.py +0 -0
  132. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/typed_missing.py +0 -0
  133. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/typed_missing_test.py +0 -0
  134. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/value_specs.py +0 -0
  135. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/typing/value_specs_test.py +0 -0
  136. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/__init__.py +0 -0
  137. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/common_traits.py +0 -0
  138. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/common_traits_test.py +0 -0
  139. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/contextual.py +0 -0
  140. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/contextual_test.py +0 -0
  141. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/docstr_utils.py +0 -0
  142. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/docstr_utils_test.py +0 -0
  143. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/error_utils.py +0 -0
  144. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/error_utils_test.py +0 -0
  145. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/formatting.py +0 -0
  146. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/formatting_test.py +0 -0
  147. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/hierarchical.py +0 -0
  148. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/hierarchical_test.py +0 -0
  149. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/json_conversion.py +0 -0
  150. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/json_conversion_test.py +0 -0
  151. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/missing.py +0 -0
  152. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/missing_test.py +0 -0
  153. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/text_color.py +0 -0
  154. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/text_color_test.py +0 -0
  155. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/thread_local.py +0 -0
  156. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/thread_local_test.py +0 -0
  157. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/timing.py +0 -0
  158. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/timing_test.py +0 -0
  159. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/value_location.py +0 -0
  160. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/utils/value_location_test.py +0 -0
  161. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/__init__.py +0 -0
  162. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/base.py +0 -0
  163. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/base_test.py +0 -0
  164. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/__init__.py +0 -0
  165. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/base.py +0 -0
  166. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/base_test.py +0 -0
  167. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/__init__.py +0 -0
  168. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/base.py +0 -0
  169. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/label.py +0 -0
  170. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/label_test.py +0 -0
  171. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/progress_bar.py +0 -0
  172. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/progress_bar_test.py +0 -0
  173. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/tab.py +0 -0
  174. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/tab_test.py +0 -0
  175. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/tooltip.py +0 -0
  176. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
  177. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/tree_view.py +0 -0
  178. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/core/views/html/tree_view_test.py +0 -0
  179. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/__init__.py +0 -0
  180. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/early_stopping/__init__.py +0 -0
  181. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/early_stopping/base.py +0 -0
  182. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/early_stopping/base_test.py +0 -0
  183. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/early_stopping/step_wise.py +0 -0
  184. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  185. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/__init__.py +0 -0
  186. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/base.py +0 -0
  187. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/base_test.py +0 -0
  188. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/hill_climb.py +0 -0
  189. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  190. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/mutators.py +0 -0
  191. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/mutators_test.py +0 -0
  192. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/neat.py +0 -0
  193. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/neat_test.py +0 -0
  194. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/nsga2.py +0 -0
  195. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/nsga2_test.py +0 -0
  196. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/recombinators.py +0 -0
  197. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/recombinators_test.py +0 -0
  198. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  199. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  200. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/selectors.py +0 -0
  201. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/selectors_test.py +0 -0
  202. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/where.py +0 -0
  203. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/evolution/where_test.py +0 -0
  204. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/mutfun/__init__.py +0 -0
  205. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/mutfun/base.py +0 -0
  206. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/mutfun/base_test.py +0 -0
  207. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/mutfun/basic_ops.py +0 -0
  208. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  209. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/__init__.py +0 -0
  210. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/base.py +0 -0
  211. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/base_test.py +0 -0
  212. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/maths.py +0 -0
  213. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/maths_test.py +0 -0
  214. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/randoms.py +0 -0
  215. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/randoms_test.py +0 -0
  216. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/step_wise.py +0 -0
  217. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove/ext/scalars/step_wise_test.py +0 -0
  218. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove.egg-info/SOURCES.txt +0 -0
  219. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove.egg-info/dependency_links.txt +0 -0
  220. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove.egg-info/requires.txt +0 -0
  221. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/pyglove.egg-info/top_level.txt +0 -0
  222. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/setup.cfg +0 -0
  223. {pyglove-0.4.5.dev202501160330 → pyglove-0.4.5.dev202501170808}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202501160330
3
+ Version: 0.4.5.dev202501170808
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -120,7 +120,7 @@ class ValueReferenceTest(unittest.TestCase):
120
120
  sd.y = ValueReference(['x'])
121
121
  # TODO(daiyip): Enable this test once static analysis is done
122
122
  # on derived values.
123
- # with self.assertRaisesRegexp(
123
+ # with self.assertRaisesRegex(
124
124
  # TypeError, ''):
125
125
  # sd.z = ValueReference(['x'])
126
126
 
@@ -96,6 +96,7 @@ class ObjectMeta(abc.ABCMeta):
96
96
  base_schema_list=[cls.__schema__] if extend else [],
97
97
  allow_nonconst_keys=True,
98
98
  metadata=metadata,
99
+ for_cls=cls,
99
100
  )
100
101
  cls.apply_schema(schema)
101
102
 
@@ -193,6 +194,7 @@ class ObjectMeta(abc.ABCMeta):
193
194
  field.value.freeze(attr_value, apply_before_use=False)
194
195
  else:
195
196
  field.value.set_default(attr_value)
197
+ field.set_origin(cls)
196
198
 
197
199
 
198
200
  # Use ObjectMeta as meta class to inherit schema and type_name property.
@@ -344,6 +346,7 @@ class Object(base.Symbolic, metaclass=ObjectMeta):
344
346
  base_schema_list=base_schema_list,
345
347
  allow_nonconst_keys=True,
346
348
  metadata={},
349
+ for_cls=user_cls,
347
350
  )
348
351
 
349
352
  # Freeze callable symbolic attributes if they are provided as methods.
@@ -1914,6 +1914,32 @@ class InheritanceTest(unittest.TestCase):
1914
1914
  self.assertEqual(d.x, 'foo')
1915
1915
  self.assertEqual(d.foo(), 'B')
1916
1916
 
1917
+ def test_multi_inheritance2(self):
1918
+
1919
+ class A(Object):
1920
+ x: typing.Callable[[], Any]
1921
+
1922
+ class B(A):
1923
+ def x(self):
1924
+ return 1
1925
+
1926
+ class C(A):
1927
+ pass
1928
+
1929
+ class D(C, B):
1930
+ pass
1931
+
1932
+ self.assertIs(D.__schema__['x'].default_value, B.x)
1933
+
1934
+ class E(A):
1935
+ def x(self):
1936
+ return 2
1937
+
1938
+ class F(E, B):
1939
+ pass
1940
+
1941
+ self.assertIs(F.__schema__['x'].default_value, E.x)
1942
+
1917
1943
 
1918
1944
  class InitSignatureTest(unittest.TestCase):
1919
1945
  """Tests for `pg.Object.__init__` signature."""
@@ -593,7 +593,9 @@ class Field(utils.Formattable, utils.JSONConvertible):
593
593
  key_spec: Union[KeySpec, str],
594
594
  value_spec: ValueSpec,
595
595
  description: Optional[str] = None,
596
- metadata: Optional[Dict[str, Any]] = None):
596
+ metadata: Optional[Dict[str, Any]] = None,
597
+ origin: Optional[Type[Any]] = None,
598
+ ) -> None:
597
599
  """Constructor.
598
600
 
599
601
  Args:
@@ -602,6 +604,7 @@ class Field(utils.Formattable, utils.JSONConvertible):
602
604
  value_spec: Value specification of the field.
603
605
  description: Description of the field.
604
606
  metadata: A dict of objects as metadata for the field.
607
+ origin: The class that this field originates from.
605
608
 
606
609
  Raises:
607
610
  ValueError: metadata is not a dict.
@@ -612,6 +615,7 @@ class Field(utils.Formattable, utils.JSONConvertible):
612
615
  self._key = key_spec
613
616
  self._value = value_spec
614
617
  self._description = description
618
+ self._origin = origin
615
619
 
616
620
  if metadata and not isinstance(metadata, dict):
617
621
  raise ValueError('metadata must be a dict.')
@@ -667,6 +671,15 @@ class Field(utils.Formattable, utils.JSONConvertible):
667
671
  """
668
672
  return self._metadata
669
673
 
674
+ @property
675
+ def origin(self) -> Optional[Type[Any]]:
676
+ """The class that this field originates from."""
677
+ return self._origin
678
+
679
+ def set_origin(self, origin: Type[Any]) -> None:
680
+ """Sets the origin (source class) of this field."""
681
+ self._origin = origin
682
+
670
683
  def extend(self, base_field: 'Field') -> 'Field':
671
684
  """Extend current field based on a base field."""
672
685
  self.key.extend(base_field.key)
@@ -745,6 +758,7 @@ class Field(utils.Formattable, utils.JSONConvertible):
745
758
  ('value', self._value, None),
746
759
  ('description', self._description, None),
747
760
  ('metadata', self._metadata, {}),
761
+ ('origin', self._origin, None),
748
762
  ],
749
763
  label=self.__class__.__name__,
750
764
  compact=compact,
@@ -869,7 +883,9 @@ class Schema(utils.Formattable, utils.JSONConvertible):
869
883
  description: Optional[str] = None,
870
884
  *,
871
885
  allow_nonconst_keys: bool = False,
872
- metadata: Optional[Dict[str, Any]] = None):
886
+ metadata: Optional[Dict[str, Any]] = None,
887
+ for_cls: Optional[Type[Any]] = None,
888
+ ):
873
889
  """Constructor.
874
890
 
875
891
  Args:
@@ -882,6 +898,7 @@ class Schema(utils.Formattable, utils.JSONConvertible):
882
898
  description: Optional str as the description for the schema.
883
899
  allow_nonconst_keys: Whether immediate fields can use non-const keys.
884
900
  metadata: Optional dict of user objects as schema-level metadata.
901
+ for_cls: Optional class that this schema applies to.
885
902
 
886
903
  Raises:
887
904
  TypeError: Argument `fields` is not a list.
@@ -903,6 +920,11 @@ class Schema(utils.Formattable, utils.JSONConvertible):
903
920
  self._description = description
904
921
  self._metadata = metadata or {}
905
922
 
923
+ if for_cls is not None:
924
+ for f in fields:
925
+ if f.origin is None:
926
+ f.set_origin(for_cls)
927
+
906
928
  self._dynamic_field = None
907
929
  for f in fields:
908
930
  if not f.key.is_const:
@@ -938,21 +960,27 @@ class Schema(utils.Formattable, utils.JSONConvertible):
938
960
  Returns:
939
961
  The merged schema.
940
962
  """
941
- field_names = set()
942
- fields = []
963
+ fields = {}
943
964
  kw_field = None
944
965
  for schema in schema_list:
945
966
  for key, field in schema.fields.items():
946
- if key.is_const and key not in field_names:
947
- fields.append(field)
948
- field_names.add(key)
949
- elif not key.is_const and kw_field is None:
967
+ if key.is_const:
968
+ if key not in fields or (
969
+ field.origin is not None
970
+ and fields[key].origin is not None
971
+ and issubclass(field.origin, fields[key].origin)
972
+ ):
973
+ fields[key] = field
974
+ elif kw_field is None:
950
975
  kw_field = field
951
976
 
952
977
  if kw_field is not None:
953
- fields.append(kw_field)
978
+ fields[kw_field.key] = kw_field
954
979
  return Schema(
955
- fields, name=name, description=description, allow_nonconst_keys=True
980
+ list(fields.values()),
981
+ name=name,
982
+ description=description,
983
+ allow_nonconst_keys=True
956
984
  )
957
985
 
958
986
  def extend(self, base: 'Schema') -> 'Schema':
@@ -1415,6 +1443,7 @@ def create_schema(
1415
1443
  allow_nonconst_keys: bool = False,
1416
1444
  metadata: Optional[Dict[str, Any]] = None,
1417
1445
  description: Optional[str] = None,
1446
+ for_cls: Optional[Type[Any]] = None,
1418
1447
  parent_module: Optional[types.ModuleType] = None
1419
1448
  ) -> Schema:
1420
1449
  """Creates ``Schema`` from a list of ``Field``s or equivalences.
@@ -1456,6 +1485,7 @@ def create_schema(
1456
1485
  allow_nonconst_keys: Whether to allow non const keys in schema.
1457
1486
  metadata: Optional dict of user objects as schema-level metadata.
1458
1487
  description: Optional description of the schema.
1488
+ for_cls: (Optional) the class that this schema applies to.
1459
1489
  parent_module: (Optional) parent module for defining this schema, which will
1460
1490
  be used for forward reference lookup.
1461
1491
 
@@ -1479,6 +1509,7 @@ def create_schema(
1479
1509
  allow_nonconst_keys=allow_nonconst_keys,
1480
1510
  metadata=metadata,
1481
1511
  description=description,
1512
+ for_cls=for_cls,
1482
1513
  )
1483
1514
 
1484
1515
 
@@ -107,6 +107,7 @@ class FieldTest(unittest.TestCase):
107
107
  self.assertEqual(f.description, 'a field')
108
108
  self.assertIsInstance(f.metadata, dict)
109
109
  self.assertEqual(len(f.metadata), 0)
110
+ self.assertIsNone(f.origin)
110
111
 
111
112
  # Cover the self comparison in __eq__.
112
113
  self.assertEqual(f, f)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202501160330
3
+ Version: 0.4.5.dev202501170808
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors