PyGeoFetch 1.0.9__tar.gz → 1.2.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 (124) hide show
  1. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/CHANGELOG.md +2 -2
  2. {pygeofetch-1.0.9/pygeofetch.egg-info → pygeofetch-1.2.0}/PKG-INFO +69 -49
  3. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/README.md +2 -32
  4. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/__init__.py +32 -2
  5. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/auth_commands.py +11 -5
  6. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/config_commands.py +3 -1
  7. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/download_commands.py +171 -56
  8. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/index_commands.py +92 -32
  9. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/main.py +210 -71
  10. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/pipeline_process_commands.py +63 -33
  11. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/postprocess_commands.py +80 -27
  12. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/preprocess_commands.py +116 -33
  13. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/sar_commands.py +43 -11
  14. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/search_commands.py +150 -44
  15. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/config/__init__.py +7 -1
  16. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/config/settings.py +22 -23
  17. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/authenticator.py +81 -47
  18. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/cache_manager.py +19 -13
  19. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/downloader.py +315 -109
  20. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/engine.py +90 -68
  21. pygeofetch-1.2.0/pygeofetch/core/logging.py +685 -0
  22. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/orbits.py +81 -26
  23. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/scheduler.py +60 -42
  24. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/searcher.py +82 -52
  25. pygeofetch-1.2.0/pygeofetch/insar/__init__.py +66 -0
  26. pygeofetch-1.2.0/pygeofetch/insar/atmosphere.py +283 -0
  27. pygeofetch-1.2.0/pygeofetch/insar/extraction.py +298 -0
  28. pygeofetch-1.2.0/pygeofetch/insar/interferogram.py +457 -0
  29. pygeofetch-1.2.0/pygeofetch/insar/timeseries.py +437 -0
  30. pygeofetch-1.2.0/pygeofetch/insar/unwrap.py +258 -0
  31. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/meta.yaml +1 -1
  32. pygeofetch-1.2.0/pygeofetch/models/download_task.py +176 -0
  33. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/satellite_data.py +158 -93
  34. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/search_query.py +76 -53
  35. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/user_auth.py +23 -20
  36. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/__init__.py +9 -4
  37. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/base.py +67 -44
  38. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/batch.py +27 -18
  39. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/indices.py +259 -186
  40. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/pipeline.py +156 -106
  41. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/postprocessor.py +146 -76
  42. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/preprocessor.py +228 -113
  43. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/processing/sar.py +126 -93
  44. pygeofetch-1.2.0/pygeofetch/processor/__init__.py +30 -0
  45. pygeofetch-1.2.0/pygeofetch/processor/indices.py +296 -0
  46. pygeofetch-1.2.0/pygeofetch/processor/landsat.py +384 -0
  47. pygeofetch-1.2.0/pygeofetch/processor/loader.py +196 -0
  48. pygeofetch-1.2.0/pygeofetch/processor/stacker.py +265 -0
  49. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/__init__.py +74 -58
  50. pygeofetch-1.2.0/pygeofetch/providers/airbus_oneatlas.py +241 -0
  51. pygeofetch-1.2.0/pygeofetch/providers/alaska_satellite_facility.py +243 -0
  52. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/aws_earth.py +31 -20
  53. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/base.py +38 -29
  54. pygeofetch-1.2.0/pygeofetch/providers/copernicus.py +920 -0
  55. pygeofetch-1.2.0/pygeofetch/providers/digitalglobe.py +241 -0
  56. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/earth_explorer_additional.py +133 -46
  57. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/element84.py +60 -25
  58. pygeofetch-1.2.0/pygeofetch/providers/eodag_provider.py +288 -0
  59. pygeofetch-1.2.0/pygeofetch/providers/esa_scihub.py +243 -0
  60. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/geoserver_generic.py +132 -43
  61. pygeofetch-1.2.0/pygeofetch/providers/google_earth_engine.py +241 -0
  62. pygeofetch-1.2.0/pygeofetch/providers/inpe_cbers.py +241 -0
  63. pygeofetch-1.2.0/pygeofetch/providers/isro_bhuvan.py +241 -0
  64. pygeofetch-1.2.0/pygeofetch/providers/jaxa_earth.py +243 -0
  65. pygeofetch-1.2.0/pygeofetch/providers/maxar_gbdx.py +253 -0
  66. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/nasa_earthdata.py +128 -33
  67. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/nasa_earthdata_cloud.py +126 -48
  68. pygeofetch-1.2.0/pygeofetch/providers/noaa_big_data.py +243 -0
  69. pygeofetch-1.2.0/pygeofetch/providers/opentopography.py +194 -0
  70. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/planet.py +151 -73
  71. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/planetary_computer.py +86 -33
  72. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/sentinel_hub.py +133 -44
  73. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/providers/terrabotics.py +102 -44
  74. pygeofetch-1.2.0/pygeofetch/providers/usgs.py +764 -0
  75. pygeofetch-1.2.0/pygeofetch/sar/__init__.py +18 -0
  76. pygeofetch-1.2.0/pygeofetch/sar/_native.py +45 -0
  77. pygeofetch-1.2.0/pygeofetch/sar/_ost.py +100 -0
  78. pygeofetch-1.2.0/pygeofetch/sar/_sarxarray.py +86 -0
  79. pygeofetch-1.2.0/pygeofetch/sar/processor.py +145 -0
  80. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/__init__.py +5 -0
  81. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/file_utils.py +26 -13
  82. pygeofetch-1.2.0/pygeofetch/utils/gcp_recovery.py +341 -0
  83. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/geo_utils.py +35 -23
  84. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/logging_setup.py +6 -6
  85. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/retry_handler.py +14 -12
  86. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/utils/validators.py +32 -21
  87. pygeofetch-1.2.0/pygeofetch/viz/__init__.py +21 -0
  88. pygeofetch-1.2.0/pygeofetch/viz/map.py +142 -0
  89. pygeofetch-1.2.0/pygeofetch/viz/plot.py +239 -0
  90. {pygeofetch-1.0.9 → pygeofetch-1.2.0/pygeofetch.egg-info}/PKG-INFO +69 -49
  91. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/SOURCES.txt +23 -0
  92. pygeofetch-1.2.0/pygeofetch.egg-info/requires.txt +102 -0
  93. pygeofetch-1.2.0/pyproject.toml +180 -0
  94. pygeofetch-1.2.0/tests/test_extraction.py +210 -0
  95. pygeofetch-1.2.0/tests/test_insar.py +465 -0
  96. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/tests/test_pgv_integration_contract.py +282 -71
  97. pygeofetch-1.0.9/pygeofetch/core/logging.py +0 -495
  98. pygeofetch-1.0.9/pygeofetch/models/download_task.py +0 -283
  99. pygeofetch-1.0.9/pygeofetch/providers/airbus_oneatlas.py +0 -154
  100. pygeofetch-1.0.9/pygeofetch/providers/alaska_satellite_facility.py +0 -154
  101. pygeofetch-1.0.9/pygeofetch/providers/copernicus.py +0 -758
  102. pygeofetch-1.0.9/pygeofetch/providers/digitalglobe.py +0 -154
  103. pygeofetch-1.0.9/pygeofetch/providers/esa_scihub.py +0 -154
  104. pygeofetch-1.0.9/pygeofetch/providers/google_earth_engine.py +0 -154
  105. pygeofetch-1.0.9/pygeofetch/providers/inpe_cbers.py +0 -154
  106. pygeofetch-1.0.9/pygeofetch/providers/isro_bhuvan.py +0 -154
  107. pygeofetch-1.0.9/pygeofetch/providers/jaxa_earth.py +0 -154
  108. pygeofetch-1.0.9/pygeofetch/providers/maxar_gbdx.py +0 -154
  109. pygeofetch-1.0.9/pygeofetch/providers/noaa_big_data.py +0 -154
  110. pygeofetch-1.0.9/pygeofetch/providers/opentopography.py +0 -112
  111. pygeofetch-1.0.9/pygeofetch/providers/usgs.py +0 -481
  112. pygeofetch-1.0.9/pygeofetch.egg-info/requires.txt +0 -44
  113. pygeofetch-1.0.9/pyproject.toml +0 -101
  114. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/LICENSE +0 -0
  115. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/MANIFEST.in +0 -0
  116. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/cli/__init__.py +0 -0
  117. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/config/defaults.yaml +0 -0
  118. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/core/__init__.py +2 -2
  119. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch/models/__init__.py +0 -0
  120. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/dependency_links.txt +0 -0
  121. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/entry_points.txt +0 -0
  122. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/not-zip-safe +0 -0
  123. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/pygeofetch.egg-info/top_level.txt +0 -0
  124. {pygeofetch-1.0.9 → pygeofetch-1.2.0}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  # Changelog
2
2
 
3
3
  All notable changes to PyGeoFetch are documented here.
4
- Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.9/).
4
+ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
5
5
 
6
- ## [1.0.9] — 2026-07-12
6
+ ## [1.0.0] — 2026-07-12
7
7
 
8
8
  ### Added
9
9
  - Federated search across 22+ satellite data providers
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pygeofetch
3
- Version: 1.0.9
4
- Summary: Universal satellite data pipeline — unified access to 22+ providers
5
- Author: PyGeoFetch Contributors
3
+ Version: 1.2.0
4
+ Summary: Universal satellite data pipeline + geospatial processing platform
5
+ Author-email: pygeofetch Contributors <pygeofetch@example.com>
6
6
  License: MIT License
7
7
 
8
8
  Copyright (c) 2024 SatelliteBridge Contributors
@@ -25,11 +25,11 @@ License: MIT License
25
25
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
26
  SOFTWARE.
27
27
 
28
- Project-URL: Homepage, https://github.com/appiahkubis14/pygeofetch
28
+ Project-URL: Homepage, https://github.com/pygeofetch/pygeofetch
29
29
  Project-URL: Documentation, https://pygeofetch.readthedocs.io
30
- Project-URL: Repository, https://github.com/appiahkubis14/pygeofetch
31
- Project-URL: Bug Tracker, https://github.com/appiahkubis14/pygeofetch/issues
32
- Keywords: satellite,remote-sensing,GIS,earth-observation,geospatial
30
+ Project-URL: Repository, https://github.com/pygeofetch/pygeofetch
31
+ Project-URL: Bug Tracker, https://github.com/pygeofetch/pygeofetch/issues
32
+ Keywords: satellite,remote-sensing,GIS,earth-observation,geospatial,SAR,Sentinel,Landsat
33
33
  Classifier: Development Status :: 5 - Production/Stable
34
34
  Classifier: Intended Audience :: Science/Research
35
35
  Classifier: License :: OSI Approved :: MIT License
@@ -46,41 +46,91 @@ Requires-Dist: httpx>=0.27
46
46
  Requires-Dist: click>=8.1
47
47
  Requires-Dist: pydantic>=2.5
48
48
  Requires-Dist: pydantic-settings>=2.1
49
- Requires-Dist: rich>=13.7
50
49
  Requires-Dist: PyYAML>=6.0
51
50
  Requires-Dist: cryptography>=42.0
52
51
  Requires-Dist: keyring>=24.3
53
- Requires-Dist: aiofiles>=23.2
54
52
  Requires-Dist: tenacity>=8.2
55
53
  Requires-Dist: python-dateutil>=2.9
56
- Requires-Dist: tqdm>=4.66
57
54
  Requires-Dist: requests>=2.31
58
55
  Requires-Dist: anyio>=4.2
59
- Requires-Dist: boto3>=1.34
60
- Requires-Dist: click-completion>=0.5
56
+ Requires-Dist: numpy>=1.26
57
+ Requires-Dist: tqdm>=4.66
61
58
  Provides-Extra: geo
62
59
  Requires-Dist: rasterio>=1.3; extra == "geo"
63
60
  Requires-Dist: geopandas>=0.14; extra == "geo"
64
61
  Requires-Dist: pyarrow>=15.0; extra == "geo"
65
62
  Requires-Dist: shapely>=2.0; extra == "geo"
66
63
  Requires-Dist: pyproj>=3.6; extra == "geo"
64
+ Provides-Extra: processor
65
+ Requires-Dist: rasterio>=1.3; extra == "processor"
66
+ Requires-Dist: rioxarray>=0.15; extra == "processor"
67
+ Requires-Dist: xarray>=2024.1; extra == "processor"
68
+ Requires-Dist: eoreader>=0.24; extra == "processor"
69
+ Requires-Dist: spyndex>=0.5; extra == "processor"
70
+ Requires-Dist: scipy>=1.12; extra == "processor"
71
+ Requires-Dist: scikit-image>=0.23; extra == "processor"
72
+ Requires-Dist: geopandas>=0.14; extra == "processor"
73
+ Provides-Extra: providers
74
+ Requires-Dist: eodag>=3.0; extra == "providers"
75
+ Provides-Extra: sar
76
+ Requires-Dist: sarxarray>=0.1; extra == "sar"
77
+ Requires-Dist: scipy>=1.12; extra == "sar"
78
+ Provides-Extra: ost
79
+ Requires-Dist: opensartoolkit>=3.0; extra == "ost"
80
+ Provides-Extra: viz
81
+ Requires-Dist: leafmap>=0.30; extra == "viz"
82
+ Requires-Dist: folium>=0.16; extra == "viz"
83
+ Requires-Dist: matplotlib>=3.7; extra == "viz"
84
+ Requires-Dist: localtileserver>=1.0.0; extra == "viz"
85
+ Requires-Dist: ipysheet>=0.6.0; extra == "viz"
86
+ Requires-Dist: ipyleaflet>=0.17.0; extra == "viz"
87
+ Requires-Dist: ipywidgets>=8.0.0; extra == "viz"
88
+ Requires-Dist: ipyevents>=2.0.0; extra == "viz"
89
+ Requires-Dist: ipyfilechooser>=0.6.0; extra == "viz"
90
+ Requires-Dist: sidecar>=0.6.0; extra == "viz"
91
+ Requires-Dist: bokeh>=3.0.0; extra == "viz"
92
+ Requires-Dist: seaborn>=0.12.0; extra == "viz"
93
+ Requires-Dist: plotly>=5.14.0; extra == "viz"
94
+ Requires-Dist: whitebox>=2.3.0; extra == "viz"
95
+ Requires-Dist: whiteboxgui>=2.3.0; extra == "viz"
96
+ Requires-Dist: geemap>=0.28.0; extra == "viz"
97
+ Requires-Dist: osmnx>=1.7.0; extra == "viz"
98
+ Requires-Dist: contextily>=1.5.0; extra == "viz"
99
+ Requires-Dist: xyzservices>=2023.10.0; extra == "viz"
100
+ Requires-Dist: mapclassify>=2.5.0; extra == "viz"
101
+ Requires-Dist: geoplot>=0.5.0; extra == "viz"
102
+ Requires-Dist: mplleaflet>=0.0.5; extra == "viz"
103
+ Requires-Dist: branca>=0.6.0; extra == "viz"
104
+ Requires-Dist: plotly-geo>=1.0.0; extra == "viz"
105
+ Requires-Dist: keplergl>=0.3.0; extra == "viz"
106
+ Requires-Dist: streamlit>=1.28.0; extra == "viz"
67
107
  Provides-Extra: cloud
68
108
  Requires-Dist: boto3>=1.34; extra == "cloud"
69
109
  Requires-Dist: pystac>=1.9; extra == "cloud"
110
+ Requires-Dist: planetary-computer>=1.0; extra == "cloud"
111
+ Provides-Extra: notebook
112
+ Requires-Dist: ipython>=8.0; extra == "notebook"
113
+ Requires-Dist: ipywidgets>=8.0; extra == "notebook"
114
+ Requires-Dist: jupyter>=1.0; extra == "notebook"
70
115
  Provides-Extra: schedule
71
116
  Requires-Dist: croniter>=2.0; extra == "schedule"
72
117
  Provides-Extra: dev
73
118
  Requires-Dist: pytest>=8.0; extra == "dev"
74
119
  Requires-Dist: pytest-cov>=4.1; extra == "dev"
75
120
  Requires-Dist: pytest-mock>=3.12; extra == "dev"
76
- Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
77
- Requires-Dist: vcrpy>=6.0; extra == "dev"
78
- Requires-Dist: black>=24.0; extra == "dev"
79
121
  Requires-Dist: ruff>=0.3; extra == "dev"
80
122
  Requires-Dist: mypy>=1.8; extra == "dev"
81
- Requires-Dist: bump2version>=1.0; extra == "dev"
123
+ Requires-Dist: build>=1.0; extra == "dev"
124
+ Requires-Dist: twine>=5.0; extra == "dev"
125
+ Provides-Extra: insar-full
126
+ Requires-Dist: snaphu>=0.1; extra == "insar-full"
127
+ Requires-Dist: scipy>=1.12; extra == "insar-full"
128
+ Requires-Dist: mintpy>=1.5; extra == "insar-full"
129
+ Requires-Dist: pyaps3>=0.3; extra == "insar-full"
130
+ Provides-Extra: full
131
+ Requires-Dist: pygeofetch[cloud,geo,notebook,processor,providers,sar,schedule,viz]; extra == "full"
82
132
  Provides-Extra: all
83
- Requires-Dist: pygeofetch[cloud,dev,geo,schedule]; extra == "all"
133
+ Requires-Dist: pygeofetch[full]; extra == "all"
84
134
  Dynamic: license-file
85
135
 
86
136
  <div align="center">
@@ -136,7 +186,7 @@ Existing tools address parts of this problem: EODAG supports several providers b
136
186
 
137
187
  ---
138
188
 
139
-
189
+ ## 🚀 Key Features
140
190
 
141
191
  ### 🛰️ 22+ Satellite Providers
142
192
 
@@ -534,36 +584,6 @@ COMPLETION
534
584
  pygeofetch --install-completion bash|zsh|fish
535
585
  ```
536
586
 
537
- ---
538
-
539
- ## 🗂️ Project Structure
540
-
541
- ```
542
- pygeofetch/
543
- ├── pygeofetch/
544
- │ ├── core/ engine, authenticator, searcher, downloader, scheduler, cache
545
- │ ├── cli/ 11 CLI command modules
546
- │ ├── processing/ ← geospatial processing engine
547
- │ │ ├── preprocessor.py atmospheric, cloud, geometric, resampling, compositing
548
- │ │ ├── indices.py 17 spectral indices + transformations
549
- │ │ ├── postprocessor.py vectorize, smooth, zonal stats, COG, compress
550
- │ │ ├── sar.py despeckle, calibrate, flood map, coherence
551
- │ │ ├── pipeline.py chainable builder + YAML loader + 6 templates
552
- │ │ └── batch.py parallel batch processing
553
- │ ├── models/ Pydantic models (search, download, auth, satellite)
554
- │ ├── providers/ 22 provider implementations
555
- │ ├── utils/ logging, retry, geo, file, validators
556
- │ └── config/ settings, defaults.yaml
557
- ├── notebooks/ 9 Jupyter notebooks (01–09)
558
- ├── tests/ 60 unit + integration tests
559
- ├── docs/assets/
560
- ├── pyproject.toml
561
- ├── Dockerfile · Makefile · .gitignore
562
- └── .github/workflows/tests.yml
563
- ```
564
-
565
- ---
566
-
567
587
  ## 📚 Notebooks
568
588
 
569
589
  | Notebook | Topics |
@@ -612,4 +632,4 @@ pytest tests/unit/ -v
612
632
 
613
633
  pygeofetch is free and open source software, licensed under the [MIT License](LICENSE).
614
634
 
615
- © 2025 pygeofetch Contributors. Part of the **PyGeoVision** platform — [pygeofetch](https://github.com/appiahkubis14/pygeofetch) (data + processing) + [GeoAI](https://opengeoai.org) (AI) = complete Earth observation pipeline.
635
+ © 2026 pygeofetch Contributors. Part of the **PyGeoVision** platform — [pygeofetch](https://github.com/appiahkubis14/pygeofetch) (data + processing) + [GeoAI](https://opengeoai.org) (AI) = complete Earth observation pipeline.
@@ -51,7 +51,7 @@ Existing tools address parts of this problem: EODAG supports several providers b
51
51
 
52
52
  ---
53
53
 
54
-
54
+ ## 🚀 Key Features
55
55
 
56
56
  ### 🛰️ 22+ Satellite Providers
57
57
 
@@ -449,36 +449,6 @@ COMPLETION
449
449
  pygeofetch --install-completion bash|zsh|fish
450
450
  ```
451
451
 
452
- ---
453
-
454
- ## 🗂️ Project Structure
455
-
456
- ```
457
- pygeofetch/
458
- ├── pygeofetch/
459
- │ ├── core/ engine, authenticator, searcher, downloader, scheduler, cache
460
- │ ├── cli/ 11 CLI command modules
461
- │ ├── processing/ ← geospatial processing engine
462
- │ │ ├── preprocessor.py atmospheric, cloud, geometric, resampling, compositing
463
- │ │ ├── indices.py 17 spectral indices + transformations
464
- │ │ ├── postprocessor.py vectorize, smooth, zonal stats, COG, compress
465
- │ │ ├── sar.py despeckle, calibrate, flood map, coherence
466
- │ │ ├── pipeline.py chainable builder + YAML loader + 6 templates
467
- │ │ └── batch.py parallel batch processing
468
- │ ├── models/ Pydantic models (search, download, auth, satellite)
469
- │ ├── providers/ 22 provider implementations
470
- │ ├── utils/ logging, retry, geo, file, validators
471
- │ └── config/ settings, defaults.yaml
472
- ├── notebooks/ 9 Jupyter notebooks (01–09)
473
- ├── tests/ 60 unit + integration tests
474
- ├── docs/assets/
475
- ├── pyproject.toml
476
- ├── Dockerfile · Makefile · .gitignore
477
- └── .github/workflows/tests.yml
478
- ```
479
-
480
- ---
481
-
482
452
  ## 📚 Notebooks
483
453
 
484
454
  | Notebook | Topics |
@@ -527,4 +497,4 @@ pytest tests/unit/ -v
527
497
 
528
498
  pygeofetch is free and open source software, licensed under the [MIT License](LICENSE).
529
499
 
530
- © 2025 pygeofetch Contributors. Part of the **PyGeoVision** platform — [pygeofetch](https://github.com/appiahkubis14/pygeofetch) (data + processing) + [GeoAI](https://opengeoai.org) (AI) = complete Earth observation pipeline.
500
+ © 2026 pygeofetch Contributors. Part of the **PyGeoVision** platform — [pygeofetch](https://github.com/appiahkubis14/pygeofetch) (data + processing) + [GeoAI](https://opengeoai.org) (AI) = complete Earth observation pipeline.
@@ -1,5 +1,5 @@
1
1
  """
2
- PyGeoFetch v1.0.9 — Universal Satellite Data Pipeline.
2
+ PyGeoFetch v1.0.0 — Universal Satellite Data Pipeline.
3
3
 
4
4
  Unified access to 22+ satellite data providers with a consistent
5
5
  Python API and CLI. Supports authentication management, federated search,
@@ -30,10 +30,40 @@ CLI::
30
30
  pygeofetch doctor
31
31
  """
32
32
 
33
- __version__ = "1.0.9"
33
+ __version__ = "1.0.0"
34
34
  __author__ = "PyGeoFetch Contributors"
35
35
  __license__ = "MIT"
36
36
 
37
37
  from pygeofetch.core.engine import PyGeoFetch # noqa: F401
38
38
 
39
39
  __all__ = ["PyGeoFetch", "__version__"]
40
+
41
+
42
+ # Optional modules — lazy imported to avoid hard dependency errors
43
+ def _lazy(module_path: str, name: str):
44
+ """Return a lazy accessor that imports on first use."""
45
+
46
+ def _get():
47
+ import importlib
48
+
49
+ mod = importlib.import_module(module_path)
50
+ return getattr(mod, name)
51
+
52
+ return _get
53
+
54
+
55
+ # Convenience accessors (fail gracefully if optional deps not installed)
56
+ try:
57
+ from pygeofetch.processor import BandStacker, DataLoader, SpectralIndex
58
+ except ImportError:
59
+ DataLoader = SpectralIndex = BandStacker = None # type: ignore[assignment,misc]
60
+
61
+ try:
62
+ from pygeofetch.sar import SARProcessor as AdvancedSARProcessor
63
+ except ImportError:
64
+ AdvancedSARProcessor = None # type: ignore[assignment,misc]
65
+
66
+ try:
67
+ from pygeofetch.viz import MapViewer, Plotter
68
+ except ImportError:
69
+ MapViewer = Plotter = None # type: ignore[assignment,misc]
@@ -36,7 +36,9 @@ def auth() -> None:
36
36
  @click.argument("provider")
37
37
  @click.option("--username", "-u", default=None, help="Username or email.")
38
38
  @click.option("--password", "-p", default=None, help="Password (prompted if omitted).")
39
- @click.option("--api-key", "-k", default=None, help="API key (alternative to username/password).")
39
+ @click.option(
40
+ "--api-key", "-k", default=None, help="API key (alternative to username/password)."
41
+ )
40
42
  @click.option("--client-id", default=None, help="OAuth2 client ID.")
41
43
  @click.option("--client-secret", default=None, help="OAuth2 client secret.")
42
44
  @click.option("--token", default=None, help="Bearer token.")
@@ -121,9 +123,9 @@ def auth_login(provider: str) -> None:
121
123
  # Determine what to prompt based on auth type
122
124
  auth_type = caps.auth_type if hasattr(caps, "auth_type") else "username_password"
123
125
 
124
- if auth_type in ("api_key",):
126
+ if auth_type == "api_key":
125
127
  creds["api_key"] = click.prompt("API Key", hide_input=True)
126
- elif auth_type in ("oauth2_client",):
128
+ elif auth_type == "oauth2_client":
127
129
  creds["client_id"] = click.prompt("Client ID")
128
130
  creds["client_secret"] = click.prompt("Client Secret", hide_input=True)
129
131
  else:
@@ -139,7 +141,9 @@ def auth_login(provider: str) -> None:
139
141
  if click.confirm("Verify credentials now?", default=True):
140
142
  try:
141
143
  session = mgr.authenticate(provider)
142
- console.print(f"[green]Authentication successful![/] Session expires: {session.expires_at}")
144
+ console.print(
145
+ f"[green]Authentication successful![/] Session expires: {session.expires_at}"
146
+ )
143
147
  except Exception as exc:
144
148
  console.print(f"[red]Authentication failed: {exc}[/]")
145
149
 
@@ -222,7 +226,9 @@ def auth_remove(provider: str, yes: bool) -> None:
222
226
 
223
227
 
224
228
  @auth.command(name="export")
225
- @click.option("--provider", default=None, help="Export only this provider (default: all).")
229
+ @click.option(
230
+ "--provider", default=None, help="Export only this provider (default: all)."
231
+ )
226
232
  @click.option(
227
233
  "--output",
228
234
  "-o",
@@ -30,6 +30,7 @@ def config() -> None:
30
30
  def config_show(as_json: bool) -> None:
31
31
  """Show the effective configuration (all layers merged)."""
32
32
  import json
33
+
33
34
  from pygeofetch.config.settings import get_settings
34
35
 
35
36
  settings = get_settings()
@@ -40,6 +41,7 @@ def config_show(as_json: bool) -> None:
40
41
  return
41
42
 
42
43
  import yaml
44
+
43
45
  rendered = yaml.dump(data, default_flow_style=False, sort_keys=True)
44
46
  console.print(Syntax(rendered, "yaml", theme="monokai"))
45
47
 
@@ -85,7 +87,7 @@ def config_set(key: str, value: str) -> None:
85
87
  pygeofetch config set download.parallel 4
86
88
  pygeofetch config set cache.ttl_seconds 7200
87
89
  """
88
- from pygeofetch.config.settings import get_settings, save_user_config
90
+ from pygeofetch.config.settings import save_user_config
89
91
 
90
92
  # Try to coerce to typed value
91
93
  typed_value: object = value