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] Delay/Optimize Imports #6532

Merged
merged 97 commits into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from 73 commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
4c6b00d
round 1
deeleeramone Jun 22, 2024
bef25a7
black
deeleeramone Jun 22, 2024
e9ce7d0
more black
deeleeramone Jun 22, 2024
c471e15
Merge branch 'develop' into feature/delay-import
deeleeramone Jun 22, 2024
8673df0
providers a-thru-fmp
deeleeramone Jun 22, 2024
8208828
charting settings
deeleeramone Jun 22, 2024
c719b4a
charting backend
deeleeramone Jun 22, 2024
71cc023
black
deeleeramone Jun 23, 2024
887d172
charting_settings
deeleeramone Jun 23, 2024
7333555
missing nasdaq import
deeleeramone Jun 23, 2024
d8ffb3c
nasdaq mypy
deeleeramone Jun 23, 2024
fef17a5
fed money measure
deeleeramone Jun 23, 2024
c1d4adf
some linting
deeleeramone Jun 23, 2024
bde99fb
black
deeleeramone Jun 23, 2024
596fddd
more linting
deeleeramone Jun 23, 2024
bf1dd4f
more linting
deeleeramone Jun 23, 2024
47b1da9
charting imports
deeleeramone Jun 23, 2024
3b14029
black
deeleeramone Jun 23, 2024
f6a6d8a
pylint
deeleeramone Jun 23, 2024
6e8555c
refactor fred
deeleeramone Jun 23, 2024
ec7addf
more linting
deeleeramone Jun 23, 2024
2ec8385
rest of the providers
deeleeramone Jun 23, 2024
3be17e1
didn't want that file
deeleeramone Jun 23, 2024
b1b8902
more cleanup
deeleeramone Jun 23, 2024
ffb0f5a
missed
deeleeramone Jun 23, 2024
19dcb81
ta_helpers
deeleeramone Jun 23, 2024
18ad36a
router views
deeleeramone Jun 23, 2024
93ed4bc
chart ta_class
deeleeramone Jun 23, 2024
882f7f0
forgot a file
deeleeramone Jun 23, 2024
3f78276
forgot another file
deeleeramone Jun 23, 2024
1f5b693
biztoc
deeleeramone Jun 24, 2024
e8a1d7b
package builder
deeleeramone Jun 24, 2024
6be731d
technical router
deeleeramone Jun 24, 2024
8dcf184
fred params
deeleeramone Jun 24, 2024
6f2884b
bump finviz
deeleeramone Jun 24, 2024
e6e0d44
fix tmx
deeleeramone Jun 24, 2024
0e60540
more cleanup
deeleeramone Jun 24, 2024
12d651e
try again
deeleeramone Jun 24, 2024
a7fc716
currency historical
deeleeramone Jun 24, 2024
fff9c62
equity search
deeleeramone Jun 24, 2024
9cca5d2
missed files in commit
deeleeramone Jun 24, 2024
5cf89a8
merge branch develop
deeleeramone Jun 25, 2024
bcf5535
fix some tests
deeleeramone Jun 25, 2024
81b673b
black
deeleeramone Jun 25, 2024
a792617
fix more test cassettes
deeleeramone Jun 25, 2024
721d8ce
more patchy
deeleeramone Jun 25, 2024
aacb23b
black
deeleeramone Jun 25, 2024
1b40ef2
linters
deeleeramone Jun 25, 2024
bc7f275
more tests
deeleeramone Jun 25, 2024
b6d1dae
black
deeleeramone Jun 25, 2024
e52e28d
mypy
deeleeramone Jun 25, 2024
a82f443
delete unused model
deeleeramone Jun 25, 2024
e00140f
more linting
deeleeramone Jun 25, 2024
b7e8a58
forgot files
deeleeramone Jun 25, 2024
c5c24df
more linting
deeleeramone Jun 25, 2024
13a0cd4
make up your mind, black, and stop moving pylint for me
deeleeramone Jun 25, 2024
accfd7b
more black
deeleeramone Jun 25, 2024
ca86814
back to where we were before black destroyed it
deeleeramone Jun 25, 2024
0e72900
..........
deeleeramone Jun 25, 2024
1745577
..................
deeleeramone Jun 25, 2024
90ca9f1
unused fetcher test
deeleeramone Jun 25, 2024
c45339f
remove standard model validator
deeleeramone Jun 25, 2024
9433e1b
commodity router
deeleeramone Jun 25, 2024
58124ae
treasury prices
deeleeramone Jun 25, 2024
55e1ac1
oecd tests
deeleeramone Jun 25, 2024
f532097
finra
deeleeramone Jun 25, 2024
a0538d3
Merge branch 'develop' into feature/delay-import
deeleeramone Jun 26, 2024
975fa5d
container cleanup
deeleeramone Jun 26, 2024
aa99055
black
deeleeramone Jun 26, 2024
aad4f84
forgotten file
deeleeramone Jun 26, 2024
e2f9730
linter
deeleeramone Jun 27, 2024
bb5df65
remove wrapped ""
deeleeramone Jun 27, 2024
2eac9d3
Merge branch 'develop' into feature/delay-import
hjoaquim Jun 28, 2024
cf8e3b1
merge branch develop
deeleeramone Jul 1, 2024
4b48ff6
fix merge
deeleeramone Jul 1, 2024
243281a
patches
deeleeramone Jul 1, 2024
ce2816a
Merge branch 'develop' into feature/delay-import
deeleeramone Jul 1, 2024
b2cbe4a
ecb test
deeleeramone Jul 1, 2024
a417725
Merge branch 'feature/delay-import' of https://github.com/OpenBB-fina…
deeleeramone Jul 1, 2024
3b48bc5
finra cassette
deeleeramone Jul 1, 2024
036975d
finviz cassettes
deeleeramone Jul 1, 2024
ffeaad0
nasdaq cassettes
deeleeramone Jul 1, 2024
953d832
oecd cassettes
deeleeramone Jul 1, 2024
e807caa
yfinance cassettes
deeleeramone Jul 1, 2024
366069e
more test cassettes
deeleeramone Jul 1, 2024
6e267ca
Merge branch 'develop' into feature/delay-import
IgorWounds Jul 2, 2024
ec138dd
merge branch develop
deeleeramone Jul 2, 2024
1de134c
black
deeleeramone Jul 2, 2024
c8fd02c
merge cleanup
deeleeramone Jul 2, 2024
926b102
cboe helpers
deeleeramone Jul 3, 2024
d47f8c3
merge branch develop
deeleeramone Jul 3, 2024
02e38b9
black
deeleeramone Jul 3, 2024
5d9c88f
Merge branch 'develop' into feature/delay-import
deeleeramone Jul 3, 2024
4d9c371
merge branch develop
deeleeramone Jul 4, 2024
9dcf6bf
Merge branch 'develop' into feature/delay-import
deeleeramone Jul 9, 2024
07b8c9d
Merge branch 'develop' into feature/delay-import
IgorWounds Jul 9, 2024
5a81975
fix typo
deeleeramone Jul 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
58 changes: 36 additions & 22 deletions openbb_platform/core/openbb_core/app/command_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,34 @@
from inspect import Parameter, signature
from sys import exc_info
from time import perf_counter_ns
from typing import Any, Callable, Dict, List, Optional, Tuple, Type
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Type
from warnings import catch_warnings, showwarning, warn

from pydantic import BaseModel, ConfigDict, create_model

from openbb_core.app.logs.logging_service import LoggingService
from openbb_core.app.model.abstract.error import OpenBBError
from openbb_core.app.model.abstract.warning import OpenBBWarning, cast_warning
from openbb_core.app.model.command_context import CommandContext
from openbb_core.app.model.metadata import Metadata
from openbb_core.app.model.obbject import OBBject
from openbb_core.app.model.system_settings import SystemSettings
from openbb_core.app.model.user_settings import UserSettings
from openbb_core.app.provider_interface import ExtraParams
from openbb_core.app.router import CommandMap
from openbb_core.app.service.system_service import SystemService
from openbb_core.app.service.user_service import UserService
from openbb_core.env import Env
from openbb_core.provider.utils.helpers import maybe_coroutine, run_async

if TYPE_CHECKING:
from openbb_core.app.model.system_settings import SystemSettings
from openbb_core.app.model.user_settings import UserSettings
from openbb_core.app.router import CommandMap


class ExecutionContext:
"""Execution context."""

def __init__(
self,
command_map: CommandMap,
command_map: "CommandMap",
route: str,
system_settings: SystemSettings,
user_settings: UserSettings,
system_settings: "SystemSettings",
user_settings: "UserSettings",
) -> None:
"""Initialize the execution context."""
self.command_map = command_map
Expand Down Expand Up @@ -104,10 +102,13 @@ def merge_args_and_kwargs(
def update_command_context(
func: Callable,
kwargs: Dict[str, Any],
system_settings: SystemSettings,
user_settings: UserSettings,
system_settings: "SystemSettings",
user_settings: "UserSettings",
) -> Dict[str, Any]:
"""Update the command context with the available user and system settings."""
# pylint: disable=import-outside-toplevel
from openbb_core.app.model.command_context import CommandContext

argcount = func.__code__.co_argcount
if "cc" in func.__code__.co_varnames[:argcount]:
kwargs["cc"] = CommandContext(
Expand Down Expand Up @@ -281,6 +282,9 @@ async def _execute_func(
kwargs: Dict[str, Any],
) -> OBBject:
"""Execute a function and return the output."""
# pylint: disable=import-outside-toplevel
from openbb_core.app.logs.logging_service import LoggingService

user_settings = execution_context.user_settings
system_settings = execution_context.system_settings

Expand Down Expand Up @@ -403,50 +407,60 @@ class CommandRunner:

def __init__(
self,
command_map: Optional[CommandMap] = None,
system_settings: Optional[SystemSettings] = None,
user_settings: Optional[UserSettings] = None,
command_map: Optional["CommandMap"] = None,
system_settings: Optional["SystemSettings"] = None,
user_settings: Optional["UserSettings"] = None,
) -> None:
"""Initialize the command runner."""
# pylint: disable=import-outside-toplevel
from openbb_core.app.router import CommandMap
from openbb_core.app.service.system_service import SystemService
from openbb_core.app.service.user_service import UserService

self._command_map = command_map or CommandMap()
self._system_settings = system_settings or SystemService().system_settings
self._user_settings = user_settings or UserService.read_from_file()

def init_logging_service(self) -> None:
"""Initialize the logging service."""
# pylint: disable=import-outside-toplevel
from openbb_core.app.logs.logging_service import LoggingService

_ = LoggingService(
system_settings=self._system_settings, user_settings=self._user_settings
)

@property
def command_map(self) -> CommandMap:
def command_map(self) -> "CommandMap":
"""Command map."""
return self._command_map

@property
def system_settings(self) -> SystemSettings:
def system_settings(self) -> "SystemSettings":
"""System settings."""
return self._system_settings

@property
def user_settings(self) -> UserSettings:
def user_settings(self) -> "UserSettings":
"""User settings."""
return self._user_settings

@user_settings.setter
def user_settings(self, user_settings: UserSettings) -> None:
def user_settings(self, user_settings: "UserSettings") -> None:
self._user_settings = user_settings

# pylint: disable=W1113
async def run(
self,
route: str,
user_settings: Optional[UserSettings] = None,
user_settings: Optional["UserSettings"] = None,
/,
*args,
**kwargs,
) -> OBBject:
"""Run a command and return the OBBject as output."""
# pylint: disable=import-outside-toplevel

self._user_settings = user_settings or self._user_settings

execution_context = ExecutionContext(
Expand All @@ -462,7 +476,7 @@ async def run(
def sync_run(
self,
route: str,
user_settings: Optional[UserSettings] = None,
user_settings: Optional["UserSettings"] = None,
/,
*args,
**kwargs,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
"""Logging Formatter that includes formatting of Exceptions."""

import logging
import re
from copy import deepcopy
from pathlib import Path

from openbb_core.app.logs.models.logging_settings import LoggingSettings

Expand Down Expand Up @@ -46,6 +43,9 @@ def extract_log_extra(record: logging.LogRecord):
@staticmethod
def mock_ipv4(text: str) -> str:
"""Mock IPv4 addresses in the text."""
# pylint: disable=import-outside-toplevel
import re

pattern = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
replacement = " FILTERED_IP "
text_mocked = re.sub(pattern, replacement, text)
Expand All @@ -55,6 +55,9 @@ def mock_ipv4(text: str) -> str:
@staticmethod
def mock_email(text: str) -> str:
"""Mock email addresses in the text."""
# pylint: disable=import-outside-toplevel
import re

pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
replacement = " FILTERED_EMAIL "
text_mocked = re.sub(pattern, replacement, text)
Expand All @@ -64,6 +67,9 @@ def mock_email(text: str) -> str:
@staticmethod
def mock_password(text: str) -> str:
"""Mock passwords in the text."""
# pylint: disable=import-outside-toplevel
import re

pattern = r'("password": ")[^"]+'
replacement = r"\1 FILTERED_PASSWORD "
text_mocked = re.sub(pattern, replacement, text)
Expand All @@ -72,6 +78,9 @@ def mock_password(text: str) -> str:
@staticmethod
def mock_flair(text: str) -> str:
"""Mock flair in the text."""
# pylint: disable=import-outside-toplevel
import re

pattern = r'("FLAIR": "\[)(.*?)\]'
replacement = r"\1 FILTERED_FLAIR ]"
text_mocked = re.sub(pattern, replacement, text)
Expand All @@ -81,6 +90,9 @@ def mock_flair(text: str) -> str:
@staticmethod
def mock_home_directory(text: str) -> str:
"""Mock home directory in the text."""
# pylint: disable=import-outside-toplevel
from pathlib import Path

user_home_directory = str(Path.home().as_posix())
text_mocked = text.replace("\\", "/").replace(
user_home_directory, "MOCKING_USER_PATH"
Expand Down Expand Up @@ -134,6 +146,9 @@ def __init__(
@property
def settings(self) -> LoggingSettings:
"""Get the settings."""
# pylint: disable=import-outside-toplevel
from copy import deepcopy

return deepcopy(self.__settings)

@settings.setter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import json
import logging
import re
from copy import deepcopy
from enum import Enum
from typing import Any, Dict

Expand All @@ -28,15 +26,19 @@ class AllowedEvents(Enum):

def __init__(self, settings: LoggingSettings):
"""Initialize Posthog Handler."""

super().__init__()
self._settings = settings
self.logged_in = False
posthog.api_key = "phc_6FXLqu4uW9yxfyN8DpPdgzCdlYXOmIWdMGh6GnBgJLX" # pragma: allowlist secret
posthog.host = "https://app.posthog.com"
posthog.api_key = "phc_6FXLqu4uW9yxfyN8DpPdgzCdlYXOmIWdMGh6GnBgJLX" # pragma: allowlist secret # noqa
posthog.host = "https://app.posthog.com" # noqa

@property
def settings(self) -> LoggingSettings:
"""Get logging settings."""
# pylint: disable=import-outside-toplevel
from copy import deepcopy

return deepcopy(self._settings)

@settings.setter
Expand Down Expand Up @@ -78,6 +80,9 @@ def identify(self) -> None:

def log_to_dict(self, log_info: str) -> dict:
"""Log to dict."""
# pylint: disable=import-outside-toplevel
import re

log_regex = r"(STARTUP|CMD|ERROR): (.*)"
log_dict: Dict[str, Any] = {}

Expand All @@ -88,6 +93,9 @@ def log_to_dict(self, log_info: str) -> dict:

def send(self, record: logging.LogRecord):
"""Send log record to Posthog."""
# pylint: disable=import-outside-toplevel
import re

level_name = logging.getLevelName(record.levelno)
log_line = FormatterWithExceptions.filter_log_line(text=record.getMessage())

Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,36 @@
"""Charting settings."""

import importlib
from pathlib import Path
from typing import Optional
from typing import TYPE_CHECKING, Optional

from openbb_core.app.logs.utils.utils import get_app_id
from openbb_core.app.model.system_settings import SystemSettings
from openbb_core.app.model.user_settings import UserSettings
from openbb_core.env import Env

if TYPE_CHECKING:
from openbb_core.app.model.system_settings import SystemSettings
from openbb_core.app.model.user_settings import UserSettings


# pylint: disable=too-many-instance-attributes
class ChartingSettings:
"""Charting settings."""

def __init__(
self,
user_settings: Optional[UserSettings] = None,
system_settings: Optional[SystemSettings] = None,
user_settings: Optional["UserSettings"] = None,
system_settings: Optional["SystemSettings"] = None,
):
"""Initialize charting settings."""
user_settings_module = importlib.import_module(
"openbb_core.app.model.user_settings", "UserSettings"
)
system_settings_module = importlib.import_module(
"openbb_core.app.model.system_settings", "SystemSettings"
)

UserSettings = user_settings_module.UserSettings
SystemSettings = system_settings_module.SystemSettings
user_settings = user_settings or UserSettings()
system_settings = system_settings or SystemSettings()

Expand Down
4 changes: 2 additions & 2 deletions openbb_platform/core/openbb_core/app/model/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,10 @@ def load(self) -> BaseModel:
# We load providers first to give them priority choosing credential names
self.from_providers()
self.from_obbject()
model = create_model( # type: ignore
model = create_model(
"Credentials",
__config__=ConfigDict(validate_assignment=True, populate_by_name=True),
**self.format_credentials(),
**self.format_credentials(), # type: ignore
)
model.origins = self.credentials
return model
Expand Down
18 changes: 10 additions & 8 deletions openbb_platform/core/openbb_core/app/model/metadata.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
"""Metadata model."""

from datetime import datetime
from inspect import isclass
from typing import Any, Dict, Optional, Sequence, Union

import numpy as np
import pandas as pd
from pydantic import BaseModel, Field, field_validator

from openbb_core.provider.abstract.data import Data
Expand Down Expand Up @@ -41,6 +38,11 @@ def scale_arguments(cls, v):
containing the type and the columns. If the type is not one of the previous, the
value is kept or trimmed to 80 characters.
"""
# pylint: disable=import-outside-toplevel
from inspect import isclass # noqa
from numpy import ndarray # noqa
from pandas import DataFrame, Series # noqa

arguments: Dict[str, Any] = {}
for item in ["provider_choices", "standard_params", "extra_params"]:
arguments[item] = {}
Expand Down Expand Up @@ -72,7 +74,7 @@ def scale_arguments(cls, v):
}

# DataFrame
elif isinstance(arg_val, pd.DataFrame):
elif isinstance(arg_val, 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))
Expand All @@ -85,7 +87,7 @@ def scale_arguments(cls, v):

# List[DataFrame]
elif isinstance(arg_val, list) and issubclass(
type(arg_val[0]), pd.DataFrame
type(arg_val[0]), DataFrame
):
ldf_columns = [
(
Expand All @@ -101,14 +103,14 @@ def scale_arguments(cls, v):
}

# Series
elif isinstance(arg_val, pd.Series):
elif isinstance(arg_val, 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):
elif isinstance(arg_val, list) and isinstance(arg_val[0], Series):
ls_columns = [
(
list(series.index.names) + [series.name]
Expand All @@ -125,7 +127,7 @@ def scale_arguments(cls, v):
}

# ndarray
elif isinstance(arg_val, np.ndarray):
elif isinstance(arg_val, ndarray):
new_arg_val = {
"type": f"{type(arg_val).__name__}",
"columns": list(arg_val.dtype.names or []),
Expand Down
Loading
Loading