earthcatalog 0.2.0__py3-none-any.whl

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 (50) hide show
  1. earthcatalog/__init__.py +164 -0
  2. earthcatalog/async_http_client.py +1006 -0
  3. earthcatalog/config.py +97 -0
  4. earthcatalog/engines/__init__.py +308 -0
  5. earthcatalog/engines/rustac_engine.py +142 -0
  6. earthcatalog/engines/stac_geoparquet_engine.py +126 -0
  7. earthcatalog/exceptions.py +471 -0
  8. earthcatalog/grid_systems.py +1114 -0
  9. earthcatalog/ingestion_pipeline.py +2281 -0
  10. earthcatalog/input_readers.py +603 -0
  11. earthcatalog/job_tracking.py +485 -0
  12. earthcatalog/pipeline.py +606 -0
  13. earthcatalog/schema_generator.py +911 -0
  14. earthcatalog/spatial_resolver.py +1207 -0
  15. earthcatalog/stac_hooks.py +754 -0
  16. earthcatalog/statistics.py +677 -0
  17. earthcatalog/storage_backends.py +548 -0
  18. earthcatalog/tests/__init__.py +1 -0
  19. earthcatalog/tests/conftest.py +76 -0
  20. earthcatalog/tests/test_all_grids.py +793 -0
  21. earthcatalog/tests/test_async_http.py +700 -0
  22. earthcatalog/tests/test_cli_and_storage.py +230 -0
  23. earthcatalog/tests/test_config.py +245 -0
  24. earthcatalog/tests/test_dask_integration.py +580 -0
  25. earthcatalog/tests/test_e2e_synthetic.py +1624 -0
  26. earthcatalog/tests/test_engines.py +272 -0
  27. earthcatalog/tests/test_exceptions.py +346 -0
  28. earthcatalog/tests/test_file_structure.py +245 -0
  29. earthcatalog/tests/test_input_readers.py +666 -0
  30. earthcatalog/tests/test_integration.py +200 -0
  31. earthcatalog/tests/test_integration_async.py +283 -0
  32. earthcatalog/tests/test_job_tracking.py +603 -0
  33. earthcatalog/tests/test_multi_file_input.py +336 -0
  34. earthcatalog/tests/test_passthrough_hook.py +196 -0
  35. earthcatalog/tests/test_pipeline.py +684 -0
  36. earthcatalog/tests/test_pipeline_components.py +665 -0
  37. earthcatalog/tests/test_schema_generator.py +506 -0
  38. earthcatalog/tests/test_spatial_resolver.py +413 -0
  39. earthcatalog/tests/test_stac_hooks.py +776 -0
  40. earthcatalog/tests/test_statistics.py +477 -0
  41. earthcatalog/tests/test_storage_backends.py +236 -0
  42. earthcatalog/tests/test_validation.py +435 -0
  43. earthcatalog/tests/test_workers.py +653 -0
  44. earthcatalog/validation.py +921 -0
  45. earthcatalog/workers.py +682 -0
  46. earthcatalog-0.2.0.dist-info/METADATA +333 -0
  47. earthcatalog-0.2.0.dist-info/RECORD +50 -0
  48. earthcatalog-0.2.0.dist-info/WHEEL +5 -0
  49. earthcatalog-0.2.0.dist-info/entry_points.txt +3 -0
  50. earthcatalog-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,333 @@
1
+ Metadata-Version: 2.4
2
+ Name: earthcatalog
3
+ Version: 0.2.0
4
+ Summary: earthcatalog is a scalable STAC ingestion library for partitioned GeoParquet catalogs
5
+ Author-email: betolink <betolin@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/betolink/earthcatalog
8
+ Project-URL: Repository, https://github.com/betolink/earthcatalog
9
+ Project-URL: Issues, https://github.com/betolink/earthcatalog/issues
10
+ Keywords: stac,geoparquet,geospatial,distributed,ingestion,catalog
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Scientific/Engineering :: GIS
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Requires-Python: >=3.11
21
+ Description-Content-Type: text/markdown
22
+ Requires-Dist: pandas>=2.3.3
23
+ Requires-Dist: pyarrow>=16.1.0
24
+ Requires-Dist: geopandas>=1.1.0
25
+ Requires-Dist: shapely>=2.1.2
26
+ Requires-Dist: stac-geoparquet>=0.2.0
27
+ Requires-Dist: fsspec>=2025.10.0
28
+ Requires-Dist: requests>=2.31.0
29
+ Requires-Dist: fastparquet>=2024.11.0
30
+ Requires-Dist: obstore>=0.5.1
31
+ Requires-Dist: tqdm>=4.66.4
32
+ Requires-Dist: rustac[arrow]>=0.9.0
33
+ Requires-Dist: PyYAML>=6.0.0
34
+ Requires-Dist: h3>=3.9.0
35
+ Requires-Dist: s2sphere>=0.2.5
36
+ Requires-Dist: mgrs>=1.5.0
37
+ Requires-Dist: s3fs>=2025.1.0
38
+ Requires-Dist: aiohttp>=3.9.0
39
+ Requires-Dist: aiofiles>=23.0.0
40
+ Provides-Extra: dask
41
+ Requires-Dist: dask[distributed]>=2025.1.0; extra == "dask"
42
+ Provides-Extra: all
43
+ Requires-Dist: dask[distributed]>=2025.1.0; extra == "all"
44
+ Provides-Extra: dev
45
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
46
+ Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
47
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
48
+ Requires-Dist: aioresponses>=0.7.0; extra == "dev"
49
+ Requires-Dist: black>=24.0.0; extra == "dev"
50
+ Requires-Dist: ruff>=0.4.0; extra == "dev"
51
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
52
+ Requires-Dist: types-requests>=2.31.0; extra == "dev"
53
+ Requires-Dist: types-aiofiles>=23.0.0; extra == "dev"
54
+ Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
55
+ Requires-Dist: jinja2>=3.1.0; extra == "dev"
56
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
57
+ Provides-Extra: docs
58
+ Requires-Dist: mkdocs>=1.5.0; extra == "docs"
59
+ Requires-Dist: mkdocs-material>=9.0.0; extra == "docs"
60
+ Requires-Dist: mkdocs-mermaid2-plugin>=1.1.0; extra == "docs"
61
+ Requires-Dist: mkdocs-swagger-ui-tag>=0.6.0; extra == "docs"
62
+ Requires-Dist: mkdocs-gen-files>=0.5.0; extra == "docs"
63
+ Requires-Dist: mkdocs-git-revision-date-localized-plugin>=1.2.0; extra == "docs"
64
+ Requires-Dist: mkdocs-macros-plugin>=1.0.0; extra == "docs"
65
+ Requires-Dist: mike>=2.0.0; extra == "docs"
66
+ Requires-Dist: pymdown-extensions>=10.0.0; extra == "docs"
67
+
68
+ # EarthCatalog
69
+
70
+ <img src="docs/earthcatalog.png" alt="EarthCatalog Logo" width="200"/>
71
+
72
+ A library for processing STAC items into spatially partitioned GeoParquet catalogs.
73
+
74
+ ## Why EarthCatalog?
75
+
76
+ **The Problem**: Working with massive collections of geospatial data (satellite imagery, drone surveys, IoT sensors) is challenging because:
77
+
78
+ - Traditional databases struggle with spatial queries at scale
79
+ - Files become too large to process efficiently
80
+ - Spatial overlap makes data organization complex
81
+ - Updates may require full rebuilds
82
+
83
+ **EarthCatalog** transforms STAC items into fast, spatially-partitioned GeoParquet catalogs that:
84
+
85
+ - **Eliminate full table scans** - Query only relevant spatial partitions using spatial hive-partition pruning first.
86
+ - **Scale to terabytes** - Each partition is independently manageable
87
+ - **Support incremental updates** - Add new data without rebuilding the whole catalog
88
+ - **Handle complex geometries** - Smart global partitioning for multi-region items
89
+
90
+ ## Key Features
91
+
92
+ - **Smart Spatial Partitioning**: Multiple grid systems (H3, S2, UTM, MGRS, LatLon, Custom geojson)
93
+ - **Global Partition Schema**: Auto-routes large/complex geometries to global partitions
94
+ - **Temporal Binning**: Year, month, or day-based time partitioning
95
+ - **Distributed Processing**: Local multi-threading or Dask distributed
96
+ - **Incremental Updates**: Merge new data with existing partitions
97
+
98
+ ## Quick Start
99
+
100
+ ### Installation
101
+
102
+ ```bash
103
+ pip install earthcatalog
104
+
105
+ # With distributed processing support
106
+ pip install "earthcatalog[dask]"
107
+ ```
108
+
109
+ ### Basic Usage
110
+
111
+ ```bash
112
+ # Process STAC URLs into a spatial catalog
113
+ stac-ingest \
114
+ --input stac_urls.parquet \
115
+ --output ./catalog \
116
+ --scratch ./scratch \
117
+ --workers 4
118
+
119
+ # Generate schema metadata for efficient querying (enabled by default)
120
+ stac-ingest \
121
+ --input stac_urls.parquet \
122
+ --output ./catalog \
123
+ --scratch ./scratch \
124
+ --workers 4
125
+ ```
126
+
127
+ ### Example: Create Input Data
128
+
129
+ ```python
130
+ import pandas as pd
131
+
132
+ # Sample STAC item URLs
133
+ urls = [
134
+ "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2A_20240101_123456",
135
+ "https://earth-search.aws.element84.com/v1/collections/landsat-8-c2-l2/items/LC08_20240103_345678",
136
+ ]
137
+
138
+ df = pd.DataFrame({"url": urls})
139
+ df.to_parquet("stac_urls.parquet", index=False)
140
+ ```
141
+
142
+ ## Configuration Examples
143
+
144
+ ```bash
145
+ # Use S2 grid with daily partitioning
146
+ stac-ingest --input urls.parquet --output ./catalog --scratch ./scratch \
147
+ --grid s2 --grid-resolution 13 --temporal-bin day
148
+
149
+ # Enable global partitioning with custom thresholds
150
+ stac-ingest --input urls.parquet --output ./catalog --scratch ./scratch \
151
+ --global-thresholds-file custom-thresholds.json
152
+
153
+ # Distributed processing with Dask
154
+ stac-ingest --input s3://bucket/urls.parquet --output s3://bucket/catalog \
155
+ --scratch s3://bucket/scratch --processor dask --workers 16
156
+ ```
157
+
158
+ ### Example: Efficient Spatial Queries
159
+
160
+ ```python
161
+ # Traditional approach (slow - scans entire catalog)
162
+ import geopandas as gpd
163
+ from shapely.geometry import box
164
+
165
+ roi = box(-122.5, 37.7, -122.0, 38.0) # San Francisco area
166
+ df = gpd.read_parquet("catalog/**/*.parquet") # Reads EVERYTHING
167
+ results = df[df.intersects(roi)]
168
+ print(f"Found {len(results)} items (but scanned entire catalog)")
169
+
170
+ # EarthCatalog approach (fast - scans only relevant partitions)
171
+ from earthcatalog.spatial_resolver import spatial_resolver
172
+ import duckdb
173
+
174
+ resolver = spatial_resolver("catalog/catalog_schema.json")
175
+ partitions = resolver.resolve_partitions(roi)
176
+ paths = resolver.generate_query_paths(partitions)
177
+
178
+ result = duckdb.sql(f"SELECT * FROM read_parquet({paths})").df()
179
+ print(f"Found {len(result)} items (scanned only {len(partitions)} partitions)")
180
+
181
+ # Remote schema files (S3, GCS, Azure, HTTP) - requires fsspec
182
+ resolver = spatial_resolver("s3://my-bucket/catalog_schema.json", "s3://my-bucket/catalog/")
183
+ resolver = spatial_resolver("https://example.com/schema.json", "./local-catalog/")
184
+ ```
185
+
186
+ ## Output Structure
187
+
188
+ Uses Hive-style temporal partitioning for optimal query pruning in DuckDB, Athena, and Spark:
189
+
190
+ ```
191
+ catalog/
192
+ ├── {mission}/
193
+ │ └── partition=h3/
194
+ │ └── level=2/
195
+ │ ├── 8928308280fffff/
196
+ │ │ └── year=2024/
197
+ │ │ ├── month=01/
198
+ │ │ │ └── items.parquet # January 2024 items
199
+ │ │ └── month=02/
200
+ │ │ └── items.parquet
201
+ │ └── global/
202
+ │ └── year=2024/
203
+ │ └── month=01/
204
+ │ └── items.parquet # Large geometries spanning multiple cells
205
+ └── catalog_schema.json # Generated metadata for efficient querying (enabled by default)
206
+ ```
207
+
208
+ ## Schema Metadata and Efficient Querying
209
+
210
+ EarthCatalog generates comprehensive metadata about your catalog's partitioning scheme by default:
211
+
212
+ ```bash
213
+ # Schema is generated by default
214
+ stac-ingest --input urls.parquet --output ./catalog --scratch ./scratch
215
+
216
+ # Use custom schema filename
217
+ stac-ingest --input urls.parquet --output ./catalog --scratch ./scratch \
218
+ --schema-filename my_catalog_schema.json
219
+
220
+ # Disable schema generation
221
+ stac-ingest --input urls.parquet --output ./catalog --scratch ./scratch \
222
+ --no-generate-schema
223
+ ```
224
+
225
+ The generated schema includes:
226
+
227
+ - **Grid system details**: Type, resolution, cell sizes, coordinate system
228
+ - **Partition structure**: All spatial and temporal partitions created
229
+ - **Usage examples**: DuckDB queries for efficient partition pruning
230
+ - **Statistics**: Item counts, partition counts, processing info
231
+
232
+ ### Automatic Global Partition Detection
233
+
234
+ The resolver intelligently includes the **global partition** when needed:
235
+
236
+ ```python
237
+ # Threshold-based inclusion (queries spanning many cells include global)
238
+ large_area = box(-130, 30, -110, 50) # Multi-state region
239
+ partitions = resolver.resolve_partitions(large_area)
240
+ # Includes 'global' because query spans > threshold cells
241
+
242
+ # Geography-based inclusion (continental-scale areas include global)
243
+ continental = box(-180, -60, 180, 80) # Nearly global extent
244
+ partitions = resolver.resolve_partitions(continental)
245
+ # Includes 'global' because geometry area > large geometry threshold
246
+
247
+ # Manual control when needed
248
+ partitions_no_global = resolver.resolve_partitions(large_area, include_global=False)
249
+ partitions_force_global = resolver.resolve_partitions(small_area, include_global=True)
250
+ ```
251
+
252
+ ### Remote Schema Files
253
+
254
+ The `spatial_resolver()` function supports schema files stored in cloud storage or remote locations:
255
+
256
+ ```python
257
+ from earthcatalog.spatial_resolver import spatial_resolver
258
+
259
+ # S3 (requires fsspec[s3])
260
+ resolver = spatial_resolver("s3://my-bucket/catalog_schema.json", "s3://my-bucket/catalog/")
261
+
262
+ # Google Cloud Storage (requires fsspec[gcs])
263
+ resolver = spatial_resolver("gs://my-bucket/catalog_schema.json", "gs://my-bucket/catalog/")
264
+
265
+ # Azure Blob Storage (requires fsspec[azure])
266
+ resolver = spatial_resolver("abfs://container/catalog_schema.json", "abfs://container/catalog/")
267
+
268
+ # HTTP/HTTPS
269
+ resolver = spatial_resolver("https://example.com/catalog_schema.json", "./local-catalog/")
270
+
271
+ # Mixed: Remote schema with local catalog
272
+ resolver = spatial_resolver("s3://bucket/schema.json", "/local/catalog/")
273
+ ```
274
+
275
+ **Requirements:**
276
+
277
+ - Install fsspec with appropriate extras: `pip install fsspec[s3]`, `fsspec[gcs]`, `fsspec[azure]`
278
+ - The `catalog_path` parameter is required for remote schema files
279
+ - Authentication follows fsspec conventions (AWS credentials, service accounts, etc.)
280
+
281
+ ### Grid-Specific Resolution
282
+
283
+ **Key Benefits:**
284
+
285
+ - **Automatic Resolution**: No need to manually calculate grid intersections
286
+ - **All Grid Systems**: Works with H3, S2, MGRS, UTM, LatLon, and custom GeoJSON
287
+ - **Configurable Overlap**: Control boundary handling and buffer zones
288
+ - **Performance**: Query only relevant partitions instead of full catalog scan
289
+ - **DuckDB Integration**: Generates ready-to-use file path patterns
290
+
291
+ ## ⚡ Performance Benchmarks
292
+
293
+ **Query Performance Comparison** (San Francisco Bay Area query on global dataset):
294
+
295
+ | Metric | Without Pruning | With Spatial Resolution | Improvement |
296
+ |--------|-----------------|-------------------------|-------------|
297
+ | **Data Scanned** | 50GB+ | 6GB | **88.5% reduction** |
298
+ | **Query Time** | 45 seconds | 5.2 seconds | **8.7x faster** |
299
+ | **Memory Usage** | 12GB | 2.1GB | **82% reduction** |
300
+ | **Files Read** | 15,000+ | 1,200 | **92% fewer files** |
301
+
302
+ **Grid System Performance** (typical regional query):
303
+
304
+ - **H3 Resolution 6**: 8-12 cells → ~85-90% data reduction
305
+ - **MGRS 100km**: 1-4 zones → ~95-98% data reduction
306
+ - **Custom GeoJSON**: Variable based on tile design
307
+
308
+ ## Documentation
309
+
310
+ - 📖 **[Full Documentation](docs/)** - Complete guides and API reference
311
+ - 🏁 **[Quick Start Guide](docs/quickstart.md)** - Get up and running in minutes
312
+ - ⚙️ **[Configuration Guide](docs/configuration.md)** - All configuration options
313
+ - 🌍 **[Global Partitioning](docs/concepts/grids/global-partitioning.md)** - Handle large/complex geometries
314
+ - 🔧 **[API Reference](docs/api-reference/)** - Python and CLI documentation
315
+
316
+ ## Contributing
317
+
318
+ ```bash
319
+ # Development setup
320
+ git clone https://github.com/betolink/earthcatalog.git
321
+ cd earthcatalog
322
+ pip install -e ".[dev]"
323
+
324
+ # Run tests
325
+ python -m pytest
326
+
327
+ # Format and lint
328
+ black earthcatalog/ && ruff check earthcatalog/
329
+ ```
330
+
331
+ ## License
332
+
333
+ MIT License - see LICENSE file for details.
@@ -0,0 +1,50 @@
1
+ earthcatalog/__init__.py,sha256=a9g8WcidLX7gJ-SoWR87AEN44bRX-JcJxRsn280Ow4c,4954
2
+ earthcatalog/async_http_client.py,sha256=1xXMD7Mus408dlmuEWajtTwOOgte2TpCfz5EW-cPTXI,42052
3
+ earthcatalog/config.py,sha256=l9Gziyf0TONKSKZCqk_g5kIY3rIAWaUYFpyYRB04Z-w,2734
4
+ earthcatalog/exceptions.py,sha256=Qy8hSlERse9TF3e0BmRDXnk9C6VtBXHfzcv45gdFS-8,14072
5
+ earthcatalog/grid_systems.py,sha256=kpoB5dP4D6ROz2OpAWFOytYqqKDM91b-BZmYvvE_Udc,47150
6
+ earthcatalog/ingestion_pipeline.py,sha256=f1EuCQaa9S2liNb3U_DuhIZchO7r4Uk4WWUugOx3A_g,99782
7
+ earthcatalog/input_readers.py,sha256=fRov6EzDsfkh8N88K8FgpefEH48UJerHtH2791c0nSU,23855
8
+ earthcatalog/job_tracking.py,sha256=pyLMLdlNWHHcv4OICOwv9EAa1E2By8m1MxcvKQ17nHg,17006
9
+ earthcatalog/pipeline.py,sha256=EIyACkq7R5maiK_nsOP33lrT7hnr4wcQXD34jCg0TUo,20531
10
+ earthcatalog/schema_generator.py,sha256=cT226JdWcwKnShqN27OsMNJXjONkuvSLh1UpxV0B7sA,40118
11
+ earthcatalog/spatial_resolver.py,sha256=Ak3lERy4CLEk4J3wvDR5CN789_IISn1J3fHdZZeEsaM,52224
12
+ earthcatalog/stac_hooks.py,sha256=tYRNjHVGbDCNF2WRMPv4JfhGya7PZFB04V8XZI3BRds,26107
13
+ earthcatalog/statistics.py,sha256=xgb1PXdU3YamB12v2mQxZeO8uGby4r9F6wg4ZXblbmA,26324
14
+ earthcatalog/storage_backends.py,sha256=vVibswPXq6VngbrRhhK2qIGW0NttB9OZzNyQgDc2WyU,22235
15
+ earthcatalog/validation.py,sha256=5VTwLjbvd4rznbwxl-XTfhGxP-zupaFehRlMWBqLEG0,30597
16
+ earthcatalog/workers.py,sha256=PdohDDzxB2mAnU0zd_0uDh5zrPp5KwpLzlNQQczdtDE,24237
17
+ earthcatalog/engines/__init__.py,sha256=bfJRkHrwVMCL9NLjkh6J6liObqqEOyoVSCBucvBJvOc,10200
18
+ earthcatalog/engines/rustac_engine.py,sha256=PiXCyv29NrXtVjouo8lTYPpzME2wEIHDKMRSrkc86KY,4713
19
+ earthcatalog/engines/stac_geoparquet_engine.py,sha256=NdOBFh5Vw2UIlmmJWOfnioudjo8uKdA7E5BIjwkduSE,4267
20
+ earthcatalog/tests/__init__.py,sha256=in3W-IR5-Z0NoKAYpMD2drIf0uyCsgQW8Bi7a-130P0,43
21
+ earthcatalog/tests/conftest.py,sha256=-5ufEV9YQjv26EQXrOKxmwLc-1bUKhBZywhQgubjP5M,2125
22
+ earthcatalog/tests/test_all_grids.py,sha256=RD9KyKqCCCuo7pmUOuQ96nTJ_txTGyo58zrtSYuUNX4,28962
23
+ earthcatalog/tests/test_async_http.py,sha256=QZIBrjXAtyQRIh-U54WvsLXdRL2XDSbfxnonAaIx-po,27998
24
+ earthcatalog/tests/test_cli_and_storage.py,sha256=6UPXhVGg3BgW3zv-aJIc4EKQaRaip3EsPCPW2b9yhCs,7691
25
+ earthcatalog/tests/test_config.py,sha256=Vhr5QA3ojglRhsnhDopMNIvPd1XedUTYeD2lZL54R8o,8535
26
+ earthcatalog/tests/test_dask_integration.py,sha256=GiIMUDlPJwYe3BvI2dMLN-EqmQeGbuUOSXZoTZ82TsI,22730
27
+ earthcatalog/tests/test_e2e_synthetic.py,sha256=03UOwwcon8tW73oOuhsp04Ax-7t47cSYBZx4w-xo-tg,59896
28
+ earthcatalog/tests/test_engines.py,sha256=qA-GGBMkOw-VsfQWptwKMr1FUsHQYV3qSZq32RSj2dc,9640
29
+ earthcatalog/tests/test_exceptions.py,sha256=Q7gbe4gHYI2WdBcQH8TEVKcA9oKcDIVJjdijwVIgXFU,12169
30
+ earthcatalog/tests/test_file_structure.py,sha256=OkuSoWS2kXjwUPfI1NcFWLjKK_99uWKjScxMV5pqxec,9768
31
+ earthcatalog/tests/test_input_readers.py,sha256=61DZSq2NpqArCSmpa5GDRmaZZpNInh7ln3rTfVK-Egc,26534
32
+ earthcatalog/tests/test_integration.py,sha256=AHwu_eCLl5EB-fx5RzL3kmBQOhNDMxyMV_OD_xq5dSo,8756
33
+ earthcatalog/tests/test_integration_async.py,sha256=sObWqomMr84MXHx6kpS6wtGlKEsmySxndKblh-q7QTA,11686
34
+ earthcatalog/tests/test_job_tracking.py,sha256=aY9M6Lr3M31XKqUQJLsy_zVJm5dk0EPQBsV053c8Q54,21835
35
+ earthcatalog/tests/test_multi_file_input.py,sha256=Do9cv42BuohU6bTq8p7iEQ6dEWKHgQi-Yr6vLJbCqGI,13029
36
+ earthcatalog/tests/test_passthrough_hook.py,sha256=Uk-ikRuJ4LIvSZe6Sxa_kltf1nvW3wQ9syAeTL1r1k8,6441
37
+ earthcatalog/tests/test_pipeline.py,sha256=2j053U03LOUNwxPCH-jupt8_dW4DGA-EkszUyJeonio,26848
38
+ earthcatalog/tests/test_pipeline_components.py,sha256=nzCRjWMarTgPLgnfqr36YOgHaABTewjXOBb_74i1dI0,25177
39
+ earthcatalog/tests/test_schema_generator.py,sha256=YrXaXuhRCIC3BjEwO7jtigQL6aIwmx-rGeEvjDq5Ya0,20707
40
+ earthcatalog/tests/test_spatial_resolver.py,sha256=c-HccMyZrGYRbQGyZ6ZEqTVLiBPS5yx_ZdVl7IEAK7Q,16830
41
+ earthcatalog/tests/test_stac_hooks.py,sha256=Gv88VvjD-2M0KinqyqkTCFWzw345jYWEjKn06NpGyhw,26909
42
+ earthcatalog/tests/test_statistics.py,sha256=Ji_cvUWavdrLhR56vEw82NyagX0ReLCZVYvhteNk4IA,16761
43
+ earthcatalog/tests/test_storage_backends.py,sha256=CN98-jZ5ldAd0pO-S5Vd9yFmHRbyOzNTRx6S0rVNTag,8701
44
+ earthcatalog/tests/test_validation.py,sha256=sjEqZNoDBywrnUxWU_rtzJimYB0hxnz397V6ik_vR-c,15032
45
+ earthcatalog/tests/test_workers.py,sha256=646ZpB9mdZ7vgfXJyVRxmI9vBwR1kYua2hY7MtoI35I,22507
46
+ earthcatalog-0.2.0.dist-info/METADATA,sha256=K4FF2ED1z4Yaoidl_oIF3fVzswSaHmqTq8YeqJasrRc,12276
47
+ earthcatalog-0.2.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
48
+ earthcatalog-0.2.0.dist-info/entry_points.txt,sha256=uqWjpeJ7__vAyFqd10qX-SKkHbf_OicZZ_Q2vQwWLB4,78
49
+ earthcatalog-0.2.0.dist-info/top_level.txt,sha256=x1Z9NdhUf2o2WZCdpMMLwZlWJCeMo2t42zVyyI_wcgM,13
50
+ earthcatalog-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ stac-ingest = cli:main
3
+ stac-validate = cli:validate_command
@@ -0,0 +1 @@
1
+ earthcatalog