pyglove 0.4.5.dev20240319__tar.gz → 0.4.5.dev202501140808__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.
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/PKG-INFO +17 -3
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/README.md +4 -1
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/__init__.py +54 -20
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/__init__.py +42 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/errors.py +111 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/errors_test.py +98 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/execution.py +309 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/execution_test.py +333 -0
- pyglove-0.4.5.dev20240319/pyglove/core/object_utils/codegen.py → pyglove-0.4.5.dev202501140808/pyglove/core/coding/function_generation.py +10 -4
- pyglove-0.4.5.dev20240319/pyglove/core/object_utils/codegen_test.py → pyglove-0.4.5.dev202501140808/pyglove/core/coding/function_generation_test.py +5 -7
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/parsing.py +153 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/parsing_test.py +150 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/permissions.py +100 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/coding/permissions_test.py +93 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/base.py +54 -41
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/base_test.py +2 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/categorical.py +37 -28
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/custom.py +19 -16
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/numerical.py +20 -17
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/space.py +4 -5
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/base.py +6 -6
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/categorical.py +94 -55
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/custom.py +7 -7
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/custom_test.py +9 -10
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/derived.py +30 -22
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/derived_test.py +2 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/dynamic_evaluation.py +5 -6
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/evolvable.py +57 -46
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/numerical.py +48 -24
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/numerical_test.py +9 -9
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/object_template.py +58 -46
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/io/__init__.py +1 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/io/file_system.py +17 -7
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/io/file_system_test.py +2 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/io/sequence.py +299 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/io/sequence_test.py +124 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/logging_test.py +0 -2
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/patching/object_factory.py +4 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/patching/pattern_based.py +4 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/patching/rule_based.py +17 -5
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/patching/rule_based_test.py +27 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/__init__.py +2 -7
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/base.py +320 -183
- pyglove-0.4.5.dev202501140808/pyglove/core/symbolic/base_test.py +193 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/boilerplate.py +7 -13
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/boilerplate_test.py +25 -23
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/class_wrapper.py +48 -45
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/class_wrapper_test.py +2 -2
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/compounding.py +9 -15
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/compounding_test.py +2 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/dict.py +154 -110
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/dict_test.py +238 -130
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/diff.py +199 -10
- pyglove-0.4.5.dev202501140808/pyglove/core/symbolic/diff_test.py +568 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/flags.py +1 -1
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/functor.py +29 -26
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/functor_test.py +102 -50
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/inferred.py +2 -2
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/list.py +81 -50
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/list_test.py +119 -97
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/object.py +225 -113
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/object_test.py +320 -108
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/origin.py +17 -14
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/origin_test.py +4 -2
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/pure_symbolic.py +4 -3
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/ref.py +108 -21
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/ref_test.py +93 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/symbolize_test.py +10 -2
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/local_backend.py +2 -2
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/protocols.py +3 -3
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/sample_test.py +3 -3
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/__init__.py +14 -5
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/annotation_conversion.py +43 -27
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/annotation_conversion_test.py +23 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/typing/callable_ext.py +288 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/typing/callable_ext_test.py +327 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/typing/callable_signature.py +822 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/typing/callable_signature_test.py +831 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/class_schema.py +229 -154
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/class_schema_test.py +149 -95
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/custom_typing.py +5 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/inspect.py +63 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/inspect_test.py +39 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/key_specs.py +10 -11
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/key_specs_test.py +7 -4
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/type_conversion.py +4 -5
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/type_conversion_test.py +12 -12
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/typed_missing.py +6 -7
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/typed_missing_test.py +7 -8
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/value_specs.py +604 -362
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/value_specs_test.py +328 -90
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/__init__.py +164 -0
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/common_traits.py +3 -67
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/common_traits_test.py +36 -0
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/docstr_utils.py +23 -0
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/docstr_utils_test.py +36 -4
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/error_utils.py +78 -9
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/error_utils_test.py +61 -5
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/formatting.py +464 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/formatting_test.py +453 -0
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/hierarchical.py +23 -25
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/hierarchical_test.py +3 -5
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/json_conversion.py +177 -52
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/json_conversion_test.py +97 -16
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/missing.py +3 -3
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/missing_test.py +2 -4
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/text_color.py +128 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/text_color_test.py +94 -0
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/thread_local_test.py +1 -3
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/timing.py +236 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/timing_test.py +154 -0
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/value_location.py +275 -6
- pyglove-0.4.5.dev202501140808/pyglove/core/utils/value_location_test.py +707 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/__init__.py +32 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/base.py +804 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/base_test.py +580 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/__init__.py +27 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/base.py +547 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/base_test.py +830 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/__init__.py +35 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/base.py +275 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/label.py +207 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/label_test.py +157 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/progress_bar.py +183 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/progress_bar_test.py +97 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/tab.py +320 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/tab_test.py +87 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/tooltip.py +99 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/controls/tooltip_test.py +99 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/tree_view.py +1517 -0
- pyglove-0.4.5.dev202501140808/pyglove/core/views/html/tree_view_test.py +1461 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove.egg-info/PKG-INFO +17 -3
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove.egg-info/SOURCES.txt +54 -25
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove.egg-info/requires.txt +1 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/setup.py +1 -1
- pyglove-0.4.5.dev20240319/pyglove/core/object_utils/__init__.py +0 -154
- pyglove-0.4.5.dev20240319/pyglove/core/object_utils/common_traits_test.py +0 -82
- pyglove-0.4.5.dev20240319/pyglove/core/object_utils/formatting.py +0 -234
- pyglove-0.4.5.dev20240319/pyglove/core/object_utils/formatting_test.py +0 -223
- pyglove-0.4.5.dev20240319/pyglove/core/object_utils/value_location_test.py +0 -385
- pyglove-0.4.5.dev20240319/pyglove/core/symbolic/base_test.py +0 -89
- pyglove-0.4.5.dev20240319/pyglove/core/symbolic/diff_test.py +0 -342
- pyglove-0.4.5.dev20240319/pyglove/core/symbolic/schema_utils.py +0 -327
- pyglove-0.4.5.dev20240319/pyglove/core/symbolic/schema_utils_test.py +0 -57
- pyglove-0.4.5.dev20240319/pyglove/core/typing/callable_ext.py +0 -50
- pyglove-0.4.5.dev20240319/pyglove/core/typing/callable_ext_test.py +0 -72
- pyglove-0.4.5.dev20240319/pyglove/core/typing/callable_signature.py +0 -378
- pyglove-0.4.5.dev20240319/pyglove/core/typing/callable_signature_test.py +0 -311
- pyglove-0.4.5.dev20240319/pyglove/core/typing/class_schema_utils.py +0 -202
- pyglove-0.4.5.dev20240319/pyglove/core/typing/class_schema_utils_test.py +0 -194
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/LICENSE +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/detouring/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/detouring/class_detour.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/detouring/class_detour_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/categorical_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/custom_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/deduping.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/deduping_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/dna_generator.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/dna_generator_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/numerical_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/random.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/random_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/space_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/sweeping.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/geno/sweeping_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/categorical_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/evolvable_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/iter.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/iter_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/hyper/object_template_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/logging.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/patching/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/patching/object_factory_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/patching/pattern_based_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/flags_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/inferred_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/symbolic/symbolize.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/backend.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/backend_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/early_stopping.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/protocols_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/tuning/sample.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/annotated.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/annotated_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/core/typing/pytype_support.py +0 -0
- {pyglove-0.4.5.dev20240319/pyglove/core/object_utils → pyglove-0.4.5.dev202501140808/pyglove/core/utils}/thread_local.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/early_stopping/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/early_stopping/base.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/early_stopping/base_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/early_stopping/step_wise.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/base.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/base_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/hill_climb.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/hill_climb_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/mutators.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/mutators_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/neat.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/neat_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/nsga2.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/nsga2_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/recombinators.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/recombinators_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/regularized_evolution.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/selectors.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/selectors_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/where.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/evolution/where_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/mutfun/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/mutfun/base.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/mutfun/base_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/mutfun/basic_ops.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/__init__.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/base.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/base_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/maths.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/maths_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/randoms.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/randoms_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/step_wise.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove/ext/scalars/step_wise_test.py +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove.egg-info/dependency_links.txt +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/pyglove.egg-info/top_level.txt +0 -0
- {pyglove-0.4.5.dev20240319 → pyglove-0.4.5.dev202501140808}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: pyglove
|
3
|
-
Version: 0.4.5.
|
3
|
+
Version: 0.4.5.dev202501140808
|
4
4
|
Summary: PyGlove: A library for manipulating Python objects.
|
5
5
|
Home-page: https://github.com/google/pyglove
|
6
6
|
Author: PyGlove Authors
|
@@ -22,6 +22,17 @@ Classifier: Topic :: Software Development :: Libraries
|
|
22
22
|
Description-Content-Type: text/markdown
|
23
23
|
License-File: LICENSE
|
24
24
|
Requires-Dist: docstring-parser>=0.12
|
25
|
+
Requires-Dist: termcolor>=1.1.0
|
26
|
+
Dynamic: author
|
27
|
+
Dynamic: author-email
|
28
|
+
Dynamic: classifier
|
29
|
+
Dynamic: description
|
30
|
+
Dynamic: description-content-type
|
31
|
+
Dynamic: home-page
|
32
|
+
Dynamic: keywords
|
33
|
+
Dynamic: license
|
34
|
+
Dynamic: requires-dist
|
35
|
+
Dynamic: summary
|
25
36
|
|
26
37
|
<div align="center">
|
27
38
|
<img src="https://raw.githubusercontent.com/google/pyglove/main/docs/_static/logo_light.svg#gh-light-mode-only" width="320px" alt="logo"></img>
|
@@ -72,7 +83,7 @@ It's commonly used in:
|
|
72
83
|
PyGlove has been [published](https://proceedings.neurips.cc/paper/2020/file/012a91467f210472fab4e11359bbfef6-Paper.pdf)
|
73
84
|
at NeurIPS 2020. It is widely used within [Alphabet](https://abc.xyz/), including Google Research, Google Cloud, Youtube and Waymo.
|
74
85
|
|
75
|
-
PyGlove is developed by Daiyi Peng and colleagues
|
86
|
+
PyGlove is developed by Daiyi Peng and colleagues at [Google Brain](https://research.google/teams/brain/).
|
76
87
|
|
77
88
|
|
78
89
|
## Hello PyGlove
|
@@ -145,6 +156,9 @@ pip install pyglove --pre
|
|
145
156
|
* [Interactive SVG: Components for Direct Manipulation](https://github.com/google/pyglove/blob/main/docs/notebooks/python/interactive_svg.ipynb)
|
146
157
|
* [Where is the Duck: Developing Context-aware Component](https://github.com/google/pyglove/blob/main/docs/notebooks/python/where_is_the_duck.ipynb)
|
147
158
|
|
159
|
+
* Interactive Programming
|
160
|
+
* [Viewing PyGlove objects in HTML](https://colab.research.google.com/github/google/pyglove/blob/main/docs/notebooks/gui/html_view.ipynb)
|
161
|
+
|
148
162
|
## Citing PyGlove
|
149
163
|
|
150
164
|
```
|
@@ -47,7 +47,7 @@ It's commonly used in:
|
|
47
47
|
PyGlove has been [published](https://proceedings.neurips.cc/paper/2020/file/012a91467f210472fab4e11359bbfef6-Paper.pdf)
|
48
48
|
at NeurIPS 2020. It is widely used within [Alphabet](https://abc.xyz/), including Google Research, Google Cloud, Youtube and Waymo.
|
49
49
|
|
50
|
-
PyGlove is developed by Daiyi Peng and colleagues
|
50
|
+
PyGlove is developed by Daiyi Peng and colleagues at [Google Brain](https://research.google/teams/brain/).
|
51
51
|
|
52
52
|
|
53
53
|
## Hello PyGlove
|
@@ -120,6 +120,9 @@ pip install pyglove --pre
|
|
120
120
|
* [Interactive SVG: Components for Direct Manipulation](https://github.com/google/pyglove/blob/main/docs/notebooks/python/interactive_svg.ipynb)
|
121
121
|
* [Where is the Duck: Developing Context-aware Component](https://github.com/google/pyglove/blob/main/docs/notebooks/python/where_is_the_duck.ipynb)
|
122
122
|
|
123
|
+
* Interactive Programming
|
124
|
+
* [Viewing PyGlove objects in HTML](https://colab.research.google.com/github/google/pyglove/blob/main/docs/notebooks/gui/html_view.ipynb)
|
125
|
+
|
123
126
|
## Citing PyGlove
|
124
127
|
|
125
128
|
```
|
@@ -37,8 +37,7 @@ Here lists the sub-modules included in the core PyGlove library:
|
|
37
37
|
|__ tuning : Interface for program tuning with a local backend.
|
38
38
|
|__ detouring : Detouring classes creation without symbolic types.
|
39
39
|
|__ patching : Patching a program with URL-like strings.
|
40
|
-
|__
|
41
|
-
|
40
|
+
|__ utils : Utility libary on operating with Python objects.
|
42
41
|
"""
|
43
42
|
|
44
43
|
# NOTE(daiyip): We disable bad-import-order to preserve the relation of
|
@@ -163,6 +162,7 @@ to_json = symbolic.to_json
|
|
163
162
|
to_json_str = symbolic.to_json_str
|
164
163
|
save = symbolic.save
|
165
164
|
load = symbolic.load
|
165
|
+
open_jsonl = symbolic.open_jsonl
|
166
166
|
get_load_handler = symbolic.get_load_handler
|
167
167
|
set_load_handler = symbolic.set_load_handler
|
168
168
|
get_save_handler = symbolic.get_save_handler
|
@@ -192,7 +192,8 @@ CustomTyping = typing.CustomTyping
|
|
192
192
|
|
193
193
|
get_converter = typing.get_converter
|
194
194
|
register_converter = typing.register_converter
|
195
|
-
|
195
|
+
signature = typing.signature
|
196
|
+
schema = typing.schema
|
196
197
|
|
197
198
|
|
198
199
|
#
|
@@ -271,29 +272,56 @@ ObjectFactory = patching.ObjectFactory
|
|
271
272
|
|
272
273
|
|
273
274
|
#
|
274
|
-
# Symbols from '
|
275
|
+
# Symbols from 'utils' sub-module.
|
275
276
|
#
|
276
277
|
|
277
|
-
from pyglove.core import
|
278
|
-
|
279
|
-
|
278
|
+
from pyglove.core import utils
|
279
|
+
|
280
|
+
# For backward compatibility.
|
281
|
+
object_utils = utils
|
282
|
+
|
283
|
+
KeyPath = utils.KeyPath
|
284
|
+
KeyPathSet = utils.KeyPathSet
|
285
|
+
MISSING_VALUE = utils.MISSING_VALUE
|
286
|
+
|
287
|
+
Formattable = utils.Formattable
|
288
|
+
repr_format = utils.repr_format
|
289
|
+
str_format = utils.str_format
|
290
|
+
|
291
|
+
MaybePartial = utils.MaybePartial
|
292
|
+
JSONConvertible = utils.JSONConvertible
|
293
|
+
DocStr = utils.DocStr
|
294
|
+
|
295
|
+
registered_types = utils.registered_types
|
296
|
+
explicit_method_override = utils.explicit_method_override
|
280
297
|
|
281
|
-
|
282
|
-
|
283
|
-
|
298
|
+
is_partial = utils.is_partial
|
299
|
+
format = utils.format # pylint: disable=redefined-builtin
|
300
|
+
print = utils.print # pylint: disable=redefined-builtin
|
301
|
+
docstr = utils.docstr
|
302
|
+
catch_errors = utils.catch_errors
|
303
|
+
timeit = utils.timeit
|
284
304
|
|
285
|
-
|
286
|
-
|
287
|
-
DocStr = object_utils.DocStr
|
305
|
+
colored = utils.colored
|
306
|
+
decolor = utils.decolor
|
288
307
|
|
289
|
-
|
290
|
-
|
308
|
+
# Symbols from 'views' sub-module.
|
309
|
+
|
310
|
+
from pyglove.core import views
|
311
|
+
view = views.view
|
312
|
+
view_options = views.view_options
|
313
|
+
View = views.View
|
314
|
+
Html = views.Html
|
315
|
+
to_html = views.to_html
|
316
|
+
to_html_str = views.to_html_str
|
317
|
+
|
318
|
+
# NOTE(daiyip): Hack to add `controls` to `pg.views.html`.
|
319
|
+
# We exclude `html.controls` from `pyglove.core.views.html` package to avoid
|
320
|
+
# circular dependency between `pyglove.core.views.html` and
|
321
|
+
# `pyglove.core.symbolic`.
|
322
|
+
from pyglove.core.views.html import controls
|
323
|
+
views.html.controls = controls
|
291
324
|
|
292
|
-
is_partial = object_utils.is_partial
|
293
|
-
format = object_utils.format # pylint: disable=redefined-builtin
|
294
|
-
print = object_utils.print # pylint: disable=redefined-builtin
|
295
|
-
docstr = object_utils.docstr
|
296
|
-
catch_errors = object_utils.catch_errors
|
297
325
|
|
298
326
|
#
|
299
327
|
# Symbols from `io` sub-module.
|
@@ -301,6 +329,12 @@ catch_errors = object_utils.catch_errors
|
|
301
329
|
|
302
330
|
from pyglove.core import io
|
303
331
|
|
332
|
+
#
|
333
|
+
# Symbols from `coding` sub-module.
|
334
|
+
#
|
335
|
+
#
|
336
|
+
|
337
|
+
from pyglove.core import coding
|
304
338
|
|
305
339
|
#
|
306
340
|
# Symbols from `logging.py`.
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright 2024 The PyGlove Authors
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# pylint: disable=line-too-long
|
15
|
+
"""Code generation utilities."""
|
16
|
+
|
17
|
+
# pylint: enable=line-too-long
|
18
|
+
# pylint: disable=g-bad-import-order
|
19
|
+
# pylint: disable=g-importing-member
|
20
|
+
|
21
|
+
from pyglove.core.coding.errors import CodeError
|
22
|
+
from pyglove.core.coding.errors import SerializationError
|
23
|
+
|
24
|
+
from pyglove.core.coding.permissions import CodePermission
|
25
|
+
from pyglove.core.coding.permissions import permission
|
26
|
+
from pyglove.core.coding.permissions import get_permission
|
27
|
+
|
28
|
+
from pyglove.core.coding.parsing import parse
|
29
|
+
|
30
|
+
from pyglove.core.coding.execution import context
|
31
|
+
from pyglove.core.coding.execution import get_context
|
32
|
+
from pyglove.core.coding.execution import evaluate
|
33
|
+
from pyglove.core.coding.execution import sandbox_call
|
34
|
+
from pyglove.core.coding.execution import maybe_sandbox_call
|
35
|
+
from pyglove.core.coding.execution import run
|
36
|
+
|
37
|
+
from pyglove.core.coding.function_generation import NO_TYPE_ANNOTATION
|
38
|
+
from pyglove.core.coding.function_generation import make_function
|
39
|
+
|
40
|
+
# pylint: disable=line-too-long
|
41
|
+
# pylint: enable=g-bad-import-order
|
42
|
+
# pylint: enable=g-importing-member
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# Copyright 2025 The PyGlove Authors
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
"""Python code errors."""
|
15
|
+
|
16
|
+
import io
|
17
|
+
import sys
|
18
|
+
import textwrap
|
19
|
+
import traceback
|
20
|
+
from typing import Optional
|
21
|
+
|
22
|
+
from pyglove.core import utils
|
23
|
+
|
24
|
+
|
25
|
+
class CodeError(RuntimeError):
|
26
|
+
"""Python code error."""
|
27
|
+
|
28
|
+
def __init__(
|
29
|
+
self,
|
30
|
+
code: str,
|
31
|
+
cause: Exception,
|
32
|
+
):
|
33
|
+
self.code = code
|
34
|
+
self.cause = cause
|
35
|
+
|
36
|
+
# Figure out the starting and ending line numbers of the erratic code.
|
37
|
+
lineno = None
|
38
|
+
end_lineno = None
|
39
|
+
if isinstance(cause, SyntaxError):
|
40
|
+
lineno = cause.lineno
|
41
|
+
# For Python 3.9 and below, `end_lineno` is not available.
|
42
|
+
end_lineno = getattr(cause, 'end_lineno', lineno)
|
43
|
+
elif not isinstance(cause, TimeoutError):
|
44
|
+
tb = sys.exc_info()[2]
|
45
|
+
frames = traceback.extract_tb(tb, limit=5)
|
46
|
+
for f in frames:
|
47
|
+
if not f.filename or f.filename == '<string>':
|
48
|
+
lineno = f.lineno
|
49
|
+
end_lineno = lineno
|
50
|
+
break
|
51
|
+
self.lineno = lineno
|
52
|
+
self.end_lineno = end_lineno
|
53
|
+
|
54
|
+
def __str__(self):
|
55
|
+
return self.format(include_complete_code=True)
|
56
|
+
|
57
|
+
def code_lines(self, start_line: int, end_line: int):
|
58
|
+
"""Returns code lines ."""
|
59
|
+
return '\n'.join(self.code.split('\n')[start_line:end_line])
|
60
|
+
|
61
|
+
def format(self, include_complete_code: bool = True):
|
62
|
+
"""Formats the code error."""
|
63
|
+
r = io.StringIO()
|
64
|
+
error_message = str(self.cause).rstrip()
|
65
|
+
if 'line' not in error_message and self.lineno is not None:
|
66
|
+
error_message += f' (<unknown>, line {self.lineno})'
|
67
|
+
r.write(
|
68
|
+
utils.colored(
|
69
|
+
f'{self.cause.__class__.__name__}: {error_message}', 'magenta'))
|
70
|
+
|
71
|
+
if self.lineno is not None:
|
72
|
+
r.write('\n\n')
|
73
|
+
r.write(textwrap.indent(
|
74
|
+
utils.colored(
|
75
|
+
self.code_lines(self.lineno - 1, self.end_lineno), 'magenta'),
|
76
|
+
' ' * 2
|
77
|
+
))
|
78
|
+
r.write('\n')
|
79
|
+
|
80
|
+
if include_complete_code:
|
81
|
+
r.write('\n')
|
82
|
+
r.write(utils.colored('[Code]', 'green', styles=['bold']))
|
83
|
+
r.write('\n\n')
|
84
|
+
r.write(utils.colored(' ```python\n', 'green'))
|
85
|
+
r.write(textwrap.indent(
|
86
|
+
utils.colored(self.code, 'green'),
|
87
|
+
' ' * 2
|
88
|
+
))
|
89
|
+
r.write(utils.colored('\n ```\n', 'green'))
|
90
|
+
return r.getvalue()
|
91
|
+
|
92
|
+
|
93
|
+
class SerializationError(RuntimeError):
|
94
|
+
"""Object serialization error."""
|
95
|
+
|
96
|
+
def __init__(self, message: Optional[str], cause: Exception):
|
97
|
+
self.message = message
|
98
|
+
self.cause = cause
|
99
|
+
|
100
|
+
def __str__(self):
|
101
|
+
r = io.StringIO()
|
102
|
+
cause_message = str(self.cause).rstrip()
|
103
|
+
if self.message:
|
104
|
+
r.write(utils.colored(self.message, 'magenta'))
|
105
|
+
r.write('\n\n')
|
106
|
+
r.write(
|
107
|
+
utils.colored(
|
108
|
+
f'{self.cause.__class__.__name__}: {cause_message}', 'magenta'
|
109
|
+
)
|
110
|
+
)
|
111
|
+
return r.getvalue()
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# Copyright 2025 The PyGlove Authors
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
import inspect
|
15
|
+
import unittest
|
16
|
+
|
17
|
+
from pyglove.core.coding import errors
|
18
|
+
from pyglove.core.coding import execution
|
19
|
+
|
20
|
+
|
21
|
+
def code_error(code: str) -> errors.CodeError:
|
22
|
+
try:
|
23
|
+
execution.run(inspect.cleandoc(code), timeout=2)
|
24
|
+
assert False, 'should not reach here'
|
25
|
+
except errors.CodeError as e:
|
26
|
+
return e
|
27
|
+
|
28
|
+
|
29
|
+
class CodeErrorsTest(unittest.TestCase):
|
30
|
+
|
31
|
+
def test_format(self):
|
32
|
+
e = code_error(
|
33
|
+
"""
|
34
|
+
x = y + 1
|
35
|
+
"""
|
36
|
+
)
|
37
|
+
self.assertIn('[Code]', str(e))
|
38
|
+
self.assertNotIn(
|
39
|
+
'[Code]', e.format(include_complete_code=False))
|
40
|
+
|
41
|
+
def test_lineno(self):
|
42
|
+
self.assertEqual(
|
43
|
+
code_error(
|
44
|
+
"""
|
45
|
+
x = y + 1
|
46
|
+
"""
|
47
|
+
).lineno, 1)
|
48
|
+
self.assertEqual(
|
49
|
+
code_error(
|
50
|
+
"""
|
51
|
+
x = 1
|
52
|
+
for i of x:
|
53
|
+
y = i
|
54
|
+
"""
|
55
|
+
).lineno, 2)
|
56
|
+
self.assertEqual(
|
57
|
+
code_error(
|
58
|
+
"""
|
59
|
+
x = 1
|
60
|
+
y = 2
|
61
|
+
raise ValueError
|
62
|
+
"""
|
63
|
+
).lineno, 3)
|
64
|
+
|
65
|
+
def test_lineno_in_error_message(self):
|
66
|
+
def assert_lineno(code):
|
67
|
+
e = code_error(code)
|
68
|
+
self.assertIn('line', e.format(include_complete_code=False))
|
69
|
+
|
70
|
+
assert_lineno(
|
71
|
+
"""
|
72
|
+
x = y + 1
|
73
|
+
"""
|
74
|
+
)
|
75
|
+
assert_lineno(
|
76
|
+
"""
|
77
|
+
x = 1
|
78
|
+
y = 2
|
79
|
+
"""
|
80
|
+
)
|
81
|
+
assert_lineno(
|
82
|
+
"""
|
83
|
+
raise ValueError()
|
84
|
+
"""
|
85
|
+
)
|
86
|
+
|
87
|
+
|
88
|
+
class SerializationErrorTest(unittest.TestCase):
|
89
|
+
|
90
|
+
def test_str(self):
|
91
|
+
e = errors.SerializationError(
|
92
|
+
'Output cannot be serialized.', ValueError('abc'))
|
93
|
+
self.assertIn('Output cannot be serialized', str(e))
|
94
|
+
self.assertIn('ValueError: abc', str(e))
|
95
|
+
|
96
|
+
|
97
|
+
if __name__ == '__main__':
|
98
|
+
unittest.main()
|