Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
114 lines (105 loc) · 4.34 KB
/
Copy pathpyproject.toml
File metadata and controls
114 lines (105 loc) · 4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
[project]
name = "rise-eo"
version = "0.3.0"
description = "Fetch satellite tiles and build datacubes (clean rewrite). Sentinel-2 L2A via CDSE; cloud-agnostic by design."
authors = [{ name = "Nikhil Sasi Rajan", email = "nsasiraj@umd.edu" }]
readme = "README.md"
requires-python = ">=3.11"
# Core deps only. Plotting/sklearn live in the [notebooks] extra; Azure backends
# live in the [azure] extra (spec 31, P1). See specs/09-notebooks.md.
dependencies = [
"numpy",
"pandas",
"geopandas",
"shapely",
"rasterio",
"pyarrow", # GeoParquet catalog
"fsspec", # storage seam (specs/10)
"pystac", # STAC export view of the tile catalog (specs/17)
"pystac-client", # CDSE STAC catalog discovery (anonymous; replaces sentinelhub)
"numba", # median-mosaic kernel
"tqdm",
"packaging", # PEP 508 parsing for bundle requirement checks (specs/44 D5)
]
[project.scripts]
rise-eo = "rise_eo.cli:main"
[project.optional-dependencies]
# Neither of these is ever imported by src/rise_eo/, so both are config, not code (#80).
# snakemake is invoked as a subprocess (`sys.executable -m snakemake`) and s3fs is an
# fsspec backend resolved by URL scheme -- so moving them out costs zero import-time
# risk and takes the core closure from 104 packages / 689 MB to 51 / 578.
local = [ # the local runner only (workflows/runners.py, specs/08)
"snakemake",
]
s3 = [ # S3-compatible transport, any endpoint: CDSE EODATA, AWS, MinIO
"s3fs", # an fsspec backend -- resolved by URL scheme, never imported
]
notebooks = [
"matplotlib",
"seaborn",
"ipywidgets",
"scikit-learn",
"joblib",
]
model-example = [ # for examples/eurocrops_rf.py + tests/manual/deploy.md + demos/ (not rise-eo core)
"scikit-learn",
"joblib",
"matplotlib",
"seaborn",
]
grid = [ # ROI → S2-grid tiling (rise_eo.grid); optional so core stays lean (spec 19)
"s2",
"s2cell",
]
azure = [ # P1 compute seam (spec 31), opt-in — core stays lean
"adlfs", # fsspec Azure Blob backend
"azure-identity", # DefaultAzureCredential (adlfs auto-resolves it; GDAL VSI token needs it directly)
"azure-keyvault-secrets", # spec 37 D5: read CDSE creds / PC_SDK_SUBSCRIPTION_KEY from Key Vault
]
aml = [ # P2 compute seam (spec 36): the Azure ML scale runner, opt-in
"azure-ai-ml", # AML SDK v2 -- command jobs, environments, compute (runner="aml" only)
]
mpc = [ # MPC source (spec 32): Microsoft Planetary Computer signing
# Official signing package. We call `pc.sign_inplace` (sources/mpc.py) as the
# pystac_client Client modifier — spec 32 D4. Pinned to the major we validated
# against real MPC traffic (1.0.0, runbook 32 v2, 2026-07-16); <2 guards the next
# major, which is where that API is allowed to break. Same discipline as
# rio-tiler>=6,<8 below. Unbounded, this breaks on a FRESH install (new dev, CI,
# an Azure Batch node) long after the change that caused it — never on a machine
# that already has it.
"planetary-computer>=1,<2",
]
titiler = [ # P5 serving validation (spec 29 Tier 1; grows for Tier 2). NOT rise-eo core.
"rio-tiler>=6,<8", # the COG tile read + render (the pre-styled route)
"fastapi", # the app
"uvicorn[standard]", # ASGI server
# titiler.core / titiler.mosaic are added in Tier 2 (pgSTAC); Tier 1 needs only rio-tiler.
]
serving = [ # P5 serving Tier 2 (spec 30): stac-geoparquet export. NOT rise-eo core.
"stac-geoparquet",
]
dev = [
"ruff",
"pytest",
]
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-data]
"rise_eo" = ["workflows/_snakefiles/**/*"]
[tool.ruff]
line-length = 100
target-version = "py311"
[tool.ruff.lint]
# Pin the rule set explicitly. `ruff` is unpinned in [dev], and 0.16 widened its
# *default* selection -- a bare `ruff check src/ tests/` (the command CLAUDE.md and
# the run-books document) then reported ~357 pre-existing hits on unchanged code.
# These five are ruff's historical default (E4,E7,E9,F) plus import sorting.
select = ["E4", "E7", "E9", "F", "I"]
[tool.pytest.ini_options]
testpaths = ["tests"]
markers = [
"network: tests that hit the network (CDSE/S3); opt-in",
]