uproot 5.6.0__tar.gz → 5.6.2__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.
- uproot-5.6.2/.github/workflows/build-distributions.yml +17 -0
- {uproot-5.6.0 → uproot-5.6.2}/.github/workflows/build-test.yml +31 -23
- {uproot-5.6.0 → uproot-5.6.2}/.github/workflows/deploy.yml +2 -2
- {uproot-5.6.0 → uproot-5.6.2}/.github/workflows/upload-nightly-wheels.yml +2 -2
- {uproot-5.6.0 → uproot-5.6.2}/.pre-commit-config.yaml +1 -1
- uproot-5.6.2/CONTRIBUTING.md +155 -0
- {uproot-5.6.0 → uproot-5.6.2}/PKG-INFO +1 -27
- {uproot-5.6.0 → uproot-5.6.2}/pyproject.toml +37 -30
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/_dask.py +60 -23
- uproot-5.6.2/src/uproot/behaviors/RNTuple.py +1679 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TBranch.py +8 -3
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/const.py +2 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/library.py +1 -1
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/RNTuple.py +240 -415
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/fsspec.py +2 -7
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/version.py +2 -2
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/_cascade.py +5 -5
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/_cascadentuple.py +69 -73
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/_cascadetree.py +23 -2
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/writable.py +1 -1
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0630_rntuple_basics.py +6 -1
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0662_rntuple_stl_containers.py +17 -15
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1223_more_rntuple_types.py +2 -2
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1250_rntuple_improvements.py +8 -8
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1395_rntuple_writing_lists_and_structs.py +7 -5
- uproot-5.6.2/tests/test_1406_improved_rntuple_methods.py +130 -0
- uproot-5.6.2/tests/test_1411_rntuple_physlite_ATLAS.py +100 -0
- uproot-5.6.2/tests/test_1412_rntuple_dask.py +37 -0
- uproot-5.6.0/.github/workflows/build-distributions.yml +0 -32
- {uproot-5.6.0 → uproot-5.6.2}/.all-contributorsrc +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.github/dependabot.yml +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.github/workflows/semantic-pr-title.yml +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.gitignore +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/.readthedocs.yml +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/CITATION.cff +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/LICENSE +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/README.md +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/dev/example-objects.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/dev/make-models.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/diagrams/abstraction-layers.png +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/diagrams/abstraction-layers.svg +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/diagrams/example-dask-graph.png +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/diagrams/uproot-awkward-timeline.png +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/diagrams/uproot-awkward-timeline.svg +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/logo/logo-300px-white.png +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/logo/logo-300px.png +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/logo/logo-600px.png +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/logo/logo.svg +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-img/photos/switcheroo.jpg +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/_templates/breadcrumbs.html +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/basic.rst +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/conf.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/index.rst +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/make_changelog.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/prepare_docstrings.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/requirements.txt +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/docs-sphinx/uproot3-to-4.rst +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/_awkwardforth.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/_util.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behavior.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/RooCurve.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/RooHist.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TAxis.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TBranchElement.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TDatime.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TGraph.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TGraphAsymmErrors.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TGraphErrors.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TH1.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TH2.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TH2Poly.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TH3.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TParameter.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TProfile.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TProfile2D.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TProfile3D.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/TTree.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/behaviors/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/cache.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/compression.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/containers.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/deserialization.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/dynamic.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/exceptions.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/extras.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/grouped.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/identify.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/jagged.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/known_forth/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/known_forth/atlas.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/numerical.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/objects.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/interpretation/strings.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/language/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/language/python.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/model.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TArray.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TAtt.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TBasket.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TBranch.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TClonesArray.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TDatime.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TGraph.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TH.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/THashList.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TLeaf.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TList.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TMatrixT.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TNamed.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TObjArray.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TObjString.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TObject.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TRef.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TString.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TTable.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TTime.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/TTree.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/models/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/pyroot.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/reading.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/serialization.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/sink/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/sink/file.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/chunk.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/coalesce.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/cursor.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/file.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/futures.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/http.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/object.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/s3.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/source/xrootd.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/streamers.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/_dask_write.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/identify.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/src/uproot/writing/interpret.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/conftest.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/samples/h_dynamic.pkl +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0001_source_class.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0006_notify_when_downloaded.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0007_single_chunk_interface.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0008_start_interpretation.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0009_nested_directories.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0010_start_streamers.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0011_generate_classes_from_streamers.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0013_rntuple_anchor.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0014_all_ttree_versions.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0016_interpretations.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0017_multi_basket_multi_branch_fetch.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0018_array_fetching_interface.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0022_number_of_branches.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0023_more_interpretations_1.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0023_ttree_versions.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0028_fallback_to_read_streamer.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0029_more_string_types.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0031_test_stl_containers.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0033_more_interpretations_2.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0034_generic_objects_in_ttrees.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0035_datatype_generality.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0038_memberwise_serialization.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0043_iterate_function.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0044_concatenate_function.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0046_histograms_bh_hist.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0053_parents_should_not_be_bases.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0058_detach_model_objects_from_files.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0066_fix_http_fallback_freeze.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0067_common_entry_offsets.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0081_dont_parse_colons.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0087_memberwise_splitting_not_implemented_messages.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0088_read_with_http.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0099_read_from_file_object.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0112_fix_pandas_with_cut.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0118_fix_name_fetch_again.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0123_atlas_issues.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0126_turn_unknown_emptyarrays_into_known_types.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0167_use_the_common_histogram_interface.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0172_allow_allocators_in_vector_typenames.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0173_empty_and_multiprocessing_bugs.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0182_complain_about_missing_files.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0194_fix_lost_cuts_in_iterate.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0220_contiguous_byte_ranges_in_http.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0228_read_TProfiles.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0240_read_TGraphAsymmErrors.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0278_specializations_for_TParameter.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0302_pickle.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0303_empty_jagged_array.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0320_start_working_on_ROOT_writing.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0322_writablefile_infrastructure.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0329_update_existing_root_files.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0335_empty_ttree_division_by_zero.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0341_manipulate_streamer_info.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0344_writabledirectory_can_read.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0345_bulk_copy_method.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0349_write_TObjString.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0350_read_RooCurve_RooHist.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0351_write_TList.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0352_write_THashList.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0384_move_behavior_of_and_fix_383.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0398_dimensions_in_leaflist.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0405_write_a_histogram.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0406_write_a_ttree.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0407_read_TDatime.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0412_write_multidimensional_numpy_to_ttree.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0414_write_jagged_arrays.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0416_writing_compressed_data.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0418_read_TTable.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0420_pyroot_uproot_interoperability.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0422_hist_integration.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0430_global_index_for_tuples_of_DataFrames.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0438_TClonesArray_is_not_AsGrouped.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0439_check_awkward_before_numpy.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0442_regular_TClonesArray.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0472_tstreamerinfo_for_ttree.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0475_remember_to_update_freesegments.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0484_manually_add_model_for_TMatrixTSym_double_.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0487_implement_asdtypeinplace.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0498_create_leaf_branch_in_extend.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0519_remove_memmap_copy.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0520_dynamic_classes_cant_be_abc_subclasses.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0569_fBits_is_4_bytes.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0576_unicode_in_names.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0578_dask_for_numpy.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0580_round_trip_for_no_flow_histograms.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0589_explicitly_interpret_RVec_type.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0603_dask_delayed_open.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0609_num_enteries_func.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0610_awkward_form.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0637_setup_tests_for_AwkwardForth.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0643_reading_vector_pair_TLorentzVector_int.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0651_implement_transformed_axis.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0652_dask_for_awkward.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0692_fsspec_reading.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0692_fsspec_writing.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0700_dask_empty_arrays.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0705_rntuple_writing_metadata.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0750_avoid_empty_TBasket_issue.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0755_dask_awkward_column_projection.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0791_protect_uproot_project_columns_from_dask_node_names.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0798_DAOD_PHYSLITE.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0808_fix_awkward_form_for_AsStridedObjects.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0816_separate_AwkwardForth_machines_by_TBranch.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0832_ak_add_doc_should_also_add_to_typetracer.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0840_support_tleafG.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0841_fix_814.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0844_fix_delete_hist_from_root.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0852_fix_strided_interp_extra_offsets.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0870_writing_arrays_of_type_unknown_fix_822.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0876_uproot_dask_blind_steps.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0886_fix_awkward_form_breadcrumbs.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0910_fix_906_members_non_numerical_branches.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0911_fix_interp_array_non_numerical_objs_issue_880.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0912_fix_pandas_and_double_nested_vectors_issue_885.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0916_read_from_s3.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0927_dont_assume_uproot_in_global_scope_in_TPython_Eval.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0930_expressions_in_pandas.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0940_feat_add_TLeafC_string_support.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0962_rntuple_update.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0965_inverted_axes_variances_hist_888.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_0976_path_object_split.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1000-write-TProfiles.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1043_const_std_string.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1058_dask_awkward_report.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1063_dask_distributed.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1070_pandas_dataframe_building_performance_fix.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1085_dask_write.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1102_any_locks_in_models_must_be_transient.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1114_fix_attempt_to_concatenate_numpy_with_awkward.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1120_check_decompression_executor_pass_for_dask.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1127_fix_allow_colon_in_key_names.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1128_TGraph_writing.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1146_split_ranges_for_large_files_over_http.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1154_classof_using_relative_path.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1159_rntuple_cluster_groups.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1160_std_string_in_TDirectory.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1180_read_free_floating_vector_issue_1179.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1181_support_for_stl_list.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1182_add_support_for_bitset.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1183_ttime_custom.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1186_dtype_might_raise_ValueError.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1189_dask_failing_on_duplicate_keys.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1191_rntuple_fixes.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1198_coalesce.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1207_fix_title_of_TBranch_with_counter.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1212_dont_let_update_mess_up_file_version.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1221_AwkwardForth_bug.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1229_const_in_typename.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1254_test_threadpool_executor_for_dask.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1264_write_NumPy_array_of_strings.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1275_fix_TStreamerLoop_code_generation.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1282_add_known_forth_for_atlas.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1285_rntuple_multicluster_concatenation.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1318_dont_compare_big_endian_in_awkward.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1321_pandas_changed_api_again.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1347_rntuple_floats_suppressed_cols.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1356_basic_rntuple_writing.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests/test_1375_extend_ak_add_doc.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests-wasm/__init__.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests-wasm/test_1272_basic_functionality.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests-wasm/test_1365_awkwardforth_reading.py +0 -0
- {uproot-5.6.0 → uproot-5.6.2}/tests-wasm/utils.py +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Build sdist and wheel
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
# Run on demand with workflow dispatch
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
# Use from other workflows
|
|
7
|
+
workflow_call:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
dist:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
with:
|
|
15
|
+
fetch-depth: 0
|
|
16
|
+
|
|
17
|
+
- uses: hynek/build-and-inspect-python-package@v2
|
|
@@ -29,26 +29,28 @@ jobs:
|
|
|
29
29
|
steps:
|
|
30
30
|
- uses: actions/checkout@v4
|
|
31
31
|
|
|
32
|
-
- name: Get
|
|
33
|
-
uses:
|
|
32
|
+
- name: Get micromamba
|
|
33
|
+
uses: mamba-org/setup-micromamba@v2
|
|
34
34
|
with:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
environment-name: test-env
|
|
36
|
+
init-shell: bash
|
|
37
|
+
create-args: >-
|
|
38
|
+
python=${{ matrix.python-version }}
|
|
39
|
+
|
|
40
|
+
- uses: astral-sh/setup-uv@v6
|
|
39
41
|
|
|
40
42
|
- name: Check active Python version
|
|
41
43
|
run: python -c "import sys; assert '.'.join(str(s) for s in sys.version_info[:2]) == '${{ matrix.python-version }}', f'{version} incorrect!'"
|
|
42
44
|
|
|
43
45
|
- name: Install ROOT
|
|
44
|
-
if: matrix.python-version == 3.9 && runner.os
|
|
46
|
+
if: matrix.python-version == 3.9 && runner.os == 'Linux'
|
|
45
47
|
run: |
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
micromamba env list
|
|
49
|
+
micromamba install root
|
|
50
|
+
micromamba list
|
|
49
51
|
|
|
50
52
|
- name: Install sshd for fsspec ssh tests
|
|
51
|
-
if: runner.os
|
|
53
|
+
if: runner.os == 'Linux'
|
|
52
54
|
run: |
|
|
53
55
|
sudo apt-get install -y openssh-server
|
|
54
56
|
sudo service ssh restart
|
|
@@ -61,12 +63,12 @@ jobs:
|
|
|
61
63
|
- name: Install XRootD
|
|
62
64
|
if: runner.os != 'Windows'
|
|
63
65
|
run: |
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
micromamba env list
|
|
67
|
+
micromamba install xrootd
|
|
68
|
+
micromamba list
|
|
67
69
|
|
|
68
70
|
- name: Pip install the package
|
|
69
|
-
run:
|
|
71
|
+
run: uv pip install --system -e. --group=dev
|
|
70
72
|
|
|
71
73
|
- name: Run pytest
|
|
72
74
|
run: |
|
|
@@ -90,10 +92,10 @@ jobs:
|
|
|
90
92
|
python-version: ${{ matrix.python-version }}
|
|
91
93
|
allow-prereleases: true
|
|
92
94
|
|
|
93
|
-
- uses: astral-sh/setup-uv@
|
|
95
|
+
- uses: astral-sh/setup-uv@v6
|
|
94
96
|
|
|
95
97
|
- name: Pip install the package
|
|
96
|
-
run: uv pip install --system .
|
|
98
|
+
run: uv pip install --system -e. --group=dev
|
|
97
99
|
|
|
98
100
|
- name: Run pytest
|
|
99
101
|
run: |
|
|
@@ -116,19 +118,23 @@ jobs:
|
|
|
116
118
|
with:
|
|
117
119
|
python-version: ${{ matrix.python-version }}
|
|
118
120
|
|
|
121
|
+
- uses: astral-sh/setup-uv@v6
|
|
122
|
+
|
|
119
123
|
- name: Pip install the package
|
|
120
|
-
run:
|
|
124
|
+
run: |
|
|
125
|
+
uv venv
|
|
126
|
+
uv pip install -e. 'numpy<2' --group test
|
|
121
127
|
|
|
122
128
|
- name: Run pytest
|
|
123
129
|
run: |
|
|
124
|
-
|
|
130
|
+
uv run --no-sync pytest -vv tests --reruns 10 --reruns-delay 30 --only-rerun "(?i)http|ssl|timeout|expired|connection|socket"
|
|
125
131
|
|
|
126
132
|
pyodide-build:
|
|
127
133
|
runs-on: ubuntu-latest
|
|
128
134
|
timeout-minutes: 30
|
|
129
135
|
env:
|
|
130
|
-
PYODIDE_VERSION: 0.27.
|
|
131
|
-
PYODIDE_BUILD_VERSION: 0.
|
|
136
|
+
PYODIDE_VERSION: 0.27.5
|
|
137
|
+
PYODIDE_BUILD_VERSION: 0.30.0
|
|
132
138
|
AWKWARD_VERSION: v2.7.4
|
|
133
139
|
|
|
134
140
|
steps:
|
|
@@ -140,6 +146,8 @@ jobs:
|
|
|
140
146
|
with:
|
|
141
147
|
python-version: '3.12'
|
|
142
148
|
|
|
149
|
+
- uses: astral-sh/setup-uv@v6
|
|
150
|
+
|
|
143
151
|
- name: Install pyodide-build
|
|
144
152
|
run: python3 -m pip install pyodide-build==$PYODIDE_BUILD_VERSION
|
|
145
153
|
|
|
@@ -176,11 +184,11 @@ jobs:
|
|
|
176
184
|
with:
|
|
177
185
|
runner: selenium
|
|
178
186
|
browser: chrome
|
|
179
|
-
browser-version:
|
|
187
|
+
browser-version: 1446681
|
|
180
188
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
181
189
|
|
|
182
190
|
- name: Install dependencies
|
|
183
|
-
run: pip install .
|
|
191
|
+
run: uv pip install --system -e. --group=test-pyodide pyodide-py==$PYODIDE_VERSION
|
|
184
192
|
|
|
185
193
|
- name: Run pytest
|
|
186
194
|
run: |
|
|
@@ -31,14 +31,14 @@ jobs:
|
|
|
31
31
|
steps:
|
|
32
32
|
- uses: actions/download-artifact@v4
|
|
33
33
|
with:
|
|
34
|
-
name:
|
|
34
|
+
name: Packages
|
|
35
35
|
path: dist
|
|
36
36
|
|
|
37
37
|
- name: List distributions to be deployed
|
|
38
38
|
run: ls -lha dist/
|
|
39
39
|
|
|
40
40
|
- name: Generate artifact attestation for sdist and wheel
|
|
41
|
-
uses: actions/attest-build-provenance@
|
|
41
|
+
uses: actions/attest-build-provenance@db473fddc028af60658334401dc6fa3ffd8669fd # v2.3.0
|
|
42
42
|
with:
|
|
43
43
|
subject-path: dist/uproot-*
|
|
44
44
|
|
|
@@ -26,14 +26,14 @@ jobs:
|
|
|
26
26
|
steps:
|
|
27
27
|
- uses: actions/download-artifact@v4
|
|
28
28
|
with:
|
|
29
|
-
name:
|
|
29
|
+
name: Packages
|
|
30
30
|
path: dist
|
|
31
31
|
|
|
32
32
|
- name: List wheel to be deployed
|
|
33
33
|
run: ls -lha dist/*.whl
|
|
34
34
|
|
|
35
35
|
- name: Upload wheel to Anaconda Cloud as nightly
|
|
36
|
-
uses: scientific-python/upload-nightly-action@
|
|
36
|
+
uses: scientific-python/upload-nightly-action@b36e8c0c10dbcfd2e05bf95f17ef8c14fd708dbf # 0.6.2
|
|
37
37
|
with:
|
|
38
38
|
artifacts_path: dist
|
|
39
39
|
anaconda_nightly_upload_token: ${{ secrets.ANACONDA_ORG_UPLOAD_TOKEN }}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Contributing to uproot
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to **uproot**! uproot is a community-driven project, and we welcome contributions of all kinds, including bug reports, feature requests, documentation improvements, and code contributions.
|
|
4
|
+
|
|
5
|
+
This guide will help you get started with contributing.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🚀 Quick Start
|
|
10
|
+
|
|
11
|
+
1. **Fork** the repository on GitHub.
|
|
12
|
+
2. **Clone** your fork locally:
|
|
13
|
+
```bash
|
|
14
|
+
git clone git@github.com:YOUR_USERNAME/uproot5.git
|
|
15
|
+
cd uproot
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
3. **Set up the development environment**:
|
|
19
|
+
|
|
20
|
+
We recommend using a conda environment. You can reproduce the full developer environment with:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
conda create -n uproot-py313 python=3.13
|
|
24
|
+
conda activate uproot-py313
|
|
25
|
+
|
|
26
|
+
# Add conda-forge channel and prioritize it
|
|
27
|
+
conda config --add channels conda-forge
|
|
28
|
+
conda config --set channel_priority strict
|
|
29
|
+
|
|
30
|
+
# Install dependencies
|
|
31
|
+
conda install xrootd
|
|
32
|
+
conda install root
|
|
33
|
+
conda install pandas
|
|
34
|
+
conda install dask
|
|
35
|
+
conda install minio
|
|
36
|
+
|
|
37
|
+
# pip-only dependencies
|
|
38
|
+
pip install scikit-hep-testdata
|
|
39
|
+
pip install rangehttpserver
|
|
40
|
+
pip install boost_histogram
|
|
41
|
+
pip install hist
|
|
42
|
+
pip install dask_awkward
|
|
43
|
+
pip install awkward-pandas
|
|
44
|
+
pip install pytest-timeout
|
|
45
|
+
pip install fsspec-xrootd
|
|
46
|
+
pip install uv
|
|
47
|
+
|
|
48
|
+
# Run local HTTP server (if needed for test data)
|
|
49
|
+
python -m RangeHTTPServer
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
4. **Install Uproot in editable mode**:
|
|
53
|
+
```bash
|
|
54
|
+
uv pip install -e. --group=dev
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 🌿 Branching and Naming Conventions
|
|
60
|
+
|
|
61
|
+
- Always work on a **feature branch**:
|
|
62
|
+
```bash
|
|
63
|
+
git checkout -b YOUR_USERNAME/my-cool-feature
|
|
64
|
+
```
|
|
65
|
+
- Use descriptive names, such as:
|
|
66
|
+
- `fix_streamer-parsing`
|
|
67
|
+
- `feature_custom-interpretation-api`
|
|
68
|
+
- `docs_improve-tutorials`
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 🎨 Code Style
|
|
73
|
+
|
|
74
|
+
- Use **pre-commit** for automatic linting, style issues, and formatting:
|
|
75
|
+
```bash
|
|
76
|
+
pre-commit run --all
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## ✅ Running Tests
|
|
81
|
+
|
|
82
|
+
Uproot uses **pytest** for testing.
|
|
83
|
+
|
|
84
|
+
To run the full test suite:
|
|
85
|
+
```bash
|
|
86
|
+
python -m pytest tests -ss -vv
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
To run a specific test module:
|
|
90
|
+
```bash
|
|
91
|
+
pytest tests/test_my_module.py
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Some tests may depend on having ROOT or XRootD installed. These are covered in the environment setup.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🔃 Submitting a Pull Request
|
|
99
|
+
|
|
100
|
+
1. Make sure all tests pass and your code is cleanly formatted.
|
|
101
|
+
2. Push your changes to your fork:
|
|
102
|
+
```bash
|
|
103
|
+
git push origin YOUR_USERNAME/my-cool-feature
|
|
104
|
+
```
|
|
105
|
+
3. Open a pull request (PR) from your fork to the `main` branch of [scikit-hep/uproot](https://github.com/scikit-hep/uproot).
|
|
106
|
+
4. Fill in the PR template and explain what you did and why.
|
|
107
|
+
5. Be responsive to feedback from reviewers—we’re all here to help!
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 🐛 Reporting Bugs
|
|
112
|
+
|
|
113
|
+
1. Check if the bug is already reported on the [issue tracker](https://github.com/scikit-hep/uproot/issues).
|
|
114
|
+
2. If not, [open a new issue](https://github.com/scikit-hep/uproot/issues/new/choose) and provide:
|
|
115
|
+
- A minimal reproducible example
|
|
116
|
+
- Expected vs. actual behavior
|
|
117
|
+
- Version info (`python -m uproot --version`)
|
|
118
|
+
- Any relevant stack trace or logs
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 💡 Requesting Features
|
|
123
|
+
|
|
124
|
+
1. Search the issues to see if a similar feature has been discussed.
|
|
125
|
+
2. If not, open a **Feature Request** issue and describe:
|
|
126
|
+
- What problem the feature solves
|
|
127
|
+
- A suggested implementation or interface (if applicable)
|
|
128
|
+
- Any related prior art in other libraries or experiments
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 📚 Improving Documentation
|
|
133
|
+
|
|
134
|
+
Documentation lives in the `docs-sphinx/` folder and is built using **Sphinx**. To build locally
|
|
135
|
+
make sure you have Sphinx and the ReadTheDocs theme installed in your virtualenv:
|
|
136
|
+
```bash
|
|
137
|
+
pip install sphinx sphinx-rtd-theme
|
|
138
|
+
```
|
|
139
|
+
Navigate to your docs folder and invoke the Sphinx builder to produce HTML in the _build/html directory:
|
|
140
|
+
```
|
|
141
|
+
cd docs-sphinx
|
|
142
|
+
sphinx-build -b html . _build/html
|
|
143
|
+
```
|
|
144
|
+
Once it finishes, open:
|
|
145
|
+
```
|
|
146
|
+
open _build/html/index.html
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
You can also suggest improvements to examples, tutorials, and API references.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 🙌 Thanks!
|
|
154
|
+
|
|
155
|
+
uproot thrives on its community. Whether you're fixing a typo, contributing a feature, or suggesting a design—you're making a difference!
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: uproot
|
|
3
|
-
Version: 5.6.
|
|
3
|
+
Version: 5.6.2
|
|
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
|
|
@@ -37,36 +37,10 @@ Requires-Dist: numpy
|
|
|
37
37
|
Requires-Dist: packaging
|
|
38
38
|
Requires-Dist: typing-extensions>=4.1.0; python_version < '3.11'
|
|
39
39
|
Requires-Dist: xxhash
|
|
40
|
-
Provides-Extra: dev
|
|
41
|
-
Requires-Dist: awkward-pandas; extra == 'dev'
|
|
42
|
-
Requires-Dist: boost-histogram>=0.13; extra == 'dev'
|
|
43
|
-
Requires-Dist: dask-awkward>=2025.2.0; extra == 'dev'
|
|
44
|
-
Requires-Dist: dask[array,distributed]; extra == 'dev'
|
|
45
|
-
Requires-Dist: hist>=1.2; extra == 'dev'
|
|
46
|
-
Requires-Dist: pandas; extra == 'dev'
|
|
47
40
|
Provides-Extra: http
|
|
48
41
|
Requires-Dist: aiohttp; extra == 'http'
|
|
49
42
|
Provides-Extra: s3
|
|
50
43
|
Requires-Dist: s3fs; extra == 's3'
|
|
51
|
-
Provides-Extra: test
|
|
52
|
-
Requires-Dist: aiohttp; extra == 'test'
|
|
53
|
-
Requires-Dist: deflate; extra == 'test'
|
|
54
|
-
Requires-Dist: fsspec-xrootd>=0.5.0; extra == 'test'
|
|
55
|
-
Requires-Dist: isal; extra == 'test'
|
|
56
|
-
Requires-Dist: minio; extra == 'test'
|
|
57
|
-
Requires-Dist: paramiko; extra == 'test'
|
|
58
|
-
Requires-Dist: pytest-rerunfailures; extra == 'test'
|
|
59
|
-
Requires-Dist: pytest-timeout; extra == 'test'
|
|
60
|
-
Requires-Dist: pytest>=6; extra == 'test'
|
|
61
|
-
Requires-Dist: rangehttpserver; extra == 'test'
|
|
62
|
-
Requires-Dist: requests; extra == 'test'
|
|
63
|
-
Requires-Dist: s3fs; extra == 'test'
|
|
64
|
-
Requires-Dist: scikit-hep-testdata; extra == 'test'
|
|
65
|
-
Provides-Extra: test-pyodide
|
|
66
|
-
Requires-Dist: pytest-pyodide; extra == 'test-pyodide'
|
|
67
|
-
Requires-Dist: pytest-timeout; extra == 'test-pyodide'
|
|
68
|
-
Requires-Dist: pytest>=6; extra == 'test-pyodide'
|
|
69
|
-
Requires-Dist: scikit-hep-testdata; extra == 'test-pyodide'
|
|
70
44
|
Provides-Extra: xrootd
|
|
71
45
|
Requires-Dist: fsspec-xrootd>=0.5.0; extra == 'xrootd'
|
|
72
46
|
Description-Content-Type: text/markdown
|
|
@@ -5,6 +5,42 @@ requires = [
|
|
|
5
5
|
"hatch-vcs"
|
|
6
6
|
]
|
|
7
7
|
|
|
8
|
+
[dependency-groups]
|
|
9
|
+
dev = [
|
|
10
|
+
{include-group = "extra"},
|
|
11
|
+
{include-group = "test"}
|
|
12
|
+
]
|
|
13
|
+
extra = [
|
|
14
|
+
"boost_histogram>=0.13",
|
|
15
|
+
"dask-awkward>=2025.5.0",
|
|
16
|
+
"dask[array,distributed]",
|
|
17
|
+
"hist>=1.2",
|
|
18
|
+
"pandas",
|
|
19
|
+
"awkward-pandas"
|
|
20
|
+
]
|
|
21
|
+
test = [
|
|
22
|
+
"aiohttp",
|
|
23
|
+
"deflate",
|
|
24
|
+
"fsspec-xrootd>=0.5.0",
|
|
25
|
+
"isal",
|
|
26
|
+
"minio",
|
|
27
|
+
"paramiko",
|
|
28
|
+
"pytest-rerunfailures",
|
|
29
|
+
"rangehttpserver",
|
|
30
|
+
"requests",
|
|
31
|
+
"s3fs",
|
|
32
|
+
{include-group = "test-core"}
|
|
33
|
+
]
|
|
34
|
+
test-core = [
|
|
35
|
+
"pytest-timeout",
|
|
36
|
+
"pytest>=6",
|
|
37
|
+
"scikit-hep-testdata"
|
|
38
|
+
]
|
|
39
|
+
test-pyodide = [
|
|
40
|
+
"pytest-pyodide; python_version >='3.11'",
|
|
41
|
+
{include-group = "test-core"}
|
|
42
|
+
]
|
|
43
|
+
|
|
8
44
|
[lint.mccabe]
|
|
9
45
|
max-complexity = 100
|
|
10
46
|
|
|
@@ -43,7 +79,7 @@ dependencies = [
|
|
|
43
79
|
"numpy",
|
|
44
80
|
"fsspec",
|
|
45
81
|
"packaging",
|
|
46
|
-
"typing_extensions>=4.1.0; python_version <
|
|
82
|
+
"typing_extensions>=4.1.0; python_version < '3.11'"
|
|
47
83
|
]
|
|
48
84
|
description = "ROOT I/O in pure Python and NumPy."
|
|
49
85
|
dynamic = [
|
|
@@ -55,37 +91,8 @@ readme = "README.md"
|
|
|
55
91
|
requires-python = ">=3.9"
|
|
56
92
|
|
|
57
93
|
[project.optional-dependencies]
|
|
58
|
-
dev = [
|
|
59
|
-
"boost_histogram>=0.13",
|
|
60
|
-
"dask-awkward>=2025.2.0",
|
|
61
|
-
"dask[array,distributed]",
|
|
62
|
-
"hist>=1.2",
|
|
63
|
-
"pandas",
|
|
64
|
-
"awkward-pandas"
|
|
65
|
-
]
|
|
66
94
|
http = ["aiohttp"]
|
|
67
95
|
s3 = ["s3fs"]
|
|
68
|
-
test = [
|
|
69
|
-
"isal",
|
|
70
|
-
"deflate",
|
|
71
|
-
"minio",
|
|
72
|
-
"aiohttp",
|
|
73
|
-
"fsspec-xrootd>=0.5.0",
|
|
74
|
-
"s3fs",
|
|
75
|
-
"paramiko",
|
|
76
|
-
"pytest>=6",
|
|
77
|
-
"pytest-timeout",
|
|
78
|
-
"pytest-rerunfailures",
|
|
79
|
-
"requests",
|
|
80
|
-
"scikit-hep-testdata",
|
|
81
|
-
"rangehttpserver"
|
|
82
|
-
]
|
|
83
|
-
test-pyodide = [
|
|
84
|
-
"pytest>=6",
|
|
85
|
-
"pytest-pyodide",
|
|
86
|
-
"pytest-timeout",
|
|
87
|
-
"scikit-hep-testdata"
|
|
88
|
-
]
|
|
89
96
|
xrootd = ["fsspec-xrootd>=0.5.0"]
|
|
90
97
|
|
|
91
98
|
[project.urls]
|
|
@@ -20,6 +20,10 @@ import numpy
|
|
|
20
20
|
|
|
21
21
|
import uproot
|
|
22
22
|
from uproot._util import no_filter, unset
|
|
23
|
+
from uproot.behaviors.RNTuple import HasFields
|
|
24
|
+
from uproot.behaviors.RNTuple import (
|
|
25
|
+
_regularize_step_size as _RNTuple_regularize_step_size,
|
|
26
|
+
)
|
|
23
27
|
from uproot.behaviors.TBranch import HasBranches, TBranch, _regularize_step_size
|
|
24
28
|
|
|
25
29
|
if TYPE_CHECKING:
|
|
@@ -616,7 +620,13 @@ def _get_dask_array(
|
|
|
616
620
|
recursive=recursive,
|
|
617
621
|
filter_name=filter_name,
|
|
618
622
|
filter_typename=filter_typename,
|
|
619
|
-
|
|
623
|
+
**{
|
|
624
|
+
(
|
|
625
|
+
"filter_field"
|
|
626
|
+
if isinstance(obj, HasFields)
|
|
627
|
+
else "filter_branch"
|
|
628
|
+
): real_filter_branch
|
|
629
|
+
},
|
|
620
630
|
full_paths=full_paths,
|
|
621
631
|
ignore_duplicates=True,
|
|
622
632
|
)
|
|
@@ -632,9 +642,7 @@ def _get_dask_array(
|
|
|
632
642
|
assert steps_per_file is not unset # either assigned or assumed to be 1
|
|
633
643
|
total_files = len(ttrees)
|
|
634
644
|
total_entries = sum(ttree.num_entries for ttree in ttrees)
|
|
635
|
-
step_size = max(
|
|
636
|
-
1, int(math.ceil(total_entries / (total_files * steps_per_file)))
|
|
637
|
-
)
|
|
645
|
+
step_size = max(1, math.ceil(total_entries / (total_files * steps_per_file)))
|
|
638
646
|
|
|
639
647
|
if count == 0:
|
|
640
648
|
raise ValueError(
|
|
@@ -672,7 +680,7 @@ def _get_dask_array(
|
|
|
672
680
|
)
|
|
673
681
|
step_sum += int(ttree_step)
|
|
674
682
|
|
|
675
|
-
entry_step =
|
|
683
|
+
entry_step = round(step_sum / len(ttrees))
|
|
676
684
|
assert entry_step >= 1
|
|
677
685
|
|
|
678
686
|
for key in common_keys:
|
|
@@ -758,7 +766,11 @@ def _get_dask_array_delay_open(
|
|
|
758
766
|
recursive=recursive,
|
|
759
767
|
filter_name=filter_name,
|
|
760
768
|
filter_typename=filter_typename,
|
|
761
|
-
|
|
769
|
+
**{
|
|
770
|
+
(
|
|
771
|
+
"filter_field" if isinstance(obj, HasFields) else "filter_branch"
|
|
772
|
+
): filter_branch
|
|
773
|
+
},
|
|
762
774
|
full_paths=full_paths,
|
|
763
775
|
ignore_duplicates=True,
|
|
764
776
|
)
|
|
@@ -927,6 +939,13 @@ class TrivialFormMappingInfo(ImplementsFormMappingInfo):
|
|
|
927
939
|
how=tuple,
|
|
928
940
|
)
|
|
929
941
|
|
|
942
|
+
if isinstance(tree, HasFields):
|
|
943
|
+
# Temporary workaround to have basic support for RNTuple
|
|
944
|
+
# This is needed since currently arrays only has top-level fields
|
|
945
|
+
# TODO: Ask people how they want this handled since the previous
|
|
946
|
+
# approach might not make sense for RNTuples
|
|
947
|
+
keys = [f for f in tree.field_names if f in keys]
|
|
948
|
+
|
|
930
949
|
awkward = uproot.extras.awkward()
|
|
931
950
|
|
|
932
951
|
# The subform generated by awkward.to_buffers() has different form keys
|
|
@@ -1474,7 +1493,13 @@ def _get_dak_array(
|
|
|
1474
1493
|
recursive=recursive,
|
|
1475
1494
|
filter_name=filter_name,
|
|
1476
1495
|
filter_typename=filter_typename,
|
|
1477
|
-
|
|
1496
|
+
**{
|
|
1497
|
+
(
|
|
1498
|
+
"filter_field"
|
|
1499
|
+
if isinstance(obj, HasFields)
|
|
1500
|
+
else "filter_branch"
|
|
1501
|
+
): real_filter_branch
|
|
1502
|
+
},
|
|
1478
1503
|
full_paths=full_paths,
|
|
1479
1504
|
ignore_duplicates=True,
|
|
1480
1505
|
)
|
|
@@ -1490,9 +1515,7 @@ def _get_dak_array(
|
|
|
1490
1515
|
assert steps_per_file is not unset # either assigned or assumed to be 1
|
|
1491
1516
|
total_files = len(ttrees)
|
|
1492
1517
|
total_entries = sum(ttree.num_entries for ttree in ttrees)
|
|
1493
|
-
step_size = max(
|
|
1494
|
-
1, int(math.ceil(total_entries / (total_files * steps_per_file)))
|
|
1495
|
-
)
|
|
1518
|
+
step_size = max(1, math.ceil(total_entries / (total_files * steps_per_file)))
|
|
1496
1519
|
|
|
1497
1520
|
if count == 0:
|
|
1498
1521
|
raise ValueError(
|
|
@@ -1519,16 +1542,23 @@ def _get_dak_array(
|
|
|
1519
1542
|
entry_start = 0
|
|
1520
1543
|
entry_stop = ttree.num_entries
|
|
1521
1544
|
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1545
|
+
if isinstance(ttree, HasFields):
|
|
1546
|
+
akform = ttree.to_akform(filter_name=common_keys)
|
|
1547
|
+
ttree_step = _RNTuple_regularize_step_size(
|
|
1548
|
+
ttree, akform, step_size, entry_start, entry_stop
|
|
1549
|
+
)
|
|
1550
|
+
step_sum += int(ttree_step)
|
|
1551
|
+
else:
|
|
1552
|
+
branchid_interpretation = {}
|
|
1553
|
+
for key in common_keys:
|
|
1554
|
+
branch = ttree[key]
|
|
1555
|
+
branchid_interpretation[branch.cache_key] = branch.interpretation
|
|
1556
|
+
ttree_step = _regularize_step_size(
|
|
1557
|
+
ttree, step_size, entry_start, entry_stop, branchid_interpretation
|
|
1558
|
+
)
|
|
1559
|
+
step_sum += int(ttree_step)
|
|
1530
1560
|
|
|
1531
|
-
entry_step =
|
|
1561
|
+
entry_step = round(step_sum / len(ttrees))
|
|
1532
1562
|
|
|
1533
1563
|
divisions = [0]
|
|
1534
1564
|
partition_args = []
|
|
@@ -1562,9 +1592,12 @@ which has {entry_stop} entries"""
|
|
|
1562
1592
|
divisions.append(divisions[-1] + length)
|
|
1563
1593
|
partition_args.append((i, start, stop))
|
|
1564
1594
|
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1595
|
+
if isinstance(ttrees[0], HasFields):
|
|
1596
|
+
base_form = ttrees[0].to_akform(filter_name=common_keys)
|
|
1597
|
+
else:
|
|
1598
|
+
base_form = _get_ttree_form(
|
|
1599
|
+
awkward, ttrees[0], common_keys, interp_options.get("ak_add_doc")
|
|
1600
|
+
)
|
|
1568
1601
|
|
|
1569
1602
|
if len(partition_args) == 0:
|
|
1570
1603
|
divisions.append(0)
|
|
@@ -1632,7 +1665,11 @@ def _get_dak_array_delay_open(
|
|
|
1632
1665
|
recursive=recursive,
|
|
1633
1666
|
filter_name=filter_name,
|
|
1634
1667
|
filter_typename=filter_typename,
|
|
1635
|
-
|
|
1668
|
+
**{
|
|
1669
|
+
(
|
|
1670
|
+
"filter_field" if isinstance(obj, HasFields) else "filter_branch"
|
|
1671
|
+
): filter_branch
|
|
1672
|
+
},
|
|
1636
1673
|
full_paths=full_paths,
|
|
1637
1674
|
ignore_duplicates=True,
|
|
1638
1675
|
)
|