Conversation
* feat: complete CPU kernel migration from `parents` to `offsets` (#3988) * next step in kernel migration from parents to offsets * linter fix * add jax bincount * add cpp kernel to convert parents to offsets * fix typo * fix typo in an auto-generated test * almost there * nearly there * cleanup * fix remaining kernels * final cleanup * format json data * format * initialize maxnextparents = -1 (a sentinel meaning "no bin was touched") * update the kernels to work on offsets! * format * migrate cupy rawkernels from parents to offsets * migrate jax reducers * fix for platfroms where the int64 counts can't be safely cast * add bincount for cupy backend * compact loc * fix windows build and add optional OpenMP support * update cuda kernels * feat: add `missing_repeat` kernel implementation using cuda.compute (#3922) * feat: add missing_repeat implementation using cuda.compute * keep the same name as in cpu kernel * add tests for repetitions>1 and regularsize>1 * style: pre-commit fixes * add keywords * style fixes --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * feat: add `index_rpad_and_clip` kernels implementations using cuda.compute (#3923) * feat: add `index_rpad_and_clip` kernels implementation using cuda.compute * style fix * add a test for `index_rpad_and_clip_axis0` that would have target>length * add keyword names * style * Apply suggestions from Ianna Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch> * style: pre-commit fixes --------- Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * fix: array attrs not being validated at creation and being of inconsistent type (#3996) * convert dict attrs to Attrs type * add test * fix: ensure jax backend uses arrays on cpu only (#3990) * ensure jax uses cpu by default * remove now redundant jax_platform_name setting * change error messages * better errors * remove DeviceArray mentions as that does not exist while we're at it too * almost there * cleanup * cleanup * remove old data file * update cupy kernels * remove exlicit test for depricated kernel * add complex kernels and port them to use offsets * fix complex reducers * add remaining kernels * add kernels for complex and bool sum * move to segmented_reduce * fix typo * promote type * fix complex bool reducer * try another algo * missed one * use type inference * make numba happy * remove reducer overloads * use sum op func for complex types * remove test of depricated code * avoid using == to compare floating-point products * fix boundary tests * cleanup * cleanup * remove dead code * revert lexsort to argmin/max * handrolled lexsort * remove dead code * remove bincount * import numba cuda for jit * fix tests --------- Co-authored-by: maxymnaumchyk <maxymnaumchyk@gmail.com> Co-authored-by: maxymnaumchyk <70752300+maxymnaumchyk@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Iason Krommydas <iason.krom@gmail.com> * chore: profile: add benchmark script (#4073) add benchmark script * feat: add some of the kernels using cuda.compute (#3981) * feat: add `awkward_IndexedArray_overlay_mask` kernel using cuda.compute * feat: add `awkward_IndexedArray_reduce_next_64` kernel using cuda.compute * feat: add `IndexedArray_reduce_next_nonlocal_nextshifts_64` kernel using cuda.compute * feat: add `ByteMaskedArray_getitem_nextcarry` kernel using cuda.compute * feat: add `awkward_ByteMaskedArray_numnull` kernel using cuda.compute * feat: add `awkward_RegularArray_getitem_jagged_expand` kernel using cuda.compute * add an upper bound * style: pre-commit fixes * feat: add `awkward_RegularArray_getitem_jagged_expand` kernel using cuda.compute * feat: add `awkward_UnionArray_simplify_one` kernel using cuda.compute * feat: add `awkward_ListArray_broadcast_tooffsets` kernel using cuda.compute * feat: add `awkward_ListArray_localindex` kernel using cuda.compute * fix the impl * feat: add `awkward_ListArray_compact_offsets` kernel using cuda.compute * feat: add `awkward_ListArray_combinations_length` kernel using cuda.compute * feat: add `awkward_ListArray_combinations` kernel using cuda.compute * feat: add `awkward_UnionArray_nestedfill_tags_index` kernel using cuda.compute * fix the tests for kernels that are deliberately raising errors * compare `starts` and `stops` separately * ignore `memptr` argument for pylint * style: pre-commit fixes * Add functions for indexing and repeating arrays * style: pre-commit fixes * return unary_transform call for segment_ids * style: pre-commit fixes * update the `awkward_IndexedArray_reduce_next_64` to work with offsets * style: pre-commit fixes --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch> * feat: migrate some more kernels to cuda.compute (#4019) * feat: add reimplementation of the `awkward_RegularArray` kernels using cuda.compute * reimplement more kernels using cuda.compute * reimplement more kernels using cuda.compute * style: pre-commit fixes * style fix * use the named functions instead of lambdas * add new kernels * add new kernels * fix a type mismatch * style: pre-commit fixes * add new kernels * fix the overflow error * new batch of kernels (draft) * add comments and cleanup * fix the tests messages * add new `BitMaskedArray` kernels * modify the `test_1381_check_errors.py` test * resolve the conflicts --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fable fixes based on the report * sort kernel issues addressed * add tests * add benchmarks * add benchmarks * fix memory leak * add benchmarks/cuda_compute_cache_leak_reproducer.py * fix ruff checks * synchronization * fix it * fix memory leak * more fixes * more tests * reduce temporaries * more tests * relax conditions * fix bench * bigfix * fix bug * relax condition * add kernel fusion with parrot * the same for more reducers * cleanup * apply __restrict__ uniformly * rename macro-generated ABI symbols to match the kernel name * add tests * add O2 build * fix * add max_segment_size * add benchmarks and cccl profiler * pin cccl and clean up * cleanup * add test * fix overflow int64 --------- Co-authored-by: maxymnaumchyk <maxymnaumchyk@gmail.com> Co-authored-by: maxymnaumchyk <70752300+maxymnaumchyk@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Iason Krommydas <iason.krom@gmail.com>
* fix: wrong results from string sort/unique kernels The sort_asstrings kernel iterated the per-string character copy with a uint8_t counter initialised from an int64_t byte offset, so once the cumulative offset exceeded 255 the counter wrapped and strings were built from the wrong bytes. The loop now uses an int64_t index bounded directly by the stop offset. The unique_strings kernel compacts strings toward the front of the buffer in place, but compared each candidate against the previously kept string at its original input offset, a region the compaction may have already overwritten. It now compares against the kept string's location in the compacted output, so adjacent duplicates are correctly removed. Assisted-by: ClaudeCode:claude-opus-4.8 * test: regression tests for string sort/unique kernels Cover sorting and uniqueing of string arrays whose cumulative byte length exceeds 255 (exercising the former uint8 wraparound) and adjacent duplicate strings of differing lengths (exercising the in-place compaction comparison). Assisted-by: ClaudeCode:claude-opus-4.8 * chore: slim test suite to one focused test per bug fixed Removed three redundant test cases: - test_unique_strings_over_255_cumulative_chars (unique bug is about in-place compaction, not uint8 overflow; covered by adjacent-duplicates test) - test_unique_strings_short_then_long_duplicates (near-duplicate of adjacent-duplicates test) - test_sort_and_unique_mixed_lengths (covered by the two remaining tests) Assisted-by: ClaudeCode:claude-sonnet-4-6 --------- Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
…ching (#4090) * fix: int64 precision loss in sort comparators and per-comparison branching - Use `if constexpr (std::is_integral_v<T>)` in sort_order_ascending/ descending and argsort_order_ascending/descending so integer types compare directly without double-casting (fixes precision loss for int64/uint64 values > 2^53, and eliminates two casts + isnan per comparison for integral types). - Move explicit `template<>` bool specializations above the implicit instantiations that use them, fixing ill-formed translation units per [temp.expl.spec]. - Hoist ascending/stable dispatch outside the comparator lambda in awkward_argsort, matching the structure of awkward_sort so the branch is evaluated once per segment rather than once per comparison. Assisted-by: ClaudeCode:claude-sonnet-4-6 * test: regression tests for int64 sort precision fix (#4090) Tests that ak.sort and ak.argsort on int64/uint64 values > 2^53 match numpy exactly, verifying the double-cast precision bug is fixed. Also covers NaN float handling (unchanged), bool sort, descending order, stable sort, and multiple sublists. Assisted-by: ClaudeCode:claude-sonnet-4-6 * style: pre-commit fixes * chore: slim down PR #4090 comments and tests - Remove descriptive comments in C++ that restate what code does; keep the non-obvious constraint comment about specialization ordering. - Trim 13 regression tests to 5: one per distinct concern (int64 sort, int64 argsort, uint64 sort, float NaN unchanged, bool specialization). - Rename test file to use underscores to pass validate-test-names hook. Assisted-by: ClaudeCode:claude-sonnet-4-6 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
* fix: LayoutBuilder Union form JSON and Record map-type support
- Fix Union::form() producing invalid JSON (double-comma, missing comma)
when parameters are set; params string is now built leading-comma-free
like Record/Tuple do ("\"parameters\": { ... }, ") in
header-only/layout-builder/awkward/LayoutBuilder.h
- Fix Record<MAP,...>::ContentsFormFunctor hardcoding std::map so that
form() now compiles for any MAP type (e.g. std::unordered_map) by
using the class's UserDefinedMap alias instead
- Add <sstream> include to LayoutBuilder.h and utils.h to eliminate
reliance on transitive includes
- Fix CMakeLists.txt option(BUILD_TESTS ...) missing help-string argument
and add enable_testing() so ctest can discover tests
- Add regression tests in header-only/tests/test_4088-layoutbuilder-form-fixes.cpp
Assisted-by: ClaudeCode:claude-sonnet-4-6
* chore: slim down PR comments and tests per review
Remove comment suffix that restates the code ("uses class MAP type"),
and drop the redundant test_union_form_without_parameters test case
(no-params path was never broken) plus the ordered_map assertions in
test_record_unordered_map (std::map was always working). Inline the
two helper predicates into the remaining test.
Assisted-by: ClaudeCode:claude-sonnet-4-6
---------
Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
* fix: misc integration bugs (hist, avro, numexpr, RDataFrame) - hist.py: return NotImplemented singleton (not NotImplementedError class) on TypeError in broadcast_and_flatten - avro.py: decode_zigzag the correct variable (header_size, not pairs) in negative-pair-count header branch - numexpr.py: use import importlib.metadata instead of bare importlib (submodule not auto-imported) - rdataframe/from_rdataframe.py: always build intermediates with highlevel=True to avoid AttributeError on .layout when highlevel=False with keep_order=True or awkward-type columns; apply highlevel once at return Assisted-by: ClaudeCode:claude-sonnet-4-6 * chore: rename test file with PR number 4096 Assisted-by: ClaudeCode:claude-sonnet-4-6 * style: pre-commit fixes * chore: slim down test and fix file name convention - Rename test file to use underscores (required by validate-test-names.py) - Remove redundant happy-path test that doesn't verify the bugfix - Remove module docstring, function docstring, and inline comment that merely restate what the code does Assisted-by: ClaudeCode:claude-sonnet-4-6 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
* migrate `UnionArray` kernels * update `UnionArray` kernels * exclude `UnionArray_flatten_length` and `UnionArray_flatten_combine` kernels * fix the tests
* fix: modify cache key for macOS deployment in workflow Updated cache key for awkward-cpp wheel to include macOS version. * Update MACOSX_DEPLOYMENT_TARGET environment variable Set MACOSX_DEPLOYMENT_TARGET based on the runner type. * Apply suggestion from @ariostas Co-authored-by: Andres Rios Tascon <ariostas@gmail.com> --------- Co-authored-by: Andres Rios Tascon <ariostas@gmail.com>
* feat: add local_index kernel implementation using cuda.compute * feat: add `ListArray_getitem_jagged` and `IndexedArray_numnull` kernels using cuda.compute * feat: add `NumpyArray_reduce_adjust_starts_shifts` and `NumpyArray_reduce_mask_ByteMaskedArray` kernels implementations using cupy * feat: add `IndexedArray_flatten_nextcarry` kernel implementation using cuda.compute * small fix * style: pre-commit fixes * style: pre-commit fixes * Apply suggestion from @ianna --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
…rations (#4148) * docs: describe the returned object in Returns: for already-merged operations. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: reduce Returns: to a noun clause; move narrative to the description. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: reject non-integer float indices instead of truncating Change is_integer_like to use __index__ protocol instead of __int__ in the fallback branch, and use operator.index() in normalize_integer_like and regularize_axis. Python float and Decimal no longer pass is_integer_like, so ak.Array([...])[1.5] now raises TypeError (matching NumPy behavior) instead of silently truncating to 1. axis=1.5 now also raises instead of being silently treated as axis=1. Assisted-by: ClaudeCode:claude-sonnet-4-6 * test: add regression tests for float index rejection (PR #4097) Cover: float scalar index raises, int/np.integer/__index__ objects work, axis=1.5 raises, np.float64 index raises, Decimal index raises. Assisted-by: ClaudeCode:claude-sonnet-4-6 * style: pre-commit fixes * test: slim down float-index regression tests Remove redundant parametrize variants and near-duplicate cases; keep one focused test per distinct behavior (float index raises, Decimal raises via __int__-not-__index__ boundary, __index__ protocol still accepted, int still works, float axis raises, int axis still works). Drop module docstring to match surrounding test density. Assisted-by: ClaudeCode:claude-sonnet-4-6 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: typetracer correctness issues affecting dask-awkward Fixes several typetracer correctness issues, mostly affecting dask-awkward, found via an automated multi-agent review: - typetracer min/max/sum(axis=None) recursed with axis=None instead of axis=0, causing a RecursionError; sum now reports NumPy's promoted dtype (e.g. bool/int32 -> platform int). - typetracer.stack built the result shape incorrectly (treated the prototype tuple as data, and normalized negative axis over the input ndim rather than ndim+1); now builds the shape symbolically and uses numpy.result_type for the dtype. - searchsorted returned the input dtype instead of intp insertion indices. - asarray now honors the requested dtype for non-TypeTracerArray inputs and only rejects copy=False when an incompatible dtype is requested. - reshape now permits zero-size dimensions, matching NumPy and the concrete backends. - TypeTracerArray.__repr__ no longer reads the touching .shape property (printing mutated the report); same dead None-shape branch removed in PlaceholderArray and VirtualNDArray. - cupy reducers (all/any/min/sum/max) now forward keepdims, preserving the cupy#3819 .item() workaround only for axis=None without keepdims. - NumpyArray._pad_none and Content._combinations_axis0 now guard against unknown_length, fixing ak.pad_none and ak.combinations(axis=0) on typetracer layouts. - Removed verified-dead branches in __getitem__, derive_slice_for_length, and broadcast_arrays. Assisted-by: ClaudeCode:claude-opus-4.8 * test: add regression tests for typetracer correctness fixes Assisted-by: ClaudeCode:claude-opus-4.8 * test: trim regression tests and restated comments Keep one focused test per fix and drop comments that merely restate the adjacent code. Assisted-by: ClaudeCode:claude-opus-4-8 --------- Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
* fix: BitMaskedArray mask inversion and placeholder detection - Use bitwise `~` instead of `logical_not` in `to_BitMaskedArray` when inverting `valid_when` with the same `lsb_order`, matching the different-lsb_order branch and preventing silent data corruption. - Remove erroneous `out._content` unwrap in `BitMaskedArray._unique` so it matches `ByteMaskedArray._unique` semantics (both now delegate to `IndexedOptionArray64._unique` and return the result unchanged). - Fix `_is_getitem_at_placeholder` in `BitMaskedArray`, `ByteMaskedArray`, and `UnionArray` to check `.data` on the Index wrapper, consistent with `ListOffsetArray` and `IndexedArray` siblings. Assisted-by: ClaudeCode:claude-sonnet-4-6 * test: add regression tests for BitMaskedArray fixes (#4092) Covers to_BitMaskedArray mask inversion, _unique consistency between BitMasked and ByteMasked option types, and _is_getitem_at_placeholder buffer check propagation. Assisted-by: ClaudeCode:claude-sonnet-4-6 * style: pre-commit fixes * refactor(tests): slim down and rename test_4092 regression tests Remove redundant round-trip, big-endian, and ByteMaskedArray tests that don't cover changed code paths. Remove placeholder tests that pass even without the fix. Rename file to use underscores per project convention. Two focused tests remain: one per distinct bug fixed. Assisted-by: ClaudeCode:claude-sonnet-4-6 * Apply suggestion from @ianna * revert Fix 2, Fixes 1 (bitmask inversion) and 3 (placeholder .data checks) are untouched and intact. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
…-file Parquet attrs (#4099) * fix: Arrow conversion without pandas, empty chunked arrays, and multi-file Parquet attrs - Map Arrow primitive types to NumPy dtypes directly instead of via DataType.to_pandas_dtype(), which hard-imports pandas in pyarrow >= 22 and broke ak.from_arrow / ak.from_parquet in pandas-free environments. - Handle empty (zero or all-empty-chunk) ChunkedArrays in from_arrow by building a length-zero array instead of calling concatenate([]). - Propagate parquet-stored .attrs across multi-file datasets, mirroring the single-file path. - Drop the dead multi-batch branch in the Table handler (combine_chunks yields at most one batch). Assisted-by: ClaudeCode:claude-fable-5 * test: add regression tests for pyarrow pandas-free, empty chunked, and multi-file parquet attrs Assisted-by: ClaudeCode:claude-fable-5 * chore: slim test suite — remove redundant cases, keep one per fix Assisted-by: ClaudeCode:claude-sonnet-4-6 --------- Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
update python version for mypy
* feat: port cuda kernels to cuda.compute * improve comments * cleanup * style: pre-commit fixes --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch>
…4098) * fix: BitMasked builder use-after-free and GrowableBuffer copy bugs Header-only LayoutBuilder/GrowableBuffer fixes found in a code review: - BitMasked stored a `uint8_t& current_byte_ref_` aliasing element 0 of the mask buffer's first panel. `append_begin()`/`clear()` assigned *through* the reference instead of rebinding it, so it forever aliased the freed panel after `clear()` (heap-use-after-free, confirmed with ASan), and mask bytes beyond the first landed in the wrong place. Removed the reference member; `current_byte_`/`current_index_` are now plain state and each completed byte is appended to `mask_` (with the `valid_when` inversion applied) when it fills, or written as the trailing partial byte at finalization (LayoutBuilder.h, BitMasked: constructors, clear, length, buffer_nbytes, to_buffers/to_buffer/to_char_buffers, append_begin/append_end, write_mask). - For BitMasked<valid_when=false> the inversion now happens where each completed byte lands in the buffer, fixing wrong mask bytes past 8 elements. - GrowableBuffer::Panel::concatenate_to_from recursed with `offset + length_` instead of `offset + (length_ - from)`, leaving a `from`-sized hole of uninitialised bytes when the source spanned multiple panels (hit by BitMasked masks > ~8190 elements) (GrowableBuffer.h:135). - GrowableBuffer memcpy sizes computed `length * sizeof(PRIMITIVE) - from`, mixing byte and element counts; corrected to `(length - from) * sizeof(...)` in Panel::append and concatenate_to_from (GrowableBuffer.h:119, :133). - Indexed::extend_index / IndexedOption::extend_valid computed `stop - 1` for size==0 on empty content, underflowing to SIZE_MAX and poisoning max_index_/last_valid_ so is_valid() falsely failed; guard size==0. Also removed the dead `else if (i < 0)` branch on a size_t (always false). Adds header-only/tests/test_4087-bitmasked-growablebuffer.cpp covering builder reuse after clear(), BitMasked valid_when=false, >8 elements, a >1-panel mask (20000 elements), zero-size extend_index/extend_valid, and multi-panel GrowableBuffer concatenate with non-zero `from` and sizeof(PRIMITIVE)>1; the UAF reproduces under ASan against the pre-fix headers. Also adds `enable_testing()` so ctest discovers the suite. The header-only library is standalone; the generated copies under awkward-cpp/ and src/awkward/_connect/header-only (produced by dev/copy-cpp-headers.py at prepare time) are not committed. Assisted-by: ClaudeCode:claude-fable-5 * chore: trim redundant comments and dead alias from BitMasked/GrowableBuffer PR Remove unused NumpyBuilder alias from test, drop restate-the-code comments (length formula, ceil expression, element-pattern description), and condense LayoutBuilder.h docstrings to remove padding while keeping the non-obvious rationale for the use-after-free fix and valid_when encoding constraint. Assisted-by: ClaudeCode:claude-sonnet-4-6 * fix: complete target_link_libraries for test_4087 header-only test (#4171) The test_4087-bitmasked-growablebuffer target was missing its `PRIVATE awkward::layout-builder)` line, so the call swallowed the next command and the header-only test suite failed to configure. Add the missing line so CMake can configure and the tests build. Claude-Session: https://claude.ai/code/session_013yRH8RuTZNTdyREnNLQTK9 Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Ianna Osborne <ianna.osborne@cern.ch> Co-authored-by: Tai Sakuma <tai.sakuma@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bumps [hypothesis-awkward](https://github.com/scikit-hep/hypothesis-awkward) from 0.18.0 to 0.18.1. - [Release notes](https://github.com/scikit-hep/hypothesis-awkward/releases) - [Changelog](https://github.com/scikit-hep/hypothesis-awkward/blob/main/CHANGELOG.md) - [Commits](scikit-hep/hypothesis-awkward@u0.18.0...u0.18.1) --- updated-dependencies: - dependency-name: hypothesis-awkward dependency-version: 0.18.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
fix: include kernel-specification.yml in source distribution (#4178) tests/test_4056_cuda_compute_signature_consistency.py reads kernel-specification.yml from the repo root, but the file was not part of the sdist include list, so the test errored with FileNotFoundError when the suite ran against an unpacked source distribution (e.g. conda-forge). The tests/ directory already ships, so this adds the one data file it depends on. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Bumps the actions group with 2 updates: [actions/setup-python](https://github.com/actions/setup-python) and [actions/cache](https://github.com/actions/cache). Updates `actions/setup-python` from 6.2.0 to 6.3.0 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](actions/setup-python@a309ff8...ece7cb0) Updates `actions/cache` from 5.0.5 to 6.1.0 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](actions/cache@27d5ce7...55cc834) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: 6.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: actions - dependency-name: actions/cache dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
fix: undo a rejected assignment The layout and behavior setters assigned before _update_class() ran __awkward_validation__, so a rejected `array["rho"] = ...` raised and applied the field anyway. They now restore the previous value if validation raises. Record.__setitem__ mutated layout._array in place, which left the setter with nothing to restore; it builds a new Record now. That is the same fix as item 1 of #4095.
* test: add stability roundtrip test for `to_numpy`/`from_numpy` The strict roundtrip tests exclude layouts that `to_numpy` converts lossily (unknown types, strings with trailing NULs, option-flavor normalization). The new test covers that domain with a weaker property: the converted form is a fixed point, i.e. `to_numpy` of the reconstructed array reproduces the same NumPy array, including dtype (except "U"/"S" itemsize, which trailing-NUL stripping narrows) and mask (compared explicitly, since `np.testing.assert_array_equal` treats masked positions as equal to anything). `allow_regular` stays off: option-over-regular layouts produce multidimensional masked arrays that crash `from_numpy` in two ways, to be reported separately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: cite issues for the stability test's regular-array exclusion The two `from_numpy` crashes excluded by `allow_regular=False` are now reported: #4226 (AttributeError for multidimensional masked string arrays with no masked elements) and #4227 (ValueError for masked arrays with ndim >= 3 and a zero-length dimension). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* docs: add summary lines to 19 reducer operation docstrings Add a Google-style one-line summary and `Returns:`/`Examples:` section headers to the 19 reducer operations (28 functions, including the nan* variants) in `src/awkward/operations/`: all, any, sum, prod, count, count_nonzero, min, max, argmin, argmax, mean, std, var, moment, corr, covar, ptp, linear_fit, softmax. Follows the pilot in #3946 on `ak.flatten`. Original body text is preserved; only structural edits are applied. Refs #3980. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * docs: describe the returned object in Returns: lines. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: reduce Returns: to a noun clause; move narrative to the description. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: move description text out of Examples: sections Per the Examples:-section checklist on #3980: narrative that describes behavior, arguments, or history belongs above Args: in the extended description; Examples: keeps only doctest walkthroughs and their connecting prose; "See also" lines go directly above Args:. Refs #3980. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* docs: add summary lines to 3 *_like operation docstrings Add a Google-style one-line summary and `Returns:`/`Examples:` section headers to full_like, ones_like, and zeros_like in `src/awkward/operations/`. Follows the pilot in #3946 on `ak.flatten`. Original body text is preserved; only structural edits are applied. Refs #3980. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: describe the returned object in Returns: lines. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: reduce Returns: to a noun clause; move narrative to the description. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: move description text out of Examples: sections Per the Examples:-section checklist on #3980: narrative that describes behavior, arguments, or history belongs above Args: in the extended description; Examples: keeps only doctest walkthroughs and their connecting prose; "See also" lines go directly above Args:. Refs #3980. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…4132) * docs: add summary lines to 5 sorting/indexing operation docstrings Add a Google-style one-line summary and `Returns:`/`Examples:` section headers to the 5 sorting/indexing operations in `src/awkward/operations/`: sort, argsort, run_lengths, local_index, num. Follows the pilot in #3946 on `ak.flatten`. Original body text is preserved; only structural edits are applied. Refs #3980. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: describe the returned object in Returns: lines. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: move description text out of Examples: sections Per the Examples:-section checklist on #3980: narrative that describes behavior, arguments, or history belongs above Args: in the extended description; Examples: keeps only doctest walkthroughs and their connecting prose; "See also" lines go directly above Args:. Refs #3980. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add summary lines to 10 type/validity operation docstrings Add a Google-style one-line summary and `Returns:`/`Examples:` section headers to the 10 type/validity/equality operations in `src/awkward/operations/`: almost_equal, array_equal, is_valid, validity_error, is_categorical, is_tuple, categories, enforce_type, values_astype, strings_astype. Follows the pilot in #3946 on `ak.flatten`. Original body text is preserved; only structural edits are applied. Refs #3980. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * docs: describe the returned object in Returns: lines. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: reduce Returns: to a noun clause; move narrative to the description. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: move description text out of Examples: sections Per the Examples:-section checklist on #3980: narrative that describes behavior, arguments, or history belongs above Args: in the extended description; Examples: keeps only doctest walkthroughs and their connecting prose; "See also" lines go directly above Args:. Refs #3980. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…4231) * test: add property-based roundtrip tests for `to_arrow`/`from_arrow` Four tests: a strict roundtrip that includes unions (unique to the Arrow pair; contents must be pairwise non-mergeable because `from_arrow` rebuilds unions with `UnionArray.simplified`), a masked roundtrip through Arrow validity bitmaps, a table roundtrip that also checks `from_arrow_schema` against the returned form, and a stability test asserting that one full roundtrip brings the conversion to a fixed point, compared on the Arrow side with `Array.equals`. Generation is restricted by a dtype filter (complex and float128 unrepresentable; datetime64/timedelta64 limited to "s"/"ms"/"us"/"ns", with datetime64[D] corrupted by #4219) and a layout predicate excluding known defects: #4221, #4222 (including a new trigger via conversion-time offset shifts), #4228, #4229, and #4230. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: restructure arrow roundtrip predicates by exclusion kind Split the generation predicates of test_to_from_arrow.py into the structure introduced by the feather sibling (#4239): `arrow_compatible` and `table_compatible` hold the permanent limits of the conversion (mergeable union contents merge on read, an optioned unknown gains an option, plus the table-wrapping record clauses), while `has_issues` composes one `_has_issue_NNNN` function per known issue (#4221, #4222, #4228, #4229) so each released fix deletes exactly one function. The filters name both parts inline, and the stability test's filter is now literally `not has_issues(a)`. No behavioral change: a 40,000-example equivalence check against the original merged predicates over all four generation domains found no disagreement. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…er` (#4239) Add three Hypothesis tests in tests/properties/operations/: - test_roundtrip: option-free arrays reconstruct exactly - test_roundtrip_masked: option-type arrays roundtrip through nullable feather columns, without comparing content classes - test_roundtrip_stable: one write/read cycle brings the conversion to a fixed point, compared as Arrow tables `to_feather` requires a real filesystem path (its destination goes through `os.fsdecode`), so unlike the parquet sibling the tests write to a module-scoped `tmp_path_factory` directory, with a per-thread filename for pytest-run-parallel. Generation excludes arrays affected by known issues, one predicate function per issue so each released fix deletes exactly one function: #4221, #4222, and #4229 in `has_issues`, #4230 and #4238 via strategy flags, and #4219 in the dtype filter. The format's own limits live in `feather_compatible` and `feather_stable`, which are all that remains when the cited issues are fixed. Validated with 10,000 examples per test (nightly profile), fixed seeds 1-8, and under pytest-xdist. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…4245) Add four Hypothesis tests in tests/properties/operations/: - test_roundtrip: option-free arrays on the inference-stable domain (bool, int64, float64, strings) reconstruct exactly - test_roundtrip_masked: option-type arrays roundtrip through JSON nulls, without comparing content classes (`from_json` returns every option as an IndexedOptionArray) - test_to_json_matches_json_loads: an oracle check of the writer against Python's own JSON parser on the widest serializable domain - test_roundtrip_stable: one roundtrip brings the conversion to a fixed point, compared as JSON text Schemaless `from_json` rebuilds types purely from the values present in the JSON text, so `json_compatible` requires a witness for every part of the type: no zero-length branches, no all-valid or all-null options, no tuples (written as objects with stringified keys). Generation excludes arrays affected by known issues, one predicate function per issue: #4241 (floats parse one ULP off) and #4242 (crash on null alongside heterogeneous values) in `has_issues`; #4243 (uint64 wrap) is noted in the stability test's docstring, which keeps uint64 in its domain. Unlike the parquet and feather siblings, no `deadline=None` is needed: first calls cost under 0.2 ms, and ten default-profile runs under the 200 ms deadline never tripped it. Validated with 10,000 examples per test (nightly profile), fixed seeds, and under pytest-xdist. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
#4240) * rgsort reducer * add tests * add argsort * sort nan aware bugfix * enable all argsort tests * add test for better coverage * address order-preserving unsigned key transform * fuse kernels and increase coverage
* overflow-safe stats without needless copies * add test * fix lint * address reviewer comments
…#4234) Per the Examples:-section checklist on #3980: narrative that describes behavior, arguments, or history belongs above Args: in the extended description; Examples: keeps only doctest walkthroughs and their connecting prose; "See also" lines go directly above Args:. Refs #3980. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ngs (#4249) * fix string lowering * add test * update * avoids handling the LLVM shape tuple entirely * Update src/awkward/_connect/numba/builder.py
Stop requiring future annotations
…/corr via fused two-pass sum-of-squares/powers reducers (#4232) * Add a dtype= accumulator to ak.sum (overflow-safe, copy-free integer sums) * add tests * add more tests to increase coverage * add a dedicated sum-of-squares reducer * style: pre-commit fixes * add tests * remove obsolete tests * add the kernel * jax backend too * GPU sum-of-squares path has no host transfer -- fix the test * the promote copy is now eliminated everywhere * two-pass/one-pass fallback * the internal centering is an implementation detail and shouldn't be gated by named-axis metadata * more tests to increase coverage * recalculate xmean and ymean with the user's original keepdims parameter * all stays on device * more test coverage * platform integer differs * integer-power fast path for moment, and a NumPy axis=None path for sum-of-squares * fix bottleneck * apply the same axis=None scalar-centering to covar/corr * address review comments --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
…nt data corruption (#4250) * stop making numba strings through pyobjects * add tests * set the one-dimensional shape and stride explicitly * add invalid-UTF-8 tests * change ValueError branches with UnicodeDecodeError for consistency with Python's decoder * revert
The vectorized fast path in UnionArray._remove_structure (#4109) reorders merged values with a broadcast position marker, but ak.broadcast_arrays does not reliably descend into union branches (mixed-depth unions report a degenerate purelist_depth that stops the broadcast early, and broadcast_any_union regroups tags/index), so the marker and the values could flatten to different lengths or orders, silently truncating data or raising IndexError. Skip the fast path when a branch subtree contains a nested union and use the pre-existing element-wise fallback, restoring the 2.10.0 results. As a consequence, axis=None reductions over nested unions again raise "cannot use axis=None on an array containing irreducible unions" as in 2.10.0, instead of returning silently wrong results. Fixes #4214 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore: use scikit-build-core 1.0 for awkward-cpp Bump the build requirement to scikit-build-core>=1.0; minimum-version = "build-system.requires" picks up the new defaults (sdist symlink resolution, faster inclusion mode). Enable the new wheel.reproducible setting, drop sdist.reproducible (default), and add a messages.after-failure hint pointing at 'nox -s prepare'. Remove the pyproject/color extras, which no longer exist in 1.0. Assisted-by: ClaudeCode:claude-fable-5 * Update awkward-cpp/pyproject.toml
…#4138) * docs: add summary lines to 11 to_* array-library converter docstrings Add a Google-style one-line summary and `Returns:`/`Examples:` section headers to the 11 to_* array-library converters in `src/awkward/operations/`: to_numpy, to_cupy, to_jax, to_torch, to_tensorflow, to_cudf, to_raggedtensor, to_list, to_layout, to_dataframe, to_rdataframe. Follows the pilot in #3946 on `ak.flatten`. Original body text is preserved; only structural edits are applied. Refs #3980. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: describe the returned object in Returns: lines. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: reduce Returns: to a noun clause; move narrative to the description. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: move description text out of Examples: sections Per the Examples:-section checklist on #3980: narrative that describes behavior, arguments, or history belongs above Args: in the extended description; Examples: keeps only doctest walkthroughs and their connecting prose; "See also" lines go directly above Args:. Refs #3980. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…4139) * docs: add summary lines to 13 to_* file/format converter docstrings Add a Google-style one-line summary and `Returns:`/`Examples:` section headers to the 13 to_* file/format converters in `src/awkward/operations/`: to_arrow, to_arrow_table, to_parquet, to_parquet_dataset, to_parquet_row_groups, metadata_from_parquet, to_feather, to_json, to_safetensors, to_buffers, to_packed, to_regular, to_backend. Follows the pilot in #3946 on `ak.flatten`. Original body text is preserved; only structural edits are applied. Refs #3980. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * docs: describe the returned object in Returns: lines. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: reduce Returns: to a noun clause; move narrative to the description. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: fix stray backtick in to_parquet description. Refs #3980. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: move description text out of Examples: sections Per the Examples:-section checklist on #3980: narrative that describes behavior, arguments, or history belongs above Args: in the extended description; Examples: keeps only doctest walkthroughs and their connecting prose; "See also" lines go directly above Args:. Refs #3980. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* test: add no-raise property tests for ak.flatten and ak.all Add a per-operation property-test family under tests/properties/operations/: each module draws arrays (hypothesis-awkward) and option dicts, keeps the draws expected to succeed, and asserts the operation does not raise. Two conservative predicates filter the draws: _should_not_raise models the operation's deliberate error behavior, and _would_raise_from_known_issue skips draws that meet an open issue via the shared known_issues predicates, which are deleted as the issues are fixed. The issues found by these tests are reported as #4259, #4260, #4261, #4262, and #4263. Shared helpers are in util.py; name-tests-test excludes tests/properties/ for the non-test modules. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: skip reducers on options in untrimmed regular content (#4264) The nightly profile found that the reducers fail, sometimes nondeterministically, on an option node inside a RegularArray whose content is longer than size * length; reported as #4264 and skipped by the new known_issues.has_issue_4264, applied by ak.all's test at integer axes. The same run showed that uint64 with either timedelta family crashes the merge behind ak.flatten(axis=None), a combination #4261's predicate treated as promotable; uint64 is now a family of its own in has_issue_4261. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: skip float128 leaves too (has_issue_4259) CI on Linux drew a float128 array and ak.all raised KeyError ('awkward_reduce_prod_bool', bool, longdouble, int64) — the same defect as #4259's float16: kernel-specification.yml has no float128 entries either, and #392's roadmap paired the two dtypes. macOS NumPy has no float128, so local runs could not draw it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: drop the float16-only qualifier from has_issue_4259's link Issue #4259 now covers float128 in its own text (title, description, and cause were edited), so the predicate's "Reported (for float16)" parenthetical no longer reflects the report. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: skip complex256 leaves too (has_issue_4259) CI's derandomized sequence moved past the skipped float128 and drew complex256, the other extended-precision dtype that exists on Linux but not macOS; ak.all raised the same kernel-table KeyError with numpy.clongdouble in the key. Issue #4259 was edited to cover all three dtypes. hypothesis-awkward's dtype universe comes from awkward's per-platform primitive registry, and float128/complex256 are its only platform-conditional entries, so this closes the gap. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
The "^\.github" override handed zizmor files it cannot audit (release.yml, issue templates), so a local commit touching only such files failed with "no inputs collected". The upstream default already scopes the hook to workflows, action.yml files, and dependabot.yml. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Bumps [hypothesis-awkward](https://github.com/scikit-hep/hypothesis-awkward) from 0.19.0 to 0.19.1. - [Release notes](https://github.com/scikit-hep/hypothesis-awkward/releases) - [Changelog](https://github.com/scikit-hep/hypothesis-awkward/blob/main/CHANGELOG.md) - [Commits](scikit-hep/hypothesis-awkward@u0.19.0...u0.19.1) --- updated-dependencies: - dependency-name: hypothesis-awkward dependency-version: 0.19.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the actions group with 5 updates: | Package | From | To | | --- | --- | --- | | [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.14.0` | `1.14.1` | | [actions/checkout](https://github.com/actions/checkout) | `7.0.0` | `7.0.1` | | [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) | `6.2.2` | `6.2.3` | | [actions/setup-python](https://github.com/actions/setup-python) | `6.3.0` | `7.0.0` | | [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) | `8.3.2` | `9.0.0` | Updates `pypa/gh-action-pypi-publish` from 1.14.0 to 1.14.1 - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](pypa/gh-action-pypi-publish@cef2210...ba38be9) Updates `actions/checkout` from 7.0.0 to 7.0.1 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](actions/checkout@9c091bb...3d3c42e) Updates `aws-actions/configure-aws-credentials` from 6.2.2 to 6.2.3 - [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases) - [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md) - [Commits](aws-actions/configure-aws-credentials@517a711...e6de054) Updates `actions/setup-python` from 6.3.0 to 7.0.0 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](actions/setup-python@ece7cb0...5fda3b9) Updates `astral-sh/setup-uv` from 8.3.2 to 9.0.0 - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](astral-sh/setup-uv@11f9893...c771a70) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-version: 1.14.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: actions - dependency-name: actions/checkout dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: actions - dependency-name: aws-actions/configure-aws-credentials dependency-version: 6.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: actions - dependency-name: actions/setup-python dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: astral-sh/setup-uv dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Add a sentence to the "Testing practices" section: the property-based tests in tests/properties/ do not follow the issue-numbered naming convention; their directory structure roughly mirrors the source layout. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
The self-hosted runner has many cores, and JAX/XLA, OpenBLAS, OpenMP, and numexpr each spawn a worker thread per core in the single coverage test process. Clamp them with environment variables. PJRT_NPROC caps the XLA CPU client pools (the *_NUM_THREADS variables do not affect modern jaxlib). Assisted-by: ClaudeCode:claude-fable-5
…he innermost axis (CPU + CUDA) (#4256) * centered sum of squares * add kernel * alignment holds only for the innermost axis * cuda part * rename tests * fix tests * cuda part implemented * the test should pass now * fix it * remove dead kernels * cleanup * add more tests for coverage * address comments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.