From 3f43a01a844c265a48ad4e0415872b98dd22cef1 Mon Sep 17 00:00:00 2001 From: Ian Carroll Date: Fri, 12 Apr 2024 18:16:17 +0000 Subject: [PATCH] Directly use `python_cmr`'s `temporal` methods. Bump `python_cmr` version to make use of additional logic in the `temporal` methods that were pushed from `earthaccess` up to `python_cmr` itself. Fixes #190 #330 --- .github/workflows/test-mindeps.yml | 2 +- ci/environment-mindeps.yaml | 4 +- docs/tutorials/SSL.ipynb | 20 ++- earthaccess/api.py | 4 +- earthaccess/search.py | 71 +++------ poetry.lock | 22 ++- pyproject.toml | 4 +- stubs/cmr/queries.pyi | 6 +- .../TestResults.test_data_links.yaml | 143 ++++++++++-------- tests/unit/test_collection_queries.py | 14 +- tests/unit/test_granule_queries.py | 14 +- 11 files changed, 166 insertions(+), 138 deletions(-) diff --git a/.github/workflows/test-mindeps.yml b/.github/workflows/test-mindeps.yml index f722a88e..db049b10 100644 --- a/.github/workflows/test-mindeps.yml +++ b/.github/workflows/test-mindeps.yml @@ -17,7 +17,7 @@ defaults: shell: bash -l {0} jobs: - test: + test-mindeps: runs-on: ubuntu-latest strategy: fail-fast: false diff --git a/ci/environment-mindeps.yaml b/ci/environment-mindeps.yaml index cb8fd367..92e797b0 100644 --- a/ci/environment-mindeps.yaml +++ b/ci/environment-mindeps.yaml @@ -8,14 +8,13 @@ channels: dependencies: # required dependencies - python=3.8 - - python-cmr=0.9.0 + - python-cmr=0.10.0 - pqdm=0.1 - requests=2.26 - s3fs=2022.11 - fsspec=2022.11 - tinynetrc=1.3.1 - multimethod=1.8 - - python-dateutil=2.8.2 - importlib-resources=6.3.2 - typing-extensions=4.10.0 # test dependencies @@ -24,7 +23,6 @@ dependencies: - pytest-cov - python-magic - mypy - - types-python-dateutil - types-requests - types-setuptools - ruff diff --git a/docs/tutorials/SSL.ipynb b/docs/tutorials/SSL.ipynb index def268fd..75182d4b 100644 --- a/docs/tutorials/SSL.ipynb +++ b/docs/tutorials/SSL.ipynb @@ -102,10 +102,8 @@ "source": [ "granules = earthaccess.search_data(\n", " short_name = \"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\",\n", - " temporal = (\"2017-01\",\"2018-01\"),\n", - " count = -1\n", - ")\n", - "print(len(granules))" + " count = 1\n", + ")" ] }, { @@ -185,10 +183,10 @@ " print(f\"Retrieving data for year: {year}\")\n", " results = earthaccess.search_data(\n", " doi = \"10.5067/SLREF-CDRV3\",\n", - " temporal=(f\"{year}-05\", f\"{year}-06\")\n", + " temporal=(f\"{year}-05\", f\"{year}-05\"),\n", + " count = 1,\n", " )\n", - " if len(results)>0:\n", - " granules.append(results[0])\n", + " granules.append(results[0])\n", "print(f\"Total granules: {len(granules)}\")" ] }, @@ -259,11 +257,11 @@ "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", - " \n", + "\n", " Parameter\n", " ==========\n", - " lats: a list or numpy array of size N the latitudes of interest. \n", - " \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", @@ -357,7 +355,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.11.8" } }, "nbformat": 4, diff --git a/earthaccess/api.py b/earthaccess/api.py index 796dbcb5..0dd793cf 100644 --- a/earthaccess/api.py +++ b/earthaccess/api.py @@ -43,7 +43,7 @@ def search_datasets(count: int = -1, **kwargs: Any) -> List[DataCollection]: * **daac**: e.g. NSIDC or PODAAC * **provider**: particular to each DAAC, e.g. POCLOUD, LPDAAC etc. * **temporal**: a tuple representing temporal bounds in the form - `("yyyy-mm-dd", "yyyy-mm-dd")` + `(date_from, date_to)` * **bounding_box**: a tuple representing spatial bounds in the form `(lower_left_lon, lower_left_lat, upper_right_lon, upper_right_lat)` @@ -94,7 +94,7 @@ def search_data(count: int = -1, **kwargs: Any) -> List[DataGranule]: * **daac**: e.g. NSIDC or PODAAC * **provider**: particular to each DAAC, e.g. POCLOUD, LPDAAC etc. * **temporal**: a tuple representing temporal bounds in the form - `("yyyy-mm-dd", "yyyy-mm-dd")` + `(date_from, date_to)` * **bounding_box**: a tuple representing spatial bounds in the form `(lower_left_lon, lower_left_lat, upper_right_lon, upper_right_lat)` diff --git a/earthaccess/search.py b/earthaccess/search.py index fadd7b55..bc233a4c 100644 --- a/earthaccess/search.py +++ b/earthaccess/search.py @@ -1,7 +1,6 @@ import datetime as dt from inspect import getmembers, ismethod -import dateutil.parser as parser import requests from typing_extensions import ( Any, @@ -409,18 +408,23 @@ def daac(self, daac_short_name: str) -> Self: @override def temporal( self, - date_from: Optional[Union[str, dt.datetime]] = None, - date_to: Optional[Union[str, dt.datetime]] = None, + date_from: Optional[Union[str, dt.date, dt.datetime]] = None, + date_to: Optional[Union[str, dt.date, dt.datetime]] = None, exclude_boundary: bool = False, ) -> Self: - """Filter by an open or closed date range. Dates can be provided as datetime - objects or ISO 8601 formatted strings. Multiple ranges can be provided by - successive calls to this method before calling execute(). + """Filter by an open or closed date range. Dates can be provided as date objects + or ISO 8601 strings. Multiple ranges can be provided by successive method calls. + + ???+ Tip + Giving either `datetime.date(YYYY, MM, DD)` or `"YYYY-MM-DD"` as the `date_to` + parameter includes that entire day (i.e. the time is set to `23:59:59`). + Using `datetime.datetime(YYYY, MM, DD)` is different, because `datetime.datetime` + objects have `00:00:00` as their built-in default. Parameters: - date_from (String or Datetime object): earliest date of temporal range - date_to (String or Datetime object): latest date of temporal range - exclude_boundary (Boolean): whether or not to exclude the date_from/to in + date_from: start of temporal range + date_to: end of temporal range + exclude_boundary: whether or not to exclude the date_from/to in the matched range. Returns: @@ -432,20 +436,6 @@ def temporal( object; or `date_from` and `date_to` are both datetime objects (or parsable as such) and `date_from` is after `date_to`. """ - DEFAULT = dt.datetime(1979, 1, 1) - if date_from is not None and not isinstance(date_from, dt.datetime): - try: - date_from = parser.parse(date_from, default=DEFAULT).isoformat() + "Z" - except Exception: - print("The provided start date was not recognized") - date_from = "" - - if date_to is not None and not isinstance(date_to, dt.datetime): - try: - date_to = parser.parse(date_to, default=DEFAULT).isoformat() + "Z" - except Exception: - print("The provided end date was not recognized") - date_to = "" return super().temporal(date_from, date_to, exclude_boundary) @@ -817,20 +807,23 @@ def debug(self, debug: bool = True) -> Self: @override def temporal( self, - date_from: Optional[Union[str, dt.datetime]] = None, - date_to: Optional[Union[str, dt.datetime]] = None, + date_from: Optional[Union[str, dt.date, dt.datetime]] = None, + date_to: Optional[Union[str, dt.date, dt.datetime]] = None, exclude_boundary: bool = False, ) -> Self: - """Filter by an open or closed date range. + """Filter by an open or closed date range. Dates can be provided as date objects + or ISO 8601 strings. Multiple ranges can be provided by successive method calls. - Dates can be provided as a datetime objects or ISO 8601 formatted strings. - Multiple ranges can be provided by successive calls to this method before - calling execute(). + ???+ Tip + Giving either `datetime.date(YYYY, MM, DD)` or `"YYYY-MM-DD"` as the `date_to` + parameter includes that entire day (i.e. the time is set to `23:59:59`). + Using `datetime.datetime(YYYY, MM, DD)` is different, because `datetime.datetime` + objects have `00:00:00` as their built-in default. Parameters: - date_from: earliest date of temporal range - date_to: latest date of temporal range - exclude_boundary: whether to exclude the date_from/to in the matched range + date_from: start of temporal range + date_to: end of temporal range + exclude_boundary: whether to exclude the date_from and date_to in the matched range Returns: self @@ -841,20 +834,6 @@ def temporal( object; or `date_from` and `date_to` are both datetime objects (or parsable as such) and `date_from` is after `date_to`. """ - DEFAULT = dt.datetime(1979, 1, 1) - if date_from is not None and not isinstance(date_from, dt.datetime): - try: - date_from = parser.parse(date_from, default=DEFAULT).isoformat() + "Z" - except Exception: - print("The provided start date was not recognized") - date_from = "" - - if date_to is not None and not isinstance(date_to, dt.datetime): - try: - date_to = parser.parse(date_to, default=DEFAULT).isoformat() + "Z" - except Exception: - print("The provided end date was not recognized") - date_to = "" return super().temporal(date_from, date_to, exclude_boundary) diff --git a/poetry.lock b/poetry.lock index eb125fc5..9c955653 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3727,16 +3727,17 @@ watchdog = ">=0.6.0" [[package]] name = "python-cmr" -version = "0.9.0" +version = "0.10.0" description = "Python wrapper to the NASA Common Metadata Repository (CMR) API." optional = false -python-versions = ">=3.8,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "python_cmr-0.9.0-py3-none-any.whl", hash = "sha256:ef20e41ef59cd323a4847cf52fc63e91e5fc632dc1743e42935748b5a474c5ef"}, - {file = "python_cmr-0.9.0.tar.gz", hash = "sha256:5c9a0eb9877de67d80df2d2e572f8614845c75a8457faddfbff9edc1ab90e992"}, + {file = "python_cmr-0.10.0-py3-none-any.whl", hash = "sha256:f9ef557b42b2482b0fae99ad4885556daf7689d45e796f0041209c46dc150ccf"}, + {file = "python_cmr-0.10.0.tar.gz", hash = "sha256:d806025ab80ebabe9607ddf905bae58e90e3a93076a164f35df0f37fb3b2d564"}, ] [package.dependencies] +python-dateutil = ">=2.8.2,<3.0.0" requests = ">=2.26.0,<3.0.0" [[package]] @@ -3850,6 +3851,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -3857,8 +3859,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -3875,6 +3885,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -3882,6 +3893,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -5109,4 +5121,4 @@ kerchunk = ["dask", "kerchunk"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0" -content-hash = "530a3cffb6d044e431ec3671268949e797d3c468c0f653b6fea7c90cdc422b3d" +content-hash = "99b3023c1221ac3f30b44853b47af6e10a12118642ef43067e49838fbf7062f4" diff --git a/pyproject.toml b/pyproject.toml index dbe917ca..3d7babb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,14 +34,13 @@ classifiers = [ # here, make sure to also update `ci/environment-mindeps.yaml`. [tool.poetry.dependencies] python = ">=3.8,<4.0" -python-cmr = ">=0.9.0" +python-cmr = ">=0.10.0" pqdm = ">=0.1" requests = ">=2.26" s3fs = ">=2022.11" fsspec = ">=2022.11" tinynetrc = "^1.3.1" multimethod = ">=1.8" -python-dateutil = ">=2.8.2" kerchunk = { version = ">=0.1.2", optional = true } dask = { version = ">=2022.1.0", optional = true } importlib-resources = ">=6.3.2" @@ -68,7 +67,6 @@ pymdown-extensions = ">=9.2" pygments = ">=2.11.1" responses = ">=0.14" ruff = "^0.1.6" -types-python-dateutil = ">=2.8.2" types-requests = ">=0.1" types-setuptools = ">=0.1" ipywidgets = ">=7.7.0" diff --git a/stubs/cmr/queries.pyi b/stubs/cmr/queries.pyi index 3b2fadc3..b7aeb20c 100644 --- a/stubs/cmr/queries.pyi +++ b/stubs/cmr/queries.pyi @@ -1,5 +1,5 @@ import sys -from datetime import datetime +from datetime import date, datetime from typing import Any, Optional, SupportsFloat, Union if sys.version_info < (3, 9): @@ -48,8 +48,8 @@ class GranuleCollectionBaseQuery(Query): def online_only(self, online_only: bool = True) -> Self: ... def temporal( self, - date_from: Optional[Union[str, datetime]], - date_to: Optional[Union[str, datetime]], + date_from: Optional[Union[str, date, datetime]], + date_to: Optional[Union[str, date, datetime]], exclude_boundary: bool = False, ) -> Self: ... def short_name(self, short_name: str) -> Self: ... diff --git a/tests/unit/fixtures/vcr_cassettes/TestResults.test_data_links.yaml b/tests/unit/fixtures/vcr_cassettes/TestResults.test_data_links.yaml index 762064e1..921d7942 100644 --- a/tests/unit/fixtures/vcr_cassettes/TestResults.test_data_links.yaml +++ b/tests/unit/fixtures/vcr_cassettes/TestResults.test_data_links.yaml @@ -11,7 +11,7 @@ interactions: response: body: string: '[{"access_token": "REDACTED", "token_type": "Bearer", "expiration_date": - "05/13/2024"}]' + "06/25/2024"}]' headers: Cache-Control: - no-store @@ -20,9 +20,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 26 Apr 2024 19:01:02 GMT + - Mon, 29 Apr 2024 23:19:04 GMT ETag: - - W/"a29dde6ffea7ea829fb5709ec38b2b11" + - W/"a0cdb36a1d9bf5a3d3eee622ea7c455d" Expires: - Fri, 01 Jan 1990 00:00:00 GMT Pragma: @@ -46,9 +46,9 @@ interactions: X-Permitted-Cross-Domain-Policies: - none X-Request-Id: - - f41262c4-1360-4246-8c5b-5b54b46717fb + - d25462a1-1f80-47e7-8f93-05071e90f8a4 X-Runtime: - - '0.017973' + - '1.058293' X-XSS-Protection: - 1; mode=block status: @@ -66,11 +66,11 @@ interactions: response: body: string: '{"uid": "REDACTED", "first_name": "REDACTED", "last_name": "REDACTED", - "email_address": "REDACTED", "registered_date": " 6 Jan 2023 13:19:54PM", - "country": "United States", "study_area": "Atmospheric Aerosols", "allow_auth_app_emails": - true, "user_type": "Public User", "affiliation": "GOVERNMENT", "organization": - "ECHO", "agreed_to_meris_eula": false, "agreed_to_sentinel_eula": false, "email_verified": - true, "user_groups": [], "user_authorized_apps": 50, "nams_auid": "REDACTED"}' + "email_address": "REDACTED", "registered_date": " 2 Apr 2024 17:43:33PM", + "country": "United States", "study_area": "Other", "allow_auth_app_emails": + true, "user_type": "Application", "affiliation": "Commercial", "agreed_to_meris_eula": + true, "agreed_to_sentinel_eula": true, "email_verified": true, "user_groups": + [], "user_authorized_apps": 24, "nams_auid": "REDACTED"}' headers: Cache-Control: - no-store @@ -79,9 +79,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 26 Apr 2024 19:01:05 GMT + - Mon, 29 Apr 2024 23:19:04 GMT ETag: - - W/"df58383a0996c7343807319c935bc446" + - W/"91914441d3cf5c48fd9794d7d56234aa" Expires: - Fri, 01 Jan 1990 00:00:00 GMT Pragma: @@ -105,9 +105,9 @@ interactions: X-Permitted-Cross-Domain-Policies: - none X-Request-Id: - - 3cc78a6c-670f-4d43-a837-c8c324a5a367 + - 56042173-d203-4e39-9fc1-20a6017d433b X-Runtime: - - '0.432446' + - '0.027858' X-XSS-Protection: - 1; mode=block status: @@ -133,7 +133,7 @@ interactions: Content-Type: - text/html; charset=utf-8 Date: - - Fri, 26 Apr 2024 19:01:05 GMT + - Mon, 29 Apr 2024 23:19:04 GMT Location: - https://urs.earthdata.nasa.gov/home Referrer-Policy: @@ -141,8 +141,8 @@ interactions: Server: - nginx/1.22.1 Set-Cookie: - - _urs-gui_session=dd31f5f10e3bb3b9d9a07b3d52dad224; path=/; expires=Sat, 27 - Apr 2024 19:01:05 GMT; HttpOnly + - _urs-gui_session=92a39ca69d55605a9f306660b175ad1d; path=/; expires=Tue, 30 + Apr 2024 23:19:04 GMT; HttpOnly Strict-Transport-Security: - max-age=31536000 Transfer-Encoding: @@ -156,9 +156,9 @@ interactions: X-Permitted-Cross-Domain-Policies: - none X-Request-Id: - - 67297224-26a6-4674-9b8e-138f6327eb85 + - cd1119fa-68df-4b28-b645-d3d7cb3b84f6 X-Runtime: - - '0.009517' + - '0.016459' X-XSS-Protection: - 1; mode=block status: @@ -193,7 +193,7 @@ interactions: \ \n \n \n \n\n\n \n\n \n \ \n \n\n \ \n