PyGeoFetch 2.6.2.9__tar.gz → 2.6.4.0__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 (255) hide show
  1. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/CHANGELOG.md +7 -7
  2. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/LICENSE +0 -0
  3. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/MANIFEST.in +0 -0
  4. {pygeofetch-2.6.2.9/pygeofetch.egg-info → pygeofetch-2.6.4.0}/PKG-INFO +4 -2
  5. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/README.md +2 -2
  6. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/__init__.py +5 -2
  7. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/__init__.py +0 -0
  8. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/auth_commands.py +0 -0
  9. pygeofetch-2.6.4.0/pygeofetch/cli/classify_commands.py +174 -0
  10. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/config_commands.py +0 -0
  11. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/download_commands.py +0 -0
  12. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/index_commands.py +232 -40
  13. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/main.py +108 -0
  14. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/monitor_commands.py +0 -0
  15. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/multisensor_commands.py +0 -0
  16. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/optical_commands.py +92 -16
  17. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/pipeline_process_commands.py +0 -0
  18. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/postprocess_commands.py +72 -0
  19. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/preprocess_commands.py +0 -0
  20. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/sar_commands.py +0 -0
  21. pygeofetch-2.6.4.0/pygeofetch/cli/scale_commands.py +288 -0
  22. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/cli/search_commands.py +1 -1
  23. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/config/__init__.py +0 -0
  24. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/config/defaults.yaml +0 -0
  25. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/config/settings.py +0 -0
  26. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/__init__.py +0 -0
  27. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/authenticator.py +0 -0
  28. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/cache_manager.py +0 -0
  29. pygeofetch-2.6.4.0/pygeofetch/core/chunked_processor.py +324 -0
  30. pygeofetch-2.6.4.0/pygeofetch/core/data_formats/__init__.py +23 -0
  31. pygeofetch-2.6.4.0/pygeofetch/core/data_formats/geoparquet_io.py +216 -0
  32. pygeofetch-2.6.4.0/pygeofetch/core/data_formats/zarr_io.py +250 -0
  33. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/data_organizer.py +5 -1
  34. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/downloader.py +0 -0
  35. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/engine.py +53 -1
  36. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/logging.py +194 -1
  37. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/monitor.py +0 -0
  38. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/orbits.py +60 -11
  39. pygeofetch-2.6.4.0/pygeofetch/core/progress.py +175 -0
  40. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/scheduler.py +0 -0
  41. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/searcher.py +37 -86
  42. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/core/state.py +0 -0
  43. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/geotech/__init__.py +0 -0
  44. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/geotech/risk_mapper.py +0 -0
  45. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/__init__.py +0 -0
  46. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/advanced_safeguards.py +38 -21
  47. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/analysis.py +0 -0
  48. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/annotation.py +25 -4
  49. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/atmosphere.py +0 -0
  50. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/auto_fallback.py +4 -2
  51. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/coregister.py +0 -0
  52. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/deburst.py +0 -0
  53. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/esd.py +0 -0
  54. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/extraction.py +0 -0
  55. pygeofetch-2.6.4.0/pygeofetch/insar/feasibility.py +351 -0
  56. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/flatearth.py +0 -0
  57. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/geolocation.py +0 -0
  58. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/gpu.py +0 -0
  59. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/interferogram.py +0 -0
  60. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/ionosphere.py +0 -0
  61. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/offset_geometry.py +0 -0
  62. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/offset_tracking.py +0 -0
  63. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/preflight.py +272 -59
  64. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/provenance.py +0 -0
  65. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/ps_selection.py +0 -0
  66. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/splitspectrum_diagnostic.py +0 -0
  67. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/stack_selection.py +0 -0
  68. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/synthetic.py +0 -0
  69. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/timeseries.py +0 -0
  70. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/unwrap.py +0 -0
  71. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/validate.py +0 -0
  72. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/visualize.py +0 -0
  73. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/insar/workflow.py +0 -0
  74. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/meta.yaml +1 -1
  75. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/models/__init__.py +0 -0
  76. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/models/download_task.py +3 -0
  77. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/models/satellite_data.py +0 -0
  78. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/models/search_query.py +0 -0
  79. pygeofetch-2.6.4.0/pygeofetch/models/stream_options.py +141 -0
  80. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/models/user_auth.py +0 -0
  81. pygeofetch-2.6.4.0/pygeofetch/multisensor/_init.py +55 -0
  82. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/multisensor/dem_differencing.py +55 -9
  83. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/multisensor/flood_mapping.py +59 -19
  84. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/multisensor/insar_optical_fusion.py +16 -7
  85. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/multisensor/terrain_corrected_change.py +58 -12
  86. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/multisensor/vegetation_disturbance.py +74 -26
  87. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/optical/__init__.py +1 -1
  88. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/optical/offset_tracking.py +1 -1
  89. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/__init__.py +0 -0
  90. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/base.py +117 -3
  91. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/batch.py +0 -0
  92. pygeofetch-2.6.4.0/pygeofetch/processing/classification.py +412 -0
  93. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/indices.py +154 -28
  94. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/pipeline.py +0 -0
  95. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/postprocessor.py +227 -0
  96. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/preprocessor.py +9 -2
  97. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/sar.py +0 -0
  98. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processing/uq_exporter.py +0 -0
  99. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processor/__init__.py +0 -0
  100. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processor/indices.py +1 -1
  101. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processor/landsat.py +0 -0
  102. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processor/loader.py +0 -0
  103. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processor/stacker.py +0 -0
  104. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/processor/timeseries.py +0 -0
  105. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/__init__.py +1 -1
  106. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/airbus_oneatlas.py +0 -0
  107. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/alaska_satellite_facility.py +9 -7
  108. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/aws_earth.py +12 -0
  109. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/base.py +21 -0
  110. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/copernicus.py +0 -0
  111. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/copernicus_nodes.py +2 -2
  112. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/digitalglobe.py +1 -1
  113. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/earth_explorer_additional.py +1 -1
  114. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/element84.py +0 -0
  115. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/eodag_provider.py +0 -0
  116. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/esa_scihub.py +0 -0
  117. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/geoserver_generic.py +6 -6
  118. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/google_earth_engine.py +0 -0
  119. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/inpe_cbers.py +3 -3
  120. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/isro_bhuvan.py +5 -5
  121. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/jaxa_earth.py +1 -1
  122. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/maxar_gbdx.py +5 -5
  123. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/nasa_earthdata.py +1 -1
  124. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/nasa_earthdata_cloud.py +7 -3
  125. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/noaa_big_data.py +0 -0
  126. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/opentopography.py +1 -1
  127. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/planet.py +1 -1
  128. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/planetary_computer.py +17 -0
  129. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/sentinel_hub.py +1 -1
  130. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/terrabotics.py +0 -0
  131. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/providers/usgs.py +1 -1
  132. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/__init__.py +1 -1
  133. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/_native.py +0 -0
  134. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/_ost.py +0 -0
  135. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/_sarxarray.py +0 -0
  136. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/extraction.py +0 -0
  137. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/math.py +0 -0
  138. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/pipelines.py +0 -0
  139. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/sar/processor.py +1 -1
  140. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/stac_compute/__init__.py +0 -0
  141. pygeofetch-2.6.4.0/pygeofetch/stac_compute/burst_streaming.py +253 -0
  142. pygeofetch-2.6.4.0/pygeofetch/stac_compute/cog_streamer.py +186 -0
  143. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/stac_compute/lightweight_prefetch.py +0 -0
  144. pygeofetch-2.6.4.0/pygeofetch/stac_compute/window_calculator.py +134 -0
  145. pygeofetch-2.6.4.0/pygeofetch/streaming/__init__.py +37 -0
  146. pygeofetch-2.6.4.0/pygeofetch/streaming/scene.py +295 -0
  147. pygeofetch-2.6.4.0/pygeofetch/streaming/windowed.py +402 -0
  148. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/__init__.py +0 -0
  149. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/file_utils.py +0 -0
  150. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/gcp_recovery.py +0 -0
  151. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/geo_utils.py +0 -0
  152. pygeofetch-2.6.4.0/pygeofetch/utils/geocoding.py +138 -0
  153. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/logging_setup.py +0 -0
  154. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/retry_handler.py +0 -0
  155. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/sar_math.py +0 -0
  156. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/utils/validators.py +0 -0
  157. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/validation/__init__.py +0 -0
  158. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/validation/optical_validator.py +0 -0
  159. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/viz/__init__.py +0 -0
  160. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/viz/map.py +0 -0
  161. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch/viz/plot.py +0 -0
  162. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0/pygeofetch.egg-info}/PKG-INFO +4 -2
  163. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch.egg-info/SOURCES.txt +20 -0
  164. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch.egg-info/requires.txt +2 -0
  165. pygeofetch-2.6.4.0/pygeofetch.egg-info/top_level.txt +1 -0
  166. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pyproject.toml +3 -1
  167. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/setup.cfg +0 -0
  168. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_advanced_safeguards.py +0 -0
  169. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_airbus_oneatlas.py +0 -0
  170. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_alaska_satellite_facility.py +0 -0
  171. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_atmospheric_circular_regression.py +0 -0
  172. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_auto_fallback.py +0 -0
  173. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_auto_fallback_fixed.py +22 -8
  174. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_build_sbas_network-new.py +0 -0
  175. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_build_sbas_network.py +0 -0
  176. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_burst_metadata.py +0 -0
  177. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_burst_processing_integration.py +0 -0
  178. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_burst_sync_large_gap.py +0 -0
  179. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_burst_sync_prescreening.py +0 -0
  180. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_burst_synchronization.py +0 -0
  181. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_circuit_breaker_wiring.py +0 -0
  182. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_cli_optical_validation.py +0 -0
  183. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_copernicus_nodes.py +0 -0
  184. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_coregister_integration.py +0 -0
  185. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_coregister_upgrades (1).py +0 -0
  186. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_coregister_upgrades.py +0 -0
  187. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_credential_encryption.py +0 -0
  188. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_data_organizer.py +0 -0
  189. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_dem_differencing_pipeline.py +0 -0
  190. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_digitalglobe.py +0 -0
  191. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_earth_explorer_additional.py +0 -0
  192. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_era5_atmospheric_correction.py +0 -0
  193. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_esa_scihub.py +0 -0
  194. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_extraction.py +0 -0
  195. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_flat_earth_phase.py +0 -0
  196. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_flood_mapping_pipeline.py +0 -0
  197. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_gcp_reprojection.py +0 -0
  198. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_geology_indices_and_rvi_fix.py +0 -0
  199. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_geoserver_generic.py +0 -0
  200. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_google_earth_engine.py +0 -0
  201. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_inpe_cbers.py +0 -0
  202. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_insar.py +0 -0
  203. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_insar_optical_fusion_pipeline.py +0 -0
  204. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_ionosphere.py +0 -0
  205. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_isro_bhuvan.py +0 -0
  206. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_jaxa_earth.py +0 -0
  207. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_lightweight_prefetch.py +0 -0
  208. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_map_preview_consolidation.py +0 -0
  209. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_models.py +0 -0
  210. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_monitor.py +0 -0
  211. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_nasa_earthdata_cloud_s3_fix.py +0 -0
  212. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_nasa_earthdata_public_search.py +0 -0
  213. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_noaa_big_data.py +0 -0
  214. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_offset_tracking.py +0 -0
  215. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_opentopography_pointcloud_usgs.py +0 -0
  216. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_optical_offset_tracking.py +93 -21
  217. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_optical_validation_wiring.py +0 -0
  218. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_optical_validator.py +0 -0
  219. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_optical_validator_stac.py +39 -13
  220. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_pgv_integration_contract.py +0 -0
  221. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_pipeline_process_export.py +0 -0
  222. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_planet_asset_type_fix.py +20 -16
  223. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_preflight_gate.py +0 -0
  224. pygeofetch-2.6.4.0/tests/test_preflight_quiet.py +340 -0
  225. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_preflight_spatial_baseline.py +30 -20
  226. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_provider_geometry_audit.py +1 -1
  227. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_provider_scene_disambiguation.py +0 -0
  228. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_providers.py +0 -0
  229. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_ps_selection.py +0 -0
  230. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_raster_collocation_integration.py +0 -0
  231. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_reference_pixel_and_despike.py +0 -0
  232. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_risk_mapper.py +0 -0
  233. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_risk_mapping.py +0 -0
  234. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_sar_pipelines.py +0 -0
  235. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_screen_stack_orchestration.py +0 -0
  236. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_search_download.py +0 -0
  237. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_sentinel_hub_catalog_fix.py +0 -0
  238. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_sign_convention.py +0 -0
  239. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_splitspectrum_diagnostic.py +0 -0
  240. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_stack_selection_consolidation.py +0 -0
  241. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_state.py +0 -0
  242. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_strain_and_fusion.py +0 -0
  243. pygeofetch-2.6.4.0/tests/test_streaming.py +566 -0
  244. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_terrain_corrected_change_pipeline.py +0 -0
  245. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_topo_r2_bug.py +0 -0
  246. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_uq_exporter.py +0 -0
  247. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_utils.py +0 -0
  248. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_vegetation_disturbance_pipeline.py +0 -0
  249. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_viz_plot.py +0 -0
  250. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/tests/test_wls_inversion.py +0 -0
  251. pygeofetch-2.6.2.9/pygeofetch.egg-info/top_level.txt +0 -2
  252. /pygeofetch-2.6.2.9/pygeofetch/multisensor/_init.py → /pygeofetch-2.6.4.0/pygeofetch/multisensor/__init__.py +0 -0
  253. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch.egg-info/dependency_links.txt +0 -0
  254. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch.egg-info/entry_points.txt +0 -0
  255. {pygeofetch-2.6.2.9 → pygeofetch-2.6.4.0}/pygeofetch.egg-info/not-zip-safe +0 -0
@@ -20,7 +20,7 @@ date, and marked accordingly rather than filled in with invented
20
20
  bullet points.
21
21
  ```
22
22
 
23
- ## [Unreleased] — v2.6.2.9.4
23
+ ## [Unreleased] — v2.6.4.0.4
24
24
 
25
25
  ```{note}
26
26
  Not yet published to PyPI. This entry documents work completed and
@@ -130,7 +130,7 @@ audit and remain open for a follow-up pass.
130
130
 
131
131
  ---
132
132
 
133
- ## [2.6.2.9.4] — 2026-08-25 (latest)
133
+ ## [2.6.4.0.4] — 2026-08-25 (latest)
134
134
 
135
135
  Confirmed via direct fetch of the current PyPI listing.
136
136
 
@@ -149,7 +149,7 @@ Confirmed via direct fetch of the current PyPI listing.
149
149
  - `SearchQuery.sort_ascending: bool` — earlier examples showed a `sort_order: "asc"/"desc"` string field that doesn't exist on the model (the CLI's `--sort-order` flag does convert to this internally, so CLI docs were unaffected)
150
150
  - `DownloadOptions.post_process` requires a list of `PostProcessAction` objects — passing plain strings raises a real `pydantic.ValidationError`
151
151
 
152
- ## [2.6.2.9] — 2026-08-24
152
+ ## [2.6.4.0] — 2026-08-24
153
153
  Real, verified release. Detailed notes not independently recovered from PyPI's release-history page (no distinct per-version notes exposed for this release specifically).
154
154
 
155
155
  ## [2.6.1] — 2026-08-22
@@ -261,9 +261,9 @@ recovered.
261
261
 
262
262
  ```{note}
263
263
  The previous version of this changelog had an entry labeled
264
- **"2.6.2.9.4 — 2026-07-12"** describing 22+ providers, Sentinel-1C/1D
264
+ **"2.6.4.0.4 — 2026-07-12"** describing 22+ providers, Sentinel-1C/1D
265
265
  support, SLC search with provider routing, precise orbit file
266
- management, 17 spectral indices, and various bug fixes. **2.6.2.9.4 was
266
+ management, 17 spectral indices, and various bug fixes. **2.6.4.0.4 was
267
267
  only ever released once, on 2026-08-25** — it was never released on
268
268
  2026-07-12. The date matches this real release, **1.0.8**, exactly.
269
269
  That content is reproduced below under the version it actually
@@ -406,8 +406,8 @@ The version of this file uploaded for this update had **5 entries
406
406
  covering 5 dates**. PyPI's real release history has **54 releases**.
407
407
  Specific issues found and fixed:
408
408
 
409
- 1. **Two different entries were both labeled `2.6.2.9.4`**, dated
410
- 2026-07-29 and 2026-07-12. **2.6.2.9.4 was only ever released once**,
409
+ 1. **Two different entries were both labeled `2.6.4.0.4`**, dated
410
+ 2026-07-29 and 2026-07-12. **2.6.4.0.4 was only ever released once**,
411
411
  on 2026-08-25 (confirmed directly from the live PyPI listing).
412
412
  2. **The 2026-07-12 entry's date exactly matches a real release**
413
413
  — version **1.0.8** — and its content (22+ providers, Sentinel-1C/D,
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pygeofetch
3
- Version: 2.6.2.9
3
+ Version: 2.6.4.0
4
4
  Summary: Universal satellite data pipeline + geospatial processing platform
5
5
  Author-email: Samuel Appiah Kubi <appiahkubis14@gmail.com>
6
6
  License: MIT License
@@ -43,6 +43,8 @@ Requires-Python: >=3.9
43
43
  Description-Content-Type: text/markdown
44
44
  License-File: LICENSE
45
45
  Requires-Dist: httpx>=0.27
46
+ Requires-Dist: pydantic
47
+ Requires-Dist: rich
46
48
  Requires-Dist: click>=8.1
47
49
  Requires-Dist: pydantic>=2.5
48
50
  Requires-Dist: pydantic-settings>=2.1
@@ -369,7 +371,7 @@ If you use PyGeoFetch in your research or operational work, please cite it using
369
371
  title = {PyGeoFetch: A Unified Python Framework for Multi-Provider Satellite Data Acquisition, Pre-download Quality Control, and Geospatial Processing},
370
372
  year = {2026},
371
373
  publisher = {Zenodo},
372
- version = {2.6.2.9.1},
374
+ version = {2.6.4.0.1},
373
375
  doi = {10.5281/zenodo.22087230},
374
376
  url = {https://doi.org/10.5281/zenodo.22087230}
375
377
  }
@@ -229,7 +229,7 @@ If you use PyGeoFetch in your research or operational work, please cite it using
229
229
  title = {PyGeoFetch: A Unified Python Framework for Multi-Provider Satellite Data Acquisition, Pre-download Quality Control, and Geospatial Processing},
230
230
  year = {2026},
231
231
  publisher = {Zenodo},
232
- version = {2.6.2.9.1},
232
+ version = {2.6.4.0.1},
233
233
  doi = {10.5281/zenodo.22087230},
234
234
  url = {https://doi.org/10.5281/zenodo.22087230}
235
235
  }
@@ -263,4 +263,4 @@ pip install -e ".[test]" && pytest tests/ -v
263
263
 
264
264
  ## License
265
265
 
266
- MIT — see [LICENSE](LICENSE). © 2026 Samuel Appiah Kubi.
266
+ MIT — see [LICENSE](LICENSE). © 2026 Samuel Appiah Kubi.
@@ -30,13 +30,16 @@ CLI::
30
30
  pygeofetch doctor
31
31
  """
32
32
 
33
- __version__ = "2.6.2.9.4"
33
+ __version__ = "2.6.4.0.4"
34
34
  __author__ = "PyGeoFetch Contributors"
35
35
  __license__ = "MIT"
36
36
 
37
37
  from pygeofetch.core.engine import PyGeoFetch # noqa: F401
38
+ from pygeofetch.core.logging import (
39
+ quiet_logs, # noqa: F401 (notebook-friendly logging)
40
+ )
38
41
 
39
- __all__ = ["PyGeoFetch", "__version__"]
42
+ __all__ = ["PyGeoFetch", "quiet_logs", "__version__"]
40
43
 
41
44
 
42
45
  # Optional modules — lazy imported to avoid hard dependency errors
@@ -0,0 +1,174 @@
1
+ """CLI commands for pixel classification."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+
7
+ import click
8
+ from rich.console import Console
9
+
10
+ # from pygeofetch.cli.index_commands import clip_options, _parse_bbox
11
+
12
+ console = Console()
13
+
14
+
15
+ def _engine():
16
+ from pygeofetch.core.engine import PyGeoFetch
17
+
18
+ return PyGeoFetch(log_level="WARNING")
19
+
20
+
21
+ def _pr(result, name):
22
+ if result.success:
23
+ size_mb = (
24
+ result.output_path.stat().st_size / (1024 * 1024)
25
+ if result.output_path and result.output_path.exists()
26
+ else 0
27
+ )
28
+ console.print(
29
+ f"[green]✓[/] {name} → {result.output_path}"
30
+ f" ({size_mb:.1f} MB, {result.duration_seconds:.2f}s)"
31
+ )
32
+ meta = result.metadata or {}
33
+ for k, v in meta.items():
34
+ if k != "classification_report":
35
+ console.print(f" {k}: {v}")
36
+ else:
37
+ console.print(f"[red]✗[/] {name} failed: {result.error}")
38
+ sys.exit(1)
39
+
40
+
41
+ @click.group()
42
+ def classify() -> None:
43
+ """Pixel classification — unsupervised K-means and supervised Random Forest/SVM."""
44
+
45
+
46
+ @classify.command("kmeans")
47
+ @click.argument("inputs", nargs=-1, type=click.Path(exists=True))
48
+ @click.option(
49
+ "--clusters",
50
+ "-k",
51
+ default=5,
52
+ show_default=True,
53
+ type=int,
54
+ help="Number of clusters.",
55
+ )
56
+ @click.option("--output", "-o", default=None)
57
+ @click.option("--random-state", default=42, show_default=True, type=int)
58
+ # @clip_options
59
+ def kmeans_cmd(inputs, clusters, output, random_state, bbox, geometry, geometry_crs):
60
+ """Unsupervised K-means clustering. No training data needed.
61
+
62
+ Example: pygeofetch classify kmeans B02.tif B03.tif B04.tif B08.tif -k 5
63
+ """
64
+ if len(inputs) < 1:
65
+ console.print("[red]Provide at least 1 input band raster[/]")
66
+ sys.exit(1)
67
+ e = _engine()
68
+ r = e.classify.kmeans(
69
+ inputs=list(inputs),
70
+ n_clusters=clusters,
71
+ output=output,
72
+ random_state=random_state,
73
+ bbox=bbox,
74
+ geometry=geometry,
75
+ geometry_crs=geometry_crs,
76
+ )
77
+ _pr(r, f"K-means ({clusters} clusters)")
78
+
79
+
80
+ @classify.command("train")
81
+ @click.argument("inputs", nargs=-1, type=click.Path(exists=True))
82
+ @click.option(
83
+ "--training-data",
84
+ required=True,
85
+ type=click.Path(exists=True),
86
+ help="Vector file (GeoJSON/Shapefile) with labeled training geometries.",
87
+ )
88
+ @click.option(
89
+ "--class-field",
90
+ required=True,
91
+ help="Attribute column holding the real class label.",
92
+ )
93
+ @click.option(
94
+ "--output-model", "-o", required=True, help="Where to save the trained model."
95
+ )
96
+ @click.option(
97
+ "--model-type",
98
+ default="random_forest",
99
+ type=click.Choice(["random_forest", "svm"]),
100
+ show_default=True,
101
+ )
102
+ @click.option(
103
+ "--n-estimators",
104
+ default=100,
105
+ show_default=True,
106
+ type=int,
107
+ help="Random Forest tree count.",
108
+ )
109
+ @click.option(
110
+ "--test-size",
111
+ default=0.2,
112
+ show_default=True,
113
+ type=float,
114
+ help="Fraction of samples held out for real accuracy reporting.",
115
+ )
116
+ def train_cmd(
117
+ inputs,
118
+ training_data,
119
+ class_field,
120
+ output_model,
121
+ model_type,
122
+ n_estimators,
123
+ test_size,
124
+ ):
125
+ """Train a supervised classifier from labeled vector training samples.
126
+
127
+ Example: pygeofetch classify train B02.tif B03.tif B04.tif B08.tif
128
+ --training-data samples.geojson --class-field land_cover -o model.joblib
129
+ """
130
+ if len(inputs) < 1:
131
+ console.print("[red]Provide at least 1 input band raster[/]")
132
+ sys.exit(1)
133
+ e = _engine()
134
+ r = e.classify.train(
135
+ inputs=list(inputs),
136
+ training_data=training_data,
137
+ class_field=class_field,
138
+ output_model=output_model,
139
+ model_type=model_type,
140
+ n_estimators=n_estimators,
141
+ test_size=test_size,
142
+ )
143
+ _pr(r, f"train ({model_type})")
144
+
145
+
146
+ @classify.command("predict")
147
+ @click.argument("inputs", nargs=-1, type=click.Path(exists=True))
148
+ @click.option(
149
+ "--model",
150
+ "-m",
151
+ required=True,
152
+ type=click.Path(exists=True),
153
+ help="A model trained via 'classify train'.",
154
+ )
155
+ @click.option("--output", "-o", default=None)
156
+ # @clip_options
157
+ def predict_cmd(inputs, model, output, bbox, geometry, geometry_crs):
158
+ """Apply a trained model to a real raster stack, producing a classification map.
159
+
160
+ Example: pygeofetch classify predict B02.tif B03.tif B04.tif B08.tif -m model.joblib
161
+ """
162
+ if len(inputs) < 1:
163
+ console.print("[red]Provide at least 1 input band raster[/]")
164
+ sys.exit(1)
165
+ e = _engine()
166
+ r = e.classify.predict(
167
+ inputs=list(inputs),
168
+ model=model,
169
+ output=output,
170
+ bbox=bbox,
171
+ geometry=geometry,
172
+ geometry_crs=geometry_crs,
173
+ )
174
+ _pr(r, "predict")