Skip to content

Commit fd5ac0e

Browse files
authored
feat(core): add EODAG_PRODUCT_TYPES_CFG_FILE env var (#1559)
1 parent c59e264 commit fd5ac0e

File tree

4 files changed

+75
-23
lines changed

4 files changed

+75
-23
lines changed

docs/getting_started_guide/configure.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ Some EODAG core settings can be overriden using environment variables:
149149
`locations <https://eodag.readthedocs.io/en/stable/notebooks/api_user_guide/4_search.html#Locations-search>`_
150150
configuration file
151151
* ``EODAG_PROVIDERS_CFG_FILE`` for defining the desired path to the providers configuration file
152+
* ``EODAG_PRODUCT_TYPES_CFG_FILE`` for defining the desired path to the product types configuration file
152153
* ``EODAG_EXT_PRODUCT_TYPES_CFG_FILE`` for defining the desired path to the `external product types configuration file\
153154
<https://eodag.readthedocs.io/en/stable/notebooks/api_user_guide/2_providers_products_available.html#Product-types-discovery>`_
154155

eodag/api/core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def __init__(
119119
user_conf_file_path: Optional[str] = None,
120120
locations_conf_path: Optional[str] = None,
121121
) -> None:
122-
product_types_config_path = str(
122+
product_types_config_path = os.getenv("EODAG_PRODUCT_TYPES_CFG_FILE") or str(
123123
res_files("eodag") / "resources" / "product_types.yml"
124124
)
125125
self.product_types_config = SimpleYamlProxyConfig(product_types_config_path)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
TEST_PRODUCT_1:
2+
abstract: |
3+
This is the first test product.
4+
instrument: I1
5+
platform: Platform1
6+
platformSerialIdentifier: P1
7+
processingLevel: L1
8+
keywords: TEST,PRODUCT1
9+
sensorType: test
10+
license: other
11+
missionStartDate: "2014-12-07T00:00:00Z"
12+
title: Test Product 1
13+
14+
TEST_PRODUCT_2:
15+
abstract: |
16+
This is the second test product.
17+
instrument: I2
18+
platform: Platform2
19+
platformSerialIdentifier: P2
20+
processingLevel: L2
21+
keywords: TEST,PRODUCT2
22+
sensorType: test
23+
license: other
24+
missionStartDate: "2014-12-07T00:00:00Z"
25+
title: Test Product 2

tests/units/test_core.py

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from pathlib import Path
3030
from tempfile import TemporaryDirectory
3131

32+
import yaml
3233
from lxml import html
3334
from pkg_resources import DistributionNotFound
3435
from pydantic import ValidationError
@@ -37,7 +38,7 @@
3738

3839
from eodag import __version__ as eodag_version
3940
from eodag.types.queryables import QueryablesDict
40-
from eodag.utils import GENERIC_PRODUCT_TYPE
41+
from eodag.utils import GENERIC_PRODUCT_TYPE, cached_yaml_load_all
4142
from tests import TEST_RESOURCES_PATH
4243
from tests.context import (
4344
DEFAULT_MAX_ITEMS_PER_PAGE,
@@ -1932,29 +1933,22 @@ def test_available_sortables(self):
19321933

19331934

19341935
class TestCoreConfWithEnvVar(TestCoreBase):
1935-
@classmethod
1936-
def setUpClass(cls):
1937-
super(TestCoreConfWithEnvVar, cls).setUpClass()
1938-
cls.dag = EODataAccessGateway()
1939-
# mock os.environ to empty env
1940-
cls.mock_os_environ = mock.patch.dict(os.environ, {}, clear=True)
1941-
cls.mock_os_environ.start()
1942-
1943-
@classmethod
1944-
def tearDownClass(cls):
1945-
super(TestCoreConfWithEnvVar, cls).tearDownClass()
1946-
# stop os.environ
1947-
cls.mock_os_environ.stop()
1936+
def tearDown(self):
1937+
"""Teardown run after every test"""
1938+
if dag := getattr(self, "dag", None):
1939+
index_dir = os.path.join(dag.conf_dir, ".index")
1940+
shutil.rmtree(index_dir)
1941+
del dag
19481942

19491943
def test_core_object_prioritize_locations_file_in_envvar(self):
19501944
"""The core object must use the locations file pointed by the EODAG_LOCS_CFG_FILE env var"""
19511945
try:
19521946
os.environ["EODAG_LOCS_CFG_FILE"] = os.path.join(
19531947
TEST_RESOURCES_PATH, "file_locations_override.yml"
19541948
)
1955-
dag = EODataAccessGateway()
1949+
self.dag = EODataAccessGateway()
19561950
self.assertEqual(
1957-
dag.locations_config,
1951+
self.dag.locations_config,
19581952
[dict(attr="dummyattr", name="dummyname", path="dummypath.shp")],
19591953
)
19601954
finally:
@@ -1966,11 +1960,13 @@ def test_core_object_prioritize_config_file_in_envvar(self):
19661960
os.environ["EODAG_CFG_FILE"] = os.path.join(
19671961
TEST_RESOURCES_PATH, "file_config_override.yml"
19681962
)
1969-
dag = EODataAccessGateway()
1963+
self.dag = EODataAccessGateway()
19701964
# usgs priority is set to 5 in the test config overrides
1971-
self.assertEqual(dag.get_preferred_provider(), ("usgs", 5))
1965+
self.assertEqual(self.dag.get_preferred_provider(), ("usgs", 5))
19721966
# peps outputs prefix is set to /data
1973-
self.assertEqual(dag.providers_config["peps"].download.output_dir, "/data")
1967+
self.assertEqual(
1968+
self.dag.providers_config["peps"].download.output_dir, "/data"
1969+
)
19741970
finally:
19751971
os.environ.pop("EODAG_CFG_FILE", None)
19761972

@@ -1980,16 +1976,46 @@ def test_core_object_prioritize_providers_file_in_envvar(self):
19801976
os.environ["EODAG_PROVIDERS_CFG_FILE"] = os.path.join(
19811977
TEST_RESOURCES_PATH, "file_providers_override.yml"
19821978
)
1983-
dag = EODataAccessGateway()
1979+
self.dag = EODataAccessGateway()
19841980
# only foo_provider in conf
1985-
self.assertEqual(dag.available_providers(), ["foo_provider"])
1981+
self.assertEqual(self.dag.available_providers(), ["foo_provider"])
19861982
self.assertEqual(
1987-
dag.providers_config["foo_provider"].search.api_endpoint,
1983+
self.dag.providers_config["foo_provider"].search.api_endpoint,
19881984
"https://foo.bar/search",
19891985
)
19901986
finally:
19911987
os.environ.pop("EODAG_PROVIDERS_CFG_FILE", None)
19921988

1989+
def test_core_product_types_config_envvar(self):
1990+
"""product types should be loaded from file defined in env var"""
1991+
# setup providers config
1992+
config_path = os.path.join(TEST_RESOURCES_PATH, "file_providers_override.yml")
1993+
providers_config: list[ProviderConfig] = cached_yaml_load_all(config_path)
1994+
providers_config[0].products["TEST_PRODUCT_1"] = {"productType": "TP1"}
1995+
providers_config[0].products["TEST_PRODUCT_2"] = {"productType": "TP2"}
1996+
with open(
1997+
os.path.join(self.tmp_home_dir.name, "file_providers_override2.yml"), "w"
1998+
) as f:
1999+
f.write(yaml.dump(providers_config[0]))
2000+
# set env variables
2001+
os.environ["EODAG_PROVIDERS_CFG_FILE"] = os.path.join(
2002+
self.tmp_home_dir.name, "file_providers_override2.yml"
2003+
)
2004+
os.environ["EODAG_PRODUCT_TYPES_CFG_FILE"] = os.path.join(
2005+
TEST_RESOURCES_PATH, "file_product_types_override.yml"
2006+
)
2007+
# check product types
2008+
try:
2009+
self.dag = EODataAccessGateway()
2010+
pt = self.dag.list_product_types(fetch_providers=False)
2011+
self.assertEqual(2, len(pt))
2012+
self.assertEqual("TEST_PRODUCT_1", pt[0]["ID"])
2013+
self.assertEqual("TEST_PRODUCT_2", pt[1]["ID"])
2014+
finally:
2015+
# remove env variables
2016+
os.environ.pop("EODAG_PROVIDERS_CFG_FILE", None)
2017+
os.environ.pop("EODAG_PRODUCT_TYPES_CFG_FILE", None)
2018+
19932019

19942020
class TestCoreInvolvingConfDir(unittest.TestCase):
19952021
@classmethod

0 commit comments

Comments
 (0)