PyGeoFetch 1.0.2__tar.gz → 1.0.3__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 (84) hide show
  1. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/PKG-INFO +35 -8
  2. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/README.md +30 -3
  3. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/__init__.py +2 -2
  4. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/main.py +4 -5
  5. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/core/authenticator.py +30 -1
  6. pygeofetch-1.0.3/pygeofetch/core/downloader.py +676 -0
  7. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/core/engine.py +116 -11
  8. pygeofetch-1.0.3/pygeofetch/core/logging.py +199 -0
  9. pygeofetch-1.0.3/pygeofetch/core/orbits.py +241 -0
  10. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/core/searcher.py +3 -8
  11. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/models/satellite_data.py +220 -9
  12. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/models/search_query.py +19 -0
  13. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/pipeline.py +63 -0
  14. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/airbus_oneatlas.py +4 -0
  15. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/alaska_satellite_facility.py +4 -0
  16. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/aws_earth.py +9 -0
  17. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/copernicus.py +8 -4
  18. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/digitalglobe.py +4 -0
  19. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/earth_explorer_additional.py +4 -0
  20. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/element84.py +4 -0
  21. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/esa_scihub.py +4 -0
  22. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/geoserver_generic.py +4 -0
  23. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/google_earth_engine.py +4 -0
  24. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/inpe_cbers.py +4 -0
  25. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/isro_bhuvan.py +4 -0
  26. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/jaxa_earth.py +4 -0
  27. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/maxar_gbdx.py +4 -0
  28. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/nasa_earthdata.py +6 -2
  29. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/nasa_earthdata_cloud.py +4 -0
  30. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/noaa_big_data.py +4 -0
  31. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/opentopography.py +4 -0
  32. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/planet.py +6 -2
  33. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/planetary_computer.py +11 -12
  34. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/sentinel_hub.py +5 -1
  35. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/terrabotics.py +4 -0
  36. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/usgs.py +42 -15
  37. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/utils/geo_utils.py +26 -0
  38. pygeofetch-1.0.3/pygeofetch/utils/logging_setup.py +45 -0
  39. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch.egg-info/PKG-INFO +35 -8
  40. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch.egg-info/SOURCES.txt +4 -1
  41. pygeofetch-1.0.3/pygeofetch.egg-info/entry_points.txt +2 -0
  42. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch.egg-info/requires.txt +1 -1
  43. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pyproject.toml +7 -7
  44. pygeofetch-1.0.3/tests/test_pgv_integration_contract.py +945 -0
  45. pygeofetch-1.0.2/pygeofetch/core/downloader.py +0 -354
  46. pygeofetch-1.0.2/pygeofetch/utils/logging_setup.py +0 -107
  47. pygeofetch-1.0.2/pygeofetch.egg-info/entry_points.txt +0 -2
  48. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/LICENSE +0 -0
  49. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/__init__.py +0 -0
  50. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/auth_commands.py +0 -0
  51. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/config_commands.py +0 -0
  52. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/download_commands.py +0 -0
  53. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/index_commands.py +0 -0
  54. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/pipeline_process_commands.py +0 -0
  55. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/postprocess_commands.py +0 -0
  56. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/preprocess_commands.py +0 -0
  57. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/sar_commands.py +0 -0
  58. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/cli/search_commands.py +0 -0
  59. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/config/__init__.py +0 -0
  60. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/config/defaults.yaml +0 -0
  61. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/config/settings.py +0 -0
  62. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/core/__init__.py +0 -0
  63. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/core/cache_manager.py +0 -0
  64. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/core/scheduler.py +0 -0
  65. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/models/__init__.py +0 -0
  66. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/models/download_task.py +0 -0
  67. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/models/user_auth.py +0 -0
  68. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/__init__.py +0 -0
  69. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/base.py +0 -0
  70. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/batch.py +0 -0
  71. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/indices.py +0 -0
  72. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/postprocessor.py +0 -0
  73. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/preprocessor.py +0 -0
  74. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/processing/sar.py +0 -0
  75. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/__init__.py +0 -0
  76. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/providers/base.py +0 -0
  77. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/utils/__init__.py +0 -0
  78. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/utils/file_utils.py +0 -0
  79. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/utils/retry_handler.py +0 -0
  80. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch/utils/validators.py +0 -0
  81. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch.egg-info/dependency_links.txt +0 -0
  82. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch.egg-info/not-zip-safe +0 -0
  83. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/pygeofetch.egg-info/top_level.txt +0 -0
  84. {pygeofetch-1.0.2 → pygeofetch-1.0.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pygeofetch
3
- Version: 1.0.2
3
+ Version: 1.0.3
4
4
  Summary: Universal satellite data pipeline — unified access to 22+ providers
5
5
  Author: PyGeoFetch Contributors
6
6
  License: MIT License
@@ -25,10 +25,10 @@ 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/pygeofetch/PyGeoFetch
28
+ Project-URL: Homepage, https://github.com/appiahkubis14/pygeofetch
29
29
  Project-URL: Documentation, https://pygeofetch.readthedocs.io
30
- Project-URL: Repository, https://github.com/pygeofetch/PyGeoFetch
31
- Project-URL: Bug Tracker, https://github.com/pygeofetch/PyGeoFetch/issues
30
+ Project-URL: Repository, https://github.com/appiahkubis14/pygeofetch
31
+ Project-URL: Bug Tracker, https://github.com/appiahkubis14/pygeofetch/issues
32
32
  Keywords: satellite,remote-sensing,GIS,earth-observation,geospatial
33
33
  Classifier: Development Status :: 5 - Production/Stable
34
34
  Classifier: Intended Audience :: Science/Research
@@ -80,10 +80,9 @@ Requires-Dist: ruff>=0.3; extra == "dev"
80
80
  Requires-Dist: mypy>=1.8; extra == "dev"
81
81
  Requires-Dist: bump2version>=1.0; extra == "dev"
82
82
  Provides-Extra: all
83
- Requires-Dist: PyGeoFetch[cloud,dev,geo,schedule]; extra == "all"
83
+ Requires-Dist: pygeofetch[cloud,dev,geo,schedule]; extra == "all"
84
84
  Dynamic: license-file
85
85
 
86
-
87
86
  <div align="center">
88
87
 
89
88
  <!-- <img src="https://appiahkubis14.github.io/portfolio/logo/samuel_logo_dark.svg" alt="PyGeoFetch Logo" width="200"/> -->
@@ -137,7 +136,7 @@ Existing tools address parts of this problem: EODAG supports several providers b
137
136
 
138
137
  ---
139
138
 
140
- ## 🚀 Key Features
139
+
141
140
 
142
141
  ### 🛰️ 22+ Satellite Providers
143
142
 
@@ -537,6 +536,34 @@ COMPLETION
537
536
 
538
537
  ---
539
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
+
540
567
  ## 📚 Notebooks
541
568
 
542
569
  | Notebook | Topics |
@@ -585,4 +612,4 @@ pytest tests/unit/ -v
585
612
 
586
613
  PyGeoFetch is free and open source software, licensed under the [MIT License](LICENSE).
587
614
 
588
- © 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.
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.
@@ -1,4 +1,3 @@
1
-
2
1
  <div align="center">
3
2
 
4
3
  <!-- <img src="https://appiahkubis14.github.io/portfolio/logo/samuel_logo_dark.svg" alt="PyGeoFetch Logo" width="200"/> -->
@@ -52,7 +51,7 @@ Existing tools address parts of this problem: EODAG supports several providers b
52
51
 
53
52
  ---
54
53
 
55
- ## 🚀 Key Features
54
+
56
55
 
57
56
  ### 🛰️ 22+ Satellite Providers
58
57
 
@@ -452,6 +451,34 @@ COMPLETION
452
451
 
453
452
  ---
454
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
+
455
482
  ## 📚 Notebooks
456
483
 
457
484
  | Notebook | Topics |
@@ -500,4 +527,4 @@ pytest tests/unit/ -v
500
527
 
501
528
  PyGeoFetch is free and open source software, licensed under the [MIT License](LICENSE).
502
529
 
503
- © 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.
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.
@@ -1,5 +1,5 @@
1
1
  """
2
- PyGeoFetch v1.0.2 — Universal Satellite Data Pipeline.
2
+ PyGeoFetch v1.0.3 — 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,7 +30,7 @@ CLI::
30
30
  pygeofetch doctor
31
31
  """
32
32
 
33
- __version__ = "1.0.2"
33
+ __version__ = "1.0.3"
34
34
  __author__ = "PyGeoFetch Contributors"
35
35
  __license__ = "MIT"
36
36
 
@@ -1,5 +1,5 @@
1
1
  """
2
- PyGeoFetch CLI v1.0.2 main entry point.
2
+ PyGeoFetch CLI v1.0.3 main entry point.
3
3
 
4
4
  Full command reference:
5
5
  pygeofetch auth — credential management
@@ -59,7 +59,7 @@ def cli(ctx: click.Context, log_level: str, log_file: str, log_format: str,
59
59
  config_file: str) -> None:
60
60
  """
61
61
  \b
62
- PyGeoFetch v1.0.2 — Universal Satellite Data Pipeline
62
+ PyGeoFetch v1.0.3 — Universal Satellite Data Pipeline
63
63
  ===========================================================
64
64
  Unified access to 22+ satellite data providers.
65
65
 
@@ -74,8 +74,7 @@ def cli(ctx: click.Context, log_level: str, log_file: str, log_format: str,
74
74
  from pathlib import Path
75
75
  setup_logging(
76
76
  level=log_level,
77
- log_file=Path(log_file) if log_file else None,
78
- use_rich=(log_format == "console"),
77
+ log_file=str(Path(log_file)) if log_file else None,
79
78
  )
80
79
  ctx.ensure_object(dict)
81
80
  ctx.obj["log_level"] = log_level
@@ -777,4 +776,4 @@ def main() -> None:
777
776
 
778
777
 
779
778
  if __name__ == "__main__":
780
- main()
779
+ main()
@@ -27,7 +27,7 @@ from pathlib import Path
27
27
  from typing import Any, Dict, List, Optional
28
28
 
29
29
  from pygeofetch.models.user_auth import AuthSession, AuthType, Credentials
30
- from pygeofetch.utils.logging_setup import get_logger
30
+ from pygeofetch.core.logging import get_logger
31
31
 
32
32
  logger = get_logger(__name__)
33
33
 
@@ -295,6 +295,35 @@ class AuthManager:
295
295
  self._sessions.pop(provider, None)
296
296
  logger.info(f"Credentials saved for provider {provider!r}")
297
297
 
298
+
299
+ def add_credentials(
300
+ self,
301
+ provider: str,
302
+ creds: Dict[str, Any],
303
+ ) -> None:
304
+ """
305
+ Store credentials for the given provider.
306
+
307
+ Accepts a dict (not keyword arguments — the engine passes a dict).
308
+ Idempotent: calling twice with same provider updates, does not duplicate.
309
+ Not raise for unknown provider names.
310
+
311
+ Args:
312
+ provider: Provider identifier e.g. "usgs", "planetary_computer"
313
+ creds: Dict with any of: username, password, api_key,
314
+ client_id, client_secret, token, access_key, secret_key.
315
+ Only non-None values are stored.
316
+ """
317
+ # Filter out None values and the redundant "provider" key
318
+ clean_creds = {k: v for k, v in creds.items()
319
+ if k != "provider" and v is not None}
320
+ if not clean_creds:
321
+ logger.warning(f"No credentials provided for {provider!r} — skipping")
322
+ return
323
+ # Delegate to add() which handles storage, session invalidation, type inference
324
+ self.add(provider, **clean_creds)
325
+ logger.debug(f"Stored credentials for provider: {provider}")
326
+
298
327
  def get_credentials(self, provider: str) -> Optional[Credentials]:
299
328
  """
300
329
  Load stored credentials for a provider.