uproot 5.3.2rc1__tar.gz → 5.3.4__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 (276) hide show
  1. {uproot-5.3.2rc1 → uproot-5.3.4}/.all-contributorsrc +9 -0
  2. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/workflows/build-test.yml +24 -0
  3. {uproot-5.3.2rc1 → uproot-5.3.4}/.pre-commit-config.yaml +5 -5
  4. {uproot-5.3.2rc1 → uproot-5.3.4}/PKG-INFO +2 -1
  5. {uproot-5.3.2rc1 → uproot-5.3.4}/README.md +1 -0
  6. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/__init__.py +1 -0
  7. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/_dask.py +9 -25
  8. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/_util.py +6 -1
  9. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TBranch.py +60 -111
  10. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TTree.py +1 -3
  11. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/compression.py +6 -14
  12. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/const.py +4 -4
  13. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/containers.py +166 -23
  14. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/deserialization.py +1 -3
  15. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/extras.py +2 -6
  16. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/identify.py +16 -1
  17. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/library.py +2 -6
  18. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/numerical.py +10 -29
  19. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/objects.py +21 -17
  20. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/language/python.py +1 -3
  21. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/model.py +11 -21
  22. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/RNTuple.py +201 -166
  23. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TArray.py +1 -1
  24. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TBasket.py +1 -3
  25. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TClonesArray.py +1 -3
  26. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TGraph.py +3 -9
  27. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TMatrixT.py +1 -3
  28. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TRef.py +1 -1
  29. uproot-5.3.4/src/uproot/models/TTime.py +109 -0
  30. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/reading.py +14 -8
  31. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/sink/file.py +2 -10
  32. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/chunk.py +1 -3
  33. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/cursor.py +3 -5
  34. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/http.py +17 -33
  35. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/streamers.py +1 -1
  36. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/version.py +2 -2
  37. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/writing/_cascade.py +15 -101
  38. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/writing/_cascadentuple.py +10 -38
  39. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/writing/_cascadetree.py +7 -20
  40. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/writing/identify.py +2 -6
  41. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/writing/writable.py +2 -4
  42. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0008_start_interpretation.py +2 -1
  43. uproot-5.3.4/tests/test_0013_rntuple_anchor.py +80 -0
  44. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0416_writing_compressed_data.py +14 -7
  45. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0630_rntuple_basics.py +1 -2
  46. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0692_fsspec_reading.py +9 -8
  47. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0692_fsspec_writing.py +13 -6
  48. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0705_rntuple_writing_metadata.py +6 -1
  49. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0962_RNTuple_update.py +4 -9
  50. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1070_pandas_dataframe_building_performance_fix.py +4 -1
  51. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1120_check_decompression_executor_pass_for_dask.py +4 -1
  52. uproot-5.3.4/tests/test_1180_read_free_floating_vector_issue_1179.py +25 -0
  53. uproot-5.3.4/tests/test_1181_support_for_stl_list.py +71 -0
  54. uproot-5.3.4/tests/test_1182_add_support_for_bitset.py +40 -0
  55. uproot-5.3.4/tests/test_1183_ttime_custom.py +17 -0
  56. uproot-5.3.4/tests/test_1186_dtype_might_raise_ValueError.py +23 -0
  57. uproot-5.3.4/tests/test_1189_dask_failing_on_duplicate_keys.py +24 -0
  58. uproot-5.3.4/tests/test_1191_rntuple_fixes.py +83 -0
  59. uproot-5.3.2rc1/tests/test_0013_rntuple_anchor.py +0 -78
  60. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  61. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  62. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  63. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  64. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/dependabot.yml +0 -0
  65. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/workflows/build-distributions.yml +0 -0
  66. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/workflows/deploy.yml +0 -0
  67. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/workflows/semantic-pr-title.yml +0 -0
  68. {uproot-5.3.2rc1 → uproot-5.3.4}/.github/workflows/upload-nightly-wheels.yml +0 -0
  69. {uproot-5.3.2rc1 → uproot-5.3.4}/.gitignore +0 -0
  70. {uproot-5.3.2rc1 → uproot-5.3.4}/.readthedocs.yml +0 -0
  71. {uproot-5.3.2rc1 → uproot-5.3.4}/CITATION.cff +0 -0
  72. {uproot-5.3.2rc1 → uproot-5.3.4}/LICENSE +0 -0
  73. {uproot-5.3.2rc1 → uproot-5.3.4}/dev/example-objects.py +0 -0
  74. {uproot-5.3.2rc1 → uproot-5.3.4}/dev/make-models.py +0 -0
  75. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/diagrams/abstraction-layers.png +0 -0
  76. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/diagrams/abstraction-layers.svg +0 -0
  77. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/diagrams/example-dask-graph.png +0 -0
  78. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/diagrams/uproot-awkward-timeline.png +0 -0
  79. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/diagrams/uproot-awkward-timeline.svg +0 -0
  80. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/logo/logo-300px-white.png +0 -0
  81. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/logo/logo-300px.png +0 -0
  82. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/logo/logo-600px.png +0 -0
  83. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/logo/logo.svg +0 -0
  84. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-img/photos/switcheroo.jpg +0 -0
  85. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/_templates/breadcrumbs.html +0 -0
  86. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/basic.rst +0 -0
  87. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/conf.py +0 -0
  88. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/index.rst +0 -0
  89. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/make_changelog.py +0 -0
  90. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/prepare_docstrings.py +0 -0
  91. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/requirements.txt +0 -0
  92. {uproot-5.3.2rc1 → uproot-5.3.4}/docs-sphinx/uproot3-to-4.rst +0 -0
  93. {uproot-5.3.2rc1 → uproot-5.3.4}/pyproject.toml +0 -0
  94. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/_awkwardforth.py +0 -0
  95. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behavior.py +0 -0
  96. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/RooCurve.py +0 -0
  97. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/RooHist.py +0 -0
  98. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TAxis.py +0 -0
  99. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TBranchElement.py +0 -0
  100. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TDatime.py +0 -0
  101. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TGraph.py +0 -0
  102. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TGraphAsymmErrors.py +0 -0
  103. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TGraphErrors.py +0 -0
  104. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TH1.py +0 -0
  105. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TH2.py +0 -0
  106. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TH2Poly.py +0 -0
  107. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TH3.py +0 -0
  108. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TParameter.py +0 -0
  109. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TProfile.py +0 -0
  110. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TProfile2D.py +0 -0
  111. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/TProfile3D.py +0 -0
  112. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/behaviors/__init__.py +0 -0
  113. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/cache.py +0 -0
  114. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/dynamic.py +0 -0
  115. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/exceptions.py +0 -0
  116. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/__init__.py +0 -0
  117. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/grouped.py +0 -0
  118. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/jagged.py +0 -0
  119. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/interpretation/strings.py +0 -0
  120. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/language/__init__.py +0 -0
  121. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TAtt.py +0 -0
  122. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TBranch.py +0 -0
  123. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TDatime.py +0 -0
  124. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TH.py +0 -0
  125. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/THashList.py +0 -0
  126. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TLeaf.py +0 -0
  127. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TList.py +0 -0
  128. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TNamed.py +0 -0
  129. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TObjArray.py +0 -0
  130. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TObjString.py +0 -0
  131. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TObject.py +0 -0
  132. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TString.py +0 -0
  133. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TTable.py +0 -0
  134. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/TTree.py +0 -0
  135. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/models/__init__.py +0 -0
  136. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/pyroot.py +0 -0
  137. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/serialization.py +0 -0
  138. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/sink/__init__.py +0 -0
  139. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/__init__.py +0 -0
  140. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/file.py +0 -0
  141. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/fsspec.py +0 -0
  142. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/futures.py +0 -0
  143. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/object.py +0 -0
  144. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/s3.py +0 -0
  145. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/source/xrootd.py +0 -0
  146. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/writing/__init__.py +0 -0
  147. {uproot-5.3.2rc1 → uproot-5.3.4}/src/uproot/writing/_dask_write.py +0 -0
  148. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/__init__.py +0 -0
  149. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/conftest.py +0 -0
  150. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/samples/h_dynamic.pkl +0 -0
  151. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0001_source_class.py +0 -0
  152. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0006_notify_when_downloaded.py +0 -0
  153. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0007_single_chunk_interface.py +0 -0
  154. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0009_nested_directories.py +0 -0
  155. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0010_start_streamers.py +0 -0
  156. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0011_generate_classes_from_streamers.py +0 -0
  157. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0014_all_ttree_versions.py +0 -0
  158. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0016_interpretations.py +0 -0
  159. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0017_multi_basket_multi_branch_fetch.py +0 -0
  160. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0018_array_fetching_interface.py +0 -0
  161. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0022_number_of_branches.py +0 -0
  162. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0023_more_interpretations_1.py +0 -0
  163. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0023_ttree_versions.py +0 -0
  164. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0028_fallback_to_read_streamer.py +0 -0
  165. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0029_more_string_types.py +0 -0
  166. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0031_test_stl_containers.py +0 -0
  167. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0033_more_interpretations_2.py +0 -0
  168. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0034_generic_objects_in_ttrees.py +0 -0
  169. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0035_datatype_generality.py +0 -0
  170. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0038_memberwise_serialization.py +0 -0
  171. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0043_iterate_function.py +0 -0
  172. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0044_concatenate_function.py +0 -0
  173. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0046_histograms_bh_hist.py +0 -0
  174. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0053_parents_should_not_be_bases.py +0 -0
  175. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0058_detach_model_objects_from_files.py +0 -0
  176. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0066_fix_http_fallback_freeze.py +0 -0
  177. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0067_common_entry_offsets.py +0 -0
  178. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0081_dont_parse_colons.py +0 -0
  179. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0087_memberwise_splitting_not_implemented_messages.py +0 -0
  180. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0088_read_with_http.py +0 -0
  181. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0099_read_from_file_object.py +0 -0
  182. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0112_fix_pandas_with_cut.py +0 -0
  183. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0118_fix_name_fetch_again.py +0 -0
  184. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0123_atlas_issues.py +0 -0
  185. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0126_turn_unknown_emptyarrays_into_known_types.py +0 -0
  186. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0167_use_the_common_histogram_interface.py +0 -0
  187. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0172_allow_allocators_in_vector_typenames.py +0 -0
  188. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0173_empty_and_multiprocessing_bugs.py +0 -0
  189. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0182_complain_about_missing_files.py +0 -0
  190. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0194_fix_lost_cuts_in_iterate.py +0 -0
  191. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0220_contiguous_byte_ranges_in_http.py +0 -0
  192. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0228_read_TProfiles.py +0 -0
  193. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0240_read_TGraphAsymmErrors.py +0 -0
  194. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0278_specializations_for_TParameter.py +0 -0
  195. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0302_pickle.py +0 -0
  196. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0303_empty_jagged_array.py +0 -0
  197. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0320_start_working_on_ROOT_writing.py +0 -0
  198. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0322_writablefile_infrastructure.py +0 -0
  199. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0329_update_existing_root_files.py +0 -0
  200. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0335_empty_ttree_division_by_zero.py +0 -0
  201. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0341_manipulate_streamer_info.py +0 -0
  202. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0344_writabledirectory_can_read.py +0 -0
  203. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0345_bulk_copy_method.py +0 -0
  204. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0349_write_TObjString.py +0 -0
  205. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0350_read_RooCurve_RooHist.py +0 -0
  206. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0351_write_TList.py +0 -0
  207. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0352_write_THashList.py +0 -0
  208. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0384_move_behavior_of_and_fix_383.py +0 -0
  209. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0398_dimensions_in_leaflist.py +0 -0
  210. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0405_write_a_histogram.py +0 -0
  211. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0406_write_a_ttree.py +0 -0
  212. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0407_read_TDatime.py +0 -0
  213. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0412_write_multidimensional_numpy_to_ttree.py +0 -0
  214. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0414_write_jagged_arrays.py +0 -0
  215. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0418_read_TTable.py +0 -0
  216. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0420_pyroot_uproot_interoperability.py +0 -0
  217. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0422_hist_integration.py +0 -0
  218. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0430_global_index_for_tuples_of_DataFrames.py +0 -0
  219. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0438_TClonesArray_is_not_AsGrouped.py +0 -0
  220. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0439_check_awkward_before_numpy.py +0 -0
  221. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0442_regular_TClonesArray.py +0 -0
  222. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0472_tstreamerinfo_for_ttree.py +0 -0
  223. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0475_remember_to_update_freesegments.py +0 -0
  224. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0484_manually_add_model_for_TMatrixTSym_double_.py +0 -0
  225. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0487_implement_asdtypeinplace.py +0 -0
  226. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0498_create_leaf_branch_in_extend.py +0 -0
  227. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0519_remove_memmap_copy.py +0 -0
  228. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0520_dynamic_classes_cant_be_abc_subclasses.py +0 -0
  229. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0569_fBits_is_4_bytes.py +0 -0
  230. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0576_unicode_in_names.py +0 -0
  231. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0578_dask_for_numpy.py +0 -0
  232. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0580_round_trip_for_no_flow_histograms.py +0 -0
  233. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0589_explicitly_interpret_RVec_type.py +0 -0
  234. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0603_dask_delayed_open.py +0 -0
  235. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0609_num_enteries_func.py +0 -0
  236. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0610_awkward_form.py +0 -0
  237. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0637_setup_tests_for_AwkwardForth.py +0 -0
  238. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0643_reading_vector_pair_TLorentzVector_int.py +0 -0
  239. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0651_implement_transformed_axis.py +0 -0
  240. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0652_dask_for_awkward.py +0 -0
  241. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0662_rntuple_stl_containers.py +0 -0
  242. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0700_dask_empty_arrays.py +0 -0
  243. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0750_avoid_empty_TBasket_issue.py +0 -0
  244. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0755_dask_awkward_column_projection.py +0 -0
  245. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0791_protect_uproot_project_columns_from_dask_node_names.py +0 -0
  246. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0798_DAOD_PHYSLITE.py +0 -0
  247. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0808_fix_awkward_form_for_AsStridedObjects.py +0 -0
  248. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0816_separate_AwkwardForth_machines_by_TBranch.py +0 -0
  249. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0832_ak_add_doc_should_also_add_to_typetracer.py +0 -0
  250. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0840_support_tleafG.py +0 -0
  251. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0841_fix_814.py +0 -0
  252. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0844_fix_delete_hist_from_root.py +0 -0
  253. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0852_fix_strided_interp_extra_offsets.py +0 -0
  254. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0870_writing_arrays_of_type_unknown_fix_822.py +0 -0
  255. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0876_uproot_dask_blind_steps.py +0 -0
  256. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0886_fix_awkward_form_breadcrumbs.py +0 -0
  257. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0910_fix_906_members_non_numerical_branches.py +0 -0
  258. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0911_fix_interp_array_non_numerical_objs_issue_880.py +0 -0
  259. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0912_fix_pandas_and_double_nested_vectors_issue_885.py +0 -0
  260. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0916_read_from_s3.py +0 -0
  261. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0927_dont_assume_uproot_in_global_scope_in_TPython_Eval.py +0 -0
  262. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0930_expressions_in_pandas.py +0 -0
  263. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0940_feat_add_TLeafC_string_support.py +0 -0
  264. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0965_inverted_axes_variances_hist_888.py +0 -0
  265. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_0976_path_object_split.py +0 -0
  266. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1000-write-TProfiles.py +0 -0
  267. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1043_const_std_string.py +0 -0
  268. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1058_dask_awkward_report.py +0 -0
  269. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1063_dask_distributed.py +0 -0
  270. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1085_dask_write.py +0 -0
  271. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1102_any_locks_in_models_must_be_transient.py +0 -0
  272. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1114_fix_attempt_to_concatenate_numpy_with_awkward.py +0 -0
  273. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1127_fix_allow_colon_in_key_names.py +0 -0
  274. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1146_split_ranges_for_large_files_over_http.py +0 -0
  275. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1154_classof_using_relative_path.py +0 -0
  276. {uproot-5.3.2rc1 → uproot-5.3.4}/tests/test_1160_std_string_in_TDirectory.py +0 -0
@@ -560,6 +560,15 @@
560
560
  "contributions": [
561
561
  "code"
562
562
  ]
563
+ },
564
+ {
565
+ "login": "djw9497",
566
+ "name": "djw9497",
567
+ "avatar_url": "https://avatars.githubusercontent.com/u/51672890?v=4",
568
+ "profile": "https://github.com/djw9497",
569
+ "contributions": [
570
+ "code"
571
+ ]
563
572
  }
564
573
  ],
565
574
  "contributorsPerLine": 7,
@@ -92,3 +92,27 @@ jobs:
92
92
  - name: Run pytest
93
93
  run: |
94
94
  python -m pytest -vv tests --reruns 10 --reruns-delay 30 --only-rerun "(?i)http|ssl|timeout|expired|connection|socket"
95
+
96
+ numpy2-build:
97
+ strategy:
98
+ fail-fast: false
99
+ matrix:
100
+ platform: [windows-latest, ubuntu-latest, macos-latest]
101
+ python-version: ['3.11']
102
+
103
+ runs-on: ${{ matrix.platform }}
104
+ timeout-minutes: 30
105
+
106
+ steps:
107
+ - uses: actions/checkout@v4
108
+
109
+ - uses: actions/setup-python@v5
110
+ with:
111
+ python-version: ${{ matrix.python-version }}
112
+
113
+ - name: Pip install the package
114
+ run: python -m pip install 'numpy>=2.0.0b1' .[test]
115
+
116
+ - name: Run pytest
117
+ run: |
118
+ python -m pytest -vv tests --reruns 10 --reruns-delay 30 --only-rerun "(?i)http|ssl|timeout|expired|connection|socket"
@@ -4,7 +4,7 @@ ci:
4
4
 
5
5
  repos:
6
6
  - repo: https://github.com/pre-commit/pre-commit-hooks
7
- rev: v4.5.0
7
+ rev: v4.6.0
8
8
  hooks:
9
9
  - id: check-added-large-files
10
10
  - id: check-case-conflict
@@ -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: 24.2.0
21
+ rev: 24.4.2
22
22
  hooks:
23
23
  - id: black
24
24
 
25
25
  - repo: https://github.com/astral-sh/ruff-pre-commit
26
- rev: v0.2.2
26
+ rev: v0.4.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.1
33
+ rev: v3.15.2
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.12.0
39
+ rev: v2.13.0
40
40
  hooks:
41
41
  - id: pretty-format-toml
42
42
  args: [--autofix]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: uproot
3
- Version: 5.3.2rc1
3
+ Version: 5.3.4
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
@@ -254,6 +254,7 @@ Thanks especially to the gracious help of Uproot contributors (including the [or
254
254
  <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>
255
255
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/bojohnson5"><img src="https://avatars.githubusercontent.com/u/20647190?v=4?s=100" width="100px;" alt="Bo Johnson"/><br /><sub><b>Bo Johnson</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=bojohnson5" title="Code">💻</a></td>
256
256
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/milesgranger"><img src="https://avatars.githubusercontent.com/u/13764397?v=4?s=100" width="100px;" alt="Miles"/><br /><sub><b>Miles</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=milesgranger" title="Code">💻</a></td>
257
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/djw9497"><img src="https://avatars.githubusercontent.com/u/51672890?v=4?s=100" width="100px;" alt="djw9497"/><br /><sub><b>djw9497</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=djw9497" title="Code">💻</a></td>
257
258
  </tr>
258
259
  </tbody>
259
260
  </table>
@@ -186,6 +186,7 @@ Thanks especially to the gracious help of Uproot contributors (including the [or
186
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
187
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/bojohnson5"><img src="https://avatars.githubusercontent.com/u/20647190?v=4?s=100" width="100px;" alt="Bo Johnson"/><br /><sub><b>Bo Johnson</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=bojohnson5" title="Code">💻</a></td>
188
188
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/milesgranger"><img src="https://avatars.githubusercontent.com/u/13764397?v=4?s=100" width="100px;" alt="Miles"/><br /><sub><b>Miles</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=milesgranger" title="Code">💻</a></td>
189
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/djw9497"><img src="https://avatars.githubusercontent.com/u/51672890?v=4?s=100" width="100px;" alt="djw9497"/><br /><sub><b>djw9497</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=djw9497" title="Code">💻</a></td>
189
190
  </tr>
190
191
  </tbody>
191
192
  </table>
@@ -147,6 +147,7 @@ import uproot.models.RNTuple
147
147
  import uproot.models.TH
148
148
  import uproot.models.TGraph
149
149
  import uproot.models.TMatrixT
150
+ import uproot.models.TTime
150
151
 
151
152
  from uproot.models.TTree import num_entries
152
153
 
@@ -606,6 +606,7 @@ def _get_dask_array(
606
606
  filter_typename=filter_typename,
607
607
  filter_branch=real_filter_branch,
608
608
  full_paths=full_paths,
609
+ ignore_duplicates=True,
609
610
  )
610
611
 
611
612
  if common_keys is None:
@@ -627,12 +628,7 @@ def _get_dask_array(
627
628
  raise ValueError(
628
629
  "allow_missing=True and no TTrees found in\n\n {}".format(
629
630
  "\n ".join(
630
- "{"
631
- + "{}: {}".format(
632
- repr(f.file_path if isinstance(f, HasBranches) else f),
633
- repr(f.object_path if isinstance(f, HasBranches) else o),
634
- )
635
- + "}"
631
+ f"{{{f.file_path if isinstance(f, HasBranches) else f!r}: {f.object_path if isinstance(f, HasBranches) else o!r}}}"
636
632
  for f, o in files
637
633
  )
638
634
  )
@@ -642,12 +638,7 @@ def _get_dask_array(
642
638
  raise ValueError(
643
639
  "TTrees in\n\n {}\n\nhave no TBranches in common".format(
644
640
  "\n ".join(
645
- "{"
646
- + "{}: {}".format(
647
- repr(f.file_path if isinstance(f, HasBranches) else f),
648
- repr(f.object_path if isinstance(f, HasBranches) else o),
649
- )
650
- + "}"
641
+ f"{{{f.file_path if isinstance(f, HasBranches) else f!r}: {f.object_path if isinstance(f, HasBranches) else o!r}}}"
651
642
  for f, o in files
652
643
  )
653
644
  )
@@ -757,6 +748,7 @@ def _get_dask_array_delay_open(
757
748
  filter_typename=filter_typename,
758
749
  filter_branch=filter_branch,
759
750
  full_paths=full_paths,
751
+ ignore_duplicates=True,
760
752
  )
761
753
 
762
754
  dask_dict = {}
@@ -1451,6 +1443,7 @@ def _get_dak_array(
1451
1443
  filter_typename=filter_typename,
1452
1444
  filter_branch=real_filter_branch,
1453
1445
  full_paths=full_paths,
1446
+ ignore_duplicates=True,
1454
1447
  )
1455
1448
 
1456
1449
  if common_keys is None:
@@ -1472,12 +1465,7 @@ def _get_dak_array(
1472
1465
  raise ValueError(
1473
1466
  "allow_missing=True and no TTrees found in\n\n {}".format(
1474
1467
  "\n ".join(
1475
- "{"
1476
- + "{}: {}".format(
1477
- repr(f.file_path if isinstance(f, HasBranches) else f),
1478
- repr(f.object_path if isinstance(f, HasBranches) else o),
1479
- )
1480
- + "}"
1468
+ f"{{{f.file_path if isinstance(f, HasBranches) else f!r}: {f.object_path if isinstance(f, HasBranches) else o!r}}}"
1481
1469
  for f, o in files
1482
1470
  )
1483
1471
  )
@@ -1487,12 +1475,7 @@ def _get_dak_array(
1487
1475
  raise ValueError(
1488
1476
  "TTrees in\n\n {}\n\nhave no TBranches in common".format(
1489
1477
  "\n ".join(
1490
- "{"
1491
- + "{}: {}".format(
1492
- repr(f.file_path if isinstance(f, HasBranches) else f),
1493
- repr(f.object_path if isinstance(f, HasBranches) else o),
1494
- )
1495
- + "}"
1478
+ f"{{{f.file_path if isinstance(f, HasBranches) else f!r}: {f.object_path if isinstance(f, HasBranches) else o!r}}}"
1496
1479
  for f, o in files
1497
1480
  )
1498
1481
  )
@@ -1606,7 +1589,7 @@ def _get_dak_array_delay_open(
1606
1589
  ffile_path, fobject_path = files[0][0:2]
1607
1590
 
1608
1591
  if known_base_form is not None:
1609
- common_keys = list(known_base_form.fields)
1592
+ common_keys = list(dict.fromkeys(known_base_form.fields))
1610
1593
  base_form = known_base_form
1611
1594
  else:
1612
1595
  obj = uproot._util.regularize_object_path(
@@ -1618,6 +1601,7 @@ def _get_dak_array_delay_open(
1618
1601
  filter_typename=filter_typename,
1619
1602
  filter_branch=filter_branch,
1620
1603
  full_paths=full_paths,
1604
+ ignore_duplicates=True,
1621
1605
  )
1622
1606
  base_form = _get_ttree_form(
1623
1607
  awkward, obj, common_keys, interp_options.get("ak_add_doc")
@@ -13,6 +13,7 @@ import itertools
13
13
  import numbers
14
14
  import os
15
15
  import re
16
+ import sys
16
17
  import warnings
17
18
  from collections.abc import Iterable
18
19
  from pathlib import Path
@@ -27,6 +28,8 @@ import uproot.source.chunk
27
28
  import uproot.source.fsspec
28
29
  import uproot.source.object
29
30
 
31
+ macos = sys.platform == "darwin"
32
+
30
33
 
31
34
  def tobytes(array):
32
35
  """
@@ -80,7 +83,9 @@ def ensure_numpy(array, types=(numpy.bool_, numpy.integer, numpy.floating)):
80
83
 
81
84
  awkward = uproot.extras.awkward()
82
85
  with warnings.catch_warnings():
83
- warnings.simplefilter("error", numpy.VisibleDeprecationWarning)
86
+ warnings.simplefilter(
87
+ "error", getattr(numpy, "exceptions", numpy).VisibleDeprecationWarning
88
+ )
84
89
  if isinstance(array, awkward.contents.Content):
85
90
  out = awkward.to_numpy(array)
86
91
  else:
@@ -627,11 +627,7 @@ class HasBranches(Mapping):
627
627
  if interpretation_width < 3:
628
628
  raise ValueError("'interpretation_width' must be at least 3")
629
629
 
630
- formatter = "{{0:{0}.{0}}} | {{1:{1}.{1}}} | {{2:{2}.{2}}}".format(
631
- name_width,
632
- typename_width,
633
- interpretation_width,
634
- )
630
+ formatter = f"{{0:{name_width}.{name_width}}} | {{1:{typename_width}.{typename_width}}} | {{2:{interpretation_width}.{interpretation_width}}}"
635
631
 
636
632
  stream.write(formatter.format("name", "typename", "interpretation"))
637
633
  stream.write(
@@ -792,14 +788,7 @@ class HasBranches(Mapping):
792
788
 
793
789
  def get_from_cache(branchname, interpretation):
794
790
  if array_cache is not None:
795
- cache_key = "{}:{}:{}:{}-{}:{}".format(
796
- self.cache_key,
797
- branchname,
798
- interpretation.cache_key,
799
- entry_start,
800
- entry_stop,
801
- library.name,
802
- )
791
+ cache_key = f"{self.cache_key}:{branchname}:{interpretation.cache_key}:{entry_start}-{entry_stop}:{library.name}"
803
792
  return array_cache.get(cache_key)
804
793
  else:
805
794
  return None
@@ -865,14 +854,7 @@ class HasBranches(Mapping):
865
854
  checked.add(branch.cache_key)
866
855
  interpretation = branchid_interpretation[branch.cache_key]
867
856
  if branch is not None:
868
- cache_key = "{}:{}:{}:{}-{}:{}".format(
869
- self.cache_key,
870
- expression,
871
- interpretation.cache_key,
872
- entry_start,
873
- entry_stop,
874
- library.name,
875
- )
857
+ cache_key = f"{self.cache_key}:{expression}:{interpretation.cache_key}:{entry_start}-{entry_stop}:{library.name}"
876
858
  array_cache[cache_key] = arrays[branch.cache_key]
877
859
 
878
860
  output = language.compute_expressions(
@@ -1144,6 +1126,7 @@ class HasBranches(Mapping):
1144
1126
  filter_branch=no_filter,
1145
1127
  recursive=True,
1146
1128
  full_paths=True,
1129
+ ignore_duplicates=False,
1147
1130
  ):
1148
1131
  """
1149
1132
  Args:
@@ -1161,6 +1144,7 @@ class HasBranches(Mapping):
1161
1144
  full_paths (bool): If True, include the full path to each subbranch
1162
1145
  with slashes (``/``); otherwise, use the descendant's name as
1163
1146
  the output name.
1147
+ ignore_duplicates (bool): If True, return a set of the keys; otherwise, return the full list of keys.
1164
1148
 
1165
1149
  Returns the names of the subbranches as a list of strings.
1166
1150
  """
@@ -1171,6 +1155,7 @@ class HasBranches(Mapping):
1171
1155
  filter_branch=filter_branch,
1172
1156
  recursive=recursive,
1173
1157
  full_paths=full_paths,
1158
+ ignore_duplicates=ignore_duplicates,
1174
1159
  )
1175
1160
  )
1176
1161
 
@@ -1297,6 +1282,7 @@ class HasBranches(Mapping):
1297
1282
  filter_branch=no_filter,
1298
1283
  recursive=True,
1299
1284
  full_paths=True,
1285
+ ignore_duplicates=False,
1300
1286
  ):
1301
1287
  """
1302
1288
  Args:
@@ -1314,6 +1300,8 @@ class HasBranches(Mapping):
1314
1300
  full_paths (bool): If True, include the full path to each subbranch
1315
1301
  with slashes (``/``); otherwise, use the descendant's name as
1316
1302
  the output name.
1303
+ ignore_duplicates (bool): If True, return a set of the keys; otherwise, return the full list of keys.
1304
+
1317
1305
 
1318
1306
  Returns the names of the subbranches as an iterator over strings.
1319
1307
  """
@@ -1323,6 +1311,7 @@ class HasBranches(Mapping):
1323
1311
  filter_branch=filter_branch,
1324
1312
  recursive=recursive,
1325
1313
  full_paths=full_paths,
1314
+ ignore_duplicates=ignore_duplicates,
1326
1315
  ):
1327
1316
  yield k
1328
1317
 
@@ -1371,6 +1360,7 @@ class HasBranches(Mapping):
1371
1360
  filter_branch=no_filter,
1372
1361
  recursive=True,
1373
1362
  full_paths=True,
1363
+ ignore_duplicates=False,
1374
1364
  ):
1375
1365
  """
1376
1366
  Args:
@@ -1388,6 +1378,8 @@ class HasBranches(Mapping):
1388
1378
  full_paths (bool): If True, include the full path to each subbranch
1389
1379
  with slashes (``/``) in the name; otherwise, use the descendant's
1390
1380
  name as the name without modification.
1381
+ ignore_duplicates (bool): If True, return a set of the keys; otherwise, return the full list of keys.
1382
+
1391
1383
 
1392
1384
  Returns (name, branch) pairs of the subbranches as an iterator over
1393
1385
  2-tuples of (str, :doc:`uproot.behaviors.TBranch.TBranch`).
@@ -1400,11 +1392,11 @@ class HasBranches(Mapping):
1400
1392
  pass
1401
1393
  else:
1402
1394
  raise TypeError(
1403
- "filter_branch must be None or a function: TBranch -> bool, not {}".format(
1404
- repr(filter_branch)
1405
- )
1395
+ f"filter_branch must be None or a function: TBranch -> bool, not {filter_branch!r}"
1406
1396
  )
1407
1397
 
1398
+ keys_set = set()
1399
+
1408
1400
  for branch in self.branches:
1409
1401
  if (
1410
1402
  (
@@ -1414,7 +1406,11 @@ class HasBranches(Mapping):
1414
1406
  and (filter_typename is no_filter or filter_typename(branch.typename))
1415
1407
  and (filter_branch is no_filter or filter_branch(branch))
1416
1408
  ):
1417
- yield branch.name, branch
1409
+ if ignore_duplicates and branch.name in keys_set:
1410
+ pass
1411
+ else:
1412
+ keys_set.add(branch.name)
1413
+ yield branch.name, branch
1418
1414
 
1419
1415
  if recursive:
1420
1416
  for k1, v in branch.iteritems(
@@ -1428,7 +1424,11 @@ class HasBranches(Mapping):
1428
1424
  if filter_name is no_filter or _filter_name_deep(
1429
1425
  filter_name, self, v
1430
1426
  ):
1431
- yield k2, v
1427
+ if ignore_duplicates and branch.name in keys_set:
1428
+ pass
1429
+ else:
1430
+ keys_set.add(k2)
1431
+ yield k2, v
1432
1432
 
1433
1433
  def itertypenames(
1434
1434
  self,
@@ -1701,9 +1701,7 @@ class TBranch(HasBranches):
1701
1701
  if len(self) == 0:
1702
1702
  return f"<{self.classname} {self.name!r} at 0x{id(self):012x}>"
1703
1703
  else:
1704
- return "<{} {} ({} subbranches) at 0x{:012x}>".format(
1705
- self.classname, repr(self.name), len(self), id(self)
1706
- )
1704
+ return f"<{self.classname} {self.name!r} ({len(self)} subbranches) at 0x{id(self):012x}>"
1707
1705
 
1708
1706
  def array(
1709
1707
  self,
@@ -1781,14 +1779,7 @@ class TBranch(HasBranches):
1781
1779
 
1782
1780
  def get_from_cache(branchname, interpretation):
1783
1781
  if array_cache is not None:
1784
- cache_key = "{}:{}:{}:{}-{}:{}".format(
1785
- self.cache_key,
1786
- branchname,
1787
- interpretation.cache_key,
1788
- entry_start,
1789
- entry_stop,
1790
- library.name,
1791
- )
1782
+ cache_key = f"{self.cache_key}:{branchname}:{interpretation.cache_key}:{entry_start}-{entry_stop}:{library.name}"
1792
1783
  return array_cache.get(cache_key)
1793
1784
  else:
1794
1785
  return None
@@ -1849,14 +1840,7 @@ class TBranch(HasBranches):
1849
1840
  )
1850
1841
 
1851
1842
  if array_cache is not None:
1852
- cache_key = "{}:{}:{}:{}-{}:{}".format(
1853
- self.cache_key,
1854
- self.name,
1855
- interpretation.cache_key,
1856
- entry_start,
1857
- entry_stop,
1858
- library.name,
1859
- )
1843
+ cache_key = f"{self.cache_key}:{self.name}:{interpretation.cache_key}:{entry_start}-{entry_stop}:{library.name}"
1860
1844
  array_cache[cache_key] = arrays[self.cache_key]
1861
1845
 
1862
1846
  return arrays[self.cache_key]
@@ -2004,14 +1988,9 @@ class TBranch(HasBranches):
2004
1988
  )
2005
1989
  ):
2006
1990
  raise ValueError(
2007
- """entries in normal baskets ({}) plus embedded baskets ({}) """
2008
- """don't add up to expected number of entries ({})
2009
- in file {}""".format(
2010
- num_entries_normal,
2011
- sum(basket.num_entries for basket in self.embedded_baskets),
2012
- self.num_entries,
2013
- self._file.file_path,
2014
- )
1991
+ f"""entries in normal baskets ({num_entries_normal}) plus embedded baskets ({sum(basket.num_entries for basket in self.embedded_baskets)}) """
1992
+ f"""don't add up to expected number of entries ({self.num_entries})
1993
+ in file {self._file.file_path}"""
2015
1994
  )
2016
1995
  else:
2017
1996
  return out
@@ -2041,11 +2020,9 @@ in file {}""".format(
2041
2020
 
2042
2021
  else:
2043
2022
  raise IndexError(
2044
- """branch {} has {} baskets; cannot get starting entry """
2045
- """for basket {}
2046
- in file {}""".format(
2047
- repr(self.name), self.num_baskets, basket_num, self._file.file_path
2048
- )
2023
+ f"""branch {self.name!r} has {self.num_baskets} baskets; cannot get starting entry """
2024
+ f"""for basket {basket_num}
2025
+ in file {self._file.file_path}"""
2049
2026
  )
2050
2027
 
2051
2028
  @property
@@ -2260,10 +2237,8 @@ in file {}""".format(
2260
2237
  return self.embedded_baskets[basket_num - self._num_normal_baskets]
2261
2238
  else:
2262
2239
  raise IndexError(
2263
- """branch {} has {} baskets; cannot get basket {}
2264
- in file {}""".format(
2265
- repr(self.name), self.num_baskets, basket_num, self._file.file_path
2266
- )
2240
+ f"""branch {self.name!r} has {self.num_baskets} baskets; cannot get basket {basket_num}
2241
+ in file {self._file.file_path}"""
2267
2242
  )
2268
2243
 
2269
2244
  def basket_chunk_cursor(self, basket_num):
@@ -2286,22 +2261,15 @@ in file {}""".format(
2286
2261
  return chunk, cursor
2287
2262
  elif 0 <= basket_num < self.num_baskets:
2288
2263
  raise IndexError(
2289
- """branch {} has {} normal baskets; cannot get chunk and """
2290
- """cursor for basket {} because only normal baskets have cursors
2291
- in file {}""".format(
2292
- repr(self.name),
2293
- self._num_normal_baskets,
2294
- basket_num,
2295
- self._file.file_path,
2296
- )
2264
+ f"""branch {self.name!r} has {self._num_normal_baskets} normal baskets; cannot get chunk and """
2265
+ f"""cursor for basket {basket_num} because only normal baskets have cursors
2266
+ in file {self._file.file_path}"""
2297
2267
  )
2298
2268
  else:
2299
2269
  raise IndexError(
2300
- """branch {} has {} baskets; cannot get cursor and chunk """
2301
- """for basket {}
2302
- in file {}""".format(
2303
- repr(self.name), self.num_baskets, basket_num, self._file.file_path
2304
- )
2270
+ f"""branch {self.name!r} has {self.num_baskets} baskets; cannot get cursor and chunk """
2271
+ f"""for basket {basket_num}
2272
+ in file {self._file.file_path}"""
2305
2273
  )
2306
2274
 
2307
2275
  def basket_compressed_bytes(self, basket_num):
@@ -2321,10 +2289,8 @@ in file {}""".format(
2321
2289
  ].compressed_bytes
2322
2290
  else:
2323
2291
  raise IndexError(
2324
- """branch {} has {} baskets; cannot get basket chunk {}
2325
- in file {}""".format(
2326
- repr(self.name), self.num_baskets, basket_num, self._file.file_path
2327
- )
2292
+ f"""branch {self.name!r} has {self.num_baskets} baskets; cannot get basket chunk {basket_num}
2293
+ in file {self._file.file_path}"""
2328
2294
  )
2329
2295
 
2330
2296
  def basket_uncompressed_bytes(self, basket_num):
@@ -2363,17 +2329,13 @@ in file {}""".format(
2363
2329
 
2364
2330
  elif 0 <= basket_num < self.num_baskets:
2365
2331
  raise ValueError(
2366
- "branch {} basket {} is an embedded basket, which has no TKey".format(
2367
- repr(self.name), basket_num
2368
- )
2332
+ f"branch {self.name!r} basket {basket_num} is an embedded basket, which has no TKey"
2369
2333
  )
2370
2334
 
2371
2335
  else:
2372
2336
  raise IndexError(
2373
- """branch {} has {} baskets; cannot get basket chunk {}
2374
- in file {}""".format(
2375
- repr(self.name), self.num_baskets, basket_num, self._file.file_path
2376
- )
2337
+ f"""branch {self.name!r} has {self.num_baskets} baskets; cannot get basket chunk {basket_num}
2338
+ in file {self._file.file_path}"""
2377
2339
  )
2378
2340
 
2379
2341
  @property
@@ -2495,19 +2457,14 @@ in file {}""".format(
2495
2457
  interpretation.awkward_form(self.file)
2496
2458
  except uproot.interpretation.objects.CannotBeAwkward as err:
2497
2459
  raise ValueError(
2498
- """cannot produce Awkward Arrays for interpretation {} because
2460
+ f"""cannot produce Awkward Arrays for interpretation {interpretation!r} because
2499
2461
 
2500
- {}
2462
+ {err.because}
2501
2463
 
2502
2464
  instead, try library="np" rather than library="ak" or globally set uproot.default_library
2503
2465
 
2504
- in file {}
2505
- in object {}""".format(
2506
- repr(interpretation),
2507
- err.because,
2508
- self.file.file_path,
2509
- self.object_path,
2510
- )
2466
+ in file {self.file.file_path}
2467
+ in object {self.object_path}"""
2511
2468
  ) from err
2512
2469
 
2513
2470
  def debug(
@@ -2751,10 +2708,7 @@ def _regularize_branchname(
2751
2708
  ):
2752
2709
  raise ValueError(
2753
2710
  "a branch cannot be loaded with multiple interpretations: "
2754
- "{} and {}".format(
2755
- repr(branchid_interpretation[branch.cache_key]),
2756
- repr(interpretation),
2757
- )
2711
+ f"{branchid_interpretation[branch.cache_key]!r} and {interpretation!r}"
2758
2712
  )
2759
2713
  else:
2760
2714
  branchid_interpretation[branch.cache_key] = interpretation
@@ -3053,8 +3007,10 @@ def _ranges_or_baskets_to_arrays(
3053
3007
  )
3054
3008
 
3055
3009
  # check for CannotBeAwkward errors on the main thread before reading any data
3056
- if isinstance(library, uproot.interpretation.library.Awkward) and isinstance(
3057
- interpretation, uproot.interpretation.objects.AsObjects
3010
+ if (
3011
+ isinstance(library, uproot.interpretation.library.Awkward)
3012
+ and isinstance(interpretation, uproot.interpretation.objects.AsObjects)
3013
+ and cache_key in branchid_to_branch
3058
3014
  ):
3059
3015
  branchid_to_branch[cache_key]._awkward_check(interpretation)
3060
3016
 
@@ -3107,16 +3063,9 @@ def _ranges_or_baskets_to_arrays(
3107
3063
  )
3108
3064
  if basket.num_entries != len(basket_arrays[basket.basket_num]):
3109
3065
  raise ValueError(
3110
- """basket {} in tree/branch {} has the wrong number of entries """
3111
- """(expected {}, obtained {}) when interpreted as {}
3112
- in file {}""".format(
3113
- basket.basket_num,
3114
- branch.object_path,
3115
- basket.num_entries,
3116
- len(basket_arrays[basket.basket_num]),
3117
- interpretation,
3118
- branch.file.file_path,
3119
- )
3066
+ f"""basket {basket.basket_num} in tree/branch {branch.object_path} has the wrong number of entries """
3067
+ f"""(expected {basket.num_entries}, obtained {len(basket_arrays[basket.basket_num])}) when interpreted as {interpretation}
3068
+ in file {branch.file.file_path}"""
3120
3069
  )
3121
3070
 
3122
3071
  basket = None
@@ -29,9 +29,7 @@ class TTree(uproot.behaviors.TBranch.HasBranches):
29
29
  if len(self) == 0:
30
30
  return f"<TTree {self.name!r} at 0x{id(self):012x}>"
31
31
  else:
32
- return "<TTree {} ({} branches) at 0x{:012x}>".format(
33
- repr(self.name), len(self), id(self)
34
- )
32
+ return f"<TTree {self.name!r} ({len(self)} branches) at 0x{id(self):012x}>"
35
33
 
36
34
  @property
37
35
  def name(self):
@@ -434,10 +434,8 @@ def decompress(
434
434
  computed_checksum = xxhash.xxh64(data).intdigest()
435
435
  if computed_checksum != expected_checksum:
436
436
  raise ValueError(
437
- """computed checksum {} didn't match expected checksum {}
438
- in file {}""".format(
439
- computed_checksum, expected_checksum, chunk.source.file_path
440
- )
437
+ f"""computed checksum {computed_checksum} didn't match expected checksum {expected_checksum}
438
+ in file {chunk.source.file_path}"""
441
439
  )
442
440
 
443
441
  elif algo == _decompress_ZSTD._2byte:
@@ -468,16 +466,10 @@ in file {chunk.source.file_path}"""
468
466
 
469
467
  if len(uncompressed_bytestring) != block_uncompressed_bytes:
470
468
  raise ValueError(
471
- """after successfully decompressing {} blocks, a block of """
472
- """compressed size {} decompressed to {} bytes, but the """
473
- """block header expects {} bytes.
474
- in file {}""".format(
475
- num_blocks,
476
- block_compressed_bytes,
477
- len(uncompressed_bytestring),
478
- block_uncompressed_bytes,
479
- chunk.source.file_path,
480
- )
469
+ f"""after successfully decompressing {num_blocks} blocks, a block of """
470
+ f"""compressed size {block_compressed_bytes} decompressed to {len(uncompressed_bytestring)} bytes, but the """
471
+ f"""block header expects {block_uncompressed_bytes} bytes.
472
+ in file {chunk.source.file_path}"""
481
473
  )
482
474
 
483
475
  uncompressed_array = numpy.frombuffer(