Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] - refactor examples #6154

Merged
merged 142 commits into from
Mar 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
f630df7
remove auto examples and split python from api
montezdesousa Mar 1, 2024
95a3c80
add missing exampels
montezdesousa Mar 1, 2024
f5ca92e
rebuild
montezdesousa Mar 1, 2024
a9e8115
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 1, 2024
26bd1b2
query params focstring
montezdesousa Mar 1, 2024
0783aac
black
montezdesousa Mar 1, 2024
1ae2cbd
add scoped examples
montezdesousa Mar 1, 2024
c5d7776
group model imports in the router
montezdesousa Mar 1, 2024
3952c1c
unblock api
montezdesousa Mar 1, 2024
70bd9ab
fix
montezdesousa Mar 1, 2024
52ed665
classify examples
montezdesousa Mar 1, 2024
3f85528
fix package identation
montezdesousa Mar 1, 2024
6b8e07c
black sig
montezdesousa Mar 1, 2024
886ed13
fix indentation without linter
montezdesousa Mar 1, 2024
3edcd91
fix python examples
montezdesousa Mar 1, 2024
d61c1e5
remove doc
montezdesousa Mar 1, 2024
90517eb
pylint
montezdesousa Mar 1, 2024
eb6cc1f
again
montezdesousa Mar 1, 2024
c90c9f8
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 1, 2024
5bcdc2d
add model validators
montezdesousa Mar 1, 2024
7282af0
commodity, crypto, currency
montezdesousa Mar 3, 2024
0ff76cb
filter examples
montezdesousa Mar 3, 2024
c06927b
fix python examples
montezdesousa Mar 3, 2024
a8f7ebc
fix filter and build
montezdesousa Mar 3, 2024
378cd05
undo toml change
montezdesousa Mar 3, 2024
ddbb77b
add comment
montezdesousa Mar 3, 2024
4fbe369
oop
montezdesousa Mar 3, 2024
1b4623a
comment
montezdesousa Mar 3, 2024
e2a1c4b
typing
montezdesousa Mar 3, 2024
2f5e25d
lint
montezdesousa Mar 3, 2024
849e058
Update router.py
montezdesousa Mar 3, 2024
346397f
Update econometrics_router.py
montezdesousa Mar 3, 2024
c1f47b3
fix to_python
montezdesousa Mar 4, 2024
a5db02b
to_python
montezdesousa Mar 4, 2024
aeda34b
to_python
montezdesousa Mar 4, 2024
1a6a15a
black
montezdesousa Mar 4, 2024
36437d1
fix multiple line field descriptions
montezdesousa Mar 4, 2024
c3c0a48
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 4, 2024
7a5b953
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 4, 2024
e00a0e3
remove circular import
montezdesousa Mar 5, 2024
b906f79
add missing import
montezdesousa Mar 5, 2024
cd56b42
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 6, 2024
d194791
pass indent as object attr
montezdesousa Mar 6, 2024
9369824
doc
montezdesousa Mar 6, 2024
71cdd61
doc
montezdesousa Mar 6, 2024
f6f442f
this looks better
montezdesousa Mar 6, 2024
26aa114
forgot this
montezdesousa Mar 6, 2024
c93a7ab
fix: new examples adapted
montezdesousa Mar 6, 2024
55d199d
fix prev commit
montezdesousa Mar 6, 2024
342e977
avoid future problems
montezdesousa Mar 6, 2024
f5f1fe5
Update ownership_router.py
montezdesousa Mar 6, 2024
98f2368
rebuild + remove todo
montezdesousa Mar 6, 2024
75f466e
make description mandatory for python examples
montezdesousa Mar 6, 2024
2f6440a
simple indent
montezdesousa Mar 6, 2024
9695ead
append_examples func works for both website and docstring
the-praxs Mar 6, 2024
1aef9aa
Add example unit tests
IgorWounds Mar 6, 2024
d1343cc
Edit example unit tests
IgorWounds Mar 6, 2024
27f5491
Merge branch 'develop' into feature/refactor_examples
IgorWounds Mar 6, 2024
65c08d5
fix validator
montezdesousa Mar 6, 2024
a918137
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 6, 2024
03046fc
this works
montezdesousa Mar 6, 2024
c01feeb
fix to_python
montezdesousa Mar 6, 2024
ee2272a
fix mandatory docstrings
montezdesousa Mar 6, 2024
2926f27
typing
montezdesousa Mar 6, 2024
994982b
shorter error msgs
montezdesousa Mar 7, 2024
307ac0a
economy router
montezdesousa Mar 7, 2024
161cd02
fix more examples
montezdesousa Mar 7, 2024
dbc19af
more examples
montezdesousa Mar 7, 2024
629a7a5
more examples
montezdesousa Mar 7, 2024
31f96e4
more examples
montezdesousa Mar 7, 2024
99476a3
field desc
montezdesousa Mar 7, 2024
ad2d8c3
minor fix
montezdesousa Mar 7, 2024
b4f5a6c
fix etf examples
montezdesousa Mar 7, 2024
b3e5473
handling types better
montezdesousa Mar 7, 2024
b7f181c
lint
montezdesousa Mar 7, 2024
07ef010
rename method
montezdesousa Mar 7, 2024
06ee1d4
rename var
montezdesousa Mar 7, 2024
0ed69e9
docstring + move method
montezdesousa Mar 7, 2024
d4d6d6d
typing
montezdesousa Mar 7, 2024
d0a610b
prompt
montezdesousa Mar 7, 2024
5d16a0f
rebuild
montezdesousa Mar 7, 2024
cc1fe43
prompt fix in PythonEx
the-praxs Mar 7, 2024
881aa5b
fix examples without model
montezdesousa Mar 7, 2024
1440b10
example mock data
montezdesousa Mar 7, 2024
890c310
add get_field_type func to get field data type
the-praxs Mar 7, 2024
010a04f
panel data
montezdesousa Mar 7, 2024
0e007d4
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 7, 2024
3ab5d31
mock data
montezdesousa Mar 7, 2024
eba5b1a
fix
montezdesousa Mar 7, 2024
7cbc2ab
fix
montezdesousa Mar 7, 2024
c74dc3c
docstring
montezdesousa Mar 7, 2024
98dc42c
ohlcv
montezdesousa Mar 7, 2024
f7f01d6
pylint
montezdesousa Mar 7, 2024
d50eef1
quantitaive router
montezdesousa Mar 7, 2024
362db00
simplify mock data
montezdesousa Mar 7, 2024
73aec61
fix remaining quantitative routers
montezdesousa Mar 7, 2024
93fac12
a bit more flexibility for examples
montezdesousa Mar 7, 2024
2d58015
lint
montezdesousa Mar 7, 2024
76e97de
mock dat from sample
montezdesousa Mar 7, 2024
88b97fa
docstring
montezdesousa Mar 7, 2024
26f04e2
assertion
montezdesousa Mar 7, 2024
29b41c3
bugfix
montezdesousa Mar 7, 2024
6955062
minor fix
montezdesousa Mar 7, 2024
186a536
technical
montezdesousa Mar 7, 2024
66bde2a
fix integration tests
montezdesousa Mar 7, 2024
3d37165
fix docstring
montezdesousa Mar 7, 2024
0773024
econometrics examples
montezdesousa Mar 7, 2024
b298b12
econometrics examples
montezdesousa Mar 7, 2024
6c9e7f7
remove warning
montezdesousa Mar 7, 2024
8efc40d
add technical examples
montezdesousa Mar 7, 2024
03d314a
fix bad examples
montezdesousa Mar 8, 2024
517691a
fix more examples
montezdesousa Mar 8, 2024
450b2bb
update test rules
montezdesousa Mar 8, 2024
d72c2e6
remoce old pydantic referenc
montezdesousa Mar 8, 2024
85ab01c
fix bug in treasury prices
montezdesousa Mar 8, 2024
936dc54
fix quantitative examples
montezdesousa Mar 8, 2024
36e0111
discovery router
montezdesousa Mar 8, 2024
63927a7
equity shorts
montezdesousa Mar 8, 2024
be027e9
equity shorts
montezdesousa Mar 8, 2024
fe772a4
fix currency pairs
montezdesousa Mar 8, 2024
6a31fa6
fix sec_router example
montezdesousa Mar 8, 2024
b8324f8
fix panel data to support all funcs
montezdesousa Mar 8, 2024
05f5f08
black
montezdesousa Mar 8, 2024
92bc044
more examples fixes
montezdesousa Mar 8, 2024
3a9b813
simplify test
montezdesousa Mar 8, 2024
3130be8
rebuild
montezdesousa Mar 8, 2024
6949b24
Merge branch 'develop' into feature/refactor_examples
montezdesousa Mar 8, 2024
6854764
test doc
montezdesousa Mar 8, 2024
a0a74be
add provider to some ex
montezdesousa Mar 8, 2024
5d48ee3
^
montezdesousa Mar 8, 2024
a9ec896
last
montezdesousa Mar 8, 2024
c73b403
add provider
montezdesousa Mar 8, 2024
d5aa76f
rebuild
montezdesousa Mar 8, 2024
b5f63bf
working examples
montezdesousa Mar 8, 2024
6b55c7f
noqa
montezdesousa Mar 9, 2024
f9cba12
pylint
montezdesousa Mar 9, 2024
7aaeaad
pylint
montezdesousa Mar 9, 2024
5c71de3
clean
montezdesousa Mar 9, 2024
9504ed7
minor fix
montezdesousa Mar 9, 2024
94e6454
fix test
montezdesousa Mar 9, 2024
840d3fa
lint
montezdesousa Mar 9, 2024
0667e41
ruff
montezdesousa Mar 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 0 additions & 41 deletions openbb_platform/core/openbb_core/app/assets/parameter_pool.json

This file was deleted.

83 changes: 0 additions & 83 deletions openbb_platform/core/openbb_core/app/example_generator.py

This file was deleted.

229 changes: 229 additions & 0 deletions openbb_platform/core/openbb_core/app/model/example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
"""Example class to represent endpoint examples."""

from abc import abstractmethod
from datetime import date, datetime, timedelta
from typing import Any, Dict, List, Literal, Optional, Union, _GenericAlias

from pydantic import (
BaseModel,
ConfigDict,
Field,
computed_field,
model_validator,
)

QUOTE_TYPES = {str, date}


class Example(BaseModel):
"""Example model."""

scope: str

model_config = ConfigDict(validate_assignment=True)

@abstractmethod
def to_python(self, **kwargs) -> str:
"""Return a Python code representation of the example."""


class APIEx(Example):
"""API Example model."""

scope: Literal["api"] = "api"
description: Optional[str] = Field(
default=None, description="Optional description unless more than 3 parameters"
)
parameters: Dict[str, Union[str, int, float, bool, List[str], List[Dict[str, Any]]]]

@computed_field # type: ignore[misc]
@property
def provider(self) -> Optional[str]:
"""Return the provider from the parameters."""
return self.parameters.get("provider") # type: ignore

@model_validator(mode="before")
@classmethod
def validate_model(cls, values: dict) -> dict:
"""Validate model."""
parameters = values.get("parameters", {})
if "provider" not in parameters and "data" not in parameters:
raise ValueError("API example must specify a provider.")

provider = parameters.get("provider")
if provider and not isinstance(provider, str):
raise ValueError("Provider must be a string.")

return values

@staticmethod
def _unpack_type(type_: type) -> set:
"""Unpack types from types, example Union[List[str], int] -> {str, int}."""
if (
hasattr(type_, "__args__")
and type(type_) # pylint: disable=unidiomatic-typecheck
is not _GenericAlias
):
return set().union(*map(APIEx._unpack_type, type_.__args__))
return {type_} if isinstance(type_, type) else {type(type_)}

@staticmethod
def _shift(i: int) -> float:
"""Return a transformation of the integer."""
return 2 * (i + 1) / (2 * i) % 1 + 1

@staticmethod
def mock_data(
dataset: Literal["timeseries", "panel"],
size: int = 5,
sample: Optional[Dict[str, Any]] = None,
multiindex: Optional[Dict[str, Any]] = None,
) -> List[Dict]:
"""Generate mock data from a sample.

Parameters
----------
dataset : str
The type of data to return:
- 'timeseries': Time series data
- 'panel': Panel data (multiindex)

size : int
The size of the data to return, default is 5.
sample : Optional[Dict[str, Any]], optional
A sample of the data to return, by default None.
multiindex_names : Optional[List[str]], optional
The names of the multiindex, by default None.

Timeseries default sample:
{
"date": "2023-01-01",
"open": 110.0,
"high": 120.0,
"low": 100.0,
"close": 115.0,
"volume": 10000,
}

Panel default sample:
{
"portfolio_value": 100000,
"risk_free_rate": 0.02,
}
multiindex: {"asset_manager": "AM", "time": 0}

Returns
-------
List[Dict]
A list of dictionaries with the mock data.
"""
if dataset == "timeseries":
sample = sample or {
"date": "2023-01-01",
"open": 110.0,
"high": 120.0,
"low": 100.0,
"close": 115.0,
"volume": 10000,
}
result = []
for i in range(1, size + 1):
s = APIEx._shift(i)
obs = {}
for k, v in sample.items():
if k == "date":
obs[k] = (
datetime.strptime(v, "%Y-%m-%d") + timedelta(days=i)
).strftime("%Y-%m-%d")
else:
obs[k] = round(v * s, 2)
result.append(obs)
return result
if dataset == "panel":
sample = sample or {
"portfolio_value": 100000.0,
"risk_free_rate": 0.02,
}
multiindex = multiindex or {"asset_manager": "AM", "time": 0}
multiindex_names = list(multiindex.keys())
idx_1 = multiindex_names[0]
idx_2 = multiindex_names[1]
items_per_idx = 2
item: Dict[str, Any] = {
"is_multiindex": True,
"multiindex_names": str(multiindex_names),
}
# Iterate over the number of items to create and add them to the result
result = []
for i in range(1, size + 1):
item[idx_1] = f"{idx_1}_{i}"
for j in range(items_per_idx):
item[idx_2] = j
for k, v in sample.items():
if isinstance(v, str):
item[k] = f"{v}_{j}"
else:
item[k] = round(v * APIEx._shift(i + j), 2)
result.append(item.copy())
return result
raise ValueError(f"Dataset '{dataset}' not found.")

def to_python(self, **kwargs) -> str:
"""Return a Python code representation of the example."""
indentation = kwargs.get("indentation", "")
func_path = kwargs.get("func_path", ".func_router.func_name")
param_types: Dict[str, type] = kwargs.get("param_types", {})
prompt = kwargs.get("prompt", "")

eg = ""
if self.description:
eg += f"{indentation}{prompt}# {self.description}\n"

eg += f"{indentation}{prompt}obb{func_path}("
for k, v in self.parameters.items():
if k in param_types and (type_ := param_types.get(k)):
if QUOTE_TYPES.intersection(self._unpack_type(type_)):
eg += f"{k}='{v}', "
else:
eg += f"{k}={v}, "
else:
eg += f"{k}={v}, "

eg = indentation + eg.strip(", ") + ")\n"

return eg


class PythonEx(Example):
"""Python Example model."""

scope: Literal["python"] = "python"
description: str
code: List[str]

def to_python(self, **kwargs) -> str:
"""Return a Python code representation of the example."""
indentation = kwargs.get("indentation", "")
prompt = kwargs.get("prompt", "")

eg = ""
if self.description:
eg += f"{indentation}{prompt}# {self.description}\n"

for line in self.code:
eg += f"{indentation}{prompt}{line}\n"

return eg


def filter_list(
examples: List[Example],
providers: List[str],
) -> List[Example]:
"""Filter list of examples."""
return [
e
for e in examples
if (isinstance(e, APIEx) and (not e.provider or e.provider in providers))
or e.scope != "api"
]
4 changes: 2 additions & 2 deletions openbb_platform/core/openbb_core/app/model/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ def scale_arguments(cls, v):
if isclass(type(arg_val)) and issubclass(type(arg_val), Data):
new_arg_val = {
"type": f"{type(arg_val).__name__}",
"columns": list(arg_val.dict().keys()),
"columns": list(arg_val.model_dump().keys()),
}

# List[Data]
if isinstance(arg_val, list) and issubclass(type(arg_val[0]), Data):
columns = [list(d.dict().keys()) for d in arg_val]
columns = [list(d.model_dump().keys()) for d in arg_val]
columns = (item for sublist in columns for item in sublist) # flatten
new_arg_val = {
"type": f"List[{type(arg_val[0]).__name__}]",
Expand Down
Loading
Loading