xarray-spatial 0.9.7__tar.gz → 0.9.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/bench.md +6 -6
  2. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/efficiency-audit.md +1 -1
  3. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/release-major.md +3 -3
  4. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/release-minor.md +3 -3
  5. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/release-patch.md +3 -3
  6. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/sweep-accuracy.md +67 -28
  7. xarray_spatial-0.9.9/.claude/commands/sweep-api-consistency.md +256 -0
  8. xarray_spatial-0.9.9/.claude/commands/sweep-metadata.md +297 -0
  9. xarray_spatial-0.9.9/.claude/commands/sweep-performance.md +327 -0
  10. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/sweep-security.md +70 -29
  11. xarray_spatial-0.9.9/.claude/commands/sweep-test-coverage.md +255 -0
  12. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/validate.md +1 -1
  13. xarray_spatial-0.9.9/.claude/sweep-accuracy-state.csv +36 -0
  14. xarray_spatial-0.9.9/.claude/sweep-api-consistency-state.csv +1 -0
  15. xarray_spatial-0.9.9/.claude/sweep-metadata-state.csv +1 -0
  16. xarray_spatial-0.9.9/.claude/sweep-performance-state.csv +47 -0
  17. xarray_spatial-0.9.9/.claude/sweep-security-state.csv +50 -0
  18. xarray_spatial-0.9.9/.claude/sweep-test-coverage-state.csv +1 -0
  19. xarray_spatial-0.9.9/.gitattributes +4 -0
  20. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/benchmarks.yml +3 -3
  21. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/test.yml +3 -3
  22. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/CHANGELOG.md +117 -0
  23. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/CONTRIBUTING.md +3 -3
  24. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/PKG-INFO +3 -3
  25. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/README.md +2 -2
  26. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/RELEASE.md +1 -1
  27. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/PKG-INFO +3 -3
  28. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/SOURCES.txt +22 -3
  29. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/_version.py +3 -3
  30. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/aspect.py +4 -0
  31. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/bilateral.py +12 -4
  32. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/convolution.py +7 -3
  33. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/cost_distance.py +98 -5
  34. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/curvature.py +8 -0
  35. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/dasymetric.py +92 -0
  36. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/diffusion.py +170 -29
  37. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/edge_detection.py +6 -0
  38. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/emerging_hotspots.py +58 -0
  39. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/erosion.py +97 -23
  40. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/experimental/min_observable_height.py +39 -0
  41. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/flood.py +21 -0
  42. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/focal.py +53 -0
  43. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geodesic.py +49 -0
  44. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/__init__.py +317 -31
  45. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_geotags.py +94 -19
  46. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_gpu_decode.py +53 -0
  47. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_reader.py +172 -38
  48. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_writer.py +167 -75
  49. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_cog_http_concurrent.py +180 -0
  50. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_edge_cases.py +5 -1
  51. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_georef_edges.py +157 -0
  52. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_geotags.py +255 -0
  53. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_header.py +299 -0
  54. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_metadata_round_trip_1484.py +418 -0
  55. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_polish_1488.py +339 -0
  56. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_predictor_fp_write_1313.py +203 -0
  57. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_predictor_multisample.py +50 -0
  58. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_reader.py +68 -0
  59. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_streaming_write.py +71 -0
  60. xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_writer_matrix.py +253 -0
  61. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/glcm.py +30 -9
  62. xarray_spatial-0.9.9/xrspatial/gpu_rtx/_memory.py +60 -0
  63. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/hillshade.py +4 -0
  64. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/mesh_utils.py +29 -3
  65. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/viewshed.py +4 -0
  66. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/basin_d8.py +89 -0
  67. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/fill_d8.py +94 -0
  68. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_accumulation_d8.py +89 -0
  69. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_accumulation_dinf.py +92 -0
  70. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_accumulation_mfd.py +91 -0
  71. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_direction_d8.py +8 -0
  72. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_direction_dinf.py +8 -0
  73. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_direction_mfd.py +73 -2
  74. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_length_d8.py +98 -0
  75. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_length_dinf.py +99 -0
  76. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_length_mfd.py +102 -0
  77. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_path_d8.py +90 -0
  78. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_path_dinf.py +93 -0
  79. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_path_mfd.py +89 -0
  80. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/hand_d8.py +99 -0
  81. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/hand_dinf.py +100 -0
  82. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/hand_mfd.py +142 -29
  83. xarray_spatial-0.9.9/xrspatial/hydro/sink_d8.py +513 -0
  84. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/snap_pour_point_d8.py +96 -0
  85. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_link_d8.py +94 -0
  86. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_link_dinf.py +98 -0
  87. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_link_mfd.py +96 -0
  88. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_order_d8.py +97 -0
  89. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_order_dinf.py +102 -0
  90. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_order_mfd.py +101 -0
  91. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_basin_d8.py +73 -0
  92. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_fill_d8.py +73 -0
  93. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_accumulation_d8.py +58 -0
  94. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_accumulation_dinf.py +58 -0
  95. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_accumulation_mfd.py +57 -0
  96. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_direction_mfd.py +55 -2
  97. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_length_d8.py +69 -0
  98. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_length_dinf.py +75 -0
  99. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_length_mfd.py +74 -0
  100. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_path_d8.py +79 -0
  101. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_path_dinf.py +88 -0
  102. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_path_mfd.py +90 -0
  103. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_hand_d8.py +84 -0
  104. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_hand_dinf.py +88 -0
  105. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_hand_mfd.py +139 -0
  106. xarray_spatial-0.9.9/xrspatial/hydro/tests/test_sink_d8.py +415 -0
  107. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_snap_pour_point_d8.py +84 -0
  108. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_link_d8.py +77 -0
  109. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_link_dinf.py +77 -0
  110. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_link_mfd.py +94 -0
  111. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_order_d8.py +77 -0
  112. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_order_dinf.py +80 -0
  113. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_order_mfd.py +92 -0
  114. xarray_spatial-0.9.9/xrspatial/hydro/tests/test_validate_cellsize.py +113 -0
  115. xarray_spatial-0.9.9/xrspatial/hydro/tests/test_validate_scalar_params.py +124 -0
  116. xarray_spatial-0.9.9/xrspatial/hydro/tests/test_validate_secondary_args.py +137 -0
  117. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_watershed_d8.py +88 -0
  118. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_watershed_dinf.py +84 -0
  119. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_watershed_mfd.py +88 -0
  120. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/twi_d8.py +8 -0
  121. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/watershed_d8.py +90 -0
  122. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/watershed_dinf.py +92 -0
  123. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/watershed_mfd.py +91 -0
  124. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_idw.py +50 -0
  125. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_kriging.py +74 -0
  126. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_spline.py +67 -0
  127. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/kde.py +52 -0
  128. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mahalanobis.py +119 -2
  129. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/combine.py +155 -2
  130. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/sensitivity.py +6 -1
  131. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/weights.py +15 -3
  132. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/morphology.py +92 -38
  133. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/multispectral.py +89 -1
  134. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/pathfinding.py +25 -4
  135. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/polygonize.py +10 -2
  136. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/rasterize.py +9 -5
  137. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/__init__.py +321 -73
  138. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_crs_utils.py +13 -2
  139. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_grid.py +84 -0
  140. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_itrf.py +20 -0
  141. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_vertical.py +18 -0
  142. xarray_spatial-0.9.9/xrspatial/resample.py +1410 -0
  143. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/sieve.py +89 -18
  144. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/sky_view_factor.py +152 -15
  145. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/slope.py +4 -0
  146. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/surface_distance.py +94 -0
  147. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/terrain.py +72 -0
  148. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/terrain_metrics.py +51 -0
  149. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_bilateral.py +46 -0
  150. xarray_spatial-0.9.9/xrspatial/tests/test_convolution.py +38 -0
  151. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_cost_distance.py +153 -0
  152. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_curvature.py +12 -0
  153. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dasymetric.py +128 -0
  154. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_diffusion.py +177 -0
  155. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_edge_detection.py +27 -0
  156. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_emerging_hotspots.py +84 -0
  157. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_erosion.py +135 -1
  158. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_flood.py +68 -0
  159. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_focal.py +37 -0
  160. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_geodesic_aspect.py +35 -0
  161. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_geodesic_slope.py +41 -0
  162. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_glcm.py +88 -16
  163. xarray_spatial-0.9.9/xrspatial/tests/test_gpu_rtx_memory.py +175 -0
  164. xarray_spatial-0.9.9/xrspatial/tests/test_gpu_rtx_mesh.py +120 -0
  165. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_interpolation.py +231 -0
  166. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_kde.py +38 -0
  167. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_mahalanobis.py +123 -0
  168. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_mcda.py +247 -7
  169. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_min_observable_height.py +56 -0
  170. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_morphology.py +173 -0
  171. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_multispectral.py +122 -0
  172. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_pathfinding.py +52 -0
  173. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_polygonize.py +46 -0
  174. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_rasterize.py +85 -0
  175. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_reproject.py +1238 -1
  176. xarray_spatial-0.9.9/xrspatial/tests/test_resample.py +1275 -0
  177. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_sieve.py +30 -0
  178. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_sky_view_factor.py +207 -2
  179. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_surface_distance.py +119 -0
  180. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_terrain.py +48 -0
  181. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_terrain_metrics.py +17 -0
  182. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_utils.py +83 -0
  183. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/utils.py +35 -6
  184. xarray_spatial-0.9.7/.claude/commands/sweep-performance.md +0 -502
  185. xarray_spatial-0.9.7/.claude/sweep-accuracy-state.json +0 -22
  186. xarray_spatial-0.9.7/.claude/sweep-performance-state.json +0 -50
  187. xarray_spatial-0.9.7/.claude/sweep-security-state.json +0 -108
  188. xarray_spatial-0.9.7/.gitattributes +0 -2
  189. xarray_spatial-0.9.7/xrspatial/geotiff/tests/test_geotags.py +0 -109
  190. xarray_spatial-0.9.7/xrspatial/geotiff/tests/test_header.py +0 -123
  191. xarray_spatial-0.9.7/xrspatial/hydro/sink_d8.py +0 -276
  192. xarray_spatial-0.9.7/xrspatial/hydro/tests/test_sink_d8.py +0 -177
  193. xarray_spatial-0.9.7/xrspatial/resample.py +0 -791
  194. xarray_spatial-0.9.7/xrspatial/tests/test_resample.py +0 -380
  195. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/backend-parity.md +0 -0
  196. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/dask-notebook.md +0 -0
  197. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/new-issues.md +0 -0
  198. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/review-pr.md +0 -0
  199. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/rockout.md +0 -0
  200. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/user-guide-notebook.md +0 -0
  201. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.efficiency-audit-baseline.json +0 -0
  202. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.efficiency-audit-baseline.prev.json +0 -0
  203. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  204. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/ISSUE_TEMPLATE/feature-proposal.md +0 -0
  205. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/labeler.yml +0 -0
  206. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/pull_request_template.md +0 -0
  207. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/labeler.yml +0 -0
  208. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/pypi-publish.yml +0 -0
  209. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.gitignore +0 -0
  210. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.readthedocs.yml +0 -0
  211. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/CODE_OF_CONDUCT.md +0 -0
  212. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/Citation-styles.md +0 -0
  213. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/LICENSE.txt +0 -0
  214. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/MANIFEST.in +0 -0
  215. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/codecov.yml +0 -0
  216. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/pyproject.toml +0 -0
  217. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/setup.cfg +0 -0
  218. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/setup.py +0 -0
  219. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/dependency_links.txt +0 -0
  220. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/entry_points.txt +0 -0
  221. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/not-zip-safe +0 -0
  222. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/requires.txt +0 -0
  223. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/top_level.txt +0 -0
  224. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/__init__.py +0 -0
  225. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/__main__.py +0 -0
  226. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/accessor.py +0 -0
  227. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/analytics.py +0 -0
  228. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/balanced_allocation.py +0 -0
  229. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/bump.py +0 -0
  230. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/classify.py +0 -0
  231. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/contour.py +0 -0
  232. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/corridor.py +0 -0
  233. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/dataset_support.py +0 -0
  234. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/__init__.py +0 -0
  235. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/blue_band.nc +0 -0
  236. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/green_band.nc +0 -0
  237. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/nir_band.nc +0 -0
  238. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/red_band.nc +0 -0
  239. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/swir1_band.nc +0 -0
  240. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/swir2_band.nc +0 -0
  241. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/diagnostics.py +0 -0
  242. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/experimental/__init__.py +0 -0
  243. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/fire.py +0 -0
  244. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_compression.py +0 -0
  245. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_dtypes.py +0 -0
  246. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_header.py +0 -0
  247. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_vrt.py +0 -0
  248. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/__init__.py +0 -0
  249. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/bench_vs_rioxarray.py +0 -0
  250. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/conftest.py +0 -0
  251. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_accessor_io.py +0 -0
  252. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_accuracy_1081.py +0 -0
  253. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_cog.py +0 -0
  254. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_compression.py +0 -0
  255. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_compression_level.py +0 -0
  256. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_dtype_read.py +0 -0
  257. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_features.py +0 -0
  258. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_jpeg.py +0 -0
  259. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_jpeg2000.py +0 -0
  260. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_lerc.py +0 -0
  261. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_lz4.py +0 -0
  262. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_security.py +0 -0
  263. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_vrt_write.py +0 -0
  264. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_writer.py +0 -0
  265. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/__init__.py +0 -0
  266. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/cuda_utils.py +0 -0
  267. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hillshade.py +0 -0
  268. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/__init__.py +0 -0
  269. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/_boundary_store.py +0 -0
  270. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/__init__.py +0 -0
  271. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/conftest.py +0 -0
  272. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_direction_d8.py +0 -0
  273. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_direction_dinf.py +0 -0
  274. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_twi_d8.py +0 -0
  275. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/__init__.py +0 -0
  276. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_validation.py +0 -0
  277. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/__init__.py +0 -0
  278. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/constrain.py +0 -0
  279. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/standardize.py +0 -0
  280. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/normalize.py +0 -0
  281. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/perlin.py +0 -0
  282. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/polygon_clip.py +0 -0
  283. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/preview.py +0 -0
  284. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/proximity.py +0 -0
  285. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_datum_grids.py +0 -0
  286. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_interpolate.py +0 -0
  287. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_lite_crs.py +0 -0
  288. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_merge.py +0 -0
  289. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_projections.py +0 -0
  290. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_projections_cuda.py +0 -0
  291. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_transform.py +0 -0
  292. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/at_bev_AT_GIS_GRID.tif +0 -0
  293. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/au_icsm_A66_National_13_09_01.tif +0 -0
  294. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/be_ign_bd72lb72_etrs89lb08.tif +0 -0
  295. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/ch_swisstopo_CHENyx06_ETRS.tif +0 -0
  296. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/de_adv_BETA2007.tif +0 -0
  297. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/es_ign_SPED2ETV2.tif +0 -0
  298. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/nl_nsgi_rdcorr2018.tif +0 -0
  299. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/pt_dgt_D73_ETRS89_geo.tif +0 -0
  300. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/uk_os_OSTN15_NTv2_OSGBtoETRS.tif +0 -0
  301. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_nga_egm96_15.tif +0 -0
  302. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_alaska.tif +0 -0
  303. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_conus.tif +0 -0
  304. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_hawaii.tif +0 -0
  305. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_nadcon5_nad27_nad83_1986_conus.tif +0 -0
  306. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_prvi.tif +0 -0
  307. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/__init__.py +0 -0
  308. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/bench_reproject_vs_rioxarray.py +0 -0
  309. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/conftest.py +0 -0
  310. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/general_checks.py +0 -0
  311. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_accessor.py +0 -0
  312. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_analytics.py +0 -0
  313. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_aspect.py +0 -0
  314. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_balanced_allocation.py +0 -0
  315. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_bump.py +0 -0
  316. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_classify.py +0 -0
  317. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_contour.py +0 -0
  318. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_corridor.py +0 -0
  319. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dask_cupy_gaps.py +0 -0
  320. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dask_laziness.py +0 -0
  321. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dataset_support.py +0 -0
  322. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_datasets.py +0 -0
  323. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_diagnostics.py +0 -0
  324. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_fire.py +0 -0
  325. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_fused_overlap.py +0 -0
  326. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_glcm_metric_order.py +0 -0
  327. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_hillshade.py +0 -0
  328. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_hypsometric_integral.py +0 -0
  329. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_lite_crs.py +0 -0
  330. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_morphology_derived.py +0 -0
  331. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_multi_overlap.py +0 -0
  332. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_normalize.py +0 -0
  333. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_northness_eastness.py +0 -0
  334. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_perlin.py +0 -0
  335. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_polygon_clip.py +0 -0
  336. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_preview.py +0 -0
  337. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_proximity.py +0 -0
  338. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_rasterize_accuracy.py +0 -0
  339. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_rechunk_no_shuffle.py +0 -0
  340. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_sieve_gdal_parity.py +0 -0
  341. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_slope.py +0 -0
  342. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_validation.py +0 -0
  343. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_viewshed.py +0 -0
  344. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_visibility.py +0 -0
  345. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_zonal.py +0 -0
  346. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/viewshed.py +0 -0
  347. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/visibility.py +0 -0
  348. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/worley.py +0 -0
  349. {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/zonal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  # Bench: Local Performance Comparison
2
2
 
3
- Run ASV benchmarks for the current branch against master and report regressions
3
+ Run ASV benchmarks for the current branch against main and report regressions
4
4
  and improvements. The prompt is: $ARGUMENTS
5
5
 
6
6
  ---
@@ -9,7 +9,7 @@ and improvements. The prompt is: $ARGUMENTS
9
9
 
10
10
  1. If $ARGUMENTS names specific benchmark classes or functions (e.g. `Slope`,
11
11
  `flow_accumulation`), use those directly.
12
- 2. If $ARGUMENTS is empty or says "auto", run `git diff origin/master --name-only`
12
+ 2. If $ARGUMENTS is empty or says "auto", run `git diff origin/main --name-only`
13
13
  to find changed source files under `xrspatial/`. Map each changed file to the
14
14
  corresponding benchmark module in `benchmarks/benchmarks/`. Use the filename
15
15
  and imports to match (e.g. changes to `slope.py` map to `benchmarks/benchmarks/slope.py`).
@@ -30,7 +30,7 @@ and improvements. The prompt is: $ARGUMENTS
30
30
  Run ASV in continuous-comparison mode from the `benchmarks/` directory:
31
31
 
32
32
  ```bash
33
- cd benchmarks && asv continuous origin/master HEAD -b "<regex>" -e
33
+ cd benchmarks && asv continuous origin/main HEAD -b "<regex>" -e
34
34
  ```
35
35
 
36
36
  Where `<regex>` is a pattern matching the benchmark classes identified in Step 1
@@ -64,7 +64,7 @@ Parse the output and classify each result:
64
64
  ## Step 5 -- Generate the report
65
65
 
66
66
  ```
67
- ## Benchmark Report: <branch> vs master
67
+ ## Benchmark Report: <branch> vs main
68
68
 
69
69
  ### Changed files
70
70
  - <list of changed source files>
@@ -74,7 +74,7 @@ Parse the output and classify each result:
74
74
 
75
75
  ### Results
76
76
 
77
- | Benchmark | master | HEAD | Ratio | Status |
77
+ | Benchmark | main | HEAD | Ratio | Status |
78
78
  |------------------------------------|-----------|-----------|-------|------------|
79
79
  | slope.Slope.time_numpy | 3.45 ms | 3.51 ms | 1.02x | UNCHANGED |
80
80
  | slope.Slope.time_dask_numpy | 8.12 ms | 4.23 ms | 0.52x | IMPROVED |
@@ -124,4 +124,4 @@ Do NOT write benchmark files automatically. Report the gap and propose, then wai
124
124
  analysis (unless the user explicitly asks for a benchmark to be written in
125
125
  response to Step 6).
126
126
  - If $ARGUMENTS says "compare <branch1> <branch2>", run
127
- `asv continuous <branch1> <branch2>` instead of the default origin/master vs HEAD.
127
+ `asv continuous <branch1> <branch2>` instead of the default origin/main vs HEAD.
@@ -267,7 +267,7 @@ Thresholds: IMPROVED < 0.8x, REGRESSION > 1.2x, else UNCHANGED.
267
267
  - If $ARGUMENTS includes a severity filter (e.g. "high only"), only report
268
268
  findings at that severity level.
269
269
  - If $ARGUMENTS includes "diff" or "changed", restrict the audit to files
270
- changed on the current branch vs origin/master.
270
+ changed on the current branch vs origin/main.
271
271
  - Baseline benchmark scripts are disposable. Clean up `/tmp/` scripts after
272
272
  capturing results.
273
273
  - The 512x512 array size is a default. If $ARGUMENTS includes a size like
@@ -16,7 +16,7 @@ $ARGUMENTS
16
16
  ## Step 2 -- Create a release branch
17
17
 
18
18
  ```bash
19
- git checkout master && git pull
19
+ git checkout main && git pull
20
20
  git checkout -b release/vX.Y.Z
21
21
  ```
22
22
 
@@ -49,7 +49,7 @@ git push -u origin release/vX.Y.Z
49
49
 
50
50
  ## Step 5 -- Verify CI
51
51
 
52
- 1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z major release."` to open a PR against master.
52
+ 1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z major release."` to open a PR against main.
53
53
  2. Wait for CI:
54
54
  ```bash
55
55
  gh pr checks <PR_NUMBER> --watch
@@ -65,7 +65,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
65
65
  ## Step 7 -- Tag the release
66
66
 
67
67
  ```bash
68
- git checkout master && git pull
68
+ git checkout main && git pull
69
69
  git tag -a vX.Y.Z -m "Version X.Y.Z"
70
70
  git push origin vX.Y.Z
71
71
  ```
@@ -16,7 +16,7 @@ $ARGUMENTS
16
16
  ## Step 2 -- Create a release branch
17
17
 
18
18
  ```bash
19
- git checkout master && git pull
19
+ git checkout main && git pull
20
20
  git checkout -b release/vX.Y.Z
21
21
  ```
22
22
 
@@ -49,7 +49,7 @@ git push -u origin release/vX.Y.Z
49
49
 
50
50
  ## Step 5 -- Verify CI
51
51
 
52
- 1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z minor release."` to open a PR against master.
52
+ 1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z minor release."` to open a PR against main.
53
53
  2. Wait for CI:
54
54
  ```bash
55
55
  gh pr checks <PR_NUMBER> --watch
@@ -65,7 +65,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
65
65
  ## Step 7 -- Tag the release
66
66
 
67
67
  ```bash
68
- git checkout master && git pull
68
+ git checkout main && git pull
69
69
  git tag -a vX.Y.Z -m "Version X.Y.Z"
70
70
  git push origin vX.Y.Z
71
71
  ```
@@ -16,7 +16,7 @@ $ARGUMENTS
16
16
  ## Step 2 -- Create a release branch
17
17
 
18
18
  ```bash
19
- git checkout master && git pull
19
+ git checkout main && git pull
20
20
  git checkout -b release/vX.Y.Z
21
21
  ```
22
22
 
@@ -46,7 +46,7 @@ git push -u origin release/vX.Y.Z
46
46
 
47
47
  ## Step 5 -- Verify CI
48
48
 
49
- 1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z patch release."` to open a PR against master.
49
+ 1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z patch release."` to open a PR against main.
50
50
  2. Wait for CI:
51
51
  ```bash
52
52
  gh pr checks <PR_NUMBER> --watch
@@ -62,7 +62,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
62
62
  ## Step 7 -- Tag the release
63
63
 
64
64
  ```bash
65
- git checkout master && git pull
65
+ git checkout main && git pull
66
66
  git tag -a vX.Y.Z -m "Version X.Y.Z"
67
67
  git push origin vX.Y.Z
68
68
  ```
@@ -36,28 +36,30 @@ Store results in memory -- do NOT write intermediate files.
36
36
 
37
37
  ## Step 2 -- Load inspection state
38
38
 
39
- Read `.claude/sweep-accuracy-state.json`.
39
+ Read `.claude/sweep-accuracy-state.csv`.
40
40
 
41
41
  If it does not exist, treat every module as never-inspected.
42
42
 
43
43
  If `$ARGUMENTS` contains `--reset-state`, delete the file and treat
44
44
  everything as never-inspected.
45
45
 
46
- State file schema:
47
-
48
- ```json
49
- {
50
- "inspections": {
51
- "slope": {
52
- "last_inspected": "2026-03-28T14:00:00Z",
53
- "issue": 1042,
54
- "severity_max": "HIGH",
55
- "categories_found": [1, 3]
56
- }
57
- }
58
- }
46
+ State file schema (one row per module):
47
+
48
+ ```
49
+ module,last_inspected,issue,severity_max,categories_found,notes
50
+ slope,2026-03-28,1042,HIGH,1;3,"optional single-line notes"
59
51
  ```
60
52
 
53
+ - `categories_found` is a semicolon-separated integer list (empty when null).
54
+ - `notes` is CSV-quoted; newlines must be flattened to spaces on write so
55
+ every module stays exactly one line.
56
+
57
+ The file is registered with `merge=union` in `.gitattributes`, so two
58
+ parallel sweeps touching different modules auto-merge without conflict.
59
+ A transient duplicate-row state can occur after a merge if both branches
60
+ modified the same module; the read-update-write cycle in step 5 keys rows
61
+ by `module` and last-write-wins, so the next write cleans up.
62
+
61
63
  ## Step 3 -- Score each module
62
64
 
63
65
  ```
@@ -191,19 +193,54 @@ xrspatial/tests/general_checks.py for the cross-backend comparison helpers.
191
193
  3. For each real issue found, assign a severity (CRITICAL/HIGH/MEDIUM/LOW)
192
194
  and note the exact file and line number.
193
195
 
194
- 4. If any CRITICAL or HIGH issue is found, run /rockout to fix it end-to-end
195
- (GitHub issue, worktree branch, fix, tests, and PR).
196
- For MEDIUM/LOW issues, document them but do not fix.
196
+ 4. If any CRITICAL, HIGH, or MEDIUM issue is found, run /rockout to fix it
197
+ end-to-end (GitHub issue, worktree branch, fix, tests, and PR).
198
+ For LOW issues, document them but do not fix.
197
199
 
198
200
  5. After finishing (whether you found issues or not), update the inspection
199
- state file .claude/sweep-accuracy-state.json by reading its current
200
- contents and adding/updating the entry for "{module}" with:
201
- - "last_inspected": today's ISO date
202
- - "issue": the issue number from rockout (or null if clean / MEDIUM-only)
203
- - "severity_max": highest severity found (or null if clean)
204
- - "categories_found": list of category numbers that had findings (e.g. [1, 3])
205
-
206
- Then `git add .claude/sweep-accuracy-state.json` and commit it to the
201
+ state file .claude/sweep-accuracy-state.csv. The file is row-per-module
202
+ CSV with header:
203
+
204
+ `module,last_inspected,issue,severity_max,categories_found,notes`
205
+
206
+ Use this Python pattern to read, update, and write it (do NOT hand-edit
207
+ the file -- always go through csv.DictReader / csv.DictWriter so quoting
208
+ stays consistent):
209
+
210
+ ```python
211
+ import csv
212
+ from pathlib import Path
213
+
214
+ path = Path(".claude/sweep-accuracy-state.csv")
215
+ header = ["module", "last_inspected", "issue", "severity_max",
216
+ "categories_found", "notes"]
217
+
218
+ rows = {}
219
+ if path.exists():
220
+ with path.open() as f:
221
+ for r in csv.DictReader(f):
222
+ rows[r["module"]] = r # last write wins on dupes
223
+
224
+ rows["{module}"] = {
225
+ "module": "{module}",
226
+ "last_inspected": "<today's ISO date, e.g. 2026-04-27>",
227
+ "issue": "<issue number from rockout, or empty string>",
228
+ "severity_max": "<HIGH|MEDIUM|LOW, or empty>",
229
+ "categories_found": "<semicolon-joined ints, e.g. 1;3, or empty>",
230
+ "notes": "<single-line notes (replace any newlines with spaces), or empty>",
231
+ }
232
+
233
+ with path.open("w", newline="") as f:
234
+ w = csv.DictWriter(f, fieldnames=header, quoting=csv.QUOTE_MINIMAL)
235
+ w.writeheader()
236
+ for m in sorted(rows):
237
+ w.writerow(rows[m])
238
+ ```
239
+
240
+ Use empty strings (not `null`) for missing values. Set `issue` to the
241
+ issue number when one was filed, otherwise leave it empty.
242
+
243
+ Then `git add .claude/sweep-accuracy-state.csv` and commit it to the
207
244
  worktree branch so the state update is included in the PR.
208
245
 
209
246
  Important:
@@ -236,7 +273,7 @@ State is updated by the subagents themselves (see agent prompt step 5).
236
273
  After completion, verify state with:
237
274
 
238
275
  ```
239
- cat .claude/sweep-accuracy-state.json
276
+ column -t -s, .claude/sweep-accuracy-state.csv | less
240
277
  ```
241
278
 
242
279
  To reset all tracking: `/sweep-accuracy --reset-state`
@@ -248,8 +285,10 @@ To reset all tracking: `/sweep-accuracy --reset-state`
248
285
  - Do NOT modify any source files directly. Subagents handle fixes via /rockout.
249
286
  - Keep the output concise -- the table and agent dispatch are the deliverables.
250
287
  - If $ARGUMENTS is empty, use defaults: top 3, no category filter, no exclusions.
251
- - State file (`.claude/sweep-accuracy-state.json`) is tracked in git.
252
- Subagents must `git add` and commit it so the state update lands in the PR.
288
+ - State file (`.claude/sweep-accuracy-state.csv`) is tracked in git, with
289
+ `merge=union` set in `.gitattributes` so parallel sweeps touching
290
+ different modules auto-merge. Subagents must `git add` and commit it so
291
+ the state update lands in the PR.
253
292
  - For subpackage modules (geotiff, reproject, hydro), the subagent should read
254
293
  ALL `.py` files in the subpackage directory, not just `__init__.py`.
255
294
  - Only flag patterns that are ACTUALLY present in the code. Do not report
@@ -0,0 +1,256 @@
1
+ # API Consistency Sweep: Dispatch subagents to audit parameter naming and signature drift
2
+
3
+ Audit xrspatial modules for API consistency issues across analogous public
4
+ functions: parameter naming drift (`cellsize` vs `cell_size` vs `res`,
5
+ `agg` vs `raster` vs `data`), inconsistent return-type shapes, missing or
6
+ mismatched type hints, docstring/signature divergence. Cheap to find; makes
7
+ the library feel polished and predictable. Subagents fix CRITICAL, HIGH,
8
+ and MEDIUM findings via /rockout — but flag deprecation impact in the
9
+ issue since renames are breaking changes.
10
+
11
+ Optional arguments: $ARGUMENTS
12
+ (e.g. `--top 3`, `--exclude slope,aspect`, `--only-terrain`, `--reset-state`)
13
+
14
+ ---
15
+
16
+ ## Step 1 -- Gather module metadata via git
17
+
18
+ Enumerate candidate modules:
19
+
20
+ **Single-file modules:** Every `.py` file directly under `xrspatial/`, excluding
21
+ `__init__.py`, `_version.py`, `__main__.py`, `utils.py`, `accessor.py`,
22
+ `preview.py`, `dataset_support.py`, `diagnostics.py`, `analytics.py`.
23
+
24
+ **Subpackage modules:** `geotiff/`, `reproject/`, and `hydro/` directories under
25
+ `xrspatial/`. Treat each as a single audit unit.
26
+
27
+ For every module, collect:
28
+
29
+ | Field | How |
30
+ |-------|-----|
31
+ | **last_modified** | `git log -1 --format=%aI -- <path>` |
32
+ | **total_commits** | `git log --oneline -- <path> \| wc -l` |
33
+ | **loc** | `wc -l < <path>` |
34
+ | **public_funcs** | count of functions at module level (heuristic: `^def [a-z]`) |
35
+
36
+ Store results in memory -- do NOT write intermediate files.
37
+
38
+ ## Step 2 -- Load inspection state
39
+
40
+ Read `.claude/sweep-api-consistency-state.csv`.
41
+
42
+ If it does not exist, treat every module as never-inspected. If
43
+ `$ARGUMENTS` contains `--reset-state`, delete the file first.
44
+
45
+ State file schema (one row per module):
46
+
47
+ ```
48
+ module,last_inspected,issue,severity_max,categories_found,notes
49
+ slope,2026-05-01,1042,HIGH,1;3,"optional single-line notes"
50
+ ```
51
+
52
+ The file is registered with `merge=union` in `.gitattributes`.
53
+
54
+ ## Step 3 -- Score each module
55
+
56
+ ```
57
+ days_since_inspected = (today - last_inspected).days # 9999 if never
58
+ days_since_modified = (today - last_modified).days
59
+
60
+ score = (days_since_inspected * 3)
61
+ + (public_funcs * 8)
62
+ + (total_commits * 0.3)
63
+ - (days_since_modified * 0.1)
64
+ + (loc * 0.03)
65
+ ```
66
+
67
+ Rationale:
68
+ - Public function count weighted heavily — consistency issues are
69
+ cross-function comparisons, so more functions = more comparison surface
70
+ - Modules never inspected dominate
71
+ - Recently modified slightly deprioritized
72
+
73
+ ## Step 4 -- Apply filters from $ARGUMENTS
74
+
75
+ Same filter set as other sweeps: `--top N`, `--exclude`, `--only-terrain`,
76
+ `--only-focal`, `--only-hydro`, `--only-io`, `--reset-state`.
77
+
78
+ ## Step 5 -- Print the ranked table and launch subagents
79
+
80
+ ### 5a. Print the ranked table
81
+
82
+ Print a markdown table showing ALL scored modules sorted by score descending.
83
+
84
+ ### 5b. Launch subagents for the top N modules
85
+
86
+ For each of the top N modules (default 3), launch an Agent in parallel using
87
+ `isolation: "worktree"` and `mode: "auto"`. All N agents must be dispatched
88
+ in a single message so they run concurrently.
89
+
90
+ Each agent's prompt must be self-contained:
91
+
92
+ ```
93
+ You are auditing the xrspatial module "{module}" for API consistency issues.
94
+
95
+ This module has {commits} commits and {loc} lines of code.
96
+
97
+ Read these files: {module_files}
98
+
99
+ Also read xrspatial/__init__.py to see what is publicly re-exported, and
100
+ xrspatial/utils.py for shared helpers.
101
+
102
+ For comparison, read 2-3 sibling modules (analogous functions). Examples:
103
+ - For aspect: also read slope.py and curvature.py
104
+ - For erosion: also read morphology.py
105
+ - For glcm: also read focal.py and convolution.py
106
+ The point is to compare parameter naming and return shapes against
107
+ modules with similar function families.
108
+
109
+ **Your task:**
110
+
111
+ 1. Read all listed files thoroughly. For each public function, build a
112
+ small mental table of (function name, signature, return type).
113
+
114
+ 2. Audit for these 5 API-consistency categories. Only flag issues ACTUALLY
115
+ present.
116
+
117
+ **Cat 1 — Parameter naming drift**
118
+ - HIGH: same concept named differently across analogous public
119
+ functions in this module or in sibling modules. Common offenders:
120
+ `cellsize` vs `cell_size` vs `res` vs `resolution`
121
+ `agg` vs `raster` vs `data` vs `array`
122
+ `x` vs `xs` vs `x_coords`
123
+ `nodata` vs `_FillValue` vs `nodata_value`
124
+ `cmap` vs `color_map` vs `colormap`
125
+ `kernel` vs `weights` vs `mask`
126
+ - MEDIUM: same concept named consistently inside this module but
127
+ different from sibling modules
128
+ - MEDIUM: positional-vs-keyword convention drift (sibling functions
129
+ accept the same arg, one as positional, one as keyword-only)
130
+ Severity: HIGH if both names exist in the public API at the same time
131
+ (real user-facing inconsistency); MEDIUM otherwise
132
+
133
+ **Cat 2 — Return shape drift**
134
+ - HIGH: analogous functions return different types (one returns
135
+ DataArray, sibling returns Dataset for the same conceptual op)
136
+ - HIGH: tuple-return vs single-return drift (one function returns
137
+ `(slope, aspect)`, analog returns `slope` only — caller cannot
138
+ interchange)
139
+ - MEDIUM: result coord/attr conventions differ (one function emits
140
+ `attrs['units']`, sibling does not)
141
+ - MEDIUM: in-place vs returned-copy semantics drift
142
+ Severity: HIGH if it breaks substitutability between sibling functions
143
+
144
+ **Cat 3 — Type hints and docstrings**
145
+ - MEDIUM: missing type hints on a public function while sibling
146
+ functions in this module have them
147
+ - MEDIUM: type hint says `xr.DataArray` but the docstring example
148
+ passes a numpy array (or vice versa) — docs/types disagree
149
+ - MEDIUM: docstring lists a parameter that does not exist in the
150
+ signature (or omits one that does)
151
+ - MEDIUM: docstring says "Returns: DataArray" but the function returns
152
+ a tuple
153
+ - LOW: docstring style drift (numpy-style vs google-style mix)
154
+ Severity: MEDIUM (these are documentation bugs that mislead users)
155
+
156
+ **Cat 4 — Default value inconsistency**
157
+ - HIGH: same parameter has different defaults in analogous functions
158
+ (e.g. `kernel_size=3` in one function, `kernel_size=5` in sibling,
159
+ no documented reason)
160
+ - MEDIUM: default uses a mutable type (`def f(x=[])`) — Python anti-pattern
161
+ - MEDIUM: default `None` plus internal substitution where a literal
162
+ default would be clearer and equally correct
163
+ Severity: HIGH if user-surprise is likely (silent behavior change
164
+ when switching between sibling functions)
165
+
166
+ **Cat 5 — Public API surface drift**
167
+ - HIGH: function is called by tests and notebooks but is not in
168
+ `xrspatial/__init__.py` or in the module's `__all__` (orphan API)
169
+ - HIGH: function in `__all__` but undocumented in the docstring
170
+ - MEDIUM: deprecated alias still exported with no `DeprecationWarning`
171
+ - MEDIUM: private-looking name (`_foo`) but is referenced in tests as
172
+ if public
173
+ - LOW: `from .module import *` patterns that bring inconsistent
174
+ symbols into the public namespace
175
+ Severity: HIGH for orphan APIs (users find them, depend on them, then
176
+ break when they vanish)
177
+
178
+ 3. For each real issue, assign severity + file:line.
179
+
180
+ 4. If any CRITICAL, HIGH, or MEDIUM issue is found, run /rockout to fix it.
181
+ IMPORTANT: parameter renames are breaking changes — for HIGH
182
+ parameter-rename fixes, the rockout PR must add a deprecation
183
+ shim (accept both old and new names; emit DeprecationWarning on the
184
+ old name; update docs). Document this in the issue body. For LOW
185
+ issues, document but do not fix.
186
+
187
+ 5. Update .claude/sweep-api-consistency-state.csv using csv.DictReader/Writer:
188
+
189
+ ```python
190
+ import csv
191
+ from pathlib import Path
192
+
193
+ path = Path(".claude/sweep-api-consistency-state.csv")
194
+ header = ["module", "last_inspected", "issue", "severity_max",
195
+ "categories_found", "notes"]
196
+
197
+ rows = {}
198
+ if path.exists():
199
+ with path.open() as f:
200
+ for r in csv.DictReader(f):
201
+ rows[r["module"]] = r
202
+
203
+ rows["{module}"] = {
204
+ "module": "{module}",
205
+ "last_inspected": "<today's ISO date>",
206
+ "issue": "<issue number or empty>",
207
+ "severity_max": "<HIGH|MEDIUM|LOW or empty>",
208
+ "categories_found": "<semicolon-joined ints or empty>",
209
+ "notes": "<single-line notes or empty>",
210
+ }
211
+
212
+ with path.open("w", newline="") as f:
213
+ w = csv.DictWriter(f, fieldnames=header, quoting=csv.QUOTE_MINIMAL)
214
+ w.writeheader()
215
+ for m in sorted(rows):
216
+ w.writerow(rows[m])
217
+ ```
218
+
219
+ Then `git add` and commit.
220
+
221
+ Important:
222
+ - Only flag real consistency issues. The lib has 40+ modules — do not
223
+ list every minor naming difference; focus on user-facing surprise.
224
+ - Compare against 2-3 sibling modules. Cross-cutting concerns (e.g.
225
+ cellsize naming convention) often span the whole library; if a rename
226
+ is safe in one module but breaks 20 others, surface that as a notes
227
+ comment, do not file a per-module issue.
228
+ - For the hydro subpackage: pick one variant (d8) and check whether
229
+ dinf/mfd siblings agree.
230
+ ```
231
+
232
+ ### 5c. Print a status line
233
+
234
+ After dispatching, print:
235
+
236
+ ```
237
+ Launched {N} API consistency audit agents: {module1}, {module2}, {module3}
238
+ ```
239
+
240
+ ## Step 6 -- State updates
241
+
242
+ To reset: `/sweep-api-consistency --reset-state`
243
+
244
+ ---
245
+
246
+ ## General Rules
247
+
248
+ - Do NOT modify any source files directly. Subagents handle fixes.
249
+ - Keep the output concise.
250
+ - If $ARGUMENTS is empty, use defaults: top 3, no category filter, no
251
+ exclusions.
252
+ - State file (`.claude/sweep-api-consistency-state.csv`) is tracked in
253
+ git with `merge=union`.
254
+ - Renames are breaking. The fix path is a deprecation shim, not a
255
+ hard rename, unless the function has a clearly orphan/private status.
256
+ - False positives are worse than missed issues.