Follow-up to epic #2424 / #2390. Cluster 10 of 16. **Parallel-safe.** Likely 1-2 PRs. The 13 files have a clean read/write split, so a 1 PR vs 2 PR call comes down to review surface. ## Scope Consolidate nodata semantics, attrs, lifecycle, validation, and round-trip into one parametrised home each on the read and write sides. ## Files to consolidate (13) ### Sub-PR A: read-side -> extend `read/test_nodata.py` - `test_masked_nodata_attr_2092.py` - `test_nodata_attr_aliases_1582.py` - `test_nodata_lifecycle_attrs_2135.py` - `test_nodata_lifecycle_parity_2211.py` - `test_nodata_nan_int_1774.py` - `test_nodata_no_extra_copy_1553.py` - `test_nodata_semantics_split_1988.py` - `test_helper_band_nodata_2210.py` ### Sub-PR B: write-side / validation -> extend `write/test_basic.py` or new `write/test_nodata.py` - `test_mask_nodata_kwarg_2052.py` - `test_nodata_bool_rejection_1911.py` - `test_nodata_int64_precision_1847.py` - `test_nodata_out_of_range_1581.py` - `test_nodata_validation_1973.py` ## Boundary GPU nodata (`test_gpu_nodata_1542.py`, `test_mask_nodata_gpu_vrt_2052.py`, `test_gpu_writer_nan_sentinel_1599.py`) belongs to the GPU cluster. ## Constraints - Tests-only. - Markers from `_helpers/markers.py`; `make_minimal_tiff` from `_helpers/tiff_builders.py`. - Descriptive IDs (e.g. `id="alias[GDAL_NODATA->nodata]"`, `id="lifecycle[masked-then-write]"`). - `CLUSTER_AUDIT_NODATA.md` deleted before merge. ## Verification ```bash pytest xrspatial/geotiff/tests/read/test_nodata.py xrspatial/geotiff/tests/write/ -v pytest xrspatial/geotiff/tests/ -x -q ``` File count drops by 12 (13 deleted, 1 added if write-side becomes new file).
Activity
Address review nits on Sub-PR A (#2434)
Delete cluster audit file (#2434)
Retrigger CI for RTD flake (#2434)
geotiff tests: consolidate nodata read-side cluster (Sub-PR A) (#2469)
geotiff tests: consolidate nodata write-side cluster (Sub-PR B) (#2470)