summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrique Joaquim <henriquecjoaquim@gmail.com>2024-04-11 15:01:36 +0100
committerGitHub <noreply@github.com>2024-04-11 14:01:36 +0000
commit3172b9e31268299586420360925aec28e07184ee (patch)
tree227ea9f39f6e06a6ed2552a3a778b5cfedff49de
parent00cc4502129fa4b8f2d859cae3be0247b6179153 (diff)
[BugFix] Fix metadata creation (#6306)
* fix metadata creation * fix metadata creation * adapt tests * adapt tests * adapt tests --------- Co-authored-by: hjoaquim <h.joaquim@campus.fct.unl.pt>
-rw-r--r--openbb_platform/core/openbb_core/app/model/metadata.py177
-rw-r--r--openbb_platform/core/tests/app/model/test_metadata.py34
-rw-r--r--openbb_platform/core/tests/app/test_command_runner.py1
3 files changed, 121 insertions, 91 deletions
diff --git a/openbb_platform/core/openbb_core/app/model/metadata.py b/openbb_platform/core/openbb_core/app/model/metadata.py
index eca37b061f9..70672dd1595 100644
--- a/openbb_platform/core/openbb_core/app/model/metadata.py
+++ b/openbb_platform/core/openbb_core/app/model/metadata.py
@@ -41,90 +41,95 @@ class Metadata(BaseModel):
containing the type and the columns. If the type is not one of the previous, the
value is kept or trimmed to 80 characters.
"""
- for arg, arg_val in v.items():
- new_arg_val: Optional[Union[str, dict[str, Sequence[Any]]]] = None
-
- # Data
- if isclass(type(arg_val)) and issubclass(type(arg_val), Data):
- new_arg_val = {
- "type": f"{type(arg_val).__name__}",
- "columns": list(arg_val.model_dump().keys()),
- }
-
- # List[Data]
- if isinstance(arg_val, list) and issubclass(type(arg_val[0]), Data):
- _columns = [list(d.model_dump().keys()) for d in arg_val]
- ld_columns = (
- item for sublist in _columns for item in sublist
- ) # flatten
- new_arg_val = {
- "type": f"List[{type(arg_val[0]).__name__}]",
- "columns": list(set(ld_columns)),
- }
-
- # DataFrame
- elif isinstance(arg_val, pd.DataFrame):
- df_columns = (
- list(arg_val.index.names) + arg_val.columns.tolist()
- if any(index is not None for index in list(arg_val.index.names))
- else arg_val.columns.tolist()
- )
- new_arg_val = {
- "type": f"{type(arg_val).__name__}",
- "columns": df_columns,
- }
-
- # List[DataFrame]
- elif isinstance(arg_val, list) and issubclass(
- type(arg_val[0]), pd.DataFrame
- ):
- ldf_columns = [
- (
- list(df.index.names) + df.columns.tolist()
- if any(index is not None for index in list(df.index.names))
- else df.columns.tolist()
+ arguments: Dict[str, Any] = {}
+ for item in ["provider_choices", "standard_params", "extra_params"]:
+ arguments[item] = {}
+ for arg, arg_val in v[item].items():
+ new_arg_val: Optional[Union[str, dict[str, Sequence[Any]]]] = None
+
+ # Data
+ if isclass(type(arg_val)) and issubclass(type(arg_val), Data):
+ new_arg_val = {
+ "type": f"{type(arg_val).__name__}",
+ "columns": list(arg_val.model_dump().keys()),
+ }
+
+ # List[Data]
+ if isinstance(arg_val, list) and issubclass(type(arg_val[0]), Data):
+ _columns = [list(d.model_dump().keys()) for d in arg_val]
+ ld_columns = (
+ item for sublist in _columns for item in sublist
+ ) # flatten
+ new_arg_val = {
+ "type": f"List[{type(arg_val[0]).__name__}]",
+ "columns": list(set(ld_columns)),
+ }
+
+ # DataFrame
+ elif isinstance(arg_val, pd.DataFrame):
+ df_columns = (
+ list(arg_val.index.names) + arg_val.columns.tolist()
+ if any(index is not None for index in list(arg_val.index.names))
+ else arg_val.columns.tolist()
)
- for df in arg_val
- ]
- new_arg_val = {
- "type": f"List[{type(arg_val[0]).__name__}]",
- "columns": ldf_columns,
- }
-
- # Series
- elif isinstance(arg_val, pd.Series):
- new_arg_val = {
- "type": f"{type(arg_val).__name__}",
- "columns": list(arg_val.index.names) + [arg_val.name],
- }
-
- # List[Series]
- elif isinstance(arg_val, list) and isinstance(arg_val[0], pd.Series):
- ls_columns = [
- (
- list(series.index.names) + [series.name]
- if any(index is not None for index in list(series.index.names))
- else series.name
- )
- for series in arg_val
- ]
- new_arg_val = {
- "type": f"List[{type(arg_val[0]).__name__}]",
- "columns": ls_columns,
- }
-
- # ndarray
- elif isinstance(arg_val, np.ndarray):
- new_arg_val = {
- "type": f"{type(arg_val).__name__}",
- "columns": list(arg_val.dtype.names or []),
- }
-
- else:
- str_repr_arg_val = str(arg_val)
- if len(str_repr_arg_val) > 80:
- new_arg_val = str_repr_arg_val[:80]
-
- v[arg] = new_arg_val or arg_val
-
- return v
+ new_arg_val = {
+ "type": f"{type(arg_val).__name__}",
+ "columns": df_columns,
+ }
+
+ # List[DataFrame]
+ elif isinstance(arg_val, list) and issubclass(
+ type(arg_val[0]), pd.DataFrame
+ ):
+ ldf_columns = [
+ (
+ list(df.index.names) + df.columns.tolist()
+ if any(index is not None for index in list(df.index.names))
+ else df.columns.tolist()
+ )
+ for df in arg_val
+ ]
+ new_arg_val = {
+ "type": f"List[{type(arg_val[0]).__name__}]",
+ "columns": ldf_columns,
+ }
+
+ # Series
+ elif isinstance(arg_val, pd.Series):
+ new_arg_val = {
+ "type": f"{type(arg_val).__name__}",
+ "columns": list(arg_val.index.names) + [arg_val.name],
+ }
+
+ # List[Series]
+ elif isinstance(arg_val, list) and isinstance(arg_val[0], pd.Series):
+ ls_columns = [
+ (
+ list(series.index.names) + [series.name]
+ if any(
+ index is not None for index in list(series.index.names)
+ )
+ else series.name
+ )
+ for series in arg_val
+ ]
+ new_arg_val = {
+ "type": f"List[{type(arg_val[0]).__name__}]",
+ "columns": ls_columns,
+ }
+
+ # ndarray
+ elif isinstance(arg_val, np.ndarray):
+ new_arg_val = {
+ "type": f"{type(arg_val).__name__}",
+ "columns": list(arg_val.dtype.names or []),
+ }
+
+ else:
+ str_repr_arg_val = str(arg_val)
+ if len(str_repr_arg_val) > 80:
+ new_arg_val = str_repr_arg_val[:80]
+
+ arguments[item][arg] = new_arg_val or arg_val
+
+ return arguments
diff --git a/openbb_platform/core/tests/app/model/test_metadata.py b/openbb_platform/core/tests/app/model/test_metadata.py
index 0368271c6ef..37bf7377984 100644
--- a/openbb_platform/core/tests/app/model/test_metadata.py
+++ b/openbb_platform/core/tests/app/model/test_metadata.py
@@ -12,7 +12,11 @@ from openbb_core.provider.abstract.data import Data
def test_Metadata():
"""Run Smoke test."""
m = Metadata(
- arguments={"test": "test"},
+ arguments={
+ "provider_choices": {},
+ "standard_params": {},
+ "extra_params": {},
+ },
route="test",
timestamp=datetime.now(),
duration=0,
@@ -44,7 +48,7 @@ def test_fields():
{
"data_list": {
"type": "List[Data]",
- "columns": ["open", "close", "volume"],
+ "columns": ["open", "volume", "close"],
}
},
),
@@ -101,8 +105,13 @@ def test_fields():
)
def test_scale_arguments(input_data, expected_output):
"""Test the scale_arguments method."""
+ kwargs = {
+ "provider_choices": {},
+ "standard_params": {},
+ "extra_params": input_data,
+ }
m = Metadata(
- arguments=input_data,
+ arguments=kwargs,
route="test",
timestamp=datetime.now(),
duration=0,
@@ -112,9 +121,24 @@ def test_scale_arguments(input_data, expected_output):
for arg in arguments: # pylint: disable=E1133
if "columns" in arguments[arg]:
# compare the column names disregarding the order with the expected output
- assert sorted(arguments[arg]["columns"]) == sorted(
+ assert sorted(arguments["extra_params"][arg]["columns"]) == sorted(
expected_output[arg]["columns"]
)
assert arguments[arg]["type"] == expected_output[arg]["type"]
else:
- assert m.arguments == expected_output
+ # assert m.arguments["extra_params"] == expected_output
+ keys = list(arguments["extra_params"].keys())
+ expected_keys = list(expected_output.keys())
+ assert sorted(keys) == sorted(expected_keys)
+
+ for key in keys:
+ if "type" in arguments["extra_params"][key]:
+ assert (
+ arguments["extra_params"][key]["type"]
+ == expected_output[key]["type"]
+ )
+ assert sorted(arguments["extra_params"][key]["columns"]) == sorted(
+ expected_output[key]["columns"]
+ )
+ else:
+ assert arguments["extra_params"][key] == expected_output[key]
diff --git a/openbb_platform/core/tests/app/test_command_runner.py b/openbb_platform/core/tests/app/test_command_runner.py
index 446d64ce061..d56acfca82c 100644
--- a/openbb_platform/core/tests/app/test_command_runner.py
+++ b/openbb_platform/core/tests/app/test_command_runner.py
@@ -352,6 +352,7 @@ async def test_static_command_runner_run(
"""Initialize the mock object."""
self.results = results
self.extra = {}
+ self.extra["metadata"] = {"test": "test"}
mock_get_command.return_value = other_mock_func
mock_execute_func.return_value = MockOBBject(results=[1, 2, 3, 4])