PyGeoFetch 1.0.2__tar.gz → 1.0.4__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.
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/PKG-INFO +35 -8
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/README.md +30 -3
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/__init__.py +2 -2
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/main.py +4 -5
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/core/authenticator.py +30 -1
- pygeofetch-1.0.4/pygeofetch/core/downloader.py +676 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/core/engine.py +116 -11
- pygeofetch-1.0.4/pygeofetch/core/logging.py +199 -0
- pygeofetch-1.0.4/pygeofetch/core/orbits.py +241 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/core/searcher.py +3 -8
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/models/satellite_data.py +220 -9
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/models/search_query.py +19 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/pipeline.py +63 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/airbus_oneatlas.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/alaska_satellite_facility.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/aws_earth.py +9 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/copernicus.py +137 -15
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/digitalglobe.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/earth_explorer_additional.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/element84.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/esa_scihub.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/geoserver_generic.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/google_earth_engine.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/inpe_cbers.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/isro_bhuvan.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/jaxa_earth.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/maxar_gbdx.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/nasa_earthdata.py +6 -2
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/nasa_earthdata_cloud.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/noaa_big_data.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/opentopography.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/planet.py +6 -2
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/planetary_computer.py +11 -12
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/sentinel_hub.py +5 -1
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/terrabotics.py +4 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/usgs.py +42 -15
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/utils/geo_utils.py +26 -0
- pygeofetch-1.0.4/pygeofetch/utils/logging_setup.py +45 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch.egg-info/PKG-INFO +35 -8
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch.egg-info/SOURCES.txt +4 -1
- pygeofetch-1.0.4/pygeofetch.egg-info/entry_points.txt +2 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch.egg-info/requires.txt +1 -1
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pyproject.toml +7 -7
- pygeofetch-1.0.4/tests/test_pgv_integration_contract.py +945 -0
- pygeofetch-1.0.2/pygeofetch/core/downloader.py +0 -354
- pygeofetch-1.0.2/pygeofetch/utils/logging_setup.py +0 -107
- pygeofetch-1.0.2/pygeofetch.egg-info/entry_points.txt +0 -2
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/LICENSE +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/__init__.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/auth_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/config_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/download_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/index_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/pipeline_process_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/postprocess_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/preprocess_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/sar_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/cli/search_commands.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/config/__init__.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/config/defaults.yaml +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/config/settings.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/core/__init__.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/core/cache_manager.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/core/scheduler.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/models/__init__.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/models/download_task.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/models/user_auth.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/__init__.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/base.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/batch.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/indices.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/postprocessor.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/preprocessor.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/processing/sar.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/__init__.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/providers/base.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/utils/__init__.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/utils/file_utils.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/utils/retry_handler.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch/utils/validators.py +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch.egg-info/dependency_links.txt +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch.egg-info/not-zip-safe +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/pygeofetch.egg-info/top_level.txt +0 -0
- {pygeofetch-1.0.2 → pygeofetch-1.0.4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pygeofetch
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.4
|
|
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
|
|
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
|
|
31
|
-
Project-URL: Bug Tracker, https://github.com/pygeofetch/
|
|
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:
|
|
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
|
-
|
|
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
|
-
©
|
|
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
|
-
|
|
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
|
-
©
|
|
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
|
+
PyGeoFetch v1.0.4 — 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.
|
|
33
|
+
__version__ = "1.0.4"
|
|
34
34
|
__author__ = "PyGeoFetch Contributors"
|
|
35
35
|
__license__ = "MIT"
|
|
36
36
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
PyGeoFetch CLI v1.0.
|
|
2
|
+
PyGeoFetch CLI v1.0.4 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.
|
|
62
|
+
PyGeoFetch v1.0.4 — 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.
|
|
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.
|