pyglove 0.4.5.dev20240318__tar.gz → 0.4.5.dev202501132210__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 (234) hide show
  1. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/PKG-INFO +17 -3
  2. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/README.md +4 -1
  3. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/__init__.py +54 -20
  4. pyglove-0.4.5.dev202501132210/pyglove/core/coding/__init__.py +42 -0
  5. pyglove-0.4.5.dev202501132210/pyglove/core/coding/errors.py +111 -0
  6. pyglove-0.4.5.dev202501132210/pyglove/core/coding/errors_test.py +98 -0
  7. pyglove-0.4.5.dev202501132210/pyglove/core/coding/execution.py +309 -0
  8. pyglove-0.4.5.dev202501132210/pyglove/core/coding/execution_test.py +333 -0
  9. pyglove-0.4.5.dev20240318/pyglove/core/object_utils/codegen.py → pyglove-0.4.5.dev202501132210/pyglove/core/coding/function_generation.py +10 -4
  10. pyglove-0.4.5.dev20240318/pyglove/core/object_utils/codegen_test.py → pyglove-0.4.5.dev202501132210/pyglove/core/coding/function_generation_test.py +5 -7
  11. pyglove-0.4.5.dev202501132210/pyglove/core/coding/parsing.py +153 -0
  12. pyglove-0.4.5.dev202501132210/pyglove/core/coding/parsing_test.py +150 -0
  13. pyglove-0.4.5.dev202501132210/pyglove/core/coding/permissions.py +100 -0
  14. pyglove-0.4.5.dev202501132210/pyglove/core/coding/permissions_test.py +93 -0
  15. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/base.py +54 -41
  16. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/base_test.py +2 -4
  17. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/categorical.py +37 -28
  18. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/custom.py +19 -16
  19. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/numerical.py +20 -17
  20. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/space.py +4 -5
  21. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/base.py +6 -6
  22. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/categorical.py +94 -55
  23. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/custom.py +7 -7
  24. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/custom_test.py +9 -10
  25. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/derived.py +30 -22
  26. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/derived_test.py +2 -4
  27. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/dynamic_evaluation.py +5 -6
  28. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/evolvable.py +57 -46
  29. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/numerical.py +48 -24
  30. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/numerical_test.py +9 -9
  31. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/object_template.py +58 -46
  32. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/io/__init__.py +1 -0
  33. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/io/file_system.py +17 -7
  34. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/io/file_system_test.py +2 -0
  35. pyglove-0.4.5.dev202501132210/pyglove/core/io/sequence.py +299 -0
  36. pyglove-0.4.5.dev202501132210/pyglove/core/io/sequence_test.py +124 -0
  37. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/logging_test.py +0 -2
  38. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/patching/object_factory.py +4 -4
  39. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/patching/pattern_based.py +4 -4
  40. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/patching/rule_based.py +17 -5
  41. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/patching/rule_based_test.py +27 -4
  42. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/__init__.py +2 -7
  43. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/base.py +320 -183
  44. pyglove-0.4.5.dev202501132210/pyglove/core/symbolic/base_test.py +193 -0
  45. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/boilerplate.py +7 -13
  46. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/boilerplate_test.py +25 -23
  47. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/class_wrapper.py +48 -45
  48. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/class_wrapper_test.py +2 -2
  49. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/compounding.py +9 -15
  50. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/compounding_test.py +2 -4
  51. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/dict.py +154 -110
  52. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/dict_test.py +238 -130
  53. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/diff.py +199 -10
  54. pyglove-0.4.5.dev202501132210/pyglove/core/symbolic/diff_test.py +568 -0
  55. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/flags.py +1 -1
  56. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/functor.py +29 -26
  57. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/functor_test.py +102 -50
  58. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/inferred.py +2 -2
  59. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/list.py +81 -50
  60. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/list_test.py +119 -97
  61. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/object.py +225 -113
  62. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/object_test.py +320 -108
  63. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/origin.py +17 -14
  64. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/origin_test.py +4 -2
  65. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/pure_symbolic.py +4 -3
  66. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/ref.py +108 -21
  67. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/ref_test.py +93 -0
  68. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/symbolize_test.py +10 -2
  69. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/local_backend.py +2 -2
  70. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/protocols.py +3 -3
  71. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/sample_test.py +3 -3
  72. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/__init__.py +14 -5
  73. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/annotation_conversion.py +43 -27
  74. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/annotation_conversion_test.py +23 -0
  75. pyglove-0.4.5.dev202501132210/pyglove/core/typing/callable_ext.py +288 -0
  76. pyglove-0.4.5.dev202501132210/pyglove/core/typing/callable_ext_test.py +327 -0
  77. pyglove-0.4.5.dev202501132210/pyglove/core/typing/callable_signature.py +822 -0
  78. pyglove-0.4.5.dev202501132210/pyglove/core/typing/callable_signature_test.py +831 -0
  79. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/class_schema.py +229 -154
  80. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/class_schema_test.py +149 -95
  81. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/custom_typing.py +5 -4
  82. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/inspect.py +63 -0
  83. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/inspect_test.py +39 -0
  84. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/key_specs.py +10 -11
  85. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/key_specs_test.py +7 -4
  86. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/type_conversion.py +4 -5
  87. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/type_conversion_test.py +12 -12
  88. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/typed_missing.py +6 -7
  89. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/typed_missing_test.py +7 -8
  90. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/value_specs.py +604 -362
  91. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/value_specs_test.py +328 -90
  92. pyglove-0.4.5.dev202501132210/pyglove/core/utils/__init__.py +164 -0
  93. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/common_traits.py +3 -67
  94. pyglove-0.4.5.dev202501132210/pyglove/core/utils/common_traits_test.py +36 -0
  95. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/docstr_utils.py +23 -0
  96. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/docstr_utils_test.py +36 -4
  97. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/error_utils.py +78 -9
  98. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/error_utils_test.py +61 -5
  99. pyglove-0.4.5.dev202501132210/pyglove/core/utils/formatting.py +464 -0
  100. pyglove-0.4.5.dev202501132210/pyglove/core/utils/formatting_test.py +453 -0
  101. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/hierarchical.py +23 -25
  102. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/hierarchical_test.py +3 -5
  103. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/json_conversion.py +177 -52
  104. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/json_conversion_test.py +97 -16
  105. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/missing.py +3 -3
  106. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/missing_test.py +2 -4
  107. pyglove-0.4.5.dev202501132210/pyglove/core/utils/text_color.py +128 -0
  108. pyglove-0.4.5.dev202501132210/pyglove/core/utils/text_color_test.py +94 -0
  109. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/thread_local_test.py +1 -3
  110. pyglove-0.4.5.dev202501132210/pyglove/core/utils/timing.py +236 -0
  111. pyglove-0.4.5.dev202501132210/pyglove/core/utils/timing_test.py +154 -0
  112. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/value_location.py +275 -6
  113. pyglove-0.4.5.dev202501132210/pyglove/core/utils/value_location_test.py +707 -0
  114. pyglove-0.4.5.dev202501132210/pyglove/core/views/__init__.py +32 -0
  115. pyglove-0.4.5.dev202501132210/pyglove/core/views/base.py +804 -0
  116. pyglove-0.4.5.dev202501132210/pyglove/core/views/base_test.py +580 -0
  117. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/__init__.py +27 -0
  118. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/base.py +547 -0
  119. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/base_test.py +830 -0
  120. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/__init__.py +35 -0
  121. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/base.py +275 -0
  122. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/label.py +207 -0
  123. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/label_test.py +157 -0
  124. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/progress_bar.py +183 -0
  125. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/progress_bar_test.py +97 -0
  126. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/tab.py +320 -0
  127. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/tab_test.py +87 -0
  128. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/tooltip.py +99 -0
  129. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/controls/tooltip_test.py +99 -0
  130. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/tree_view.py +1517 -0
  131. pyglove-0.4.5.dev202501132210/pyglove/core/views/html/tree_view_test.py +1461 -0
  132. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove.egg-info/PKG-INFO +17 -3
  133. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove.egg-info/SOURCES.txt +54 -25
  134. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove.egg-info/requires.txt +1 -0
  135. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/setup.py +1 -1
  136. pyglove-0.4.5.dev20240318/pyglove/core/object_utils/__init__.py +0 -154
  137. pyglove-0.4.5.dev20240318/pyglove/core/object_utils/common_traits_test.py +0 -82
  138. pyglove-0.4.5.dev20240318/pyglove/core/object_utils/formatting.py +0 -234
  139. pyglove-0.4.5.dev20240318/pyglove/core/object_utils/formatting_test.py +0 -223
  140. pyglove-0.4.5.dev20240318/pyglove/core/object_utils/value_location_test.py +0 -385
  141. pyglove-0.4.5.dev20240318/pyglove/core/symbolic/base_test.py +0 -89
  142. pyglove-0.4.5.dev20240318/pyglove/core/symbolic/diff_test.py +0 -342
  143. pyglove-0.4.5.dev20240318/pyglove/core/symbolic/schema_utils.py +0 -327
  144. pyglove-0.4.5.dev20240318/pyglove/core/symbolic/schema_utils_test.py +0 -57
  145. pyglove-0.4.5.dev20240318/pyglove/core/typing/callable_ext.py +0 -50
  146. pyglove-0.4.5.dev20240318/pyglove/core/typing/callable_ext_test.py +0 -72
  147. pyglove-0.4.5.dev20240318/pyglove/core/typing/callable_signature.py +0 -378
  148. pyglove-0.4.5.dev20240318/pyglove/core/typing/callable_signature_test.py +0 -311
  149. pyglove-0.4.5.dev20240318/pyglove/core/typing/class_schema_utils.py +0 -202
  150. pyglove-0.4.5.dev20240318/pyglove/core/typing/class_schema_utils_test.py +0 -194
  151. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/LICENSE +0 -0
  152. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/__init__.py +0 -0
  153. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/detouring/__init__.py +0 -0
  154. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/detouring/class_detour.py +0 -0
  155. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/detouring/class_detour_test.py +0 -0
  156. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/__init__.py +0 -0
  157. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/categorical_test.py +0 -0
  158. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/custom_test.py +0 -0
  159. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/deduping.py +0 -0
  160. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/deduping_test.py +0 -0
  161. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/dna_generator.py +0 -0
  162. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/dna_generator_test.py +0 -0
  163. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/numerical_test.py +0 -0
  164. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/random.py +0 -0
  165. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/random_test.py +0 -0
  166. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/space_test.py +0 -0
  167. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/sweeping.py +0 -0
  168. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/geno/sweeping_test.py +0 -0
  169. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/__init__.py +0 -0
  170. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/categorical_test.py +0 -0
  171. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/dynamic_evaluation_test.py +0 -0
  172. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/evolvable_test.py +0 -0
  173. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/iter.py +0 -0
  174. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/iter_test.py +0 -0
  175. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/hyper/object_template_test.py +0 -0
  176. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/logging.py +0 -0
  177. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/patching/__init__.py +0 -0
  178. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/patching/object_factory_test.py +0 -0
  179. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/patching/pattern_based_test.py +0 -0
  180. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/flags_test.py +0 -0
  181. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/inferred_test.py +0 -0
  182. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/symbolic/symbolize.py +0 -0
  183. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/__init__.py +0 -0
  184. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/backend.py +0 -0
  185. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/backend_test.py +0 -0
  186. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/early_stopping.py +0 -0
  187. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/protocols_test.py +0 -0
  188. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/tuning/sample.py +0 -0
  189. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/annotated.py +0 -0
  190. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/annotated_test.py +0 -0
  191. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/core/typing/pytype_support.py +0 -0
  192. {pyglove-0.4.5.dev20240318/pyglove/core/object_utils → pyglove-0.4.5.dev202501132210/pyglove/core/utils}/thread_local.py +0 -0
  193. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/__init__.py +0 -0
  194. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/early_stopping/__init__.py +0 -0
  195. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/early_stopping/base.py +0 -0
  196. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/early_stopping/base_test.py +0 -0
  197. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/early_stopping/step_wise.py +0 -0
  198. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/early_stopping/step_wise_test.py +0 -0
  199. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/__init__.py +0 -0
  200. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/base.py +0 -0
  201. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/base_test.py +0 -0
  202. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/hill_climb.py +0 -0
  203. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/hill_climb_test.py +0 -0
  204. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/mutators.py +0 -0
  205. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/mutators_test.py +0 -0
  206. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/neat.py +0 -0
  207. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/neat_test.py +0 -0
  208. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/nsga2.py +0 -0
  209. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/nsga2_test.py +0 -0
  210. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/recombinators.py +0 -0
  211. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/recombinators_test.py +0 -0
  212. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/regularized_evolution.py +0 -0
  213. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/regularized_evolution_test.py +0 -0
  214. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/selectors.py +0 -0
  215. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/selectors_test.py +0 -0
  216. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/where.py +0 -0
  217. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/evolution/where_test.py +0 -0
  218. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/mutfun/__init__.py +0 -0
  219. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/mutfun/base.py +0 -0
  220. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/mutfun/base_test.py +0 -0
  221. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/mutfun/basic_ops.py +0 -0
  222. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/mutfun/basic_ops_test.py +0 -0
  223. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/__init__.py +0 -0
  224. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/base.py +0 -0
  225. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/base_test.py +0 -0
  226. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/maths.py +0 -0
  227. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/maths_test.py +0 -0
  228. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/randoms.py +0 -0
  229. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/randoms_test.py +0 -0
  230. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/step_wise.py +0 -0
  231. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove/ext/scalars/step_wise_test.py +0 -0
  232. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove.egg-info/dependency_links.txt +0 -0
  233. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/pyglove.egg-info/top_level.txt +0 -0
  234. {pyglove-0.4.5.dev20240318 → pyglove-0.4.5.dev202501132210}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: pyglove
3
- Version: 0.4.5.dev20240318
3
+ Version: 0.4.5.dev202501132210
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 in [Google Brain Team](https://research.google/teams/brain/).
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 in [Google Brain Team](https://research.google/teams/brain/).
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
- |__ object_utils : Utility libary on operating with Python objects.
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
- get_signature = typing.get_signature
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 'object_utils' sub-module.
275
+ # Symbols from 'utils' sub-module.
275
276
  #
276
277
 
277
- from pyglove.core import object_utils
278
- KeyPath = object_utils.KeyPath
279
- MISSING_VALUE = object_utils.MISSING_VALUE
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
- Formattable = object_utils.Formattable
282
- repr_format = object_utils.repr_format
283
- str_format = object_utils.str_format
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
- MaybePartial = object_utils.MaybePartial
286
- JSONConvertible = object_utils.JSONConvertible
287
- DocStr = object_utils.DocStr
305
+ colored = utils.colored
306
+ decolor = utils.decolor
288
307
 
289
- registered_types = object_utils.registered_types
290
- explicit_method_override = object_utils.explicit_method_override
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()