pyglove 0.4.5.dev202502020807__tar.gz → 0.4.5.dev202502040809__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.dev202502020807 → pyglove-0.4.5.dev202502040809}/PKG-INFO +1 -1
  2. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/inspect.py +16 -0
  3. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/inspect_test.py +48 -1
  4. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/type_conversion.py +9 -4
  5. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/type_conversion_test.py +5 -0
  6. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove.egg-info/PKG-INFO +1 -1
  7. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/LICENSE +0 -0
  8. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/README.md +0 -0
  9. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/__init__.py +0 -0
  10. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/__init__.py +0 -0
  11. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/__init__.py +0 -0
  12. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/errors.py +0 -0
  13. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/errors_test.py +0 -0
  14. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/execution.py +0 -0
  15. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/execution_test.py +0 -0
  16. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/function_generation.py +0 -0
  17. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/function_generation_test.py +0 -0
  18. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/parsing.py +0 -0
  19. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/parsing_test.py +0 -0
  20. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/permissions.py +0 -0
  21. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/coding/permissions_test.py +0 -0
  22. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/detouring/__init__.py +0 -0
  23. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/detouring/class_detour.py +0 -0
  24. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/detouring/class_detour_test.py +0 -0
  25. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/__init__.py +0 -0
  26. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/base.py +0 -0
  27. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/base_test.py +0 -0
  28. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/categorical.py +0 -0
  29. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/categorical_test.py +0 -0
  30. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/custom.py +0 -0
  31. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/custom_test.py +0 -0
  32. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/deduping.py +0 -0
  33. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/deduping_test.py +0 -0
  34. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/dna_generator.py +0 -0
  35. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/dna_generator_test.py +0 -0
  36. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/numerical.py +0 -0
  37. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/numerical_test.py +0 -0
  38. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/random.py +0 -0
  39. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/random_test.py +0 -0
  40. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/space.py +0 -0
  41. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/space_test.py +0 -0
  42. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/sweeping.py +0 -0
  43. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/geno/sweeping_test.py +0 -0
  44. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/__init__.py +0 -0
  45. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/base.py +0 -0
  46. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/categorical.py +0 -0
  47. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/categorical_test.py +0 -0
  48. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/custom.py +0 -0
  49. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/custom_test.py +0 -0
  50. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/derived.py +0 -0
  51. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/derived_test.py +0 -0
  52. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
  53. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  54. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/evolvable.py +0 -0
  55. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/evolvable_test.py +0 -0
  56. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/iter.py +0 -0
  57. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/iter_test.py +0 -0
  58. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/numerical.py +0 -0
  59. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/numerical_test.py +0 -0
  60. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/object_template.py +0 -0
  61. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/hyper/object_template_test.py +0 -0
  62. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/io/__init__.py +0 -0
  63. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/io/file_system.py +0 -0
  64. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/io/file_system_test.py +0 -0
  65. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/io/sequence.py +0 -0
  66. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/io/sequence_test.py +0 -0
  67. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/logging.py +0 -0
  68. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/logging_test.py +0 -0
  69. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/patching/__init__.py +0 -0
  70. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/patching/object_factory.py +0 -0
  71. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/patching/object_factory_test.py +0 -0
  72. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/patching/pattern_based.py +0 -0
  73. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/patching/pattern_based_test.py +0 -0
  74. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/patching/rule_based.py +0 -0
  75. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/patching/rule_based_test.py +0 -0
  76. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/__init__.py +0 -0
  77. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/base.py +0 -0
  78. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/base_test.py +0 -0
  79. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/boilerplate.py +0 -0
  80. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/boilerplate_test.py +0 -0
  81. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/class_wrapper.py +0 -0
  82. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
  83. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/compounding.py +0 -0
  84. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/compounding_test.py +0 -0
  85. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/contextual_object.py +0 -0
  86. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/contextual_object_test.py +0 -0
  87. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/dict.py +0 -0
  88. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/dict_test.py +0 -0
  89. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/diff.py +0 -0
  90. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/diff_test.py +0 -0
  91. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/flags.py +0 -0
  92. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/flags_test.py +0 -0
  93. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/functor.py +0 -0
  94. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/functor_test.py +0 -0
  95. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/inferred.py +0 -0
  96. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/inferred_test.py +0 -0
  97. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/list.py +0 -0
  98. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/list_test.py +0 -0
  99. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/object.py +0 -0
  100. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/object_test.py +0 -0
  101. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/origin.py +0 -0
  102. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/origin_test.py +0 -0
  103. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/pure_symbolic.py +0 -0
  104. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/ref.py +0 -0
  105. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/ref_test.py +0 -0
  106. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/symbolize.py +0 -0
  107. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/symbolic/symbolize_test.py +0 -0
  108. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/__init__.py +0 -0
  109. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/backend.py +0 -0
  110. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/backend_test.py +0 -0
  111. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/early_stopping.py +0 -0
  112. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/local_backend.py +0 -0
  113. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/protocols.py +0 -0
  114. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/protocols_test.py +0 -0
  115. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/sample.py +0 -0
  116. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/tuning/sample_test.py +0 -0
  117. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/__init__.py +0 -0
  118. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/annotated.py +0 -0
  119. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/annotated_test.py +0 -0
  120. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/annotation_conversion.py +0 -0
  121. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/annotation_conversion_test.py +0 -0
  122. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/callable_ext.py +0 -0
  123. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/callable_ext_test.py +0 -0
  124. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/callable_signature.py +0 -0
  125. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/callable_signature_test.py +0 -0
  126. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/class_schema.py +0 -0
  127. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/class_schema_test.py +0 -0
  128. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/custom_typing.py +0 -0
  129. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/key_specs.py +0 -0
  130. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/key_specs_test.py +0 -0
  131. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/pytype_support.py +0 -0
  132. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/typed_missing.py +0 -0
  133. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/typed_missing_test.py +0 -0
  134. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/value_specs.py +0 -0
  135. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/typing/value_specs_test.py +0 -0
  136. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/__init__.py +0 -0
  137. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/common_traits.py +0 -0
  138. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/common_traits_test.py +0 -0
  139. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/contextual.py +0 -0
  140. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/contextual_test.py +0 -0
  141. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/docstr_utils.py +0 -0
  142. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/docstr_utils_test.py +0 -0
  143. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/error_utils.py +0 -0
  144. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/error_utils_test.py +0 -0
  145. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/formatting.py +0 -0
  146. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/formatting_test.py +0 -0
  147. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/hierarchical.py +0 -0
  148. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/hierarchical_test.py +0 -0
  149. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/json_conversion.py +0 -0
  150. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/json_conversion_test.py +0 -0
  151. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/missing.py +0 -0
  152. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/missing_test.py +0 -0
  153. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/text_color.py +0 -0
  154. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/text_color_test.py +0 -0
  155. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/thread_local.py +0 -0
  156. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/thread_local_test.py +0 -0
  157. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/timing.py +0 -0
  158. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/timing_test.py +0 -0
  159. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/value_location.py +0 -0
  160. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/utils/value_location_test.py +0 -0
  161. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/__init__.py +0 -0
  162. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/base.py +0 -0
  163. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/base_test.py +0 -0
  164. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/__init__.py +0 -0
  165. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/base.py +0 -0
  166. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/base_test.py +0 -0
  167. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/__init__.py +0 -0
  168. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/base.py +0 -0
  169. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/label.py +0 -0
  170. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/label_test.py +0 -0
  171. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/progress_bar.py +0 -0
  172. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/progress_bar_test.py +0 -0
  173. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/tab.py +0 -0
  174. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/tab_test.py +0 -0
  175. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/tooltip.py +0 -0
  176. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
  177. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/tree_view.py +0 -0
  178. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/core/views/html/tree_view_test.py +0 -0
  179. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/__init__.py +0 -0
  180. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/early_stopping/__init__.py +0 -0
  181. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/early_stopping/base.py +0 -0
  182. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/early_stopping/base_test.py +0 -0
  183. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/early_stopping/step_wise.py +0 -0
  184. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  185. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/__init__.py +0 -0
  186. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/base.py +0 -0
  187. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/base_test.py +0 -0
  188. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/hill_climb.py +0 -0
  189. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  190. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/mutators.py +0 -0
  191. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/mutators_test.py +0 -0
  192. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/neat.py +0 -0
  193. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/neat_test.py +0 -0
  194. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/nsga2.py +0 -0
  195. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/nsga2_test.py +0 -0
  196. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/recombinators.py +0 -0
  197. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/recombinators_test.py +0 -0
  198. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  199. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  200. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/selectors.py +0 -0
  201. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/selectors_test.py +0 -0
  202. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/where.py +0 -0
  203. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/evolution/where_test.py +0 -0
  204. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/mutfun/__init__.py +0 -0
  205. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/mutfun/base.py +0 -0
  206. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/mutfun/base_test.py +0 -0
  207. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/mutfun/basic_ops.py +0 -0
  208. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  209. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/__init__.py +0 -0
  210. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/base.py +0 -0
  211. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/base_test.py +0 -0
  212. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/maths.py +0 -0
  213. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/maths_test.py +0 -0
  214. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/randoms.py +0 -0
  215. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/randoms_test.py +0 -0
  216. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/step_wise.py +0 -0
  217. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove/ext/scalars/step_wise_test.py +0 -0
  218. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove.egg-info/SOURCES.txt +0 -0
  219. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove.egg-info/dependency_links.txt +0 -0
  220. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove.egg-info/requires.txt +0 -0
  221. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/pyglove.egg-info/top_level.txt +0 -0
  222. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/setup.cfg +0 -0
  223. {pyglove-0.4.5.dev202502020807 → pyglove-0.4.5.dev202502040809}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202502020807
3
+ Version: 0.4.5.dev202502040809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors
@@ -30,6 +30,11 @@ def is_subclass(
30
30
  """An issubclass extension that supports Any and generic types."""
31
31
 
32
32
  def _is_subclass(src: Type[Any], target: Type[Any]) -> bool:
33
+ if is_protocol(target):
34
+ # NOTE(daiyip): loose runtime check for Protocol.
35
+ # As runtime protocol check (through decorating the protocol class with
36
+ # @typing.runtime_checkable) might be unreliable and very slow.
37
+ return inspect.isclass(src) and src.__module__ != 'builtins'
33
38
  if target is Any:
34
39
  return True
35
40
  elif src is Any:
@@ -78,6 +83,17 @@ def is_subclass(
78
83
  return _is_subclass(src, target)
79
84
 
80
85
 
86
+ def is_protocol(maybe_protocol: Type[Any]) -> bool:
87
+ """Returns True if a type is a protocol."""
88
+ if not inspect.isclass(maybe_protocol):
89
+ return False
90
+ maybe_protocol = typing.get_origin(maybe_protocol) or maybe_protocol
91
+ for base in maybe_protocol.__bases__:
92
+ if base is typing.Protocol or typing.get_origin(base) is typing.Protocol:
93
+ return True
94
+ return False
95
+
96
+
81
97
  def is_generic(maybe_generic: Type[Any]) -> bool:
82
98
  """Returns True if a type is a generic class."""
83
99
  return typing.get_origin(maybe_generic) is not None
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  """Tests for generic type utility."""
15
15
 
16
- from typing import Any, Generic, TypeVar
16
+ from typing import Any, Generic, Protocol, TypeVar
17
17
  import unittest
18
18
 
19
19
  from pyglove.core.typing import callable_signature
@@ -62,6 +62,26 @@ class AA1(AA):
62
62
  pass
63
63
 
64
64
 
65
+ class E(Protocol):
66
+
67
+ def __call__(self, x: int) -> int:
68
+ pass
69
+
70
+
71
+ class E1(E):
72
+ pass
73
+
74
+
75
+ class E2(E, Protocol):
76
+
77
+ def bar(self, x: int) -> int:
78
+ pass
79
+
80
+
81
+ class F(Protocol[XType]):
82
+ x: XType
83
+
84
+
65
85
  class InspectTest(unittest.TestCase):
66
86
 
67
87
  def test_issubclass(self):
@@ -111,6 +131,16 @@ class InspectTest(unittest.TestCase):
111
131
  self.assertFalse(inspect.is_subclass(B1[Str], B[str]))
112
132
  self.assertFalse(inspect.is_subclass(B1[Str], A[str, int]))
113
133
 
134
+ # Protocol check.
135
+ self.assertTrue(inspect.is_subclass(E, E))
136
+ self.assertTrue(inspect.is_subclass(E, Protocol))
137
+ # We do not really check protocol comformance at runtime for performance
138
+ # reasons. So all user classes are considered as subclasses of a Protocol
139
+ # class.
140
+ self.assertTrue(inspect.is_subclass(A, E))
141
+ self.assertFalse(inspect.is_subclass(str, E))
142
+ self.assertFalse(inspect.is_subclass(1, E))
143
+
114
144
  # Test tuple cases.
115
145
  self.assertTrue(inspect.is_subclass(int, (str, int)))
116
146
  self.assertTrue(inspect.is_subclass(C, (int, A[str, int])))
@@ -124,7 +154,24 @@ class InspectTest(unittest.TestCase):
124
154
  self.assertTrue(inspect.is_instance(D(), A[str, int]))
125
155
  self.assertTrue(inspect.is_instance(D(), B[str]))
126
156
 
157
+ def test_is_protocol(self):
158
+ self.assertFalse(inspect.is_protocol(1))
159
+ self.assertFalse(inspect.is_protocol(str))
160
+ self.assertFalse(inspect.is_protocol(Any))
161
+ self.assertFalse(inspect.is_protocol(A))
162
+ self.assertFalse(inspect.is_protocol(A[str, int]))
163
+ self.assertFalse(inspect.is_protocol(Protocol))
164
+ self.assertFalse(inspect.is_protocol(Protocol[XType]))
165
+ self.assertTrue(inspect.is_protocol(E))
166
+ # subclasses of a Protocol class will downgrade if it's not explicitly
167
+ # inherited from Protocol.
168
+ # See https://typing.readthedocs.io/en/latest/spec/protocol.html
169
+ self.assertFalse(inspect.is_protocol(E1))
170
+ self.assertTrue(inspect.is_protocol(E2))
171
+ self.assertTrue(inspect.is_protocol(F))
172
+
127
173
  def test_is_generic(self):
174
+ self.assertFalse(inspect.is_generic(1))
128
175
  self.assertFalse(inspect.is_generic(str))
129
176
  self.assertFalse(inspect.is_generic(Any))
130
177
  self.assertFalse(inspect.is_generic(A))
@@ -24,11 +24,13 @@ from pyglove.core.typing import inspect as pg_inspect
24
24
  class _TypeConverterRegistry:
25
25
  """Type converter registry."""
26
26
 
27
+ _JSON_VALUE_TYPES = frozenset(
28
+ [int, float, bool, type(None), list, tuple, dict, str]
29
+ )
30
+
27
31
  def __init__(self):
28
32
  """Constructor."""
29
33
  self._converter_list = []
30
- self._json_value_types = set(
31
- [int, float, bool, type(None), list, tuple, dict, str])
32
34
 
33
35
  def register(
34
36
  self,
@@ -45,14 +47,17 @@ class _TypeConverterRegistry:
45
47
  raise TypeError('Argument \'src\' and \'dest\' must be a type or '
46
48
  'tuple of types.')
47
49
  if isinstance(dest, tuple):
48
- json_value_convertible = any(d in self._json_value_types for d in dest)
50
+ json_value_convertible = any(d in self._JSON_VALUE_TYPES for d in dest)
49
51
  else:
50
- json_value_convertible = dest in self._json_value_types
52
+ json_value_convertible = dest in self._JSON_VALUE_TYPES
51
53
  self._converter_list.append((src, dest, convert_fn, json_value_convertible))
52
54
 
53
55
  def get_converter(
54
56
  self, src: Type[Any], dest: Type[Any]) -> Optional[Callable[[Any], Any]]:
55
57
  """Get converter from source type to destination type."""
58
+ if pg_inspect.is_protocol(dest):
59
+ return None
60
+
56
61
  # TODO(daiyip): Right now we don't see the need of a large number of
57
62
  # converters, thus its affordable to iterate the list.
58
63
  # We may consider more efficient way to do lookup in future.
@@ -38,6 +38,10 @@ class TypeConversionTest(unittest.TestCase):
38
38
  super().__init__(x)
39
39
  self.y = y
40
40
 
41
+ class C(typing.Protocol):
42
+ def foo(self, x: int) -> int:
43
+ pass
44
+
41
45
  a_converter = lambda a: a.x
42
46
  type_conversion.register_converter(A, (str, int), a_converter)
43
47
 
@@ -46,6 +50,7 @@ class TypeConversionTest(unittest.TestCase):
46
50
  self.assertIs(type_conversion.get_json_value_converter(A), a_converter)
47
51
 
48
52
  self.assertIsNone(type_conversion.get_converter(A, (float, bool)))
53
+ self.assertIsNone(type_conversion.get_converter(A, C))
49
54
  self.assertIs(type_conversion.get_converter(A, (float, int)), a_converter)
50
55
 
51
56
  # B is a subclass of A, so A's converter applies.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyglove
3
- Version: 0.4.5.dev202502020807
3
+ Version: 0.4.5.dev202502040809
4
4
  Summary: PyGlove: A library for manipulating Python objects.
5
5
  Home-page: https://github.com/google/pyglove
6
6
  Author: PyGlove Authors