diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index aaa70b69..b594f520 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -35,7 +35,7 @@ repos:
- id: ruff-format
- repo: https://github.com/astral-sh/uv-pre-commit
- rev: "0.4.7"
+ rev: "0.4.12"
hooks:
- id: uv-lock
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5d768ae8..0a397ba3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,7 +36,10 @@
- Removed Broken Link "Introduction to NASA earthaccess"
([#779](https://github.com/nsidc/earthaccess/issues/779))
([**@Sherwin-14**](https://github.com/Sherwin-14))
-* Remove the base class on `EarthAccessFile` to fix method resolution
+- Restore automation for tidying notebooks used in documentation
+ ([#788](https://github.com/nsidc/earthaccess/issues/788))
+ ([**@itcarroll**](https://github.com/itcarroll))
+- Remove the base class on `EarthAccessFile` to fix method resolution
([#610](https://github.com/nsidc/earthaccess/issues/610))
([**@itcarroll**](https://github.com/itcarroll))
diff --git a/docs/howto/edl.ipynb b/docs/howto/edl.ipynb
index 5949ddb5..e5031eb1 100644
--- a/docs/howto/edl.ipynb
+++ b/docs/howto/edl.ipynb
@@ -14,7 +14,7 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"id": "ce723d6f-8b5f-43e1-9531-19ee08a056fe",
"metadata": {},
"outputs": [],
@@ -35,12 +35,12 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"id": "f1f45172-c9c3-4f25-ad7e-acf94fba8b1d",
"metadata": {},
"outputs": [],
"source": [
- "#s3_credentials = auth.get_s3_credentials(\"NSIDC\")"
+ "# s3_credentials = auth.get_s3_credentials(\"NSIDC\")"
]
},
{
@@ -63,7 +63,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"id": "a7bb1a93-6f85-40cd-93b4-ce821a03a8b5",
"metadata": {},
"outputs": [],
@@ -71,27 +71,16 @@
"nsidc_url = \"https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2019.02.21/ATL06_20190221121851_08410203_005_01.h5\"\n",
"lpcloud_url = \"https://data.lpdaac.earthdatacloud.nasa.gov/lp-prod-protected/EMITL2ARFL.001/EMIT_L2A_RFL_001_20220903T163129_2224611_012/EMIT_L2A_RFL_001_20220903T163129_2224611_012.nc\"\n",
"\n",
- "# this is a Python requests session \n",
+ "# this is a Python requests session\n",
"session = earthaccess.get_requests_https_session()"
]
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": null,
"id": "c0f4e286-8ce9-4cde-b3a2-631b361a0d51",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'�HDF\\r\\n\\x1a\\n\\x00\\x00\\x00\\x00\\x00\\x08\\x08\\x00\\x04\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00���������HUn\\x00\\x00\\x00\\x00��������\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00`\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00OHDR\\x02'"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"headers = {\"Range\": \"bytes=0-100\"}\n",
"r = session.get(lpcloud_url, headers=headers)\n",
@@ -108,7 +97,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"id": "1e5f5f7a-0643-42cb-b70c-4ac982824ff9",
"metadata": {},
"outputs": [],
@@ -118,21 +107,10 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"id": "fbc7bc5f-b984-4324-b095-3648a437fba2",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "b'\\x89HDF\\r\\n\\x1a\\n\\x00\\x00\\x00\\x00\\x00\\x08\\x08\\x00\\x04\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xd7HUn\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00`\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00OHDR'"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"with fs.open(lpcloud_url) as f:\n",
" data = f.read(100)\n",
@@ -141,451 +119,12 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"id": "07433a9f-f276-4d2b-9ed3-f556df2884af",
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c76e3afc58a84118a04144f2f08ff6bc",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "QUEUEING TASKS | : 0%| | 0/1 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "98f4219952eb4e9bb8f60ad67f438454",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "PROCESSING TASKS | : 0%| | 0/1 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "9451a7fda27e4569968054028576999d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "COLLECTING RESULTS | : 0%| | 0/1 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 1.4 s, sys: 179 ms, total: 1.58 s\n",
- "Wall time: 10.5 s\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "
\n",
- "
<xarray.Dataset> Size: 3kB\n",
- "Dimensions: (bands: 285)\n",
- "Dimensions without coordinates: bands\n",
- "Data variables:\n",
- " wavelengths (bands) float32 1kB ...\n",
- " fwhm (bands) float32 1kB ...\n",
- " good_wavelengths (bands) float32 1kB ...
"
- ],
- "text/plain": [
- " Size: 3kB\n",
- "Dimensions: (bands: 285)\n",
- "Dimensions without coordinates: bands\n",
- "Data variables:\n",
- " wavelengths (bands) float32 1kB ...\n",
- " fwhm (bands) float32 1kB ...\n",
- " good_wavelengths (bands) float32 1kB ..."
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
- "%%time \n",
+ "%%time\n",
"\n",
"import xarray as xr\n",
"\n",
@@ -613,7 +152,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.14"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/docs/tutorials/SSL.ipynb b/docs/tutorials/SSL.ipynb
index 265f1fd7..bed7877e 100644
--- a/docs/tutorials/SSL.ipynb
+++ b/docs/tutorials/SSL.ipynb
@@ -28,7 +28,6 @@
"source": [
"import earthaccess\n",
"\n",
- "\n",
"print(f\"using earthaccess v{earthaccess.__version__}\")\n",
"\n",
"auth = earthaccess.login()\n",
@@ -64,17 +63,24 @@
"outputs": [],
"source": [
"from pprint import pprint\n",
+ "\n",
"# We'll get 4 collections that match with our keywords\n",
"collections = earthaccess.search_datasets(\n",
- " keyword = \"SEA SURFACE HEIGHT\",\n",
- " cloud_hosted = True,\n",
- " count = 4\n",
+ " keyword=\"SEA SURFACE HEIGHT\",\n",
+ " cloud_hosted=True,\n",
+ " count=4,\n",
")\n",
"\n",
"# Let's print 2 collections\n",
"for collection in collections[0:2]:\n",
" # pprint(collection.summary())\n",
- " print(pprint(collection.summary()), collection.abstract(), \"\\n\", collection[\"umm\"][\"DOI\"], \"\\n\\n\")"
+ " print(\n",
+ " pprint(collection.summary()),\n",
+ " collection.abstract(),\n",
+ " \"\\n\",\n",
+ " collection[\"umm\"][\"DOI\"],\n",
+ " \"\\n\\n\",\n",
+ " )"
]
},
{
@@ -101,8 +107,8 @@
"outputs": [],
"source": [
"granules = earthaccess.search_data(\n",
- " short_name = \"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\",\n",
- " count = 1\n",
+ " short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\",\n",
+ " count=1,\n",
")"
]
},
@@ -182,9 +188,9 @@
"for year in range(1999, 2019):\n",
" print(f\"Retrieving data for year: {year}\")\n",
" results = earthaccess.search_data(\n",
- " doi = \"10.5067/SLREF-CDRV3\",\n",
+ " doi=\"10.5067/SLREF-CDRV3\",\n",
" temporal=(f\"{year}-05\", f\"{year}-05\"),\n",
- " count = 1,\n",
+ " count=1,\n",
" )\n",
" granules.append(results[0])\n",
"print(f\"Total granules: {len(granules)}\")"
@@ -213,7 +219,6 @@
"\n",
"import xarray as xr\n",
"\n",
- "\n",
"fileset = earthaccess.open(granules)\n",
"\n",
"print(f\" Using {type(fileset[0])} filesystem\")\n",
@@ -239,7 +244,11 @@
},
"outputs": [],
"source": [
- "ds.SLA.where((ds.SLA>=0) & (ds.SLA < 10)).std('Time').plot(figsize=(14,6), x='Longitude', y='Latitude')"
+ "(\n",
+ " ds.SLA.where((ds.SLA >= 0) & (ds.SLA < 10))\n",
+ " .std(\"Time\")\n",
+ " .plot(figsize=(14, 6), x=\"Longitude\", y=\"Latitude\")\n",
+ ")"
]
},
{
@@ -251,32 +260,35 @@
},
"outputs": [],
"source": [
- "from pyproj import Geod\n",
"import numpy as np\n",
+ "from pyproj import Geod\n",
+ "\n",
"\n",
"def ssl_area(lats):\n",
- " \"\"\"\n",
- " Calculate the area associated with a 1/6 by 1/6 degree box at latitude specified in 'lats'.\n",
+ " \"\"\"Calculate the area associated with a 1/6 by 1/6 degree box at latitude specified in \"lats\".\n",
"\n",
- " Parameter\n",
- " ==========\n",
- " lats: a list or numpy array of size N the latitudes of interest.\n",
+ " Parameters:\n",
+ " lats: a list or numpy array of size N the latitudes of interest.\n",
"\n",
- " Return\n",
- " =======\n",
- " out: Array (N) area values (unit: m^2)\n",
+ " Returns:\n",
+ " Array (N) area values (unit: m^2)\n",
" \"\"\"\n",
" # Define WGS84 as CRS:\n",
- " geod = Geod(ellps='WGS84')\n",
- " dx=1/12.0\n",
- " # TODO: explain this\n",
- " c_area=lambda lat: geod.polygon_area_perimeter(np.r_[-dx,dx,dx,-dx], lat+np.r_[-dx,-dx,dx,dx])[0]\n",
- " out=[]\n",
+ " geod = Geod(ellps=\"WGS84\")\n",
+ " # Set offsets for a box that will be centered at 0, lat\n",
+ " dx = 1 / 12.0\n",
+ " lon_offset = np.array((-dx, dx, dx, -dx))\n",
+ " lat_offset = np.array((-dx, -dx, dx, dx))\n",
+ " out = []\n",
" for lat in lats:\n",
- " out.append(c_area(lat))\n",
+ " # Run a geodesic area calculator for the given box\n",
+ " c_area, *_ = geod.polygon_area_perimeter(lon_offset, lat + lat_offset)\n",
+ " out.append(c_area)\n",
" return np.array(out)\n",
+ "\n",
+ "\n",
"# note: they rotated the data in the last release, this operation used to be (1,-1)\n",
- "ssh_area = ssl_area(ds.Latitude.data).reshape(-1,1)\n",
+ "ssh_area = ssl_area(ds.Latitude.data).reshape(-1, 1)\n",
"print(ssh_area.shape)"
]
},
@@ -297,42 +309,44 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "fb170068-cefb-4c16-b146-0ecbd2e603ad",
- "metadata": {
- "tags": []
- },
+ "id": "76ef1122-8185-4d68-ab94-88e19a8173f7",
+ "metadata": {},
"outputs": [],
"source": [
"%%time\n",
"\n",
- "import numpy as np\n",
"from matplotlib import pyplot as plt\n",
- "plt.rcParams[\"figure.figsize\"] = (16,4)\n",
+ "\n",
+ "plt.rcParams[\"figure.figsize\"] = (16, 4)\n",
"\n",
"img = plt.imread(\"underwater.jpeg\")\n",
"\n",
"fig, axs = plt.subplots()\n",
"plt.grid(True)\n",
"\n",
+ "\n",
"def global_mean(SLA, **kwargs):\n",
- " dout=((SLA*ssh_area).sum()/(SLA/SLA*ssh_area).sum())*1000\n",
+ " dout = ((SLA * ssh_area).sum() / (SLA / SLA * ssh_area).sum()) * 1000\n",
" return dout\n",
"\n",
- "result = ds.SLA.groupby('Time').apply(global_mean)\n",
"\n",
- "plt.xlabel('Time (year)',fontsize=16)\n",
- "plt.ylabel('Global Mean SLA (meter)',fontsize=12)\n",
+ "result = ds.SLA.groupby(\"Time\").apply(global_mean)\n",
+ "\n",
+ "plt.xlabel(\"Time (year)\", fontsize=16)\n",
+ "plt.ylabel(\"Global Mean SLA (meter)\", fontsize=12)\n",
"# axs.imshow(img, aspect='auto')\n",
"plt.grid(True)\n",
"\n",
- "historic_ts=xr.open_dataset(gmsl)\n",
+ "historic_ts = xr.open_dataset(gmsl)\n",
"\n",
- "result.plot(ax=axs, color=\"orange\", marker=\"o\", label='satellite record')\n",
- "historic_ts['global_average_sea_level_change'].plot(ax=axs, label='Historical in-situ record', color=\"lightblue\")\n",
+ "result.plot(ax=axs, color=\"orange\", marker=\"o\", label=\"satellite record\")\n",
+ "historic_ts[\"global_average_sea_level_change\"].plot(\n",
+ " ax=axs, label=\"Historical in-situ record\", color=\"lightblue\"\n",
+ ")\n",
"\n",
- "x0,x1 = axs.get_xlim()\n",
- "y0,y1 = axs.get_ylim()\n",
- "axs.imshow(img, extent=[x0, x1, y0, y1], aspect='auto')\n",
+ "x0, x1 = axs.get_xlim()\n",
+ "y0, y1 = axs.get_ylim()\n",
+ "axs.imshow(img, extent=[x0, x1, y0, y1], aspect=\"auto\")\n",
"\n",
"plt.legend()\n",
"plt.show()"
@@ -355,7 +369,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.8"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/docs/tutorials/emit-earthaccess.ipynb b/docs/tutorials/emit-earthaccess.ipynb
index e3b9f43a..56dfc3b8 100644
--- a/docs/tutorials/emit-earthaccess.ipynb
+++ b/docs/tutorials/emit-earthaccess.ipynb
@@ -29,11 +29,10 @@
},
"outputs": [],
"source": [
+ "from pprint import pprint\n",
+ "\n",
"import earthaccess\n",
- "import numpy as np\n",
"import xarray as xr\n",
- "import h5netcdf\n",
- "from pprint import pprint\n",
"\n",
"print(f\"using earthaccess version {earthaccess.__version__}\")\n",
"\n",
@@ -59,11 +58,11 @@
},
"outputs": [],
"source": [
- "results = earthaccess.search_datasets(short_name = \"EMITL2ARFL\", cloud_hosted=True)\n",
+ "results = earthaccess.search_datasets(short_name=\"EMITL2ARFL\", cloud_hosted=True)\n",
"\n",
"# Let's print our datasets\n",
"for dataset in results:\n",
- " print(pprint(dataset.summary()))"
+ " pprint(dataset.summary())"
]
},
{
@@ -84,9 +83,11 @@
"outputs": [],
"source": [
"# ~Ecuador = -82.05,-3.17,-76.94,-0.52\n",
- "granules = earthaccess.search_data(short_name=\"EMITL2ARFL\",\n",
- " bounding_box=(-82.05,-3.17,-76.94,-0.52),\n",
- " count=10)\n",
+ "granules = earthaccess.search_data(\n",
+ " short_name=\"EMITL2ARFL\",\n",
+ " bounding_box=(-82.05, -3.17, -76.94, -0.52),\n",
+ " count=10,\n",
+ ")\n",
"print(len(granules))"
]
},
@@ -155,10 +156,16 @@
"file_p = file_handlers[4]\n",
"\n",
"refl = xr.open_dataset(file_p)\n",
- "wvl = xr.open_dataset(file_p, group='sensor_band_parameters')\n",
- "loc = xr.open_dataset(file_p, group='location')\n",
+ "wvl = xr.open_dataset(file_p, group=\"sensor_band_parameters\")\n",
+ "loc = xr.open_dataset(file_p, group=\"location\")\n",
"ds = xr.merge([refl, loc])\n",
- "ds = ds.assign_coords({'downtrack':(['downtrack'], refl.downtrack.data),'crosstrack':(['crosstrack'],refl.crosstrack.data), **wvl.variables}) \n",
+ "ds = ds.assign_coords(\n",
+ " {\n",
+ " \"downtrack\": ([\"downtrack\"], refl.downtrack.data),\n",
+ " \"crosstrack\": ([\"crosstrack\"], refl.crosstrack.data),\n",
+ " **wvl.variables,\n",
+ " }\n",
+ ")\n",
"\n",
"ds"
]
@@ -176,20 +183,27 @@
"\n",
"```python\n",
"\n",
+ "import holoviews as hv\n",
"import hvplot.xarray\n",
+ "import numpy as np\n",
"import panel as pn\n",
- "import holoviews as hv\n",
"\n",
"pn.extension()\n",
"\n",
- "b850 = np.nanargmin(abs(ds['wavelengths'].values-850)) # Find band nearest to value of 850 nm (NIR)\n",
- "image = ds.sel(bands=b850).reflectance_uncertainty.hvplot('crosstrack', 'downtrack', cmap='viridis')\n",
+ "# Find band nearest to value of 850 nm (NIR)\n",
+ "b850 = np.nanargmin(abs(ds[\"wavelengths\"].values - 850))\n",
+ "ref_unc = ds[\"reflectance_uncertainty\"]\n",
+ "image = ref_unc.sel(bands=b850).hvplot(\"crosstrack\", \"downtrack\", cmap=\"viridis\")\n",
"stream = hv.streams.Tap(source=image, x=255, y=484)\n",
"\n",
+ "\n",
"def wavelengths_histogram(x, y):\n",
- " histo = ds['reflectance_uncertainty'].sel(crosstrack=x, downtrack=y, method='nearest').hvplot(x=\"wavelengths\", color='green')\n",
+ " histo = ref_unc.sel(crosstrack=x, downtrack=y, method=\"nearest\").hvplot(\n",
+ " x=\"wavelengths\", color=\"green\"\n",
+ " )\n",
" return histo\n",
"\n",
+ "\n",
"tap_dmap = hv.DynamicMap(wavelengths_histogram, streams=[stream])\n",
"pn.Column(image, tap_dmap)\n",
"\n",
@@ -214,7 +228,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.16"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/docs/tutorials/file-access.ipynb b/docs/tutorials/file-access.ipynb
index f5011c6f..fa5b0711 100644
--- a/docs/tutorials/file-access.ipynb
+++ b/docs/tutorials/file-access.ipynb
@@ -38,7 +38,7 @@
" short_name=\"ATL06\",\n",
" cloud_hosted=False,\n",
" temporal=(\"2019-01\", \"2019-02\"),\n",
- " polygon=[(-100, 40), (-110, 40), (-105, 38), (-100, 40)]\n",
+ " polygon=[(-100, 40), (-110, 40), (-105, 38), (-100, 40)],\n",
")\n",
"results[0]"
]
@@ -97,7 +97,7 @@
"metadata": {},
"outputs": [],
"source": [
- "%%time \n",
+ "%%time\n",
"\n",
"import xarray as xr\n",
"\n",
@@ -124,7 +124,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.16"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/docs/tutorials/restricted-datasets.ipynb b/docs/tutorials/restricted-datasets.ipynb
index 285af550..9dc9241b 100644
--- a/docs/tutorials/restricted-datasets.ipynb
+++ b/docs/tutorials/restricted-datasets.ipynb
@@ -17,7 +17,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"id": "2acb1926-3442-446a-8a35-fcbba8868d4d",
"metadata": {},
"outputs": [],
@@ -54,19 +54,10 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"id": "a0a5f73d-b4b9-4dad-ac72-12c7ae6278d1",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "You're now authenticated with NASA Earthdata Login\n",
- "Using token with expiration date: 07/24/2022\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"auth.login(strategy=\"environment\")\n",
"# are we authenticated?\n",
@@ -113,68 +104,32 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"id": "d0dd51cc-b394-47cd-b606-d54750ea629e",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Collections found: 1\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "[{\n",
- " \"meta\": {\n",
- " \"concept-id\": \"C2144439155-NSIDC_ECS\",\n",
- " \"granule-count\": 123484,\n",
- " \"provider-id\": \"NSIDC_ECS\"\n",
- " },\n",
- " \"umm\": {\n",
- " \"ShortName\": \"ATL06\",\n",
- " \"Version\": \"005\"\n",
- " }\n",
- " }]"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
- "# The first step is to create a DataCollections query \n",
+ "# The first step is to create a DataCollections query\n",
"Query = DataCollections()\n",
"\n",
"# Use chain methods to customize our query\n",
- "Query.short_name(\"ATL06\").version(\"005\")\n",
+ "Query.short_name(\"ATL06\").version(\"006\")\n",
"\n",
- "print(f'Collections found: {Query.hits()}')\n",
+ "print(f\"Collections found: {Query.hits()}\")\n",
"\n",
"# filtering what UMM fields to print, to see the full record we omit the fields filters\n",
- "# meta is always included as \n",
- "collections = Query.fields(['ShortName','Version']).get(5)\n",
+ "# meta is always included as\n",
+ "collections = Query.fields([\"ShortName\", \"Version\"]).get(5)\n",
"# Inspect some results printing just the ShortName and Abstract\n",
"collections"
]
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"id": "14eee26c-e9d9-4f2f-8b04-06379c29c9d8",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "earthaccess generated a token for CMR with expiration on: 07/24/2022\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"if not auth.refresh_tokens():\n",
" print(\"Something went wrong, we may need to regenerate our tokens manually\")"
@@ -182,59 +137,20 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"id": "a17a8afe-0a68-4adf-a6d1-5f5bda6becc9",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Collections found: 1\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "[{\n",
- " \"meta\": {\n",
- " \"concept-id\": \"C2144439155-NSIDC_ECS\",\n",
- " \"granule-count\": 123484,\n",
- " \"provider-id\": \"NSIDC_ECS\"\n",
- " },\n",
- " \"umm\": {\n",
- " \"ShortName\": \"ATL06\",\n",
- " \"Version\": \"005\"\n",
- " }\n",
- " },\n",
- " {\n",
- " \"meta\": {\n",
- " \"concept-id\": \"C2153572614-NSIDC_CPRD\",\n",
- " \"granule-count\": 123484,\n",
- " \"provider-id\": \"NSIDC_CPRD\"\n",
- " },\n",
- " \"umm\": {\n",
- " \"ShortName\": \"ATL06\",\n",
- " \"Version\": \"005\"\n",
- " }\n",
- " }]"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"Query = DataCollections(auth)\n",
"\n",
"# Use chain methods to customize our query\n",
- "Query.short_name(\"ATL06\").version(\"005\")\n",
+ "Query.short_name(\"ATL06\").version(\"006\")\n",
"\n",
"# This will say 1, even though we get 2 back.\n",
- "print(f'Collections found: {Query.hits()}')\n",
+ "print(f\"Collections found: {Query.hits()}\")\n",
"\n",
- "collections = Query.fields(['ShortName','Version']).get()\n",
+ "collections = Query.fields([\"ShortName\", \"Version\"]).get()\n",
"# Inspect some results printing just the ShortName and Abstract\n",
"collections"
]
@@ -257,21 +173,17 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"id": "9478b3ef-7652-4943-9946-9ce49c085eb6",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Granules found with hits(): 0\n",
- "Actual number found: 4\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
- "Query = DataGranules(auth).concept_id(\"C2153572614-NSIDC_CPRD\").bounding_box(-134.7,58.9,-133.9,59.2).temporal(\"2020-03-01\", \"2020-03-30\")\n",
+ "Query = (\n",
+ " DataGranules(auth)\n",
+ " .concept_id(\"C2153572614-NSIDC_CPRD\")\n",
+ " .bounding_box(-134.7, 58.9, -133.9, 59.2)\n",
+ " .temporal(\"2020-03-01\", \"2020-03-30\")\n",
+ ")\n",
"\n",
"# Unfortunately the hits() methods will behave the same for granule queries\n",
"print(f\"Granules found with hits(): {Query.hits()}\")\n",
@@ -291,6 +203,14 @@
"store = Store(auth)\n",
"files = store.get(cloud_granules, \"./data/C2153572614-NSIDC_CPRD/\")"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9726088c-b7eb-4c3c-9012-9874dd4aa3f8",
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
@@ -309,7 +229,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.16"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/notebooks/DatasetSearch.ipynb b/notebooks/DatasetSearch.ipynb
index c6bcd6e0..633b3361 100644
--- a/notebooks/DatasetSearch.ipynb
+++ b/notebooks/DatasetSearch.ipynb
@@ -67,7 +67,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "2e674100-f041-4620-bd33-0ec29f0a8fd8",
"metadata": {},
"outputs": [],
@@ -131,7 +131,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 6,
"id": "197dece4-02dc-4622-964c-41ca6a275cae",
"metadata": {},
"outputs": [],
@@ -160,7 +160,7 @@
"metadata": {},
"outputs": [],
"source": [
- "query = DataCollections().cloud_hosted(True).bounding_box(-25.31,63.23,-11.95,66.65)\n",
+ "query = DataCollections().cloud_hosted(True).bounding_box(-25.31, 63.23, -11.95, 66.65)\n",
"\n",
"query.hits()"
]
@@ -172,7 +172,12 @@
"metadata": {},
"outputs": [],
"source": [
- "for c in DataCollections().cloud_hosted(True).short_name(\"ECCO_L4_GMSL_TIME_SERIES_MONTHLY_V4R4\").get(40):\n",
+ "query = (\n",
+ " DataCollections()\n",
+ " .cloud_hosted(True)\n",
+ " .short_name(\"ECCO_L4_GMSL_TIME_SERIES_MONTHLY_V4R4\")\n",
+ ")\n",
+ "for c in query.get(40):\n",
" print(c.summary(), \"\\n\")"
]
}
@@ -193,7 +198,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.16"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/notebooks/Demo.ipynb b/notebooks/Demo.ipynb
index 62e9dfd8..9c4b54a2 100644
--- a/notebooks/Demo.ipynb
+++ b/notebooks/Demo.ipynb
@@ -42,7 +42,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 28,
"id": "2acb1926-3442-446a-8a35-fcbba8868d4d",
"metadata": {},
"outputs": [],
@@ -91,7 +91,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "8d5bf4c9-571b-4c93-af94-e66bd51cb584",
+ "id": "52cb48b4-5cc6-4203-8734-8fde89431e7b",
"metadata": {},
"outputs": [],
"source": [
@@ -99,13 +99,17 @@
"# Query = earthaccess.collection_query().keyword('fire').temporal(\"2016-01-01\", \"2020-12-12\")\n",
"# Query = earthaccess.collection_query().keyword('GEDI').bounding_box(-134.7,58.9,-133.9,59.2)\n",
"\n",
- "Query = earthaccess.collection_query().keyword('elevation').bounding_box(-134.7,58.9,-133.9,59.2)\n",
+ "Query = (\n",
+ " earthaccess.collection_query()\n",
+ " .keyword(\"elevation\")\n",
+ " .bounding_box(-134.7, 58.9, -133.9, 59.2)\n",
+ ")\n",
"\n",
- "print(f'Collections found: {Query.hits()}')\n",
+ "print(f\"Collections found: {Query.hits()}\")\n",
"\n",
"# filtering what UMM fields to print, to see the full record we omit the fields filters\n",
- "# meta is always included as \n",
- "collections = Query.fields(['ShortName','Abstract']).get(3)\n",
+ "# meta is always included as\n",
+ "collections = Query.fields([\"ShortName\", \"Abstract\"]).get(3)\n",
"# Inspect 3 results printing just the ShortName and Abstract\n",
"collections[0:3]"
]
@@ -153,8 +157,8 @@
"# We can now search for collections using a pythonic API client for CMR.\n",
"Query = earthaccess.collection_query().daac(\"PODAAC\")\n",
"\n",
- "print(f'Collections found: {Query.hits()}')\n",
- "collections = Query.fields(['ShortName']).get(20)\n",
+ "print(f\"Collections found: {Query.hits()}\")\n",
+ "collections = Query.fields([\"ShortName\"]).get(20)\n",
"# Printing 3 collections\n",
"collections[0:3]"
]
@@ -169,8 +173,8 @@
"# What if we want cloud collections\n",
"Query = earthaccess.collection_query().daac(\"PODAAC\").cloud_hosted(True)\n",
"\n",
- "print(f'Collections found: {Query.hits()}')\n",
- "collections = Query.fields(['ShortName']).get(20)\n",
+ "print(f\"Collections found: {Query.hits()}\")\n",
+ "collections = Query.fields([\"ShortName\"]).get(20)\n",
"# Printing 3 collections\n",
"collections[0:3]"
]
@@ -196,7 +200,7 @@
"The DataGranules client, accessed via `earthaccess.granule_query()`, provides similar functionality as the collection class. To query for granules in a more reliable way, concept-id would be the main key.\n",
"You can search data granules using a short name but that could (and more likely will) return multiple versions of the same data granules. \n",
"\n",
- "In this example we're querying for 20 data grnaules from ICESat-2 [ATL03](https://nsidc.org/data/ATL03/versions/) version `005` dataset. "
+ "In this example we're querying for 20 data grnaules from ICESat-2 [ATL03](https://nsidc.org/data/ATL03/versions/) version `006` dataset. "
]
},
{
@@ -206,9 +210,14 @@
"metadata": {},
"outputs": [],
"source": [
- "Query = earthaccess.granule_query().short_name('ATL03').version(\"005\").bounding_box(-134.7,58.9,-133.9,59.2)\n",
+ "Query = (\n",
+ " earthaccess.granule_query()\n",
+ " .short_name(\"ATL03\")\n",
+ " .version(\"006\")\n",
+ " .bounding_box(-134.7, 58.9, -133.9, 59.2)\n",
+ ")\n",
"granules = Query.get(20)\n",
- "print(granules[0:2])"
+ "granules[0:2]"
]
},
{
@@ -251,7 +260,13 @@
"metadata": {},
"outputs": [],
"source": [
- "Query = earthaccess.granule_query().short_name(\"ATL03\").temporal(\"2020-03-01\", \"2020-03-30\").bounding_box(-134.7,58.9,-133.9,59.2).version(\"005\")\n",
+ "Query = (\n",
+ " earthaccess.granule_query()\n",
+ " .short_name(\"ATL03\")\n",
+ " .temporal(\"2020-03-01\", \"2020-03-30\")\n",
+ " .bounding_box(-134.7, 58.9, -133.9, 59.2)\n",
+ " .version(\"006\")\n",
+ ")\n",
"# Always inspects the hits before retrieving the granule metadata, just because it's very verbose.\n",
"print(f\"Granules found: {Query.hits()}\")"
]
@@ -265,7 +280,7 @@
"source": [
"# Now we can print some info about these granules using the built-in methods\n",
"granules = Query.get(4)\n",
- "data_links = [{'links': g.data_links(), 'size (MB):': g.size()} for g in granules]\n",
+ "data_links = [{\"links\": g.data_links(), \"size (MB):\": g.size()} for g in granules]\n",
"data_links"
]
},
@@ -282,7 +297,12 @@
"# C1968980609-POCLOUD: Sentinel-6A MF Jason-CS L2 P4 Altimeter Low Resolution (LR) STC Ocean Surface Topography\n",
"# C1575731655-LPDAAC_ECS: ASTER Global Digital Elevation Model NetCDF V003\n",
"# Query = earthaccess.granule_query().concept_id(\"C1575731655-LPDAAC_ECS\").bounding_box(-134.7,58.9,-133.9,59.2)\n",
- "Query = earthaccess.granule_query().short_name('ATL03').version(\"005\").bounding_box(-134.7,58.9,-133.9,59.2)\n",
+ "Query = (\n",
+ " earthaccess.granule_query()\n",
+ " .short_name(\"ATL03\")\n",
+ " .version(\"006\")\n",
+ " .bounding_box(-134.7, 58.9, -133.9, 59.2)\n",
+ ")\n",
"\n",
"print(f\"Granules found: {Query.hits()}\")"
]
@@ -318,7 +338,7 @@
"outputs": [],
"source": [
"# Size in MB\n",
- "data_links = [{'links': g.data_links(), 'size (MB):': g.size()} for g in granules]\n",
+ "data_links = [{\"links\": g.data_links(), \"size (MB):\": g.size()} for g in granules]\n",
"data_links"
]
},
@@ -348,7 +368,12 @@
"metadata": {},
"outputs": [],
"source": [
- "Query = earthaccess.granule_query().short_name(\"ATL06\").bounding_box(-134.7,54.9,-100.9,69.2).debug(True)\n",
+ "Query = (\n",
+ " earthaccess.granule_query()\n",
+ " .short_name(\"ATL06\")\n",
+ " .bounding_box(-134.7, 54.9, -100.9, 69.2)\n",
+ " .debug(True)\n",
+ ")\n",
"print(f\"Granule hits: {Query.hits()}\")\n",
"# getting more than 6,000 metadata records for demo purposes is going to slow us down a bit so let's get only 100\n",
"granules = Query.get(10)"
@@ -384,6 +409,7 @@
"source": [
"# since the response is an array of dictionaries we can do pythonic things like ordering the granules by size\n",
"import operator\n",
+ "\n",
"granules_by_size = sorted(granules, key=operator.itemgetter(\"size\"))\n",
"# now our array is sorted by size from less to more. Let's print the first 3\n",
"granules_by_size[0:3]"
@@ -418,7 +444,12 @@
"metadata": {},
"outputs": [],
"source": [
- "Query = earthaccess.granule_query().short_name(\"ATL06\").cloud_hosted(True).bounding_box(-134.7,54.9,-100.9,69.2)\n",
+ "Query = (\n",
+ " earthaccess.granule_query()\n",
+ " .short_name(\"ATL06\")\n",
+ " .cloud_hosted(True)\n",
+ " .bounding_box(-134.7, 54.9, -100.9, 69.2)\n",
+ ")\n",
"print(f\"Granule hits: {Query.hits()}\")\n",
"cloud_granules = Query.get(10)\n",
"# is this a cloud hosted data granule?\n",
@@ -445,6 +476,7 @@
"source": [
"# Let's order them by size again.\n",
"import operator\n",
+ "\n",
"cloud_granules_by_size = sorted(cloud_granules, key=operator.itemgetter(\"size\"))\n",
"# now our array is sorted by size from less to more. Let's print the first 3\n",
"cloud_granules_by_size[0:3]"
@@ -518,7 +550,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.9"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/notebooks/EarthdataLogin.ipynb b/notebooks/EarthdataLogin.ipynb
index 04aafba6..dd4728d8 100644
--- a/notebooks/EarthdataLogin.ipynb
+++ b/notebooks/EarthdataLogin.ipynb
@@ -13,36 +13,10 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"id": "adc12546-827a-4d14-b92e-cf10e3823231",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "No .netrc found in /home/beto\n"
- ]
- },
- {
- "name": "stdin",
- "output_type": "stream",
- "text": [
- "Enter your Earthdata Login username: betolink\n",
- "Enter your Earthdata password: ········\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "You're now authenticated with NASA Earthdata Login\n",
- "Using token with expiration date: 05/13/2023\n",
- "Using user provided credentials for EDL\n",
- "Using earthaccess version 0.5.1\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"import earthaccess\n",
"\n",
@@ -53,57 +27,30 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"id": "901a1c21-29c1-4534-97bb-e4a75e63a477",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "We are already authenticated with NASA EDL\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"auth = earthaccess.login(strategy=\"environment\")"
]
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"id": "668d4bce-3a26-4e54-be30-6be2bc82bd44",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "We are already authenticated with NASA EDL\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"auth = earthaccess.login(strategy=\"netrc\")"
]
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": null,
"id": "6d9726cd-47f2-464f-80f9-d51fb006c545",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'II*\\x00\\x08\\x00\\x00\\x00\\x13\\x00\\x00\\x01\\x03\\x00\\x01\\x00\\x00\\x00\\x11\\x0e\\x00\\x00\\x01\\x01\\x03\\x00\\x01\\x00\\x00\\x00\\x11\\x0e\\x00\\x00\\x02\\x01\\x03\\x00\\x01\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x03\\x01\\x03\\x00\\x01\\x00\\x00\\x00\\x05\\x00\\x00\\x00\\x06\\x01\\x03\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x15\\x01\\x03\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x1c\\x01\\x03\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00=\\x01\\x03\\x00\\x01\\x00\\x00'"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"# using earthaccess authenticated session to fetch restricted files behind EDL\n",
"req_session = earthaccess.get_requests_https_session()\n",
@@ -112,7 +59,7 @@
"restricted_gesdisc_resource = \"https://data.gesdisc.earthdata.nasa.gov/data/MERGED_IR/GPM_MERGIR.1/1998/002/merg_1998010217_4km-pixel.nc4\"\n",
"restricted_lpdaac_resource = \"https://data.lpdaac.earthdatacloud.nasa.gov/lp-prod-protected/ASTGTM.003/ASTGTMV003_N01E024_dem.tif\"\n",
"# reading the first 100 bytes\n",
- "data = req_session.get(restricted_lpdaac_resource, headers = {\"Range\": \"bytes=0-100\"})\n",
+ "data = req_session.get(restricted_lpdaac_resource, headers={\"Range\": \"bytes=0-100\"})\n",
"data.text"
]
},
@@ -144,39 +91,10 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"id": "9ecafd00-d5d5-4c10-99a8-5e48f2614407",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'cloud-info': {'Region': 'us-west-2',\n",
- " 'S3BucketAndObjectPrefixNames': ['nsidc-cumulus-prod-protected/GLAS/GLAH12/034',\n",
- " 'nsidc-cumulus-prod-public/GLAS/GLAH12/034'],\n",
- " 'S3CredentialsAPIDocumentationURL': 'https://data.nsidc.earthdatacloud.nasa.gov/s3credentialsREADME',\n",
- " 'S3CredentialsAPIEndpoint': 'https://data.nsidc.earthdatacloud.nasa.gov/s3credentials'},\n",
- " 'concept-id': 'C2153549818-NSIDC_CPRD',\n",
- " 'file-type': \"[{'FormatType': 'Native', 'Format': 'HDF', 'FormatDescription': \"\n",
- " \"'FTP 15 GB'}]\",\n",
- " 'get-data': ['https://search.earthdata.nasa.gov/search?q=GLAH12+V034'],\n",
- " 'short-name': 'GLAH12',\n",
- " 'version': '034'}\n",
- "{'cloud-info': {'Region': 'us-west-2',\n",
- " 'S3BucketAndObjectPrefixNames': ['nsidc-cumulus-prod-protected/GLAS/GLAH13/034',\n",
- " 'nsidc-cumulus-prod-public/GLAS/GLAH13/034'],\n",
- " 'S3CredentialsAPIDocumentationURL': 'https://data.nsidc.earthdatacloud.nasa.gov/s3credentialsREADME',\n",
- " 'S3CredentialsAPIEndpoint': 'https://data.nsidc.earthdatacloud.nasa.gov/s3credentials'},\n",
- " 'concept-id': 'C2153549910-NSIDC_CPRD',\n",
- " 'file-type': \"[{'FormatType': 'Native', 'Format': 'HDF', 'FormatDescription': \"\n",
- " \"'FTP 18 GB'}]\",\n",
- " 'get-data': ['https://search.earthdata.nasa.gov/search?q=GLAH13+V034'],\n",
- " 'short-name': 'GLAH13',\n",
- " 'version': '034'}\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"from pprint import pprint\n",
"\n",
@@ -190,63 +108,12 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"id": "2044634d-2d60-4890-a357-8dcbc9f03fd2",
"metadata": {
"tags": []
},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- " \n",
- " \n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
\n",
- "
Data: GLAH12_634_1102_001_0071_0_01_0001.H5
\n",
- "
Size: 22.43 MB
\n",
- "
Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 104.08523, 'StartLatitude': 50.0, 'StartDirection': 'A', 'EndLatitude': 50.0, 'EndDirection': 'A'}}}
\n",
- "
\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
\n",
- "
\n",
- " "
- ],
- "text/plain": [
- "Collection: {'EntryTitle': 'GLAS/ICESat L2 Global Antarctic and Greenland Ice Sheet Altimetry Data (HDF5) V034'}\n",
- "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 104.08523, 'StartLatitude': 50.0, 'StartDirection': 'A', 'EndLatitude': 50.0, 'EndDirection': 'A'}}}\n",
- "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2003-02-20T21:48:32.000Z', 'EndingDateTime': '2003-02-21T19:12:15.000Z'}}\n",
- "Size(MB): 22.4292\n",
- "Data: ['https://data.nsidc.earthdatacloud.nasa.gov/nsidc-cumulus-prod-protected/GLAS/GLAH12/034/2003/2/GLAH12_634_1102_001_0071_0_01_0001.H5']"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"# C2153549818-NSIDC_CPRD\n",
"granules = earthaccess.granule_query().concept_id(\"C2153549818-NSIDC_CPRD\").get(10)\n",
@@ -256,62 +123,12 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": null,
"id": "159b710c-531b-4c65-ae44-d7c2a0f3c9bb",
"metadata": {
"tags": []
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- " Getting 2 granules, approx download size: 0.05 GB\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c5a1ffd648254c4f98dfe04410532948",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "QUEUEING TASKS | : 0%| | 0/2 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "7d5b754aedf44c62b491216ae21c0b4b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "PROCESSING TASKS | : 0%| | 0/2 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "79f3dc7b24f647ea959c339573601f28",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "COLLECTING RESULTS | : 0%| | 0/2 [00:00, ?it/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"file = earthaccess.download(granules[0:2], \"data\")"
]
@@ -328,33 +145,13 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": null,
"id": "089b888b-31d7-40f8-88f5-c41752bacb97",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Authentication with Earthdata Login failed with:\n",
- "{\"statusCode\":500,\"error\":\"Internal Server Error\",\"message\":\"An internal server error occurred\"}\n",
- "Consider accepting the EULAs available at https://urs.earthdata.nasa.gov/users/earthaccess/unaccepted_eulas and applications at https://urs.earthdata.nasa.gov/application_search\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "{}"
- ]
- },
- "execution_count": 23,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"temp_s3_credentials = earthaccess.get_s3_credentials(\"ORNLDAAC\")\n",
- "# these credentials expire after 1 hour \n",
+ "# these credentials expire after 1 hour\n",
"temp_s3_credentials"
]
}
@@ -375,7 +172,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.9"
+ "version": "3.11.9"
}
},
"nbformat": 4,
diff --git a/pyproject.toml b/pyproject.toml
index f04fcb76..d8ef87dd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -79,36 +79,38 @@ test = [
"vcrpy >=6.0.1",
]
docs = [
- "jupyterlab >=3",
- "ipywidgets >=7.7.0",
- "widgetsnbextension >=3.6.0",
- # Prevent install of 1.6.0 because the module mkdocs.tests
- # is no longer exported, which causes mkdocs-jupyter to
- # break with a ModuleNotFoundError.
- # for notebook integrations and documentation examples
- "mkdocs >=1.2,!=1.6.0",
- "mkdocs-material >=7.1,<10.0",
- "mkdocs-redirects >=1.2.1",
- "markdown-callouts >=0.2.0",
- "markdown-include >=0.6",
- "mkdocs-jupyter >=0.19.0",
- "mkdocstrings[python] >=0.19.0",
- "pymdown-extensions >=9.2",
- "pygments >=2.11.1",
- "xarray >=2023.01",
- "matplotlib >=3.3",
- "h5netcdf >=0.11",
- "pyproj >=3.5.0; python_version < '3.12'",
- "pyproj >=3.6.1; python_version >= '3.12'",
- # The following error occurs when building the docs, so we must explicitly
- # include lxml-html-clean as a dev dependency until mkdocs-jupyter is updated:
- #
- # ImportError: lxml.html.clean module is now a separate project lxml_html_clean.
- # Install lxml[html_clean] or lxml_html_clean directly.
- #
- # See https://github.com/danielfrg/mkdocs-jupyter/issues/200
- # See https://github.com/danielfrg/mkdocs-jupyter/issues/197
- "lxml-html-clean >=0.1.1",
+ "jupyterlab >=3",
+ "ipywidgets >=7.7.0",
+ "widgetsnbextension >=3.6.0",
+ # Prevent install of 1.6.0 because the module mkdocs.tests
+ # is no longer exported, which causes mkdocs-jupyter to
+ # break with a ModuleNotFoundError.
+ # for notebook integrations and documentation examples
+ "mkdocs >=1.2,!=1.6.0",
+ "mkdocs-material >=7.1,<10.0",
+ "mkdocs-redirects >=1.2.1",
+ "markdown-callouts >=0.2.0",
+ "markdown-include >=0.6",
+ "mkdocs-jupyter >=0.19.0",
+ "mkdocstrings[python] >=0.19.0",
+ "pymdown-extensions >=9.2",
+ "pygments >=2.11.1",
+ "xarray >=2023.01",
+ "matplotlib >=3.3",
+ "h5netcdf >=0.11",
+ "pyproj >=3.5.0; python_version < '3.12'",
+ "pyproj >=3.6.1; python_version >= '3.12'",
+ # The following error occurs when building the docs, so we must explicitly
+ # include lxml-html-clean as a dev dependency until mkdocs-jupyter is updated:
+ #
+ # ImportError: lxml.html.clean module is now a separate project lxml_html_clean.
+ # Install lxml[html_clean] or lxml_html_clean directly.
+ #
+ # See https://github.com/danielfrg/mkdocs-jupyter/issues/200
+ # See https://github.com/danielfrg/mkdocs-jupyter/issues/197
+ "lxml-html-clean >=0.1.1",
+ "dask>=2024.8.0",
+ "cftime>=1.6.4",
]
@@ -150,20 +152,21 @@ stubPath = "./stubs"
[tool.ruff]
line-length = 88
src = ["earthaccess", "stubs", "tests"]
-# HACK: Don't lint or format Jupyter Notebooks for now.
-extend-exclude = ["*.ipynb"]
[tool.ruff.lint]
extend-select = ["I", "T20", "D", "G"]
ignore = ["D1", "D205", "D401", "D417", "G004"]
-[tool.ruff.lint.pydocstyle]
-convention = "google"
-
-
[tool.ruff.lint.isort]
combine-as-imports = true
+[tool.ruff.lint.per-file-ignores]
+# Allow `print` and `pprint` in notebooks
+"*.ipynb" = ["T201", "T203"]
+
+[tool.ruff.lint.pydocstyle]
+convention = "google"
+
[tool.bumpversion]
current_version = "0.10.0"
commit = false
diff --git a/uv.lock b/uv.lock
index e4c8a627..7d3b8fa6 100644
--- a/uv.lock
+++ b/uv.lock
@@ -460,6 +460,41 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 },
]
+[[package]]
+name = "cftime"
+version = "1.6.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f1/35/6e0a7d0998dcf197a2097876767f9bf5d0881ef0bce6a0367ac66ae8eb58/cftime-1.6.4.tar.gz", hash = "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", size = 54615 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/39/ea/4b7b2d3bf9474627875f63eca37aa94622881adc68e75f5acf107571e8e2/cftime-1.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", size = 232928 },
+ { url = "https://files.pythonhosted.org/packages/d9/50/781f3480d92e88e3934bf243968afecdd61c26cb76d21cde4c8857b562a5/cftime-1.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", size = 213848 },
+ { url = "https://files.pythonhosted.org/packages/29/54/5b80f25f36a31981871bf5c29a8bb176f9cad9e13571400b97e1156d55d3/cftime-1.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", size = 1252526 },
+ { url = "https://files.pythonhosted.org/packages/56/9b/b020a7fac001782d9a71e25b4702084c3a5d5bdaa73ca3e4f3516e196746/cftime-1.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", size = 1290537 },
+ { url = "https://files.pythonhosted.org/packages/61/b0/4a260ef28d4928cd15f63786e0f779dbf185ac4c9c93d6cd174f87a6cd3f/cftime-1.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", size = 1317558 },
+ { url = "https://files.pythonhosted.org/packages/48/63/e6bb7e9b127d2d88a08dd18225ba7816a373e00e85d221563db9f9baf005/cftime-1.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", size = 189358 },
+ { url = "https://files.pythonhosted.org/packages/72/76/58f3ca717bcbd669dca114256e5376298de20932ece46ee2c846ceef4f13/cftime-1.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", size = 233363 },
+ { url = "https://files.pythonhosted.org/packages/7f/ec/8333fb2229a3efd17f59a7fcc295c09cce8db3dd956de58c20f55926b533/cftime-1.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", size = 214370 },
+ { url = "https://files.pythonhosted.org/packages/a8/0e/274db35df3dec9cd033bce2b1921eb1287ea1273b1c512be15d53ecd554c/cftime-1.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", size = 1381235 },
+ { url = "https://files.pythonhosted.org/packages/16/fa/68ce3e1cdc785739ce53f9659201768179f8ea6e912519c890aedcd794ff/cftime-1.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", size = 1416044 },
+ { url = "https://files.pythonhosted.org/packages/f2/c9/ec07fdb44a9f25cc46b75f4e7f73d8806abde4c632076f5971817d14dcb2/cftime-1.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", size = 1451307 },
+ { url = "https://files.pythonhosted.org/packages/3a/a8/91d5cad40336f74a9eb92dabdc3aa59f3ccf13864ddbc71080b024808d7b/cftime-1.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", size = 190388 },
+ { url = "https://files.pythonhosted.org/packages/3e/32/ad5e2c596aec41caaec9cfa5e109f8db70f5489a69bd30d76d8b96de27c8/cftime-1.6.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", size = 226531 },
+ { url = "https://files.pythonhosted.org/packages/d9/b7/1a9773d903a57946e29d878f1d2b0ddd6ddab81d59fc6d9913b8cadd099e/cftime-1.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", size = 209120 },
+ { url = "https://files.pythonhosted.org/packages/06/93/3f730e0402034746b39d202a18abe72eb3d092dec882fb6e07df7703ac30/cftime-1.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", size = 1321662 },
+ { url = "https://files.pythonhosted.org/packages/04/56/233d817ef571d778281f3d639049b342f6ff0bb4de4c5ee630befbd55319/cftime-1.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", size = 1367699 },
+ { url = "https://files.pythonhosted.org/packages/d8/24/f83ad4c120cbf5aa0768be22f1e276edf2b6557a955cb0e04812f37fd075/cftime-1.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", size = 1386424 },
+ { url = "https://files.pythonhosted.org/packages/17/98/ba5b4a2f37c6c88454b696dd5c7a4e76fc8bfd014364b47ddd7e2cec0fcd/cftime-1.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", size = 178575 },
+ { url = "https://files.pythonhosted.org/packages/93/07/f276b1d9afc627e0a171615a9052eef38fde1e884ed6700246d98db24941/cftime-1.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", size = 233224 },
+ { url = "https://files.pythonhosted.org/packages/a1/37/ee4a8ea2d853e4163be7c05271c563d7db97053044fca190a1e0f379513c/cftime-1.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", size = 214157 },
+ { url = "https://files.pythonhosted.org/packages/e1/9e/c6de11b037c7c1928bfdd71e96033854854bd51c18a40cd7cc273b2aedb4/cftime-1.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", size = 1255353 },
+ { url = "https://files.pythonhosted.org/packages/e7/3d/bf2d058e272828338f40be26ab262e19a67264e687fde9327b87fbe52900/cftime-1.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", size = 1291964 },
+ { url = "https://files.pythonhosted.org/packages/1a/3e/aab712c3b240248f01df46a5dbc5c6298953f529a5dd658734e9068c123f/cftime-1.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea", size = 1315440 },
+ { url = "https://files.pythonhosted.org/packages/85/1a/bb71b93d83524b7a829a04c99736ec1a93d03d1f931207c1d9eeaf5833be/cftime-1.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", size = 189485 },
+]
+
[[package]]
name = "charset-normalizer"
version = "3.3.2"
@@ -844,6 +879,8 @@ dev = [
{ name = "uv" },
]
docs = [
+ { name = "cftime" },
+ { name = "dask" },
{ name = "h5netcdf" },
{ name = "ipywidgets" },
{ name = "jupyterlab" },
@@ -882,6 +919,8 @@ test = [
[package.metadata]
requires-dist = [
{ name = "bump-my-version", marker = "extra == 'dev'", specifier = ">=0.10.0" },
+ { name = "cftime", marker = "extra == 'docs'", specifier = ">=1.6.4" },
+ { name = "dask", marker = "extra == 'docs'", specifier = ">=2024.8.0" },
{ name = "dask", marker = "extra == 'kerchunk'" },
{ name = "fsspec", specifier = ">=2022.11" },
{ name = "h5netcdf", marker = "extra == 'docs'", specifier = ">=0.11" },
@@ -3952,27 +3991,27 @@ wheels = [
[[package]]
name = "uv"
-version = "0.4.7"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/16/a8/138c8967af143014e9ab1c7f473c1a93efc8fe9cd323197eb3309cb2dc97/uv-0.4.7.tar.gz", hash = "sha256:d6c8e43bbdfa2f7910245335acb93fcb5a4e34995b7ce60de4e814071690b3c5", size = 1864989 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/79/88/42a31a882afac996dc1e8f382afc73ca4b6eda0238cdfe04c50fedf7b148/uv-0.4.7-py3-none-linux_armv6l.whl", hash = "sha256:63b59e0cfa303a97ce5ba19fa8fc27a6339516561bc4b821cca52ed15721cbdb", size = 11138983 },
- { url = "https://files.pythonhosted.org/packages/4b/e5/e9c8ca8c71984afeb92ae378e9a354ba458d56e9b61c7a21fc3a4bf3deff/uv-0.4.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9356449439d4fa42419d17736d775cd1701b1b4a054ab445faf1477a6920a505", size = 11542168 },
- { url = "https://files.pythonhosted.org/packages/5e/00/7a065e1d4564f426f7d6a7cbc0118e72099dce177c1da524d0c62302b9ab/uv-0.4.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bfbd6e28b0543b774db7d97d61963c384c70284e95056004c8f74252e69616c7", size = 10683924 },
- { url = "https://files.pythonhosted.org/packages/13/12/69a6ad1ae1ee04f010b318fc0fa4eb4a461d86ef819ba864fb8c38094cf8/uv-0.4.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:54c3dde3c01d96fba484c2728e020c7c867e05a88de143ddb6df1091d1ffdfb7", size = 11011610 },
- { url = "https://files.pythonhosted.org/packages/78/dd/3552caf1d46de4c03e937e8631721464b5f69aafa92d3a56b1e81ed9f7ae/uv-0.4.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1357fb27047cff94422bb82cf9a82d7285ce8341a204fc1925b0b89c8d108249", size = 10951240 },
- { url = "https://files.pythonhosted.org/packages/81/20/9ceeab908a79ace5f07b37b52131afa3fcbd15eaa782e9c3566b28937447/uv-0.4.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:106fc5449a63137da6b3c4fd25775e3eeda3b11c8cea12439d95201237a95484", size = 11590608 },
- { url = "https://files.pythonhosted.org/packages/ef/5d/dbd4990bfa708f8a6ee259fe33e5c636910d87c7e2c40c6db145af4cd41c/uv-0.4.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e1f3285bebfeab6e076e651ec47f6adf7a83a4f014dd9d7e73efc034e77d42cd", size = 12389925 },
- { url = "https://files.pythonhosted.org/packages/d8/9f/aa646dbe07bc42c1332953720a595791b7f837beb82a9cdf2ea67fa53f8a/uv-0.4.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:904763380be165f5213dcbacb8d6c17d5cf138ea4bd24b4a37a1b6046b5650a1", size = 12179202 },
- { url = "https://files.pythonhosted.org/packages/1d/c0/bcb66d0b66c6da1b0105fabbc6434dd0ca046ac77bf5220669dbaa29f045/uv-0.4.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab7308c0604268f21b1a5bce4e1b61bcf56831f4aef59bee93c2b5815f4bc6a8", size = 15345161 },
- { url = "https://files.pythonhosted.org/packages/99/45/3cc3d9cdec4fa0572d077648d7263a876911870081696d4d4b209258e207/uv-0.4.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec49a00317799226d33135bf40e8da44262f44e3980a5bb9e6dae7250523c963", size = 11934876 },
- { url = "https://files.pythonhosted.org/packages/53/55/1866fccd01a2e0558986e2c15658cfa0ea60f134f7252c9413a261a43965/uv-0.4.7-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:00aa7299edefcc4069d73b988a7331d590e3fedd29f5695b1680905af1ccba04", size = 11106549 },
- { url = "https://files.pythonhosted.org/packages/9b/ce/f171f35cc6f57d040a2ef408ea273b6a0c873458e54da96b9c25a5b7bfed/uv-0.4.7-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:0fef80011c96dc8e284f4895b7ca92945e450fb517872115a557e72789c0e2c5", size = 10943998 },
- { url = "https://files.pythonhosted.org/packages/d6/3a/532d19792ce9c474b42d409993bdc90f2948f1bea1e2a7e609c3996aac26/uv-0.4.7-py3-none-musllinux_1_1_i686.whl", hash = "sha256:a1850d93f78eeb6d0ace3dc0335e1bf141a4b6a26844ab75f00055de2a4817cd", size = 11396231 },
- { url = "https://files.pythonhosted.org/packages/6b/19/1e3931566dfde41167aff5cca6f49071137d15062056489352153b3969d4/uv-0.4.7-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:e8bc35e30f2bb03f0e1812f1c0dce0e73d8ab01e90392d39f334da9d75e522b0", size = 13169721 },
- { url = "https://files.pythonhosted.org/packages/64/7c/4c537c97a84486dd4a96d5bfedd9ed1d785663ce85920d763ee838489882/uv-0.4.7-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:2ab5f6701046b373cdedca7334e20a8dc7726eb4c3e2f6e18297dbbda09afba9", size = 12072053 },
- { url = "https://files.pythonhosted.org/packages/6b/a0/ba28620a680d2178db72063fb35660047519b3fa0bdae8823b5a9ba1a273/uv-0.4.7-py3-none-win32.whl", hash = "sha256:319a585f53c0b63b989526206383716e1d7c0f3483425058b94bf47402a81841", size = 11304199 },
- { url = "https://files.pythonhosted.org/packages/31/31/0e7d565e77c06612de3333e9b06e3e8e833f13439f041d5d86f5c2d0f10c/uv-0.4.7-py3-none-win_amd64.whl", hash = "sha256:23283699e6035ef536b204f9094e7297093a527f958b86d4ce26613c603f564c", size = 12537968 },
+version = "0.4.12"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e8/f8/186757710d7262fd36aa0c4dfeacdb2288ecb17e3c1e40798c5d63243866/uv-0.4.12.tar.gz", hash = "sha256:0f00d15108af7b17f49d70714a31927eed27e192d5e5410822c098399d61196d", size = 1901581 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/9d/404e068b70a779c1438c2e9268366f2344c84fb6ad6fa80d24a9990a1722/uv-0.4.12-py3-none-linux_armv6l.whl", hash = "sha256:31f7689c6f49b0489dc727b1e6f0f008f7db21388c3cf374577a445bd7d727b8", size = 11526223 },
+ { url = "https://files.pythonhosted.org/packages/c0/e7/4face1444a283c2402d8be1c245eed0993b7bf6b1e5aacee81b66bc5e864/uv-0.4.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9aa768f4b94335a4145d74e73ff4721cb1a3e1fd1269f4bb95187a9f8d41f8e1", size = 11907813 },
+ { url = "https://files.pythonhosted.org/packages/f3/24/151ccb4586c43957743b28e675894d385daff3e7783595d53e5cd9e1714c/uv-0.4.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c081b13c7789b518a2077ed0c49d33c9d855e110a2f670e4f354696245089edc", size = 11007331 },
+ { url = "https://files.pythonhosted.org/packages/7b/04/ece989bccef9c86cd4a0b137a2a5d8707d024d6a832e73c2c4f20cd2117b/uv-0.4.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:c6861b3c92da1cdc2cb18c76b0e05004413ce1cc95782a4b34b7ee002006efb8", size = 11313895 },
+ { url = "https://files.pythonhosted.org/packages/9e/1a/71d63b6db35a80e3234794cee95a6283eb812ba825002092d28b27d3369f/uv-0.4.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0840d0141f54f64474c9dbd46787971859fac9deacc701091b44f1c47d066823", size = 11328920 },
+ { url = "https://files.pythonhosted.org/packages/08/57/69a5b304f4c915b30127841c604df59fe39265ef277c58dafdb00b84382b/uv-0.4.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:649d2974da5d867ca0230a15aa75d6e4625c2a71eddc0abaeebe7a167038f56b", size = 11962488 },
+ { url = "https://files.pythonhosted.org/packages/5a/e3/80090829f1fac0f0dfd82c81251a3b55a77797d5c36a03833d4e35409e27/uv-0.4.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6922ca516056069a6c835f0cf60053241bb3438e4ccc0356c223d4f5c0d92254", size = 12818066 },
+ { url = "https://files.pythonhosted.org/packages/fa/a7/6b8753a35c647da588f5be4e831bc7af0ad84e3c2bffa50d412dc04299ce/uv-0.4.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d2ada46563178cacfeb2ff8a3b2764381a953cee87002fad0b9181f4a35e0d", size = 12631775 },
+ { url = "https://files.pythonhosted.org/packages/6e/67/8905dedc2ee06cd2d40e2faab3cd7dcaf1c29bba0440c85f5f43b57ec957/uv-0.4.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86635a9dd024d08499405c9e1c1087aa24ffbfe89eb6dde010e5a60855e661bc", size = 16036126 },
+ { url = "https://files.pythonhosted.org/packages/f3/d4/42365daf1772e11278973243053ab362e9b9ba22b3a795554c4f995e0a48/uv-0.4.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67327c5997a9c4531c0e13be8545aa6568a15c99a97770ac65f6dcc5600e8a9c", size = 12277845 },
+ { url = "https://files.pythonhosted.org/packages/ca/b5/c3f6115a10c162173af4737455af266243ae5a5e19b13f5ec9a0319d1f8a/uv-0.4.12-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:8a102ee30a41909634b28cb9d7d5a03af2953aa86ff941e24916093f4a74d44f", size = 11510705 },
+ { url = "https://files.pythonhosted.org/packages/70/71/5675cdff0bb363c40615f21a496a2238f87254759f8ec5f0af341e17d36e/uv-0.4.12-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:e931a2add4dfec717184164a54608b99d37e0000b9c151bb020a0a2dcc6d5cc1", size = 11268523 },
+ { url = "https://files.pythonhosted.org/packages/38/55/6cf828f4031046bdeda0218055cd03d545b477ac3e49ebb60d9afeb43695/uv-0.4.12-py3-none-musllinux_1_1_i686.whl", hash = "sha256:8cbfa5ed4ea167291260416d71d54ffb949b0b98bcf945190adb8c65e30492be", size = 11760792 },
+ { url = "https://files.pythonhosted.org/packages/53/02/26f980f3ecccbab1ce29b2438ae69d8eee9ee7565033c2245da8bc7cd586/uv-0.4.12-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:a3c1b7b4a6e5258c0b20079beb1d22c3d306f7695eab8a3d3aea93b37db01b3a", size = 13582935 },
+ { url = "https://files.pythonhosted.org/packages/82/4a/485f0ed081c713686186bfd9dc6548aefb02f1cfd764ec132cb32ca4a428/uv-0.4.12-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:dc638ff81e817a1c049c8bd51c623238dccf9bfbfb17e20878eaece6c74338bb", size = 12458025 },
+ { url = "https://files.pythonhosted.org/packages/64/bb/7f14f9317e1000dc06023a8d7d35260023b5faa3420df1c6a3fd7144a7cb/uv-0.4.12-py3-none-win32.whl", hash = "sha256:0d548c090bf38fb76b6493c90bbfbad30bfc4b41365019953bffbc54d32394ed", size = 11696330 },
+ { url = "https://files.pythonhosted.org/packages/c3/e2/472bf7a0acaffa3f25ea127b7671299164630d971a4234434547a5f1e23a/uv-0.4.12-py3-none-win_amd64.whl", hash = "sha256:56901b53c9bcce81305826c89378058922b405d0fbfb5c2742dda7dc5fdf891c", size = 12817590 },
]
[[package]]