pyglove 0.5.0.dev202510150810__tar.gz → 0.5.0.dev202510170226__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.
Potentially problematic release.
This version of pyglove might be problematic. Click here for more details.
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/PKG-INFO +1 -1
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/class_schema.py +20 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/json_schema.py +221 -8
- pyglove-0.5.0.dev202510170226/pyglove/core/typing/json_schema_test.py +973 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/contextual.py +9 -4
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/contextual_test.py +10 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove.egg-info/PKG-INFO +1 -1
- pyglove-0.5.0.dev202510150810/pyglove/core/typing/json_schema_test.py +0 -477
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/LICENSE +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/README.md +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/errors.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/errors_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/execution.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/execution_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/function_generation.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/function_generation_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/parsing.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/parsing_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/permissions.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/coding/permissions_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/detouring/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/detouring/class_detour.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/detouring/class_detour_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/categorical.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/categorical_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/custom.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/custom_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/deduping.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/deduping_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/dna_generator.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/dna_generator_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/numerical.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/numerical_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/random.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/random_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/space.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/space_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/sweeping.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/geno/sweeping_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/categorical.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/categorical_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/custom.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/custom_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/derived.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/derived_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/dynamic_evaluation.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/evolvable.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/evolvable_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/iter.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/iter_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/numerical.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/numerical_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/object_template.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/hyper/object_template_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/io/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/io/file_system.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/io/file_system_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/io/sequence.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/io/sequence_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/logging.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/logging_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/monitoring.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/monitoring_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/patching/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/patching/object_factory.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/patching/object_factory_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/patching/pattern_based.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/patching/pattern_based_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/patching/rule_based.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/patching/rule_based_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/boilerplate.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/boilerplate_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/class_wrapper.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/class_wrapper_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/compounding.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/compounding_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/contextual_object.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/contextual_object_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/dict.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/dict_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/diff.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/diff_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/error_info.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/error_info_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/flags.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/flags_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/functor.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/functor_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/inferred.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/inferred_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/list.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/list_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/object.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/object_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/origin.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/origin_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/pure_symbolic.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/ref.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/ref_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/symbolize.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/symbolic/symbolize_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/backend.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/backend_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/early_stopping.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/local_backend.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/protocols.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/protocols_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/sample.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/tuning/sample_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/annotated.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/annotated_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/annotation_conversion.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/annotation_conversion_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/annotation_future_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/callable_ext.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/callable_ext_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/callable_signature.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/callable_signature_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/class_schema_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/custom_typing.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/inspect.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/inspect_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/key_specs.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/key_specs_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/pytype_support.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/type_conversion.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/type_conversion_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/typed_missing.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/typed_missing_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/value_specs.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/value_specs_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/common_traits.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/common_traits_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/docstr_utils.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/docstr_utils_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/error_utils.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/error_utils_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/formatting.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/formatting_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/hierarchical.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/hierarchical_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/json_conversion.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/json_conversion_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/missing.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/missing_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/text_color.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/text_color_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/thread_local.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/thread_local_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/timing.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/timing_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/value_location.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/utils/value_location_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/label.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/label_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/progress_bar.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/progress_bar_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/tab.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/tab_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/tooltip.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/controls/tooltip_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/tree_view.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/views/html/tree_view_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/early_stopping/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/early_stopping/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/early_stopping/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/early_stopping/step_wise.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/hill_climb.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/hill_climb_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/mutators.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/mutators_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/neat.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/neat_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/nsga2.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/nsga2_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/recombinators.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/recombinators_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/regularized_evolution.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/selectors.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/selectors_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/where.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/evolution/where_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/mutfun/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/mutfun/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/mutfun/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/mutfun/basic_ops.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/__init__.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/base.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/base_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/maths.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/maths_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/randoms.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/randoms_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/step_wise.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/ext/scalars/step_wise_test.py +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove.egg-info/SOURCES.txt +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove.egg-info/dependency_links.txt +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove.egg-info/requires.txt +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove.egg-info/top_level.txt +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/setup.cfg +0 -0
- {pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/setup.py +0 -0
{pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/class_schema.py
RENAMED
|
@@ -582,6 +582,16 @@ class ValueSpec(utils.Formattable, utils.JSONConvertible):
|
|
|
582
582
|
del include_type_name, include_subclasses, inline_nested_refs, kwargs
|
|
583
583
|
assert False, 'Overridden in `json_schema.py`.'
|
|
584
584
|
|
|
585
|
+
@classmethod
|
|
586
|
+
def from_json_schema(
|
|
587
|
+
cls,
|
|
588
|
+
json_schema: Dict[str, Any],
|
|
589
|
+
class_fn: Optional[Callable[[str, 'Schema'], Type[Any]]] = None
|
|
590
|
+
) -> 'ValueSpec':
|
|
591
|
+
"""Converts a JSON schema to a value spec."""
|
|
592
|
+
del json_schema, class_fn
|
|
593
|
+
assert False, 'Overridden in `json_schema.py`.'
|
|
594
|
+
|
|
585
595
|
|
|
586
596
|
class Field(utils.Formattable, utils.JSONConvertible):
|
|
587
597
|
"""Class that represents the definition of one or a group of attributes.
|
|
@@ -1375,6 +1385,16 @@ class Schema(utils.Formattable, utils.JSONConvertible):
|
|
|
1375
1385
|
def __ne__(self, other: Any) -> bool:
|
|
1376
1386
|
return not self.__eq__(other)
|
|
1377
1387
|
|
|
1388
|
+
@classmethod
|
|
1389
|
+
def from_json_schema(
|
|
1390
|
+
cls,
|
|
1391
|
+
json_schema: Dict[str, Any],
|
|
1392
|
+
class_fn: Optional[Callable[[str, 'Schema'], Type[Any]]] = None
|
|
1393
|
+
) -> 'Schema':
|
|
1394
|
+
"""Converts a JSON schema to a schema."""
|
|
1395
|
+
del json_schema, class_fn
|
|
1396
|
+
assert False, 'Overridden in `json_schema.py`.'
|
|
1397
|
+
|
|
1378
1398
|
|
|
1379
1399
|
FieldDef = Union[
|
|
1380
1400
|
# Key, Value spec/annotation.
|
{pyglove-0.5.0.dev202510150810 → pyglove-0.5.0.dev202510170226}/pyglove/core/typing/json_schema.py
RENAMED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import dataclasses
|
|
17
17
|
import inspect
|
|
18
|
-
from typing import Any, Dict, List, Optional, Tuple, Union
|
|
18
|
+
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
|
|
19
19
|
|
|
20
20
|
from pyglove.core import utils
|
|
21
21
|
from pyglove.core.typing import callable_signature
|
|
@@ -53,8 +53,8 @@ def _json_schema_from_schema(
|
|
|
53
53
|
required = []
|
|
54
54
|
|
|
55
55
|
if type_name and include_type_name:
|
|
56
|
-
properties[
|
|
57
|
-
required.append(
|
|
56
|
+
properties[utils.JSONConvertible.TYPE_NAME_KEY] = {'const': type_name}
|
|
57
|
+
required.append(utils.JSONConvertible.TYPE_NAME_KEY)
|
|
58
58
|
|
|
59
59
|
for key, field in schema.items():
|
|
60
60
|
if isinstance(key, ks.ConstStrKey):
|
|
@@ -145,7 +145,6 @@ def _json_schema_from_value_spec(
|
|
|
145
145
|
}
|
|
146
146
|
if not isinstance(value_spec.element.value, vs.Any):
|
|
147
147
|
definition['items'] = _child_json_schema(value_spec.element.value)
|
|
148
|
-
return definition
|
|
149
148
|
elif isinstance(value_spec, vs.Dict):
|
|
150
149
|
if value_spec.schema is None:
|
|
151
150
|
definition = {
|
|
@@ -168,9 +167,7 @@ def _json_schema_from_value_spec(
|
|
|
168
167
|
include_type_name=include_type_name,
|
|
169
168
|
include_subclasses=include_subclasses,
|
|
170
169
|
)
|
|
171
|
-
definitions = [
|
|
172
|
-
_json_schema_from_cls(value_spec.cls)
|
|
173
|
-
]
|
|
170
|
+
definitions = [_json_schema_from_cls(value_spec.cls)]
|
|
174
171
|
|
|
175
172
|
if include_subclasses:
|
|
176
173
|
for subclass in value_spec.cls.__subclasses__():
|
|
@@ -206,12 +203,26 @@ def _json_schema_from_value_spec(
|
|
|
206
203
|
f'Value spec {value_spec!r} cannot be converted to JSON schema.'
|
|
207
204
|
)
|
|
208
205
|
|
|
206
|
+
if (value_spec.has_default
|
|
207
|
+
and value_spec.default is not None
|
|
208
|
+
and not isinstance(value_spec, vs.Dict)):
|
|
209
|
+
default = utils.to_json(value_spec.default)
|
|
210
|
+
if not include_type_name:
|
|
211
|
+
def _remove_type_name(_, v: Dict[str, Any]):
|
|
212
|
+
if isinstance(v, dict):
|
|
213
|
+
v.pop(utils.JSONConvertible.TYPE_NAME_KEY, None)
|
|
214
|
+
return v
|
|
215
|
+
default = utils.transform(default, _remove_type_name)
|
|
216
|
+
definition['default'] = default
|
|
217
|
+
|
|
209
218
|
if not ignore_nonable and value_spec.is_noneable:
|
|
210
219
|
nullable = {'type': 'null'}
|
|
211
220
|
if 'anyOf' in definition:
|
|
212
221
|
definition['anyOf'].append(nullable)
|
|
213
222
|
else:
|
|
214
223
|
definition = {'anyOf': [definition, nullable]}
|
|
224
|
+
if value_spec.default is None:
|
|
225
|
+
definition['default'] = None
|
|
215
226
|
return definition
|
|
216
227
|
|
|
217
228
|
|
|
@@ -294,6 +305,8 @@ def _canonicalize_schema(
|
|
|
294
305
|
}
|
|
295
306
|
canonical_form = {'$defs': referenced_defs} if referenced_defs else {}
|
|
296
307
|
canonical_form.update(new_root)
|
|
308
|
+
if 'default' in root:
|
|
309
|
+
canonical_form['default'] = root['default']
|
|
297
310
|
return canonical_form
|
|
298
311
|
|
|
299
312
|
#
|
|
@@ -336,5 +349,205 @@ def _schema_to_json_schema(
|
|
|
336
349
|
**kwargs
|
|
337
350
|
)
|
|
338
351
|
|
|
339
|
-
|
|
352
|
+
class_schema.ValueSpec.to_json_schema = _value_spec_to_json_schema
|
|
340
353
|
class_schema.Schema.to_json_schema = _schema_to_json_schema
|
|
354
|
+
|
|
355
|
+
#
|
|
356
|
+
# from JSON schema to PyGlove value spec.
|
|
357
|
+
#
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def _json_schema_to_value_spec(
|
|
361
|
+
json_schema: Dict[str, Any],
|
|
362
|
+
defs: Dict[str, Type[Any]],
|
|
363
|
+
class_fn: Optional[Callable[[str, class_schema.Schema], Type[Any]]],
|
|
364
|
+
add_json_schema_as_metadata: bool,
|
|
365
|
+
) -> class_schema.ValueSpec:
|
|
366
|
+
"""Converts a JSON schema to a value spec."""
|
|
367
|
+
# Generate code to convert JSON schema to value spec.
|
|
368
|
+
def _value_spec(value_schema: Dict[str, Any]):
|
|
369
|
+
return _json_schema_to_value_spec(
|
|
370
|
+
value_schema, defs, class_fn, add_json_schema_as_metadata
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
if '$ref' in json_schema:
|
|
374
|
+
# TODO(daiyip): Support circular references.
|
|
375
|
+
ref_key = json_schema['$ref'].split('/')[-1]
|
|
376
|
+
type_ref = defs.get(ref_key)
|
|
377
|
+
if type_ref is None:
|
|
378
|
+
raise ValueError(
|
|
379
|
+
f'Reference {ref_key!r} not defined in defs. '
|
|
380
|
+
'Please make sure classes being referenced are defined '
|
|
381
|
+
'before the referencing classes. '
|
|
382
|
+
)
|
|
383
|
+
return type_ref
|
|
384
|
+
type_str = json_schema.get('type')
|
|
385
|
+
default = json_schema.get('default', utils.MISSING_VALUE)
|
|
386
|
+
if type_str is None:
|
|
387
|
+
if 'enum' in json_schema:
|
|
388
|
+
for v in json_schema['enum']:
|
|
389
|
+
if not isinstance(v, (str, int, float, bool)):
|
|
390
|
+
raise ValueError(
|
|
391
|
+
f'Enum candidate {v!r} is not supported for JSON schema '
|
|
392
|
+
'conversion.'
|
|
393
|
+
)
|
|
394
|
+
return vs.Enum(
|
|
395
|
+
default,
|
|
396
|
+
[v for v in json_schema['enum'] if v is not None]
|
|
397
|
+
)
|
|
398
|
+
elif 'anyOf' in json_schema:
|
|
399
|
+
candidates = []
|
|
400
|
+
accepts_none = False
|
|
401
|
+
for v in json_schema['anyOf']:
|
|
402
|
+
candidate = _value_spec(v)
|
|
403
|
+
if candidate.frozen and candidate.default is None:
|
|
404
|
+
accepts_none = True
|
|
405
|
+
continue
|
|
406
|
+
candidates.append(candidate)
|
|
407
|
+
|
|
408
|
+
if len(candidates) == 1:
|
|
409
|
+
spec = candidates[0]
|
|
410
|
+
else:
|
|
411
|
+
spec = vs.Union(candidates)
|
|
412
|
+
if accepts_none:
|
|
413
|
+
spec = spec.noneable()
|
|
414
|
+
return spec
|
|
415
|
+
elif type_str == 'null':
|
|
416
|
+
return vs.Any().freeze(None)
|
|
417
|
+
elif type_str == 'boolean':
|
|
418
|
+
return vs.Bool(default=default)
|
|
419
|
+
elif type_str == 'integer':
|
|
420
|
+
minimum = json_schema.get('minimum')
|
|
421
|
+
maximum = json_schema.get('maximum')
|
|
422
|
+
return vs.Int(min_value=minimum, max_value=maximum, default=default)
|
|
423
|
+
elif type_str == 'number':
|
|
424
|
+
minimum = json_schema.get('minimum')
|
|
425
|
+
maximum = json_schema.get('maximum')
|
|
426
|
+
return vs.Float(min_value=minimum, max_value=maximum, default=default)
|
|
427
|
+
elif type_str == 'string':
|
|
428
|
+
pattern = json_schema.get('pattern')
|
|
429
|
+
return vs.Str(regex=pattern, default=default)
|
|
430
|
+
elif type_str == 'array':
|
|
431
|
+
items = json_schema.get('items')
|
|
432
|
+
return vs.List(_value_spec(items) if items else vs.Any(), default=default)
|
|
433
|
+
elif type_str == 'object':
|
|
434
|
+
schema = _json_schema_to_schema(
|
|
435
|
+
json_schema, defs, class_fn, add_json_schema_as_metadata
|
|
436
|
+
)
|
|
437
|
+
if class_fn is not None and 'title' in json_schema:
|
|
438
|
+
return vs.Object(class_fn(json_schema['title'], schema))
|
|
439
|
+
return vs.Dict(schema=schema if schema.fields else None)
|
|
440
|
+
raise ValueError(f'Unsupported type {type_str!r} in JSON schema.')
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
def _json_schema_to_schema(
|
|
444
|
+
json_schema: Dict[str, Any],
|
|
445
|
+
defs: Dict[str, Type[Any]],
|
|
446
|
+
class_fn: Optional[Callable[[str, class_schema.Schema], Type[Any]]],
|
|
447
|
+
add_json_schema_as_metadata: bool,
|
|
448
|
+
) -> class_schema.Schema:
|
|
449
|
+
"""Converts a JSON schema to a schema."""
|
|
450
|
+
title = json_schema.get('title')
|
|
451
|
+
properties = json_schema.get('properties', {})
|
|
452
|
+
fields = []
|
|
453
|
+
required = set(json_schema.get('required', []))
|
|
454
|
+
for name, property_schema in properties.items():
|
|
455
|
+
value_spec = _json_schema_to_value_spec(
|
|
456
|
+
property_schema, defs, class_fn, add_json_schema_as_metadata
|
|
457
|
+
)
|
|
458
|
+
if name not in required and not value_spec.has_default:
|
|
459
|
+
value_spec = value_spec.noneable()
|
|
460
|
+
fields.append(
|
|
461
|
+
class_schema.Field(
|
|
462
|
+
name,
|
|
463
|
+
value_spec,
|
|
464
|
+
description=property_schema.get('description'),
|
|
465
|
+
metadata=(
|
|
466
|
+
dict(json_schema=property_schema)
|
|
467
|
+
if add_json_schema_as_metadata else None
|
|
468
|
+
)
|
|
469
|
+
)
|
|
470
|
+
)
|
|
471
|
+
additional_properties = json_schema.get('additionalProperties')
|
|
472
|
+
if additional_properties:
|
|
473
|
+
if isinstance(additional_properties, dict):
|
|
474
|
+
value_spec = _json_schema_to_value_spec(
|
|
475
|
+
additional_properties, defs, class_fn, add_json_schema_as_metadata
|
|
476
|
+
)
|
|
477
|
+
else:
|
|
478
|
+
value_spec = vs.Any()
|
|
479
|
+
fields.append(class_schema.Field(ks.StrKey(), value_spec))
|
|
480
|
+
return class_schema.Schema(
|
|
481
|
+
name=title,
|
|
482
|
+
description=json_schema.get('description'),
|
|
483
|
+
fields=fields,
|
|
484
|
+
allow_nonconst_keys=True,
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
@classmethod
|
|
489
|
+
def _value_spec_from_json_schema(
|
|
490
|
+
cls,
|
|
491
|
+
json_schema: Dict[str, Any],
|
|
492
|
+
class_fn: Optional[Callable[[str, class_schema.Schema], Type[Any]]] = None,
|
|
493
|
+
add_json_schema_as_metadata: bool = False,
|
|
494
|
+
) -> class_schema.ValueSpec:
|
|
495
|
+
"""Creates a PyGlove value spec from a JSON schema.
|
|
496
|
+
|
|
497
|
+
Args:
|
|
498
|
+
json_schema: The JSON schema for a value spec.
|
|
499
|
+
class_fn: A function that creates a PyGlove class from a class name and a
|
|
500
|
+
schema. If None, all "object" type properties will be converted to
|
|
501
|
+
`pg.typing.Dict`. Otherwise, "object" type properties will be converted to
|
|
502
|
+
a class.
|
|
503
|
+
add_json_schema_as_metadata: Whether to add the JSON schema as field
|
|
504
|
+
metadata.
|
|
505
|
+
|
|
506
|
+
Returns:
|
|
507
|
+
A PyGlove value spec.
|
|
508
|
+
"""
|
|
509
|
+
del cls
|
|
510
|
+
defs = {}
|
|
511
|
+
if '$defs' in json_schema:
|
|
512
|
+
for key, def_entry in json_schema['$defs'].items():
|
|
513
|
+
defs[key] = _json_schema_to_value_spec(
|
|
514
|
+
def_entry, defs, class_fn, add_json_schema_as_metadata
|
|
515
|
+
)
|
|
516
|
+
return _json_schema_to_value_spec(
|
|
517
|
+
json_schema, defs, class_fn, add_json_schema_as_metadata
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
@classmethod
|
|
522
|
+
def _schema_from_json_schema(
|
|
523
|
+
cls,
|
|
524
|
+
json_schema: Dict[str, Any],
|
|
525
|
+
class_fn: Optional[Callable[[str, class_schema.Schema], Type[Any]]] = None,
|
|
526
|
+
add_json_schema_as_metadata: bool = False,
|
|
527
|
+
) -> class_schema.Schema:
|
|
528
|
+
"""Creates a PyGlove schema from a JSON schema.
|
|
529
|
+
|
|
530
|
+
Args:
|
|
531
|
+
json_schema: The JSON schema to convert.
|
|
532
|
+
class_fn: A function that creates a PyGlove class from a class name and a
|
|
533
|
+
schema. If None, all "object" type properties will be converted to
|
|
534
|
+
`pg.typing.Dict`. Otherwise, "object" type properties will be converted to
|
|
535
|
+
a class.
|
|
536
|
+
add_json_schema_as_metadata: Whether to add the JSON schema as field
|
|
537
|
+
metadata.
|
|
538
|
+
|
|
539
|
+
Returns:
|
|
540
|
+
A PyGlove schema.
|
|
541
|
+
"""
|
|
542
|
+
del cls
|
|
543
|
+
if json_schema.get('type') != 'object':
|
|
544
|
+
raise ValueError(
|
|
545
|
+
f'JSON schema is not an object type: {json_schema!r}'
|
|
546
|
+
)
|
|
547
|
+
return _json_schema_to_schema(
|
|
548
|
+
json_schema, {}, class_fn, add_json_schema_as_metadata
|
|
549
|
+
)
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
class_schema.ValueSpec.from_json_schema = _value_spec_from_json_schema
|
|
553
|
+
class_schema.Schema.from_json_schema = _schema_from_json_schema
|