uproot 5.2.2rc1__tar.gz → 5.3.0__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 (265) hide show
  1. {uproot-5.2.2rc1 → uproot-5.3.0}/.all-contributorsrc +18 -0
  2. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/workflows/deploy.yml +2 -2
  3. {uproot-5.2.2rc1 → uproot-5.3.0}/.gitignore +3 -0
  4. {uproot-5.2.2rc1 → uproot-5.3.0}/.pre-commit-config.yaml +4 -4
  5. {uproot-5.2.2rc1 → uproot-5.3.0}/.readthedocs.yml +5 -1
  6. {uproot-5.2.2rc1 → uproot-5.3.0}/PKG-INFO +7 -3
  7. {uproot-5.2.2rc1 → uproot-5.3.0}/README.md +4 -0
  8. {uproot-5.2.2rc1 → uproot-5.3.0}/dev/example-objects.py +1 -0
  9. {uproot-5.2.2rc1 → uproot-5.3.0}/dev/make-models.py +1 -0
  10. uproot-5.3.0/docs-img/.DS_Store +0 -0
  11. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-sphinx/prepare_docstrings.py +4 -2
  12. uproot-5.3.0/docs-sphinx/requirements.txt +2 -0
  13. {uproot-5.2.2rc1 → uproot-5.3.0}/pyproject.toml +12 -11
  14. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/__init__.py +1 -0
  15. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/_dask.py +119 -25
  16. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TBranch.py +3 -2
  17. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TProfile.py +3 -1
  18. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/compression.py +78 -38
  19. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/extras.py +21 -27
  20. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/library.py +64 -44
  21. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/objects.py +43 -5
  22. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/model.py +17 -1
  23. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/RNTuple.py +81 -43
  24. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/reading.py +2 -0
  25. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/fsspec.py +2 -0
  26. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/version.py +2 -2
  27. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/writing/__init__.py +2 -0
  28. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/writing/_cascade.py +2 -4
  29. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/writing/_cascadetree.py +12 -12
  30. uproot-5.3.0/src/uproot/writing/_dask_write.py +185 -0
  31. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/writing/identify.py +136 -88
  32. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0008_start_interpretation.py +5 -1
  33. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0416_writing_compressed_data.py +64 -15
  34. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0692_fsspec_writing.py +29 -2
  35. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0962_RNTuple_update.py +29 -0
  36. uproot-5.3.0/tests/test_1000-write-TProfiles.py +112 -0
  37. uproot-5.3.0/tests/test_1058_dask_awkward_report.py +45 -0
  38. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_1063_dask_distributed.py +1 -0
  39. uproot-5.3.0/tests/test_1070_pandas_dataframe_building_performance_fix.py +14 -0
  40. uproot-5.3.0/tests/test_1085_dask_write.py +83 -0
  41. uproot-5.3.0/tests/test_1102_any_locks_in_models_must_be_transient.py +12 -0
  42. uproot-5.3.0/tests/test_1114_fix_attempt_to_concatenate_numpy_with_awkward.py +21 -0
  43. uproot-5.3.0/tests/test_1120_check_decompression_executor_pass_for_dask.py +27 -0
  44. uproot-5.3.0/tests/test_1127_fix_allow_colon_in_key_names.py +26 -0
  45. uproot-5.2.2rc1/docs-sphinx/requirements.txt +0 -1
  46. uproot-5.2.2rc1/tests/test_1058_dask_awkward_report.py +0 -25
  47. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  48. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  49. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  50. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  51. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/dependabot.yml +0 -0
  52. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/workflows/build-test.yml +0 -0
  53. {uproot-5.2.2rc1 → uproot-5.3.0}/.github/workflows/semantic-pr-title.yml +0 -0
  54. {uproot-5.2.2rc1 → uproot-5.3.0}/CITATION.cff +0 -0
  55. {uproot-5.2.2rc1 → uproot-5.3.0}/LICENSE +0 -0
  56. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/diagrams/abstraction-layers.png +0 -0
  57. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/diagrams/abstraction-layers.svg +0 -0
  58. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/diagrams/example-dask-graph.png +0 -0
  59. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/diagrams/uproot-awkward-timeline.png +0 -0
  60. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/diagrams/uproot-awkward-timeline.svg +0 -0
  61. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/logo/logo-300px-white.png +0 -0
  62. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/logo/logo-300px.png +0 -0
  63. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/logo/logo-600px.png +0 -0
  64. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/logo/logo.svg +0 -0
  65. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-img/photos/switcheroo.jpg +0 -0
  66. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-sphinx/_templates/breadcrumbs.html +0 -0
  67. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-sphinx/basic.rst +0 -0
  68. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-sphinx/conf.py +0 -0
  69. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-sphinx/index.rst +0 -0
  70. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-sphinx/make_changelog.py +0 -0
  71. {uproot-5.2.2rc1 → uproot-5.3.0}/docs-sphinx/uproot3-to-4.rst +0 -0
  72. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/_awkwardforth.py +0 -0
  73. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/_util.py +0 -0
  74. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behavior.py +0 -0
  75. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/RooCurve.py +0 -0
  76. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/RooHist.py +0 -0
  77. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TAxis.py +0 -0
  78. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TBranchElement.py +0 -0
  79. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TDatime.py +0 -0
  80. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TGraph.py +0 -0
  81. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TGraphAsymmErrors.py +0 -0
  82. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TGraphErrors.py +0 -0
  83. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TH1.py +0 -0
  84. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TH2.py +0 -0
  85. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TH2Poly.py +0 -0
  86. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TH3.py +0 -0
  87. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TParameter.py +0 -0
  88. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TProfile2D.py +0 -0
  89. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TProfile3D.py +0 -0
  90. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/TTree.py +0 -0
  91. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/behaviors/__init__.py +0 -0
  92. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/cache.py +0 -0
  93. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/const.py +0 -0
  94. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/containers.py +0 -0
  95. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/deserialization.py +0 -0
  96. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/dynamic.py +0 -0
  97. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/exceptions.py +0 -0
  98. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/__init__.py +0 -0
  99. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/grouped.py +0 -0
  100. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/identify.py +0 -0
  101. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/jagged.py +0 -0
  102. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/numerical.py +0 -0
  103. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/interpretation/strings.py +0 -0
  104. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/language/__init__.py +0 -0
  105. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/language/python.py +0 -0
  106. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TArray.py +0 -0
  107. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TAtt.py +0 -0
  108. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TBasket.py +0 -0
  109. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TBranch.py +0 -0
  110. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TClonesArray.py +0 -0
  111. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TDatime.py +0 -0
  112. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TGraph.py +0 -0
  113. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TH.py +0 -0
  114. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/THashList.py +0 -0
  115. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TLeaf.py +0 -0
  116. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TList.py +0 -0
  117. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TMatrixT.py +0 -0
  118. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TNamed.py +0 -0
  119. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TObjArray.py +0 -0
  120. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TObjString.py +0 -0
  121. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TObject.py +0 -0
  122. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TRef.py +0 -0
  123. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TString.py +0 -0
  124. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TTable.py +0 -0
  125. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/TTree.py +0 -0
  126. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/models/__init__.py +0 -0
  127. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/pyroot.py +0 -0
  128. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/serialization.py +0 -0
  129. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/sink/__init__.py +0 -0
  130. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/sink/file.py +0 -0
  131. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/__init__.py +0 -0
  132. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/chunk.py +0 -0
  133. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/cursor.py +0 -0
  134. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/file.py +0 -0
  135. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/futures.py +0 -0
  136. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/http.py +0 -0
  137. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/object.py +0 -0
  138. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/s3.py +0 -0
  139. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/source/xrootd.py +0 -0
  140. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/streamers.py +0 -0
  141. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/writing/_cascadentuple.py +0 -0
  142. {uproot-5.2.2rc1 → uproot-5.3.0}/src/uproot/writing/writable.py +0 -0
  143. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/__init__.py +0 -0
  144. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/conftest.py +0 -0
  145. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/samples/h_dynamic.pkl +0 -0
  146. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0001_source_class.py +0 -0
  147. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0006_notify_when_downloaded.py +0 -0
  148. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0007_single_chunk_interface.py +0 -0
  149. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0009_nested_directories.py +0 -0
  150. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0010_start_streamers.py +0 -0
  151. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0011_generate_classes_from_streamers.py +0 -0
  152. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0013_rntuple_anchor.py +0 -0
  153. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0014_all_ttree_versions.py +0 -0
  154. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0016_interpretations.py +0 -0
  155. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0017_multi_basket_multi_branch_fetch.py +0 -0
  156. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0018_array_fetching_interface.py +0 -0
  157. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0022_number_of_branches.py +0 -0
  158. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0023_more_interpretations_1.py +0 -0
  159. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0023_ttree_versions.py +0 -0
  160. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0028_fallback_to_read_streamer.py +0 -0
  161. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0029_more_string_types.py +0 -0
  162. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0031_test_stl_containers.py +0 -0
  163. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0033_more_interpretations_2.py +0 -0
  164. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0034_generic_objects_in_ttrees.py +0 -0
  165. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0035_datatype_generality.py +0 -0
  166. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0038_memberwise_serialization.py +0 -0
  167. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0043_iterate_function.py +0 -0
  168. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0044_concatenate_function.py +0 -0
  169. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0046_histograms_bh_hist.py +0 -0
  170. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0053_parents_should_not_be_bases.py +0 -0
  171. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0058_detach_model_objects_from_files.py +0 -0
  172. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0066_fix_http_fallback_freeze.py +0 -0
  173. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0067_common_entry_offsets.py +0 -0
  174. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0081_dont_parse_colons.py +0 -0
  175. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0087_memberwise_splitting_not_implemented_messages.py +0 -0
  176. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0088_read_with_http.py +0 -0
  177. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0099_read_from_file_object.py +0 -0
  178. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0112_fix_pandas_with_cut.py +0 -0
  179. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0118_fix_name_fetch_again.py +0 -0
  180. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0123_atlas_issues.py +0 -0
  181. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0126_turn_unknown_emptyarrays_into_known_types.py +0 -0
  182. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0167_use_the_common_histogram_interface.py +0 -0
  183. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0172_allow_allocators_in_vector_typenames.py +0 -0
  184. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0173_empty_and_multiprocessing_bugs.py +0 -0
  185. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0182_complain_about_missing_files.py +0 -0
  186. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0194_fix_lost_cuts_in_iterate.py +0 -0
  187. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0220_contiguous_byte_ranges_in_http.py +0 -0
  188. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0228_read_TProfiles.py +0 -0
  189. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0240_read_TGraphAsymmErrors.py +0 -0
  190. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0278_specializations_for_TParameter.py +0 -0
  191. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0302_pickle.py +0 -0
  192. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0303_empty_jagged_array.py +0 -0
  193. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0320_start_working_on_ROOT_writing.py +0 -0
  194. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0322_writablefile_infrastructure.py +0 -0
  195. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0329_update_existing_root_files.py +0 -0
  196. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0335_empty_ttree_division_by_zero.py +0 -0
  197. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0341_manipulate_streamer_info.py +0 -0
  198. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0344_writabledirectory_can_read.py +0 -0
  199. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0345_bulk_copy_method.py +0 -0
  200. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0349_write_TObjString.py +0 -0
  201. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0350_read_RooCurve_RooHist.py +0 -0
  202. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0351_write_TList.py +0 -0
  203. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0352_write_THashList.py +0 -0
  204. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0384_move_behavior_of_and_fix_383.py +0 -0
  205. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0398_dimensions_in_leaflist.py +0 -0
  206. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0405_write_a_histogram.py +0 -0
  207. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0406_write_a_ttree.py +0 -0
  208. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0407_read_TDatime.py +0 -0
  209. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0412_write_multidimensional_numpy_to_ttree.py +0 -0
  210. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0414_write_jagged_arrays.py +0 -0
  211. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0418_read_TTable.py +0 -0
  212. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0420_pyroot_uproot_interoperability.py +0 -0
  213. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0422_hist_integration.py +0 -0
  214. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0430_global_index_for_tuples_of_DataFrames.py +0 -0
  215. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0438_TClonesArray_is_not_AsGrouped.py +0 -0
  216. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0439_check_awkward_before_numpy.py +0 -0
  217. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0442_regular_TClonesArray.py +0 -0
  218. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0472_tstreamerinfo_for_ttree.py +0 -0
  219. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0475_remember_to_update_freesegments.py +0 -0
  220. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0484_manually_add_model_for_TMatrixTSym_double_.py +0 -0
  221. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0487_implement_asdtypeinplace.py +0 -0
  222. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0498_create_leaf_branch_in_extend.py +0 -0
  223. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0519_remove_memmap_copy.py +0 -0
  224. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0520_dynamic_classes_cant_be_abc_subclasses.py +0 -0
  225. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0569_fBits_is_4_bytes.py +0 -0
  226. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0576_unicode_in_names.py +0 -0
  227. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0578_dask_for_numpy.py +0 -0
  228. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0580_round_trip_for_no_flow_histograms.py +0 -0
  229. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0589_explicitly_interpret_RVec_type.py +0 -0
  230. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0603_dask_delayed_open.py +0 -0
  231. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0609_num_enteries_func.py +0 -0
  232. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0610_awkward_form.py +0 -0
  233. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0630_rntuple_basics.py +0 -0
  234. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0637_setup_tests_for_AwkwardForth.py +0 -0
  235. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0643_reading_vector_pair_TLorentzVector_int.py +0 -0
  236. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0651_implement_transformed_axis.py +0 -0
  237. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0652_dask_for_awkward.py +0 -0
  238. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0662_rntuple_stl_containers.py +0 -0
  239. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0692_fsspec_reading.py +0 -0
  240. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0700_dask_empty_arrays.py +0 -0
  241. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0705_rntuple_writing_metadata.py +0 -0
  242. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0750_avoid_empty_TBasket_issue.py +0 -0
  243. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0755_dask_awkward_column_projection.py +0 -0
  244. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0791_protect_uproot_project_columns_from_dask_node_names.py +0 -0
  245. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0798_DAOD_PHYSLITE.py +0 -0
  246. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0808_fix_awkward_form_for_AsStridedObjects.py +0 -0
  247. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0816_separate_AwkwardForth_machines_by_TBranch.py +0 -0
  248. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0832_ak_add_doc_should_also_add_to_typetracer.py +0 -0
  249. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0840_support_tleafG.py +0 -0
  250. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0841_fix_814.py +0 -0
  251. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0844_fix_delete_hist_from_root.py +0 -0
  252. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0852_fix_strided_interp_extra_offsets.py +0 -0
  253. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0870_writing_arrays_of_type_unknown_fix_822.py +0 -0
  254. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0876_uproot_dask_blind_steps.py +0 -0
  255. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0886_fix_awkward_form_breadcrumbs.py +0 -0
  256. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0910_fix_906_members_non_numerical_branches.py +0 -0
  257. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0911_fix_interp_array_non_numerical_objs_issue_880.py +0 -0
  258. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0912_fix_pandas_and_double_nested_vectors_issue_885.py +0 -0
  259. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0916_read_from_s3.py +0 -0
  260. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0927_dont_assume_uproot_in_global_scope_in_TPython_Eval.py +0 -0
  261. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0930_expressions_in_pandas.py +0 -0
  262. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0940_feat_add_TLeafC_string_support.py +0 -0
  263. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0965_inverted_axes_variances_hist_888.py +0 -0
  264. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_0976_path_object_split.py +0 -0
  265. {uproot-5.2.2rc1 → uproot-5.3.0}/tests/test_1043_const_std_string.py +0 -0
@@ -524,6 +524,24 @@
524
524
  "contributions": [
525
525
  "code"
526
526
  ]
527
+ },
528
+ {
529
+ "login": "bnavigator",
530
+ "name": "Ben Greiner",
531
+ "avatar_url": "https://avatars.githubusercontent.com/u/4623504?v=4",
532
+ "profile": "https://github.com/bnavigator",
533
+ "contributions": [
534
+ "test"
535
+ ]
536
+ },
537
+ {
538
+ "login": "YSelfTool",
539
+ "name": "Robin Sonnabend",
540
+ "avatar_url": "https://avatars.githubusercontent.com/u/1640386?v=4",
541
+ "profile": "http://tooldev.de",
542
+ "contributions": [
543
+ "code"
544
+ ]
527
545
  }
528
546
  ],
529
547
  "contributorsPerLine": 7,
@@ -18,7 +18,7 @@ jobs:
18
18
  - name: Check metadata
19
19
  run: pipx run twine check dist/*
20
20
 
21
- - uses: actions/upload-artifact@v3
21
+ - uses: actions/upload-artifact@v4
22
22
  with:
23
23
  path: dist/*
24
24
 
@@ -29,7 +29,7 @@ jobs:
29
29
  if: github.event_name == 'release' && github.event.action == 'published'
30
30
 
31
31
  steps:
32
- - uses: actions/download-artifact@v3
32
+ - uses: actions/download-artifact@v4
33
33
  with:
34
34
  name: artifact
35
35
  path: dist
@@ -1,3 +1,6 @@
1
+ # hatch-vcs
2
+ src/uproot/version.py
3
+
1
4
  # Sphinx documentation
2
5
  docs-sphinx/_build
3
6
  docs-sphinx/changelog.rst
@@ -18,25 +18,25 @@ repos:
18
18
  - id: trailing-whitespace
19
19
 
20
20
  - repo: https://github.com/psf/black-pre-commit-mirror
21
- rev: 23.11.0
21
+ rev: 24.2.0
22
22
  hooks:
23
23
  - id: black
24
24
 
25
25
  - repo: https://github.com/astral-sh/ruff-pre-commit
26
- rev: v0.1.7
26
+ rev: v0.2.2
27
27
  hooks:
28
28
  - id: ruff
29
29
  args: [--fix, --show-fixes]
30
30
 
31
31
 
32
32
  - repo: https://github.com/asottile/pyupgrade
33
- rev: v3.15.0
33
+ rev: v3.15.1
34
34
  hooks:
35
35
  - id: pyupgrade
36
36
  args: [--py38-plus]
37
37
 
38
38
  - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
39
- rev: v2.11.0
39
+ rev: v2.12.0
40
40
  hooks:
41
41
  - id: pretty-format-toml
42
42
  args: [--autofix]
@@ -3,8 +3,12 @@ version: 2
3
3
  sphinx:
4
4
  configuration: docs-sphinx/conf.py
5
5
 
6
+ build:
7
+ os: ubuntu-22.04
8
+ tools:
9
+ python: '3.8'
10
+
6
11
  python:
7
- version: 3.7
8
12
  install:
9
13
  - requirements: docs-sphinx/requirements.txt
10
14
  - method: pip
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uproot
3
- Version: 5.2.2rc1
3
+ Version: 5.3.0
4
4
  Summary: ROOT I/O in pure Python and NumPy.
5
5
  Project-URL: Download, https://github.com/scikit-hep/uproot5/releases
6
6
  Project-URL: Homepage, https://github.com/scikit-hep/uproot5
@@ -31,6 +31,7 @@ Classifier: Topic :: Software Development
31
31
  Classifier: Topic :: Utilities
32
32
  Requires-Python: >=3.8
33
33
  Requires-Dist: awkward>=2.4.6
34
+ Requires-Dist: cramjam>=2.8.1
34
35
  Requires-Dist: fsspec
35
36
  Requires-Dist: importlib-metadata; python_version < '3.8'
36
37
  Requires-Dist: numpy
@@ -46,7 +47,7 @@ Requires-Dist: pandas; extra == 'dev'
46
47
  Provides-Extra: test
47
48
  Requires-Dist: aiohttp; extra == 'test'
48
49
  Requires-Dist: fsspec-xrootd; extra == 'test'
49
- Requires-Dist: lz4; extra == 'test'
50
+ Requires-Dist: isal; extra == 'test'
50
51
  Requires-Dist: minio; extra == 'test'
51
52
  Requires-Dist: paramiko; extra == 'test'
52
53
  Requires-Dist: pytest-rerunfailures; extra == 'test'
@@ -57,7 +58,6 @@ Requires-Dist: requests; extra == 'test'
57
58
  Requires-Dist: s3fs; extra == 'test'
58
59
  Requires-Dist: scikit-hep-testdata; extra == 'test'
59
60
  Requires-Dist: xxhash; extra == 'test'
60
- Requires-Dist: zstandard; extra == 'test'
61
61
  Description-Content-Type: text/markdown
62
62
 
63
63
  <img src="https://raw.githubusercontent.com/scikit-hep/uproot5/main/docs-img/logo/logo.svg" width="300px">
@@ -243,6 +243,10 @@ Thanks especially to the gracious help of Uproot contributors (including the [or
243
243
  <td align="center" valign="top" width="14.28%"><a href="http://glepage.com"><img src="https://avatars.githubusercontent.com/u/33058747?v=4?s=100" width="100px;" alt="Gaétan Lepage"/><br /><sub><b>Gaétan Lepage</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=GaetanLepage" title="Tests">⚠️</a></td>
244
244
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/HaarigerHarald"><img src="https://avatars.githubusercontent.com/u/8050292?v=4?s=100" width="100px;" alt="HaarigerHarald"/><br /><sub><b>HaarigerHarald</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=HaarigerHarald" title="Code">💻</a></td>
245
245
  </tr>
246
+ <tr>
247
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/bnavigator"><img src="https://avatars.githubusercontent.com/u/4623504?v=4?s=100" width="100px;" alt="Ben Greiner"/><br /><sub><b>Ben Greiner</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=bnavigator" title="Tests">⚠️</a></td>
248
+ <td align="center" valign="top" width="14.28%"><a href="http://tooldev.de"><img src="https://avatars.githubusercontent.com/u/1640386?v=4?s=100" width="100px;" alt="Robin Sonnabend"/><br /><sub><b>Robin Sonnabend</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=YSelfTool" title="Code">💻</a></td>
249
+ </tr>
246
250
  </tbody>
247
251
  </table>
248
252
 
@@ -181,6 +181,10 @@ Thanks especially to the gracious help of Uproot contributors (including the [or
181
181
  <td align="center" valign="top" width="14.28%"><a href="http://glepage.com"><img src="https://avatars.githubusercontent.com/u/33058747?v=4?s=100" width="100px;" alt="Gaétan Lepage"/><br /><sub><b>Gaétan Lepage</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=GaetanLepage" title="Tests">⚠️</a></td>
182
182
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/HaarigerHarald"><img src="https://avatars.githubusercontent.com/u/8050292?v=4?s=100" width="100px;" alt="HaarigerHarald"/><br /><sub><b>HaarigerHarald</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=HaarigerHarald" title="Code">💻</a></td>
183
183
  </tr>
184
+ <tr>
185
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/bnavigator"><img src="https://avatars.githubusercontent.com/u/4623504?v=4?s=100" width="100px;" alt="Ben Greiner"/><br /><sub><b>Ben Greiner</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=bnavigator" title="Tests">⚠️</a></td>
186
+ <td align="center" valign="top" width="14.28%"><a href="http://tooldev.de"><img src="https://avatars.githubusercontent.com/u/1640386?v=4?s=100" width="100px;" alt="Robin Sonnabend"/><br /><sub><b>Robin Sonnabend</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=YSelfTool" title="Code">💻</a></td>
187
+ </tr>
184
188
  </tbody>
185
189
  </table>
186
190
 
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Use this to make an example ROOT file for src/uproot/models/TH.py and src/uproot/models/TGraph.py.
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import numpy as np
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Use this to make src/uproot/models/TH.py and src/uproot/models/TGraph.py.
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import numpy as np
Binary file
@@ -37,6 +37,7 @@ common = [
37
37
  "uproot.behaviors.TBranch.iterate",
38
38
  "uproot.behaviors.TBranch.concatenate",
39
39
  "uproot._dask.dask",
40
+ "uproot.writing._dask_write.dask_write",
40
41
  "uproot.writing.writable.create",
41
42
  "uproot.writing.writable.recreate",
42
43
  "uproot.writing.writable.update",
@@ -106,7 +107,7 @@ def ensure(filename, content):
106
107
 
107
108
  def handle_module(modulename, module):
108
109
  if any(x.startswith("_") for x in modulename.split(".")) and not any(
109
- x == "_dask" for x in modulename.split(".")
110
+ x == "_dask" or x == "_dask_write" for x in modulename.split(".")
110
111
  ):
111
112
  return
112
113
 
@@ -124,7 +125,8 @@ def handle_module(modulename, module):
124
125
  toctree2.write(" " + modulename + " (module) <" + modulename + ">\n")
125
126
 
126
127
  if modulename != "uproot" and all(
127
- not x.startswith("_") or x == "_dask" for x in modulename.split(".")
128
+ not x.startswith("_") or x == "_dask" or x == "_dask_write"
129
+ for x in modulename.split(".")
128
130
  ):
129
131
 
130
132
  def good(obj):
@@ -0,0 +1,2 @@
1
+ sphinx>=2.4.4
2
+ sphinx-rtd-theme
@@ -5,6 +5,9 @@ requires = [
5
5
  "hatch-vcs"
6
6
  ]
7
7
 
8
+ [lint.mccabe]
9
+ max-complexity = 100
10
+
8
11
  [project]
9
12
  authors = [
10
13
  {name = "Jim Pivarski", email = "pivarski@princeton.edu"}
@@ -35,6 +38,7 @@ classifiers = [
35
38
  ]
36
39
  dependencies = [
37
40
  "awkward>=2.4.6",
41
+ "cramjam>=2.8.1",
38
42
  "importlib-metadata;python_version<\"3.8\"",
39
43
  "numpy",
40
44
  "fsspec",
@@ -60,9 +64,8 @@ dev = [
60
64
  "awkward-pandas"
61
65
  ]
62
66
  test = [
63
- "lz4",
67
+ "isal",
64
68
  "xxhash",
65
- "zstandard",
66
69
  "minio",
67
70
  "aiohttp",
68
71
  "fsspec-xrootd",
@@ -100,6 +103,7 @@ log_cli_level = "info"
100
103
  markers = [
101
104
  "slow",
102
105
  "network",
106
+ "distributed",
103
107
  "xrootd"
104
108
  ]
105
109
  minversion = "6.0"
@@ -113,6 +117,9 @@ exclude = [
113
117
  "src/uproot/__init__.py",
114
118
  "docs-sphinx/*.py"
115
119
  ]
120
+ src = ["src"]
121
+
122
+ [tool.ruff.lint]
116
123
  ignore = [
117
124
  "E501",
118
125
  "E722",
@@ -121,7 +128,7 @@ ignore = [
121
128
  "SIM118", # key in dict, broken since uproot doesn't behave like a dict
122
129
  "PGH003", # too-broad type ignore
123
130
  "SIM114", # combine `if` branches using logical `or` operator
124
- "PGH001", # no eval allowed
131
+ "S307", # no eval allowed
125
132
  "PLC1901", # empty string is falsey (but I don't want to rely on such weak typing)
126
133
  "RUF012" # enforces type annotations on a codebase that lacks type annotations
127
134
  ]
@@ -145,16 +152,10 @@ select = [
145
152
  "UP", # pyupgrade
146
153
  "YTT" # flake8-2020
147
154
  ]
148
- src = ["src"]
149
-
150
- [tool.ruff.lint]
151
155
  isort.required-imports = ["from __future__ import annotations"]
152
156
 
153
- [tool.ruff.mccabe]
154
- max-complexity = 100
155
-
156
- [tool.ruff.per-file-ignores]
157
- "dev/*" = ["T20"]
157
+ [tool.ruff.lint.per-file-ignores]
158
+ "dev/*" = ["T20", "T201"]
158
159
  "src/uproot/*/file.py" = ["SIM115"]
159
160
 
160
161
  [tool.setuptools_scm]
@@ -123,6 +123,7 @@ from uproot.writing import WritableDirectory
123
123
  from uproot.writing import WritableTree
124
124
  from uproot.writing import WritableBranch
125
125
  from uproot.writing import to_writable
126
+ from uproot.writing import dask_write
126
127
 
127
128
  import uproot.models.TObject
128
129
  import uproot.models.TString
@@ -43,6 +43,8 @@ def dask(
43
43
  form_mapping=None,
44
44
  allow_read_errors_with_report=False,
45
45
  known_base_form=None,
46
+ decompression_executor=None,
47
+ interpretation_executor=None,
46
48
  **options,
47
49
  ):
48
50
  """
@@ -96,12 +98,23 @@ def dask(
96
98
  form_mapping (Callable[awkward.forms.Form] -> awkward.forms.Form | None): If not none
97
99
  and library="ak" then apply this remapping function to the awkward form of the input
98
100
  data. The form keys of the desired form should be available data in the input form.
99
- allow_read_errors_with_report (bool): If True, catch OSError exceptions and return an
100
- empty array for these nodes in the task graph. The return of this function then
101
- becomes a two element tuple, where the first return is the dask-awkward collection
102
- of interest and the second return is a report dask-awkward collection.
101
+ allow_read_errors_with_report (bool or tuple of exceptions): If True, catch OSError
102
+ exceptions and return an empty array for these nodes in the task graph. If a tuple,
103
+ catch any of those exceptions and return empty arrays for those nodes. In either of
104
+ those cases, The return of this function becomes a two element tuple, where the
105
+ first return is the dask-awkward collection of interest and the second return is a
106
+ report dask-awkward collection.
103
107
  known_base_form (awkward.forms.Form | None): If not none use this form instead of opening
104
108
  one file to determine the dataset's form. Only available with open_files=False.
109
+ decompression_executor (None or Executor with a ``submit`` method): The
110
+ executor that is used to decompress ``TBaskets``; if None, a
111
+ :doc:`uproot.source.futures.TrivialExecutor` is created.
112
+ Executors attached to a file are ``shutdown`` when the file is closed.
113
+ interpretation_executor (None or Executor with a ``submit`` method): The
114
+ executor that is used to interpret uncompressed ``TBasket`` data as
115
+ arrays; if None, a :doc:`uproot.source.futures.TrivialExecutor`
116
+ is created.
117
+ Executors attached to a file are ``shutdown`` when the file is closed.
105
118
  options: See below.
106
119
 
107
120
  Returns dask equivalents of the backends supported by uproot. If ``library='np'``,
@@ -237,6 +250,8 @@ def dask(
237
250
  real_options,
238
251
  interp_options,
239
252
  steps_per_file,
253
+ decompression_executor,
254
+ interpretation_executor,
240
255
  )
241
256
  else:
242
257
  return _get_dask_array_delay_open(
@@ -251,6 +266,8 @@ def dask(
251
266
  real_options,
252
267
  interp_options,
253
268
  steps_per_file,
269
+ decompression_executor,
270
+ interpretation_executor,
254
271
  )
255
272
  elif library.name == "ak":
256
273
  if open_files:
@@ -269,6 +286,8 @@ def dask(
269
286
  form_mapping,
270
287
  steps_per_file,
271
288
  allow_read_errors_with_report,
289
+ decompression_executor,
290
+ interpretation_executor,
272
291
  )
273
292
  else:
274
293
  return _get_dak_array_delay_open(
@@ -286,6 +305,8 @@ def dask(
286
305
  steps_per_file,
287
306
  allow_read_errors_with_report,
288
307
  known_base_form,
308
+ decompression_executor,
309
+ interpretation_executor,
289
310
  )
290
311
  else:
291
312
  raise NotImplementedError()
@@ -436,10 +457,19 @@ def _dask_array_from_map(
436
457
 
437
458
 
438
459
  class _UprootReadNumpy:
439
- def __init__(self, ttrees, key, interp_options) -> None:
460
+ def __init__(
461
+ self,
462
+ ttrees,
463
+ key,
464
+ interp_options,
465
+ decompression_executor=None,
466
+ interpretation_executor=None,
467
+ ) -> None:
440
468
  self.ttrees = ttrees
441
469
  self.key = key
442
470
  self.interp_options = interp_options
471
+ self.decompression_executor = decompression_executor
472
+ self.interpretation_executor = interpretation_executor
443
473
 
444
474
  def __call__(self, i_start_stop):
445
475
  i, start, stop = i_start_stop
@@ -448,18 +478,29 @@ class _UprootReadNumpy:
448
478
  entry_stop=stop,
449
479
  library="np",
450
480
  ak_add_doc=self.interp_options["ak_add_doc"],
481
+ decompression_executor=self.decompression_executor,
482
+ interpretation_executor=self.interpretation_executor,
451
483
  )
452
484
 
453
485
 
454
486
  class _UprootOpenAndReadNumpy:
455
487
  def __init__(
456
- self, custom_classes, allow_missing, real_options, key, interp_options
488
+ self,
489
+ custom_classes,
490
+ allow_missing,
491
+ real_options,
492
+ key,
493
+ interp_options,
494
+ decompression_executor=None,
495
+ interpretation_executor=None,
457
496
  ):
458
497
  self.custom_classes = custom_classes
459
498
  self.allow_missing = allow_missing
460
499
  self.real_options = real_options
461
500
  self.key = key
462
501
  self.interp_options = interp_options
502
+ self.decompression_executor = decompression_executor
503
+ self.interpretation_executor = interpretation_executor
463
504
 
464
505
  def __call__(self, file_path_object_path_istep_nsteps_ischunk):
465
506
  (
@@ -501,6 +542,8 @@ which has {num_entries} entries"""
501
542
  entry_start=start,
502
543
  entry_stop=stop,
503
544
  ak_add_doc=self.interp_options["ak_add_doc"],
545
+ decompression_executor=self.decompression_executor,
546
+ interpretation_executor=self.interpretation_executor,
504
547
  )
505
548
 
506
549
 
@@ -517,6 +560,8 @@ def _get_dask_array(
517
560
  real_options,
518
561
  interp_options,
519
562
  steps_per_file,
563
+ decompression_executor,
564
+ interpretation_executor,
520
565
  ):
521
566
  ttrees = []
522
567
  explicit_chunks = []
@@ -668,7 +713,13 @@ which has {entry_stop} entries"""
668
713
  chunk_args.append((0, 0, 0))
669
714
 
670
715
  dask_dict[key] = _dask_array_from_map(
671
- _UprootReadNumpy(ttrees, key, interp_options),
716
+ _UprootReadNumpy(
717
+ ttrees,
718
+ key,
719
+ interp_options,
720
+ decompression_executor,
721
+ interpretation_executor,
722
+ ),
672
723
  chunk_args,
673
724
  chunks=(tuple(chunks),),
674
725
  dtype=dt,
@@ -690,6 +741,8 @@ def _get_dask_array_delay_open(
690
741
  real_options,
691
742
  interp_options,
692
743
  steps_per_file,
744
+ decompression_executor,
745
+ interpretation_executor,
693
746
  ):
694
747
  ffile_path, fobject_path = files[0][0:2]
695
748
  obj = uproot._util.regularize_object_path(
@@ -748,7 +801,13 @@ def _get_dask_array_delay_open(
748
801
 
749
802
  dask_dict[key] = _dask_array_from_map(
750
803
  _UprootOpenAndReadNumpy(
751
- custom_classes, allow_missing, real_options, key, interp_options
804
+ custom_classes,
805
+ allow_missing,
806
+ real_options,
807
+ key,
808
+ interp_options,
809
+ decompression_executor,
810
+ interpretation_executor,
752
811
  ),
753
812
  partition_args,
754
813
  chunks=(tuple(partitions),),
@@ -760,16 +819,13 @@ def _get_dask_array_delay_open(
760
819
 
761
820
  class ImplementsFormMappingInfo(Protocol):
762
821
  @property
763
- def behavior(self) -> dict | None:
764
- ...
822
+ def behavior(self) -> dict | None: ...
765
823
 
766
824
  buffer_key: str | Callable
767
825
 
768
- def parse_buffer_key(self, buffer_key: str) -> tuple[str, str]:
769
- ...
826
+ def parse_buffer_key(self, buffer_key: str) -> tuple[str, str]: ...
770
827
 
771
- def keys_for_buffer_keys(self, buffer_keys: frozenset[str]) -> frozenset[str]:
772
- ...
828
+ def keys_for_buffer_keys(self, buffer_keys: frozenset[str]) -> frozenset[str]: ...
773
829
 
774
830
  def load_buffers(
775
831
  self,
@@ -778,13 +834,11 @@ class ImplementsFormMappingInfo(Protocol):
778
834
  start: int,
779
835
  stop: int,
780
836
  options: Any,
781
- ) -> Mapping[str, AwkArray]:
782
- ...
837
+ ) -> Mapping[str, AwkArray]: ...
783
838
 
784
839
 
785
840
  class ImplementsFormMapping(Protocol):
786
- def __call__(self, form: Form) -> tuple[Form, ImplementsFormMappingInfo]:
787
- ...
841
+ def __call__(self, form: Form) -> tuple[Form, ImplementsFormMappingInfo]: ...
788
842
 
789
843
 
790
844
  class TrivialFormMappingInfo(ImplementsFormMappingInfo):
@@ -849,6 +903,8 @@ class TrivialFormMappingInfo(ImplementsFormMappingInfo):
849
903
  keys: frozenset[str],
850
904
  start: int,
851
905
  stop: int,
906
+ decompression_executor,
907
+ interpretation_executor,
852
908
  options: Any,
853
909
  ) -> Mapping[str, AwkArray]:
854
910
  # First, let's read the arrays as a tuple (to associate with each key)
@@ -857,6 +913,8 @@ class TrivialFormMappingInfo(ImplementsFormMappingInfo):
857
913
  entry_start=start,
858
914
  entry_stop=stop,
859
915
  ak_add_doc=options["ak_add_doc"],
916
+ decompression_executor=decompression_executor,
917
+ interpretation_executor=interpretation_executor,
860
918
  how=tuple,
861
919
  )
862
920
 
@@ -902,15 +960,17 @@ class UprootReadMixin:
902
960
  form_mapping_info: ImplementsFormMappingInfo
903
961
  common_keys: frozenset[str]
904
962
  interp_options: dict[str, Any]
905
- allow_read_errors_with_report: bool
963
+ allow_read_errors_with_report: bool | tuple[type[BaseException], ...]
906
964
 
907
965
  @property
908
966
  def allowed_exceptions(self):
967
+ if isinstance(self.allow_read_errors_with_report, tuple):
968
+ return self.allow_read_errors_with_report
909
969
  return (OSError,)
910
970
 
911
971
  @property
912
972
  def return_report(self) -> bool:
913
- return self.allow_read_errors_with_report
973
+ return bool(self.allow_read_errors_with_report)
914
974
 
915
975
  def read_tree(self, tree: HasBranches, start: int, stop: int) -> AwkArray:
916
976
  assert start <= stop
@@ -924,7 +984,13 @@ class UprootReadMixin:
924
984
  # buffer mapping in __call__, such that the high-level form can be
925
985
  # used in `from_buffers`
926
986
  mapping = self.form_mapping_info.load_buffers(
927
- tree, self.common_keys, start, stop, self.interp_options
987
+ tree,
988
+ self.common_keys,
989
+ start,
990
+ stop,
991
+ self.decompression_executor,
992
+ self.interpretation_executor,
993
+ self.interp_options,
928
994
  )
929
995
 
930
996
  # Populate container with placeholders if keys aren't required
@@ -1097,7 +1163,9 @@ class _UprootRead(UprootReadMixin):
1097
1163
  base_form: Form,
1098
1164
  expected_form: Form,
1099
1165
  form_mapping_info: ImplementsFormMappingInfo,
1100
- allow_read_errors_with_report: bool,
1166
+ allow_read_errors_with_report: bool | tuple[type[BaseException], ...],
1167
+ decompression_executor,
1168
+ interpretation_executor,
1101
1169
  ) -> None:
1102
1170
  self.ttrees = ttrees
1103
1171
  self.common_keys = frozenset(common_keys)
@@ -1106,6 +1174,8 @@ class _UprootRead(UprootReadMixin):
1106
1174
  self.expected_form = expected_form
1107
1175
  self.form_mapping_info = form_mapping_info
1108
1176
  self.allow_read_errors_with_report = allow_read_errors_with_report
1177
+ self.decompression_executor = decompression_executor
1178
+ self.interpretation_executor = interpretation_executor
1109
1179
 
1110
1180
  def project_keys(self: T, keys: frozenset[str]) -> T:
1111
1181
  return _UprootRead(
@@ -1116,6 +1186,8 @@ class _UprootRead(UprootReadMixin):
1116
1186
  self.expected_form,
1117
1187
  self.form_mapping_info,
1118
1188
  self.allow_read_errors_with_report,
1189
+ self.decompression_executor,
1190
+ self.interpretation_executor,
1119
1191
  )
1120
1192
 
1121
1193
  def __call__(self, i_start_stop):
@@ -1148,7 +1220,11 @@ class _UprootRead(UprootReadMixin):
1148
1220
  return self._call_impl(i, start, stop)
1149
1221
 
1150
1222
  def _call_impl(self, i, start, stop):
1151
- return self.read_tree(self.ttrees[i], start, stop)
1223
+ return self.read_tree(
1224
+ self.ttrees[i],
1225
+ start,
1226
+ stop,
1227
+ )
1152
1228
 
1153
1229
 
1154
1230
  class _UprootOpenAndRead(UprootReadMixin):
@@ -1162,7 +1238,9 @@ class _UprootOpenAndRead(UprootReadMixin):
1162
1238
  base_form: Form,
1163
1239
  expected_form: Form,
1164
1240
  form_mapping_info: ImplementsFormMappingInfo,
1165
- allow_read_errors_with_report: bool,
1241
+ allow_read_errors_with_report: bool | tuple[type[BaseException], ...],
1242
+ decompression_executor,
1243
+ interpretation_executor,
1166
1244
  ) -> None:
1167
1245
  self.custom_classes = custom_classes
1168
1246
  self.allow_missing = allow_missing
@@ -1173,6 +1251,8 @@ class _UprootOpenAndRead(UprootReadMixin):
1173
1251
  self.expected_form = expected_form
1174
1252
  self.form_mapping_info = form_mapping_info
1175
1253
  self.allow_read_errors_with_report = allow_read_errors_with_report
1254
+ self.decompression_executor = decompression_executor
1255
+ self.interpretation_executor = interpretation_executor
1176
1256
 
1177
1257
  def _call_impl(
1178
1258
  self, file_path, object_path, i_step_or_start, n_steps_or_stop, is_chunk
@@ -1207,7 +1287,11 @@ which has {num_entries} entries"""
1207
1287
 
1208
1288
  assert start <= stop
1209
1289
 
1210
- return self.read_tree(ttree, start, stop)
1290
+ return self.read_tree(
1291
+ ttree,
1292
+ start,
1293
+ stop,
1294
+ )
1211
1295
 
1212
1296
  def __call__(self, blockwise_args):
1213
1297
  (
@@ -1264,6 +1348,8 @@ which has {num_entries} entries"""
1264
1348
  self.expected_form,
1265
1349
  self.form_mapping_info,
1266
1350
  self.allow_read_errors_with_report,
1351
+ self.decompression_executor,
1352
+ self.interpretation_executor,
1267
1353
  )
1268
1354
 
1269
1355
 
@@ -1301,6 +1387,8 @@ def _get_dak_array(
1301
1387
  form_mapping,
1302
1388
  steps_per_file,
1303
1389
  allow_read_errors_with_report,
1390
+ decompression_executor,
1391
+ interpretation_executor,
1304
1392
  ):
1305
1393
  dask_awkward = uproot.extras.dask_awkward()
1306
1394
  awkward = uproot.extras.awkward()
@@ -1464,6 +1552,8 @@ which has {entry_stop} entries"""
1464
1552
  expected_form=expected_form,
1465
1553
  form_mapping_info=form_mapping_info,
1466
1554
  allow_read_errors_with_report=allow_read_errors_with_report,
1555
+ decompression_executor=decompression_executor,
1556
+ interpretation_executor=interpretation_executor,
1467
1557
  )
1468
1558
 
1469
1559
  return dask_awkward.from_map(
@@ -1489,6 +1579,8 @@ def _get_dak_array_delay_open(
1489
1579
  steps_per_file,
1490
1580
  allow_read_errors_with_report,
1491
1581
  known_base_form,
1582
+ decompression_executor,
1583
+ interpretation_executor,
1492
1584
  ):
1493
1585
  dask_awkward = uproot.extras.dask_awkward()
1494
1586
  awkward = uproot.extras.awkward()
@@ -1564,6 +1656,8 @@ def _get_dak_array_delay_open(
1564
1656
  expected_form=expected_form,
1565
1657
  form_mapping_info=form_mapping_info,
1566
1658
  allow_read_errors_with_report=allow_read_errors_with_report,
1659
+ decompression_executor=decompression_executor,
1660
+ interpretation_executor=interpretation_executor,
1567
1661
  )
1568
1662
 
1569
1663
  return dask_awkward.from_map(